ZGlmZiAtLWdpdCBhLy5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbiBiLy5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbgppbmRleCBhNjJlMzdkLi4yNWQ5NTkyIDEwMDY0NAotLS0gYS8uZGFydF90b29sL3BhY2thZ2VfY29uZmlnLmpzb24KKysrIGIvLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uCkBAIC0xMSw3ICsxMSw3IEBACiAgICAgImNvbnN0cmFpbnQsIHVwZGF0ZSB0aGlzIGJ5IHJ1bm5pbmcgdG9vbHMvZ2VuZXJhdGVfcGFja2FnZV9jb25maWcuZGFydC4iCiAgIF0sCiAgICJjb25maWdWZXJzaW9uIjogMiwKLSAgImdlbmVyYXRlZCI6ICIyMDIwLTA2LTIzVDEzOjQ5OjEzLjM3ODI4NCIsCisgICJnZW5lcmF0ZWQiOiAiMjAyMC0wNi0yOVQxMToyMTo1NC45ODQ1MjEiLAogICAiZ2VuZXJhdG9yIjogInRvb2xzL2dlbmVyYXRlX3BhY2thZ2VfY29uZmlnLmRhcnQiLAogICAicGFja2FnZXMiOiBbCiAgICAgewpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAibmFtZSI6ICJjb2xsZWN0aW9uIiwKICAgICAgICJyb290VXJpIjogIi4uL3RoaXJkX3BhcnR5L3BrZy9jb2xsZWN0aW9uIiwKICAgICAgICJwYWNrYWdlVXJpIjogImxpYi8iLAotICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjMiCisgICAgICAibGFuZ3VhZ2VWZXJzaW9uIjogIjIuOSIKICAgICB9LAogICAgIHsKICAgICAgICJuYW1lIjogImNvbXBpbGVyIiwKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgICAgIm5hbWUiOiAiZml4bnVtIiwKICAgICAgICJyb290VXJpIjogIi4uL3RoaXJkX3BhcnR5L3BrZy9maXhudW0iLAogICAgICAgInBhY2thZ2VVcmkiOiAibGliLyIsCi0gICAgICAibGFuZ3VhZ2VWZXJzaW9uIjogIjIuMSIKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi45IgogICAgIH0sCiAgICAgewogICAgICAgIm5hbWUiOiAiZnJvbnRfZW5kIiwKQEAgLTU2Niw3ICs1NjYsNyBAQAogICAgICAgIm5hbWUiOiAic3RhZ2VoYW5kIiwKICAgICAgICJyb290VXJpIjogIi4uL3RoaXJkX3BhcnR5L3BrZy9zdGFnZWhhbmQiLAogICAgICAgInBhY2thZ2VVcmkiOiAibGliLyIsCi0gICAgICAibGFuZ3VhZ2VWZXJzaW9uIjogIjIuNyIKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi44IgogICAgIH0sCiAgICAgewogICAgICAgIm5hbWUiOiAic3RhdHVzX2ZpbGUiLApAQCAtNjU2LDcgKzY1Niw3IEBACiAgICAgICAibmFtZSI6ICJ0eXBlZF9kYXRhIiwKICAgICAgICJyb290VXJpIjogIi4uL3RoaXJkX3BhcnR5L3BrZy90eXBlZF9kYXRhIiwKICAgICAgICJwYWNrYWdlVXJpIjogImxpYi8iLAotICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjAiCisgICAgICAibGFuZ3VhZ2VWZXJzaW9uIjogIjIuOSIKICAgICB9LAogICAgIHsKICAgICAgICJuYW1lIjogInVzYWdlIiwKQEAgLTcwNyw0ICs3MDcsNCBAQAogICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjQiCiAgICAgfQogICBdCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvLmdpdGlnbm9yZSBiLy5naXRpZ25vcmUKaW5kZXggYmM5ZjU2Yy4uMmJjNzAwOCAxMDA2NDQKLS0tIGEvLmdpdGlnbm9yZQorKysgYi8uZ2l0aWdub3JlCkBAIC0zLDYgKzMsNyBAQAogLy5wcm9qZWN0CiAvTWFrZWZpbGUKIC9iYXNlCisvYmVuY2htYXJrcy1pbnRlcm5hbAogL2J1aWxkdG9vbHMKIC9pcGNoCiAvb3V0CmRpZmYgLS1naXQgYS9DSEFOR0VMT0cubWQgYi9DSEFOR0VMT0cubWQKaW5kZXggYjU4YzRhMC4uM2ViYzQ3OSAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HLm1kCisrKyBiL0NIQU5HRUxPRy5tZApAQCAtNCwxMiArNCwxMSBAQAogCiAjIyMgQ29yZSBsaWJyYXJpZXMKIAotIyMjIyBgZGFydDppb2AKKyMjIyMgYGRhcnQ6YXN5bmNgCiAKLSogICBbIzQyMDA2XVtdOiBUaGUgc2lnbmF0dXJlIG9mIGBleGl0YCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJldHVybiB0aGUKLSAgICBgTmV2ZXJgdHlwZSBpbnN0ZWFkIG9mIGB2b2lkYC4gc2luY2Ugbm8gY29kZSB3aWxsIHJ1biBhZnRlciBpdCwKLQotWyM0MjAwNl06IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy80MjAwNgorKiAgIEFkZHMgYFN0cmVhbS5tdWx0aWAgY29uc3RydWN0b3IgY3JlYXRpbmcgc3RyZWFtcyB3aGljaCBjYW4gYmUKKyAgICBsaXN0ZW5lZCB0byBtb3JlIHRoYW4gb25jZSwgYW5kIHdoZXJlIGVhY2ggaW5kaXZpZHVhbCBsaXN0ZW5lcgorICAgIGNhbiBiZSBjb250cm9sbGVkIGluZGVwZW5kZW50bHkuCiAKICMjIyMgYGRhcnQ6Y29udmVydGAKIApAQCAtMjMsNiArMjIsMjAgQEAKIFsjNDExMDBdOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDExMDAKIFtXSEFUV0cgZW5jb2Rpbmcgc3RhbmRhcmRdOiBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlcgogCisjIyMjIGBkYXJ0OmlvYAorCisqICAgWyM0MjAwNl1bXTogVGhlIHNpZ25hdHVyZSBvZiBgZXhpdGAgaGFzIGJlZW4gY2hhbmdlZCB0byByZXR1cm4gdGhlCisgICAgYE5ldmVyYHR5cGUgaW5zdGVhZCBvZiBgdm9pZGAuIHNpbmNlIG5vIGNvZGUgd2lsbCBydW4gYWZ0ZXIgaXQsCisqICAgQ2xhc3MgYE9TRXJyb3JgIG5vdyBpbXBsZW1lbnRzIGBFeGNlcHRpb25gLiBUaGlzIGNoYW5nZSBtZWFucyBgT1NFcnJvcmAgd2lsbAorICAgIG5vdyBiZSBjYXVnaHQgaW4gY2F0Y2ggY2xhdXNlcyBjYXRjaGluZyBgRXhjZXB0aW9uYHMuCisqICAgQWRkZWQgYEludGVybmV0QWRkcmVzcy50cnlQYXJzZWAuCisqICAgW0Fic3RyYWN0IFVuaXggRG9tYWluIFNvY2tldF1bXSBpcyBzdXBwb3J0ZWQgb24gTGludXgvQW5kcm9pZCBub3cuIFVzaW5nIGFuCisgICAgYEludGVybmV0QWRkcmVzc2Agd2l0aCBgYWRkcmVzc2Agc3RhcnRpbmcgd2l0aCAnQCcgYW5kIHR5cGUgYmVpbmcKKyAgICBgSW50ZXJuZXRBZGRyZXNzVHlwZS5Vbml4YCB3aWxsIGNyZWF0ZSBhbiBhYnN0cmFjdCBVbml4IERvbWFpbiBTb2NrZXQuCisKK1sjNDIwMDZdOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDIwMDYKK1tBYnN0cmFjdCBVbml4IERvbWFpbiBTb2NrZXRdOiBodHRwOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjcvdW5peC43Lmh0bWwKKwogIyMjIyBgZGFydDpodG1sYAogCiAqICAgKipCcmVha2luZyBDaGFuZ2UqKjogYENzc0NsYXNzU2V0LmFkZCgpYCBwcmV2aW91c2x5IHJldHVybmVkIGBudWxsYCBpZiB0aGUKQEAgLTM3LDIxICs1MCwxMyBAQAogICAgIGBGdXR1cmVgIGlzIGVtcHR5IGluc3RlYWQsIGl0IGNvbXBsZXRlcyBhc3luY2hyb25vdXNseSwgdGhlcmVmb3JlCiAgICAgcG90ZW50aWFsbHkgaW52YWxpZGF0aW5nIGNvZGUgdGhhdCByZWxpZWQgb24gdGhlIHN5bmNocm9ub3VzIHNpZGUtZWZmZWN0LgogICAgIFRoaXMgY2hhbmdlIHdpbGwgb25seSBhZmZlY3QgY29kZSB1c2luZyBzb3VuZCBudWxsLXNhZmV0eS4gU2VlIGlzc3VlCi0gICAgWzQxNjUzXVtdIGZvciBtb3JlIGRldGFpbHMuCisgICAgWyM0MTY1M11bXSBmb3IgbW9yZSBkZXRhaWxzLgogCi1bNDE2NTNdOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDE2NTMKKyogICBNZXRob2RzIGluIGBDb25zb2xlYCBoYXZlIGJlZW4gdXBkYXRlZCB0byBiZXR0ZXIgcmVmbGVjdCB0aGUgbW9kZXJuIENvbnNvbGUKKyAgICBzcGVjaWZpY2F0aW9uLiBQYXJ0aWN1bGFybHkgb2YgaW50ZXJlc3QgYXJlIGBkaXJgIGFuZCBgdGFibGVgIHdoaWNoIHRha2UgaW4KKyAgICBleHRyYSBvcHRpb25hbCBhcmd1bWVudHMuCiAKLQotIyMjIyBgZGFydDppb2AKLQotKiAgIENsYXNzIGBPU0Vycm9yYCBub3cgaW1wbGVtZW50cyBgRXhjZXB0aW9uYC4gVGhpcyBjaGFuZ2UgbWVhbnMgYE9TRXJyb3JgIHdpbGwKLSAgICBub3cgYmUgY2F1Z2h0IGluIGNhdGNoIGNsYXVzZXMgY2F0Y2hpbmcgYEV4Y2VwdGlvbmBzLgotKiAgIEFkZGVkIGBJbnRlcm5ldEFkZHJlc3MudHJ5UGFyc2VgLgotKiAgIFtBYnN0cmFjdCBVbml4IERvbWFpbiBTb2NrZXRdW10gaXMgc3VwcG9ydGVkIG9uIExpbnV4L0FuZHJvaWQgbm93LiBVc2luZyBhbgotICAgIGBJbnRlcm5ldEFkZHJlc3NgIHdpdGggYGFkZHJlc3NgIHN0YXJ0aW5nIHdpdGggJ0AnIGFuZCB0eXBlIGJlaW5nCi0gICAgYEludGVybmV0QWRkcmVzc1R5cGUuVW5peGAgd2lsbCBjcmVhdGUgYW4gYWJzdHJhY3QgVW5peCBEb21haW4gU29ja2V0LgotCi1bQWJzdHJhY3QgVW5peCBEb21haW4gU29ja2V0XTogaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW43L3VuaXguNy5odG1sCitbIzQxNjUzXTogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzQxNjUzCiAKICMjIyBUb29scwogCkBAIC04OSw2ICs5NCwxMyBAQAogCiAjIyMgRGFydCBWTQogCisqICAgKipCcmVha2luZyBDaGFuZ2UqKiBbIzQxMTAwXVtdOiBXaGVuIHByaW50aW5nIGEgc3RyaW5nIHVzaW5nIHRoZSBgcHJpbnRgCisgICAgZnVuY3Rpb24sIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICh1c2VkIHdoZW4gbm90IG92ZXJyaWRkZW4gYnkgdGhlCisgICAgZW1iZWRkZXIgb3IgdGhlIGN1cnJlbnQgem9uZSkgd2lsbCBwcmludCBhbnkgdW5wYWlyZWQgc3Vycm9nYXRlcyBpbiB0aGUKKyAgICBzdHJpbmcgYXMgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyAoYFUrRkZGRGApLiBTaW1pbGFybHksIHRoZQorICAgIGBEYXJ0X1N0cmluZ1RvVVRGOGAgZnVuY3Rpb24gaW4gdGhlIERhcnQgQVBJIHdpbGwgY29udmVydCB1bnBhaXJlZAorICAgIHN1cnJvZ2F0ZXMgaW50byByZXBsYWNlbWVudCBjaGFyYWN0ZXJzLgorCiAjIyMgUHViCiAqIGBwdWIgcnVuYCBhbmQgYHB1YiBnbG9iYWwgcnVuYCBhY2NlcHRzIGEgYC0tZW5hYmxlLWV4cGVyaW1lbnRgIGZsYWcgZW5hYmxpbmcKICAgZXhwZXJpbWVudHMgaW4gdGhlIERhcnQgVk0gKGFuZCBsYW5ndWFnZSkuCkBAIC0xMDAsNyArMTEyLDcgQEAKICogV2FybiBhdCBwdWJsaXNoaW5nIGZpcnN0IHRpbWUgYSBwYWNrYWdlIHZlcnNpb24gb3B0cyBpbiB0byBudWxsLXNhZmV0eS4KICogUHJlc2VydmUgV2luZG93cyBsaW5lIGVuZGluZ3MgaW4gcHVic3BlYy5sb2NrIGlmIHRoZXkgYXJlIGFscmVhZHkgdGhlcmUgKCMyNDg5KQogKiBCZXR0ZXIgdGVybWluYWwgY29sb3ItZGV0ZWN0aW9uLiBVc2UgY29sb3JzIGluIHRlcm1pbmFscyBvbiBXaW5kb3dzLgotKiBgcHViIG91dGRhdGVkYDogSWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kgaXMgYSBwcmVyZWxlYXNlIAorKiBgcHViIG91dGRhdGVkYDogSWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kgaXMgYSBwcmVyZWxlYXNlCiAgIHZlcnNpb24sIHVzZSBwcmVyZWxlYXNlcyBmb3IgbGF0ZXN0IGlmIG5vIG5ld2VyIHN0YWJsZS4KICogYHB1YiBvdXRkYXRlZGAgbm93IHdvcmtzIHdpdGhvdXQgYSBsb2NrZmlsZS4gSW4gdGhhdCBjYXNlIHRoZSAnQ3VycmVudCcKICAgY29sdW1uIHdpbGwgYmUgZW1wdHkuCmRpZmYgLS1naXQgYS9ERVBTIGIvREVQUwppbmRleCBmOWJkNzcxLi5kZTk5YmZkIDEwMDY0NAotLS0gYS9ERVBTCisrKyBiL0RFUFMKQEAgLTQ0LDExICs0NCwxMSBAQAogICAjIGNvMTkgaXMgYSBjaXBkIHBhY2thZ2UuIFVzZSB1cGRhdGUuc2ggaW4gdGVzdHMvY28xOVtfMl0gdG8gdXBkYXRlIHRoZXNlCiAgICMgaGFzaGVzLiBJdCByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlIGRhcnQtYnVpbGQtYWNjZXNzIGdyb3VwLCB3aGljaCBFbmdQcm9kCiAgICMgaGFzLgotICAiY28xOV9yZXYiOiAiYmZhNWFiMWUzYTBiZTgxODk5NzYwYWY5YzI0YWI3MzQzNDgxMTRhNSIsCisgICJjbzE5X3JldiI6ICI0MDM1YzY2ZjBjYWNiNzAwNjQzOTU0NzNjYjU0ZDgxMGMwNDZjMjI1IiwKICAgImNvMTlfMl9yZXYiOiAiNjIwYzExNDhjOGI3YTNkN2Y3NGFmYWNmMzQ4YzQ2ZjEwOWViNjRmMiIsCiAKICAgIyBUaGUgaW50ZXJuYWwgYmVuY2htYXJrcyB0byB1c2UuIFNlZSBnby9kYXJ0LWJlbmNobWFya3MtaW50ZXJuYWwKLSAgImJlbmNobWFya3NfaW50ZXJuYWxfcmV2IjogIjAyNjk1ZGE5OGJjZjAwNmI5NTYzMGQzYzM4NmY0MTY5ZDdlYzRlY2YiLAorICAiYmVuY2htYXJrc19pbnRlcm5hbF9yZXYiOiAiODhhZjUyNzU0ZjI3MmU3YTRjNTczN2I3ZTAwM2MyZWQ5ZThhNzU0ZiIsCiAgICJjaGVja291dF9iZW5jaG1hcmtzX2ludGVybmFsIjogRmFsc2UsCiAKICAgIyBBcyBGbHV0dGVyIGRvZXMsIHdlIHVzZSBGdWNoc2lhJ3MgR04gYW5kIENsYW5nIHRvb2xjaGFpbi4gVGhlc2UgcmV2aXNpb24KQEAgLTY2LDggKzY2LDggQEAKIAogICAjIFJldmlzaW9ucyBvZiAvdGhpcmRfcGFydHkvKiBkZXBlbmRlbmNpZXMuCiAgICJhcmdzX3RhZyI6ICIxLjYuMCIsCi0gICJhc3luY190YWciOiAiMi40LjEiLAotICAiYmF6ZWxfd29ya2VyX3RhZyI6ICJ2MC4xLjIyIiwKKyAgImFzeW5jX3JldiI6ICJlMGM0MWUwYzFmYjcwYmE2MDZkYzgxMzM1Yzk4MWFmN2MwMDk4N2M2IiwKKyAgImJhemVsX3dvcmtlcl9yZXYiOiAiMjY2ODBkNWUyNDliMjQ5YzcyMTZhYjJmZWQwYWM4ZWQ0ZWUyODVjNSIsCiAgICJiZW5jaG1hcmtfaGFybmVzc19yZXYiOiAiODE2NDEyOTBkZWE0NGMzNDEzOGExMDlhMzdlMjE1NDgyZjQwNWY4MSIsCiAgICJib29sZWFuX3NlbGVjdG9yX3JldiI6ICIxMzA5ZWFiZWQ1MTBjYzNiNzUzNmZkNDM2N2QzOWI5N2ViZWUzZDY5IiwKICAgImJvcmluZ3NzbF9nZW5fcmV2IjogIjQyOWNjYjE4NzdmNzk4N2E2ZjM5ODgyMjhiYzI0NDBlNjEyOTM0OTkiLApAQCAtNzYsNyArNzYsNyBAQAogICAiY2hhcmNvZGVfcmV2IjogIjkwODVlNmI2MTI3ZjA4NGQ2NmMwYTk0ODEwYTgwODEyMTQ1OTAxMmEiLAogICAiY2hyb21lX3JldiIgOiAiMTk5OTciLAogICAiY2xpX3V0aWxfdGFnIiA6ICIwLjEuNCIsCi0gICJjb2xsZWN0aW9uX3JldiI6ICI3YmU0MmUwM2Q0MjdjYzE5NTcxY2Q3ZjlmYzYyOGE1OTEzYTZiNzU3IiwKKyAgImNvbGxlY3Rpb25fcmV2IjogIjgwZjViNmRlOGE4ZDhkNTg0NzMyYTcxYmI1OTkxMmRhM2U0NDg4M2IiLAogICAiY29udmVydF9yZXYiOiAiNDliZGU1YjM3MWViNWMyYzhlNzIxNTU3Y2Y3NjJmMTdjNzVlNDlmYyIsCiAgICJjcnlwdG9fcmV2IjogIjc0MjJmYjJmNjU4NGZlMTgzOWViMzBiYzRjYTU2ZTlmOTc2MGI4MDEiLAogICAiY3NzbGliX3JldiI6ICJiZjM3MmQ0ZmRjNmRmYTIzMmFkOTNmNzdhMGEzZGUwODkxZWRkMDRjIiwKQEAgLTk4LDcgKzk4LDcgQEAKIAogICAiZGFydGRvY190YWciIDogInYwLjMyLjEiLAogICAiZmZpX3JldiI6ICI0NTRhYjBmOWVhNmJkMDY5NDJhOTgzMjM4ZDhhNjgxOGIxMzU3ZWRiIiwKLSAgImZpeG51bV9yZXYiOiAiMTNkYTUxMjM5ODlhNWQ5MWNiNTllNzY3OTNjMzkyM2RkOGQwNmU5MCIsCisgICJmaXhudW1fcmV2IjogIjliMzhmNDlmNjY3OTY1NGQ2NmEzNjNlNjllNDgxNzNjY2EwN2U4ODIiLAogICAiZ2xvYl9yZXYiOiAiZTlmNGU2YjdhZThhYmU1MDcxNDYxY2Y4ZjQ3MTkxYmIxOWNmN2VmNiIsCiAgICJodG1sX3JldiI6ICIwODNhMzZjZDgwMWE0Yjc4N2JhMTU2YjdjNmU0YzhiMmUyZGFlZDRhIiwKICAgImh0dHBfaW9fcmV2IjogIjJmYTE4OGNhZjc5MzdlMzEzMDI2NTU3NzEzZjdmZWZmZWRkNDk3OGIiLApAQCAtMTQyLDIzICsxNDIsMjMgQEAKICAgInNvdXJjZV9tYXBzLTAuOS40X3JldiI6ICIzODUyNCIsCiAgICJzb3VyY2VfbWFwc19yZXYiOiAiODdiNGZkOTAyNzM3OGJiZDUxYjAyZTlkN2RmNzk0ZWVlOGE4MmI3YSIsCiAgICJzb3VyY2Vfc3Bhbl90YWciOiAiMS43LjAiLAotICAic3RhY2tfdHJhY2VfdGFnIjogIjA3NTY5ODMxZjE3ODQ0ZWY5MDIxNGExNzlkYjIxMTk1NGE3ZjczMjQiLAotICAic3RhZ2VoYW5kX3RhZyI6ICJ2My4zLjciLAorICAic3RhY2tfdHJhY2VfdGFnIjogIjU2ODExZGJiMjUzMGQ4MjNiNzY0ZmUxNjdlYzMzNTg3OWE0YWRiMzIiLAorICAic3RhZ2VoYW5kX3RhZyI6ICJ2My4zLjkiLAogICAic3RyZWFtX2NoYW5uZWxfdGFnIjogIjcwNDMzZDU3N2JlMDJjNDhjYjE2ZDcyZDY1NjU0ZjNiNGQ4MmM2ZWQiLAogICAic3RyaW5nX3NjYW5uZXJfcmV2IjogImE5MThlNzM3MWFmNmI2ZTczYmZkNTM0ZmY5ZGE2MDg0NzQxYzFmOTkiLAogICAidGVzdF9kZXNjcmlwdG9yX3RhZyI6ICIxLjEuMSIsCiAgICJ0ZXN0X3Byb2Nlc3NfdGFnIjogIjEuMC4zIiwKICAgInRlcm1fZ2x5cGhfcmV2IjogImIzZGEzMWU5Njg0YTk5Y2ZlNWYxOTJiODk5MTQ0OTIwMThiNDRkYTciLAogICAidGVzdF9yZWZsZWN0aXZlX2xvYWRlcl90YWciOiAiMC4xLjkiLAotICAidGVzdF9yZXYiOiAiOTg4ZTM4ZmYzMDUxZjI0NjA3YWQwYWFmNGU3ODA4MzU3ODVmMmFiNSIsCisgICJ0ZXN0X3JldiI6ICI3MThmZTZmOTNjNDY1NTIwODQ2MGYyOGU4OWQ4ODdjNWVmNDE0NGM1IiwKICAgInRmbGl0ZV9uYXRpdmVfcmV2IjogIjNjNzc3YzQwNjA4YTJhOWYxNDI3YmZlMDAyOGFiNDhlNzExNmI0YzEiLAotICAidHlwZWRfZGF0YV90YWciOiAiMS4xLjYiLAorICAidHlwZWRfZGF0YV90YWciOiAiMGMzNjliNzNhOWI3ZWJmMDQyYzA2NTEyOTUxYmZlNWI1MmI4NGE1ZiIsCiAgICJ1c2FnZV90YWciOiAiMy40LjAiLAogICAid2F0Y2hlcl9yZXYiOiAiZmMzYzlhYWU1ZDMxZDcwN2IzMDEzYjQyNjM0ZGRlOGQ4YTExNjFiNCIsCiAgICJ3ZWJfY29tcG9uZW50c19yZXYiOiAiOGY1N2RhYzI3MzQxMmE3MTcyYzhhZGU2ZjM2MWI0MDdlMmU0ZWQwMiIsCiAgICJ3ZWJfc29ja2V0X2NoYW5uZWxfcmV2IjogIjQ5MDA2MWVmMGUyMmQzYzg0NjBhZDI4MDJmOTk0ODIxOTM2NWFkNmIiLAogICAiV2ViQ29yZV9yZXYiOiAiZmIxMWU4ODdmNzc5MTk0NTBlNDk3MzQ0ZGE1NzBkNzgwZTA3OGJjOCIsCi0gICJ5YW1sX3JldiI6ICI2MmU5ZjZiM2E5MzNiMWY3NmRkMzAwN2QxYTVjZTBiZThlNDI5YjJkIiwKKyAgInlhbWxfcmV2IjogImU1ZGU0MjkxNDdhNmIwZmNiN2U4ZGRiM2M4ZTQ2NzRkYzVkZDBlY2MiLAogICAiemxpYl9yZXYiOiAiYzQ0ZmI3MjQ4MDc5Y2MzZDU1NjNiMTRiM2Y3NThhZWU2MGQ2YjQxNSIsCiAgICJjcmFzaHBhZF9yZXYiOiAiYmYzMjdkOGNlYjZhNjY5NjA3YjBkYmFiNWE4M2EyNzVkMDNmOTllZCIsCiAgICJtaW5pY2hyb21pdW1fcmV2IjogIjhkNjQxZTMwYThiMTIwODg2NDk2MDZiOTEyYzJiYzQ5NDc0MTljY2MiLApAQCAtMjk1LDkgKzI5NSw5IEBACiAgIFZhcigiZGFydF9yb290IikgKyAiL3RoaXJkX3BhcnR5L3BrZy9hcmdzIjoKICAgICAgIFZhcigiZGFydF9naXQiKSArICJhcmdzLmdpdCIgKyAiQCIgKyBWYXIoImFyZ3NfdGFnIiksCiAgIFZhcigiZGFydF9yb290IikgKyAiL3RoaXJkX3BhcnR5L3BrZy9hc3luYyI6Ci0gICAgICBWYXIoImRhcnRfZ2l0IikgKyAiYXN5bmMuZ2l0IiArICJAIiArIFZhcigiYXN5bmNfdGFnIiksCisgICAgICBWYXIoImRhcnRfZ2l0IikgKyAiYXN5bmMuZ2l0IiArICJAIiArIFZhcigiYXN5bmNfcmV2IiksCiAgIFZhcigiZGFydF9yb290IikgKyAiL3RoaXJkX3BhcnR5L3BrZy9iYXplbF93b3JrZXIiOgotICAgICAgVmFyKCJkYXJ0X2dpdCIpICsgImJhemVsX3dvcmtlci5naXQiICsgIkAiICsgVmFyKCJiYXplbF93b3JrZXJfdGFnIiksCisgICAgICBWYXIoImRhcnRfZ2l0IikgKyAiYmF6ZWxfd29ya2VyLmdpdCIgKyAiQCIgKyBWYXIoImJhemVsX3dvcmtlcl9yZXYiKSwKICAgVmFyKCJkYXJ0X3Jvb3QiKSArICIvdGhpcmRfcGFydHkvcGtnL2JlbmNobWFya19oYXJuZXNzIjoKICAgICAgIFZhcigiZGFydF9naXQiKSArICJiZW5jaG1hcmtfaGFybmVzcy5naXQiICsgIkAiICsKICAgICAgIFZhcigiYmVuY2htYXJrX2hhcm5lc3NfcmV2IiksCkBAIC01MTIsNyArNTEyLDcgQEAKICAgICAicGFja2FnZXMiOiBbCiAgICAgICB7CiAgICAgICAgICJwYWNrYWdlIjogImRhcnQvY2ZlL2RhcnQyanNfZGlsbHMiLAotICAgICAgICAidmVyc2lvbiI6ICJiaW5hcnlfdmVyc2lvbjo0MiIsCisgICAgICAgICJ2ZXJzaW9uIjogImJpbmFyeV92ZXJzaW9uOjQzXzIiLAogICAgICAgfQogICAgIF0sCiAgICAgImRlcF90eXBlIjogImNpcGQiLApkaWZmIC0tZ2l0IGEvV0FUQ0hMSVNUUyBiL1dBVENITElTVFMKaW5kZXggYTA3YjY2NS4uNDY3MjM2MyAxMDA2NDQKLS0tIGEvV0FUQ0hMSVNUUworKysgYi9XQVRDSExJU1RTCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAnZmlsZXBhdGgnOiAoCiAgICAgICAgICdecGtnL2NvbXBpbGVyfCcKICAgICAgICAgJ15zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lfCcKLSAgICAgICAgJ150ZXN0cy9jb21waWxlci9kYXJ0MmpzJworICAgICAgICAnXnRlc3RzL2RhcnQyanMnCiAgICAgICApCiAgICAgfSwKICAgICAnZGFydGRldmMnOiB7CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L0ZmaUJvcmluZ3NzbC5kYXJ0IGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydC9GZmlCb3Jpbmdzc2wuZGFydAppbmRleCAxMDQ1ODhlLi43MDI1MTk0IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L0ZmaUJvcmluZ3NzbC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvRmZpQm9yaW5nc3NsLmRhcnQKQEAgLTcxLDMwICs3MSwzMyBAQAogCiAvLyBIYXNoIG9mIGdlbmVyYXRlZCBkYXRhIG9mIGBMYCBieXRlcyB3aXRoIGBoYXNoQWxnb3JpdGhtYC4KIGNvbnN0IFN0cmluZyBleHBlY3RlZEhhc2ggPQotICAgICJiTkx0cWIrY0JaY1NrQ213QlV1QjVEUDJ1TGUwbWFkZXR3WHYxMHVzR1VGSmcxc2RHaFRFaSthVzVOV0lSVzFSS2lMcTU2b2JWNzRyVnVybjAxNEl5dz09IjsKKyAgICAnYk5MdHFiK2NCWmNTa0Ntd0JVdUI1RFAydUxlMG1hZGV0d1h2MTB1c0dVRkpnMXNkR2hURWkrYVc1TldJUlcxUktpTHE1Nm9iVjc0clZ1cm4wMTRJeXc9PSc7CiAKIC8vLyBUaGlzIGJlbmNobWFyayBydW5zIGEgZGlnZXN0IGFsZ29yaXRobSBvbiBkYXRhIHJlc2lkaW5nIGluIEMgbWVtb3J5LgogLy8vCiAvLy8gVGhpcyBiZW5jaG1hcmsgaXMgaW50ZW5kZWQgYXMgbWFjcm8gYmVuY2htYXJrIHdpdGggYSByZWFsaXN0aWMgd29ya2xvYWQuCiBjbGFzcyBEaWdlc3RDTWVtb3J5IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIERpZ2VzdENNZW1vcnkoKSA6IHN1cGVyKCJGZmlCb3Jpbmdzc2wuRGlnZXN0Q01lbW9yeSIpOworICBEaWdlc3RDTWVtb3J5KCkgOiBzdXBlcignRmZpQm9yaW5nc3NsLkRpZ2VzdENNZW1vcnknKTsKIAotICBQb2ludGVyPERhdGE+IGRhdGE7IC8vIERhdGEgaW4gQyBtZW1vcnkgdGhhdCB3ZSB3YW50IHRvIGRpZ2VzdC4KKyAgUG9pbnRlcjxEYXRhPiBkYXRhID0gbnVsbHB0cjsgLy8gRGF0YSBpbiBDIG1lbW9yeSB0aGF0IHdlIHdhbnQgdG8gZGlnZXN0LgogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgewogICAgIGRhdGEgPSBhbGxvY2F0ZTxVaW50OD4oY291bnQ6IEwpLmNhc3QoKTsKICAgICBjb3B5RnJvbVVpbnQ4TGlzdFRvVGFyZ2V0KGludmVudERhdGEoTCksIGRhdGEucmVmKTsKICAgICBoYXNoKGRhdGEsIEwsIGhhc2hBbGdvcml0aG0pOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSB7CiAgICAgZnJlZShkYXRhKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gaGFzaChkYXRhLCBMLCBoYXNoQWxnb3JpdGhtKTsKICAgICBpZiAocmVzdWx0ICE9IGV4cGVjdGVkSGFzaCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICRyZXN1bHQiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkcmVzdWx0Jyk7CiAgICAgfQogICB9CiB9CkBAIC0xMDMsMTAgKzEwNiwxMSBAQAogLy8vCiAvLy8gVGhpcyBiZW5jaG1hcmsgaXMgaW50ZW5kZWQgYXMgbWFjcm8gYmVuY2htYXJrIHdpdGggYSByZWFsaXN0aWMgd29ya2xvYWQuCiBjbGFzcyBEaWdlc3REYXJ0TWVtb3J5IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIERpZ2VzdERhcnRNZW1vcnkoKSA6IHN1cGVyKCJGZmlCb3Jpbmdzc2wuRGlnZXN0RGFydE1lbW9yeSIpOworICBEaWdlc3REYXJ0TWVtb3J5KCkgOiBzdXBlcignRmZpQm9yaW5nc3NsLkRpZ2VzdERhcnRNZW1vcnknKTsKIAotICBVaW50OExpc3QgZGF0YTsgLy8gRGF0YSBpbiBDIG1lbW9yeSB0aGF0IHdlIHdhbnQgdG8gZGlnZXN0LgorICBVaW50OExpc3QgZGF0YSA9IFVpbnQ4TGlzdCgwKTsgLy8gRGF0YSBpbiBDIG1lbW9yeSB0aGF0IHdlIHdhbnQgdG8gZGlnZXN0LgogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgewogICAgIGRhdGEgPSBpbnZlbnREYXRhKEwpOwogICAgIGZpbmFsIFBvaW50ZXI8RGF0YT4gZGF0YUluQyA9IGFsbG9jYXRlPFVpbnQ4Pihjb3VudDogTCkuY2FzdCgpOwpAQCAtMTE1LDE1ICsxMTksMTcgQEAKICAgICBmcmVlKGRhdGFJbkMpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSB7fQogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBQb2ludGVyPERhdGE+IGRhdGFJbkMgPSBhbGxvY2F0ZTxVaW50OD4oY291bnQ6IEwpLmNhc3QoKTsKICAgICBjb3B5RnJvbVVpbnQ4TGlzdFRvVGFyZ2V0KGRhdGEsIGRhdGFJbkMucmVmKTsKICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gaGFzaChkYXRhSW5DLCBMLCBoYXNoQWxnb3JpdGhtKTsKICAgICBmcmVlKGRhdGFJbkMpOwogICAgIGlmIChyZXN1bHQgIT0gZXhwZWN0ZWRIYXNoKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHJlc3VsdCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICRyZXN1bHQnKTsKICAgICB9CiAgIH0KIH0KQEAgLTEzMiwxMCArMTM4LDEyIEBACiAvLyBNYWluIGRyaXZlci4KIC8vCiAKLW1haW4oKSB7Cit2b2lkIG1haW4oKSB7CiAgIGZpbmFsIGJlbmNobWFya3MgPSBbCiAgICAgKCkgPT4gRGlnZXN0Q01lbW9yeSgpLAogICAgICgpID0+IERpZ2VzdERhcnRNZW1vcnkoKSwKICAgXTsKLSAgYmVuY2htYXJrcy5mb3JFYWNoKChiZW5jaG1hcmspID0+IGJlbmNobWFyaygpLnJlcG9ydCgpKTsKKyAgZm9yIChmaW5hbCBiZW5jaG1hcmsgaW4gYmVuY2htYXJrcykgeworICAgIGJlbmNobWFyaygpLnJlcG9ydCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L2RpZ2VzdC5kYXJ0IGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydC9kaWdlc3QuZGFydAppbmRleCA2NTVlMTJmLi45YWY3NjE3IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L2RpZ2VzdC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvZGlnZXN0LmRhcnQKQEAgLTEzLDEwICsxMywxMCBAQAogCiBEeW5hbWljTGlicmFyeSBvcGVuU3NsKCkgewogICAvLyBGb3JjZSBsb2FkIGNyeXB0by4KLSAgZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygiY3J5cHRvIiwKLSAgICAgIHBhdGg6IFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCIuLi9uYXRpdmUvb3V0LyIpLnBhdGgpOwotICBEeW5hbWljTGlicmFyeSBzc2wgPSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCJzc2wiLAotICAgICAgcGF0aDogUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoIi4uL25hdGl2ZS9vdXQvIikucGF0aCk7CisgIGRsb3BlblBsYXRmb3JtU3BlY2lmaWMoJ2NyeXB0bycsCisgICAgICBwYXRoOiBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgnLi4vbmF0aXZlL291dC8nKS5wYXRoKTsKKyAgZmluYWwgc3NsID0gZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygnc3NsJywKKyAgICAgIHBhdGg6IFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCcuLi9uYXRpdmUvb3V0LycpLnBhdGgpOwogICByZXR1cm4gc3NsOwogfQogCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L2Rsb3Blbl9oZWxwZXIuZGFydCBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvZGxvcGVuX2hlbHBlci5kYXJ0CmluZGV4IGIwMzEwMDIuLmZlODA4NzkgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvZGxvcGVuX2hlbHBlci5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvZGxvcGVuX2hlbHBlci5kYXJ0CkBAIC01LDU0ICs1LDU3IEBACiBpbXBvcnQgJ2RhcnQ6ZmZpJzsKIGltcG9ydCAnZGFydDppbyc7CiAKLWNvbnN0IGtBcm0gPSAiYXJtIjsKLWNvbnN0IGtBcm02NCA9ICJhcm02NCI7Ci1jb25zdCBrSWEzMiA9ICJpYTMyIjsKLWNvbnN0IGtYNjQgPSAieDY0IjsKK2NvbnN0IGFybSA9ICdhcm0nOworY29uc3QgYXJtNjQgPSAnYXJtNjQnOworY29uc3QgaWEzMiA9ICdpYTMyJzsKK2NvbnN0IHg2NCA9ICd4NjQnOwogCiAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTEyNTUxNi9wb3NzaWJsZS12YWx1ZXMtZm9yLXVuYW1lLW0KIGZpbmFsIF91bmFtZXMgPSB7Ci0gICJhcm0iOiBrQXJtLAotICAiYWFyY2g2NF9iZSI6IGtBcm02NCwKLSAgImFhcmNoNjQiOiBrQXJtNjQsCi0gICJhcm12OGIiOiBrQXJtNjQsCi0gICJhcm12OGwiOiBrQXJtNjQsCi0gICJpMzg2Ijoga0lhMzIsCi0gICJpNjg2Ijoga0lhMzIsCi0gICJ4ODZfNjQiOiBrWDY0LAorICAnYXJtJzogYXJtLAorICAnYWFyY2g2NF9iZSc6IGFybTY0LAorICAnYWFyY2g2NCc6IGFybTY0LAorICAnYXJtdjhiJzogYXJtNjQsCisgICdhcm12OGwnOiBhcm02NCwKKyAgJ2kzODYnOiBpYTMyLAorICAnaTY4Nic6IGlhMzIsCisgICd4ODZfNjQnOiB4NjQsCiB9OwogCiBTdHJpbmcgX2NoZWNrUnVubmluZ01vZGUoU3RyaW5nIGFyY2hpdGVjdHVyZSkgewogICAvLyBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIGluIDMyYml0IG1vZGUuCiAgIGZpbmFsIGludCBwb2ludGVyU2l6ZSA9IHNpemVPZjxJbnRQdHI+KCk7Ci0gIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSBrWDY0KSByZXR1cm4ga0lhMzI7Ci0gIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSBrQXJtNjQpIHJldHVybiBrQXJtOworICBpZiAocG9pbnRlclNpemUgPT0gNCAmJiBhcmNoaXRlY3R1cmUgPT0geDY0KSByZXR1cm4gaWEzMjsKKyAgaWYgKHBvaW50ZXJTaXplID09IDQgJiYgYXJjaGl0ZWN0dXJlID09IGFybTY0KSByZXR1cm4gYXJtOwogCiAgIHJldHVybiBhcmNoaXRlY3R1cmU7CiB9CiAKIFN0cmluZyBfYXJjaGl0ZWN0dXJlKCkgewotICBmaW5hbCBTdHJpbmcgdW5hbWUgPSBQcm9jZXNzLnJ1blN5bmMoInVuYW1lIiwgWyItbSJdKS5zdGRvdXQudHJpbSgpOwotICBmaW5hbCBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gX3VuYW1lc1t1bmFtZV07Ci0gIGlmIChhcmNoaXRlY3R1cmUgPT0gbnVsbCkKLSAgICB0aHJvdyBFeGNlcHRpb24oIlVucmVjb2duaXplZCBhcmNoaXRlY3R1cmU6ICckdW5hbWUnIik7CisgIGZpbmFsIFN0cmluZyB1bmFtZSA9IFByb2Nlc3MucnVuU3luYygndW5hbWUnLCBbJy1tJ10pLnN0ZG91dC50cmltKCk7CisgIGZpbmFsIFN0cmluZz8gYXJjaGl0ZWN0dXJlID0gX3VuYW1lc1t1bmFtZV07CisgIGlmIChhcmNoaXRlY3R1cmUgPT0gbnVsbCkgeworICAgIHRocm93IEV4Y2VwdGlvbignVW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZTogIiR1bmFtZSInKTsKKyAgfQogCiAgIC8vIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gMzJiaXQgbW9kZS4KICAgcmV0dXJuIF9jaGVja1J1bm5pbmdNb2RlKGFyY2hpdGVjdHVyZSk7CiB9CiAKLVN0cmluZyBfcGxhdGZvcm1QYXRoKFN0cmluZyBuYW1lLCB7U3RyaW5nIHBhdGggPSAiIn0pIHsKLSAgaWYgKFBsYXRmb3JtLmlzTWFjT1MgfHwgUGxhdGZvcm0uaXNJT1MpCi0gICAgcmV0dXJuICIke3BhdGh9bWFjLyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5keWxpYiI7CitTdHJpbmcgX3BsYXRmb3JtUGF0aChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpIHsKKyAgaWYgKFBsYXRmb3JtLmlzTWFjT1MgfHwgUGxhdGZvcm0uaXNJT1MpIHsKKyAgICByZXR1cm4gJyR7cGF0aH1tYWMvJHtfYXJjaGl0ZWN0dXJlKCl9L2xpYiRuYW1lLmR5bGliJzsKKyAgfQogCi0gIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpCi0gICAgcmV0dXJuICIke3BhdGh9d2luLyR7X2NoZWNrUnVubmluZ01vZGUoa1g2NCl9LyRuYW1lLmRsbCI7CisgIGlmIChQbGF0Zm9ybS5pc1dpbmRvd3MpIHsKKyAgICByZXR1cm4gJyR7cGF0aH13aW4vJHtfY2hlY2tSdW5uaW5nTW9kZSh4NjQpfS8kbmFtZS5kbGwnOworICB9CiAKICAgLy8gVW5rbm93biBwbGF0Zm9ybXMgZGVmYXVsdCB0byBVbml4IGltcGxlbWVudGF0aW9uLgotICByZXR1cm4gIiR7cGF0aH1saW51eC8ke19hcmNoaXRlY3R1cmUoKX0vbGliJG5hbWUuc28iOworICByZXR1cm4gJyR7cGF0aH1saW51eC8ke19hcmNoaXRlY3R1cmUoKX0vbGliJG5hbWUuc28nOwogfQogCi1EeW5hbWljTGlicmFyeSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKFN0cmluZyBuYW1lLCB7U3RyaW5nIHBhdGh9KSB7Ci0gIGZpbmFsIFN0cmluZyBmdWxsUGF0aCA9IF9wbGF0Zm9ybVBhdGgobmFtZSwgcGF0aDogcGF0aCk7CitEeW5hbWljTGlicmFyeSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKFN0cmluZyBuYW1lLCB7U3RyaW5nIHBhdGggPSAnJ30pIHsKKyAgZmluYWwgU3RyaW5nIGZ1bGxQYXRoID0gX3BsYXRmb3JtUGF0aChuYW1lLCBwYXRoKTsKICAgcmV0dXJuIER5bmFtaWNMaWJyYXJ5Lm9wZW4oZnVsbFBhdGgpOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydC90eXBlcy5kYXJ0IGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydC90eXBlcy5kYXJ0CmluZGV4IDVkOTc0NzUuLjJkZDVmNzYgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvdHlwZXMuZGFydAorKysgYi9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0L3R5cGVzLmRhcnQKQEAgLTIsNiArMiw4IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy8gaWdub3JlX2Zvcl9maWxlOiBjYW1lbF9jYXNlX3R5cGVzCisKIGltcG9ydCAnZGFydDpmZmknOwogCiAvLy8gZGlnZXN0IGFsZ29yaXRobS4KQEAgLTE0LDEyICsxNiwxMiBAQAogY2xhc3MgRGF0YSBleHRlbmRzIFN0cnVjdCB7CiAgIHN0YXRpYyBEYXRhIGZyb21VaW50OFBvaW50ZXIoUG9pbnRlcjxVaW50OD4gcCkgPT4gcC5jYXN0PERhdGE+KCkucmVmOwogCi0gIFBvaW50ZXI8VWludDg+IGFzVWludDhQb2ludGVyKCkgPT4gdGhpcy5hZGRyZXNzT2YuY2FzdCgpOworICBQb2ludGVyPFVpbnQ4PiBhc1VpbnQ4UG9pbnRlcigpID0+IGFkZHJlc3NPZi5jYXN0KCk7CiB9CiAKIC8vLyBUeXBlIGZvciBgdWludDhfdCpgIHVzZWQgdG8gcmVwcmVzZW50IGJ5dGUgZGF0YS4KIGNsYXNzIEJ5dGVzIGV4dGVuZHMgU3RydWN0IHsKICAgc3RhdGljIERhdGEgZnJvbVVpbnQ4UG9pbnRlcihQb2ludGVyPFVpbnQ4PiBwKSA9PiBwLmNhc3Q8RGF0YT4oKS5yZWY7CiAKLSAgUG9pbnRlcjxVaW50OD4gYXNVaW50OFBvaW50ZXIoKSA9PiB0aGlzLmFkZHJlc3NPZi5jYXN0KCk7CisgIFBvaW50ZXI8VWludDg+IGFzVWludDhQb2ludGVyKCkgPT4gYWRkcmVzc09mLmNhc3QoKTsKIH0KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQyL0ZmaUJvcmluZ3NzbC5kYXJ0IGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvRmZpQm9yaW5nc3NsLmRhcnQKaW5kZXggMTA0NTg4ZS4uMWUxMmIzZCAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvRmZpQm9yaW5nc3NsLmRhcnQKKysrIGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvRmZpQm9yaW5nc3NsLmRhcnQKQEAgLTcxLDMwICs3MSwzMyBAQAogCiAvLyBIYXNoIG9mIGdlbmVyYXRlZCBkYXRhIG9mIGBMYCBieXRlcyB3aXRoIGBoYXNoQWxnb3JpdGhtYC4KIGNvbnN0IFN0cmluZyBleHBlY3RlZEhhc2ggPQotICAgICJiTkx0cWIrY0JaY1NrQ213QlV1QjVEUDJ1TGUwbWFkZXR3WHYxMHVzR1VGSmcxc2RHaFRFaSthVzVOV0lSVzFSS2lMcTU2b2JWNzRyVnVybjAxNEl5dz09IjsKKyAgICAnYk5MdHFiK2NCWmNTa0Ntd0JVdUI1RFAydUxlMG1hZGV0d1h2MTB1c0dVRkpnMXNkR2hURWkrYVc1TldJUlcxUktpTHE1Nm9iVjc0clZ1cm4wMTRJeXc9PSc7CiAKIC8vLyBUaGlzIGJlbmNobWFyayBydW5zIGEgZGlnZXN0IGFsZ29yaXRobSBvbiBkYXRhIHJlc2lkaW5nIGluIEMgbWVtb3J5LgogLy8vCiAvLy8gVGhpcyBiZW5jaG1hcmsgaXMgaW50ZW5kZWQgYXMgbWFjcm8gYmVuY2htYXJrIHdpdGggYSByZWFsaXN0aWMgd29ya2xvYWQuCiBjbGFzcyBEaWdlc3RDTWVtb3J5IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIERpZ2VzdENNZW1vcnkoKSA6IHN1cGVyKCJGZmlCb3Jpbmdzc2wuRGlnZXN0Q01lbW9yeSIpOworICBEaWdlc3RDTWVtb3J5KCkgOiBzdXBlcignRmZpQm9yaW5nc3NsLkRpZ2VzdENNZW1vcnknKTsKIAogICBQb2ludGVyPERhdGE+IGRhdGE7IC8vIERhdGEgaW4gQyBtZW1vcnkgdGhhdCB3ZSB3YW50IHRvIGRpZ2VzdC4KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpIHsKICAgICBkYXRhID0gYWxsb2NhdGU8VWludDg+KGNvdW50OiBMKS5jYXN0KCk7CiAgICAgY29weUZyb21VaW50OExpc3RUb1RhcmdldChpbnZlbnREYXRhKEwpLCBkYXRhLnJlZik7CiAgICAgaGFzaChkYXRhLCBMLCBoYXNoQWxnb3JpdGhtKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgewogICAgIGZyZWUoZGF0YSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGhhc2goZGF0YSwgTCwgaGFzaEFsZ29yaXRobSk7CiAgICAgaWYgKHJlc3VsdCAhPSBleHBlY3RlZEhhc2gpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkcmVzdWx0Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHJlc3VsdCcpOwogICAgIH0KICAgfQogfQpAQCAtMTAzLDEwICsxMDYsMTEgQEAKIC8vLwogLy8vIFRoaXMgYmVuY2htYXJrIGlzIGludGVuZGVkIGFzIG1hY3JvIGJlbmNobWFyayB3aXRoIGEgcmVhbGlzdGljIHdvcmtsb2FkLgogY2xhc3MgRGlnZXN0RGFydE1lbW9yeSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBEaWdlc3REYXJ0TWVtb3J5KCkgOiBzdXBlcigiRmZpQm9yaW5nc3NsLkRpZ2VzdERhcnRNZW1vcnkiKTsKKyAgRGlnZXN0RGFydE1lbW9yeSgpIDogc3VwZXIoJ0ZmaUJvcmluZ3NzbC5EaWdlc3REYXJ0TWVtb3J5Jyk7CiAKICAgVWludDhMaXN0IGRhdGE7IC8vIERhdGEgaW4gQyBtZW1vcnkgdGhhdCB3ZSB3YW50IHRvIGRpZ2VzdC4KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpIHsKICAgICBkYXRhID0gaW52ZW50RGF0YShMKTsKICAgICBmaW5hbCBQb2ludGVyPERhdGE+IGRhdGFJbkMgPSBhbGxvY2F0ZTxVaW50OD4oY291bnQ6IEwpLmNhc3QoKTsKQEAgLTExNSwxNSArMTE5LDE3IEBACiAgICAgZnJlZShkYXRhSW5DKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkge30KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgUG9pbnRlcjxEYXRhPiBkYXRhSW5DID0gYWxsb2NhdGU8VWludDg+KGNvdW50OiBMKS5jYXN0KCk7CiAgICAgY29weUZyb21VaW50OExpc3RUb1RhcmdldChkYXRhLCBkYXRhSW5DLnJlZik7CiAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGhhc2goZGF0YUluQywgTCwgaGFzaEFsZ29yaXRobSk7CiAgICAgZnJlZShkYXRhSW5DKTsKICAgICBpZiAocmVzdWx0ICE9IGV4cGVjdGVkSGFzaCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICRyZXN1bHQiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkcmVzdWx0Jyk7CiAgICAgfQogICB9CiB9CkBAIC0xMzIsMTAgKzEzOCwxMiBAQAogLy8gTWFpbiBkcml2ZXIuCiAvLwogCi1tYWluKCkgewordm9pZCBtYWluKCkgewogICBmaW5hbCBiZW5jaG1hcmtzID0gWwogICAgICgpID0+IERpZ2VzdENNZW1vcnkoKSwKICAgICAoKSA9PiBEaWdlc3REYXJ0TWVtb3J5KCksCiAgIF07Ci0gIGJlbmNobWFya3MuZm9yRWFjaCgoYmVuY2htYXJrKSA9PiBiZW5jaG1hcmsoKS5yZXBvcnQoKSk7CisgIGZvciAoZmluYWwgYmVuY2htYXJrIGluIGJlbmNobWFya3MpIHsKKyAgICBiZW5jaG1hcmsoKS5yZXBvcnQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvZGlnZXN0LmRhcnQgYi9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0Mi9kaWdlc3QuZGFydAppbmRleCA2NTVlMTJmLi45YWY3NjE3IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0Mi9kaWdlc3QuZGFydAorKysgYi9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0Mi9kaWdlc3QuZGFydApAQCAtMTMsMTAgKzEzLDEwIEBACiAKIER5bmFtaWNMaWJyYXJ5IG9wZW5Tc2woKSB7CiAgIC8vIEZvcmNlIGxvYWQgY3J5cHRvLgotICBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCJjcnlwdG8iLAotICAgICAgcGF0aDogUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoIi4uL25hdGl2ZS9vdXQvIikucGF0aCk7Ci0gIER5bmFtaWNMaWJyYXJ5IHNzbCA9IGRsb3BlblBsYXRmb3JtU3BlY2lmaWMoInNzbCIsCi0gICAgICBwYXRoOiBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgiLi4vbmF0aXZlL291dC8iKS5wYXRoKTsKKyAgZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygnY3J5cHRvJywKKyAgICAgIHBhdGg6IFBsYXRmb3JtLnNjcmlwdC5yZXNvbHZlKCcuLi9uYXRpdmUvb3V0LycpLnBhdGgpOworICBmaW5hbCBzc2wgPSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCdzc2wnLAorICAgICAgcGF0aDogUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoJy4uL25hdGl2ZS9vdXQvJykucGF0aCk7CiAgIHJldHVybiBzc2w7CiB9CiAKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQyL2Rsb3Blbl9oZWxwZXIuZGFydCBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQyL2Rsb3Blbl9oZWxwZXIuZGFydAppbmRleCBiMDMxMDAyLi43MjZjMTgxIDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0Mi9kbG9wZW5faGVscGVyLmRhcnQKKysrIGIvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvZGxvcGVuX2hlbHBlci5kYXJ0CkBAIC01LDUxICs1LDU0IEBACiBpbXBvcnQgJ2RhcnQ6ZmZpJzsKIGltcG9ydCAnZGFydDppbyc7CiAKLWNvbnN0IGtBcm0gPSAiYXJtIjsKLWNvbnN0IGtBcm02NCA9ICJhcm02NCI7Ci1jb25zdCBrSWEzMiA9ICJpYTMyIjsKLWNvbnN0IGtYNjQgPSAieDY0IjsKK2NvbnN0IGFybSA9ICdhcm0nOworY29uc3QgYXJtNjQgPSAnYXJtNjQnOworY29uc3QgaWEzMiA9ICdpYTMyJzsKK2NvbnN0IHg2NCA9ICd4NjQnOwogCiAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NTEyNTUxNi9wb3NzaWJsZS12YWx1ZXMtZm9yLXVuYW1lLW0KIGZpbmFsIF91bmFtZXMgPSB7Ci0gICJhcm0iOiBrQXJtLAotICAiYWFyY2g2NF9iZSI6IGtBcm02NCwKLSAgImFhcmNoNjQiOiBrQXJtNjQsCi0gICJhcm12OGIiOiBrQXJtNjQsCi0gICJhcm12OGwiOiBrQXJtNjQsCi0gICJpMzg2Ijoga0lhMzIsCi0gICJpNjg2Ijoga0lhMzIsCi0gICJ4ODZfNjQiOiBrWDY0LAorICAnYXJtJzogYXJtLAorICAnYWFyY2g2NF9iZSc6IGFybTY0LAorICAnYWFyY2g2NCc6IGFybTY0LAorICAnYXJtdjhiJzogYXJtNjQsCisgICdhcm12OGwnOiBhcm02NCwKKyAgJ2kzODYnOiBpYTMyLAorICAnaTY4Nic6IGlhMzIsCisgICd4ODZfNjQnOiB4NjQsCiB9OwogCiBTdHJpbmcgX2NoZWNrUnVubmluZ01vZGUoU3RyaW5nIGFyY2hpdGVjdHVyZSkgewogICAvLyBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIGluIDMyYml0IG1vZGUuCiAgIGZpbmFsIGludCBwb2ludGVyU2l6ZSA9IHNpemVPZjxJbnRQdHI+KCk7Ci0gIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSBrWDY0KSByZXR1cm4ga0lhMzI7Ci0gIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSBrQXJtNjQpIHJldHVybiBrQXJtOworICBpZiAocG9pbnRlclNpemUgPT0gNCAmJiBhcmNoaXRlY3R1cmUgPT0geDY0KSByZXR1cm4gaWEzMjsKKyAgaWYgKHBvaW50ZXJTaXplID09IDQgJiYgYXJjaGl0ZWN0dXJlID09IGFybTY0KSByZXR1cm4gYXJtOwogCiAgIHJldHVybiBhcmNoaXRlY3R1cmU7CiB9CiAKIFN0cmluZyBfYXJjaGl0ZWN0dXJlKCkgewotICBmaW5hbCBTdHJpbmcgdW5hbWUgPSBQcm9jZXNzLnJ1blN5bmMoInVuYW1lIiwgWyItbSJdKS5zdGRvdXQudHJpbSgpOworICBmaW5hbCBTdHJpbmcgdW5hbWUgPSBQcm9jZXNzLnJ1blN5bmMoJ3VuYW1lJywgWyctbSddKS5zdGRvdXQudHJpbSgpOwogICBmaW5hbCBTdHJpbmcgYXJjaGl0ZWN0dXJlID0gX3VuYW1lc1t1bmFtZV07Ci0gIGlmIChhcmNoaXRlY3R1cmUgPT0gbnVsbCkKLSAgICB0aHJvdyBFeGNlcHRpb24oIlVucmVjb2duaXplZCBhcmNoaXRlY3R1cmU6ICckdW5hbWUnIik7CisgIGlmIChhcmNoaXRlY3R1cmUgPT0gbnVsbCkgeworICAgIHRocm93IEV4Y2VwdGlvbignVW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZTogIiR1bmFtZSInKTsKKyAgfQogCiAgIC8vIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gMzJiaXQgbW9kZS4KICAgcmV0dXJuIF9jaGVja1J1bm5pbmdNb2RlKGFyY2hpdGVjdHVyZSk7CiB9CiAKLVN0cmluZyBfcGxhdGZvcm1QYXRoKFN0cmluZyBuYW1lLCB7U3RyaW5nIHBhdGggPSAiIn0pIHsKLSAgaWYgKFBsYXRmb3JtLmlzTWFjT1MgfHwgUGxhdGZvcm0uaXNJT1MpCi0gICAgcmV0dXJuICIke3BhdGh9bWFjLyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5keWxpYiI7CitTdHJpbmcgX3BsYXRmb3JtUGF0aChTdHJpbmcgbmFtZSwge1N0cmluZyBwYXRoID0gJyd9KSB7CisgIGlmIChQbGF0Zm9ybS5pc01hY09TIHx8IFBsYXRmb3JtLmlzSU9TKSB7CisgICAgcmV0dXJuICcke3BhdGh9bWFjLyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5keWxpYic7CisgIH0KIAotICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKQotICAgIHJldHVybiAiJHtwYXRofXdpbi8ke19jaGVja1J1bm5pbmdNb2RlKGtYNjQpfS8kbmFtZS5kbGwiOworICBpZiAoUGxhdGZvcm0uaXNXaW5kb3dzKSB7CisgICAgcmV0dXJuICcke3BhdGh9d2luLyR7X2NoZWNrUnVubmluZ01vZGUoeDY0KX0vJG5hbWUuZGxsJzsKKyAgfQogCiAgIC8vIFVua25vd24gcGxhdGZvcm1zIGRlZmF1bHQgdG8gVW5peCBpbXBsZW1lbnRhdGlvbi4KLSAgcmV0dXJuICIke3BhdGh9bGludXgvJHtfYXJjaGl0ZWN0dXJlKCl9L2xpYiRuYW1lLnNvIjsKKyAgcmV0dXJuICcke3BhdGh9bGludXgvJHtfYXJjaGl0ZWN0dXJlKCl9L2xpYiRuYW1lLnNvJzsKIH0KIAogRHluYW1pY0xpYnJhcnkgZGxvcGVuUGxhdGZvcm1TcGVjaWZpYyhTdHJpbmcgbmFtZSwge1N0cmluZyBwYXRofSkgewpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvdHlwZXMuZGFydCBiL2JlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQyL3R5cGVzLmRhcnQKaW5kZXggNWQ5NzQ3NS4uMmRkNWY3NiAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvdHlwZXMuZGFydAorKysgYi9iZW5jaG1hcmtzL0ZmaUJvcmluZ3NzbC9kYXJ0Mi90eXBlcy5kYXJ0CkBAIC0yLDYgKzIsOCBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKy8vIGlnbm9yZV9mb3JfZmlsZTogY2FtZWxfY2FzZV90eXBlcworCiBpbXBvcnQgJ2RhcnQ6ZmZpJzsKIAogLy8vIGRpZ2VzdCBhbGdvcml0aG0uCkBAIC0xNCwxMiArMTYsMTIgQEAKIGNsYXNzIERhdGEgZXh0ZW5kcyBTdHJ1Y3QgewogICBzdGF0aWMgRGF0YSBmcm9tVWludDhQb2ludGVyKFBvaW50ZXI8VWludDg+IHApID0+IHAuY2FzdDxEYXRhPigpLnJlZjsKIAotICBQb2ludGVyPFVpbnQ4PiBhc1VpbnQ4UG9pbnRlcigpID0+IHRoaXMuYWRkcmVzc09mLmNhc3QoKTsKKyAgUG9pbnRlcjxVaW50OD4gYXNVaW50OFBvaW50ZXIoKSA9PiBhZGRyZXNzT2YuY2FzdCgpOwogfQogCiAvLy8gVHlwZSBmb3IgYHVpbnQ4X3QqYCB1c2VkIHRvIHJlcHJlc2VudCBieXRlIGRhdGEuCiBjbGFzcyBCeXRlcyBleHRlbmRzIFN0cnVjdCB7CiAgIHN0YXRpYyBEYXRhIGZyb21VaW50OFBvaW50ZXIoUG9pbnRlcjxVaW50OD4gcCkgPT4gcC5jYXN0PERhdGE+KCkucmVmOwogCi0gIFBvaW50ZXI8VWludDg+IGFzVWludDhQb2ludGVyKCkgPT4gdGhpcy5hZGRyZXNzT2YuY2FzdCgpOworICBQb2ludGVyPFVpbnQ4PiBhc1VpbnQ4UG9pbnRlcigpID0+IGFkZHJlc3NPZi5jYXN0KCk7CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydC9GZmlDYWxsLmRhcnQgYi9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydC9GZmlDYWxsLmRhcnQKaW5kZXggZTZhZmQ0MC4uYzIzOTJhMSAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9GZmlDYWxsL2RhcnQvRmZpQ2FsbC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpQ2FsbC9kYXJ0L0ZmaUNhbGwuZGFydApAQCAtMTksNTQgKzE5LDU0IEBACiAvLyBUcmFtcG9saW5lIGZ1bmN0aW9ucy4KIC8vCiAKLUR5bmFtaWNMaWJyYXJ5IGZmaVRlc3RGdW5jdGlvbnMgPSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCJuYXRpdmVfZnVuY3Rpb25zIiwKLSAgICBwYXRoOiBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgiLi4vbmF0aXZlL291dC8iKS5wYXRoKTsKK0R5bmFtaWNMaWJyYXJ5IGZmaVRlc3RGdW5jdGlvbnMgPSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCduYXRpdmVfZnVuY3Rpb25zJywKKyAgICBwYXRoOiBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgnLi4vbmF0aXZlL291dC8nKS5wYXRoKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFVaW50OCA9IFVpbnQ4IEZ1bmN0aW9uKFVpbnQ4KTsKIHR5cGVkZWYgRnVuY3Rpb24xaW50ID0gaW50IEZ1bmN0aW9uKGludCk7Ci1GdW5jdGlvbjFpbnQgZnVuY3Rpb24xVWludDggPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQ4LCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFVaW50OCIpOworZmluYWwgZnVuY3Rpb24xVWludDggPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQ4LCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFVaW50OCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMVVpbnQxNiA9IFVpbnQxNiBGdW5jdGlvbihVaW50MTYpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMVVpbnQxNiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xVWludDE2LCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFVaW50MTYiKTsKK2ZpbmFsIGZ1bmN0aW9uMVVpbnQxNiA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xVWludDE2LCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFVaW50MTYnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFVaW50MzIgPSBVaW50MzIgRnVuY3Rpb24oVWludDMyKTsKLUZ1bmN0aW9uMWludCBmdW5jdGlvbjFVaW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQzMiwgRnVuY3Rpb24xaW50PigiRnVuY3Rpb24xVWludDMyIik7CitmaW5hbCBmdW5jdGlvbjFVaW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQzMiwgRnVuY3Rpb24xaW50PignRnVuY3Rpb24xVWludDMyJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xVWludDY0ID0gVWludDY0IEZ1bmN0aW9uKFVpbnQ2NCk7Ci1GdW5jdGlvbjFpbnQgZnVuY3Rpb24xVWludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50NjQsIEZ1bmN0aW9uMWludD4oIkZ1bmN0aW9uMVVpbnQ2NCIpOworZmluYWwgZnVuY3Rpb24xVWludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50NjQsIEZ1bmN0aW9uMWludD4oJ0Z1bmN0aW9uMVVpbnQ2NCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMUludDggPSBJbnQ4IEZ1bmN0aW9uKEludDgpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMUludDggPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDgsIEZ1bmN0aW9uMWludD4oIkZ1bmN0aW9uMUludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uMUludDggPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDgsIEZ1bmN0aW9uMWludD4oJ0Z1bmN0aW9uMUludDgnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFJbnQxNiA9IEludDE2IEZ1bmN0aW9uKEludDE2KTsKLUZ1bmN0aW9uMWludCBmdW5jdGlvbjFJbnQxNiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xSW50MTYsIEZ1bmN0aW9uMWludD4oIkZ1bmN0aW9uMUludDE2Iik7CitmaW5hbCBmdW5jdGlvbjFJbnQxNiA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xSW50MTYsIEZ1bmN0aW9uMWludD4oJ0Z1bmN0aW9uMUludDE2Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xSW50MzIgPSBJbnQzMiBGdW5jdGlvbihJbnQzMik7Ci1GdW5jdGlvbjFpbnQgZnVuY3Rpb24xSW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDMyLCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFJbnQzMiIpOworZmluYWwgZnVuY3Rpb24xSW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDMyLCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFJbnQzMicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMkludDMyID0gSW50MzIgRnVuY3Rpb24oSW50MzIsIEludDMyKTsKIHR5cGVkZWYgRnVuY3Rpb24yaW50ID0gaW50IEZ1bmN0aW9uKGludCwgaW50KTsKLUZ1bmN0aW9uMmludCBmdW5jdGlvbjJJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24ySW50MzIsIEZ1bmN0aW9uMmludD4oIkZ1bmN0aW9uMkludDMyIik7CitmaW5hbCBmdW5jdGlvbjJJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24ySW50MzIsIEZ1bmN0aW9uMmludD4oJ0Z1bmN0aW9uMkludDMyJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb240SW50MzIgPSBJbnQzMiBGdW5jdGlvbihJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMik7CiB0eXBlZGVmIEZ1bmN0aW9uNGludCA9IGludCBGdW5jdGlvbihpbnQsIGludCwgaW50LCBpbnQpOwotRnVuY3Rpb240aW50IGZ1bmN0aW9uNEludDMyID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRJbnQzMiwgRnVuY3Rpb240aW50PigiRnVuY3Rpb240SW50MzIiKTsKK2ZpbmFsIGZ1bmN0aW9uNEludDMyID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRJbnQzMiwgRnVuY3Rpb240aW50PignRnVuY3Rpb240SW50MzInKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjEwSW50MzIgPSBJbnQzMiBGdW5jdGlvbigKICAgICBJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMik7CiB0eXBlZGVmIEZ1bmN0aW9uMTBpbnQgPSBpbnQgRnVuY3Rpb24oCiAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KTsKLUZ1bmN0aW9uMTBpbnQgZnVuY3Rpb24xMEludDMyID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjEwSW50MzIsIEZ1bmN0aW9uMTBpbnQ+KCJGdW5jdGlvbjEwSW50MzIiKTsKK2ZpbmFsIGZ1bmN0aW9uMTBJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xMEludDMyLCBGdW5jdGlvbjEwaW50PignRnVuY3Rpb24xMEludDMyJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24yMEludDMyID0gSW50MzIgRnVuY3Rpb24oCiAgICAgSW50MzIsCkBAIC05MSwyNSArOTEsMjUgQEAKICAgICBJbnQzMik7CiB0eXBlZGVmIEZ1bmN0aW9uMjBpbnQgPSBpbnQgRnVuY3Rpb24oaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCiAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7Ci1GdW5jdGlvbjIwaW50IGZ1bmN0aW9uMjBJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yMEludDMyLCBGdW5jdGlvbjIwaW50PigiRnVuY3Rpb24yMEludDMyIik7CitmaW5hbCBmdW5jdGlvbjIwSW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBJbnQzMiwgRnVuY3Rpb24yMGludD4oJ0Z1bmN0aW9uMjBJbnQzMicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMUludDY0ID0gSW50NjQgRnVuY3Rpb24oSW50NjQpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMUludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQ2NCwgRnVuY3Rpb24xaW50PigiRnVuY3Rpb24xSW50NjQiKTsKK2ZpbmFsIGZ1bmN0aW9uMUludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQ2NCwgRnVuY3Rpb24xaW50PignRnVuY3Rpb24xSW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjJJbnQ2NCA9IEludDY0IEZ1bmN0aW9uKEludDY0LCBJbnQ2NCk7Ci1GdW5jdGlvbjJpbnQgZnVuY3Rpb24ySW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkludDY0LCBGdW5jdGlvbjJpbnQ+KCJGdW5jdGlvbjJJbnQ2NCIpOworZmluYWwgZnVuY3Rpb24ySW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkludDY0LCBGdW5jdGlvbjJpbnQ+KCdGdW5jdGlvbjJJbnQ2NCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uNEludDY0ID0gSW50NjQgRnVuY3Rpb24oSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQpOwotRnVuY3Rpb240aW50IGZ1bmN0aW9uNEludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRJbnQ2NCwgRnVuY3Rpb240aW50PigiRnVuY3Rpb240SW50NjQiKTsKK2ZpbmFsIGZ1bmN0aW9uNEludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRJbnQ2NCwgRnVuY3Rpb240aW50PignRnVuY3Rpb240SW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjEwSW50NjQgPSBJbnQ2NCBGdW5jdGlvbigKICAgICBJbnQ2NCwgSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQsIEludDY0LCBJbnQ2NCk7Ci1GdW5jdGlvbjEwaW50IGZ1bmN0aW9uMTBJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xMEludDY0LCBGdW5jdGlvbjEwaW50PigiRnVuY3Rpb24xMEludDY0Iik7CitmaW5hbCBmdW5jdGlvbjEwSW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBJbnQ2NCwgRnVuY3Rpb24xMGludD4oJ0Z1bmN0aW9uMTBJbnQ2NCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMjBJbnQ2NCA9IEludDY0IEZ1bmN0aW9uKAogICAgIEludDY0LApAQCAtMTMyLDMwICsxMzIsMzAgQEAKICAgICBJbnQ2NCwKICAgICBJbnQ2NCwKICAgICBJbnQ2NCk7Ci1GdW5jdGlvbjIwaW50IGZ1bmN0aW9uMjBJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yMEludDY0LCBGdW5jdGlvbjIwaW50PigiRnVuY3Rpb24yMEludDY0Iik7CitmaW5hbCBmdW5jdGlvbjIwSW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBJbnQ2NCwgRnVuY3Rpb24yMGludD4oJ0Z1bmN0aW9uMjBJbnQ2NCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMUZsb2F0ID0gRmxvYXQgRnVuY3Rpb24oRmxvYXQpOwogdHlwZWRlZiBGdW5jdGlvbjFkb3VibGUgPSBkb3VibGUgRnVuY3Rpb24oZG91YmxlKTsKLUZ1bmN0aW9uMWRvdWJsZSBmdW5jdGlvbjFGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xRmxvYXQsIEZ1bmN0aW9uMWRvdWJsZT4oIkZ1bmN0aW9uMUZsb2F0Iik7CitmaW5hbCBmdW5jdGlvbjFGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xRmxvYXQsIEZ1bmN0aW9uMWRvdWJsZT4oJ0Z1bmN0aW9uMUZsb2F0Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24yRmxvYXQgPSBGbG9hdCBGdW5jdGlvbihGbG9hdCwgRmxvYXQpOwogdHlwZWRlZiBGdW5jdGlvbjJkb3VibGUgPSBkb3VibGUgRnVuY3Rpb24oZG91YmxlLCBkb3VibGUpOwotRnVuY3Rpb24yZG91YmxlIGZ1bmN0aW9uMkZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjJGbG9hdCwgRnVuY3Rpb24yZG91YmxlPigiRnVuY3Rpb24yRmxvYXQiKTsKK2ZpbmFsIGZ1bmN0aW9uMkZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjJGbG9hdCwgRnVuY3Rpb24yZG91YmxlPignRnVuY3Rpb24yRmxvYXQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjRGbG9hdCA9IEZsb2F0IEZ1bmN0aW9uKEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0KTsKIHR5cGVkZWYgRnVuY3Rpb240ZG91YmxlID0gZG91YmxlIEZ1bmN0aW9uKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSk7Ci1GdW5jdGlvbjRkb3VibGUgZnVuY3Rpb240RmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uNEZsb2F0LCBGdW5jdGlvbjRkb3VibGU+KCJGdW5jdGlvbjRGbG9hdCIpOworZmluYWwgZnVuY3Rpb240RmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uNEZsb2F0LCBGdW5jdGlvbjRkb3VibGU+KCdGdW5jdGlvbjRGbG9hdCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMTBGbG9hdCA9IEZsb2F0IEZ1bmN0aW9uKAogICAgIEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0KTsKIHR5cGVkZWYgRnVuY3Rpb24xMGRvdWJsZSA9IGRvdWJsZSBGdW5jdGlvbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsCiAgICAgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSk7Ci1GdW5jdGlvbjEwZG91YmxlIGZ1bmN0aW9uMTBGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xMEZsb2F0LCBGdW5jdGlvbjEwZG91YmxlPigiRnVuY3Rpb24xMEZsb2F0Iik7CitmaW5hbCBmdW5jdGlvbjEwRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBGbG9hdCwgRnVuY3Rpb24xMGRvdWJsZT4oJ0Z1bmN0aW9uMTBGbG9hdCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMjBGbG9hdCA9IEZsb2F0IEZ1bmN0aW9uKAogICAgIEZsb2F0LApAQCAtMTk5LDI2ICsxOTksMjYgQEAKICAgICBkb3VibGUsCiAgICAgZG91YmxlLAogICAgIGRvdWJsZSk7Ci1GdW5jdGlvbjIwZG91YmxlIGZ1bmN0aW9uMjBGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yMEZsb2F0LCBGdW5jdGlvbjIwZG91YmxlPigiRnVuY3Rpb24yMEZsb2F0Iik7CitmaW5hbCBmdW5jdGlvbjIwRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBGbG9hdCwgRnVuY3Rpb24yMGRvdWJsZT4oJ0Z1bmN0aW9uMjBGbG9hdCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMURvdWJsZSA9IERvdWJsZSBGdW5jdGlvbihEb3VibGUpOwotRnVuY3Rpb24xZG91YmxlIGZ1bmN0aW9uMURvdWJsZSA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xRG91YmxlLCBGdW5jdGlvbjFkb3VibGU+KCJGdW5jdGlvbjFEb3VibGUiKTsKK2ZpbmFsIGZ1bmN0aW9uMURvdWJsZSA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xRG91YmxlLCBGdW5jdGlvbjFkb3VibGU+KCdGdW5jdGlvbjFEb3VibGUnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjJEb3VibGUgPSBEb3VibGUgRnVuY3Rpb24oRG91YmxlLCBEb3VibGUpOwotRnVuY3Rpb24yZG91YmxlIGZ1bmN0aW9uMkRvdWJsZSA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yRG91YmxlLCBGdW5jdGlvbjJkb3VibGU+KCJGdW5jdGlvbjFEb3VibGUiKTsKK2ZpbmFsIGZ1bmN0aW9uMkRvdWJsZSA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yRG91YmxlLCBGdW5jdGlvbjJkb3VibGU+KCdGdW5jdGlvbjFEb3VibGUnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjREb3VibGUgPSBEb3VibGUgRnVuY3Rpb24oRG91YmxlLCBEb3VibGUsIERvdWJsZSwgRG91YmxlKTsKLUZ1bmN0aW9uNGRvdWJsZSBmdW5jdGlvbjREb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uNERvdWJsZSwgRnVuY3Rpb240ZG91YmxlPigiRnVuY3Rpb24xRG91YmxlIik7CitmaW5hbCBmdW5jdGlvbjREb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uNERvdWJsZSwgRnVuY3Rpb240ZG91YmxlPignRnVuY3Rpb24xRG91YmxlJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xMERvdWJsZSA9IERvdWJsZSBGdW5jdGlvbihEb3VibGUsIERvdWJsZSwgRG91YmxlLCBEb3VibGUsCiAgICAgRG91YmxlLCBEb3VibGUsIERvdWJsZSwgRG91YmxlLCBEb3VibGUsIERvdWJsZSk7CiBGdW5jdGlvbjEwZG91YmxlIGZ1bmN0aW9uMTBEb3VibGUgPQogICAgIGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xMERvdWJsZSwgRnVuY3Rpb24xMGRvdWJsZT4oCi0gICAgICAgICJGdW5jdGlvbjEwRG91YmxlIik7CisgICAgICAgICdGdW5jdGlvbjEwRG91YmxlJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24yMERvdWJsZSA9IERvdWJsZSBGdW5jdGlvbigKICAgICBEb3VibGUsCkBAIC0yNDMsMjEgKzI0MywyMSBAQAogICAgIERvdWJsZSk7CiBGdW5jdGlvbjIwZG91YmxlIGZ1bmN0aW9uMjBEb3VibGUgPQogICAgIGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yMERvdWJsZSwgRnVuY3Rpb24yMGRvdWJsZT4oCi0gICAgICAgICJGdW5jdGlvbjIwRG91YmxlIik7CisgICAgICAgICdGdW5jdGlvbjIwRG91YmxlJyk7CiAKIHR5cGVkZWYgRnVuY3Rpb24xUG9pbnRlclVpbnQ4ID0gUG9pbnRlcjxVaW50OD4gRnVuY3Rpb24oUG9pbnRlcjxVaW50OD4pOwotRnVuY3Rpb24xUG9pbnRlclVpbnQ4IGZ1bmN0aW9uMVBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248Ci0gICAgRnVuY3Rpb24xUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjFQb2ludGVyVWludDg+KCJGdW5jdGlvbjFQb2ludGVyVWludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uMVBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CisgICAgRnVuY3Rpb24xUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjFQb2ludGVyVWludDg+KCdGdW5jdGlvbjFQb2ludGVyVWludDgnKTsKIAogdHlwZWRlZiBGdW5jdGlvbjJQb2ludGVyVWludDggPSBQb2ludGVyPFVpbnQ4PiBGdW5jdGlvbigKICAgICBQb2ludGVyPFVpbnQ4PiwgUG9pbnRlcjxVaW50OD4pOwotRnVuY3Rpb24yUG9pbnRlclVpbnQ4IGZ1bmN0aW9uMlBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248Ci0gICAgRnVuY3Rpb24yUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjJQb2ludGVyVWludDg+KCJGdW5jdGlvbjJQb2ludGVyVWludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uMlBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CisgICAgRnVuY3Rpb24yUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjJQb2ludGVyVWludDg+KCdGdW5jdGlvbjJQb2ludGVyVWludDgnKTsKIAogdHlwZWRlZiBGdW5jdGlvbjRQb2ludGVyVWludDggPSBQb2ludGVyPFVpbnQ4PiBGdW5jdGlvbigKICAgICBQb2ludGVyPFVpbnQ4PiwgUG9pbnRlcjxVaW50OD4sIFBvaW50ZXI8VWludDg+LCBQb2ludGVyPFVpbnQ4Pik7Ci1GdW5jdGlvbjRQb2ludGVyVWludDggZnVuY3Rpb240UG9pbnRlclVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKLSAgICBGdW5jdGlvbjRQb2ludGVyVWludDgsIEZ1bmN0aW9uNFBvaW50ZXJVaW50OD4oIkZ1bmN0aW9uNFBvaW50ZXJVaW50OCIpOworZmluYWwgZnVuY3Rpb240UG9pbnRlclVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKKyAgICBGdW5jdGlvbjRQb2ludGVyVWludDgsIEZ1bmN0aW9uNFBvaW50ZXJVaW50OD4oJ0Z1bmN0aW9uNFBvaW50ZXJVaW50OCcpOwogCiB0eXBlZGVmIEZ1bmN0aW9uMTBQb2ludGVyVWludDggPSBQb2ludGVyPFVpbnQ4PiBGdW5jdGlvbigKICAgICBQb2ludGVyPFVpbnQ4PiwKQEAgLTI3MCw4ICsyNzAsOCBAQAogICAgIFBvaW50ZXI8VWludDg+LAogICAgIFBvaW50ZXI8VWludDg+LAogICAgIFBvaW50ZXI8VWludDg+KTsKLUZ1bmN0aW9uMTBQb2ludGVyVWludDggZnVuY3Rpb24xMFBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248Ci0gICAgRnVuY3Rpb24xMFBvaW50ZXJVaW50OCwgRnVuY3Rpb24xMFBvaW50ZXJVaW50OD4oIkZ1bmN0aW9uMTBQb2ludGVyVWludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uMTBQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAorICAgIEZ1bmN0aW9uMTBQb2ludGVyVWludDgsIEZ1bmN0aW9uMTBQb2ludGVyVWludDg+KCdGdW5jdGlvbjEwUG9pbnRlclVpbnQ4Jyk7CiAKIHR5cGVkZWYgRnVuY3Rpb24yMFBvaW50ZXJVaW50OCA9IFBvaW50ZXI8VWludDg+IEZ1bmN0aW9uKAogICAgIFBvaW50ZXI8VWludDg+LApAQCAtMjk0LDI1ICsyOTQsMjUgQEAKICAgICBQb2ludGVyPFVpbnQ4PiwKICAgICBQb2ludGVyPFVpbnQ4PiwKICAgICBQb2ludGVyPFVpbnQ4Pik7Ci1GdW5jdGlvbjIwUG9pbnRlclVpbnQ4IGZ1bmN0aW9uMjBQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAotICAgIEZ1bmN0aW9uMjBQb2ludGVyVWludDgsIEZ1bmN0aW9uMjBQb2ludGVyVWludDg+KCJGdW5jdGlvbjIwUG9pbnRlclVpbnQ4Iik7CitmaW5hbCBmdW5jdGlvbjIwUG9pbnRlclVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKKyAgICBGdW5jdGlvbjIwUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjIwUG9pbnRlclVpbnQ4PignRnVuY3Rpb24yMFBvaW50ZXJVaW50OCcpOwogCiBmaW5hbCBmdW5jdGlvbjFoYW5kbGUgPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPEhhbmRsZSBGdW5jdGlvbihIYW5kbGUpLAotICAgIE9iamVjdCBGdW5jdGlvbihPYmplY3QpPigiRnVuY3Rpb24xSGFuZGxlIik7CisgICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCk+KCdGdW5jdGlvbjFIYW5kbGUnKTsKIAogZmluYWwgZnVuY3Rpb24yaGFuZGxlID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKICAgICBIYW5kbGUgRnVuY3Rpb24oSGFuZGxlLCBIYW5kbGUpLAotICAgIE9iamVjdCBGdW5jdGlvbihPYmplY3QsIE9iamVjdCk+KCJGdW5jdGlvbjJIYW5kbGUiKTsKKyAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0LCBPYmplY3QpPignRnVuY3Rpb24ySGFuZGxlJyk7CiAKIGZpbmFsIGZ1bmN0aW9uNGhhbmRsZSA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CiAgICAgSGFuZGxlIEZ1bmN0aW9uKEhhbmRsZSwgSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSksCi0gICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCk+KCJGdW5jdGlvbjRIYW5kbGUiKTsKKyAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0KT4oJ0Z1bmN0aW9uNEhhbmRsZScpOwogCiBmaW5hbCBmdW5jdGlvbjEwaGFuZGxlID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKICAgICBIYW5kbGUgRnVuY3Rpb24oSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSwgSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSwgSGFuZGxlLAogICAgICAgICBIYW5kbGUsIEhhbmRsZSwgSGFuZGxlKSwKICAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LAotICAgICAgICBPYmplY3QsIE9iamVjdCwgT2JqZWN0KT4oIkZ1bmN0aW9uMTBIYW5kbGUiKTsKKyAgICAgICAgT2JqZWN0LCBPYmplY3QsIE9iamVjdCk+KCdGdW5jdGlvbjEwSGFuZGxlJyk7CiAKIGZpbmFsIGZ1bmN0aW9uMjBoYW5kbGUgPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAogICAgIEhhbmRsZSBGdW5jdGlvbigKQEAgLTM1Niw3ICszNTYsNyBAQAogICAgICAgICBPYmplY3QsCiAgICAgICAgIE9iamVjdCwKICAgICAgICAgT2JqZWN0LAotICAgICAgICBPYmplY3QpPigiRnVuY3Rpb24yMEhhbmRsZSIpOworICAgICAgICBPYmplY3QpPignRnVuY3Rpb24yMEhhbmRsZScpOwogCiAvLwogLy8gVHJhbXBvbGluZSBjYWxsLgpAQCAtNzMyLDM1NCArNzMyLDM5MiBAQAogY29uc3QgTiA9IDEwMDA7CiAKIGNsYXNzIFVpbnQ4eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFVpbnQ4eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5VaW50OHgwMSIpOworICBVaW50OHgwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuVWludDh4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxVWludDgoTik7CiAgICAgaWYgKHggIT0gTiAqIDE3ICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBVaW50MTZ4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgVWludDE2eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5VaW50MTZ4MDEiKTsKKyAgVWludDE2eDAxKCkgOiBzdXBlcignRmZpQ2FsbC5VaW50MTZ4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxVWludDE2KE4pOwogICAgIGlmICh4ICE9IE4gKiAxNyArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgVWludDMyeDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFVpbnQzMngwMSgpIDogc3VwZXIoIkZmaUNhbGwuVWludDMyeDAxIik7CisgIFVpbnQzMngwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuVWludDMyeDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMVVpbnQzMihOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAvIDIgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFVpbnQ2NHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBVaW50NjR4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLlVpbnQ2NHgwMSIpOworICBVaW50NjR4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLlVpbnQ2NHgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFVaW50NjQoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgLyAyICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQ4eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDh4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkludDh4MDEiKTsKKyAgSW50OHgwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50OHgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFJbnQ4KE4pOwogICAgIGlmICh4ICE9IE4gKiAxNyArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50MTZ4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50MTZ4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkludDE2eDAxIik7CisgIEludDE2eDAxKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQxNngwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFJbnQxNihOKTsKICAgICBpZiAoeCAhPSBOICogMTcgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDMyeDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDMyeDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQzMngwMSIpOworICBJbnQzMngwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50MzJ4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxSW50MzIoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgLyAyICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQzMngwMiBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQzMngwMigpIDogc3VwZXIoIkZmaUNhbGwuSW50MzJ4MDIiKTsKKyAgSW50MzJ4MDIoKSA6IHN1cGVyKCdGZmlDYWxsLkludDMyeDAyJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMkludDMyKE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogMiAvIDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDMyeDA0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDMyeDA0KCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQzMngwNCIpOworICBJbnQzMngwNCgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50MzJ4MDQnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGw0SW50MzIoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgKiA0IC8gMikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50MzJ4MTAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50MzJ4MTAoKSA6IHN1cGVyKCJGZmlDYWxsLkludDMyeDEwIik7CisgIEludDMyeDEwKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQzMngxMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDEwSW50MzIoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgKiAxMCAvIDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDMyeDIwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDMyeDIwKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQzMngyMCIpOworICBJbnQzMngyMCgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50MzJ4MjAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwyMEludDMyKE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogMjAgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQ2NHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ2NHgwMSgpIDogc3VwZXIoIkZmaUNhbGwuSW50NjR4MDEiKTsKKyAgSW50NjR4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkludDY0eDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMUludDY0KE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpIC8gMiArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50NjR4MDIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50NjR4MDIoKSA6IHN1cGVyKCJGZmlDYWxsLkludDY0eDAyIik7CisgIEludDY0eDAyKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQ2NHgwMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDJJbnQ2NChOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDIgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQ2NHgwNCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ2NHgwNCgpIDogc3VwZXIoIkZmaUNhbGwuSW50NjR4MDQiKTsKKyAgSW50NjR4MDQoKSA6IHN1cGVyKCdGZmlDYWxsLkludDY0eDA0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsNEludDY0KE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogNCAvIDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDY0eDEwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDY0eDEwKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQ2NHgxMCIpOworICBJbnQ2NHgxMCgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50NjR4MTAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxMEludDY0KE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogMTAgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQ2NHgyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ2NHgyMCgpIDogc3VwZXIoIkZmaUNhbGwuSW50NjR4MjAiKTsKKyAgSW50NjR4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLkludDY0eDIwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMjBJbnQ2NChOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDIwIC8gMikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50NjRNaW50eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDY0TWludHgwMSgpIDogc3VwZXIoIkZmaUNhbGwuSW50NjRNaW50eDAxIik7CisgIEludDY0TWludHgwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50NjRNaW50eDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMUludDY0TWludChOKTsKICAgICBpZiAoeCAhPSAweDdGRkZGRkZGMDAwMDAwMDAgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEZsb2F0eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEZsb2F0eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5GbG9hdHgwMSIpOworICBGbG9hdHgwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuRmxvYXR4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwxRmxvYXQoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIChOIC0gMSkgLyAyICsgTiAqIDQyOwogICAgIGlmICgwLjk5OSAqIGV4cGVjdGVkID4geCAmJiB4ID4gMS4wMDEgKiBleHBlY3RlZCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgRmxvYXR4MDIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRmxvYXR4MDIoKSA6IHN1cGVyKCJGZmlDYWxsLkZsb2F0eDAyIik7CisgIEZsb2F0eDAyKCkgOiBzdXBlcignRmZpQ2FsbC5GbG9hdHgwMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDJGbG9hdChOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogNTUuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEZsb2F0eDA0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEZsb2F0eDA0KCkgOiBzdXBlcigiRmZpQ2FsbC5GbG9hdHgwNCIpOworICBGbG9hdHgwNCgpIDogc3VwZXIoJ0ZmaUNhbGwuRmxvYXR4MDQnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGw0RmxvYXQoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBGbG9hdHgxMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBGbG9hdHgxMCgpIDogc3VwZXIoIkZmaUNhbGwuRmxvYXR4MTAiKTsKKyAgRmxvYXR4MTAoKSA6IHN1cGVyKCdGZmlDYWxsLkZsb2F0eDEwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsMTBGbG9hdChOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogNTUuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEZsb2F0eDIwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEZsb2F0eDIwKCkgOiBzdXBlcigiRmZpQ2FsbC5GbG9hdHgyMCIpOworICBGbG9hdHgyMCgpIDogc3VwZXIoJ0ZmaUNhbGwuRmxvYXR4MjAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwyMEZsb2F0KE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiAyMjAuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIERvdWJsZXgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBEb3VibGV4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkRvdWJsZXgwMSIpOworICBEb3VibGV4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkRvdWJsZXgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDFEb3VibGUoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIChOIC0gMSkgLyAyICsgTiAqIDQyOwogICAgIGlmICgwLjk5OSAqIGV4cGVjdGVkID4geCAmJiB4ID4gMS4wMDEgKiBleHBlY3RlZCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgRG91YmxleDAyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIERvdWJsZXgwMigpIDogc3VwZXIoIkZmaUNhbGwuRG91YmxleDAyIik7CisgIERvdWJsZXgwMigpIDogc3VwZXIoJ0ZmaUNhbGwuRG91YmxleDAyJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsMkRvdWJsZShOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogNTUuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIERvdWJsZXgwNCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBEb3VibGV4MDQoKSA6IHN1cGVyKCJGZmlDYWxsLkRvdWJsZXgwNCIpOworICBEb3VibGV4MDQoKSA6IHN1cGVyKCdGZmlDYWxsLkRvdWJsZXgwNCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDREb3VibGUoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBEb3VibGV4MTAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRG91YmxleDEwKCkgOiBzdXBlcigiRmZpQ2FsbC5Eb3VibGV4MTAiKTsKKyAgRG91YmxleDEwKCkgOiBzdXBlcignRmZpQ2FsbC5Eb3VibGV4MTAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwxMERvdWJsZShOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogNTUuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIERvdWJsZXgyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBEb3VibGV4MjAoKSA6IHN1cGVyKCJGZmlDYWxsLkRvdWJsZXgyMCIpOworICBEb3VibGV4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLkRvdWJsZXgyMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDIwRG91YmxlKE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiAyMjAuMDsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50OHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyVWludDh4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLlBvaW50ZXJVaW50OHgwMSIpOworICBQb2ludGVyVWludDh4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLlBvaW50ZXJVaW50OHgwMScpOwogCi0gIFBvaW50ZXI8VWludDg+IHBvaW50ZXI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIgPSBudWxscHRyOworICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTiArIDEpOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIFBvaW50ZXI8VWludDg+IHggPSBkb0NhbGwxUG9pbnRlclVpbnQ4KE4sIHBvaW50ZXIpOwogICAgIGlmICh4LmFkZHJlc3MgIT0gcG9pbnRlci5hZGRyZXNzICsgTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclVpbnQ4eDAyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXJVaW50OHgwMigpIDogc3VwZXIoIkZmaUNhbGwuUG9pbnRlclVpbnQ4eDAyIik7CisgIFBvaW50ZXJVaW50OHgwMigpIDogc3VwZXIoJ0ZmaUNhbGwuUG9pbnRlclVpbnQ4eDAyJyk7CiAKLSAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciwgcG9pbnRlcjI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyMiA9IG51bGxwdHI7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOICsgMSk7CiAgICAgcG9pbnRlcjIgPSBwb2ludGVyLmVsZW1lbnRBdCgxKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgewogICAgIGZyZWUocG9pbnRlcik7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgUG9pbnRlcjxVaW50OD4geCA9IGRvQ2FsbDJQb2ludGVyVWludDgoTiwgcG9pbnRlciwgcG9pbnRlcjIpOwogICAgIGlmICh4LmFkZHJlc3MgIT0gcG9pbnRlci5hZGRyZXNzICsgTiAqIHNpemVPZjxVaW50OD4oKSkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclVpbnQ4eDA0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXJVaW50OHgwNCgpIDogc3VwZXIoIkZmaUNhbGwuUG9pbnRlclVpbnQ4eDA0Iik7CisgIFBvaW50ZXJVaW50OHgwNCgpIDogc3VwZXIoJ0ZmaUNhbGwuUG9pbnRlclVpbnQ4eDA0Jyk7CiAKLSAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciwgcG9pbnRlcjIsIHBvaW50ZXIzLCBwb2ludGVyNDsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIyID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjMgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyNCA9IG51bGxwdHI7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOICsgMSk7CiAgICAgcG9pbnRlcjIgPSBwb2ludGVyLmVsZW1lbnRBdCgxKTsKQEAgLTEwODcsMzMgKzExMjUsMzYgQEAKICAgICBwb2ludGVyNCA9IHBvaW50ZXIuZWxlbWVudEF0KDMpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSB7CiAgICAgZnJlZShwb2ludGVyKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBQb2ludGVyPFVpbnQ4PiB4ID0KICAgICAgICAgZG9DYWxsNFBvaW50ZXJVaW50OChOLCBwb2ludGVyLCBwb2ludGVyMiwgcG9pbnRlcjMsIHBvaW50ZXI0KTsKICAgICBpZiAoeC5hZGRyZXNzICE9IHBvaW50ZXIuYWRkcmVzcyArIE4gKiBzaXplT2Y8VWludDg+KCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50OHgxMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyVWludDh4MTAoKSA6IHN1cGVyKCJGZmlDYWxsLlBvaW50ZXJVaW50OHgxMCIpOworICBQb2ludGVyVWludDh4MTAoKSA6IHN1cGVyKCdGZmlDYWxsLlBvaW50ZXJVaW50OHgxMCcpOwogCi0gIFBvaW50ZXI8VWludDg+IHBvaW50ZXIsCi0gICAgICBwb2ludGVyMiwKLSAgICAgIHBvaW50ZXIzLAotICAgICAgcG9pbnRlcjQsCi0gICAgICBwb2ludGVyNSwKLSAgICAgIHBvaW50ZXI2LAotICAgICAgcG9pbnRlcjcsCi0gICAgICBwb2ludGVyOCwKLSAgICAgIHBvaW50ZXI5LAotICAgICAgcG9pbnRlcjEwOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjIgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyMyA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXI0ID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjUgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyNiA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXI3ID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjggPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyOSA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxMCA9IG51bGxwdHI7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOICsgMSk7CiAgICAgcG9pbnRlcjIgPSBwb2ludGVyLmVsZW1lbnRBdCgxKTsKQEAgLTExMjcsMTAgKzExNjgsMTIgQEAKICAgICBwb2ludGVyMTAgPSBwb2ludGVyLmVsZW1lbnRBdCg5KTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgewogICAgIGZyZWUocG9pbnRlcik7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgUG9pbnRlcjxVaW50OD4geCA9IGRvQ2FsbDEwUG9pbnRlclVpbnQ4KAogICAgICAgICBOLApAQCAtMTE0NSwzNSArMTE4OCwzNiBAQAogICAgICAgICBwb2ludGVyOSwKICAgICAgICAgcG9pbnRlcjEwKTsKICAgICBpZiAoeC5hZGRyZXNzICE9IHBvaW50ZXIuYWRkcmVzcyArIE4gKiBzaXplT2Y8VWludDg+KCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50OHgyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyVWludDh4MjAoKSA6IHN1cGVyKCJGZmlDYWxsLlBvaW50ZXJVaW50OHgyMCIpOworICBQb2ludGVyVWludDh4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLlBvaW50ZXJVaW50OHgyMCcpOwogCi0gIFBvaW50ZXI8VWludDg+IHBvaW50ZXIsCi0gICAgICBwb2ludGVyMiwKLSAgICAgIHBvaW50ZXIzLAotICAgICAgcG9pbnRlcjQsCi0gICAgICBwb2ludGVyNSwKLSAgICAgIHBvaW50ZXI2LAotICAgICAgcG9pbnRlcjcsCi0gICAgICBwb2ludGVyOCwKLSAgICAgIHBvaW50ZXI5LAotICAgICAgcG9pbnRlcjEwLAotICAgICAgcG9pbnRlcjExLAotICAgICAgcG9pbnRlcjEyLAotICAgICAgcG9pbnRlcjEzLAotICAgICAgcG9pbnRlcjE0LAotICAgICAgcG9pbnRlcjE1LAotICAgICAgcG9pbnRlcjE2LAotICAgICAgcG9pbnRlcjE3LAotICAgICAgcG9pbnRlcjE4LAotICAgICAgcG9pbnRlcjE5LAotICAgICAgcG9pbnRlcjIwOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjIgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyMyA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXI0ID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjUgPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyNiA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXI3ID0gbnVsbHB0cjsKKyAgUG9pbnRlcjxVaW50OD4gcG9pbnRlcjggPSBudWxscHRyOworICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyOSA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxMCA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxMSA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxMiA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxMyA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxNCA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxNSA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxNiA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxNyA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxOCA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIxOSA9IG51bGxwdHI7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIyMCA9IG51bGxwdHI7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOICsgMSk7CiAgICAgcG9pbnRlcjIgPSBwb2ludGVyLmVsZW1lbnRBdCgxKTsKQEAgLTExOTcsMTAgKzEyNDEsMTIgQEAKICAgICBwb2ludGVyMjAgPSBwb2ludGVyLmVsZW1lbnRBdCgxOSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpIHsKICAgICBmcmVlKHBvaW50ZXIpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIFBvaW50ZXI8VWludDg+IHggPSBkb0NhbGwyMFBvaW50ZXJVaW50OCgKICAgICAgICAgTiwKQEAgLTEyMjUsNyArMTI3MSw3IEBACiAgICAgICAgIHBvaW50ZXIxOSwKICAgICAgICAgcG9pbnRlcjIwKTsKICAgICBpZiAoeC5hZGRyZXNzICE9IHBvaW50ZXIuYWRkcmVzcyArIE4gKiBzaXplT2Y8VWludDg+KCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CkBAIC0xMjM2LDM1ICsxMjgyLDM4IEBACiB9CiAKIGNsYXNzIEhhbmRsZXgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBIYW5kbGV4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkhhbmRsZXgwMSIpOworICBIYW5kbGV4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkhhbmRsZXgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBwMSA9IE15Q2xhc3MoMTIzKTsKICAgICBmaW5hbCB4ID0gZG9DYWxsMUhhbmRsZShOLCBwMSk7CiAKICAgICBpZiAoIWlkZW50aWNhbChwMSwgeCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEhhbmRsZXgwMiBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBIYW5kbGV4MDIoKSA6IHN1cGVyKCJGZmlDYWxsLkhhbmRsZXgwMiIpOworICBIYW5kbGV4MDIoKSA6IHN1cGVyKCdGZmlDYWxsLkhhbmRsZXgwMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBwMSA9IE15Q2xhc3MoMTIzKTsKICAgICBmaW5hbCBwMiA9IE15Q2xhc3MoMik7CiAgICAgZmluYWwgeCA9IGRvQ2FsbDJIYW5kbGUoTiwgcDEsIHAyKTsKIAogICAgIGlmICghaWRlbnRpY2FsKHAxLCB4KSkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSGFuZGxleDA0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEhhbmRsZXgwNCgpIDogc3VwZXIoIkZmaUNhbGwuSGFuZGxleDA0Iik7CisgIEhhbmRsZXgwNCgpIDogc3VwZXIoJ0ZmaUNhbGwuSGFuZGxleDA0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIHAxID0gTXlDbGFzcygxMjMpOwogICAgIGZpbmFsIHAyID0gTXlDbGFzcygyKTsKQEAgLTEyNzMsMTQgKzEzMjIsMTUgQEAKICAgICBmaW5hbCB4ID0gZG9DYWxsNEhhbmRsZShOLCBwMSwgcDIsIHAzLCBwNCk7CiAKICAgICBpZiAoIWlkZW50aWNhbChwMSwgeCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEhhbmRsZXgxMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBIYW5kbGV4MTAoKSA6IHN1cGVyKCJGZmlDYWxsLkhhbmRsZXgxMCIpOworICBIYW5kbGV4MTAoKSA6IHN1cGVyKCdGZmlDYWxsLkhhbmRsZXgxMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBwMSA9IE15Q2xhc3MoMTIzKTsKICAgICBmaW5hbCBwMiA9IE15Q2xhc3MoMik7CkBAIC0xMjk1LDE0ICsxMzQ1LDE1IEBACiAgICAgZmluYWwgeCA9IGRvQ2FsbDEwSGFuZGxlKE4sIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDksIHAxMCk7CiAKICAgICBpZiAoIWlkZW50aWNhbChwMSwgeCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEhhbmRsZXgyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBIYW5kbGV4MjAoKSA6IHN1cGVyKCJGZmlDYWxsLkhhbmRsZXgyMCIpOworICBIYW5kbGV4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLkhhbmRsZXgyMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBwMSA9IE15Q2xhc3MoMTIzKTsKICAgICBmaW5hbCBwMiA9IE15Q2xhc3MoMik7CkBAIC0xMzI4LDcgKzEzNzksNyBAQAogICAgICAgICBwMTIsIHAxMywgcDE0LCBwMTUsIHAxNiwgcDE3LCBwMTgsIHAxOSwgcDIwKTsKIAogICAgIGlmICghaWRlbnRpY2FsKHAxLCB4KSkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KQEAgLTEzMzcsNyArMTM4OCw3IEBACiAvLyBNYWluIGRyaXZlci4KIC8vCiAKLW1haW4oKSB7Cit2b2lkIG1haW4oKSB7CiAgIGZpbmFsIGJlbmNobWFya3MgPSBbCiAgICAgKCkgPT4gVWludDh4MDEoKSwKICAgICAoKSA9PiBVaW50MTZ4MDEoKSwKQEAgLTEzNzcsNSArMTQyOCw3IEBACiAgICAgKCkgPT4gSGFuZGxleDEwKCksCiAgICAgKCkgPT4gSGFuZGxleDIwKCksCiAgIF07Ci0gIGJlbmNobWFya3MuZm9yRWFjaCgoYmVuY2htYXJrKSA9PiBiZW5jaG1hcmsoKS5yZXBvcnQoKSk7CisgIGZvciAoZmluYWwgYmVuY2htYXJrIGluIGJlbmNobWFya3MpIHsKKyAgICBiZW5jaG1hcmsoKS5yZXBvcnQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9GZmlDYWxsL2RhcnQvZGxvcGVuX2hlbHBlci5kYXJ0IGIvYmVuY2htYXJrcy9GZmlDYWxsL2RhcnQvZGxvcGVuX2hlbHBlci5kYXJ0CmluZGV4IGIwMzEwMDIuLmZlODA4NzkgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpQ2FsbC9kYXJ0L2Rsb3Blbl9oZWxwZXIuZGFydAorKysgYi9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydC9kbG9wZW5faGVscGVyLmRhcnQKQEAgLTUsNTQgKzUsNTcgQEAKIGltcG9ydCAnZGFydDpmZmknOwogaW1wb3J0ICdkYXJ0OmlvJzsKIAotY29uc3Qga0FybSA9ICJhcm0iOwotY29uc3Qga0FybTY0ID0gImFybTY0IjsKLWNvbnN0IGtJYTMyID0gImlhMzIiOwotY29uc3Qga1g2NCA9ICJ4NjQiOworY29uc3QgYXJtID0gJ2FybSc7Citjb25zdCBhcm02NCA9ICdhcm02NCc7Citjb25zdCBpYTMyID0gJ2lhMzInOworY29uc3QgeDY0ID0gJ3g2NCc7CiAKIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ1MTI1NTE2L3Bvc3NpYmxlLXZhbHVlcy1mb3ItdW5hbWUtbQogZmluYWwgX3VuYW1lcyA9IHsKLSAgImFybSI6IGtBcm0sCi0gICJhYXJjaDY0X2JlIjoga0FybTY0LAotICAiYWFyY2g2NCI6IGtBcm02NCwKLSAgImFybXY4YiI6IGtBcm02NCwKLSAgImFybXY4bCI6IGtBcm02NCwKLSAgImkzODYiOiBrSWEzMiwKLSAgImk2ODYiOiBrSWEzMiwKLSAgIng4Nl82NCI6IGtYNjQsCisgICdhcm0nOiBhcm0sCisgICdhYXJjaDY0X2JlJzogYXJtNjQsCisgICdhYXJjaDY0JzogYXJtNjQsCisgICdhcm12OGInOiBhcm02NCwKKyAgJ2FybXY4bCc6IGFybTY0LAorICAnaTM4Nic6IGlhMzIsCisgICdpNjg2JzogaWEzMiwKKyAgJ3g4Nl82NCc6IHg2NCwKIH07CiAKIFN0cmluZyBfY2hlY2tSdW5uaW5nTW9kZShTdHJpbmcgYXJjaGl0ZWN0dXJlKSB7CiAgIC8vIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gMzJiaXQgbW9kZS4KICAgZmluYWwgaW50IHBvaW50ZXJTaXplID0gc2l6ZU9mPEludFB0cj4oKTsKLSAgaWYgKHBvaW50ZXJTaXplID09IDQgJiYgYXJjaGl0ZWN0dXJlID09IGtYNjQpIHJldHVybiBrSWEzMjsKLSAgaWYgKHBvaW50ZXJTaXplID09IDQgJiYgYXJjaGl0ZWN0dXJlID09IGtBcm02NCkgcmV0dXJuIGtBcm07CisgIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSB4NjQpIHJldHVybiBpYTMyOworICBpZiAocG9pbnRlclNpemUgPT0gNCAmJiBhcmNoaXRlY3R1cmUgPT0gYXJtNjQpIHJldHVybiBhcm07CiAKICAgcmV0dXJuIGFyY2hpdGVjdHVyZTsKIH0KIAogU3RyaW5nIF9hcmNoaXRlY3R1cmUoKSB7Ci0gIGZpbmFsIFN0cmluZyB1bmFtZSA9IFByb2Nlc3MucnVuU3luYygidW5hbWUiLCBbIi1tIl0pLnN0ZG91dC50cmltKCk7Ci0gIGZpbmFsIFN0cmluZyBhcmNoaXRlY3R1cmUgPSBfdW5hbWVzW3VuYW1lXTsKLSAgaWYgKGFyY2hpdGVjdHVyZSA9PSBudWxsKQotICAgIHRocm93IEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZTogJyR1bmFtZSciKTsKKyAgZmluYWwgU3RyaW5nIHVuYW1lID0gUHJvY2Vzcy5ydW5TeW5jKCd1bmFtZScsIFsnLW0nXSkuc3Rkb3V0LnRyaW0oKTsKKyAgZmluYWwgU3RyaW5nPyBhcmNoaXRlY3R1cmUgPSBfdW5hbWVzW3VuYW1lXTsKKyAgaWYgKGFyY2hpdGVjdHVyZSA9PSBudWxsKSB7CisgICAgdGhyb3cgRXhjZXB0aW9uKCdVbnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlOiAiJHVuYW1lIicpOworICB9CiAKICAgLy8gQ2hlY2sgaWYgd2UncmUgcnVubmluZyBpbiAzMmJpdCBtb2RlLgogICByZXR1cm4gX2NoZWNrUnVubmluZ01vZGUoYXJjaGl0ZWN0dXJlKTsKIH0KIAotU3RyaW5nIF9wbGF0Zm9ybVBhdGgoU3RyaW5nIG5hbWUsIHtTdHJpbmcgcGF0aCA9ICIifSkgewotICBpZiAoUGxhdGZvcm0uaXNNYWNPUyB8fCBQbGF0Zm9ybS5pc0lPUykKLSAgICByZXR1cm4gIiR7cGF0aH1tYWMvJHtfYXJjaGl0ZWN0dXJlKCl9L2xpYiRuYW1lLmR5bGliIjsKK1N0cmluZyBfcGxhdGZvcm1QYXRoKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCkgeworICBpZiAoUGxhdGZvcm0uaXNNYWNPUyB8fCBQbGF0Zm9ybS5pc0lPUykgeworICAgIHJldHVybiAnJHtwYXRofW1hYy8ke19hcmNoaXRlY3R1cmUoKX0vbGliJG5hbWUuZHlsaWInOworICB9CiAKLSAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykKLSAgICByZXR1cm4gIiR7cGF0aH13aW4vJHtfY2hlY2tSdW5uaW5nTW9kZShrWDY0KX0vJG5hbWUuZGxsIjsKKyAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgeworICAgIHJldHVybiAnJHtwYXRofXdpbi8ke19jaGVja1J1bm5pbmdNb2RlKHg2NCl9LyRuYW1lLmRsbCc7CisgIH0KIAogICAvLyBVbmtub3duIHBsYXRmb3JtcyBkZWZhdWx0IHRvIFVuaXggaW1wbGVtZW50YXRpb24uCi0gIHJldHVybiAiJHtwYXRofWxpbnV4LyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5zbyI7CisgIHJldHVybiAnJHtwYXRofWxpbnV4LyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5zbyc7CiB9CiAKLUR5bmFtaWNMaWJyYXJ5IGRsb3BlblBsYXRmb3JtU3BlY2lmaWMoU3RyaW5nIG5hbWUsIHtTdHJpbmcgcGF0aH0pIHsKLSAgZmluYWwgU3RyaW5nIGZ1bGxQYXRoID0gX3BsYXRmb3JtUGF0aChuYW1lLCBwYXRoOiBwYXRoKTsKK0R5bmFtaWNMaWJyYXJ5IGRsb3BlblBsYXRmb3JtU3BlY2lmaWMoU3RyaW5nIG5hbWUsIHtTdHJpbmcgcGF0aCA9ICcnfSkgeworICBmaW5hbCBTdHJpbmcgZnVsbFBhdGggPSBfcGxhdGZvcm1QYXRoKG5hbWUsIHBhdGgpOwogICByZXR1cm4gRHluYW1pY0xpYnJhcnkub3BlbihmdWxsUGF0aCk7CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydDIvRmZpQ2FsbC5kYXJ0IGIvYmVuY2htYXJrcy9GZmlDYWxsL2RhcnQyL0ZmaUNhbGwuZGFydAppbmRleCBlNmFmZDQwLi4xYzM0YmM5IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydDIvRmZpQ2FsbC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpQ2FsbC9kYXJ0Mi9GZmlDYWxsLmRhcnQKQEAgLTE5LDU0ICsxOSw1NCBAQAogLy8gVHJhbXBvbGluZSBmdW5jdGlvbnMuCiAvLwogCi1EeW5hbWljTGlicmFyeSBmZmlUZXN0RnVuY3Rpb25zID0gZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygibmF0aXZlX2Z1bmN0aW9ucyIsCi0gICAgcGF0aDogUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoIi4uL25hdGl2ZS9vdXQvIikucGF0aCk7CitEeW5hbWljTGlicmFyeSBmZmlUZXN0RnVuY3Rpb25zID0gZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygnbmF0aXZlX2Z1bmN0aW9ucycsCisgICAgcGF0aDogUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoJy4uL25hdGl2ZS9vdXQvJykucGF0aCk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xVWludDggPSBVaW50OCBGdW5jdGlvbihVaW50OCk7CiB0eXBlZGVmIEZ1bmN0aW9uMWludCA9IGludCBGdW5jdGlvbihpbnQpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMVVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50OCwgRnVuY3Rpb24xaW50PigiRnVuY3Rpb24xVWludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uMVVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50OCwgRnVuY3Rpb24xaW50PignRnVuY3Rpb24xVWludDgnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFVaW50MTYgPSBVaW50MTYgRnVuY3Rpb24oVWludDE2KTsKLUZ1bmN0aW9uMWludCBmdW5jdGlvbjFVaW50MTYgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQxNiwgRnVuY3Rpb24xaW50PigiRnVuY3Rpb24xVWludDE2Iik7CitmaW5hbCBmdW5jdGlvbjFVaW50MTYgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMVVpbnQxNiwgRnVuY3Rpb24xaW50PignRnVuY3Rpb24xVWludDE2Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xVWludDMyID0gVWludDMyIEZ1bmN0aW9uKFVpbnQzMik7Ci1GdW5jdGlvbjFpbnQgZnVuY3Rpb24xVWludDMyID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50MzIsIEZ1bmN0aW9uMWludD4oIkZ1bmN0aW9uMVVpbnQzMiIpOworZmluYWwgZnVuY3Rpb24xVWludDMyID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFVaW50MzIsIEZ1bmN0aW9uMWludD4oJ0Z1bmN0aW9uMVVpbnQzMicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMVVpbnQ2NCA9IFVpbnQ2NCBGdW5jdGlvbihVaW50NjQpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMVVpbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xVWludDY0LCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFVaW50NjQiKTsKK2ZpbmFsIGZ1bmN0aW9uMVVpbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xVWludDY0LCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFVaW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFJbnQ4ID0gSW50OCBGdW5jdGlvbihJbnQ4KTsKLUZ1bmN0aW9uMWludCBmdW5jdGlvbjFJbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQ4LCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFJbnQ4Iik7CitmaW5hbCBmdW5jdGlvbjFJbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQ4LCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFJbnQ4Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xSW50MTYgPSBJbnQxNiBGdW5jdGlvbihJbnQxNik7Ci1GdW5jdGlvbjFpbnQgZnVuY3Rpb24xSW50MTYgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDE2LCBGdW5jdGlvbjFpbnQ+KCJGdW5jdGlvbjFJbnQxNiIpOworZmluYWwgZnVuY3Rpb24xSW50MTYgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUludDE2LCBGdW5jdGlvbjFpbnQ+KCdGdW5jdGlvbjFJbnQxNicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMUludDMyID0gSW50MzIgRnVuY3Rpb24oSW50MzIpOwotRnVuY3Rpb24xaW50IGZ1bmN0aW9uMUludDMyID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQzMiwgRnVuY3Rpb24xaW50PigiRnVuY3Rpb24xSW50MzIiKTsKK2ZpbmFsIGZ1bmN0aW9uMUludDMyID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjFJbnQzMiwgRnVuY3Rpb24xaW50PignRnVuY3Rpb24xSW50MzInKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjJJbnQzMiA9IEludDMyIEZ1bmN0aW9uKEludDMyLCBJbnQzMik7CiB0eXBlZGVmIEZ1bmN0aW9uMmludCA9IGludCBGdW5jdGlvbihpbnQsIGludCk7Ci1GdW5jdGlvbjJpbnQgZnVuY3Rpb24ySW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkludDMyLCBGdW5jdGlvbjJpbnQ+KCJGdW5jdGlvbjJJbnQzMiIpOworZmluYWwgZnVuY3Rpb24ySW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkludDMyLCBGdW5jdGlvbjJpbnQ+KCdGdW5jdGlvbjJJbnQzMicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uNEludDMyID0gSW50MzIgRnVuY3Rpb24oSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIpOwogdHlwZWRlZiBGdW5jdGlvbjRpbnQgPSBpbnQgRnVuY3Rpb24oaW50LCBpbnQsIGludCwgaW50KTsKLUZ1bmN0aW9uNGludCBmdW5jdGlvbjRJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb240SW50MzIsIEZ1bmN0aW9uNGludD4oIkZ1bmN0aW9uNEludDMyIik7CitmaW5hbCBmdW5jdGlvbjRJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb240SW50MzIsIEZ1bmN0aW9uNGludD4oJ0Z1bmN0aW9uNEludDMyJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xMEludDMyID0gSW50MzIgRnVuY3Rpb24oCiAgICAgSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIsIEludDMyLCBJbnQzMiwgSW50MzIpOwogdHlwZWRlZiBGdW5jdGlvbjEwaW50ID0gaW50IEZ1bmN0aW9uKAogICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7Ci1GdW5jdGlvbjEwaW50IGZ1bmN0aW9uMTBJbnQzMiA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xMEludDMyLCBGdW5jdGlvbjEwaW50PigiRnVuY3Rpb24xMEludDMyIik7CitmaW5hbCBmdW5jdGlvbjEwSW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBJbnQzMiwgRnVuY3Rpb24xMGludD4oJ0Z1bmN0aW9uMTBJbnQzMicpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMjBJbnQzMiA9IEludDMyIEZ1bmN0aW9uKAogICAgIEludDMyLApAQCAtOTEsMjUgKzkxLDI1IEBACiAgICAgSW50MzIpOwogdHlwZWRlZiBGdW5jdGlvbjIwaW50ID0gaW50IEZ1bmN0aW9uKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAogICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOwotRnVuY3Rpb24yMGludCBmdW5jdGlvbjIwSW50MzIgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBJbnQzMiwgRnVuY3Rpb24yMGludD4oIkZ1bmN0aW9uMjBJbnQzMiIpOworZmluYWwgZnVuY3Rpb24yMEludDMyID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjIwSW50MzIsIEZ1bmN0aW9uMjBpbnQ+KCdGdW5jdGlvbjIwSW50MzInKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFJbnQ2NCA9IEludDY0IEZ1bmN0aW9uKEludDY0KTsKLUZ1bmN0aW9uMWludCBmdW5jdGlvbjFJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xSW50NjQsIEZ1bmN0aW9uMWludD4oIkZ1bmN0aW9uMUludDY0Iik7CitmaW5hbCBmdW5jdGlvbjFJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24xSW50NjQsIEZ1bmN0aW9uMWludD4oJ0Z1bmN0aW9uMUludDY0Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24ySW50NjQgPSBJbnQ2NCBGdW5jdGlvbihJbnQ2NCwgSW50NjQpOwotRnVuY3Rpb24yaW50IGZ1bmN0aW9uMkludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjJJbnQ2NCwgRnVuY3Rpb24yaW50PigiRnVuY3Rpb24ySW50NjQiKTsKK2ZpbmFsIGZ1bmN0aW9uMkludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjJJbnQ2NCwgRnVuY3Rpb24yaW50PignRnVuY3Rpb24ySW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjRJbnQ2NCA9IEludDY0IEZ1bmN0aW9uKEludDY0LCBJbnQ2NCwgSW50NjQsIEludDY0KTsKLUZ1bmN0aW9uNGludCBmdW5jdGlvbjRJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb240SW50NjQsIEZ1bmN0aW9uNGludD4oIkZ1bmN0aW9uNEludDY0Iik7CitmaW5hbCBmdW5jdGlvbjRJbnQ2NCA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb240SW50NjQsIEZ1bmN0aW9uNGludD4oJ0Z1bmN0aW9uNEludDY0Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24xMEludDY0ID0gSW50NjQgRnVuY3Rpb24oCiAgICAgSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQsIEludDY0LCBJbnQ2NCwgSW50NjQpOwotRnVuY3Rpb24xMGludCBmdW5jdGlvbjEwSW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBJbnQ2NCwgRnVuY3Rpb24xMGludD4oIkZ1bmN0aW9uMTBJbnQ2NCIpOworZmluYWwgZnVuY3Rpb24xMEludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjEwSW50NjQsIEZ1bmN0aW9uMTBpbnQ+KCdGdW5jdGlvbjEwSW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjIwSW50NjQgPSBJbnQ2NCBGdW5jdGlvbigKICAgICBJbnQ2NCwKQEAgLTEzMiwzMCArMTMyLDMwIEBACiAgICAgSW50NjQsCiAgICAgSW50NjQsCiAgICAgSW50NjQpOwotRnVuY3Rpb24yMGludCBmdW5jdGlvbjIwSW50NjQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBJbnQ2NCwgRnVuY3Rpb24yMGludD4oIkZ1bmN0aW9uMjBJbnQ2NCIpOworZmluYWwgZnVuY3Rpb24yMEludDY0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjIwSW50NjQsIEZ1bmN0aW9uMjBpbnQ+KCdGdW5jdGlvbjIwSW50NjQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFGbG9hdCA9IEZsb2F0IEZ1bmN0aW9uKEZsb2F0KTsKIHR5cGVkZWYgRnVuY3Rpb24xZG91YmxlID0gZG91YmxlIEZ1bmN0aW9uKGRvdWJsZSk7Ci1GdW5jdGlvbjFkb3VibGUgZnVuY3Rpb24xRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUZsb2F0LCBGdW5jdGlvbjFkb3VibGU+KCJGdW5jdGlvbjFGbG9hdCIpOworZmluYWwgZnVuY3Rpb24xRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMUZsb2F0LCBGdW5jdGlvbjFkb3VibGU+KCdGdW5jdGlvbjFGbG9hdCcpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMkZsb2F0ID0gRmxvYXQgRnVuY3Rpb24oRmxvYXQsIEZsb2F0KTsKIHR5cGVkZWYgRnVuY3Rpb24yZG91YmxlID0gZG91YmxlIEZ1bmN0aW9uKGRvdWJsZSwgZG91YmxlKTsKLUZ1bmN0aW9uMmRvdWJsZSBmdW5jdGlvbjJGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKLSAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yRmxvYXQsIEZ1bmN0aW9uMmRvdWJsZT4oIkZ1bmN0aW9uMkZsb2F0Iik7CitmaW5hbCBmdW5jdGlvbjJGbG9hdCA9IGZmaVRlc3RGdW5jdGlvbnMKKyAgICAubG9va3VwRnVuY3Rpb248TmF0aXZlRnVuY3Rpb24yRmxvYXQsIEZ1bmN0aW9uMmRvdWJsZT4oJ0Z1bmN0aW9uMkZsb2F0Jyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb240RmxvYXQgPSBGbG9hdCBGdW5jdGlvbihGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCk7CiB0eXBlZGVmIEZ1bmN0aW9uNGRvdWJsZSA9IGRvdWJsZSBGdW5jdGlvbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpOwotRnVuY3Rpb240ZG91YmxlIGZ1bmN0aW9uNEZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRGbG9hdCwgRnVuY3Rpb240ZG91YmxlPigiRnVuY3Rpb240RmxvYXQiKTsKK2ZpbmFsIGZ1bmN0aW9uNEZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjRGbG9hdCwgRnVuY3Rpb240ZG91YmxlPignRnVuY3Rpb240RmxvYXQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjEwRmxvYXQgPSBGbG9hdCBGdW5jdGlvbigKICAgICBGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCwgRmxvYXQsIEZsb2F0LCBGbG9hdCk7CiB0eXBlZGVmIEZ1bmN0aW9uMTBkb3VibGUgPSBkb3VibGUgRnVuY3Rpb24oZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLAogICAgIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpOwotRnVuY3Rpb24xMGRvdWJsZSBmdW5jdGlvbjEwRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBGbG9hdCwgRnVuY3Rpb24xMGRvdWJsZT4oIkZ1bmN0aW9uMTBGbG9hdCIpOworZmluYWwgZnVuY3Rpb24xMEZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjEwRmxvYXQsIEZ1bmN0aW9uMTBkb3VibGU+KCdGdW5jdGlvbjEwRmxvYXQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjIwRmxvYXQgPSBGbG9hdCBGdW5jdGlvbigKICAgICBGbG9hdCwKQEAgLTE5OSwyNiArMTk5LDI2IEBACiAgICAgZG91YmxlLAogICAgIGRvdWJsZSwKICAgICBkb3VibGUpOwotRnVuY3Rpb24yMGRvdWJsZSBmdW5jdGlvbjIwRmxvYXQgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBGbG9hdCwgRnVuY3Rpb24yMGRvdWJsZT4oIkZ1bmN0aW9uMjBGbG9hdCIpOworZmluYWwgZnVuY3Rpb24yMEZsb2F0ID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjIwRmxvYXQsIEZ1bmN0aW9uMjBkb3VibGU+KCdGdW5jdGlvbjIwRmxvYXQnKTsKIAogdHlwZWRlZiBOYXRpdmVGdW5jdGlvbjFEb3VibGUgPSBEb3VibGUgRnVuY3Rpb24oRG91YmxlKTsKLUZ1bmN0aW9uMWRvdWJsZSBmdW5jdGlvbjFEb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMURvdWJsZSwgRnVuY3Rpb24xZG91YmxlPigiRnVuY3Rpb24xRG91YmxlIik7CitmaW5hbCBmdW5jdGlvbjFEb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMURvdWJsZSwgRnVuY3Rpb24xZG91YmxlPignRnVuY3Rpb24xRG91YmxlJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb24yRG91YmxlID0gRG91YmxlIEZ1bmN0aW9uKERvdWJsZSwgRG91YmxlKTsKLUZ1bmN0aW9uMmRvdWJsZSBmdW5jdGlvbjJEb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCi0gICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkRvdWJsZSwgRnVuY3Rpb24yZG91YmxlPigiRnVuY3Rpb24xRG91YmxlIik7CitmaW5hbCBmdW5jdGlvbjJEb3VibGUgPSBmZmlUZXN0RnVuY3Rpb25zCisgICAgLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMkRvdWJsZSwgRnVuY3Rpb24yZG91YmxlPignRnVuY3Rpb24xRG91YmxlJyk7CiAKIHR5cGVkZWYgTmF0aXZlRnVuY3Rpb240RG91YmxlID0gRG91YmxlIEZ1bmN0aW9uKERvdWJsZSwgRG91YmxlLCBEb3VibGUsIERvdWJsZSk7Ci1GdW5jdGlvbjRkb3VibGUgZnVuY3Rpb240RG91YmxlID0gZmZpVGVzdEZ1bmN0aW9ucwotICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjREb3VibGUsIEZ1bmN0aW9uNGRvdWJsZT4oIkZ1bmN0aW9uMURvdWJsZSIpOworZmluYWwgZnVuY3Rpb240RG91YmxlID0gZmZpVGVzdEZ1bmN0aW9ucworICAgIC5sb29rdXBGdW5jdGlvbjxOYXRpdmVGdW5jdGlvbjREb3VibGUsIEZ1bmN0aW9uNGRvdWJsZT4oJ0Z1bmN0aW9uMURvdWJsZScpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMTBEb3VibGUgPSBEb3VibGUgRnVuY3Rpb24oRG91YmxlLCBEb3VibGUsIERvdWJsZSwgRG91YmxlLAogICAgIERvdWJsZSwgRG91YmxlLCBEb3VibGUsIERvdWJsZSwgRG91YmxlLCBEb3VibGUpOwogRnVuY3Rpb24xMGRvdWJsZSBmdW5jdGlvbjEwRG91YmxlID0KICAgICBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMTBEb3VibGUsIEZ1bmN0aW9uMTBkb3VibGU+KAotICAgICAgICAiRnVuY3Rpb24xMERvdWJsZSIpOworICAgICAgICAnRnVuY3Rpb24xMERvdWJsZScpOwogCiB0eXBlZGVmIE5hdGl2ZUZ1bmN0aW9uMjBEb3VibGUgPSBEb3VibGUgRnVuY3Rpb24oCiAgICAgRG91YmxlLApAQCAtMjQzLDIxICsyNDMsMjEgQEAKICAgICBEb3VibGUpOwogRnVuY3Rpb24yMGRvdWJsZSBmdW5jdGlvbjIwRG91YmxlID0KICAgICBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPE5hdGl2ZUZ1bmN0aW9uMjBEb3VibGUsIEZ1bmN0aW9uMjBkb3VibGU+KAotICAgICAgICAiRnVuY3Rpb24yMERvdWJsZSIpOworICAgICAgICAnRnVuY3Rpb24yMERvdWJsZScpOwogCiB0eXBlZGVmIEZ1bmN0aW9uMVBvaW50ZXJVaW50OCA9IFBvaW50ZXI8VWludDg+IEZ1bmN0aW9uKFBvaW50ZXI8VWludDg+KTsKLUZ1bmN0aW9uMVBvaW50ZXJVaW50OCBmdW5jdGlvbjFQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAotICAgIEZ1bmN0aW9uMVBvaW50ZXJVaW50OCwgRnVuY3Rpb24xUG9pbnRlclVpbnQ4PigiRnVuY3Rpb24xUG9pbnRlclVpbnQ4Iik7CitmaW5hbCBmdW5jdGlvbjFQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAorICAgIEZ1bmN0aW9uMVBvaW50ZXJVaW50OCwgRnVuY3Rpb24xUG9pbnRlclVpbnQ4PignRnVuY3Rpb24xUG9pbnRlclVpbnQ4Jyk7CiAKIHR5cGVkZWYgRnVuY3Rpb24yUG9pbnRlclVpbnQ4ID0gUG9pbnRlcjxVaW50OD4gRnVuY3Rpb24oCiAgICAgUG9pbnRlcjxVaW50OD4sIFBvaW50ZXI8VWludDg+KTsKLUZ1bmN0aW9uMlBvaW50ZXJVaW50OCBmdW5jdGlvbjJQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAotICAgIEZ1bmN0aW9uMlBvaW50ZXJVaW50OCwgRnVuY3Rpb24yUG9pbnRlclVpbnQ4PigiRnVuY3Rpb24yUG9pbnRlclVpbnQ4Iik7CitmaW5hbCBmdW5jdGlvbjJQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAorICAgIEZ1bmN0aW9uMlBvaW50ZXJVaW50OCwgRnVuY3Rpb24yUG9pbnRlclVpbnQ4PignRnVuY3Rpb24yUG9pbnRlclVpbnQ4Jyk7CiAKIHR5cGVkZWYgRnVuY3Rpb240UG9pbnRlclVpbnQ4ID0gUG9pbnRlcjxVaW50OD4gRnVuY3Rpb24oCiAgICAgUG9pbnRlcjxVaW50OD4sIFBvaW50ZXI8VWludDg+LCBQb2ludGVyPFVpbnQ4PiwgUG9pbnRlcjxVaW50OD4pOwotRnVuY3Rpb240UG9pbnRlclVpbnQ4IGZ1bmN0aW9uNFBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248Ci0gICAgRnVuY3Rpb240UG9pbnRlclVpbnQ4LCBGdW5jdGlvbjRQb2ludGVyVWludDg+KCJGdW5jdGlvbjRQb2ludGVyVWludDgiKTsKK2ZpbmFsIGZ1bmN0aW9uNFBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CisgICAgRnVuY3Rpb240UG9pbnRlclVpbnQ4LCBGdW5jdGlvbjRQb2ludGVyVWludDg+KCdGdW5jdGlvbjRQb2ludGVyVWludDgnKTsKIAogdHlwZWRlZiBGdW5jdGlvbjEwUG9pbnRlclVpbnQ4ID0gUG9pbnRlcjxVaW50OD4gRnVuY3Rpb24oCiAgICAgUG9pbnRlcjxVaW50OD4sCkBAIC0yNzAsOCArMjcwLDggQEAKICAgICBQb2ludGVyPFVpbnQ4PiwKICAgICBQb2ludGVyPFVpbnQ4PiwKICAgICBQb2ludGVyPFVpbnQ4Pik7Ci1GdW5jdGlvbjEwUG9pbnRlclVpbnQ4IGZ1bmN0aW9uMTBQb2ludGVyVWludDggPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAotICAgIEZ1bmN0aW9uMTBQb2ludGVyVWludDgsIEZ1bmN0aW9uMTBQb2ludGVyVWludDg+KCJGdW5jdGlvbjEwUG9pbnRlclVpbnQ4Iik7CitmaW5hbCBmdW5jdGlvbjEwUG9pbnRlclVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKKyAgICBGdW5jdGlvbjEwUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjEwUG9pbnRlclVpbnQ4PignRnVuY3Rpb24xMFBvaW50ZXJVaW50OCcpOwogCiB0eXBlZGVmIEZ1bmN0aW9uMjBQb2ludGVyVWludDggPSBQb2ludGVyPFVpbnQ4PiBGdW5jdGlvbigKICAgICBQb2ludGVyPFVpbnQ4PiwKQEAgLTI5NCwyNSArMjk0LDI1IEBACiAgICAgUG9pbnRlcjxVaW50OD4sCiAgICAgUG9pbnRlcjxVaW50OD4sCiAgICAgUG9pbnRlcjxVaW50OD4pOwotRnVuY3Rpb24yMFBvaW50ZXJVaW50OCBmdW5jdGlvbjIwUG9pbnRlclVpbnQ4ID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKLSAgICBGdW5jdGlvbjIwUG9pbnRlclVpbnQ4LCBGdW5jdGlvbjIwUG9pbnRlclVpbnQ4PigiRnVuY3Rpb24yMFBvaW50ZXJVaW50OCIpOworZmluYWwgZnVuY3Rpb24yMFBvaW50ZXJVaW50OCA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CisgICAgRnVuY3Rpb24yMFBvaW50ZXJVaW50OCwgRnVuY3Rpb24yMFBvaW50ZXJVaW50OD4oJ0Z1bmN0aW9uMjBQb2ludGVyVWludDgnKTsKIAogZmluYWwgZnVuY3Rpb24xaGFuZGxlID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjxIYW5kbGUgRnVuY3Rpb24oSGFuZGxlKSwKLSAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0KT4oIkZ1bmN0aW9uMUhhbmRsZSIpOworICAgIE9iamVjdCBGdW5jdGlvbihPYmplY3QpPignRnVuY3Rpb24xSGFuZGxlJyk7CiAKIGZpbmFsIGZ1bmN0aW9uMmhhbmRsZSA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CiAgICAgSGFuZGxlIEZ1bmN0aW9uKEhhbmRsZSwgSGFuZGxlKSwKLSAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0LCBPYmplY3QpPigiRnVuY3Rpb24ySGFuZGxlIik7CisgICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCwgT2JqZWN0KT4oJ0Z1bmN0aW9uMkhhbmRsZScpOwogCiBmaW5hbCBmdW5jdGlvbjRoYW5kbGUgPSBmZmlUZXN0RnVuY3Rpb25zLmxvb2t1cEZ1bmN0aW9uPAogICAgIEhhbmRsZSBGdW5jdGlvbihIYW5kbGUsIEhhbmRsZSwgSGFuZGxlLCBIYW5kbGUpLAotICAgIE9iamVjdCBGdW5jdGlvbihPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpPigiRnVuY3Rpb240SGFuZGxlIik7CisgICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCk+KCdGdW5jdGlvbjRIYW5kbGUnKTsKIAogZmluYWwgZnVuY3Rpb24xMGhhbmRsZSA9IGZmaVRlc3RGdW5jdGlvbnMubG9va3VwRnVuY3Rpb248CiAgICAgSGFuZGxlIEZ1bmN0aW9uKEhhbmRsZSwgSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSwgSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSwKICAgICAgICAgSGFuZGxlLCBIYW5kbGUsIEhhbmRsZSksCiAgICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwKLSAgICAgICAgT2JqZWN0LCBPYmplY3QsIE9iamVjdCk+KCJGdW5jdGlvbjEwSGFuZGxlIik7CisgICAgICAgIE9iamVjdCwgT2JqZWN0LCBPYmplY3QpPignRnVuY3Rpb24xMEhhbmRsZScpOwogCiBmaW5hbCBmdW5jdGlvbjIwaGFuZGxlID0gZmZpVGVzdEZ1bmN0aW9ucy5sb29rdXBGdW5jdGlvbjwKICAgICBIYW5kbGUgRnVuY3Rpb24oCkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICAgICAgT2JqZWN0LAogICAgICAgICBPYmplY3QsCiAgICAgICAgIE9iamVjdCwKLSAgICAgICAgT2JqZWN0KT4oIkZ1bmN0aW9uMjBIYW5kbGUiKTsKKyAgICAgICAgT2JqZWN0KT4oJ0Z1bmN0aW9uMjBIYW5kbGUnKTsKIAogLy8KIC8vIFRyYW1wb2xpbmUgY2FsbC4KQEAgLTczMiwzNTQgKzczMiwzODggQEAKIGNvbnN0IE4gPSAxMDAwOwogCiBjbGFzcyBVaW50OHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBVaW50OHgwMSgpIDogc3VwZXIoIkZmaUNhbGwuVWludDh4MDEiKTsKKyAgVWludDh4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLlVpbnQ4eDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMVVpbnQ4KE4pOwogICAgIGlmICh4ICE9IE4gKiAxNyArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgVWludDE2eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFVpbnQxNngwMSgpIDogc3VwZXIoIkZmaUNhbGwuVWludDE2eDAxIik7CisgIFVpbnQxNngwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuVWludDE2eDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMVVpbnQxNihOKTsKICAgICBpZiAoeCAhPSBOICogMTcgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFVpbnQzMngwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBVaW50MzJ4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLlVpbnQzMngwMSIpOworICBVaW50MzJ4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLlVpbnQzMngwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFVaW50MzIoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgLyAyICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBVaW50NjR4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgVWludDY0eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5VaW50NjR4MDEiKTsKKyAgVWludDY0eDAxKCkgOiBzdXBlcignRmZpQ2FsbC5VaW50NjR4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxVWludDY0KE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpIC8gMiArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50OHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ4eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQ4eDAxIik7CisgIEludDh4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkludDh4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxSW50OChOKTsKICAgICBpZiAoeCAhPSBOICogMTcgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDE2eDAxIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDE2eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQxNngwMSIpOworICBJbnQxNngwMSgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50MTZ4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxSW50MTYoTik7CiAgICAgaWYgKHggIT0gTiAqIDE3ICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQzMngwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQzMngwMSgpIDogc3VwZXIoIkZmaUNhbGwuSW50MzJ4MDEiKTsKKyAgSW50MzJ4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkludDMyeDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMUludDMyKE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpIC8gMiArIE4gKiA0MikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50MzJ4MDIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50MzJ4MDIoKSA6IHN1cGVyKCJGZmlDYWxsLkludDMyeDAyIik7CisgIEludDMyeDAyKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQzMngwMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDJJbnQzMihOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDIgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQzMngwNCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQzMngwNCgpIDogc3VwZXIoIkZmaUNhbGwuSW50MzJ4MDQiKTsKKyAgSW50MzJ4MDQoKSA6IHN1cGVyKCdGZmlDYWxsLkludDMyeDA0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsNEludDMyKE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogNCAvIDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDMyeDEwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDMyeDEwKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQzMngxMCIpOworICBJbnQzMngxMCgpIDogc3VwZXIoJ0ZmaUNhbGwuSW50MzJ4MTAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwxMEludDMyKE4pOwogICAgIGlmICh4ICE9IE4gKiAoTiAtIDEpICogMTAgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQzMngyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQzMngyMCgpIDogc3VwZXIoIkZmaUNhbGwuSW50MzJ4MjAiKTsKKyAgSW50MzJ4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLkludDMyeDIwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMjBJbnQzMihOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDIwIC8gMikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50NjR4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50NjR4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkludDY0eDAxIik7CisgIEludDY0eDAxKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQ2NHgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFJbnQ2NChOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAvIDIgKyBOICogNDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDY0eDAyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEludDY0eDAyKCkgOiBzdXBlcigiRmZpQ2FsbC5JbnQ2NHgwMiIpOworICBJbnQ2NHgwMigpIDogc3VwZXIoJ0ZmaUNhbGwuSW50NjR4MDInKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgaW50IHggPSBkb0NhbGwySW50NjQoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgKiAyIC8gMikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50NjR4MDQgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50NjR4MDQoKSA6IHN1cGVyKCJGZmlDYWxsLkludDY0eDA0Iik7CisgIEludDY0eDA0KCkgOiBzdXBlcignRmZpQ2FsbC5JbnQ2NHgwNCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDRJbnQ2NChOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDQgLyAyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBJbnQ2NHgxMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ2NHgxMCgpIDogc3VwZXIoIkZmaUNhbGwuSW50NjR4MTAiKTsKKyAgSW50NjR4MTAoKSA6IHN1cGVyKCdGZmlDYWxsLkludDY0eDEwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGludCB4ID0gZG9DYWxsMTBJbnQ2NChOKTsKICAgICBpZiAoeCAhPSBOICogKE4gLSAxKSAqIDEwIC8gMikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgSW50NjR4MjAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSW50NjR4MjAoKSA6IHN1cGVyKCJGZmlDYWxsLkludDY0eDIwIik7CisgIEludDY0eDIwKCkgOiBzdXBlcignRmZpQ2FsbC5JbnQ2NHgyMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDIwSW50NjQoTik7CiAgICAgaWYgKHggIT0gTiAqIChOIC0gMSkgKiAyMCAvIDIpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEludDY0TWludHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBJbnQ2NE1pbnR4MDEoKSA6IHN1cGVyKCJGZmlDYWxsLkludDY0TWludHgwMSIpOworICBJbnQ2NE1pbnR4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkludDY0TWludHgwMScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBpbnQgeCA9IGRvQ2FsbDFJbnQ2NE1pbnQoTik7CiAgICAgaWYgKHggIT0gMHg3RkZGRkZGRjAwMDAwMDAwICsgTiAqIDQyKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBGbG9hdHgwMSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBGbG9hdHgwMSgpIDogc3VwZXIoIkZmaUNhbGwuRmxvYXR4MDEiKTsKKyAgRmxvYXR4MDEoKSA6IHN1cGVyKCdGZmlDYWxsLkZsb2F0eDAxJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsMUZsb2F0KE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiAoTiAtIDEpIC8gMiArIE4gKiA0MjsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEZsb2F0eDAyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIEZsb2F0eDAyKCkgOiBzdXBlcigiRmZpQ2FsbC5GbG9hdHgwMiIpOworICBGbG9hdHgwMigpIDogc3VwZXIoJ0ZmaUNhbGwuRmxvYXR4MDInKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwyRmxvYXQoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBGbG9hdHgwNCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBGbG9hdHgwNCgpIDogc3VwZXIoIkZmaUNhbGwuRmxvYXR4MDQiKTsKKyAgRmxvYXR4MDQoKSA6IHN1cGVyKCdGZmlDYWxsLkZsb2F0eDA0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsNEZsb2F0KE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiA1NS4wOwogICAgIGlmICgwLjk5OSAqIGV4cGVjdGVkID4geCAmJiB4ID4gMS4wMDEgKiBleHBlY3RlZCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgRmxvYXR4MTAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRmxvYXR4MTAoKSA6IHN1cGVyKCJGZmlDYWxsLkZsb2F0eDEwIik7CisgIEZsb2F0eDEwKCkgOiBzdXBlcignRmZpQ2FsbC5GbG9hdHgxMCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDEwRmxvYXQoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBGbG9hdHgyMCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBGbG9hdHgyMCgpIDogc3VwZXIoIkZmaUNhbGwuRmxvYXR4MjAiKTsKKyAgRmxvYXR4MjAoKSA6IHN1cGVyKCdGZmlDYWxsLkZsb2F0eDIwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsMjBGbG9hdChOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogMjIwLjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBEb3VibGV4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRG91YmxleDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5Eb3VibGV4MDEiKTsKKyAgRG91YmxleDAxKCkgOiBzdXBlcignRmZpQ2FsbC5Eb3VibGV4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwxRG91YmxlKE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiAoTiAtIDEpIC8gMiArIE4gKiA0MjsKICAgICBpZiAoMC45OTkgKiBleHBlY3RlZCA+IHggJiYgeCA+IDEuMDAxICogZXhwZWN0ZWQpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIERvdWJsZXgwMiBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBEb3VibGV4MDIoKSA6IHN1cGVyKCJGZmlDYWxsLkRvdWJsZXgwMiIpOworICBEb3VibGV4MDIoKSA6IHN1cGVyKCdGZmlDYWxsLkRvdWJsZXgwMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvQ2FsbDJEb3VibGUoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBEb3VibGV4MDQgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRG91YmxleDA0KCkgOiBzdXBlcigiRmZpQ2FsbC5Eb3VibGV4MDQiKTsKKyAgRG91YmxleDA0KCkgOiBzdXBlcignRmZpQ2FsbC5Eb3VibGV4MDQnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGw0RG91YmxlKE4pOwogICAgIGZpbmFsIGRvdWJsZSBleHBlY3RlZCA9IE4gKiA1NS4wOwogICAgIGlmICgwLjk5OSAqIGV4cGVjdGVkID4geCAmJiB4ID4gMS4wMDEgKiBleHBlY3RlZCkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgRG91YmxleDEwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIERvdWJsZXgxMCgpIDogc3VwZXIoIkZmaUNhbGwuRG91YmxleDEwIik7CisgIERvdWJsZXgxMCgpIDogc3VwZXIoJ0ZmaUNhbGwuRG91YmxleDEwJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9DYWxsMTBEb3VibGUoTik7CiAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkID0gTiAqIDU1LjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBEb3VibGV4MjAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgRG91YmxleDIwKCkgOiBzdXBlcigiRmZpQ2FsbC5Eb3VibGV4MjAiKTsKKyAgRG91YmxleDIwKCkgOiBzdXBlcignRmZpQ2FsbC5Eb3VibGV4MjAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0NhbGwyMERvdWJsZShOKTsKICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWQgPSBOICogMjIwLjA7CiAgICAgaWYgKDAuOTk5ICogZXhwZWN0ZWQgPiB4ICYmIHggPiAxLjAwMSAqIGV4cGVjdGVkKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyVWludDh4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlclVpbnQ4eDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5Qb2ludGVyVWludDh4MDEiKTsKKyAgUG9pbnRlclVpbnQ4eDAxKCkgOiBzdXBlcignRmZpQ2FsbC5Qb2ludGVyVWludDh4MDEnKTsKIAogICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyOworICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTiArIDEpOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIFBvaW50ZXI8VWludDg+IHggPSBkb0NhbGwxUG9pbnRlclVpbnQ4KE4sIHBvaW50ZXIpOwogICAgIGlmICh4LmFkZHJlc3MgIT0gcG9pbnRlci5hZGRyZXNzICsgTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclVpbnQ4eDAyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXJVaW50OHgwMigpIDogc3VwZXIoIkZmaUNhbGwuUG9pbnRlclVpbnQ4eDAyIik7CisgIFBvaW50ZXJVaW50OHgwMigpIDogc3VwZXIoJ0ZmaUNhbGwuUG9pbnRlclVpbnQ4eDAyJyk7CiAKICAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciwgcG9pbnRlcjI7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOICsgMSk7CiAgICAgcG9pbnRlcjIgPSBwb2ludGVyLmVsZW1lbnRBdCgxKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgewogICAgIGZyZWUocG9pbnRlcik7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgUG9pbnRlcjxVaW50OD4geCA9IGRvQ2FsbDJQb2ludGVyVWludDgoTiwgcG9pbnRlciwgcG9pbnRlcjIpOwogICAgIGlmICh4LmFkZHJlc3MgIT0gcG9pbnRlci5hZGRyZXNzICsgTiAqIHNpemVPZjxVaW50OD4oKSkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclVpbnQ4eDA0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXJVaW50OHgwNCgpIDogc3VwZXIoIkZmaUNhbGwuUG9pbnRlclVpbnQ4eDA0Iik7CisgIFBvaW50ZXJVaW50OHgwNCgpIDogc3VwZXIoJ0ZmaUNhbGwuUG9pbnRlclVpbnQ4eDA0Jyk7CiAKICAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciwgcG9pbnRlcjIsIHBvaW50ZXIzLCBwb2ludGVyNDsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpIHsKICAgICBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4gKyAxKTsKICAgICBwb2ludGVyMiA9IHBvaW50ZXIuZWxlbWVudEF0KDEpOwpAQCAtMTA4NywyMSArMTEyMSwyMyBAQAogICAgIHBvaW50ZXI0ID0gcG9pbnRlci5lbGVtZW50QXQoMyk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpIHsKICAgICBmcmVlKHBvaW50ZXIpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIFBvaW50ZXI8VWludDg+IHggPQogICAgICAgICBkb0NhbGw0UG9pbnRlclVpbnQ4KE4sIHBvaW50ZXIsIHBvaW50ZXIyLCBwb2ludGVyMywgcG9pbnRlcjQpOwogICAgIGlmICh4LmFkZHJlc3MgIT0gcG9pbnRlci5hZGRyZXNzICsgTiAqIHNpemVPZjxVaW50OD4oKSkgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclVpbnQ4eDEwIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXJVaW50OHgxMCgpIDogc3VwZXIoIkZmaUNhbGwuUG9pbnRlclVpbnQ4eDEwIik7CisgIFBvaW50ZXJVaW50OHgxMCgpIDogc3VwZXIoJ0ZmaUNhbGwuUG9pbnRlclVpbnQ4eDEwJyk7CiAKICAgUG9pbnRlcjxVaW50OD4gcG9pbnRlciwKICAgICAgIHBvaW50ZXIyLApAQCAtMTExNCw2ICsxMTUwLDcgQEAKICAgICAgIHBvaW50ZXI5LAogICAgICAgcG9pbnRlcjEwOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgewogICAgIHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTiArIDEpOwogICAgIHBvaW50ZXIyID0gcG9pbnRlci5lbGVtZW50QXQoMSk7CkBAIC0xMTI3LDEwICsxMTY0LDEyIEBACiAgICAgcG9pbnRlcjEwID0gcG9pbnRlci5lbGVtZW50QXQoOSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpIHsKICAgICBmcmVlKHBvaW50ZXIpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGZpbmFsIFBvaW50ZXI8VWludDg+IHggPSBkb0NhbGwxMFBvaW50ZXJVaW50OCgKICAgICAgICAgTiwKQEAgLTExNDUsMTMgKzExODQsMTMgQEAKICAgICAgICAgcG9pbnRlcjksCiAgICAgICAgIHBvaW50ZXIxMCk7CiAgICAgaWYgKHguYWRkcmVzcyAhPSBwb2ludGVyLmFkZHJlc3MgKyBOICogc2l6ZU9mPFVpbnQ4PigpKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyVWludDh4MjAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlclVpbnQ4eDIwKCkgOiBzdXBlcigiRmZpQ2FsbC5Qb2ludGVyVWludDh4MjAiKTsKKyAgUG9pbnRlclVpbnQ4eDIwKCkgOiBzdXBlcignRmZpQ2FsbC5Qb2ludGVyVWludDh4MjAnKTsKIAogICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyLAogICAgICAgcG9pbnRlcjIsCkBAIC0xMTc0LDYgKzEyMTMsNyBAQAogICAgICAgcG9pbnRlcjE5LAogICAgICAgcG9pbnRlcjIwOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgewogICAgIHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTiArIDEpOwogICAgIHBvaW50ZXIyID0gcG9pbnRlci5lbGVtZW50QXQoMSk7CkBAIC0xMTk3LDEwICsxMjM3LDEyIEBACiAgICAgcG9pbnRlcjIwID0gcG9pbnRlci5lbGVtZW50QXQoMTkpOwogICB9CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSB7CiAgICAgZnJlZShwb2ludGVyKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBQb2ludGVyPFVpbnQ4PiB4ID0gZG9DYWxsMjBQb2ludGVyVWludDgoCiAgICAgICAgIE4sCkBAIC0xMjI1LDcgKzEyNjcsNyBAQAogICAgICAgICBwb2ludGVyMTksCiAgICAgICAgIHBvaW50ZXIyMCk7CiAgICAgaWYgKHguYWRkcmVzcyAhPSBwb2ludGVyLmFkZHJlc3MgKyBOICogc2l6ZU9mPFVpbnQ4PigpKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQpAQCAtMTIzNiwzNSArMTI3OCwzOCBAQAogfQogCiBjbGFzcyBIYW5kbGV4MDEgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSGFuZGxleDAxKCkgOiBzdXBlcigiRmZpQ2FsbC5IYW5kbGV4MDEiKTsKKyAgSGFuZGxleDAxKCkgOiBzdXBlcignRmZpQ2FsbC5IYW5kbGV4MDEnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgcDEgPSBNeUNsYXNzKDEyMyk7CiAgICAgZmluYWwgeCA9IGRvQ2FsbDFIYW5kbGUoTiwgcDEpOwogCiAgICAgaWYgKCFpZGVudGljYWwocDEsIHgpKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBIYW5kbGV4MDIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSGFuZGxleDAyKCkgOiBzdXBlcigiRmZpQ2FsbC5IYW5kbGV4MDIiKTsKKyAgSGFuZGxleDAyKCkgOiBzdXBlcignRmZpQ2FsbC5IYW5kbGV4MDInKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgcDEgPSBNeUNsYXNzKDEyMyk7CiAgICAgZmluYWwgcDIgPSBNeUNsYXNzKDIpOwogICAgIGZpbmFsIHggPSBkb0NhbGwySGFuZGxlKE4sIHAxLCBwMik7CiAKICAgICBpZiAoIWlkZW50aWNhbChwMSwgeCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIEhhbmRsZXgwNCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBIYW5kbGV4MDQoKSA6IHN1cGVyKCJGZmlDYWxsLkhhbmRsZXgwNCIpOworICBIYW5kbGV4MDQoKSA6IHN1cGVyKCdGZmlDYWxsLkhhbmRsZXgwNCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBmaW5hbCBwMSA9IE15Q2xhc3MoMTIzKTsKICAgICBmaW5hbCBwMiA9IE15Q2xhc3MoMik7CkBAIC0xMjczLDE0ICsxMzE4LDE1IEBACiAgICAgZmluYWwgeCA9IGRvQ2FsbDRIYW5kbGUoTiwgcDEsIHAyLCBwMywgcDQpOwogCiAgICAgaWYgKCFpZGVudGljYWwocDEsIHgpKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBIYW5kbGV4MTAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSGFuZGxleDEwKCkgOiBzdXBlcigiRmZpQ2FsbC5IYW5kbGV4MTAiKTsKKyAgSGFuZGxleDEwKCkgOiBzdXBlcignRmZpQ2FsbC5IYW5kbGV4MTAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgcDEgPSBNeUNsYXNzKDEyMyk7CiAgICAgZmluYWwgcDIgPSBNeUNsYXNzKDIpOwpAQCAtMTI5NSwxNCArMTM0MSwxNSBAQAogICAgIGZpbmFsIHggPSBkb0NhbGwxMEhhbmRsZShOLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBwMTApOwogCiAgICAgaWYgKCFpZGVudGljYWwocDEsIHgpKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBIYW5kbGV4MjAgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgSGFuZGxleDIwKCkgOiBzdXBlcigiRmZpQ2FsbC5IYW5kbGV4MjAiKTsKKyAgSGFuZGxleDIwKCkgOiBzdXBlcignRmZpQ2FsbC5IYW5kbGV4MjAnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZmluYWwgcDEgPSBNeUNsYXNzKDEyMyk7CiAgICAgZmluYWwgcDIgPSBNeUNsYXNzKDIpOwpAQCAtMTMyOCw3ICsxMzc1LDcgQEAKICAgICAgICAgcDEyLCBwMTMsIHAxNCwgcDE1LCBwMTYsIHAxNywgcDE4LCBwMTksIHAyMCk7CiAKICAgICBpZiAoIWlkZW50aWNhbChwMSwgeCkpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CkBAIC0xMzM3LDcgKzEzODQsNyBAQAogLy8gTWFpbiBkcml2ZXIuCiAvLwogCi1tYWluKCkgewordm9pZCBtYWluKCkgewogICBmaW5hbCBiZW5jaG1hcmtzID0gWwogICAgICgpID0+IFVpbnQ4eDAxKCksCiAgICAgKCkgPT4gVWludDE2eDAxKCksCkBAIC0xMzc3LDUgKzE0MjQsNyBAQAogICAgICgpID0+IEhhbmRsZXgxMCgpLAogICAgICgpID0+IEhhbmRsZXgyMCgpLAogICBdOwotICBiZW5jaG1hcmtzLmZvckVhY2goKGJlbmNobWFyaykgPT4gYmVuY2htYXJrKCkucmVwb3J0KCkpOworICBmb3IgKGZpbmFsIGJlbmNobWFyayBpbiBiZW5jaG1hcmtzKSB7CisgICAgYmVuY2htYXJrKCkucmVwb3J0KCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvRmZpQ2FsbC9kYXJ0Mi9kbG9wZW5faGVscGVyLmRhcnQgYi9iZW5jaG1hcmtzL0ZmaUNhbGwvZGFydDIvZGxvcGVuX2hlbHBlci5kYXJ0CmluZGV4IGIwMzEwMDIuLjcyNmMxODEgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpQ2FsbC9kYXJ0Mi9kbG9wZW5faGVscGVyLmRhcnQKKysrIGIvYmVuY2htYXJrcy9GZmlDYWxsL2RhcnQyL2Rsb3Blbl9oZWxwZXIuZGFydApAQCAtNSw1MSArNSw1NCBAQAogaW1wb3J0ICdkYXJ0OmZmaSc7CiBpbXBvcnQgJ2RhcnQ6aW8nOwogCi1jb25zdCBrQXJtID0gImFybSI7Ci1jb25zdCBrQXJtNjQgPSAiYXJtNjQiOwotY29uc3Qga0lhMzIgPSAiaWEzMiI7Ci1jb25zdCBrWDY0ID0gIng2NCI7Citjb25zdCBhcm0gPSAnYXJtJzsKK2NvbnN0IGFybTY0ID0gJ2FybTY0JzsKK2NvbnN0IGlhMzIgPSAnaWEzMic7Citjb25zdCB4NjQgPSAneDY0JzsKIAogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDUxMjU1MTYvcG9zc2libGUtdmFsdWVzLWZvci11bmFtZS1tCiBmaW5hbCBfdW5hbWVzID0gewotICAiYXJtIjoga0FybSwKLSAgImFhcmNoNjRfYmUiOiBrQXJtNjQsCi0gICJhYXJjaDY0Ijoga0FybTY0LAotICAiYXJtdjhiIjoga0FybTY0LAotICAiYXJtdjhsIjoga0FybTY0LAotICAiaTM4NiI6IGtJYTMyLAotICAiaTY4NiI6IGtJYTMyLAotICAieDg2XzY0Ijoga1g2NCwKKyAgJ2FybSc6IGFybSwKKyAgJ2FhcmNoNjRfYmUnOiBhcm02NCwKKyAgJ2FhcmNoNjQnOiBhcm02NCwKKyAgJ2FybXY4Yic6IGFybTY0LAorICAnYXJtdjhsJzogYXJtNjQsCisgICdpMzg2JzogaWEzMiwKKyAgJ2k2ODYnOiBpYTMyLAorICAneDg2XzY0JzogeDY0LAogfTsKIAogU3RyaW5nIF9jaGVja1J1bm5pbmdNb2RlKFN0cmluZyBhcmNoaXRlY3R1cmUpIHsKICAgLy8gQ2hlY2sgaWYgd2UncmUgcnVubmluZyBpbiAzMmJpdCBtb2RlLgogICBmaW5hbCBpbnQgcG9pbnRlclNpemUgPSBzaXplT2Y8SW50UHRyPigpOwotICBpZiAocG9pbnRlclNpemUgPT0gNCAmJiBhcmNoaXRlY3R1cmUgPT0ga1g2NCkgcmV0dXJuIGtJYTMyOwotICBpZiAocG9pbnRlclNpemUgPT0gNCAmJiBhcmNoaXRlY3R1cmUgPT0ga0FybTY0KSByZXR1cm4ga0FybTsKKyAgaWYgKHBvaW50ZXJTaXplID09IDQgJiYgYXJjaGl0ZWN0dXJlID09IHg2NCkgcmV0dXJuIGlhMzI7CisgIGlmIChwb2ludGVyU2l6ZSA9PSA0ICYmIGFyY2hpdGVjdHVyZSA9PSBhcm02NCkgcmV0dXJuIGFybTsKIAogICByZXR1cm4gYXJjaGl0ZWN0dXJlOwogfQogCiBTdHJpbmcgX2FyY2hpdGVjdHVyZSgpIHsKLSAgZmluYWwgU3RyaW5nIHVuYW1lID0gUHJvY2Vzcy5ydW5TeW5jKCJ1bmFtZSIsIFsiLW0iXSkuc3Rkb3V0LnRyaW0oKTsKKyAgZmluYWwgU3RyaW5nIHVuYW1lID0gUHJvY2Vzcy5ydW5TeW5jKCd1bmFtZScsIFsnLW0nXSkuc3Rkb3V0LnRyaW0oKTsKICAgZmluYWwgU3RyaW5nIGFyY2hpdGVjdHVyZSA9IF91bmFtZXNbdW5hbWVdOwotICBpZiAoYXJjaGl0ZWN0dXJlID09IG51bGwpCi0gICAgdGhyb3cgRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlOiAnJHVuYW1lJyIpOworICBpZiAoYXJjaGl0ZWN0dXJlID09IG51bGwpIHsKKyAgICB0aHJvdyBFeGNlcHRpb24oJ1VucmVjb2duaXplZCBhcmNoaXRlY3R1cmU6ICIkdW5hbWUiJyk7CisgIH0KIAogICAvLyBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIGluIDMyYml0IG1vZGUuCiAgIHJldHVybiBfY2hlY2tSdW5uaW5nTW9kZShhcmNoaXRlY3R1cmUpOwogfQogCi1TdHJpbmcgX3BsYXRmb3JtUGF0aChTdHJpbmcgbmFtZSwge1N0cmluZyBwYXRoID0gIiJ9KSB7Ci0gIGlmIChQbGF0Zm9ybS5pc01hY09TIHx8IFBsYXRmb3JtLmlzSU9TKQotICAgIHJldHVybiAiJHtwYXRofW1hYy8ke19hcmNoaXRlY3R1cmUoKX0vbGliJG5hbWUuZHlsaWIiOworU3RyaW5nIF9wbGF0Zm9ybVBhdGgoU3RyaW5nIG5hbWUsIHtTdHJpbmcgcGF0aCA9ICcnfSkgeworICBpZiAoUGxhdGZvcm0uaXNNYWNPUyB8fCBQbGF0Zm9ybS5pc0lPUykgeworICAgIHJldHVybiAnJHtwYXRofW1hYy8ke19hcmNoaXRlY3R1cmUoKX0vbGliJG5hbWUuZHlsaWInOworICB9CiAKLSAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykKLSAgICByZXR1cm4gIiR7cGF0aH13aW4vJHtfY2hlY2tSdW5uaW5nTW9kZShrWDY0KX0vJG5hbWUuZGxsIjsKKyAgaWYgKFBsYXRmb3JtLmlzV2luZG93cykgeworICAgIHJldHVybiAnJHtwYXRofXdpbi8ke19jaGVja1J1bm5pbmdNb2RlKHg2NCl9LyRuYW1lLmRsbCc7CisgIH0KIAogICAvLyBVbmtub3duIHBsYXRmb3JtcyBkZWZhdWx0IHRvIFVuaXggaW1wbGVtZW50YXRpb24uCi0gIHJldHVybiAiJHtwYXRofWxpbnV4LyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5zbyI7CisgIHJldHVybiAnJHtwYXRofWxpbnV4LyR7X2FyY2hpdGVjdHVyZSgpfS9saWIkbmFtZS5zbyc7CiB9CiAKIER5bmFtaWNMaWJyYXJ5IGRsb3BlblBsYXRmb3JtU3BlY2lmaWMoU3RyaW5nIG5hbWUsIHtTdHJpbmcgcGF0aH0pIHsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvRmZpTWVtb3J5L2RhcnQvRmZpTWVtb3J5LmRhcnQgYi9iZW5jaG1hcmtzL0ZmaU1lbW9yeS9kYXJ0L0ZmaU1lbW9yeS5kYXJ0CmluZGV4IDUwZjg0MzUuLmQ5ZWU0ODcgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpTWVtb3J5L2RhcnQvRmZpTWVtb3J5LmRhcnQKKysrIGIvYmVuY2htYXJrcy9GZmlNZW1vcnkvZGFydC9GZmlNZW1vcnkuZGFydApAQCAtMjA2LDIwMiArMjA2LDIzOCBAQAogY29uc3QgTiA9IDEwMDA7CiAKIGNsYXNzIFBvaW50ZXJJbnQ4IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXI8SW50OD4gcG9pbnRlcjsKLSAgUG9pbnRlckludDgoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckludDgiKTsKKyAgUG9pbnRlcjxJbnQ4PiBwb2ludGVyID0gbnVsbHB0cjsKKyAgUG9pbnRlckludDgoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDgnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTik7CisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgPT4gZnJlZShwb2ludGVyKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZG9TdG9yZUludDgocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRJbnQ4KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50OCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyOwotICBQb2ludGVyVWludDgoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlclVpbnQ4Iik7CisgIFBvaW50ZXI8VWludDg+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVyVWludDgoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlclVpbnQ4Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVVaW50OChwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZFVpbnQ4KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJJbnQxNiBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPEludDE2PiBwb2ludGVyOwotICBQb2ludGVySW50MTYoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckludDE2Iik7CisgIFBvaW50ZXI8SW50MTY+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVySW50MTYoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDE2Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVJbnQxNihwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZEludDE2KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50MTYgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlcjxVaW50MTY+IHBvaW50ZXI7Ci0gIFBvaW50ZXJVaW50MTYoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlclVpbnQxNiIpOworICBQb2ludGVyPFVpbnQxNj4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXJVaW50MTYoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlclVpbnQxNicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlVWludDE2KHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkVWludDE2KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJJbnQzMiBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPEludDMyPiBwb2ludGVyOwotICBQb2ludGVySW50MzIoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckludDMyIik7CisgIFBvaW50ZXI8SW50MzI+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVySW50MzIoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDMyJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVJbnQzMihwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZEludDMyKHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50MzIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlcjxVaW50MzI+IHBvaW50ZXI7Ci0gIFBvaW50ZXJVaW50MzIoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlclVpbnQzMiIpOworICBQb2ludGVyPFVpbnQzMj4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXJVaW50MzIoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlclVpbnQzMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlVWludDMyKHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkVWludDMyKHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJJbnQ2NCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPEludDY0PiBwb2ludGVyOwotICBQb2ludGVySW50NjQoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckludDY0Iik7CisgIFBvaW50ZXI8SW50NjQ+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVySW50NjQoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDY0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVJbnQ2NChwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZEludDY0KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50NjQgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlcjxVaW50NjQ+IHBvaW50ZXI7Ci0gIFBvaW50ZXJVaW50NjQoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlclVpbnQ2NCIpOworICBQb2ludGVyPFVpbnQ2ND4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXJVaW50NjQoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlclVpbnQ2NCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlVWludDY0KHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkVWludDY0KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJGbG9hdCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPEZsb2F0PiBwb2ludGVyOwotICBQb2ludGVyRmxvYXQoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckZsb2F0Iik7CisgIFBvaW50ZXI8RmxvYXQ+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVyRmxvYXQoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckZsb2F0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVGbG9hdChwb2ludGVyLCBOKTsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvTG9hZEZsb2F0KHBvaW50ZXIsIE4pOwogICAgIGlmICgwLjk5ICogTiA+IHggfHwgeCA+IDEuMDEgKiBOKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyRG91YmxlIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXI8RG91YmxlPiBwb2ludGVyOwotICBQb2ludGVyRG91YmxlKCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJEb3VibGUiKTsKKyAgUG9pbnRlcjxEb3VibGU+IHBvaW50ZXIgPSBudWxscHRyOworICBQb2ludGVyRG91YmxlKCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJEb3VibGUnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTik7CisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgPT4gZnJlZShwb2ludGVyKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZG9TdG9yZURvdWJsZShwb2ludGVyLCBOKTsKICAgICBmaW5hbCBkb3VibGUgeCA9IGRvTG9hZERvdWJsZShwb2ludGVyLCBOKTsKICAgICBpZiAoMC45OSAqIE4gPiB4IHx8IHggPiAxLjAxICogTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlclBvaW50ZXIgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKLSAgUG9pbnRlcjxQb2ludGVyPEludDg+PiBwb2ludGVyOwotICBQb2ludGVyPEludDg+IGRhdGE7Ci0gIFBvaW50ZXJQb2ludGVyKCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJQb2ludGVyIik7CisgIFBvaW50ZXI8UG9pbnRlcjxJbnQ4Pj4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXI8SW50OD4gZGF0YSA9IG51bGxwdHI7CisgIFBvaW50ZXJQb2ludGVyKCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJQb2ludGVyJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7CiAgICAgcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKICAgICBkYXRhID0gYWxsb2NhdGUoKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgewogICAgIGZyZWUocG9pbnRlcik7CiAgICAgZnJlZShkYXRhKTsKICAgfQogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlUG9pbnRlcihwb2ludGVyLCBOLCBkYXRhKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZFBvaW50ZXIocG9pbnRlciwgTik7CiAgICAgaWYgKHggIT0gMCB8fCB4ID09IGRhdGEuYWRkcmVzcykgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckludDY0TWludCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewotICBQb2ludGVyPEludDY0PiBwb2ludGVyOwotICBQb2ludGVySW50NjRNaW50KCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJJbnQ2NE1pbnQiKTsKKyAgUG9pbnRlcjxJbnQ2ND4gcG9pbnRlciA9IG51bGxwdHI7CisgIFBvaW50ZXJJbnQ2NE1pbnQoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDY0TWludCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlSW50NjRNaW50KHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkSW50NjRNaW50KHBvaW50ZXIsIE4pOwogICAgIC8vIFVzaW5nIG92ZXJmbG93IHNlbWFudGljcyBpbiBhZ2dyZWdhdGlvbi4KICAgICBpZiAoeCAhPSAtTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KQEAgLTQxMCw3ICs0NDYsNyBAQAogLy8gTWFpbiBkcml2ZXIuCiAvLwogCi1tYWluKCkgewordm9pZCBtYWluKCkgewogICBmaW5hbCBiZW5jaG1hcmtzID0gWwogICAgICgpID0+IFBvaW50ZXJJbnQ4KCksCiAgICAgKCkgPT4gUG9pbnRlclVpbnQ4KCksCkBAIC00MjUsNSArNDYxLDcgQEAKICAgICAoKSA9PiBQb2ludGVyRG91YmxlKCksCiAgICAgKCkgPT4gUG9pbnRlclBvaW50ZXIoKSwKICAgXTsKLSAgYmVuY2htYXJrcy5mb3JFYWNoKChiZW5jaG1hcmspID0+IGJlbmNobWFyaygpLnJlcG9ydCgpKTsKKyAgZm9yIChmaW5hbCBiZW5jaG1hcmsgaW4gYmVuY2htYXJrcykgeworICAgIGJlbmNobWFyaygpLnJlcG9ydCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaU1lbW9yeS9kYXJ0Mi9GZmlNZW1vcnkuZGFydCBiL2JlbmNobWFya3MvRmZpTWVtb3J5L2RhcnQyL0ZmaU1lbW9yeS5kYXJ0CmluZGV4IDUwZjg0MzUuLjE4YTUxMGUgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpTWVtb3J5L2RhcnQyL0ZmaU1lbW9yeS5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpTWVtb3J5L2RhcnQyL0ZmaU1lbW9yeS5kYXJ0CkBAIC0yMDcsMTYwICsyMDcsMTkwIEBACiAKIGNsYXNzIFBvaW50ZXJJbnQ4IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8SW50OD4gcG9pbnRlcjsKLSAgUG9pbnRlckludDgoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlckludDgiKTsKKyAgUG9pbnRlckludDgoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDgnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTik7CisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgPT4gZnJlZShwb2ludGVyKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZG9TdG9yZUludDgocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRJbnQ4KHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJVaW50OCBleHRlbmRzIEJlbmNobWFya0Jhc2UgewogICBQb2ludGVyPFVpbnQ4PiBwb2ludGVyOwotICBQb2ludGVyVWludDgoKSA6IHN1cGVyKCJGZmlNZW1vcnkuUG9pbnRlclVpbnQ4Iik7CisgIFBvaW50ZXJVaW50OCgpIDogc3VwZXIoJ0ZmaU1lbW9yeS5Qb2ludGVyVWludDgnKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBzZXR1cCgpID0+IHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTik7CisgIEBvdmVycmlkZQogICB2b2lkIHRlYXJkb3duKCkgPT4gZnJlZShwb2ludGVyKTsKIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZG9TdG9yZVVpbnQ4KHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkVWludDgocG9pbnRlciwgTik7CiAgICAgaWYgKHggIT0gTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckludDE2IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8SW50MTY+IHBvaW50ZXI7Ci0gIFBvaW50ZXJJbnQxNigpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVySW50MTYiKTsKKyAgUG9pbnRlckludDE2KCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJJbnQxNicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlSW50MTYocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRJbnQxNihwb2ludGVyLCBOKTsKICAgICBpZiAoeCAhPSBOKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyVWludDE2IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8VWludDE2PiBwb2ludGVyOwotICBQb2ludGVyVWludDE2KCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJVaW50MTYiKTsKKyAgUG9pbnRlclVpbnQxNigpIDogc3VwZXIoJ0ZmaU1lbW9yeS5Qb2ludGVyVWludDE2Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVVaW50MTYocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRVaW50MTYocG9pbnRlciwgTik7CiAgICAgaWYgKHggIT0gTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckludDMyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8SW50MzI+IHBvaW50ZXI7Ci0gIFBvaW50ZXJJbnQzMigpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVySW50MzIiKTsKKyAgUG9pbnRlckludDMyKCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJJbnQzMicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlSW50MzIocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRJbnQzMihwb2ludGVyLCBOKTsKICAgICBpZiAoeCAhPSBOKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyVWludDMyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8VWludDMyPiBwb2ludGVyOwotICBQb2ludGVyVWludDMyKCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJVaW50MzIiKTsKKyAgUG9pbnRlclVpbnQzMigpIDogc3VwZXIoJ0ZmaU1lbW9yeS5Qb2ludGVyVWludDMyJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVVaW50MzIocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRVaW50MzIocG9pbnRlciwgTik7CiAgICAgaWYgKHggIT0gTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckludDY0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8SW50NjQ+IHBvaW50ZXI7Ci0gIFBvaW50ZXJJbnQ2NCgpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVySW50NjQiKTsKKyAgUG9pbnRlckludDY0KCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJJbnQ2NCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlSW50NjQocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRJbnQ2NChwb2ludGVyLCBOKTsKICAgICBpZiAoeCAhPSBOKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQogCiBjbGFzcyBQb2ludGVyVWludDY0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8VWludDY0PiBwb2ludGVyOwotICBQb2ludGVyVWludDY0KCkgOiBzdXBlcigiRmZpTWVtb3J5LlBvaW50ZXJVaW50NjQiKTsKKyAgUG9pbnRlclVpbnQ2NCgpIDogc3VwZXIoJ0ZmaU1lbW9yeS5Qb2ludGVyVWludDY0Jyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVVaW50NjQocG9pbnRlciwgTik7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRVaW50NjQocG9pbnRlciwgTik7CiAgICAgaWYgKHggIT0gTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckZsb2F0IGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8RmxvYXQ+IHBvaW50ZXI7Ci0gIFBvaW50ZXJGbG9hdCgpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVyRmxvYXQiKTsKKyAgUG9pbnRlckZsb2F0KCkgOiBzdXBlcignRmZpTWVtb3J5LlBvaW50ZXJGbG9hdCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlRmxvYXQocG9pbnRlciwgTik7CiAgICAgZmluYWwgZG91YmxlIHggPSBkb0xvYWRGbG9hdChwb2ludGVyLCBOKTsKICAgICBpZiAoMC45OSAqIE4gPiB4IHx8IHggPiAxLjAxICogTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KIAogY2xhc3MgUG9pbnRlckRvdWJsZSBleHRlbmRzIEJlbmNobWFya0Jhc2UgewogICBQb2ludGVyPERvdWJsZT4gcG9pbnRlcjsKLSAgUG9pbnRlckRvdWJsZSgpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVyRG91YmxlIik7CisgIFBvaW50ZXJEb3VibGUoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckRvdWJsZScpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlRG91YmxlKHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGRvdWJsZSB4ID0gZG9Mb2FkRG91YmxlKHBvaW50ZXIsIE4pOwogICAgIGlmICgwLjk5ICogTiA+IHggfHwgeCA+IDEuMDEgKiBOKSB7Ci0gICAgICB0aHJvdyBFeGNlcHRpb24oIiRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgiKTsKKyAgICAgIHRocm93IEV4Y2VwdGlvbignJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCcpOwogICAgIH0KICAgfQogfQpAQCAtMzY4LDQwICszOTgsNDYgQEAKIGNsYXNzIFBvaW50ZXJQb2ludGVyIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7CiAgIFBvaW50ZXI8UG9pbnRlcjxJbnQ4Pj4gcG9pbnRlcjsKICAgUG9pbnRlcjxJbnQ4PiBkYXRhOwotICBQb2ludGVyUG9pbnRlcigpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVyUG9pbnRlciIpOworICBQb2ludGVyUG9pbnRlcigpIDogc3VwZXIoJ0ZmaU1lbW9yeS5Qb2ludGVyUG9pbnRlcicpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgewogICAgIHBvaW50ZXIgPSBhbGxvY2F0ZShjb3VudDogTik7CiAgICAgZGF0YSA9IGFsbG9jYXRlKCk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpIHsKICAgICBmcmVlKHBvaW50ZXIpOwogICAgIGZyZWUoZGF0YSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKICAgdm9pZCBydW4oKSB7CiAgICAgZG9TdG9yZVBvaW50ZXIocG9pbnRlciwgTiwgZGF0YSk7CiAgICAgZmluYWwgaW50IHggPSBkb0xvYWRQb2ludGVyKHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IDAgfHwgeCA9PSBkYXRhLmFkZHJlc3MpIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CiAKIGNsYXNzIFBvaW50ZXJJbnQ2NE1pbnQgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKICAgUG9pbnRlcjxJbnQ2ND4gcG9pbnRlcjsKLSAgUG9pbnRlckludDY0TWludCgpIDogc3VwZXIoIkZmaU1lbW9yeS5Qb2ludGVySW50NjRNaW50Iik7CisgIFBvaW50ZXJJbnQ2NE1pbnQoKSA6IHN1cGVyKCdGZmlNZW1vcnkuUG9pbnRlckludDY0TWludCcpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHNldHVwKCkgPT4gcG9pbnRlciA9IGFsbG9jYXRlKGNvdW50OiBOKTsKKyAgQG92ZXJyaWRlCiAgIHZvaWQgdGVhcmRvd24oKSA9PiBmcmVlKHBvaW50ZXIpOwogCisgIEBvdmVycmlkZQogICB2b2lkIHJ1bigpIHsKICAgICBkb1N0b3JlSW50NjRNaW50KHBvaW50ZXIsIE4pOwogICAgIGZpbmFsIGludCB4ID0gZG9Mb2FkSW50NjRNaW50KHBvaW50ZXIsIE4pOwogICAgIC8vIFVzaW5nIG92ZXJmbG93IHNlbWFudGljcyBpbiBhZ2dyZWdhdGlvbi4KICAgICBpZiAoeCAhPSAtTikgewotICAgICAgdGhyb3cgRXhjZXB0aW9uKCIkbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Iik7CisgICAgICB0aHJvdyBFeGNlcHRpb24oJyRuYW1lOiBVbmV4cGVjdGVkIHJlc3VsdDogJHgnKTsKICAgICB9CiAgIH0KIH0KQEAgLTQxMCw3ICs0NDYsNyBAQAogLy8gTWFpbiBkcml2ZXIuCiAvLwogCi1tYWluKCkgewordm9pZCBtYWluKCkgewogICBmaW5hbCBiZW5jaG1hcmtzID0gWwogICAgICgpID0+IFBvaW50ZXJJbnQ4KCksCiAgICAgKCkgPT4gUG9pbnRlclVpbnQ4KCksCkBAIC00MjUsNSArNDYxLDcgQEAKICAgICAoKSA9PiBQb2ludGVyRG91YmxlKCksCiAgICAgKCkgPT4gUG9pbnRlclBvaW50ZXIoKSwKICAgXTsKLSAgYmVuY2htYXJrcy5mb3JFYWNoKChiZW5jaG1hcmspID0+IGJlbmNobWFyaygpLnJlcG9ydCgpKTsKKyAgZm9yIChmaW5hbCBiZW5jaG1hcmsgaW4gYmVuY2htYXJrcykgeworICAgIGJlbmNobWFyaygpLnJlcG9ydCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaVN0cnVjdC9kYXJ0L0ZmaVN0cnVjdC5kYXJ0IGIvYmVuY2htYXJrcy9GZmlTdHJ1Y3QvZGFydC9GZmlTdHJ1Y3QuZGFydAppbmRleCBmMjk1MmVjLi4yNjc2OGM1IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL0ZmaVN0cnVjdC9kYXJ0L0ZmaVN0cnVjdC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpU3RydWN0L2RhcnQvRmZpU3RydWN0LmRhcnQKQEAgLTQ2LDE3ICs0NiwyMCBAQAogY29uc3QgTiA9IDEwMDA7CiAKIGNsYXNzIEZpZWxkTG9hZFN0b3JlIGV4dGVuZHMgQmVuY2htYXJrQmFzZSB7Ci0gIFBvaW50ZXI8VmVyeUxhcmdlU3RydWN0PiBwb2ludGVyOwotICBGaWVsZExvYWRTdG9yZSgpIDogc3VwZXIoIkZmaVN0cnVjdC5GaWVsZExvYWRTdG9yZSIpOworICBQb2ludGVyPFZlcnlMYXJnZVN0cnVjdD4gcG9pbnRlciA9IG51bGxwdHI7CisgIEZpZWxkTG9hZFN0b3JlKCkgOiBzdXBlcignRmZpU3RydWN0LkZpZWxkTG9hZFN0b3JlJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVJbnQzMihwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZEludDMyKHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CkBAIC02NSwxMSArNjgsMTMgQEAKIC8vIE1haW4gZHJpdmVyLgogLy8KIAotbWFpbigpIHsKK3ZvaWQgbWFpbigpIHsKICAgZmluYWwgYmVuY2htYXJrcyA9IFsKICAgICAoKSA9PiBGaWVsZExvYWRTdG9yZSgpLAogICBdOwotICBiZW5jaG1hcmtzLmZvckVhY2goKGJlbmNobWFyaykgPT4gYmVuY2htYXJrKCkucmVwb3J0KCkpOworICBmb3IgKGZpbmFsIGJlbmNobWFyayBpbiBiZW5jaG1hcmtzKSB7CisgICAgYmVuY2htYXJrKCkucmVwb3J0KCk7CisgIH0KIH0KIAogLy8KQEAgLTc3LDQ1ICs4Miw0NSBAQAogLy8KIGNsYXNzIFZlcnlMYXJnZVN0cnVjdCBleHRlbmRzIFN0cnVjdCB7CiAgIEBJbnQ4KCkKLSAgaW50IGE7CisgIGV4dGVybmFsIGludCBhOwogCiAgIEBJbnQxNigpCi0gIGludCBiOworICBleHRlcm5hbCBpbnQgYjsKIAogICBASW50MzIoKQotICBpbnQgYzsKKyAgZXh0ZXJuYWwgaW50IGM7CiAKICAgQEludDY0KCkKLSAgaW50IGQ7CisgIGV4dGVybmFsIGludCBkOwogCiAgIEBVaW50OCgpCi0gIGludCBlOworICBleHRlcm5hbCBpbnQgZTsKIAogICBAVWludDE2KCkKLSAgaW50IGY7CisgIGV4dGVybmFsIGludCBmOwogCiAgIEBVaW50MzIoKQotICBpbnQgZzsKKyAgZXh0ZXJuYWwgaW50IGc7CiAKICAgQFVpbnQ2NCgpCi0gIGludCBoOworICBleHRlcm5hbCBpbnQgaDsKIAogICBASW50UHRyKCkKLSAgaW50IGk7CisgIGV4dGVybmFsIGludCBpOwogCiAgIEBEb3VibGUoKQotICBkb3VibGUgajsKKyAgZXh0ZXJuYWwgZG91YmxlIGo7CiAKICAgQEZsb2F0KCkKLSAgZG91YmxlIGs7CisgIGV4dGVybmFsIGRvdWJsZSBrOwogCi0gIFBvaW50ZXI8VmVyeUxhcmdlU3RydWN0PiBwYXJlbnQ7CisgIGV4dGVybmFsIFBvaW50ZXI8VmVyeUxhcmdlU3RydWN0PiBwYXJlbnQ7CiAKICAgQEludFB0cigpCi0gIGludCBudW1DaGlsZHJlbjsKKyAgZXh0ZXJuYWwgaW50IG51bUNoaWxkcmVuOwogCi0gIFBvaW50ZXI8VmVyeUxhcmdlU3RydWN0PiBjaGlsZHJlbjsKKyAgZXh0ZXJuYWwgUG9pbnRlcjxWZXJ5TGFyZ2VTdHJ1Y3Q+IGNoaWxkcmVuOwogCiAgIEBJbnQ4KCkKLSAgaW50IHNtYWxsTGFzdEZpZWxkOworICBleHRlcm5hbCBpbnQgc21hbGxMYXN0RmllbGQ7CiB9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0ZmaVN0cnVjdC9kYXJ0Mi9GZmlTdHJ1Y3QuZGFydCBiL2JlbmNobWFya3MvRmZpU3RydWN0L2RhcnQyL0ZmaVN0cnVjdC5kYXJ0CmluZGV4IGYyOTUyZWMuLjZlN2U5MGQgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvRmZpU3RydWN0L2RhcnQyL0ZmaVN0cnVjdC5kYXJ0CisrKyBiL2JlbmNobWFya3MvRmZpU3RydWN0L2RhcnQyL0ZmaVN0cnVjdC5kYXJ0CkBAIC00NywxNiArNDcsMTkgQEAKIAogY2xhc3MgRmllbGRMb2FkU3RvcmUgZXh0ZW5kcyBCZW5jaG1hcmtCYXNlIHsKICAgUG9pbnRlcjxWZXJ5TGFyZ2VTdHJ1Y3Q+IHBvaW50ZXI7Ci0gIEZpZWxkTG9hZFN0b3JlKCkgOiBzdXBlcigiRmZpU3RydWN0LkZpZWxkTG9hZFN0b3JlIik7CisgIEZpZWxkTG9hZFN0b3JlKCkgOiBzdXBlcignRmZpU3RydWN0LkZpZWxkTG9hZFN0b3JlJyk7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSA9PiBwb2ludGVyID0gYWxsb2NhdGUoY291bnQ6IE4pOworICBAb3ZlcnJpZGUKICAgdm9pZCB0ZWFyZG93bigpID0+IGZyZWUocG9pbnRlcik7CiAKKyAgQG92ZXJyaWRlCiAgIHZvaWQgcnVuKCkgewogICAgIGRvU3RvcmVJbnQzMihwb2ludGVyLCBOKTsKICAgICBmaW5hbCBpbnQgeCA9IGRvTG9hZEludDMyKHBvaW50ZXIsIE4pOwogICAgIGlmICh4ICE9IE4pIHsKLSAgICAgIHRocm93IEV4Y2VwdGlvbigiJG5hbWU6IFVuZXhwZWN0ZWQgcmVzdWx0OiAkeCIpOworICAgICAgdGhyb3cgRXhjZXB0aW9uKCckbmFtZTogVW5leHBlY3RlZCByZXN1bHQ6ICR4Jyk7CiAgICAgfQogICB9CiB9CkBAIC02NSwxMSArNjgsMTMgQEAKIC8vIE1haW4gZHJpdmVyLgogLy8KIAotbWFpbigpIHsKK3ZvaWQgbWFpbigpIHsKICAgZmluYWwgYmVuY2htYXJrcyA9IFsKICAgICAoKSA9PiBGaWVsZExvYWRTdG9yZSgpLAogICBdOwotICBiZW5jaG1hcmtzLmZvckVhY2goKGJlbmNobWFyaykgPT4gYmVuY2htYXJrKCkucmVwb3J0KCkpOworICBmb3IgKGZpbmFsIGJlbmNobWFyayBpbiBiZW5jaG1hcmtzKSB7CisgICAgYmVuY2htYXJrKCkucmVwb3J0KCk7CisgIH0KIH0KIAogLy8KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvTGlzdENvcHkvZGFydC9MaXN0Q29weS5kYXJ0IGIvYmVuY2htYXJrcy9MaXN0Q29weS9kYXJ0L0xpc3RDb3B5LmRhcnQKaW5kZXggMTA5MWM5My4uODZhM2Q1YyAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9MaXN0Q29weS9kYXJ0L0xpc3RDb3B5LmRhcnQKKysrIGIvYmVuY2htYXJrcy9MaXN0Q29weS9kYXJ0L0xpc3RDb3B5LmRhcnQKQEAgLTEzMSw4ICsxMzEsMTcgQEAKICAgICAgICAgb3V0cHV0ID0gPG51bT5bLi4uaW5wdXRdOwogICAgICAgfSksCiAgICAgICBCZW5jaG1hcmsoJ3NwcmVhZC5pbnQnLCBsZW5ndGgsICgpIHsKKyAgICAgICAgb3V0cHV0ID0gPGludD5bLi4uaW5wdXQgYXMgZHluYW1pY107CisgICAgICB9KSwKKyAgICAgIEJlbmNobWFyaygnc3ByZWFkLmludC5jYXN0JywgbGVuZ3RoLCAoKSB7CiAgICAgICAgIG91dHB1dCA9IDxpbnQ+Wy4uLmlucHV0LmNhc3Q8aW50PigpXTsKICAgICAgIH0pLAorICAgICAgQmVuY2htYXJrKCdzcHJlYWQuaW50Lm1hcCcsIGxlbmd0aCwgKCkgeworICAgICAgICBvdXRwdXQgPSA8aW50PlsuLi5pbnB1dC5tYXAoKHgpID0+IHggYXMgaW50KV07CisgICAgICB9KSwKKyAgICAgIEJlbmNobWFyaygnZm9yLmludCcsIGxlbmd0aCwgKCkgeworICAgICAgICBvdXRwdXQgPSA8aW50Pltmb3IgKHZhciBuIGluIGlucHV0KSBuIGFzIGludF07CisgICAgICB9KSwKICAgICBdOwogCiB2b2lkIG1haW4oKSB7CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL0xpc3RDb3B5L2RhcnQyL0xpc3RDb3B5LmRhcnQgYi9iZW5jaG1hcmtzL0xpc3RDb3B5L2RhcnQyL0xpc3RDb3B5LmRhcnQKaW5kZXggMGE1ZjY0My4uYWNiYjVhMSAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9MaXN0Q29weS9kYXJ0Mi9MaXN0Q29weS5kYXJ0CisrKyBiL2JlbmNobWFya3MvTGlzdENvcHkvZGFydDIvTGlzdENvcHkuZGFydApAQCAtMTMzLDYgKzEzMywxNSBAQAogICAgICAgQmVuY2htYXJrKCdzcHJlYWQuaW50JywgbGVuZ3RoLCAoKSB7CiAgICAgICAgIG91dHB1dCA9IDxpbnQ+Wy4uLmlucHV0XTsKICAgICAgIH0pLAorICAgICAgQmVuY2htYXJrKCdzcHJlYWQuaW50LmNhc3QnLCBsZW5ndGgsICgpIHsKKyAgICAgICAgb3V0cHV0ID0gPGludD5bLi4uaW5wdXQuY2FzdDxpbnQ+KCldOworICAgICAgfSksCisgICAgICBCZW5jaG1hcmsoJ3NwcmVhZC5pbnQubWFwJywgbGVuZ3RoLCAoKSB7CisgICAgICAgIG91dHB1dCA9IDxpbnQ+Wy4uLmlucHV0Lm1hcCgoeCkgPT4geCBhcyBpbnQpXTsKKyAgICAgIH0pLAorICAgICAgQmVuY2htYXJrKCdmb3IuaW50JywgbGVuZ3RoLCAoKSB7CisgICAgICAgIG91dHB1dCA9IDxpbnQ+W2ZvciAodmFyIG4gaW4gaW5wdXQpIG4gYXMgaW50XTsKKyAgICAgIH0pLAogICAgIF07CiAKIHZvaWQgbWFpbigpIHsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvUnVudGltZVR5cGUvZGFydC9SdW50aW1lVHlwZS5kYXJ0IGIvYmVuY2htYXJrcy9SdW50aW1lVHlwZS9kYXJ0L1J1bnRpbWVUeXBlLmRhcnQKaW5kZXggZmUyMWIzMC4uYTk2NTE5NyAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9SdW50aW1lVHlwZS9kYXJ0L1J1bnRpbWVUeXBlLmRhcnQKKysrIGIvYmVuY2htYXJrcy9SdW50aW1lVHlwZS9kYXJ0L1J1bnRpbWVUeXBlLmRhcnQKQEAgLTM1LDcgKzM1LDcgQEAKIAogYWJzdHJhY3QgY2xhc3MgV2lkZ2V0IHsKICAgY29uc3QgV2lkZ2V0KHt0aGlzLmtleX0pOwotICBmaW5hbCBLZXkga2V5OworICBmaW5hbCBLZXk/IGtleTsKIAogICBAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykKICAgc3RhdGljIGJvb2wgY2FuVXBkYXRlKFdpZGdldCBvbGRXaWRnZXQsIFdpZGdldCBuZXdXaWRnZXQpIHsKQEAgLTQ1LDMyICs0NSwzMiBAQAogfQogCiBjbGFzcyBBV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgQVdpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBBV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBCV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgQldpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBCV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBDV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgQ1dpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBDV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBEV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgRFdpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBEV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBFV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgRVdpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBFV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBGV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0IHsKLSAgY29uc3QgRldpZGdldCh7S2V5IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOworICBjb25zdCBGV2lkZ2V0KHtLZXk/IGtleX0pIDogc3VwZXIoa2V5OiBrZXkpOwogfQogCiBjbGFzcyBXV2lkZ2V0PFcgZXh0ZW5kcyBXaWRnZXQ+IGV4dGVuZHMgV2lkZ2V0IHsKLSAgZmluYWwgVyAvKj8qLyByZWY7Ci0gIGNvbnN0IFdXaWRnZXQoe3RoaXMucmVmLCBLZXkga2V5fSkgOiBzdXBlcihrZXk6IGtleSk7CisgIGZpbmFsIFc/IHJlZjsKKyAgY29uc3QgV1dpZGdldCh7dGhpcy5yZWYsIEtleT8ga2V5fSkgOiBzdXBlcihrZXk6IGtleSk7CiB9CiAKIGNsYXNzIFdpZGdldENhblVwZGF0ZUJlbmNobWFyayBleHRlbmRzIEJlbmNobWFya0Jhc2UgewpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvVXRmOERlY29kZS5kYXJ0IGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvVXRmOERlY29kZS5kYXJ0CmluZGV4IGExYjQyM2QuLjUwNGRlYmUgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L1V0ZjhEZWNvZGUuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9VdGY4RGVjb2RlLmRhcnQKQEAgLTIxLDE2ICsyMSwxNiBAQAogICBmaW5hbCBTdHJpbmcgdGV4dDsKICAgZmluYWwgaW50IHNpemU7CiAgIGZpbmFsIGJvb2wgYWxsb3dNYWxmb3JtZWQ7Ci0gIExpc3Q8VWludDhMaXN0PiBjaHVua3M7Ci0gIGludCB0b3RhbElucHV0U2l6ZTsKLSAgaW50IHRvdGFsT3V0cHV0U2l6ZTsKKyAgbGF0ZSBMaXN0PFVpbnQ4TGlzdD4gY2h1bmtzOworICBpbnQgdG90YWxJbnB1dFNpemUgPSAwOworICBpbnQgdG90YWxPdXRwdXRTaXplID0gMDsKIAogICBzdGF0aWMgU3RyaW5nIF9tYWtlTmFtZShTdHJpbmcgbGFuZ3VhZ2UsIGludCBzaXplLCBib29sIGFsbG93TWFsZm9ybWVkKSB7Ci0gICAgU3RyaW5nIG5hbWUgPSAiVXRmOERlY29kZS4kbGFuZ3VhZ2UuIjsKKyAgICBTdHJpbmcgbmFtZSA9ICdVdGY4RGVjb2RlLiRsYW5ndWFnZS4nOwogICAgIG5hbWUgKz0gc2l6ZSA+PSAxMDAwMDAwCi0gICAgICAgID8gIiR7c2l6ZSB+LyAxMDAwMDAwfU0iCi0gICAgICAgIDogc2l6ZSA+PSAxMDAwID8gIiR7c2l6ZSB+LyAxMDAwfWsiIDogIiRzaXplIjsKLSAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIG5hbWUgKz0gIi5tYWxmb3JtZWQiOworICAgICAgICA/ICcke3NpemUgfi8gMTAwMDAwMH1NJworICAgICAgICA6IHNpemUgPj0gMTAwMCA/ICcke3NpemUgfi8gMTAwMH1rJyA6ICckc2l6ZSc7CisgICAgaWYgKGFsbG93TWFsZm9ybWVkKSBuYW1lICs9ICcubWFsZm9ybWVkJzsKICAgICByZXR1cm4gbmFtZTsKICAgfQogCkBAIC0zOSw5ICszOSw5IEBACiAKICAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7Ci0gICAgVWludDhMaXN0IGRhdGEgPSB1dGY4LmVuY29kZSh0ZXh0KSBhcyBVaW50OExpc3Q7CisgICAgZmluYWwgVWludDhMaXN0IGRhdGEgPSB1dGY4LmVuY29kZSh0ZXh0KSBhcyBVaW50OExpc3Q7CiAgICAgaWYgKGRhdGEubGVuZ3RoICE9IDEwMDAwKSB7Ci0gICAgICB0aHJvdyAiRXhwZWN0ZWQgaW5wdXQgZGF0YSBvZiBleGFjdGx5IDEwMDAwIGJ5dGVzLiI7CisgICAgICB0aHJvdyAnRXhwZWN0ZWQgaW5wdXQgZGF0YSBvZiBleGFjdGx5IDEwMDAwIGJ5dGVzLic7CiAgICAgfQogICAgIGlmIChzaXplIDwgZGF0YS5sZW5ndGgpIHsKICAgICAgIC8vIFNwbGl0IGludG8gY2h1bmtzLgpAQCAtODMsNyArODMsNyBAQAogICAgICAgbGVuZ3RoU3VtICs9IHMubGVuZ3RoOwogICAgIH0KICAgICBpZiAobGVuZ3RoU3VtICE9IHRvdGFsT3V0cHV0U2l6ZSkgewotICAgICAgdGhyb3cgIk91dHB1dCBsZW5ndGggZG9lc24ndCBtYXRjaCBleHBlY3RlZC4iOworICAgICAgdGhyb3cgJ091dHB1dCBsZW5ndGggZG9lc25cJ3QgbWF0Y2ggZXhwZWN0ZWQuJzsKICAgICB9CiAgIH0KIApAQCAtMTA4LDI4ICsxMDgsMjkgQEAKICAgdm9pZCByZXBvcnQoKSB7CiAgICAgLy8gUmVwb3J0IHRpbWUgaW4gbmFub3NlY29uZHMuCiAgICAgZmluYWwgZG91YmxlIHNjb3JlID0gbWVhc3VyZSgpICogMTAwMC4wOwotICAgIHByaW50KCIkbmFtZShSdW5UaW1lKTogJHNjb3JlIG5zLiIpOworICAgIHByaW50KCckbmFtZShSdW5UaW1lKTogJHNjb3JlIG5zLicpOwogICB9CiB9CiAKIHZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgewogICBjb25zdCB0ZXh0cyA9IHsKLSAgICAiZW4iOiBlbiwKLSAgICAiZGEiOiBkYSwKLSAgICAic2siOiBzaywKLSAgICAicnUiOiBydSwKLSAgICAibmUiOiBuZSwKLSAgICAiemgiOiB6aCwKKyAgICAnZW4nOiBlbiwKKyAgICAnZGEnOiBkYSwKKyAgICAnc2snOiBzaywKKyAgICAncnUnOiBydSwKKyAgICAnbmUnOiBuZSwKKyAgICAnemgnOiB6aCwKICAgfTsKLSAgZmluYWwgYm9vbCB0ZXN0TWFsZm9ybWVkID0KLSAgICAgIGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmlzTm90RW1wdHkgJiYgYXJncy5maXJzdCA9PSAibWFsZm9ybWVkIjsKKyAgZmluYWwgYm9vbCB0ZXN0TWFsZm9ybWVkID0gYXJncy5pc05vdEVtcHR5ICYmIGFyZ3MuZmlyc3QgPT0gJ21hbGZvcm1lZCc7CiAgIGZpbmFsIGJlbmNobWFya3MgPSBbCiAgICAgLy8gT25seSBiZW5jaG1hcmsgd2l0aCBhbGxvd01hbGZvcm1lZDogZmFsc2UgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuCiAgICAgZm9yIChib29sIGFsbG93TWFsZm9ybWVkIGluIFtmYWxzZSwgaWYgKHRlc3RNYWxmb3JtZWQpIHRydWVdKQogICAgICAgZm9yIChpbnQgc2l6ZSBpbiBbMTAsIDEwMDAwLCAxMDAwMDAwMF0pCiAgICAgICAgIGZvciAoU3RyaW5nIGxhbmd1YWdlIGluIHRleHRzLmtleXMpCi0gICAgICAgICAgKCkgPT4gVXRmOERlY29kZShsYW5ndWFnZSwgdGV4dHNbbGFuZ3VhZ2VdLCBzaXplLCBhbGxvd01hbGZvcm1lZCkKKyAgICAgICAgICAoKSA9PiBVdGY4RGVjb2RlKGxhbmd1YWdlLCB0ZXh0c1tsYW5ndWFnZV0hLCBzaXplLCBhbGxvd01hbGZvcm1lZCkKICAgXTsKIAotICBiZW5jaG1hcmtzLmZvckVhY2goKGJtKSA9PiBibSgpLnJlcG9ydCgpKTsKKyAgZm9yICh2YXIgYm0gaW4gYmVuY2htYXJrcykgeworICAgIGJtKCkucmVwb3J0KCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L2RhdGV4dF9sYXRpbjFfMTBrLmRhcnQgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9kYXRleHRfbGF0aW4xXzEway5kYXJ0CmluZGV4IDg2NmZmODMuLmJjZTZjODAgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L2RhdGV4dF9sYXRpbjFfMTBrLmRhcnQKKysrIGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvZGF0ZXh0X2xhdGluMV8xMGsuZGFydApAQCAtNyw3ICs3LDcgQEAKIC8vIFRoZSBtYXRlcmlhbCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZS1BbGlrZQogLy8gTGljZW5zZSAzLjA6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAvCiAKLWNvbnN0IFN0cmluZyBkYSA9ICIiIgorY29uc3QgU3RyaW5nIGRhID0gJycnCiBBbmRlcnMgQW5kCiAKIEFuZGVycyBGYXVudGxlcm95IEFuZCBlciBlbiBiZXLDuG10IGZpZ3VyIGkgRGlzbmV5cyB0ZWduZWZpbG0gb2cgdGVnbmVzZXJpZXIuIFNlbHYgb20gaGFuIGlra2UgZXIgc8OmcmxpZ3QgcG9wdWzDpnIgaSBVU0EsIG9wdHLDpmRlciBoYW4gaSBtYW5nZSB1Z2VibGFkZSBpIEV1cm9wYTogSSBOb3JnZSwgVHlza2xhbmQsIFN2ZXJpZ2UsIERhbm1hcmssIEhvbGxhbmQsIEl0YWxpZW4gbWVkIGZsZXJlLiBIYW5zIGbDuHJzdGUgb3B0csOmZGVuIHZhciBpIHRlZ25lZmlsbWVuICJUaGUgV2lzZSBMaXR0bGUgSGVuIiAoRGVuIGtsb2dlIGxpbGxlIGjDuG5lKSBmcmEgOS4ganVuaSAxOTM0LiBIYW5zIGthcmFrdGVyaXN0aXNrZSBzdGVtbWUgYmxldiBpbmR0YWx0IGFmIHJhZGlva29taWtlcmVuIENsYXJlbmNlIE5hc2gsIGRlciBzaWRlbiBmYXN0IGxhZ2RlIHN0ZW1tZSB0aWwuCkBAIC01OSw0ICs1OSw0IEBACiBTZXJpZW4gZmlrIGVuIGZvcm55ZWxzZSBpIDIwMDEsIGh2aWxrZXQgw6ZuZHJlZGUgbWFya2FudCBww6UgaGlzdG9yaWVybmUuIEV2ZXJldHQgRHVja2xhaXIgdmVuZGVyIHRpbGJhZ2UsIHNsdWtrZXIgR2xvYnVzLCBzbWlkZXIgU3TDpWxhbmRlbiB1ZCBhZiBEdWNrbGFpciBUb3dlciBvZyBnZW5vcHJldHRlciBzaXQgZ2FtbGUgaW1wZXJpdW0uIFVuZGVydmVqcyBibGl2ZXIgRHVja2xhaXIncyB0byBkw7h0cmUgYWZzbMO4cmV0LiBEZSBoYWRlciBiZWdnZSBFdmVyZXR0IGFmIGdydW5kZSwgZGVyIGlra2UgYmxpdmVyIGFmc2zDuHJldCB0aWwgZnVsZGUsIHNlbHZvbSBkZXQgYmxpdmVyIGFudHlkZXQsIGF0IEV2ZXJldHQgc2tpbHRlIHNpZyBhZiBtZWQgZGVyZXMgbW9yIHDDpSBlbiBlbGxlciBhbmRlbiBtw6VkZS4KIERlbm5lIGZvcm55ZWxzZSBob2xkdCAxOCBudW1yZSwgZsO4ciBzZXJpZW4gYmxldiBhZnNsdXR0ZXQsIGRvZyB1ZGVuIGF0IGhpc3Rvcmllcm5lIGZpayBlbiBzbHV0bmluZy4KIAotQmFya3MtaGlzdG9yaWVuICJBbmRlcnMgQW5kIG9nIGRlbiBneWxkbmUgaGplbG0iIGZyYSAxOTU0IGtvbSBpIDIwMDYgbWVkIGkgIiIiOworQmFya3MtaGlzdG9yaWVuICJBbmRlcnMgQW5kIG9nIGRlbiBneWxkbmUgaGplbG0iIGZyYSAxOTU0IGtvbSBpIDIwMDYgbWVkIGkgJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvZW50ZXh0X2FzY2lpXzEway5kYXJ0IGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvZW50ZXh0X2FzY2lpXzEway5kYXJ0CmluZGV4IDkzNTNkNmQuLjgyY2I3MjEgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L2VudGV4dF9hc2NpaV8xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9lbnRleHRfYXNjaWlfMTBrLmRhcnQKQEAgLTcsNyArNyw3IEBACiAvLyBUaGUgbWF0ZXJpYWwgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmUtQWxpa2UKIC8vIExpY2Vuc2UgMy4wOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLwogCi1jb25zdCBTdHJpbmcgZW4gPSAiIiIKK2NvbnN0IFN0cmluZyBlbiA9ICcnJwogQW5hcmNoaXNtCiAKIEFuYXJjaGlzbSBpcyBhIHJhZGljYWwgcG9saXRpY2FsIG1vdmVtZW50IHRoYXQgaXMgaGlnaGx5IHNrZXB0aWNhbCB0b3dhcmRzIGF1dGhvcml0eSBhbmQgcmVqZWN0cyBhbGwgZm9ybXMgb2YgdW5qdXN0IGhpZXJhcmNoeS4gSXQgY2FsbHMgZm9yIHRoZSBhYm9saXRpb24gb2YgdGhlIHN0YXRlIHdoaWNoIGl0IGhvbGRzIHRvIGJlIHVuZGVzaXJhYmxlLCB1bm5lY2Vzc2FyeSwgYW5kIGhhcm1mdWwuIEFuYXJjaGlzbSBhZHZvY2F0ZXMgZm9yIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgc3RhdGUgd2l0aCBzdGF0ZWxlc3Mgc29jaWV0aWVzIG9yIG90aGVyIGZvcm1zIG9mIGZyZWUgYXNzb2NpYXRpb25zLgpAQCAtMzIsNCArMzIsNCBAQAogQXQgdGhlIHR1cm5pbmcgb2YgdGhlIGNlbnR1cnksIGFuYXJjaGlzbSBoYWQgc3ByZWFkIGFsbCBvdmVyIHRoZSB3b3JsZC4gSW4gQ2hpbmEsIHNtYWxsIGdyb3VwcyBvZiBzdHVkZW50cyBpbXBvcnRlZCB0aGUgaHVtYW5pc3RpYyBwcm8tc2NpZW5jZSB2ZXJzaW9uIG9mIGFuYXJjaG8tY29tbXVuaXNtLiBUb2t5byB3YXMgYSBob3RzcG90IGZvciByZWJlbGxpb3VzIHlvdXRoIGZyb20gY291bnRyaWVzIG9mIHRoZSBmYXIgZWFzdCwgcG91cmluZyBpbnRvIHRoZSBKYXBhbmVzZSBjYXBpdGFsIHRvIHN0dWR5LiBJbiBMYXRpbiBBbWVyaWNhLCBTbyBQYXVsbyB3YXMgYSBzdHJvbmdob2xkIGZvciBhbmFyY2hvLXN5bmRpY2FsaXNtIHdoZXJlIGl0IGJlY2FtZSB0aGUgbW9zdCBwcm9taW5lbnQgbGVmdC13aW5nIGlkZW9sb2d5LiBEdXJpbmcgdGhpcyB0aW1lLCBhIG1pbm9yaXR5IG9mIGFuYXJjaGlzdHMgYWRvcHRlZCB0YWN0aWNzIG9mIHJldm9sdXRpb25hcnkgcG9saXRpY2FsIHZpb2xlbmNlLiBUaGlzIHN0cmF0ZWd5IGJlY2FtZSBrbm93biBhcyBwcm9wYWdhbmRhIG9mIHRoZSBkZWVkLiBUaGUgZGlzbWVtYmVybWVudCBvZiB0aGUgRnJlbmNoIHNvY2lhbGlzdCBtb3ZlbWVudCBpbnRvIG1hbnkgZ3JvdXBzIGFuZCB0aGUgZXhlY3V0aW9uIGFuZCBleGlsZSBvZiBtYW55IENvbW11bmFyZHMgdG8gcGVuYWwgY29sb25pZXMgZm9sbG93aW5nIHRoZSBzdXBwcmVzc2lvbiBvZiB0aGUgUGFyaXMgQ29tbXVuZSBmYXZvdXJlZCBpbmRpdmlkdWFsaXN0IHBvbGl0aWNhbCBleHByZXNzaW9uIGFuZCBhY3RzLiBFdmVuIHRob3VnaCBtYW55IGFuYXJjaGlzdHMgZGlzdGFuY2VkIHRoZW1zZWx2ZXMgZnJvbSB0aGVzZSB0ZXJyb3Jpc3QgYWN0cywgaW5mYW15IGNhbWUgdXBvbiB0aGUgbW92ZW1lbnQuIElsbGVnYWxpc20gd2FzIGFub3RoZXIgc3RyYXRlZ3kgd2hpY2ggc29tZSBhbmFyY2hpc3RzIGFkb3B0ZWQgdGhlc2Ugc2FtZSB5ZWFycy4KIEFuYXJjaGlzdHMgZW50aHVzaWFzdGljYWxseSBwYXJ0aWNpcGF0ZWQgaW4gdGhlIFJ1c3NpYW4gUmV2b2x1dGlvbmRlc3BpdGUgY29uY2VybnNpbiBvcHBvc2l0aW9uIHRvIHRoZSBXaGl0ZXMuIEhvd2V2ZXIsIHRoZXkgbWV0IGhhcnNoIHN1cHByZXNzaW9uIGFmdGVyIHRoZSBCb2xzaGV2aWsgZ292ZXJubWVudCB3YXMgc3RhYmlsaXplZC4gU2V2ZXJhbCBhbmFyY2hpc3RzIGZyb20gUGV0cm9ncmFkIGFuZCBNb3Njb3cgZmxlZCB0byBVa3JhaW5lLCBub3RhYmx5IGxlYWRpbmcgdG8gdGhlIEtyb25zdGFkdCByZWJlbGxpb24gYW5kIE5lc3RvciBNYWtobm8ncyBzdHJ1Z2dsZSBpbiB0aGUgRnJlZSBUZXJyaXRvcnkuIFdpdGggdGhlIGFuYXJjaGlzdHMgYmVpbmcgY3J1c2hlZCBpbiBSdXNzaWEsIHR3byBuZXcgYW50aXRoZXRpY2FsIGN1cnJlbnRzIGVtZXJnZWQsIG5hbWVseSBwbGF0Zm9ybWlzbSBhbmQgc3ludGhlc2lzIGFuYXJjaGlzbS4gVGhlIGZvcm1lciBzb3VnaHQgdG8gY3JlYXRlIGEgY29oZXJlbnQgZ3JvdXAgdGhhdCB3b3VsZCBwdXNoIGZvciB0aGUgcmV2b2x1dGlvbiB3aGlsZSB0aGUgbGF0dGVyIHdlcmUgYWdhaW5zdCBhbnl0aGluZyB0aGF0IHdvdWxkIHJlc2VtYmxlIGEgcG9saXRpY2FsIHBhcnR5LiBTZWVpbmcgdGhlIHZpY3RvcmllcyBvZiB0aGUgQm9sc2hldmlrcyBpbiB0aGUgT2N0b2JlciBSZXZvbHV0aW9uIGFuZCB0aGUgcmVzdWx0aW5nIFJ1c3NpYW4gQ2l2aWwgV2FyLCBtYW55IHdvcmtlcnMgYW5kIGFjdGl2aXN0cyB0dXJuZWQgdG8gY29tbXVuaXN0IHBhcnRpZXMgd2hpY2ggZ3JldyBhdCB0aGUgZXhwZW5zZSBvZiBhbmFyY2hpc20gYW5kIG90aGVyIHNvY2lhbGlzdCBtb3ZlbWVudHMuIEluIEZyYW5jZSBhbmQgdGhlIFVuaXRlZCBTdGF0ZXMsIG1lbWJlcnMgb2YgbWFqb3Igc3luZGljYWxpc3QgbW92ZW1lbnRzLCB0aGUgR2VuZXJhbCBDb25mZWRlcmF0aW9uIG9mIExhYm91ciBhbmQgSW5kdXN0cmlhbCBXb3JrZXJzIG9mIHRoZSBXb3JsZCwgbGVmdCB0aGVpciBvcmdhbmlzYXRpb25zIGFuZCBqb2luZWQgdGhlIENvbW11bmlzdCBJbnRlcm5hdGlvbmFsLgogCi1JbiB0aGUgU3BhbmlzaCBDaXZpbCBXYXIsIGFuYXJjaGlzdHMgYW5kIHN5bmRpY2FsaXN0cyAoQ05UIGFuZCBGQUkpIG9uY2UgYWdhaW4gYWxsaWVkIHRoZW1zZWx2ZXMgd2l0aCB2YXJpb3VzIGN1cnJlbnRzIG9mIGxlZnRpc3RzLiBBIGxvbmcgdHJhZGl0aW9uIG9mIFNwYW5pc2ggYW5hcmNoaXNtIGxlZCB0byBhbmFyY2hpc3RzIHBsYXlpbmcgYSBwaXZvdGFsIHJvbGUgaW4gdGhlIHdhci4gSW4gcmVzcG9uc2UgdG8gdGhlIGFybXkgcmViZWxsaW9uLCBhbiBhbmFyY2hpc3QtaW5zcGlyZWQgbW92ZW1lbnQgb2YgcGVhc2FudHMgYW5kIHdvcmtlcnMsIHN1cHBvcnRlZCBieSBhcm1lZCBtaWxpdGlhcywgdG9vayBjb250cm9sIG9mIEJhcmNlbG9uYSBhbmQgb2YgbGFyZ2UgYXJlYXMgb2YgcnVyYWwgU3BhaW4gd2hlcmUgdGhleSBjb2xsZWN0aXZpc2VkICIiIjsKK0luIHRoZSBTcGFuaXNoIENpdmlsIFdhciwgYW5hcmNoaXN0cyBhbmQgc3luZGljYWxpc3RzIChDTlQgYW5kIEZBSSkgb25jZSBhZ2FpbiBhbGxpZWQgdGhlbXNlbHZlcyB3aXRoIHZhcmlvdXMgY3VycmVudHMgb2YgbGVmdGlzdHMuIEEgbG9uZyB0cmFkaXRpb24gb2YgU3BhbmlzaCBhbmFyY2hpc20gbGVkIHRvIGFuYXJjaGlzdHMgcGxheWluZyBhIHBpdm90YWwgcm9sZSBpbiB0aGUgd2FyLiBJbiByZXNwb25zZSB0byB0aGUgYXJteSByZWJlbGxpb24sIGFuIGFuYXJjaGlzdC1pbnNwaXJlZCBtb3ZlbWVudCBvZiBwZWFzYW50cyBhbmQgd29ya2Vycywgc3VwcG9ydGVkIGJ5IGFybWVkIG1pbGl0aWFzLCB0b29rIGNvbnRyb2wgb2YgQmFyY2Vsb25hIGFuZCBvZiBsYXJnZSBhcmVhcyBvZiBydXJhbCBTcGFpbiB3aGVyZSB0aGV5IGNvbGxlY3RpdmlzZWQgJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvbmV0ZXh0XzNfMTBrLmRhcnQgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9uZXRleHRfM18xMGsuZGFydAppbmRleCBiZTUzYmMzLi44ZmNlNTUwIDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9uZXRleHRfM18xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9uZXRleHRfM18xMGsuZGFydApAQCAtNyw3ICs3LDcgQEAKIC8vIFRoZSBtYXRlcmlhbCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZS1BbGlrZQogLy8gTGljZW5zZSAzLjA6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAvCiAKLWNvbnN0IFN0cmluZyBuZSA9ICIiIgorY29uc3QgU3RyaW5nIG5lID0gJycnCiDgpKjgpYfgpKrgpL7gpLIKIAog4KSo4KWH4KSq4KS+4KSyICjgpIbgpKfgpL/gpJXgpL7gpLDgpL/gpJUg4KSo4KS+4KSuOiDgpLjgpJngpY3gpJjgpYDgpK8g4KSy4KWL4KSV4KSk4KS+4KSo4KWN4KSk4KWN4KSw4KS/4KSVIOCkl+Cko+CkpOCkqOCljeCkpOCljeCksCDgpKjgpYfgpKrgpL7gpLIpIOCkpuCkleCljeCkt+Ckv+CkoyDgpI/gpLjgpL/gpK/gpL7gpLLgpYAg4KSt4KWC4KSq4KSw4KS/4KS14KWH4KS34KWN4KSg4KS/4KSkIOCkueCkv+CkruCkvuCksuClgCDgpLDgpL7gpLfgpY3gpJ/gpY3gpLAg4KS54KWLIOClpCDgpK/gpLjgpJXgpYsg4KSt4KWM4KSX4KWL4KSy4KS/4KSVIOCkheCkleCljeCkt+CkvuCkguCktiDgpajgpawg4KSh4KS/4KSX4KWN4KSw4KWAIOClqOClqCDgpK7gpL/gpKjgpYfgpJ/gpKbgpYfgpJbgpL8g4KWp4KWmIOCkoeCkv+Ckl+CljeCksOClgCDgpajgpa0g4KSu4KS/4KSo4KWH4KSfIOCkieCkpOCljeCkpOCksCDgpLAg4KWu4KWmIOCkoeCkv+Ckl+CljeCksOClgCDgpaog4KSu4KS/4KSo4KWH4KSf4KSm4KWH4KSW4KS/IOClruClriDgpKHgpL/gpJfgpY3gpLDgpYAg4KWn4KWoIOCkruCkv+CkqOClh+CknyDgpKrgpYLgpLDgpY3gpLXgpYAg4KSm4KWH4KS24KS+4KSo4KWN4KSk4KSw4KS44KSu4KWN4KSuIOCkq+CliOCksuCkv+Ckj+CkleCliyDgpJsg4KWkIOCkr+CkuOCkleCliyDgpJXgpYLgpLIg4KSV4KWN4KS34KWH4KSk4KWN4KSw4KSr4KSyIOClpyzgpargpa0s4KWn4KWu4KWnIOCkteCksOCljeCklyDgpJXgpL8u4KSu4KS/IOCkmyDgpaQg4KSv4KWLIOCkleCljeCkt+Clh+CkpOCljeCksOCkq+CksiDgpKrgpYPgpKXgpY3gpLXgpYDgpJXgpYsg4KSV4KWC4KSyIOCkleCljeCkt+Clh+CkpOCljeCksOCkq+CksuCkleCliyDgpaYu4KWm4KWpJSDgpLAg4KSP4KS44KS/4KSv4KS+IOCkruCkueCkvuCkpuClh+CktuCkleCliyDgpaYu4KWpJSDgpKrgpLDgpY3gpKbgpJsg4KWkIOCksuCko+CljeCkoeCkqCDgpLjgpY3gpKXgpL/gpKQgIuCkl+CljeCksOClgOCkqOCkteClgOCkmiDgpK7gpL/gpKjgpJ/gpL7gpIfgpK4iIOCkreCkqOCljeCkpuCkviDgpKrgpYLgpLDgpY3gpLXgpKTgpLDgpY3gpKsg4KSw4KS54KWH4KSV4KWL4KSy4KWHIOCkl+CljOCksOClgOCktuCkmeCljeCkleCksCDgpLngpL/gpK7gpL7gpLLgpJXgpYsg4KSo4KSc4KS/4KSVIOCkreCkj+CksCDgpJzgpL7gpKjgpYcg4KWu4KWsIOCkoeCkv+Ckl+CljeCksOClgCDgpafgpasg4KSu4KS/4KSo4KWH4KSfIOCkquClguCksOCljeCkteClgCDgpKbgpYfgpLbgpL7gpKjgpY3gpKTgpLDgpLLgpL7gpIgg4KSG4KSn4KS+4KSwIOCkruCkvuCkqOClgCDgpKjgpYfgpKrgpL7gpLLgpJXgpYsg4KSq4KWN4KSw4KSu4KS+4KSj4KS/4KSVIOCkuOCkruCkryDgpasg4KSY4KSj4KWN4KSf4KS+IOClquClqyDgpK7gpL/gpKjgpYfgpJ8g4KSG4KSX4KS+4KSh4KS/IOCkruCkvuCkqOCkv+Ckj+CkleCliyDgpJsg4KWkCkBAIC0yMSw0ICsyMSw0IEBACiDgpLngpL/gpK7gpL7gpLLgpK8g4KSV4KWN4KS34KWH4KSk4KWN4KSw4KSu4KS+IOCkruCkvuCkqOCkv+CkuOCkueCksOClgiDgpKzgpLjgpY3gpKgg4KSl4KS+4KSy4KWH4KSV4KWLIOCkleCkruCljeCkpOCkv+CkruCkviDgpKrgpKjgpL8g4KWvLOClpuClpuClpiDgpLXgpLDgpY3gpLcg4KSt4KSP4KSV4KWLIOCkleClgeCksOCkviDgpJXgpL7gpKDgpK7gpL7gpKHgpYzgpIIg4KSJ4KSq4KSk4KWN4KSv4KSV4KS+4KSu4KS+IOCkquCkvuCkh+Ckj+CkleCkviDgpKrgpY3gpLDgpL7gpJrgpYDgpKgg4KSU4KSc4KS+4KSw4KS54KSw4KWC4KSs4KS+4KSfIOCkquClgeCkt+CljeCkn+CkvyDgpLngpYHgpKjgpY3gpJvgpaQg4KS44KSu4KWN4KSt4KS14KSkOiDgpK3gpYvgpJ8t4KSs4KSw4KWN4KSu4KWH4KSy4KWAIOCkruClguCksuCkleCkviDgpK7gpL7gpKjgpL/gpLjgpLngpLDgpYIg4KSo4KWH4KSq4KS+4KSy4KSu4KS+IOClqCzgpavgpabgpaYg4KS14KSw4KWN4KS3IOCkheCkl+CkvuCkoeCkvyDgpKzgpLjgpYvgpKzgpL7gpLgg4KSX4KSw4KWN4KSm4KSl4KWH4KWkIAogCiDgpIjgpLbgpL7gpKrgpYLgpLDgpY3gpLUg4KWn4KWr4KWm4KWmIOCkpOCkv+CksCDgpIfgpKjgpY3gpKHgpYst4KSG4KSw4KWN4KSv4KSoIOCknOCkvuCkpOCkv+CkueCksOClgiDgpIngpKrgpKTgpY3gpK/gpJXgpL4g4KSq4KWN4KSw4KS14KWH4KS2IOCkl+CksOClh+ClpCDgpIjgpLbgpL7gpKrgpYLgpLDgpY3gpLXgpJXgpYsg4KWn4KWm4KWm4KWmIOCkpOCkv+CksCDgpLgt4KS44KS+4KSo4KS+IOCksOCkvuCknOCljeCkr+CkueCksOClgiDgpLAg4KSw4KS+4KSc4KWN4KSv4KS44KSZ4KWN4KSX4KSg4KSo4KS54KSw4KWCIOCkrOCkqOClh+ClpCDgpLjgpL/gpKbgpY3gpKfgpL7gpLDgpY3gpKUg4KSX4KWM4KSk4KSuICjgpIjgpLbgpL7gpKrgpYLgpLDgpY3gpLUg4KWr4KWs4KWp4oCT4KWq4KWu4KWpKSDgpKTgpY3gpK/gpLjgpY3gpKTgpYgg4KSP4KSVIOCkteCkguCktiwg4KS24KS+4KSV4KWN4KSv4KS14KSC4KS24KSV4KS+IOCksOCkvuCknOCkleClgeCkruCkvuCksCDgpKXgpL/gpI8sIOCknOCkuOCksuClhyDgpIbgpKvgpY3gpKjgpYsg4KSw4KS+4KSc4KSV4KS+4KScIOCkpOCljeCkr+CkvuCkl+ClgCDgpKTgpKrgpLjgpY3gpLXgpYDgpJXgpYsg4KSc4KWA4KS14KSoIOCkheCkgeCkl+CkvuCksuClhyDgpLAg4KSJ4KSo4KWAIOCkrOClgeCkpuCljeCkpyDgpK3gpKjgpYfgpLAg4KS14KS/4KS24KWN4KS1IOCkquCljeCksOCkuOCkv+CkpuCljeCkpyDgpK3gpI/gpaQgCi3gpIjgpLbgpL7gpKrgpYLgpLDgpY3gpLXgpJXgpYsg4KWo4KWr4KWmIOCkuOCkruCljeCkruCkruCkviwg4KSv4KWLIOCkleCljeCkt+Clh+CkpOCljeCksCDgpIngpKTgpY3gpKTgpLAiIiI7CivgpIjgpLbgpL7gpKrgpYLgpLDgpY3gpLXgpJXgpYsg4KWo4KWr4KWmIOCkuOCkruCljeCkruCkruCkviwg4KSv4KWLIOCkleCljeCkt+Clh+CkpOCljeCksCDgpIngpKTgpY3gpKTgpLAnJyc7CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9ydXRleHRfMl8xMGsuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L3J1dGV4dF8yXzEway5kYXJ0CmluZGV4IDUwYjAxMzAuLmM2MWE2NjUgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L3J1dGV4dF8yXzEway5kYXJ0CisrKyBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L3J1dGV4dF8yXzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIHJ1ID0gIiIiCitjb25zdCBTdHJpbmcgcnUgPSAnJycKINCb0LjRgtCy0LAKIAog0JvQuNGC0LLQsMyBICgpLCDQvtGE0LjRhtC40LDQu9GM0L3QvtC1INC90LDQt9Cy0LDQvdC40LUgINCb0LjRgtC+zIHQstGB0LrQsNGPINCg0LXRgdC/0YPMgdCx0LvQuNC60LAgKCkgINCz0L7RgdGD0LTQsNGA0YHRgtCy0L4sINGA0LDRgdC/0L7Qu9C+0LbQtdC90L3QvtC1INCyINGB0LXQstC10YDQvdC+0Lkg0YfQsNGB0YLQuCDQldCy0YDQvtC/0YsuINCh0YLQvtC70LjRhtCwINGB0YLRgNCw0L3RiyAg0JLQuNC70YzQvdGO0YEuCkBAIC00MSw0ICs0MSw0IEBACiAKINCSIFhJVsKgINC90LDRh9Cw0LvQtSBYViDQstC10LrQsNGFINGC0LXRgNGA0LjRgtC+0YDQuNGPINCS0LXQu9C40LrQvtCz0L4g0LrQvdGP0LbQtdGB0YLQstCwINCb0LjRgtC+0LLRgdC60L7Qs9C+INGB0YLRgNC10LzQuNGC0LXQu9GM0L3QviDRgNC+0YHQu9CwLCDQsiDQvtGB0L3QvtCy0L3QvtC8INC30LAg0YHRh9GR0YIg0L/RgNC40YHQvtC10LTQuNC90LXQvdC40Y8g0LfQtdC80LXQu9GMINCX0LDQv9Cw0LTQvdC+0Lkg0KDRg9GB0LguINCS0LrQu9GO0YfQtdC90LjQtSDQsiDRgdC+0YHRgtCw0LIg0LPQvtGB0YPQtNCw0YDRgdGC0LLQsCDRgdC70LDQstGP0L3RgdC60LjRhSDQt9C10LzQtdC70YwsINC80L3QvtCz0L7QutGA0LDRgtC90L4g0L/RgNC10LLRi9GI0LDRjtGJ0LjRhSDQv9C+INC/0LvQvtGJ0LDQtNC4INC4INC60L7Qu9C40YfQtdGB0YLQstGDINC90LDRgdC10LvQtdC90LjRjyDRgdC+0LHRgdGC0LLQtdC90L3QviDQu9C40YLQvtCy0YHQutC40LUg0LfQtdC80LvQuCwg0L/RgNC40LLQtdC70L4g0Log0L/QtdGA0LXQvdC40LzQsNC90LjRjiDQu9C40YLQvtCy0YHQutC40LzQuCDQutC90Y/Qt9GM0Y/QvNC4LCDQv9C+0LvRg9GH0LjQstGI0LjQvNC4INCy0L4g0LLQu9Cw0LTQtdC90LjQtSDRgNGD0YHRgdC60LjQtSDQt9C10LzQu9C4LCDQv9GA0LDQstC+0YHQu9Cw0LLQvdC+0Lkg0LrRg9C70YzRgtGD0YDRiyDQuCDQt9Cw0L/QsNC00L3QvtGA0YPRgdGB0LrQvtCz0L4g0Y/Qt9GL0LrQsC4g0KHQviDQstGA0LXQvNC10L3QtdC8INC30LDQv9Cw0LTQvdC+0YDRg9GB0YHQutC40Lkg0Y/Qt9GL0Log0YHRgtCw0Lsg0L7RhNC40YbQuNCw0LvRjNC90YvQvCDRj9C30YvQutC+0Lwg0LrQsNC90YbQtdC70Y/RgNC40Lgg0LLQtdC70LjQutC40YUg0LrQvdGP0LfQtdC5LiDQodC+0LHRgdGC0LLQtdC90L3QviDQu9C40YLQvtCy0YHQutC40Lkg0Y/Qt9GL0Log0LTQviBYVkkg0LLQtdC60LAg0L7RgdGC0LDQstCw0LvRgdGPINCx0LXRgdC/0LjRgdGM0LzQtdC90L3Ri9C8LCDRhdC+0YLRjyDQuCDQv9GA0L7QtNC+0LvQttCw0Lsg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDQvdCwINGN0YLQvdC40YfQtdGB0LrQuCDQu9C40YLQvtCy0YHQutC40YUg0LfQtdC80LvRj9GFLgogCi3QkiAxMzg1INCz0L7QtNGDINCy0LXQu9C40LrQuNC5INC60L3Rj9C30Ywg0LvQuNGC0L7QstGB0LrQuNC5INCv0LPQsNC50LvQviDQt9Cw0LrQu9GO0YfQuNC7INCa0YDQtdCy0YHQutGD0Y4g0YPQvdC40Y4g0YEg0JrQvtGA0L7Qu9C10LLRgdGC0LLQvtC8INCf0L7Qu9GM0YHQutC40LwuINCf0L4g0YPRgdC70L7QstC40Y/QvCDRg9C90LjQuCwg0K/Qs9Cw0LnQu9C+INC+0LHRj9C30LDQu9GB0Y8g0L/RgNC40YHQvtC10LTQuNC90LjRgtGMINCS0LXQu9C40LrQvtC1INC60L3Rj9C20LXRgdGC0LLQviDQm9C40YLQvtCy0YHQutC+0LUg0Log0JrQvtGA0L7Qu9C10LLRgdGC0LLRgyDQn9C+0LvRjNGB0LrQvtC80YMg0Lgg0LrRgNC10YHRgtC40YLRjCDQu9C40YLQvtCy0YHQutC40LUg0LfQtdC80LvQuCDQv9C+INC60LDRgtC+0LvQuNGH0LXRgdC60L7QvNGDINC+0LHRgNGP0LTRgywg0LAg0YHQsNC8INGB0YLQsNC90L7QstC40LvRgdGPINC60L7RgNC+0LvRkdC8INCf0L7Qu9GM0YjQuCDQuCDRgdC+0YXRgNCw0L3Rj9C7INGC0LjRgtGD0Lsg0LLQtdC70LjQutC+0LPQviDQutC90Y/Qt9GPINC70LjRgtC+0LLRgdC60L7Qs9C+LiDQntC00L3QsNC60L4g0LLRgdC60L7RgNC1INC+0L0g0LLRi9C90YPQttC00LXQvSDQsdGL0Lsg0YPRgdGC0YPQv9C40YLRjCDQstC70LDRgdGC0Ywg0LIg0JLQtdC70LjQutC+0Lwg0LrQvdGP0LbQtdGB0YLQstC1INCb0LjRgtC+0LLRgdC60L7QvCDRgdCy0L7QtdC80YMg0LTQstC+0Y7RgNC+0LTQvdC+0LzRgyDQsdGA0LDRgtGDINCS0LjRgtC+0LLRgtGDLiIiIjsKK9CSIDEzODUg0LPQvtC00YMg0LLQtdC70LjQutC40Lkg0LrQvdGP0LfRjCDQu9C40YLQvtCy0YHQutC40Lkg0K/Qs9Cw0LnQu9C+INC30LDQutC70Y7Rh9C40Lsg0JrRgNC10LLRgdC60YPRjiDRg9C90LjRjiDRgSDQmtC+0YDQvtC70LXQstGB0YLQstC+0Lwg0J/QvtC70YzRgdC60LjQvC4g0J/QviDRg9GB0LvQvtCy0LjRj9C8INGD0L3QuNC4LCDQr9Cz0LDQudC70L4g0L7QsdGP0LfQsNC70YHRjyDQv9GA0LjRgdC+0LXQtNC40L3QuNGC0Ywg0JLQtdC70LjQutC+0LUg0LrQvdGP0LbQtdGB0YLQstC+INCb0LjRgtC+0LLRgdC60L7QtSDQuiDQmtC+0YDQvtC70LXQstGB0YLQstGDINCf0L7Qu9GM0YHQutC+0LzRgyDQuCDQutGA0LXRgdGC0LjRgtGMINC70LjRgtC+0LLRgdC60LjQtSDQt9C10LzQu9C4INC/0L4g0LrQsNGC0L7Qu9C40YfQtdGB0LrQvtC80YMg0L7QsdGA0Y/QtNGDLCDQsCDRgdCw0Lwg0YHRgtCw0L3QvtCy0LjQu9GB0Y8g0LrQvtGA0L7Qu9GR0Lwg0J/QvtC70YzRiNC4INC4INGB0L7RhdGA0LDQvdGP0Lsg0YLQuNGC0YPQuyDQstC10LvQuNC60L7Qs9C+INC60L3Rj9C30Y8g0LvQuNGC0L7QstGB0LrQvtCz0L4uINCe0LTQvdCw0LrQviDQstGB0LrQvtGA0LUg0L7QvSDQstGL0L3Rg9C20LTQtdC9INCx0YvQuyDRg9GB0YLRg9C/0LjRgtGMINCy0LvQsNGB0YLRjCDQsiDQktC10LvQuNC60L7QvCDQutC90Y/QttC10YHRgtCy0LUg0JvQuNGC0L7QstGB0LrQvtC8INGB0LLQvtC10LzRgyDQtNCy0L7RjtGA0L7QtNC90L7QvNGDINCx0YDQsNGC0YMg0JLQuNGC0L7QstGC0YMuJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvc2t0ZXh0XzEway5kYXJ0IGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvc2t0ZXh0XzEway5kYXJ0CmluZGV4IGIxY2UyNTEuLjdkYzJkMTMgMTAwNjQ0Ci0tLSBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0L3NrdGV4dF8xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC9za3RleHRfMTBrLmRhcnQKQEAgLTcsNyArNyw3IEBACiAvLyBUaGUgbWF0ZXJpYWwgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmUtQWxpa2UKIC8vIExpY2Vuc2UgMy4wOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLwogCi1jb25zdCBTdHJpbmcgc2sgPSAiIiIKK2NvbnN0IFN0cmluZyBzayA9ICcnJwogRXNwZXJhbnRvIChww7R2b2RuZSBMaW5ndm8gSW50ZXJuYWNpYSDigJMg4oCebWVkemluw6Fyb2Ruw70gamF6eWvigJwpIGplIG5hanJvesWhw61yZW5lasWhw60gbWVkemluw6Fyb2Ruw70gcGzDoW5vdsO9IGphenlrLiBOw6F6b3YgamUgb2R2b2RlbsO9IG9kIHBzZXVkb255bXUsIHBvZCBrdG9yw71tIHYgcm9rdSAxODg3IHp2ZXJlam5pbCBsZWvDoXIgTC4gTC4gWmFtZW5ob2YgesOha2xhZHkgdG9odG8gamF6eWthLiBaw6FtZXJvbSB0dm9yY3UgYm9sbyB2eXR2b3JpxaUgxL5haGtvIG5hdcSNaXRlxL5uw70gYSBwb3XFvml0ZcS+bsO9IG5ldXRyw6FsbnkgamF6eWssIHZob2Ruw70gbmEgcG91xb5pdGllIHYgbWVkemluw6Fyb2RuZWoga29tdW5pa8OhY2lpLiBDaWXEvm9tIG5lYm9sbyBuYWhyYWRpxaUgbsOhcm9kbsOpIGphenlreSwgxI1vIGJvbG8gbmVza8O0ciBhaiBkZWtsYXJvdmFuw6kgdiBCb3Vsb25za2VqIGRla2xhcsOhY2lpLgogCiBIb2NpIMW+aWFkZW4gxaF0w6F0IG5lcHJpamFsIGVzcGVyYW50byBha28gw7pyYWRuw70gamF6eWssIHBvdcW+w612YSBobyBrb211bml0YSBzIG9kaGFkb3ZhbsO9bSBwb8SNdG9tIGhvdm9yaWFjaWNoIDEwMMKgMDAwIGHFviAywqAwMDDCoDAwMCwgeiDEjW9obyBwcmlibGnFvm5lIDLCoDAwMCB0dm9yaWEgcm9kZW7DrSBob3ZvcmlhY2kuIFYgUG/EvnNrdSBqZSBuYSB6b3puYW1lIG5lbWF0ZXJpw6FsbmVobyBrdWx0w7pybmVobyBkZWRpxI1zdHZhLiBaw61za2FsbyBhaiBpc3TDqSBtZWR6aW7DoXJvZG7DqSB1em5hbmlhLCBuYXByw61rbGFkIGR2ZSByZXpvbMO6Y2llIFVORVNDTyDEjWkgcG9kcG9ydSB6bsOhbXljaCBvc29ibm9zdMOtIHZlcmVqbsOpaG8gxb5pdm90YS4gViBzw7rEjWFzbm9zdGkgc2EgZXNwZXJhbnRvIHZ5dcW+w612YSBwcmkgY2VzdG92YW7DrSwga29yZcWhcG9uZGVuY2lpLCBtZWR6aW7DoXJvZG7DvWNoIHN0cmV0bnV0aWFjaCBhIGt1bHTDunJueWNoIHbDvW1lbsOhY2gsIGtvbmdyZXNvY2gsIHZlZGVja8O9Y2ggZGlza3VzacOhY2gsIHYgcMO0dm9kbmVqIGFqIHByZWtsYWRvdmVqIGxpdGVyYXTDunJlLCBkaXZhZGxlIGEga2luZSwgaHVkYmUsIHRsYcSNZW5vbSBhaiBpbnRlcm5ldG92b20gc3ByYXZvZGFqc3R2ZSwgcm96aGxhc292b20gYSB0ZWxldsOtem5vbSB2eXNpZWxhbsOtLgpAQCAtNDMsNCArNDMsNCBAQAogCiBQbyBwcnZlaiBzdmV0b3ZlaiB2b2puZSBzYSBvYmEgcHJhxb5za8OpIHNwb2xreSB6bMO6xI1pbGkgZG8gIsSMZXNrb3Nsb3ZlbnNrZWogRXNwZXJhbnRza2VqIEFzb2Npw6FjaWUiLiBUw6EgYm9sYSB2IHJva3UgMTkzNiBwcmVtZW5vdmFuw6EgbmEgIkVzcGVyYW50c2vDuiBBc29jacOhY2l1IHYgxIxlc2tvc2xvdmVuc2tlaiByZXB1Ymxpa2UiLiBWIHRvbXRvIG9iZG9iw60gYm9sbyBobnV0aWUgdmXEvm1pIGFrdMOtdm5lLCBmdW5nb3ZhbG8gbW5vaG8ga2x1Ym92LCBrb25hbG8gc2EgdmXEvmEgcHJlZG7DocWhb2sgYSBrdXJ6b3YuIEVzcGVyYW50byBib2xvIHZ5dcSNb3ZhbsOpIG5hIMWha29sw6FjaCByw7R6bnljaCBzdHVwxYhvdiwgcsOhZGlvIEJyYXRpc2xhdmEgb2QgMTkzMCB2eXNpZWxhbG8ga3VyenkgYSBvZCAxOTMyIGFqIGt1bHTDunJueSBwcm9ncmFtIHYgZXNwZXJhbnRlLiBCb2xhIHZ5ZGFuw6EgIsSMZXNrb3Nsb3ZlbnNrw6EgYW50b2zDs2dpYSIgcHJlZHN0YXZ1asO6Y2EgZGllbGEgMjAgc2xvdmVuc2vDvWNoIGF1dG9yb3YuIFYgcsOhbWNpIHByb3RpZmHFoWlzdGlja2VqIGFrdGl2aXR5IHZ5Y2jDoWR6YWxpIGFqIHByZWtsYWR5IHByb3RpZmHFoWlzdGlja8O9Y2ggxI1sw6Fua292IHogZXNwZXJhbnRza8O9Y2ggxI1hc29waXNvdiB6IG9iZG9iaWEgxaBwYW5pZWxza2VqIG9ixI1pYW5za2VqIHZvam55LgogCi1EcnVow6Egc3ZldG92w6Egdm9qbmEgdXRsbWlsYSBlc3BlcmFudHNrw6kgaG51dGllLiBCcmF0aXNsYXZza8O9IGVzcGVyYW50c2vDvSBrbHViIHBvxb5pYWRhbCBvIHptZW51IMWhdGF0w7p0dSBhIHJvesWhw61yZW5pZSBwb8S+YSBww7Rzb2Jub3N0aSBuYSBjZWzDuiB2dGVkYWrFoWl1IFNsb3ZlbnNrw7ogcmVwdWJsaWt1IGEgbsOhc2xlZG5lIHNhIHN0YWwgc3RyZWRpc2tvbSBlc3BlcmFudHNrw6lobyBobnV0aWEgbmEgU2xvdmVuc2t1LiIiIjsKK0RydWjDoSBzdmV0b3bDoSB2b2puYSB1dGxtaWxhIGVzcGVyYW50c2vDqSBobnV0aWUuIEJyYXRpc2xhdnNrw70gZXNwZXJhbnRza8O9IGtsdWIgcG/FvmlhZGFsIG8gem1lbnUgxaF0YXTDunR1IGEgcm96xaHDrXJlbmllIHBvxL5hIHDDtHNvYm5vc3RpIG5hIGNlbMO6IHZ0ZWRhasWhaXUgU2xvdmVuc2vDuiByZXB1Ymxpa3UgYSBuw6FzbGVkbmUgc2Egc3RhbCBzdHJlZGlza29tIGVzcGVyYW50c2vDqWhvIGhudXRpYSBuYSBTbG92ZW5za3UuJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvemh0ZXh0XzEway5kYXJ0IGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvemh0ZXh0XzEway5kYXJ0CmluZGV4IGRjODFjNmQ2Li5iNWUyYTU0IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydC96aHRleHRfMTBrLmRhcnQKKysrIGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQvemh0ZXh0XzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIHpoID0gIiIiCitjb25zdCBTdHJpbmcgemggPSAnJycKIOacgOewoeWWrueahOa8ouWtl+WPquacieS4gOeslOeUu++8jOS9huWNu+S4jeatouS4gOWAi+Wtl++8mumZpOS6huOAjOS4gOOAjeWtl+S7peWklu+8jOOAjOS5meOAjeOAgeOAjOOAh+OAjeOAgeOAjOS4tuOAjeOAgeOAjOS4qOOAjeOAgeOAjOS6heOAjeOAgeOAjOS4v+OAjeOAgeOAjOS5gOOAjeOAgeOAjOS5geOAjeOAgeOAjPCghIzjgI3jgIHjgIzwoIOL44CN44CB44CM8KCDieOAjeOAgeOAjPCgg4rjgI3jgIHjgIzkuZrjgI3nrYnpg73mmK/mvKLlrZfvvIzogIzkuJTpg73mnInlkIToh6rnmoToroDpn7PjgIIKIAog5Lit5paH5rGJ5a2X5Lit77yM56yU55S75pyA5aSa55qE5rGJ5a2X5Y+v6IO95piv4oCc4oCd77yM5piv5LiA56eN6Z2i6aOf55qE5ZCN56ew77yM5q2k5a2X6Iez5LuK5Lmg55So77yM5YW25LiN5ZCM5YaZ5rOV55qE56yU55S75pWw5ZyoNTToh7M3MeeUu+S5i+mXtOS4jeetieOAguiiq+S8oOe7n+i+nuWFuOaUtuW9leeahOeslOeUu+acgOWkmueahOaxieWtl+S4uuOAiuWtl+axh+ihpeOAi+OAgeOAiuaxieivreWkp+Wtl+WFuOOAi+S4reeUseWbm+S4quKAnC176b6NfS3igJ3lrZfnu4TmiJDnmoTjgIzjgI3lrZfvvIzlhbE2NOeUu++8m+WQjOaoo+WxrOaWvDY05YqD55qE5a2X55Sx5Zub5YCL4oCcLXvoiIh9LeKAneWtl+e1hOaIkOeahOKAnPCglLvigJ3lrZfvvIzmlLblhaXoh6rjgIrkuK3mloflpKfovq3lhbjjgIvvvJvkuYvlvoznmoTmmK/nlLHlm5vlgIvjgIzpm7fjgI3lrZfntYTmiJDnmoTigJzkqLvigJ3lrZfvvIzmnIk1MuWKg++8jOaUtumMhOaWvOOAiuiqquaWh+ino+Wtl+OAi+OAggpAQCAtNzAsNCArNzAsNCBAQAogCiDpmo/nnYDlkITnp43kuK3mlofovpPlhaXms5XnmoTlh7rnjrDvvIzmsYnlrZfnmoTorqHnrpfmnLrovpPlhaXjgIHlrZjlgqjjgIHovpPlh7rmioDmnK/lvpfliLDkuobln7rmnKzop6PlhrPvvIzlpKflpKfmj5Dpq5jkuobkuK3mloflhpnkvZzjgIHlh7rniYjjgIHkv6Hmga/mo4DntKLnrYnnmoTmlYjnjofjgILnm67liY3kuK3mlofovpPlhaXms5XmnInkuIrljYPnp43kuYvlpJrvvIzkuLvopoHljIXmi6zooajpn7PovpPlhaXlkozooajlvaLovpPlhaXkuKTnsbvvvIzkuZ/mnInkuKTogIXlhbzkuYvnmoTjgILmsYnlrZfnmoTor63pn7PovpPlhaXjgIHmiYvlhpnor4bliKvlkozlhYnlrablrZfnrKbor4bliKvvvIhPQ1LvvInmioDmnK/kuZ/lt7LlvpfliLDlub/ms5vlupTnlKjjgIIKIAot5aaC5pS25b2V5pWw5Y2D5a2X55qER0LCoDIzMTLvvIjkuK3lnIvlpKfpmbjvvInjgIFCIiIiOwor5aaC5pS25b2V5pWw5Y2D5a2X55qER0LCoDIzMTLvvIjkuK3lnIvlpKfpmbjvvInjgIFCJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL1V0ZjhEZWNvZGUuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9VdGY4RGVjb2RlLmRhcnQKaW5kZXggYTFiNDIzZC4uN2JlM2E4ZiAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL1V0ZjhEZWNvZGUuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvVXRmOERlY29kZS5kYXJ0CkBAIC0yNiwxMSArMjYsMTEgQEAKICAgaW50IHRvdGFsT3V0cHV0U2l6ZTsKIAogICBzdGF0aWMgU3RyaW5nIF9tYWtlTmFtZShTdHJpbmcgbGFuZ3VhZ2UsIGludCBzaXplLCBib29sIGFsbG93TWFsZm9ybWVkKSB7Ci0gICAgU3RyaW5nIG5hbWUgPSAiVXRmOERlY29kZS4kbGFuZ3VhZ2UuIjsKKyAgICBTdHJpbmcgbmFtZSA9ICdVdGY4RGVjb2RlLiRsYW5ndWFnZS4nOwogICAgIG5hbWUgKz0gc2l6ZSA+PSAxMDAwMDAwCi0gICAgICAgID8gIiR7c2l6ZSB+LyAxMDAwMDAwfU0iCi0gICAgICAgIDogc2l6ZSA+PSAxMDAwID8gIiR7c2l6ZSB+LyAxMDAwfWsiIDogIiRzaXplIjsKLSAgICBpZiAoYWxsb3dNYWxmb3JtZWQpIG5hbWUgKz0gIi5tYWxmb3JtZWQiOworICAgICAgICA/ICcke3NpemUgfi8gMTAwMDAwMH1NJworICAgICAgICA6IHNpemUgPj0gMTAwMCA/ICcke3NpemUgfi8gMTAwMH1rJyA6ICckc2l6ZSc7CisgICAgaWYgKGFsbG93TWFsZm9ybWVkKSBuYW1lICs9ICcubWFsZm9ybWVkJzsKICAgICByZXR1cm4gbmFtZTsKICAgfQogCkBAIC0zOSw5ICszOSw5IEBACiAKICAgQG92ZXJyaWRlCiAgIHZvaWQgc2V0dXAoKSB7Ci0gICAgVWludDhMaXN0IGRhdGEgPSB1dGY4LmVuY29kZSh0ZXh0KSBhcyBVaW50OExpc3Q7CisgICAgZmluYWwgVWludDhMaXN0IGRhdGEgPSB1dGY4LmVuY29kZSh0ZXh0KSBhcyBVaW50OExpc3Q7CiAgICAgaWYgKGRhdGEubGVuZ3RoICE9IDEwMDAwKSB7Ci0gICAgICB0aHJvdyAiRXhwZWN0ZWQgaW5wdXQgZGF0YSBvZiBleGFjdGx5IDEwMDAwIGJ5dGVzLiI7CisgICAgICB0aHJvdyAnRXhwZWN0ZWQgaW5wdXQgZGF0YSBvZiBleGFjdGx5IDEwMDAwIGJ5dGVzLic7CiAgICAgfQogICAgIGlmIChzaXplIDwgZGF0YS5sZW5ndGgpIHsKICAgICAgIC8vIFNwbGl0IGludG8gY2h1bmtzLgpAQCAtODMsNyArODMsNyBAQAogICAgICAgbGVuZ3RoU3VtICs9IHMubGVuZ3RoOwogICAgIH0KICAgICBpZiAobGVuZ3RoU3VtICE9IHRvdGFsT3V0cHV0U2l6ZSkgewotICAgICAgdGhyb3cgIk91dHB1dCBsZW5ndGggZG9lc24ndCBtYXRjaCBleHBlY3RlZC4iOworICAgICAgdGhyb3cgJ091dHB1dCBsZW5ndGggZG9lc25cJ3QgbWF0Y2ggZXhwZWN0ZWQuJzsKICAgICB9CiAgIH0KIApAQCAtMTA4LDIxICsxMDgsMjEgQEAKICAgdm9pZCByZXBvcnQoKSB7CiAgICAgLy8gUmVwb3J0IHRpbWUgaW4gbmFub3NlY29uZHMuCiAgICAgZmluYWwgZG91YmxlIHNjb3JlID0gbWVhc3VyZSgpICogMTAwMC4wOwotICAgIHByaW50KCIkbmFtZShSdW5UaW1lKTogJHNjb3JlIG5zLiIpOworICAgIHByaW50KCckbmFtZShSdW5UaW1lKTogJHNjb3JlIG5zLicpOwogICB9CiB9CiAKIHZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgewogICBjb25zdCB0ZXh0cyA9IHsKLSAgICAiZW4iOiBlbiwKLSAgICAiZGEiOiBkYSwKLSAgICAic2siOiBzaywKLSAgICAicnUiOiBydSwKLSAgICAibmUiOiBuZSwKLSAgICAiemgiOiB6aCwKKyAgICAnZW4nOiBlbiwKKyAgICAnZGEnOiBkYSwKKyAgICAnc2snOiBzaywKKyAgICAncnUnOiBydSwKKyAgICAnbmUnOiBuZSwKKyAgICAnemgnOiB6aCwKICAgfTsKICAgZmluYWwgYm9vbCB0ZXN0TWFsZm9ybWVkID0KLSAgICAgIGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmlzTm90RW1wdHkgJiYgYXJncy5maXJzdCA9PSAibWFsZm9ybWVkIjsKKyAgICAgIGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmlzTm90RW1wdHkgJiYgYXJncy5maXJzdCA9PSAnbWFsZm9ybWVkJzsKICAgZmluYWwgYmVuY2htYXJrcyA9IFsKICAgICAvLyBPbmx5IGJlbmNobWFyayB3aXRoIGFsbG93TWFsZm9ybWVkOiBmYWxzZSB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZS4KICAgICBmb3IgKGJvb2wgYWxsb3dNYWxmb3JtZWQgaW4gW2ZhbHNlLCBpZiAodGVzdE1hbGZvcm1lZCkgdHJ1ZV0pCkBAIC0xMzEsNSArMTMxLDcgQEAKICAgICAgICAgICAoKSA9PiBVdGY4RGVjb2RlKGxhbmd1YWdlLCB0ZXh0c1tsYW5ndWFnZV0sIHNpemUsIGFsbG93TWFsZm9ybWVkKQogICBdOwogCi0gIGJlbmNobWFya3MuZm9yRWFjaCgoYm0pID0+IGJtKCkucmVwb3J0KCkpOworICBmb3IgKHZhciBibSBpbiBiZW5jaG1hcmtzKSB7CisgICAgYm0oKS5yZXBvcnQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL2RhdGV4dF9sYXRpbjFfMTBrLmRhcnQgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvZGF0ZXh0X2xhdGluMV8xMGsuZGFydAppbmRleCA4NjZmZjgzLi5iY2U2YzgwIDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvZGF0ZXh0X2xhdGluMV8xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvZGF0ZXh0X2xhdGluMV8xMGsuZGFydApAQCAtNyw3ICs3LDcgQEAKIC8vIFRoZSBtYXRlcmlhbCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZS1BbGlrZQogLy8gTGljZW5zZSAzLjA6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAvCiAKLWNvbnN0IFN0cmluZyBkYSA9ICIiIgorY29uc3QgU3RyaW5nIGRhID0gJycnCiBBbmRlcnMgQW5kCiAKIEFuZGVycyBGYXVudGxlcm95IEFuZCBlciBlbiBiZXLDuG10IGZpZ3VyIGkgRGlzbmV5cyB0ZWduZWZpbG0gb2cgdGVnbmVzZXJpZXIuIFNlbHYgb20gaGFuIGlra2UgZXIgc8OmcmxpZ3QgcG9wdWzDpnIgaSBVU0EsIG9wdHLDpmRlciBoYW4gaSBtYW5nZSB1Z2VibGFkZSBpIEV1cm9wYTogSSBOb3JnZSwgVHlza2xhbmQsIFN2ZXJpZ2UsIERhbm1hcmssIEhvbGxhbmQsIEl0YWxpZW4gbWVkIGZsZXJlLiBIYW5zIGbDuHJzdGUgb3B0csOmZGVuIHZhciBpIHRlZ25lZmlsbWVuICJUaGUgV2lzZSBMaXR0bGUgSGVuIiAoRGVuIGtsb2dlIGxpbGxlIGjDuG5lKSBmcmEgOS4ganVuaSAxOTM0LiBIYW5zIGthcmFrdGVyaXN0aXNrZSBzdGVtbWUgYmxldiBpbmR0YWx0IGFmIHJhZGlva29taWtlcmVuIENsYXJlbmNlIE5hc2gsIGRlciBzaWRlbiBmYXN0IGxhZ2RlIHN0ZW1tZSB0aWwuCkBAIC01OSw0ICs1OSw0IEBACiBTZXJpZW4gZmlrIGVuIGZvcm55ZWxzZSBpIDIwMDEsIGh2aWxrZXQgw6ZuZHJlZGUgbWFya2FudCBww6UgaGlzdG9yaWVybmUuIEV2ZXJldHQgRHVja2xhaXIgdmVuZGVyIHRpbGJhZ2UsIHNsdWtrZXIgR2xvYnVzLCBzbWlkZXIgU3TDpWxhbmRlbiB1ZCBhZiBEdWNrbGFpciBUb3dlciBvZyBnZW5vcHJldHRlciBzaXQgZ2FtbGUgaW1wZXJpdW0uIFVuZGVydmVqcyBibGl2ZXIgRHVja2xhaXIncyB0byBkw7h0cmUgYWZzbMO4cmV0LiBEZSBoYWRlciBiZWdnZSBFdmVyZXR0IGFmIGdydW5kZSwgZGVyIGlra2UgYmxpdmVyIGFmc2zDuHJldCB0aWwgZnVsZGUsIHNlbHZvbSBkZXQgYmxpdmVyIGFudHlkZXQsIGF0IEV2ZXJldHQgc2tpbHRlIHNpZyBhZiBtZWQgZGVyZXMgbW9yIHDDpSBlbiBlbGxlciBhbmRlbiBtw6VkZS4KIERlbm5lIGZvcm55ZWxzZSBob2xkdCAxOCBudW1yZSwgZsO4ciBzZXJpZW4gYmxldiBhZnNsdXR0ZXQsIGRvZyB1ZGVuIGF0IGhpc3Rvcmllcm5lIGZpayBlbiBzbHV0bmluZy4KIAotQmFya3MtaGlzdG9yaWVuICJBbmRlcnMgQW5kIG9nIGRlbiBneWxkbmUgaGplbG0iIGZyYSAxOTU0IGtvbSBpIDIwMDYgbWVkIGkgIiIiOworQmFya3MtaGlzdG9yaWVuICJBbmRlcnMgQW5kIG9nIGRlbiBneWxkbmUgaGplbG0iIGZyYSAxOTU0IGtvbSBpIDIwMDYgbWVkIGkgJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL2VudGV4dF9hc2NpaV8xMGsuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9lbnRleHRfYXNjaWlfMTBrLmRhcnQKaW5kZXggOTM1M2Q2ZC4uODJjYjcyMSAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL2VudGV4dF9hc2NpaV8xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvZW50ZXh0X2FzY2lpXzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIGVuID0gIiIiCitjb25zdCBTdHJpbmcgZW4gPSAnJycKIEFuYXJjaGlzbQogCiBBbmFyY2hpc20gaXMgYSByYWRpY2FsIHBvbGl0aWNhbCBtb3ZlbWVudCB0aGF0IGlzIGhpZ2hseSBza2VwdGljYWwgdG93YXJkcyBhdXRob3JpdHkgYW5kIHJlamVjdHMgYWxsIGZvcm1zIG9mIHVuanVzdCBoaWVyYXJjaHkuIEl0IGNhbGxzIGZvciB0aGUgYWJvbGl0aW9uIG9mIHRoZSBzdGF0ZSB3aGljaCBpdCBob2xkcyB0byBiZSB1bmRlc2lyYWJsZSwgdW5uZWNlc3NhcnksIGFuZCBoYXJtZnVsLiBBbmFyY2hpc20gYWR2b2NhdGVzIGZvciB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIHN0YXRlIHdpdGggc3RhdGVsZXNzIHNvY2lldGllcyBvciBvdGhlciBmb3JtcyBvZiBmcmVlIGFzc29jaWF0aW9ucy4KQEAgLTMyLDQgKzMyLDQgQEAKIEF0IHRoZSB0dXJuaW5nIG9mIHRoZSBjZW50dXJ5LCBhbmFyY2hpc20gaGFkIHNwcmVhZCBhbGwgb3ZlciB0aGUgd29ybGQuIEluIENoaW5hLCBzbWFsbCBncm91cHMgb2Ygc3R1ZGVudHMgaW1wb3J0ZWQgdGhlIGh1bWFuaXN0aWMgcHJvLXNjaWVuY2UgdmVyc2lvbiBvZiBhbmFyY2hvLWNvbW11bmlzbS4gVG9reW8gd2FzIGEgaG90c3BvdCBmb3IgcmViZWxsaW91cyB5b3V0aCBmcm9tIGNvdW50cmllcyBvZiB0aGUgZmFyIGVhc3QsIHBvdXJpbmcgaW50byB0aGUgSmFwYW5lc2UgY2FwaXRhbCB0byBzdHVkeS4gSW4gTGF0aW4gQW1lcmljYSwgU28gUGF1bG8gd2FzIGEgc3Ryb25naG9sZCBmb3IgYW5hcmNoby1zeW5kaWNhbGlzbSB3aGVyZSBpdCBiZWNhbWUgdGhlIG1vc3QgcHJvbWluZW50IGxlZnQtd2luZyBpZGVvbG9neS4gRHVyaW5nIHRoaXMgdGltZSwgYSBtaW5vcml0eSBvZiBhbmFyY2hpc3RzIGFkb3B0ZWQgdGFjdGljcyBvZiByZXZvbHV0aW9uYXJ5IHBvbGl0aWNhbCB2aW9sZW5jZS4gVGhpcyBzdHJhdGVneSBiZWNhbWUga25vd24gYXMgcHJvcGFnYW5kYSBvZiB0aGUgZGVlZC4gVGhlIGRpc21lbWJlcm1lbnQgb2YgdGhlIEZyZW5jaCBzb2NpYWxpc3QgbW92ZW1lbnQgaW50byBtYW55IGdyb3VwcyBhbmQgdGhlIGV4ZWN1dGlvbiBhbmQgZXhpbGUgb2YgbWFueSBDb21tdW5hcmRzIHRvIHBlbmFsIGNvbG9uaWVzIGZvbGxvd2luZyB0aGUgc3VwcHJlc3Npb24gb2YgdGhlIFBhcmlzIENvbW11bmUgZmF2b3VyZWQgaW5kaXZpZHVhbGlzdCBwb2xpdGljYWwgZXhwcmVzc2lvbiBhbmQgYWN0cy4gRXZlbiB0aG91Z2ggbWFueSBhbmFyY2hpc3RzIGRpc3RhbmNlZCB0aGVtc2VsdmVzIGZyb20gdGhlc2UgdGVycm9yaXN0IGFjdHMsIGluZmFteSBjYW1lIHVwb24gdGhlIG1vdmVtZW50LiBJbGxlZ2FsaXNtIHdhcyBhbm90aGVyIHN0cmF0ZWd5IHdoaWNoIHNvbWUgYW5hcmNoaXN0cyBhZG9wdGVkIHRoZXNlIHNhbWUgeWVhcnMuCiBBbmFyY2hpc3RzIGVudGh1c2lhc3RpY2FsbHkgcGFydGljaXBhdGVkIGluIHRoZSBSdXNzaWFuIFJldm9sdXRpb25kZXNwaXRlIGNvbmNlcm5zaW4gb3Bwb3NpdGlvbiB0byB0aGUgV2hpdGVzLiBIb3dldmVyLCB0aGV5IG1ldCBoYXJzaCBzdXBwcmVzc2lvbiBhZnRlciB0aGUgQm9sc2hldmlrIGdvdmVybm1lbnQgd2FzIHN0YWJpbGl6ZWQuIFNldmVyYWwgYW5hcmNoaXN0cyBmcm9tIFBldHJvZ3JhZCBhbmQgTW9zY293IGZsZWQgdG8gVWtyYWluZSwgbm90YWJseSBsZWFkaW5nIHRvIHRoZSBLcm9uc3RhZHQgcmViZWxsaW9uIGFuZCBOZXN0b3IgTWFraG5vJ3Mgc3RydWdnbGUgaW4gdGhlIEZyZWUgVGVycml0b3J5LiBXaXRoIHRoZSBhbmFyY2hpc3RzIGJlaW5nIGNydXNoZWQgaW4gUnVzc2lhLCB0d28gbmV3IGFudGl0aGV0aWNhbCBjdXJyZW50cyBlbWVyZ2VkLCBuYW1lbHkgcGxhdGZvcm1pc20gYW5kIHN5bnRoZXNpcyBhbmFyY2hpc20uIFRoZSBmb3JtZXIgc291Z2h0IHRvIGNyZWF0ZSBhIGNvaGVyZW50IGdyb3VwIHRoYXQgd291bGQgcHVzaCBmb3IgdGhlIHJldm9sdXRpb24gd2hpbGUgdGhlIGxhdHRlciB3ZXJlIGFnYWluc3QgYW55dGhpbmcgdGhhdCB3b3VsZCByZXNlbWJsZSBhIHBvbGl0aWNhbCBwYXJ0eS4gU2VlaW5nIHRoZSB2aWN0b3JpZXMgb2YgdGhlIEJvbHNoZXZpa3MgaW4gdGhlIE9jdG9iZXIgUmV2b2x1dGlvbiBhbmQgdGhlIHJlc3VsdGluZyBSdXNzaWFuIENpdmlsIFdhciwgbWFueSB3b3JrZXJzIGFuZCBhY3RpdmlzdHMgdHVybmVkIHRvIGNvbW11bmlzdCBwYXJ0aWVzIHdoaWNoIGdyZXcgYXQgdGhlIGV4cGVuc2Ugb2YgYW5hcmNoaXNtIGFuZCBvdGhlciBzb2NpYWxpc3QgbW92ZW1lbnRzLiBJbiBGcmFuY2UgYW5kIHRoZSBVbml0ZWQgU3RhdGVzLCBtZW1iZXJzIG9mIG1ham9yIHN5bmRpY2FsaXN0IG1vdmVtZW50cywgdGhlIEdlbmVyYWwgQ29uZmVkZXJhdGlvbiBvZiBMYWJvdXIgYW5kIEluZHVzdHJpYWwgV29ya2VycyBvZiB0aGUgV29ybGQsIGxlZnQgdGhlaXIgb3JnYW5pc2F0aW9ucyBhbmQgam9pbmVkIHRoZSBDb21tdW5pc3QgSW50ZXJuYXRpb25hbC4KIAotSW4gdGhlIFNwYW5pc2ggQ2l2aWwgV2FyLCBhbmFyY2hpc3RzIGFuZCBzeW5kaWNhbGlzdHMgKENOVCBhbmQgRkFJKSBvbmNlIGFnYWluIGFsbGllZCB0aGVtc2VsdmVzIHdpdGggdmFyaW91cyBjdXJyZW50cyBvZiBsZWZ0aXN0cy4gQSBsb25nIHRyYWRpdGlvbiBvZiBTcGFuaXNoIGFuYXJjaGlzbSBsZWQgdG8gYW5hcmNoaXN0cyBwbGF5aW5nIGEgcGl2b3RhbCByb2xlIGluIHRoZSB3YXIuIEluIHJlc3BvbnNlIHRvIHRoZSBhcm15IHJlYmVsbGlvbiwgYW4gYW5hcmNoaXN0LWluc3BpcmVkIG1vdmVtZW50IG9mIHBlYXNhbnRzIGFuZCB3b3JrZXJzLCBzdXBwb3J0ZWQgYnkgYXJtZWQgbWlsaXRpYXMsIHRvb2sgY29udHJvbCBvZiBCYXJjZWxvbmEgYW5kIG9mIGxhcmdlIGFyZWFzIG9mIHJ1cmFsIFNwYWluIHdoZXJlIHRoZXkgY29sbGVjdGl2aXNlZCAiIiI7CitJbiB0aGUgU3BhbmlzaCBDaXZpbCBXYXIsIGFuYXJjaGlzdHMgYW5kIHN5bmRpY2FsaXN0cyAoQ05UIGFuZCBGQUkpIG9uY2UgYWdhaW4gYWxsaWVkIHRoZW1zZWx2ZXMgd2l0aCB2YXJpb3VzIGN1cnJlbnRzIG9mIGxlZnRpc3RzLiBBIGxvbmcgdHJhZGl0aW9uIG9mIFNwYW5pc2ggYW5hcmNoaXNtIGxlZCB0byBhbmFyY2hpc3RzIHBsYXlpbmcgYSBwaXZvdGFsIHJvbGUgaW4gdGhlIHdhci4gSW4gcmVzcG9uc2UgdG8gdGhlIGFybXkgcmViZWxsaW9uLCBhbiBhbmFyY2hpc3QtaW5zcGlyZWQgbW92ZW1lbnQgb2YgcGVhc2FudHMgYW5kIHdvcmtlcnMsIHN1cHBvcnRlZCBieSBhcm1lZCBtaWxpdGlhcywgdG9vayBjb250cm9sIG9mIEJhcmNlbG9uYSBhbmQgb2YgbGFyZ2UgYXJlYXMgb2YgcnVyYWwgU3BhaW4gd2hlcmUgdGhleSBjb2xsZWN0aXZpc2VkICcnJzsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9uZXRleHRfM18xMGsuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9uZXRleHRfM18xMGsuZGFydAppbmRleCBiZTUzYmMzLi44ZmNlNTUwIDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvbmV0ZXh0XzNfMTBrLmRhcnQKKysrIGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL25ldGV4dF8zXzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIG5lID0gIiIiCitjb25zdCBTdHJpbmcgbmUgPSAnJycKIOCkqOClh+CkquCkvuCksgogCiDgpKjgpYfgpKrgpL7gpLIgKOCkhuCkp+Ckv+CkleCkvuCksOCkv+CklSDgpKjgpL7gpK46IOCkuOCkmeCljeCkmOClgOCkryDgpLLgpYvgpJXgpKTgpL7gpKjgpY3gpKTgpY3gpLDgpL/gpJUg4KSX4KSj4KSk4KSo4KWN4KSk4KWN4KSwIOCkqOClh+CkquCkvuCksikg4KSm4KSV4KWN4KS34KS/4KSjIOCkj+CkuOCkv+Ckr+CkvuCksuClgCDgpK3gpYLgpKrgpLDgpL/gpLXgpYfgpLfgpY3gpKDgpL/gpKQg4KS54KS/4KSu4KS+4KSy4KWAIOCksOCkvuCkt+CljeCkn+CljeCksCDgpLngpYsg4KWkIOCkr+CkuOCkleCliyDgpK3gpYzgpJfgpYvgpLLgpL/gpJUg4KSF4KSV4KWN4KS34KS+4KSC4KS2IOClqOClrCDgpKHgpL/gpJfgpY3gpLDgpYAg4KWo4KWoIOCkruCkv+CkqOClh+Ckn+CkpuClh+CkluCkvyDgpangpaYg4KSh4KS/4KSX4KWN4KSw4KWAIOClqOClrSDgpK7gpL/gpKjgpYfgpJ8g4KSJ4KSk4KWN4KSk4KSwIOCksCDgpa7gpaYg4KSh4KS/4KSX4KWN4KSw4KWAIOClqiDgpK7gpL/gpKjgpYfgpJ/gpKbgpYfgpJbgpL8g4KWu4KWuIOCkoeCkv+Ckl+CljeCksOClgCDgpafgpagg4KSu4KS/4KSo4KWH4KSfIOCkquClguCksOCljeCkteClgCDgpKbgpYfgpLbgpL7gpKjgpY3gpKTgpLDgpLjgpK7gpY3gpK4g4KSr4KWI4KSy4KS/4KSP4KSV4KWLIOCkmyDgpaQg4KSv4KS44KSV4KWLIOCkleClguCksiDgpJXgpY3gpLfgpYfgpKTgpY3gpLDgpKvgpLIg4KWnLOClquClrSzgpafgpa7gpacg4KS14KSw4KWN4KSXIOCkleCkvy7gpK7gpL8g4KSbIOClpCDgpK/gpYsg4KSV4KWN4KS34KWH4KSk4KWN4KSw4KSr4KSyIOCkquClg+CkpeCljeCkteClgOCkleCliyDgpJXgpYLgpLIg4KSV4KWN4KS34KWH4KSk4KWN4KSw4KSr4KSy4KSV4KWLIOClpi7gpabgpaklIOCksCDgpI/gpLjgpL/gpK/gpL4g4KSu4KS54KS+4KSm4KWH4KS24KSV4KWLIOClpi7gpaklIOCkquCksOCljeCkpuCkmyDgpaQg4KSy4KSj4KWN4KSh4KSoIOCkuOCljeCkpeCkv+CkpCAi4KSX4KWN4KSw4KWA4KSo4KS14KWA4KSaIOCkruCkv+CkqOCkn+CkvuCkh+CkriIg4KSt4KSo4KWN4KSm4KS+IOCkquClguCksOCljeCkteCkpOCksOCljeCkqyDgpLDgpLngpYfgpJXgpYvgpLLgpYcg4KSX4KWM4KSw4KWA4KS24KSZ4KWN4KSV4KSwIOCkueCkv+CkruCkvuCksuCkleCliyDgpKjgpJzgpL/gpJUg4KSt4KSP4KSwIOCknOCkvuCkqOClhyDgpa7gpawg4KSh4KS/4KSX4KWN4KSw4KWAIOClp+ClqyDgpK7gpL/gpKjgpYfgpJ8g4KSq4KWC4KSw4KWN4KS14KWAIOCkpuClh+CktuCkvuCkqOCljeCkpOCksOCksuCkvuCkiCDgpIbgpKfgpL7gpLAg4KSu4KS+4KSo4KWAIOCkqOClh+CkquCkvuCksuCkleCliyDgpKrgpY3gpLDgpK7gpL7gpKPgpL/gpJUg4KS44KSu4KSvIOClqyDgpJjgpKPgpY3gpJ/gpL4g4KWq4KWrIOCkruCkv+CkqOClh+CknyDgpIbgpJfgpL7gpKHgpL8g4KSu4KS+4KSo4KS/4KSP4KSV4KWLIOCkmyDgpaQKQEAgLTIxLDQgKzIxLDQgQEAKIOCkueCkv+CkruCkvuCksuCkryDgpJXgpY3gpLfgpYfgpKTgpY3gpLDgpK7gpL4g4KSu4KS+4KSo4KS/4KS44KS54KSw4KWCIOCkrOCkuOCljeCkqCDgpKXgpL7gpLLgpYfgpJXgpYsg4KSV4KSu4KWN4KSk4KS/4KSu4KS+IOCkquCkqOCkvyDgpa8s4KWm4KWm4KWmIOCkteCksOCljeCktyDgpK3gpI/gpJXgpYsg4KSV4KWB4KSw4KS+IOCkleCkvuCkoOCkruCkvuCkoeCljOCkgiDgpIngpKrgpKTgpY3gpK/gpJXgpL7gpK7gpL4g4KSq4KS+4KSH4KSP4KSV4KS+IOCkquCljeCksOCkvuCkmuClgOCkqCDgpJTgpJzgpL7gpLDgpLngpLDgpYLgpKzgpL7gpJ8g4KSq4KWB4KS34KWN4KSf4KS/IOCkueClgeCkqOCljeCkm+ClpCDgpLjgpK7gpY3gpK3gpLXgpKQ6IOCkreCli+Ckny3gpKzgpLDgpY3gpK7gpYfgpLLgpYAg4KSu4KWC4KSy4KSV4KS+IOCkruCkvuCkqOCkv+CkuOCkueCksOClgiDgpKjgpYfgpKrgpL7gpLLgpK7gpL4g4KWoLOClq+ClpuClpiDgpLXgpLDgpY3gpLcg4KSF4KSX4KS+4KSh4KS/IOCkrOCkuOCli+CkrOCkvuCkuCDgpJfgpLDgpY3gpKbgpKXgpYfgpaQgCiAKIOCkiOCktuCkvuCkquClguCksOCljeCktSDgpafgpavgpabgpaYg4KSk4KS/4KSwIOCkh+CkqOCljeCkoeCliy3gpIbgpLDgpY3gpK/gpKgg4KSc4KS+4KSk4KS/4KS54KSw4KWCIOCkieCkquCkpOCljeCkr+CkleCkviDgpKrgpY3gpLDgpLXgpYfgpLYg4KSX4KSw4KWH4KWkIOCkiOCktuCkvuCkquClguCksOCljeCkteCkleCliyDgpafgpabgpabgpaYg4KSk4KS/4KSwIOCkuC3gpLjgpL7gpKjgpL4g4KSw4KS+4KSc4KWN4KSv4KS54KSw4KWCIOCksCDgpLDgpL7gpJzgpY3gpK/gpLjgpJngpY3gpJfgpKDgpKjgpLngpLDgpYIg4KSs4KSo4KWH4KWkIOCkuOCkv+CkpuCljeCkp+CkvuCksOCljeCkpSDgpJfgpYzgpKTgpK4gKOCkiOCktuCkvuCkquClguCksOCljeCktSDgpavgpazgpanigJPgpargpa7gpakpIOCkpOCljeCkr+CkuOCljeCkpOCliCDgpI/gpJUg4KS14KSC4KS2LCDgpLbgpL7gpJXgpY3gpK/gpLXgpILgpLbgpJXgpL4g4KSw4KS+4KSc4KSV4KWB4KSu4KS+4KSwIOCkpeCkv+Ckjywg4KSc4KS44KSy4KWHIOCkhuCkq+CljeCkqOCliyDgpLDgpL7gpJzgpJXgpL7gpJwg4KSk4KWN4KSv4KS+4KSX4KWAIOCkpOCkquCkuOCljeCkteClgOCkleCliyDgpJzgpYDgpLXgpKgg4KSF4KSB4KSX4KS+4KSy4KWHIOCksCDgpIngpKjgpYAg4KSs4KWB4KSm4KWN4KSnIOCkreCkqOClh+CksCDgpLXgpL/gpLbgpY3gpLUg4KSq4KWN4KSw4KS44KS/4KSm4KWN4KSnIOCkreCkj+ClpCAKLeCkiOCktuCkvuCkquClguCksOCljeCkteCkleCliyDgpajgpavgpaYg4KS44KSu4KWN4KSu4KSu4KS+LCDgpK/gpYsg4KSV4KWN4KS34KWH4KSk4KWN4KSwIOCkieCkpOCljeCkpOCksCIiIjsKK+CkiOCktuCkvuCkquClguCksOCljeCkteCkleCliyDgpajgpavgpaYg4KS44KSu4KWN4KSu4KSu4KS+LCDgpK/gpYsg4KSV4KWN4KS34KWH4KSk4KWN4KSwIOCkieCkpOCljeCkpOCksCcnJzsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9ydXRleHRfMl8xMGsuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9ydXRleHRfMl8xMGsuZGFydAppbmRleCA1MGIwMTMwLi5jNjFhNjY1IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvcnV0ZXh0XzJfMTBrLmRhcnQKKysrIGIvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL3J1dGV4dF8yXzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIHJ1ID0gIiIiCitjb25zdCBTdHJpbmcgcnUgPSAnJycKINCb0LjRgtCy0LAKIAog0JvQuNGC0LLQsMyBICgpLCDQvtGE0LjRhtC40LDQu9GM0L3QvtC1INC90LDQt9Cy0LDQvdC40LUgINCb0LjRgtC+zIHQstGB0LrQsNGPINCg0LXRgdC/0YPMgdCx0LvQuNC60LAgKCkgINCz0L7RgdGD0LTQsNGA0YHRgtCy0L4sINGA0LDRgdC/0L7Qu9C+0LbQtdC90L3QvtC1INCyINGB0LXQstC10YDQvdC+0Lkg0YfQsNGB0YLQuCDQldCy0YDQvtC/0YsuINCh0YLQvtC70LjRhtCwINGB0YLRgNCw0L3RiyAg0JLQuNC70YzQvdGO0YEuCkBAIC00MSw0ICs0MSw0IEBACiAKINCSIFhJVsKgINC90LDRh9Cw0LvQtSBYViDQstC10LrQsNGFINGC0LXRgNGA0LjRgtC+0YDQuNGPINCS0LXQu9C40LrQvtCz0L4g0LrQvdGP0LbQtdGB0YLQstCwINCb0LjRgtC+0LLRgdC60L7Qs9C+INGB0YLRgNC10LzQuNGC0LXQu9GM0L3QviDRgNC+0YHQu9CwLCDQsiDQvtGB0L3QvtCy0L3QvtC8INC30LAg0YHRh9GR0YIg0L/RgNC40YHQvtC10LTQuNC90LXQvdC40Y8g0LfQtdC80LXQu9GMINCX0LDQv9Cw0LTQvdC+0Lkg0KDRg9GB0LguINCS0LrQu9GO0YfQtdC90LjQtSDQsiDRgdC+0YHRgtCw0LIg0LPQvtGB0YPQtNCw0YDRgdGC0LLQsCDRgdC70LDQstGP0L3RgdC60LjRhSDQt9C10LzQtdC70YwsINC80L3QvtCz0L7QutGA0LDRgtC90L4g0L/RgNC10LLRi9GI0LDRjtGJ0LjRhSDQv9C+INC/0LvQvtGJ0LDQtNC4INC4INC60L7Qu9C40YfQtdGB0YLQstGDINC90LDRgdC10LvQtdC90LjRjyDRgdC+0LHRgdGC0LLQtdC90L3QviDQu9C40YLQvtCy0YHQutC40LUg0LfQtdC80LvQuCwg0L/RgNC40LLQtdC70L4g0Log0L/QtdGA0LXQvdC40LzQsNC90LjRjiDQu9C40YLQvtCy0YHQutC40LzQuCDQutC90Y/Qt9GM0Y/QvNC4LCDQv9C+0LvRg9GH0LjQstGI0LjQvNC4INCy0L4g0LLQu9Cw0LTQtdC90LjQtSDRgNGD0YHRgdC60LjQtSDQt9C10LzQu9C4LCDQv9GA0LDQstC+0YHQu9Cw0LLQvdC+0Lkg0LrRg9C70YzRgtGD0YDRiyDQuCDQt9Cw0L/QsNC00L3QvtGA0YPRgdGB0LrQvtCz0L4g0Y/Qt9GL0LrQsC4g0KHQviDQstGA0LXQvNC10L3QtdC8INC30LDQv9Cw0LTQvdC+0YDRg9GB0YHQutC40Lkg0Y/Qt9GL0Log0YHRgtCw0Lsg0L7RhNC40YbQuNCw0LvRjNC90YvQvCDRj9C30YvQutC+0Lwg0LrQsNC90YbQtdC70Y/RgNC40Lgg0LLQtdC70LjQutC40YUg0LrQvdGP0LfQtdC5LiDQodC+0LHRgdGC0LLQtdC90L3QviDQu9C40YLQvtCy0YHQutC40Lkg0Y/Qt9GL0Log0LTQviBYVkkg0LLQtdC60LAg0L7RgdGC0LDQstCw0LvRgdGPINCx0LXRgdC/0LjRgdGM0LzQtdC90L3Ri9C8LCDRhdC+0YLRjyDQuCDQv9GA0L7QtNC+0LvQttCw0Lsg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDQvdCwINGN0YLQvdC40YfQtdGB0LrQuCDQu9C40YLQvtCy0YHQutC40YUg0LfQtdC80LvRj9GFLgogCi3QkiAxMzg1INCz0L7QtNGDINCy0LXQu9C40LrQuNC5INC60L3Rj9C30Ywg0LvQuNGC0L7QstGB0LrQuNC5INCv0LPQsNC50LvQviDQt9Cw0LrQu9GO0YfQuNC7INCa0YDQtdCy0YHQutGD0Y4g0YPQvdC40Y4g0YEg0JrQvtGA0L7Qu9C10LLRgdGC0LLQvtC8INCf0L7Qu9GM0YHQutC40LwuINCf0L4g0YPRgdC70L7QstC40Y/QvCDRg9C90LjQuCwg0K/Qs9Cw0LnQu9C+INC+0LHRj9C30LDQu9GB0Y8g0L/RgNC40YHQvtC10LTQuNC90LjRgtGMINCS0LXQu9C40LrQvtC1INC60L3Rj9C20LXRgdGC0LLQviDQm9C40YLQvtCy0YHQutC+0LUg0Log0JrQvtGA0L7Qu9C10LLRgdGC0LLRgyDQn9C+0LvRjNGB0LrQvtC80YMg0Lgg0LrRgNC10YHRgtC40YLRjCDQu9C40YLQvtCy0YHQutC40LUg0LfQtdC80LvQuCDQv9C+INC60LDRgtC+0LvQuNGH0LXRgdC60L7QvNGDINC+0LHRgNGP0LTRgywg0LAg0YHQsNC8INGB0YLQsNC90L7QstC40LvRgdGPINC60L7RgNC+0LvRkdC8INCf0L7Qu9GM0YjQuCDQuCDRgdC+0YXRgNCw0L3Rj9C7INGC0LjRgtGD0Lsg0LLQtdC70LjQutC+0LPQviDQutC90Y/Qt9GPINC70LjRgtC+0LLRgdC60L7Qs9C+LiDQntC00L3QsNC60L4g0LLRgdC60L7RgNC1INC+0L0g0LLRi9C90YPQttC00LXQvSDQsdGL0Lsg0YPRgdGC0YPQv9C40YLRjCDQstC70LDRgdGC0Ywg0LIg0JLQtdC70LjQutC+0Lwg0LrQvdGP0LbQtdGB0YLQstC1INCb0LjRgtC+0LLRgdC60L7QvCDRgdCy0L7QtdC80YMg0LTQstC+0Y7RgNC+0LTQvdC+0LzRgyDQsdGA0LDRgtGDINCS0LjRgtC+0LLRgtGDLiIiIjsKK9CSIDEzODUg0LPQvtC00YMg0LLQtdC70LjQutC40Lkg0LrQvdGP0LfRjCDQu9C40YLQvtCy0YHQutC40Lkg0K/Qs9Cw0LnQu9C+INC30LDQutC70Y7Rh9C40Lsg0JrRgNC10LLRgdC60YPRjiDRg9C90LjRjiDRgSDQmtC+0YDQvtC70LXQstGB0YLQstC+0Lwg0J/QvtC70YzRgdC60LjQvC4g0J/QviDRg9GB0LvQvtCy0LjRj9C8INGD0L3QuNC4LCDQr9Cz0LDQudC70L4g0L7QsdGP0LfQsNC70YHRjyDQv9GA0LjRgdC+0LXQtNC40L3QuNGC0Ywg0JLQtdC70LjQutC+0LUg0LrQvdGP0LbQtdGB0YLQstC+INCb0LjRgtC+0LLRgdC60L7QtSDQuiDQmtC+0YDQvtC70LXQstGB0YLQstGDINCf0L7Qu9GM0YHQutC+0LzRgyDQuCDQutGA0LXRgdGC0LjRgtGMINC70LjRgtC+0LLRgdC60LjQtSDQt9C10LzQu9C4INC/0L4g0LrQsNGC0L7Qu9C40YfQtdGB0LrQvtC80YMg0L7QsdGA0Y/QtNGDLCDQsCDRgdCw0Lwg0YHRgtCw0L3QvtCy0LjQu9GB0Y8g0LrQvtGA0L7Qu9GR0Lwg0J/QvtC70YzRiNC4INC4INGB0L7RhdGA0LDQvdGP0Lsg0YLQuNGC0YPQuyDQstC10LvQuNC60L7Qs9C+INC60L3Rj9C30Y8g0LvQuNGC0L7QstGB0LrQvtCz0L4uINCe0LTQvdCw0LrQviDQstGB0LrQvtGA0LUg0L7QvSDQstGL0L3Rg9C20LTQtdC9INCx0YvQuyDRg9GB0YLRg9C/0LjRgtGMINCy0LvQsNGB0YLRjCDQsiDQktC10LvQuNC60L7QvCDQutC90Y/QttC10YHRgtCy0LUg0JvQuNGC0L7QstGB0LrQvtC8INGB0LLQvtC10LzRgyDQtNCy0L7RjtGA0L7QtNC90L7QvNGDINCx0YDQsNGC0YMg0JLQuNGC0L7QstGC0YMuJycnOwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL3NrdGV4dF8xMGsuZGFydCBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi9za3RleHRfMTBrLmRhcnQKaW5kZXggYjFjZTI1MS4uN2RjMmQxMyAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9VdGY4RGVjb2RlL2RhcnQyL3NrdGV4dF8xMGsuZGFydAorKysgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvc2t0ZXh0XzEway5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gVGhlIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlLUFsaWtlCiAvLyBMaWNlbnNlIDMuMDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8KIAotY29uc3QgU3RyaW5nIHNrID0gIiIiCitjb25zdCBTdHJpbmcgc2sgPSAnJycKIEVzcGVyYW50byAocMO0dm9kbmUgTGluZ3ZvIEludGVybmFjaWEg4oCTIOKAnm1lZHppbsOhcm9kbsO9IGphenlr4oCcKSBqZSBuYWpyb3rFocOtcmVuZWrFocOtIG1lZHppbsOhcm9kbsO9IHBsw6Fub3bDvSBqYXp5ay4gTsOhem92IGplIG9kdm9kZW7DvSBvZCBwc2V1ZG9ueW11LCBwb2Qga3RvcsO9bSB2IHJva3UgMTg4NyB6dmVyZWpuaWwgbGVrw6FyIEwuIEwuIFphbWVuaG9mIHrDoWtsYWR5IHRvaHRvIGphenlrYS4gWsOhbWVyb20gdHZvcmN1IGJvbG8gdnl0dm9yacWlIMS+YWhrbyBuYXXEjWl0ZcS+bsO9IGEgcG91xb5pdGXEvm7DvSBuZXV0csOhbG55IGphenlrLCB2aG9kbsO9IG5hIHBvdcW+aXRpZSB2IG1lZHppbsOhcm9kbmVqIGtvbXVuaWvDoWNpaS4gQ2llxL5vbSBuZWJvbG8gbmFocmFkacWlIG7DoXJvZG7DqSBqYXp5a3ksIMSNbyBib2xvIG5lc2vDtHIgYWogZGVrbGFyb3ZhbsOpIHYgQm91bG9uc2tlaiBkZWtsYXLDoWNpaS4KIAogSG9jaSDFvmlhZGVuIMWhdMOhdCBuZXByaWphbCBlc3BlcmFudG8gYWtvIMO6cmFkbsO9IGphenlrLCBwb3XFvsOtdmEgaG8ga29tdW5pdGEgcyBvZGhhZG92YW7DvW0gcG/EjXRvbSBob3ZvcmlhY2ljaCAxMDDCoDAwMCBhxb4gMsKgMDAwwqAwMDAsIHogxI1vaG8gcHJpYmxpxb5uZSAywqAwMDAgdHZvcmlhIHJvZGVuw60gaG92b3JpYWNpLiBWIFBvxL5za3UgamUgbmEgem96bmFtZSBuZW1hdGVyacOhbG5laG8ga3VsdMO6cm5laG8gZGVkacSNc3R2YS4gWsOtc2thbG8gYWogaXN0w6kgbWVkemluw6Fyb2Ruw6kgdXpuYW5pYSwgbmFwcsOta2xhZCBkdmUgcmV6b2zDumNpZSBVTkVTQ08gxI1pIHBvZHBvcnUgem7DoW15Y2ggb3NvYm5vc3TDrSB2ZXJlam7DqWhvIMW+aXZvdGEuIFYgc8O6xI1hc25vc3RpIHNhIGVzcGVyYW50byB2eXXFvsOtdmEgcHJpIGNlc3RvdmFuw60sIGtvcmXFoXBvbmRlbmNpaSwgbWVkemluw6Fyb2Ruw71jaCBzdHJldG51dGlhY2ggYSBrdWx0w7pybnljaCB2w71tZW7DoWNoLCBrb25ncmVzb2NoLCB2ZWRlY2vDvWNoIGRpc2t1c2nDoWNoLCB2IHDDtHZvZG5laiBhaiBwcmVrbGFkb3ZlaiBsaXRlcmF0w7pyZSwgZGl2YWRsZSBhIGtpbmUsIGh1ZGJlLCB0bGHEjWVub20gYWogaW50ZXJuZXRvdm9tIHNwcmF2b2RhanN0dmUsIHJvemhsYXNvdm9tIGEgdGVsZXbDrXpub20gdnlzaWVsYW7DrS4KQEAgLTQzLDQgKzQzLDQgQEAKIAogUG8gcHJ2ZWogc3ZldG92ZWogdm9qbmUgc2Egb2JhIHByYcW+c2vDqSBzcG9sa3kgemzDusSNaWxpIGRvICLEjGVza29zbG92ZW5za2VqIEVzcGVyYW50c2tlaiBBc29jacOhY2llIi4gVMOhIGJvbGEgdiByb2t1IDE5MzYgcHJlbWVub3ZhbsOhIG5hICJFc3BlcmFudHNrw7ogQXNvY2nDoWNpdSB2IMSMZXNrb3Nsb3ZlbnNrZWogcmVwdWJsaWtlIi4gViB0b210byBvYmRvYsOtIGJvbG8gaG51dGllIHZlxL5taSBha3TDrXZuZSwgZnVuZ292YWxvIG1ub2hvIGtsdWJvdiwga29uYWxvIHNhIHZlxL5hIHByZWRuw6HFoW9rIGEga3Vyem92LiBFc3BlcmFudG8gYm9sbyB2eXXEjW92YW7DqSBuYSDFoWtvbMOhY2ggcsO0em55Y2ggc3R1cMWIb3YsIHLDoWRpbyBCcmF0aXNsYXZhIG9kIDE5MzAgdnlzaWVsYWxvIGt1cnp5IGEgb2QgMTkzMiBhaiBrdWx0w7pybnkgcHJvZ3JhbSB2IGVzcGVyYW50ZS4gQm9sYSB2eWRhbsOhICLEjGVza29zbG92ZW5za8OhIGFudG9sw7NnaWEiIHByZWRzdGF2dWrDumNhIGRpZWxhIDIwIHNsb3ZlbnNrw71jaCBhdXRvcm92LiBWIHLDoW1jaSBwcm90aWZhxaFpc3RpY2tlaiBha3Rpdml0eSB2eWNow6FkemFsaSBhaiBwcmVrbGFkeSBwcm90aWZhxaFpc3RpY2vDvWNoIMSNbMOhbmtvdiB6IGVzcGVyYW50c2vDvWNoIMSNYXNvcGlzb3YgeiBvYmRvYmlhIMWgcGFuaWVsc2tlaiBvYsSNaWFuc2tlaiB2b2pueS4KIAotRHJ1aMOhIHN2ZXRvdsOhIHZvam5hIHV0bG1pbGEgZXNwZXJhbnRza8OpIGhudXRpZS4gQnJhdGlzbGF2c2vDvSBlc3BlcmFudHNrw70ga2x1YiBwb8W+aWFkYWwgbyB6bWVudSDFoXRhdMO6dHUgYSByb3rFocOtcmVuaWUgcG/EvmEgcMO0c29ibm9zdGkgbmEgY2Vsw7ogdnRlZGFqxaFpdSBTbG92ZW5za8O6IHJlcHVibGlrdSBhIG7DoXNsZWRuZSBzYSBzdGFsIHN0cmVkaXNrb20gZXNwZXJhbnRza8OpaG8gaG51dGlhIG5hIFNsb3ZlbnNrdS4iIiI7CitEcnVow6Egc3ZldG92w6Egdm9qbmEgdXRsbWlsYSBlc3BlcmFudHNrw6kgaG51dGllLiBCcmF0aXNsYXZza8O9IGVzcGVyYW50c2vDvSBrbHViIHBvxb5pYWRhbCBvIHptZW51IMWhdGF0w7p0dSBhIHJvesWhw61yZW5pZSBwb8S+YSBww7Rzb2Jub3N0aSBuYSBjZWzDuiB2dGVkYWrFoWl1IFNsb3ZlbnNrw7ogcmVwdWJsaWt1IGEgbsOhc2xlZG5lIHNhIHN0YWwgc3RyZWRpc2tvbSBlc3BlcmFudHNrw6lobyBobnV0aWEgbmEgU2xvdmVuc2t1LicnJzsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi96aHRleHRfMTBrLmRhcnQgYi9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvemh0ZXh0XzEway5kYXJ0CmluZGV4IGRjODFjNmQ2Li5iNWUyYTU0IDEwMDY0NAotLS0gYS9iZW5jaG1hcmtzL1V0ZjhEZWNvZGUvZGFydDIvemh0ZXh0XzEway5kYXJ0CisrKyBiL2JlbmNobWFya3MvVXRmOERlY29kZS9kYXJ0Mi96aHRleHRfMTBrLmRhcnQKQEAgLTcsNyArNyw3IEBACiAvLyBUaGUgbWF0ZXJpYWwgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmUtQWxpa2UKIC8vIExpY2Vuc2UgMy4wOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLwogCi1jb25zdCBTdHJpbmcgemggPSAiIiIKK2NvbnN0IFN0cmluZyB6aCA9ICcnJwog5pyA57Ch5Zau55qE5ryi5a2X5Y+q5pyJ5LiA56yU55S777yM5L2G5Y275LiN5q2i5LiA5YCL5a2X77ya6Zmk5LqG44CM5LiA44CN5a2X5Lul5aSW77yM44CM5LmZ44CN44CB44CM44CH44CN44CB44CM5Li244CN44CB44CM5Lio44CN44CB44CM5LqF44CN44CB44CM5Li/44CN44CB44CM5LmA44CN44CB44CM5LmB44CN44CB44CM8KCEjOOAjeOAgeOAjPCgg4vjgI3jgIHjgIzwoIOJ44CN44CB44CM8KCDiuOAjeOAgeOAjOS5muOAjeetiemDveaYr+a8ouWtl++8jOiAjOS4lOmDveacieWQhOiHqueahOiugOmfs+OAggogCiDkuK3mlofmsYnlrZfkuK3vvIznrJTnlLvmnIDlpJrnmoTmsYnlrZflj6/og73mmK/igJzigJ3vvIzmmK/kuIDnp43pnaLpo5/nmoTlkI3np7DvvIzmraTlrZfoh7Pku4rkuaDnlKjvvIzlhbbkuI3lkIzlhpnms5XnmoTnrJTnlLvmlbDlnKg1NOiHszcx55S75LmL6Ze05LiN562J44CC6KKr5Lyg57uf6L6e5YW45pS25b2V55qE56yU55S75pyA5aSa55qE5rGJ5a2X5Li644CK5a2X5rGH6KGl44CL44CB44CK5rGJ6K+t5aSn5a2X5YW444CL5Lit55Sx5Zub5Liq4oCcLXvpvo19LeKAneWtl+e7hOaIkOeahOOAjOOAjeWtl++8jOWFsTY055S777yb5ZCM5qij5bGs5pa8NjTlioPnmoTlrZfnlLHlm5vlgIvigJwte+iIiH0t4oCd5a2X57WE5oiQ55qE4oCc8KCUu+KAneWtl++8jOaUtuWFpeiHquOAiuS4reaWh+Wkp+i+reWFuOOAi++8m+S5i+W+jOeahOaYr+eUseWbm+WAi+OAjOmbt+OAjeWtl+e1hOaIkOeahOKAnOSou+KAneWtl++8jOaciTUy5YqD77yM5pS26YyE5pa844CK6Kqq5paH6Kej5a2X44CL44CCCkBAIC03MCw0ICs3MCw0IEBACiAKIOmaj+edgOWQhOenjeS4reaWh+i+k+WFpeazleeahOWHuueOsO+8jOaxieWtl+eahOiuoeeul+acuui+k+WFpeOAgeWtmOWCqOOAgei+k+WHuuaKgOacr+W+l+WIsOS6huWfuuacrOino+WGs++8jOWkp+Wkp+aPkOmrmOS6huS4reaWh+WGmeS9nOOAgeWHuueJiOOAgeS/oeaBr+ajgOe0ouetieeahOaViOeOh+OAguebruWJjeS4reaWh+i+k+WFpeazleacieS4iuWNg+enjeS5i+Wkmu+8jOS4u+imgeWMheaLrOihqOmfs+i+k+WFpeWSjOihqOW9oui+k+WFpeS4pOexu++8jOS5n+acieS4pOiAheWFvOS5i+eahOOAguaxieWtl+eahOivremfs+i+k+WFpeOAgeaJi+WGmeivhuWIq+WSjOWFieWtpuWtl+espuivhuWIq++8iE9DUu+8ieaKgOacr+S5n+W3suW+l+WIsOW5v+azm+W6lOeUqOOAggogCi3lpoLmlLblvZXmlbDljYPlrZfnmoRHQsKgMjMxMu+8iOS4reWci+Wkp+mZuO+8ieOAgUIiIiI7CivlpoLmlLblvZXmlbDljYPlrZfnmoRHQsKgMjMxMu+8iOS4reWci+Wkp+mZuO+8ieOAgUInJyc7CmRpZmYgLS1naXQgYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpcy5kYXJ0IGIvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9mbG93X2FuYWx5c2lzL2Zsb3dfYW5hbHlzaXMuZGFydAppbmRleCBjYTI2M2FlLi42ODkzYTc5IDEwMDY0NAotLS0gYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpcy5kYXJ0CisrKyBiL3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvZmxvd19hbmFseXNpcy9mbG93X2FuYWx5c2lzLmRhcnQKQEAgLTExODgsNjcgKzExODgsOSBAQAogICAgIH0oKSk7CiAgIH0KIAotICAvLy8gUmVnaXN0ZXIgYSBkZWNsYXJhdGlvbiBvZiB0aGUgW3ZhcmlhYmxlXS4KLSAgLy8vIFNob3VsZCBhbHNvIGJlIGNhbGxlZCBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycy4KLSAgLy8vCi0gIC8vLyBBIGxvY2FsIHZhcmlhYmxlIGlzIFtpbml0aWFsaXplZF0gaWYgaXRzIGRlY2xhcmF0aW9uIGhhcyBhbiBpbml0aWFsaXplci4KLSAgLy8vIEEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIGFsd2F5cyBpbml0aWFsaXplZCwgc28gW2luaXRpYWxpemVkXSBpcyBgdHJ1ZWAuCi0gIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gZGVjbGFyZShWYXJpYWJsZSB2YXJpYWJsZSwgYm9vbCBpbml0aWFsaXplZCkgewotICAgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IG5ld0luZm9Gb3JWYXIgPSBfZnJlc2hWYXJpYWJsZUluZm87Ci0gICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICBuZXdJbmZvRm9yVmFyID0gbmV3SW5mb0ZvclZhci5pbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIF91cGRhdGVWYXJpYWJsZUluZm8odmFyaWFibGUsIG5ld0luZm9Gb3JWYXIpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIGluZm8gZm9yIHRoZSBnaXZlbiBbdmFyaWFibGVdLCBjcmVhdGluZyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICBWYXJpYWJsZU1vZGVsPFZhcmlhYmxlLCBUeXBlPiBpbmZvRm9yKFZhcmlhYmxlIHZhcmlhYmxlKSA9PgotICAgICAgdmFyaWFibGVJbmZvW3ZhcmlhYmxlXSA/PyBfZnJlc2hWYXJpYWJsZUluZm87Ci0KLSAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBkZWZpbml0ZWx5Ci0gIC8vLyB1bmFzc2lnbmVkIGluIHRoZSBbb3RoZXJdLCBvciBhcmUgW3dyaXR0ZW5dLCBhcmUgYWxzbyBub3QgZGVmaW5pdGVseQotICAvLy8gdW5hc3NpZ25lZCBpbiB0aGUgcmVzdWx0LgotICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGpvaW5VbmFzc2lnbmVkKHsKLSAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IG90aGVyLAotICAgIEl0ZXJhYmxlPFZhcmlhYmxlPiB3cml0dGVuLAotICB9KSB7Ci0gICAgTWFwPFZhcmlhYmxlLCBWYXJpYWJsZU1vZGVsPFZhcmlhYmxlLCBUeXBlPj4gbmV3VmFyaWFibGVJbmZvOwotCi0gICAgdm9pZCBtYXJrTm90VW5hc3NpZ25lZChWYXJpYWJsZSB2YXJpYWJsZSkgewotICAgICAgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4gaW5mbyA9IHZhcmlhYmxlSW5mb1t2YXJpYWJsZV07Ci0gICAgICBpZiAoaW5mbyA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IG5ld0luZm8gPSBpbmZvLm1hcmtOb3RVbmFzc2lnbmVkKCk7Ci0gICAgICBpZiAoaWRlbnRpY2FsKG5ld0luZm8sIGluZm8pKSByZXR1cm47Ci0KLSAgICAgIChuZXdWYXJpYWJsZUluZm8gPz89Ci0gICAgICAgICAgbmV3IE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4+LmZyb20oCi0gICAgICAgICAgICAgIHZhcmlhYmxlSW5mbykpW3ZhcmlhYmxlXSA9IG5ld0luZm87Ci0gICAgfQotCi0gICAgaWYgKG90aGVyICE9IG51bGwpIHsKLSAgICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgaW4gb3RoZXIudmFyaWFibGVJbmZvLmtleXMpIHsKLSAgICAgICAgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4gb3RoZXJJbmZvID0gb3RoZXIudmFyaWFibGVJbmZvW3ZhcmlhYmxlXTsKLSAgICAgICAgaWYgKCFvdGhlckluZm8udW5hc3NpZ25lZCkgewotICAgICAgICAgIG1hcmtOb3RVbmFzc2lnbmVkKHZhcmlhYmxlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICh3cml0dGVuICE9IG51bGwpIHsKLSAgICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgaW4gd3JpdHRlbikgewotICAgICAgICBtYXJrTm90VW5hc3NpZ25lZCh2YXJpYWJsZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5ld1ZhcmlhYmxlSW5mbyA9PSBudWxsKSByZXR1cm4gdGhpczsKLQotICAgIHJldHVybiBuZXcgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPi5fKHJlYWNoYWJsZSwgbmV3VmFyaWFibGVJbmZvKTsKLSAgfQotCiAgIC8vLyBVcGRhdGVzIHRoZSBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBnaXZlbiBbd3JpdHRlblZhcmlhYmxlc10gYXJlIG5vCi0gIC8vLyBsb25nZXIgcHJvbW90ZWQ7IHRoZXkgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhlaXIgZGVjbGFyZWQgdHlwZXMuCisgIC8vLyBsb25nZXIgcHJvbW90ZWQgYW5kIGFyZSBubyBsb25nZXIgZGVmaW5pdGVseSB1bmFzc2lnbmVkLCBhbmQgdGhlIGdpdmVuCisgIC8vLyBbY2FwdHVyZWRWYXJpYWJsZXNdIGhhdmUgYmVlbiBjYXB0dXJlZCBieSBjbG9zdXJlcy4KICAgLy8vCiAgIC8vLyBUaGlzIGlzIHVzZWQgYXQgdGhlIHRvcCBvZiBsb29wcyB0byBjb25zZXJ2YXRpdmVseSBjYW5jZWwgdGhlIHByb21vdGlvbiBvZgogICAvLy8gdmFyaWFibGVzIHRoYXQgYXJlIG1vZGlmaWVkIHdpdGhpbiB0aGUgbG9vcCwgc28gdGhhdCB3ZSBjb3JyZWN0bHkgYW5hbHl6ZQpAQCAtMTI2NiwxNyArMTIwOCwxOSBAQAogICAvLy8gYW5kIG9ubHkgcmVtb3ZlIHByb21vdGlvbnMgaWYgaXQgY2FuIGJlIHNob3duIHRoYXQgdGhleSBhcmVuJ3QgcmVzdG9yZWQKICAgLy8vIGxhdGVyIGluIHRoZSBsb29wIGJvZHkuICBJZiB3ZSBzd2l0Y2ggdG8gYSBmaXhlZCBwb2ludCBhbmFseXNpcywgd2Ugc2hvdWxkCiAgIC8vLyBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIG1ldGhvZC4KLSAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiByZW1vdmVQcm9tb3RlZEFsbCgKKyAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBjb25zZXJ2YXRpdmVKb2luKAogICAgICAgSXRlcmFibGU8VmFyaWFibGU+IHdyaXR0ZW5WYXJpYWJsZXMsCiAgICAgICBJdGVyYWJsZTxWYXJpYWJsZT4gY2FwdHVyZWRWYXJpYWJsZXMpIHsKICAgICBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+PiBuZXdWYXJpYWJsZUluZm87CiAKICAgICBmb3IgKFZhcmlhYmxlIHZhcmlhYmxlIGluIHdyaXR0ZW5WYXJpYWJsZXMpIHsKICAgICAgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IGluZm8gPSBpbmZvRm9yKHZhcmlhYmxlKTsKLSAgICAgIGlmIChpbmZvLnByb21vdGVkVHlwZXMgIT0gbnVsbCkgeworICAgICAgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4gbmV3SW5mbyA9CisgICAgICAgICAgaW5mby5kaXNjYXJkUHJvbW90aW9uc0FuZE1hcmtOb3RVbmFzc2lnbmVkKCk7CisgICAgICBpZiAoIWlkZW50aWNhbChpbmZvLCBuZXdJbmZvKSkgewogICAgICAgICAobmV3VmFyaWFibGVJbmZvID8/PQogICAgICAgICAgICAgbmV3IE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4+LmZyb20oCi0gICAgICAgICAgICAgICAgdmFyaWFibGVJbmZvKSlbdmFyaWFibGVdID0gaW5mby5kaXNjYXJkUHJvbW90aW9ucygpOworICAgICAgICAgICAgICAgIHZhcmlhYmxlSW5mbykpW3ZhcmlhYmxlXSA9IG5ld0luZm87CiAgICAgICB9CiAgICAgfQogCkBAIC0xMjk4LDExICsxMjQyLDU3IEBACiAgICAgICAgID8gdGhpcwogICAgICAgICA6IG5ldyBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+Ll8ocmVhY2hhYmxlLCBuZXdWYXJpYWJsZUluZm8pOwogCi0gICAgcmVzdWx0ID0gcmVzdWx0LmpvaW5VbmFzc2lnbmVkKHdyaXR0ZW46IHdyaXR0ZW5WYXJpYWJsZXMpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCisgIC8vLyBSZWdpc3RlciBhIGRlY2xhcmF0aW9uIG9mIHRoZSBbdmFyaWFibGVdLgorICAvLy8gU2hvdWxkIGFsc28gYmUgY2FsbGVkIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIEEgbG9jYWwgdmFyaWFibGUgaXMgW2luaXRpYWxpemVkXSBpZiBpdHMgZGVjbGFyYXRpb24gaGFzIGFuIGluaXRpYWxpemVyLgorICAvLy8gQSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgYWx3YXlzIGluaXRpYWxpemVkLCBzbyBbaW5pdGlhbGl6ZWRdIGlzIGB0cnVlYC4KKyAgRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBkZWNsYXJlKFZhcmlhYmxlIHZhcmlhYmxlLCBib29sIGluaXRpYWxpemVkKSB7CisgICAgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4gbmV3SW5mb0ZvclZhciA9IF9mcmVzaFZhcmlhYmxlSW5mbzsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgIG5ld0luZm9Gb3JWYXIgPSBuZXdJbmZvRm9yVmFyLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gX3VwZGF0ZVZhcmlhYmxlSW5mbyh2YXJpYWJsZSwgbmV3SW5mb0ZvclZhcik7CisgIH0KKworICAvLy8gR2V0cyB0aGUgaW5mbyBmb3IgdGhlIGdpdmVuIFt2YXJpYWJsZV0sIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IGluZm9Gb3IoVmFyaWFibGUgdmFyaWFibGUpID0+CisgICAgICB2YXJpYWJsZUluZm9bdmFyaWFibGVdID8/IF9mcmVzaFZhcmlhYmxlSW5mbzsKKworICAvLy8gVXBkYXRlcyB0aGUgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IGRlZmluaXRlbHkKKyAgLy8vIHVuYXNzaWduZWQgaW4gdGhlIFtvdGhlcl0sIGFyZSBhbHNvIG5vdCBkZWZpbml0ZWx5IHVuYXNzaWduZWQgaW4gdGhlCisgIC8vLyByZXN1bHQuCisgIEZsb3dNb2RlbDxWYXJpYWJsZSwgVHlwZT4gam9pblVuYXNzaWduZWQoRmxvd01vZGVsPFZhcmlhYmxlLCBUeXBlPiBvdGhlcikgeworICAgIE1hcDxWYXJpYWJsZSwgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4+IG5ld1ZhcmlhYmxlSW5mbzsKKworICAgIHZvaWQgbWFya05vdFVuYXNzaWduZWQoVmFyaWFibGUgdmFyaWFibGUpIHsKKyAgICAgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IGluZm8gPSB2YXJpYWJsZUluZm9bdmFyaWFibGVdOworICAgICAgaWYgKGluZm8gPT0gbnVsbCkgcmV0dXJuOworCisgICAgICBWYXJpYWJsZU1vZGVsPFZhcmlhYmxlLCBUeXBlPiBuZXdJbmZvID0gaW5mby5tYXJrTm90VW5hc3NpZ25lZCgpOworICAgICAgaWYgKGlkZW50aWNhbChuZXdJbmZvLCBpbmZvKSkgcmV0dXJuOworCisgICAgICAobmV3VmFyaWFibGVJbmZvID8/PQorICAgICAgICAgIG5ldyBNYXA8VmFyaWFibGUsIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+Pi5mcm9tKAorICAgICAgICAgICAgICB2YXJpYWJsZUluZm8pKVt2YXJpYWJsZV0gPSBuZXdJbmZvOworICAgIH0KKworICAgIGZvciAoVmFyaWFibGUgdmFyaWFibGUgaW4gb3RoZXIudmFyaWFibGVJbmZvLmtleXMpIHsKKyAgICAgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IG90aGVySW5mbyA9IG90aGVyLnZhcmlhYmxlSW5mb1t2YXJpYWJsZV07CisgICAgICBpZiAoIW90aGVySW5mby51bmFzc2lnbmVkKSB7CisgICAgICAgIG1hcmtOb3RVbmFzc2lnbmVkKHZhcmlhYmxlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmV3VmFyaWFibGVJbmZvID09IG51bGwpIHJldHVybiB0aGlzOworCisgICAgcmV0dXJuIG5ldyBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+Ll8ocmVhY2hhYmxlLCBuZXdWYXJpYWJsZUluZm8pOworICB9CisKICAgLy8vIFVwZGF0ZXMgdGhlIHN0YXRlIHRvIHJlZmxlY3QgYSBjb250cm9sIHBhdGggdGhhdCBpcyBrbm93biB0byBoYXZlCiAgIC8vLyBwcmV2aW91c2x5IHBhc3NlZCB0aHJvdWdoIHNvbWUgW290aGVyXSBzdGF0ZS4KICAgLy8vCkBAIC0xNzU0LDExICsxNzQ0LDEzIEBACiAgICAgICAgIHdyaXRlQ2FwdHVyZWQgPSBmYWxzZTsKIAogICAvLy8gUmV0dXJucyBhIG5ldyBbVmFyaWFibGVNb2RlbF0gaW4gd2hpY2ggYW55IHByb21vdGlvbnMgcHJlc2VudCBoYXZlIGJlZW4KLSAgLy8vIGRyb3BwZWQuCi0gIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IGRpc2NhcmRQcm9tb3Rpb25zKCkgewotICAgIGFzc2VydChwcm9tb3RlZFR5cGVzICE9IG51bGwsICdObyBwcm9tb3Rpb25zIHRvIGRpc2NhcmQnKTsKKyAgLy8vIGRyb3BwZWQsIGFuZCB0aGUgdmFyaWFibGUgaGFzIGJlZW4gbWFya2VkIGFzICJub3QgdW5hc3NpZ25lZCIuCisgIFZhcmlhYmxlTW9kZWw8VmFyaWFibGUsIFR5cGU+IGRpc2NhcmRQcm9tb3Rpb25zQW5kTWFya05vdFVuYXNzaWduZWQoKSB7CisgICAgaWYgKHByb21vdGVkVHlwZXMgPT0gbnVsbCAmJiAhdW5hc3NpZ25lZCkgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQogICAgIHJldHVybiBuZXcgVmFyaWFibGVNb2RlbDxWYXJpYWJsZSwgVHlwZT4oCi0gICAgICAgIG51bGwsIHRlc3RlZCwgYXNzaWduZWQsIHVuYXNzaWduZWQsIHdyaXRlQ2FwdHVyZWQpOworICAgICAgICBudWxsLCB0ZXN0ZWQsIGFzc2lnbmVkLCBmYWxzZSwgd3JpdGVDYXB0dXJlZCk7CiAgIH0KIAogICAvLy8gUmV0dXJucyBhIG5ldyBbVmFyaWFibGVNb2RlbF0gcmVmbGVjdGluZyB0aGUgZmFjdCB0aGF0IHRoZSB2YXJpYWJsZSB3YXMKQEAgLTIzOTIsNyArMjM4NCw3IEBACiAgICAgX0JyYW5jaFRhcmdldENvbnRleHQ8VmFyaWFibGUsIFR5cGU+IGNvbnRleHQgPQogICAgICAgICBuZXcgX0JyYW5jaFRhcmdldENvbnRleHQ8VmFyaWFibGUsIFR5cGU+KCk7CiAgICAgX3N0YWNrLmFkZChjb250ZXh0KTsKLSAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmNvbnNlcnZhdGl2ZUpvaW4oaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICAgIF9zdGF0ZW1lbnRUb0NvbnRleHRbZG9TdGF0ZW1lbnRdID0gY29udGV4dDsKICAgfQogCkBAIC0yNDYyLDcgKzI0NTQsNyBAQAogICB2b2lkIGZvcl9jb25kaXRpb25CZWdpbihOb2RlIG5vZGUpIHsKICAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShub2RlKTsKLSAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmNvbnNlcnZhdGl2ZUpvaW4oaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICB9CiAKICAgQG92ZXJyaWRlCkBAIC0yNDkwLDcgKzI0ODIsNyBAQAogICAgIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPiBjb250ZXh0ID0KICAgICAgICAgbmV3IF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPihfY3VycmVudCk7CiAgICAgX3N0YWNrLmFkZChjb250ZXh0KTsKLSAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmNvbnNlcnZhdGl2ZUpvaW4oaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICAgIGlmIChsb29wVmFyaWFibGUgIT0gbnVsbCkgewogICAgICAgX2N1cnJlbnQgPSBfY3VycmVudC53cml0ZShsb29wVmFyaWFibGUsIHdyaXR0ZW5UeXBlLCB0eXBlT3BlcmF0aW9ucyk7CiAgICAgfQpAQCAtMjUwOCw5ICsyNTAwLDkgQEAKICAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShub2RlKTsKICAgICArK19mdW5jdGlvbk5lc3RpbmdMZXZlbDsKLSAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGNvbnN0IFtdLCBpbmZvLl93cml0dGVuKTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmNvbnNlcnZhdGl2ZUpvaW4oY29uc3QgW10sIGluZm8uX3dyaXR0ZW4pOwogICAgIF9zdGFjay5hZGQobmV3IF9TaW1wbGVDb250ZXh0KF9jdXJyZW50KSk7Ci0gICAgX2N1cnJlbnQgPSBfY3VycmVudC5yZW1vdmVQcm9tb3RlZEFsbChfYXNzaWduZWRWYXJpYWJsZXMuX2FueXdoZXJlLl93cml0dGVuLAorICAgIF9jdXJyZW50ID0gX2N1cnJlbnQuY29uc2VydmF0aXZlSm9pbihfYXNzaWduZWRWYXJpYWJsZXMuX2FueXdoZXJlLl93cml0dGVuLAogICAgICAgICBfYXNzaWduZWRWYXJpYWJsZXMuX2FueXdoZXJlLl9jYXB0dXJlZCk7CiAgIH0KIApAQCAtMjUyMiw3ICsyNTE0LDcgQEAKICAgICBfU2ltcGxlQ29udGV4dDxWYXJpYWJsZSwgVHlwZT4gY29udGV4dCA9CiAgICAgICAgIF9zdGFjay5yZW1vdmVMYXN0KCkgYXMgX1NpbXBsZUNvbnRleHQ8VmFyaWFibGUsIFR5cGU+OwogICAgIF9jdXJyZW50ID0gY29udGV4dC5fcHJldmlvdXM7Ci0gICAgX2N1cnJlbnQgPSBfY3VycmVudC5qb2luVW5hc3NpZ25lZChvdGhlcjogYWZ0ZXJCb2R5KTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmpvaW5VbmFzc2lnbmVkKGFmdGVyQm9keSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKQEAgLTI3MzUsNyArMjcyNyw3IEBACiAgICAgICAgIF9zdGFjay5sYXN0IGFzIF9TaW1wbGVTdGF0ZW1lbnRDb250ZXh0PFZhcmlhYmxlLCBUeXBlPjsKICAgICBpZiAoaGFzTGFiZWwpIHsKICAgICAgIF9jdXJyZW50ID0KLSAgICAgICAgICBjb250ZXh0Ll9wcmV2aW91cy5yZW1vdmVQcm9tb3RlZEFsbChpbmZvLl93cml0dGVuLCBpbmZvLl9jYXB0dXJlZCk7CisgICAgICAgICAgY29udGV4dC5fcHJldmlvdXMuY29uc2VydmF0aXZlSm9pbihpbmZvLl93cml0dGVuLCBpbmZvLl9jYXB0dXJlZCk7CiAgICAgfSBlbHNlIHsKICAgICAgIF9jdXJyZW50ID0gY29udGV4dC5fcHJldmlvdXM7CiAgICAgfQpAQCAtMjc4MSw3ICsyNzczLDcgQEAKICAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShib2R5KTsKICAgICBGbG93TW9kZWw8VmFyaWFibGUsIFR5cGU+IGJlZm9yZUNhdGNoID0KLSAgICAgICAgYmVmb3JlQm9keS5yZW1vdmVQcm9tb3RlZEFsbChpbmZvLl93cml0dGVuLCBpbmZvLl9jYXB0dXJlZCk7CisgICAgICAgIGJlZm9yZUJvZHkuY29uc2VydmF0aXZlSm9pbihpbmZvLl93cml0dGVuLCBpbmZvLl9jYXB0dXJlZCk7CiAKICAgICBjb250ZXh0Ll9iZWZvcmVDYXRjaCA9IGJlZm9yZUNhdGNoOwogICAgIGNvbnRleHQuX2FmdGVyQm9keUFuZENhdGNoZXMgPSBhZnRlckJvZHk7CkBAIC0yODM5LDcgKzI4MzEsNyBAQAogICAgICAgICBfc3RhY2subGFzdCBhcyBfVHJ5Q29udGV4dDxWYXJpYWJsZSwgVHlwZT47CiAgICAgY29udGV4dC5fYWZ0ZXJCb2R5QW5kQ2F0Y2hlcyA9IF9jdXJyZW50OwogICAgIF9jdXJyZW50ID0gX2pvaW4oX2N1cnJlbnQsCi0gICAgICAgIGNvbnRleHQuX3ByZXZpb3VzLnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKSk7CisgICAgICAgIGNvbnRleHQuX3ByZXZpb3VzLmNvbnNlcnZhdGl2ZUpvaW4oaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpKTsKICAgfQogCiAgIEBvdmVycmlkZQpAQCAtMjg2Myw3ICsyODU1LDcgQEAKICAgdm9pZCB3aGlsZVN0YXRlbWVudF9jb25kaXRpb25CZWdpbihOb2RlIG5vZGUpIHsKICAgICBBc3NpZ25lZFZhcmlhYmxlc05vZGVJbmZvPFZhcmlhYmxlPiBpbmZvID0KICAgICAgICAgX2Fzc2lnbmVkVmFyaWFibGVzLl9nZXRJbmZvRm9yTm9kZShub2RlKTsKLSAgICBfY3VycmVudCA9IF9jdXJyZW50LnJlbW92ZVByb21vdGVkQWxsKGluZm8uX3dyaXR0ZW4sIGluZm8uX2NhcHR1cmVkKTsKKyAgICBfY3VycmVudCA9IF9jdXJyZW50LmNvbnNlcnZhdGl2ZUpvaW4oaW5mby5fd3JpdHRlbiwgaW5mby5fY2FwdHVyZWQpOwogICB9CiAKICAgQG92ZXJyaWRlCmRpZmYgLS1naXQgYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL21lc3NhZ2VzL2NvZGVzX2dlbmVyYXRlZC5kYXJ0IGIvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvbGliL3NyYy9tZXNzYWdlcy9jb2Rlc19nZW5lcmF0ZWQuZGFydAppbmRleCA5NDcyMjcwLi4zMDkwMDRlIDEwMDY0NAotLS0gYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9saWIvc3JjL21lc3NhZ2VzL2NvZGVzX2dlbmVyYXRlZC5kYXJ0CisrKyBiL3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL2xpYi9zcmMvbWVzc2FnZXMvY29kZXNfZ2VuZXJhdGVkLmRhcnQKQEAgLTc1NDIsNiArNzU0MiwyNiBAQAogICAgIG1lc3NhZ2U6IHIiIiJNdXN0IGV4cGxpY2l0bHkgcmV0dXJuIGEgdmFsdWUgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLiIiIik7CiAKIC8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCitjb25zdCBDb2RlPE51bGw+IGNvZGVSZXR1cm5XaXRob3V0RXhwcmVzc2lvbkFzeW5jID0KKyAgICBtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb25Bc3luYzsKKworLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KK2NvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbkFzeW5jID0gY29uc3QgTWVzc2FnZUNvZGUoCisgICAgIlJldHVybldpdGhvdXRFeHByZXNzaW9uQXN5bmMiLAorICAgIG1lc3NhZ2U6CisgICAgICAgIHIiIiJBIHZhbHVlIG11c3QgYmUgZXhwbGljaXRseSByZXR1cm5lZCBmcm9tIGEgbm9uLXZvaWQgYXN5bmMgZnVuY3Rpb24uIiIiKTsKKworLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KK2NvbnN0IENvZGU8TnVsbD4gY29kZVJldHVybldpdGhvdXRFeHByZXNzaW9uU3luYyA9CisgICAgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uU3luYzsKKworLy8gRE8gTk9UIEVESVQuIFRISVMgRklMRSBJUyBHRU5FUkFURUQuIFNFRSBUT1AgT0YgRklMRS4KK2NvbnN0IE1lc3NhZ2VDb2RlIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvblN5bmMgPSBjb25zdCBNZXNzYWdlQ29kZSgKKyAgICAiUmV0dXJuV2l0aG91dEV4cHJlc3Npb25TeW5jIiwKKyAgICBtZXNzYWdlOgorICAgICAgICByIiIiQSB2YWx1ZSBtdXN0IGJlIGV4cGxpY2l0bHkgcmV0dXJuZWQgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLiIiIik7CisKKy8vIERPIE5PVCBFRElULiBUSElTIEZJTEUgSVMgR0VORVJBVEVELiBTRUUgVE9QIE9GIEZJTEUuCiBjb25zdCBUZW1wbGF0ZTxNZXNzYWdlIEZ1bmN0aW9uKFVyaSB1cmlfKT4gdGVtcGxhdGVTZGtSb290Tm90Rm91bmQgPQogICAgIGNvbnN0IFRlbXBsYXRlPE1lc3NhZ2UgRnVuY3Rpb24oVXJpIHVyaV8pPigKICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiByIiIiU0RLIHJvb3QgZGlyZWN0b3J5IG5vdCBmb3VuZDogI3VyaS4iIiIsCkBAIC03ODUwLDcgKzc4NzAsNyBAQAogY29uc3QgTWVzc2FnZUNvZGUgbWVzc2FnZVN0cm9uZ01vZGVOTkJEQnV0T3B0T3V0ID0gY29uc3QgTWVzc2FnZUNvZGUoCiAgICAgIlN0cm9uZ01vZGVOTkJEQnV0T3B0T3V0IiwKICAgICBtZXNzYWdlOgotICAgICAgICByIiIiQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2Ygbm9uLW51bGxhYmxlIGJ5IGRlZmF1bHQsIHdoZW4gaW4gbm5iZC1zdHJvbmcgbW9kZS4iIiIpOworICAgICAgICByIiIiQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2YgbnVsbCBzYWZldHkgYnkgZGVmYXVsdCwgd2hlbiB1c2luZyBzb3VuZCBudWxsIHNhZmV0eS4iIiIpOwogCiAvLyBETyBOT1QgRURJVC4gVEhJUyBGSUxFIElTIEdFTkVSQVRFRC4gU0VFIFRPUCBPRiBGSUxFLgogY29uc3QgQ29kZTxOdWxsPiBjb2RlU3VwZXJBc0V4cHJlc3Npb24gPSBtZXNzYWdlU3VwZXJBc0V4cHJlc3Npb247CmRpZmYgLS1naXQgYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9wdWJzcGVjLnlhbWwgYi9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC9wdWJzcGVjLnlhbWwKaW5kZXggNjFiZWM5MC4uYWM4M2FiNyAxMDA2NDQKLS0tIGEvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvcHVic3BlYy55YW1sCisrKyBiL3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL3B1YnNwZWMueWFtbApAQCAtMSw1ICsxLDUgQEAKIG5hbWU6IF9mZV9hbmFseXplcl9zaGFyZWQKLXZlcnNpb246IDQuMC4wCit2ZXJzaW9uOiA1LjAuMAogZGVzY3JpcHRpb246IExvZ2ljIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gdGhlIGZyb250X2VuZCBhbmQgYW5hbHl6ZXIgcGFja2FnZXMuCiBob21lcGFnZTogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvdHJlZS9tYXN0ZXIvcGtnL19mZV9hbmFseXplcl9zaGFyZWQKIApkaWZmIC0tZ2l0IGEvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvdGVzdC9mbG93X2FuYWx5c2lzL2Zsb3dfYW5hbHlzaXNfdGVzdC5kYXJ0IGIvcGtnL19mZV9hbmFseXplcl9zaGFyZWQvdGVzdC9mbG93X2FuYWx5c2lzL2Zsb3dfYW5hbHlzaXNfdGVzdC5kYXJ0CmluZGV4IDI0MzRjOWIuLjlhNmUzMWIgMTAwNjQ0Ci0tLSBhL3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL3Rlc3QvZmxvd19hbmFseXNpcy9mbG93X2FuYWx5c2lzX3Rlc3QuZGFydAorKysgYi9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC90ZXN0L2Zsb3dfYW5hbHlzaXMvZmxvd19hbmFseXNpc190ZXN0LmRhcnQKQEAgLTIwMDAsNyArMjAwMCw3IEBACiAgICAgICAgICAgICB4OiBfbWF0Y2hWYXJpYWJsZU1vZGVsKGNoYWluOiBudWxsKSwKICAgICAgICAgICB9KTsKIAotICAgICAgICAgIHZhciBzMiA9IHMxLnJlbW92ZVByb21vdGVkQWxsKFtdLCBbeF0pOworICAgICAgICAgIHZhciBzMiA9IHMxLmNvbnNlcnZhdGl2ZUpvaW4oW10sIFt4XSk7CiAgICAgICAgICAgZXhwZWN0KHMyLnZhcmlhYmxlSW5mbywgewogICAgICAgICAgICAgeDogX21hdGNoVmFyaWFibGVNb2RlbChjaGFpbjogbnVsbCwgd3JpdGVDYXB0dXJlZDogdHJ1ZSksCiAgICAgICAgICAgfSk7CkBAIC0yMzkzLDcgKzIzOTMsNyBAQAogICAgICAgICAgICAgYjogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAogICAgICAgICAgIH0pOwogCi0gICAgICAgICAgdmFyIHMzID0gczEuam9pblVuYXNzaWduZWQob3RoZXI6IHMyKTsKKyAgICAgICAgICB2YXIgczMgPSBzMS5qb2luVW5hc3NpZ25lZChzMik7CiAgICAgICAgICAgZXhwZWN0KHMzLCBzYW1lKHMxKSk7CiAgICAgICAgIH0pOwogCkBAIC0yNDIyLDcgKzI0MjIsNyBAQAogICAgICAgICAgICAgYzogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAogICAgICAgICAgIH0pOwogCi0gICAgICAgICAgdmFyIHMzID0gczEuam9pblVuYXNzaWduZWQob3RoZXI6IHMyKTsKKyAgICAgICAgICB2YXIgczMgPSBzMS5qb2luVW5hc3NpZ25lZChzMik7CiAgICAgICAgICAgZXhwZWN0KHMzLnZhcmlhYmxlSW5mbywgewogICAgICAgICAgICAgYTogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogdHJ1ZSwgdW5hc3NpZ25lZDogZmFsc2UpLAogICAgICAgICAgICAgYjogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IGZhbHNlKSwKQEAgLTI0MzAsNjIgKzI0MzAsMTYgQEAKICAgICAgICAgICB9KTsKICAgICAgICAgfSk7CiAgICAgICB9KTsKLQotICAgICAgZ3JvdXAoJ3dyaXR0ZW4nLCAoKSB7Ci0gICAgICAgIHRlc3QoJ3VuY2hhbmdlZCcsICgpIHsKLSAgICAgICAgICB2YXIgaCA9IF9IYXJuZXNzKCk7Ci0KLSAgICAgICAgICB2YXIgYSA9IF9WYXIoJ2EnLCBfVHlwZSgnaW50JykpOwotICAgICAgICAgIHZhciBiID0gX1ZhcignYicsIF9UeXBlKCdpbnQnKSk7Ci0KLSAgICAgICAgICB2YXIgczEgPSBGbG93TW9kZWw8X1ZhciwgX1R5cGU+KHRydWUpCi0gICAgICAgICAgICAgIC5kZWNsYXJlKGEsIGZhbHNlKQotICAgICAgICAgICAgICAuZGVjbGFyZShiLCBmYWxzZSkKLSAgICAgICAgICAgICAgLndyaXRlKGEsIF9UeXBlKCdpbnQnKSwgaCk7Ci0gICAgICAgICAgZXhwZWN0KHMxLnZhcmlhYmxlSW5mbywgewotICAgICAgICAgICAgYTogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogdHJ1ZSwgdW5hc3NpZ25lZDogZmFsc2UpLAotICAgICAgICAgICAgYjogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAotICAgICAgICAgIH0pOwotCi0gICAgICAgICAgdmFyIHMyID0gczEuam9pblVuYXNzaWduZWQod3JpdHRlbjogW2FdKTsKLSAgICAgICAgICBleHBlY3QoczIsIHNhbWUoczEpKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGVzdCgnY2hhbmdlZCcsICgpIHsKLSAgICAgICAgICB2YXIgaCA9IF9IYXJuZXNzKCk7Ci0KLSAgICAgICAgICB2YXIgYSA9IF9WYXIoJ2EnLCBfVHlwZSgnaW50JykpOwotICAgICAgICAgIHZhciBiID0gX1ZhcignYicsIF9UeXBlKCdpbnQnKSk7Ci0gICAgICAgICAgdmFyIGMgPSBfVmFyKCdjJywgX1R5cGUoJ2ludCcpKTsKLQotICAgICAgICAgIHZhciBzMSA9IEZsb3dNb2RlbDxfVmFyLCBfVHlwZT4odHJ1ZSkKLSAgICAgICAgICAgICAgLmRlY2xhcmUoYSwgZmFsc2UpCi0gICAgICAgICAgICAgIC5kZWNsYXJlKGIsIGZhbHNlKQotICAgICAgICAgICAgICAuZGVjbGFyZShjLCBmYWxzZSkKLSAgICAgICAgICAgICAgLndyaXRlKGEsIF9UeXBlKCdpbnQnKSwgaCk7Ci0gICAgICAgICAgZXhwZWN0KHMxLnZhcmlhYmxlSW5mbywgewotICAgICAgICAgICAgYTogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogdHJ1ZSwgdW5hc3NpZ25lZDogZmFsc2UpLAotICAgICAgICAgICAgYjogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAotICAgICAgICAgICAgYzogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAotICAgICAgICAgIH0pOwotCi0gICAgICAgICAgdmFyIHMyID0gczEuam9pblVuYXNzaWduZWQod3JpdHRlbjogW2JdKTsKLSAgICAgICAgICBleHBlY3QoczIudmFyaWFibGVJbmZvLCB7Ci0gICAgICAgICAgICBhOiBfbWF0Y2hWYXJpYWJsZU1vZGVsKGFzc2lnbmVkOiB0cnVlLCB1bmFzc2lnbmVkOiBmYWxzZSksCi0gICAgICAgICAgICBiOiBfbWF0Y2hWYXJpYWJsZU1vZGVsKGFzc2lnbmVkOiBmYWxzZSwgdW5hc3NpZ25lZDogZmFsc2UpLAotICAgICAgICAgICAgYzogX21hdGNoVmFyaWFibGVNb2RlbChhc3NpZ25lZDogZmFsc2UsIHVuYXNzaWduZWQ6IHRydWUpLAotICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgIH0pOwogICAgIH0pOwogCi0gICAgZ3JvdXAoJ3JlbW92ZVByb21vdGVkQWxsJywgKCkgeworICAgIGdyb3VwKCdjb25zZXJ2YXRpdmVKb2luJywgKCkgewogICAgICAgdGVzdCgndW5jaGFuZ2VkJywgKCkgewogICAgICAgICB2YXIgaCA9IF9IYXJuZXNzKCk7CiAgICAgICAgIHZhciBzMSA9IEZsb3dNb2RlbDxfVmFyLCBfVHlwZT4odHJ1ZSkKKyAgICAgICAgICAgIC5kZWNsYXJlKGludFFWYXIsIHRydWUpCiAgICAgICAgICAgICAudHJ5UHJvbW90ZUZvclR5cGVDaGVjayhoLCBvYmplY3RRVmFyLCBfVHlwZSgnaW50JykpCiAgICAgICAgICAgICAuaWZUcnVlOwotICAgICAgICB2YXIgczIgPSBzMS5yZW1vdmVQcm9tb3RlZEFsbChbaW50UVZhcl0sIFtdKTsKKyAgICAgICAgdmFyIHMyID0gczEuY29uc2VydmF0aXZlSm9pbihbaW50UVZhcl0sIFtdKTsKICAgICAgICAgZXhwZWN0KHMyLCBzYW1lKHMxKSk7CiAgICAgICB9KTsKIApAQCAtMjQ5Niw3ICsyNDUwLDcgQEAKICAgICAgICAgICAgIC5pZlRydWUKICAgICAgICAgICAgIC50cnlQcm9tb3RlRm9yVHlwZUNoZWNrKGgsIGludFFWYXIsIF9UeXBlKCdpbnQnKSkKICAgICAgICAgICAgIC5pZlRydWU7Ci0gICAgICAgIHZhciBzMiA9IHMxLnJlbW92ZVByb21vdGVkQWxsKFtpbnRRVmFyXSwgW10pOworICAgICAgICB2YXIgczIgPSBzMS5jb25zZXJ2YXRpdmVKb2luKFtpbnRRVmFyXSwgW10pOwogICAgICAgICBleHBlY3QoczIucmVhY2hhYmxlLCB0cnVlKTsKICAgICAgICAgZXhwZWN0KHMyLnZhcmlhYmxlSW5mbywgewogICAgICAgICAgIG9iamVjdFFWYXI6IF9tYXRjaFZhcmlhYmxlTW9kZWwoY2hhaW46IFsnaW50J10sIG9mSW50ZXJlc3Q6IFsnaW50J10pLApAQCAtMjUxMSw3ICsyNDY1LDcgQEAKICAgICAgICAgICAgIC5pZlRydWUKICAgICAgICAgICAgIC50cnlQcm9tb3RlRm9yVHlwZUNoZWNrKGgsIGludFFWYXIsIF9UeXBlKCdpbnQnKSkKICAgICAgICAgICAgIC5pZlRydWU7Ci0gICAgICAgIHZhciBzMiA9IHMxLnJlbW92ZVByb21vdGVkQWxsKFtdLCBbaW50UVZhcl0pOworICAgICAgICB2YXIgczIgPSBzMS5jb25zZXJ2YXRpdmVKb2luKFtdLCBbaW50UVZhcl0pOwogICAgICAgICBleHBlY3QoczIucmVhY2hhYmxlLCB0cnVlKTsKICAgICAgICAgZXhwZWN0KHMyLnZhcmlhYmxlSW5mbywgewogICAgICAgICAgIG9iamVjdFFWYXI6IF9tYXRjaFZhcmlhYmxlTW9kZWwoY2hhaW46IFsnaW50J10sIG9mSW50ZXJlc3Q6IFsnaW50J10pLApAQCAtMjU2NCw4ICsyNTE4LDggQEAKICAgICAgICAgICAgIC5kZWNsYXJlKGMsIGZhbHNlKQogICAgICAgICAgICAgLmRlY2xhcmUoZCwgZmFsc2UpOwogICAgICAgICAvLyBJbiBzMSwgYSBhbmQgYiBhcmUgd3JpdGUgY2FwdHVyZWQuICBJbiBzMiwgYSBhbmQgYyBhcmUuCi0gICAgICAgIHZhciBzMSA9IHMwLnJlbW92ZVByb21vdGVkQWxsKFthLCBiXSwgW2EsIGJdKTsKLSAgICAgICAgdmFyIHMyID0gczEucmVtb3ZlUHJvbW90ZWRBbGwoW2EsIGNdLCBbYSwgY10pOworICAgICAgICB2YXIgczEgPSBzMC5jb25zZXJ2YXRpdmVKb2luKFthLCBiXSwgW2EsIGJdKTsKKyAgICAgICAgdmFyIHMyID0gczEuY29uc2VydmF0aXZlSm9pbihbYSwgY10sIFthLCBjXSk7CiAgICAgICAgIHZhciByZXN1bHQgPSBzMi5yZXN0cmljdChoLCBzMSwgU2V0KCkpOwogICAgICAgICBleHBlY3QoCiAgICAgICAgICAgcmVzdWx0LmluZm9Gb3IoYSksCmRpZmYgLS1naXQgYS9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC90ZXN0L2Zsb3dfYW5hbHlzaXMvbnVsbGFiaWxpdHkvZGF0YS9pc3N1ZTQyNTA0LmRhcnQgYi9wa2cvX2ZlX2FuYWx5emVyX3NoYXJlZC90ZXN0L2Zsb3dfYW5hbHlzaXMvbnVsbGFiaWxpdHkvZGF0YS9pc3N1ZTQyNTA0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZDEzOAotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9fZmVfYW5hbHl6ZXJfc2hhcmVkL3Rlc3QvZmxvd19hbmFseXNpcy9udWxsYWJpbGl0eS9kYXRhL2lzc3VlNDI1MDQuZGFydApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworYWJzdHJhY3QgY2xhc3MgQmFyIHt9CisKK2Fic3RyYWN0IGNsYXNzIEZvbyB7CisgIGR5bmFtaWMgZ2V0IF9tYXA7CisKKyAgQmFyPyBwdXRJZkFic2VudChPYmplY3Qga2V5LCBCYXIgbG9hZGVyKCkpIHsKKyAgICBhc3NlcnQoa2V5ICE9IG51bGwpOworICAgIGFzc2VydChsb2FkZXIgIT0gbnVsbCk7CisgICAgQmFyPyByZXN1bHQgPSBfbWFwW2tleV0/LnJlc3VsdDsKKyAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAvKm5vbk51bGxhYmxlKi8gcmVzdWx0OworICAgIH0KKyAgICByZXN1bHQgPSBsb2FkZXIoKTsKKyAgICAvKm5vbk51bGxhYmxlKi8gcmVzdWx0OworICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBsb2FkZXIoKTsKKyAgICAgIC8qbm9uTnVsbGFibGUqLyByZXN1bHQ7CisgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHJldHVybiAvKm5vbk51bGxhYmxlKi8gcmVzdWx0OworICB9Cit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2NpZGVyL2NvbXBsZXRpb24uZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9jaWRlci9jb21wbGV0aW9uLmRhcnQKaW5kZXggZjk0MjU2Ni4uYTMwNDlkMzQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9jaWRlci9jb21wbGV0aW9uLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2NpZGVyL2NvbXBsZXRpb24uZGFydApAQCAtMTMsOSArMTMsOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29tcGxldGlvbi9maWx0ZXJpbmcvZnV6enlfbWF0Y2hlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JyBzaG93IExpYnJhcnlFbGVtZW50OwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3BlcmZvcm1hbmNlX2xvZ2dlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9wZXJmb3JtYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9yZXNvbHZlX2ZpbGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnRkb2MvZGFydGRvY19kaXJlY3RpdmVfaW5mby5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdXRpbC9wZXJmb3JtYW5jZS9vcGVyYXRpb25fcGVyZm9ybWFuY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbW1vbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKQEAgLTMyLDggKzMyLDggQEAKICAgZmluYWwgQ2lkZXJDb21wbGV0aW9uQ2FjaGUgX2NhY2hlOwogICBmaW5hbCBGaWxlUmVzb2x2ZXIgX2ZpbGVSZXNvbHZlcjsKIAotICBmaW5hbCBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBfcGVyZm9ybWFuY2VSb290ID0KLSAgICAgIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKCc8cm9vdD4nKTsKKyAgZmluYWwgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIF9wZXJmb3JtYW5jZVJvb3QgPQorICAgICAgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKCc8cm9vdD4nKTsKIAogICBEYXJ0Q29tcGxldGlvblJlcXVlc3RJbXBsIF9kYXJ0Q29tcGxldGlvblJlcXVlc3Q7CiAKQEAgLTEwMywyMyArMTAzLDE4IEBACiAgICAgICAgICAgICApOwogCiAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbWFuYWdlci5jb21wdXRlU3VnZ2VzdGlvbnMoCisgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLAogICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdCwKICAgICAgICAgICAgICAgZW5hYmxlVXJpQ29udHJpYnV0b3I6IGZhbHNlLAogICAgICAgICAgICAgKTsKICAgICAgICAgICB9KTsKIAotICAgICAgICAgIGZvciAodmFyIG9wZXJhdGlvbiBpbiBjb21wbGV0aW9uUmVxdWVzdC5wZXJmb3JtYW5jZS5vcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBwZXJmb3JtYW5jZS5hZGRDaGlsZEZpeGVkKAotICAgICAgICAgICAgICBvcGVyYXRpb24ubmFtZSwKLSAgICAgICAgICAgICAgb3BlcmF0aW9uLmVsYXBzZWQsCi0gICAgICAgICAgICApOwotICAgICAgICAgIH0KLQogICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0sCiAgICAgICApOwogCiAgICAgICBfZGFydENvbXBsZXRpb25SZXF1ZXN0ID0gYXdhaXQgRGFydENvbXBsZXRpb25SZXF1ZXN0SW1wbC5mcm9tKAorICAgICAgICBwZXJmb3JtYW5jZSwKICAgICAgICAgY29tcGxldGlvblJlcXVlc3QsCiAgICAgICAgIGRhcnRkb2NEaXJlY3RpdmVJbmZvLAogICAgICAgKTsKQEAgLTEyOSw3ICsxMjQsOCBAQAogICAgICAgICAgIF9sb2dnZXIucnVuKCdBZGQgaW1wb3J0ZWQgc3VnZ2VzdGlvbnMnLCAoKSB7CiAgICAgICAgICAgICBzdWdnZXN0aW9ucy5hZGRBbGwoCiAgICAgICAgICAgICAgIF9pbXBvcnRlZExpYnJhcmllc1N1Z2dlc3Rpb25zKAotICAgICAgICAgICAgICAgIHJlc29sdmVkVW5pdC5saWJyYXJ5RWxlbWVudCwKKyAgICAgICAgICAgICAgICB0YXJnZXQ6IHJlc29sdmVkVW5pdC5saWJyYXJ5RWxlbWVudCwKKyAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogcGVyZm9ybWFuY2UsCiAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICApOwogICAgICAgICAgIH0pOwpAQCAtMTg3LDEyICsxODMsMTYgQEAKICAgLy8vCiAgIC8vLyBUT0RPKHNjaGVnbG92KSBJbXBsZW1lbnQgc2hvdyAvIGhpZGUgY29tYmluYXRvcnMuCiAgIC8vLyBUT0RPKHNjaGVnbG92KSBJbXBsZW1lbnQgcHJlZml4ZXMuCi0gIExpc3Q8Q29tcGxldGlvblN1Z2dlc3Rpb24+IF9pbXBvcnRlZExpYnJhcmllc1N1Z2dlc3Rpb25zKAotICAgIExpYnJhcnlFbGVtZW50IHRhcmdldCwKLSAgKSB7CisgIExpc3Q8Q29tcGxldGlvblN1Z2dlc3Rpb24+IF9pbXBvcnRlZExpYnJhcmllc1N1Z2dlc3Rpb25zKHsKKyAgICBAcmVxdWlyZWQgTGlicmFyeUVsZW1lbnQgdGFyZ2V0LAorICAgIEByZXF1aXJlZCBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCisgIH0pIHsKICAgICB2YXIgc3VnZ2VzdGlvbnMgPSA8Q29tcGxldGlvblN1Z2dlc3Rpb24+W107CiAgICAgZm9yICh2YXIgaW1wb3J0ZWRMaWJyYXJ5IGluIHRhcmdldC5pbXBvcnRlZExpYnJhcmllcykgewotICAgICAgdmFyIGltcG9ydGVkU3VnZ2VzdGlvbnMgPSBfaW1wb3J0ZWRMaWJyYXJ5U3VnZ2VzdGlvbnMoaW1wb3J0ZWRMaWJyYXJ5KTsKKyAgICAgIHZhciBpbXBvcnRlZFN1Z2dlc3Rpb25zID0gX2ltcG9ydGVkTGlicmFyeVN1Z2dlc3Rpb25zKAorICAgICAgICBlbGVtZW50OiBpbXBvcnRlZExpYnJhcnksCisgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICk7CiAgICAgICBzdWdnZXN0aW9ucy5hZGRBbGwoaW1wb3J0ZWRTdWdnZXN0aW9ucyk7CiAgICAgfQogICAgIHJldHVybiBzdWdnZXN0aW9uczsKQEAgLTIwMCwxMSArMjAwLDE1IEBACiAKICAgLy8vIFJldHVybiBjYWNoZWQsIG9yIGNvbXB1dGUgdW5wcmVmaXhlZCBzdWdnZXN0aW9ucyBmb3IgYWxsIGVsZW1lbnRzCiAgIC8vLyBleHBvcnRlZCBmcm9tIHRoZSBsaWJyYXJ5LgotICBMaXN0PENvbXBsZXRpb25TdWdnZXN0aW9uPiBfaW1wb3J0ZWRMaWJyYXJ5U3VnZ2VzdGlvbnMoCi0gICAgTGlicmFyeUVsZW1lbnQgZWxlbWVudCwKLSAgKSB7CisgIExpc3Q8Q29tcGxldGlvblN1Z2dlc3Rpb24+IF9pbXBvcnRlZExpYnJhcnlTdWdnZXN0aW9ucyh7CisgICAgQHJlcXVpcmVkIExpYnJhcnlFbGVtZW50IGVsZW1lbnQsCisgICAgQHJlcXVpcmVkIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgfSkgewogICAgIHZhciBwYXRoID0gZWxlbWVudC5zb3VyY2UuZnVsbE5hbWU7Ci0gICAgdmFyIHNpZ25hdHVyZSA9IF9maWxlUmVzb2x2ZXIuZ2V0TGlicmFyeUxpbmtlZFNpZ25hdHVyZShwYXRoKTsKKyAgICB2YXIgc2lnbmF0dXJlID0gX2ZpbGVSZXNvbHZlci5nZXRMaWJyYXJ5TGlua2VkU2lnbmF0dXJlKAorICAgICAgcGF0aDogcGF0aCwKKyAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICApOwogCiAgICAgdmFyIGNhY2hlRW50cnkgPSBfY2FjaGUuX2ltcG9ydGVkTGlicmFyaWVzW3BhdGhdOwogICAgIGlmIChjYWNoZUVudHJ5ID09IG51bGwgfHwgY2FjaGVFbnRyeS5zaWduYXR1cmUgIT0gc2lnbmF0dXJlKSB7CkBAIC0yNDcsNyArMjUxLDcgQEAKICAgZmluYWwgRHVyYXRpb24gc3VnZ2VzdGlvbnM7CiAKICAgLy8vIFRoZSB0cmVlIG9mIG9wZXJhdGlvbiBwZXJmb3JtYW5jZXMuCi0gIGZpbmFsIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2Ugb3BlcmF0aW9uczsKKyAgZmluYWwgT3BlcmF0aW9uUGVyZm9ybWFuY2Ugb3BlcmF0aW9uczsKIAogICBDaWRlckNvbXBsZXRpb25QZXJmb3JtYW5jZS5fKHsKICAgICBAcmVxdWlyZWQgdGhpcy5maWxlLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2RvbWFpbl9jb21wbGV0aW9uLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZG9tYWluX2NvbXBsZXRpb24uZGFydAppbmRleCA1ZGFjMDdhLi5jZDljYjk0IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZG9tYWluX2NvbXBsZXRpb24uZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZG9tYWluX2NvbXBsZXRpb24uZGFydApAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYW5hbHlzaXMvc2Vzc2lvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9leGNlcHRpb24vZXhjZXB0aW9uLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vcHJvdG9jb2wvcHJvdG9jb2wuZGFydCcgYXMgcGx1Z2luOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi9wcm90b2NvbC9wcm90b2NvbF9jb21tb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbnN0YW50cy5kYXJ0JyBhcyBwbHVnaW47CkBAIC02Myw2ICs2NCw3IEBACiAgIC8vLyBbcmVzdWx0c10uIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBhcHBlbmQgYXQgbGVhc3Qgb25lCiAgIC8vLyByZXN1bHQgdG8gdGhlIFtjb250cm9sbGVyXSwgYW5kIGNsb3NlIHRoZSBjb250cm9sbGVyIHN0cmVhbSBvbmNlIGNvbXBsZXRlLgogICBGdXR1cmU8Q29tcGxldGlvblJlc3VsdD4gY29tcHV0ZVN1Z2dlc3Rpb25zKAorICAgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmLAogICAgIENvbXBsZXRpb25SZXF1ZXN0SW1wbCByZXF1ZXN0LAogICAgIENvbXBsZXRpb25HZXRTdWdnZXN0aW9uc1BhcmFtcyBwYXJhbXMsCiAgICAgU2V0PEVsZW1lbnRLaW5kPiBpbmNsdWRlZEVsZW1lbnRLaW5kcywKQEAgLTg4LDI5ICs5MCwzMSBAQAogICAgIHZhciBzdWdnZXN0aW9ucyA9IDxDb21wbGV0aW9uU3VnZ2VzdGlvbj5bXTsKICAgICBpZiAocmVxdWVzdC5yZXN1bHQgIT0gbnVsbCkgewogICAgICAgY29uc3QgQ09NUFVURV9TVUdHRVNUSU9OU19UQUcgPSAnY29tcHV0ZVN1Z2dlc3Rpb25zJzsKLSAgICAgIHBlcmZvcm1hbmNlLmxvZ1N0YXJ0VGltZShDT01QVVRFX1NVR0dFU1RJT05TX1RBRyk7Ci0KLSAgICAgIHZhciBtYW5hZ2VyID0gRGFydENvbXBsZXRpb25NYW5hZ2VyKAotICAgICAgICBkYXJ0ZG9jRGlyZWN0aXZlSW5mbzogc2VydmVyLmdldERhcnRkb2NEaXJlY3RpdmVJbmZvRm9yKHJlcXVlc3QucmVzdWx0KSwKLSAgICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHM6IGluY2x1ZGVkRWxlbWVudEtpbmRzLAotICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lczogaW5jbHVkZWRFbGVtZW50TmFtZXMsCi0gICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3M6IGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3MsCi0gICAgICApOwotCi0gICAgICB2YXIgY29udHJpYnV0b3JUYWcgPSAnY29tcHV0ZVN1Z2dlc3Rpb25zIC0gJHttYW5hZ2VyLnJ1bnRpbWVUeXBlfSc7Ci0gICAgICBwZXJmb3JtYW5jZS5sb2dTdGFydFRpbWUoY29udHJpYnV0b3JUYWcpOwotICAgICAgdHJ5IHsKLSAgICAgICAgc3VnZ2VzdGlvbnMuYWRkQWxsKAotICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcHV0ZVN1Z2dlc3Rpb25zKAotICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAorICAgICAgYXdhaXQgcGVyZi5ydW5Bc3luYyhDT01QVVRFX1NVR0dFU1RJT05TX1RBRywgKHBlcmYpIGFzeW5jIHsKKyAgICAgICAgdmFyIG1hbmFnZXIgPSBEYXJ0Q29tcGxldGlvbk1hbmFnZXIoCisgICAgICAgICAgZGFydGRvY0RpcmVjdGl2ZUluZm86IHNlcnZlci5nZXREYXJ0ZG9jRGlyZWN0aXZlSW5mb0ZvcigKKyAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LAogICAgICAgICAgICksCisgICAgICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHM6IGluY2x1ZGVkRWxlbWVudEtpbmRzLAorICAgICAgICAgIGluY2x1ZGVkRWxlbWVudE5hbWVzOiBpbmNsdWRlZEVsZW1lbnROYW1lcywKKyAgICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzOiBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzLAogICAgICAgICApOwotICAgICAgfSBvbiBBYm9ydENvbXBsZXRpb24gewotICAgICAgICBzdWdnZXN0aW9ucy5jbGVhcigpOwotICAgICAgfQotICAgICAgcGVyZm9ybWFuY2UubG9nRWxhcHNlVGltZShjb250cmlidXRvclRhZyk7Ci0gICAgICBwZXJmb3JtYW5jZS5sb2dFbGFwc2VUaW1lKENPTVBVVEVfU1VHR0VTVElPTlNfVEFHKTsKKworICAgICAgICB2YXIgY29udHJpYnV0b3JUYWcgPSAnY29tcHV0ZVN1Z2dlc3Rpb25zIC0gJHttYW5hZ2VyLnJ1bnRpbWVUeXBlfSc7CisgICAgICAgIGF3YWl0IHBlcmYucnVuQXN5bmMoY29udHJpYnV0b3JUYWcsIChwZXJmb3JtYW5jZSkgYXN5bmMgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdWdnZXN0aW9ucy5hZGRBbGwoCisgICAgICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcHV0ZVN1Z2dlc3Rpb25zKAorICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLAorICAgICAgICAgICAgICAgIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgZW5hYmxlVXJpQ29udHJpYnV0b3I6IHRydWUsCisgICAgICAgICAgICAgICksCisgICAgICAgICAgICApOworICAgICAgICAgIH0gb24gQWJvcnRDb21wbGV0aW9uIHsKKyAgICAgICAgICAgIHN1Z2dlc3Rpb25zLmNsZWFyKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0pOwogICAgIH0KICAgICAvLyBUT0RPIChkYW5ydWJlbCkgaWYgcmVxdWVzdCBpcyBvYnNvbGV0ZSAocHJvY2Vzc0FuYWx5c2lzUmVxdWVzdCByZXR1cm5zCiAgICAgLy8gZmFsc2UpIHRoZW4gc2VuZCBlbXB0eSByZXN1bHRzCkBAIC0yODksOTUgKzI5Myw5NSBAQAogICBGdXR1cmU8dm9pZD4gcHJvY2Vzc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CiAgICAgcGVyZm9ybWFuY2UgPSBDb21wbGV0aW9uUGVyZm9ybWFuY2UoKTsKIAotICAgIC8vIGV4dHJhY3QgYW5kIHZhbGlkYXRlIHBhcmFtcwotICAgIHZhciBwYXJhbXMgPSBDb21wbGV0aW9uR2V0U3VnZ2VzdGlvbnNQYXJhbXMuZnJvbVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgdmFyIGZpbGUgPSBwYXJhbXMuZmlsZTsKLSAgICB2YXIgb2Zmc2V0ID0gcGFyYW1zLm9mZnNldDsKKyAgICBhd2FpdCBwZXJmb3JtYW5jZS5ydW5SZXF1ZXN0T3BlcmF0aW9uKChwZXJmKSBhc3luYyB7CisgICAgICAvLyBleHRyYWN0IGFuZCB2YWxpZGF0ZSBwYXJhbXMKKyAgICAgIHZhciBwYXJhbXMgPSBDb21wbGV0aW9uR2V0U3VnZ2VzdGlvbnNQYXJhbXMuZnJvbVJlcXVlc3QocmVxdWVzdCk7CisgICAgICB2YXIgZmlsZSA9IHBhcmFtcy5maWxlOworICAgICAgdmFyIG9mZnNldCA9IHBhcmFtcy5vZmZzZXQ7CiAKLSAgICBpZiAoc2VydmVyLnNlbmRSZXNwb25zZUVycm9ySWZJbnZhbGlkRmlsZVBhdGgocmVxdWVzdCwgZmlsZSkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YXIgcmVzb2x2ZWRVbml0ID0gYXdhaXQgc2VydmVyLmdldFJlc29sdmVkVW5pdChmaWxlKTsKLSAgICBzZXJ2ZXIucmVxdWVzdFN0YXRpc3RpY3M/LmFkZEl0ZW1UaW1lTm93KHJlcXVlc3QsICdyZXNvbHZlZFVuaXQnKTsKLSAgICBpZiAocmVzb2x2ZWRVbml0Py5zdGF0ZSA9PSBSZXN1bHRTdGF0ZS5WQUxJRCkgewotICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gcmVzb2x2ZWRVbml0LmNvbnRlbnQubGVuZ3RoKSB7Ci0gICAgICAgIHNlcnZlci5zZW5kUmVzcG9uc2UoUmVzcG9uc2UuaW52YWxpZFBhcmFtZXRlcigKLSAgICAgICAgICAgIHJlcXVlc3QsCi0gICAgICAgICAgICAncGFyYW1zLm9mZnNldCcsCi0gICAgICAgICAgICAnRXhwZWN0ZWQgb2Zmc2V0IGJldHdlZW4gMCBhbmQgc291cmNlIGxlbmd0aCBpbmNsdXNpdmUsJwotICAgICAgICAgICAgICAgICcgYnV0IGZvdW5kICRvZmZzZXQnKSk7CisgICAgICBpZiAoc2VydmVyLnNlbmRSZXNwb25zZUVycm9ySWZJbnZhbGlkRmlsZVBhdGgocmVxdWVzdCwgZmlsZSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogCi0gICAgICByZWNvcmRSZXF1ZXN0KHBlcmZvcm1hbmNlLCBmaWxlLCByZXNvbHZlZFVuaXQuY29udGVudCwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgdmFyIGNvbXBsZXRpb25SZXF1ZXN0ID0gQ29tcGxldGlvblJlcXVlc3RJbXBsKAotICAgICAgICByZXNvbHZlZFVuaXQsIG9mZnNldCwgc2VydmVyLm9wdGlvbnMudXNlTmV3UmVsZXZhbmNlLCBwZXJmb3JtYW5jZSk7CisgICAgICB2YXIgcmVzb2x2ZWRVbml0ID0gYXdhaXQgc2VydmVyLmdldFJlc29sdmVkVW5pdChmaWxlKTsKKyAgICAgIHNlcnZlci5yZXF1ZXN0U3RhdGlzdGljcz8uYWRkSXRlbVRpbWVOb3cocmVxdWVzdCwgJ3Jlc29sdmVkVW5pdCcpOworICAgICAgaWYgKHJlc29sdmVkVW5pdD8uc3RhdGUgPT0gUmVzdWx0U3RhdGUuVkFMSUQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gcmVzb2x2ZWRVbml0LmNvbnRlbnQubGVuZ3RoKSB7CisgICAgICAgICAgc2VydmVyLnNlbmRSZXNwb25zZShSZXNwb25zZS5pbnZhbGlkUGFyYW1ldGVyKAorICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAncGFyYW1zLm9mZnNldCcsCisgICAgICAgICAgICAgICdFeHBlY3RlZCBvZmZzZXQgYmV0d2VlbiAwIGFuZCBzb3VyY2UgbGVuZ3RoIGluY2x1c2l2ZSwnCisgICAgICAgICAgICAgICAgICAnIGJ1dCBmb3VuZCAkb2Zmc2V0JykpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgdmFyIGNvbXBsZXRpb25JZCA9IChfbmV4dENvbXBsZXRpb25JZCsrKS50b1N0cmluZygpOworICAgICAgICByZWNvcmRSZXF1ZXN0KHBlcmZvcm1hbmNlLCBmaWxlLCByZXNvbHZlZFVuaXQuY29udGVudCwgb2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIHZhciBjb21wbGV0aW9uUmVxdWVzdCA9IENvbXBsZXRpb25SZXF1ZXN0SW1wbCgKKyAgICAgICAgICByZXNvbHZlZFVuaXQsIG9mZnNldCwgc2VydmVyLm9wdGlvbnMudXNlTmV3UmVsZXZhbmNlLCBwZXJmb3JtYW5jZSk7CiAKLSAgICBzZXROZXdSZXF1ZXN0KGNvbXBsZXRpb25SZXF1ZXN0KTsKKyAgICAgIHZhciBjb21wbGV0aW9uSWQgPSAoX25leHRDb21wbGV0aW9uSWQrKykudG9TdHJpbmcoKTsKIAotICAgIC8vIGluaXRpYWwgcmVzcG9uc2Ugd2l0aG91dCByZXN1bHRzCi0gICAgc2VydmVyLnNlbmRSZXNwb25zZSgKLSAgICAgICAgQ29tcGxldGlvbkdldFN1Z2dlc3Rpb25zUmVzdWx0KGNvbXBsZXRpb25JZCkudG9SZXNwb25zZShyZXF1ZXN0LmlkKSk7CisgICAgICBzZXROZXdSZXF1ZXN0KGNvbXBsZXRpb25SZXF1ZXN0KTsKIAotICAgIC8vIElmIHRoZSBjbGllbnQgb3B0ZWQgaW50byB1c2luZyBhdmFpbGFibGUgc3VnZ2VzdGlvbiBzZXRzLAotICAgIC8vIGNyZWF0ZSB0aGUga2luZHMgc2V0LCBzbyBzaWduYWwgdGhlIGNvbXBsZXRpb24gbWFuYWdlciBhYm91dCBvcHQtaW4uCi0gICAgU2V0PEVsZW1lbnRLaW5kPiBpbmNsdWRlZEVsZW1lbnRLaW5kczsKLSAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlZEVsZW1lbnROYW1lczsKLSAgICBMaXN0PEluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZz4gaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFnczsKLSAgICBpZiAoc3Vic2NyaXB0aW9ucy5jb250YWlucyhDb21wbGV0aW9uU2VydmljZS5BVkFJTEFCTEVfU1VHR0VTVElPTl9TRVRTKSkgewotICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHMgPSA8RWxlbWVudEtpbmQ+e307Ci0gICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcyA9IDxTdHJpbmc+e307Ci0gICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzID0gPEluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZz5bXTsKLSAgICB9CisgICAgICAvLyBpbml0aWFsIHJlc3BvbnNlIHdpdGhvdXQgcmVzdWx0cworICAgICAgc2VydmVyLnNlbmRSZXNwb25zZSgKKyAgICAgICAgICBDb21wbGV0aW9uR2V0U3VnZ2VzdGlvbnNSZXN1bHQoY29tcGxldGlvbklkKS50b1Jlc3BvbnNlKHJlcXVlc3QuaWQpKTsKIAotICAgIC8vIENvbXB1dGUgc3VnZ2VzdGlvbnMgaW4gdGhlIGJhY2tncm91bmQKLSAgICBjb21wdXRlU3VnZ2VzdGlvbnMoCi0gICAgICBjb21wbGV0aW9uUmVxdWVzdCwKLSAgICAgIHBhcmFtcywKLSAgICAgIGluY2x1ZGVkRWxlbWVudEtpbmRzLAotICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXMsCi0gICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzLAotICAgICkudGhlbigoQ29tcGxldGlvblJlc3VsdCByZXN1bHQpIHsKLSAgICAgIFN0cmluZyBsaWJyYXJ5RmlsZTsKLSAgICAgIHZhciBpbmNsdWRlZFN1Z2dlc3Rpb25TZXRzID0gPEluY2x1ZGVkU3VnZ2VzdGlvblNldD5bXTsKLSAgICAgIGlmIChpbmNsdWRlZEVsZW1lbnRLaW5kcyAhPSBudWxsICYmIHJlc29sdmVkVW5pdCAhPSBudWxsKSB7Ci0gICAgICAgIGxpYnJhcnlGaWxlID0gcmVzb2x2ZWRVbml0LmxpYnJhcnlFbGVtZW50LnNvdXJjZS5mdWxsTmFtZTsKLSAgICAgICAgc2VydmVyLnNlbmROb3RpZmljYXRpb24oCi0gICAgICAgICAgY3JlYXRlRXhpc3RpbmdJbXBvcnRzTm90aWZpY2F0aW9uKHJlc29sdmVkVW5pdCksCi0gICAgICAgICk7Ci0gICAgICAgIGNvbXB1dGVJbmNsdWRlZFNldExpc3QoCi0gICAgICAgICAgc2VydmVyLmRlY2xhcmF0aW9uc1RyYWNrZXIsCi0gICAgICAgICAgcmVzb2x2ZWRVbml0LAotICAgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblNldHMsCi0gICAgICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXMsCi0gICAgICAgICk7CisgICAgICAvLyBJZiB0aGUgY2xpZW50IG9wdGVkIGludG8gdXNpbmcgYXZhaWxhYmxlIHN1Z2dlc3Rpb24gc2V0cywKKyAgICAgIC8vIGNyZWF0ZSB0aGUga2luZHMgc2V0LCBzbyBzaWduYWwgdGhlIGNvbXBsZXRpb24gbWFuYWdlciBhYm91dCBvcHQtaW4uCisgICAgICBTZXQ8RWxlbWVudEtpbmQ+IGluY2x1ZGVkRWxlbWVudEtpbmRzOworICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZWRFbGVtZW50TmFtZXM7CisgICAgICBMaXN0PEluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZz4gaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFnczsKKyAgICAgIGlmIChzdWJzY3JpcHRpb25zLmNvbnRhaW5zKENvbXBsZXRpb25TZXJ2aWNlLkFWQUlMQUJMRV9TVUdHRVNUSU9OX1NFVFMpKSB7CisgICAgICAgIGluY2x1ZGVkRWxlbWVudEtpbmRzID0gPEVsZW1lbnRLaW5kPnt9OworICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcyA9IDxTdHJpbmc+e307CisgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3MgPSA8SW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFnPltdOwogICAgICAgfQogCi0gICAgICBjb25zdCBTRU5EX05PVElGSUNBVElPTl9UQUcgPSAnc2VuZCBub3RpZmljYXRpb24nOwotICAgICAgcGVyZm9ybWFuY2UubG9nU3RhcnRUaW1lKFNFTkRfTk9USUZJQ0FUSU9OX1RBRyk7Ci0gICAgICBzZW5kQ29tcGxldGlvbk5vdGlmaWNhdGlvbigKLSAgICAgICAgY29tcGxldGlvbklkLAotICAgICAgICByZXN1bHQucmVwbGFjZW1lbnRPZmZzZXQsCi0gICAgICAgIHJlc3VsdC5yZXBsYWNlbWVudExlbmd0aCwKLSAgICAgICAgcmVzdWx0LnN1Z2dlc3Rpb25zLAotICAgICAgICBsaWJyYXJ5RmlsZSwKLSAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uU2V0cywKLSAgICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHM/LnRvTGlzdCgpLAotICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzLAotICAgICAgKTsKLSAgICAgIHBlcmZvcm1hbmNlLmxvZ0VsYXBzZVRpbWUoU0VORF9OT1RJRklDQVRJT05fVEFHKTsKKyAgICAgIC8vIENvbXB1dGUgc3VnZ2VzdGlvbnMgaW4gdGhlIGJhY2tncm91bmQKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb21wdXRlU3VnZ2VzdGlvbnMoCisgICAgICAgICAgcGVyZiwKKyAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdCwKKyAgICAgICAgICBwYXJhbXMsCisgICAgICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHMsCisgICAgICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXMsCisgICAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncywKKyAgICAgICAgKTsKKyAgICAgICAgU3RyaW5nIGxpYnJhcnlGaWxlOworICAgICAgICB2YXIgaW5jbHVkZWRTdWdnZXN0aW9uU2V0cyA9IDxJbmNsdWRlZFN1Z2dlc3Rpb25TZXQ+W107CisgICAgICAgIGlmIChpbmNsdWRlZEVsZW1lbnRLaW5kcyAhPSBudWxsICYmIHJlc29sdmVkVW5pdCAhPSBudWxsKSB7CisgICAgICAgICAgbGlicmFyeUZpbGUgPSByZXNvbHZlZFVuaXQubGlicmFyeUVsZW1lbnQuc291cmNlLmZ1bGxOYW1lOworICAgICAgICAgIHNlcnZlci5zZW5kTm90aWZpY2F0aW9uKAorICAgICAgICAgICAgY3JlYXRlRXhpc3RpbmdJbXBvcnRzTm90aWZpY2F0aW9uKHJlc29sdmVkVW5pdCksCisgICAgICAgICAgKTsKKyAgICAgICAgICBjb21wdXRlSW5jbHVkZWRTZXRMaXN0KAorICAgICAgICAgICAgc2VydmVyLmRlY2xhcmF0aW9uc1RyYWNrZXIsCisgICAgICAgICAgICByZXNvbHZlZFVuaXQsCisgICAgICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25TZXRzLAorICAgICAgICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXMsCisgICAgICAgICAgKTsKKyAgICAgICAgfQogCi0gICAgICBwZXJmb3JtYW5jZS5ub3RpZmljYXRpb25Db3VudCA9IDE7Ci0gICAgICBwZXJmb3JtYW5jZS5sb2dGaXJzdE5vdGlmaWNhdGlvbkNvbXBsZXRlKCdub3RpZmljYXRpb24gMSBjb21wbGV0ZScpOwotICAgICAgcGVyZm9ybWFuY2Uuc3VnZ2VzdGlvbkNvdW50Rmlyc3QgPSByZXN1bHQuc3VnZ2VzdGlvbnMubGVuZ3RoOwotICAgICAgcGVyZm9ybWFuY2Uuc3VnZ2VzdGlvbkNvdW50TGFzdCA9IHJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGg7Ci0gICAgICBwZXJmb3JtYW5jZS5jb21wbGV0ZSgpOwotICAgIH0pLndoZW5Db21wbGV0ZSgoKSB7Ci0gICAgICBpZk1hdGNoZXNSZXF1ZXN0Q2xlYXIoY29tcGxldGlvblJlcXVlc3QpOworICAgICAgICBjb25zdCBTRU5EX05PVElGSUNBVElPTl9UQUcgPSAnc2VuZCBub3RpZmljYXRpb24nOworICAgICAgICBwZXJmLnJ1bihTRU5EX05PVElGSUNBVElPTl9UQUcsIChfKSB7CisgICAgICAgICAgc2VuZENvbXBsZXRpb25Ob3RpZmljYXRpb24oCisgICAgICAgICAgICBjb21wbGV0aW9uSWQsCisgICAgICAgICAgICByZXN1bHQucmVwbGFjZW1lbnRPZmZzZXQsCisgICAgICAgICAgICByZXN1bHQucmVwbGFjZW1lbnRMZW5ndGgsCisgICAgICAgICAgICByZXN1bHQuc3VnZ2VzdGlvbnMsCisgICAgICAgICAgICBsaWJyYXJ5RmlsZSwKKyAgICAgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblNldHMsCisgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnRLaW5kcz8udG9MaXN0KCksCisgICAgICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzLAorICAgICAgICAgICk7CisgICAgICAgIH0pOworCisgICAgICAgIHBlcmZvcm1hbmNlLnN1Z2dlc3Rpb25Db3VudCA9IHJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGg7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZk1hdGNoZXNSZXF1ZXN0Q2xlYXIoY29tcGxldGlvblJlcXVlc3QpOworICAgICAgfQogICAgIH0pOwogICB9CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9kb21haW5zL2V4ZWN1dGlvbi9jb21wbGV0aW9uLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZG9tYWlucy9leGVjdXRpb24vY29tcGxldGlvbi5kYXJ0CmluZGV4IDI0YjBkNDYuLmJmNmQ3ODEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9kb21haW5zL2V4ZWN1dGlvbi9jb21wbGV0aW9uLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2RvbWFpbnMvZXhlY3V0aW9uL2NvbXBsZXRpb24uZGFydApAQCAtOTAsOSArOTAsMTUgQEAKICAgICAgIGZhbHNlLAogICAgICAgQ29tcGxldGlvblBlcmZvcm1hbmNlKCksCiAgICAgKTsKLSAgICB2YXIgc3VnZ2VzdGlvbnMgPSBhd2FpdCBjb250cmlidXRvci5jb21wdXRlU3VnZ2VzdGlvbnMoCi0gICAgICByZXF1ZXN0LAotICAgICAgZW5hYmxlVXJpQ29udHJpYnV0b3I6IHRydWUsCisKKyAgICB2YXIgc3VnZ2VzdGlvbnMgPSBhd2FpdCByZXF1ZXN0LnBlcmZvcm1hbmNlLnJ1blJlcXVlc3RPcGVyYXRpb24oCisgICAgICAocGVyZm9ybWFuY2UpIGFzeW5jIHsKKyAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRyaWJ1dG9yLmNvbXB1dGVTdWdnZXN0aW9ucygKKyAgICAgICAgICBwZXJmb3JtYW5jZSwKKyAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAorICAgICAgICApOworICAgICAgfSwKICAgICApOwogCiAgICAgLy8gUmVtb3ZlIGNvbXBsZXRpb25zIHdpdGggc3ludGhldGljIGltcG9ydCBwcmVmaXhlcy4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9lZGl0L2VkaXRfZG9tYWluLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZWRpdC9lZGl0X2RvbWFpbi5kYXJ0CmluZGV4IDc3OTlhM2IuLjc2MGRhNDggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9lZGl0L2VkaXRfZG9tYWluLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2VkaXQvZWRpdF9kb21haW4uZGFydApAQCAtMjcsNyArMjcsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvbWFuaWZlc3QvZml4X2dlbmVyYXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4L3B1YnNwZWMvZml4X2dlbmVyYXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4X2ludGVybmFsLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9kaXJlY3RpdmVzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9pbXBvcnRzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9zb3J0X21lbWJlcnMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL3N0YXR1cy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL3JlZmFjdG9yaW5nL3JlZmFjdG9yaW5nLmRhcnQnOwpAQCAtNTAyLDcgKzUwMiw3IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vIGRvIG9yZ2FuaXplCi0gICAgdmFyIHNvcnRlciA9IERpcmVjdGl2ZU9yZ2FuaXplcihjb2RlLCB1bml0LCBlcnJvcnMpOworICAgIHZhciBzb3J0ZXIgPSBJbXBvcnRPcmdhbml6ZXIoY29kZSwgdW5pdCwgZXJyb3JzKTsKICAgICB2YXIgZWRpdHMgPSBzb3J0ZXIub3JnYW5pemUoKTsKICAgICB2YXIgZmlsZUVkaXQgPSBTb3VyY2VGaWxlRWRpdChmaWxlLCBmaWxlU3RhbXAsIGVkaXRzOiBlZGl0cyk7CiAgICAgc2VydmVyLnNlbmRSZXNwb25zZSgKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvY29uc3RhbnRzLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2NvbnN0YW50cy5kYXJ0CmluZGV4IGIxYzIwZGYuLmJhOTFlNGIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvY29uc3RhbnRzLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2xzcC9jb25zdGFudHMuZGFydApAQCAtMTA0LDUgKzEwNCw1IEBACiAgIC8vLyAgIHJlc3RhcnQgdGhlIHNlcnZlci4gSG93ZXZlciBjbGllbnRzIHNob3VsZCBiZSBjYXJlZnVsIHRvIG5vdCByZXN0YXJ0IGEKICAgLy8vICAgY3Jhc2hpbmcgc2VydmVyIGVuZGxlc3NseS4gVlMgQ29kZSBmb3IgZXhhbXBsZSBkb2Vzbid0IHJlc3RhcnQgYSBzZXJ2ZXIKICAgLy8vICAgaWYgaXQgY3Jhc2hlcyA1IHRpbWVzIGluIHRoZSBsYXN0IDE4MCBzZWNvbmRzLiIKLSAgc3RhdGljIGNvbnN0IENsaWVudFNlcnZlckluY29uc2lzdGVudFN0YXRlID0gRXJyb3JDb2RlcygtMzIwMTApOworICBzdGF0aWMgY29uc3QgQ2xpZW50U2VydmVySW5jb25zaXN0ZW50U3RhdGUgPSBFcnJvckNvZGVzKC0zMjA5OSk7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2hhbmRsZXJzL2NvbW1hbmRzL29yZ2FuaXplX2ltcG9ydHMuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvaGFuZGxlcnMvY29tbWFuZHMvb3JnYW5pemVfaW1wb3J0cy5kYXJ0CmluZGV4IDlmYTk0YTUuLjNiZjUzMjQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvaGFuZGxlcnMvY29tbWFuZHMvb3JnYW5pemVfaW1wb3J0cy5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvaGFuZGxlcnMvY29tbWFuZHMvb3JnYW5pemVfaW1wb3J0cy5kYXJ0CkBAIC05LDcgKzksNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvbHNwL2NvbnN0YW50cy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL2xzcC9oYW5kbGVycy9jb21tYW5kcy9zaW1wbGVfZWRpdF9oYW5kbGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvbHNwL2xzcF9hbmFseXNpc19zZXJ2ZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2RpcmVjdGl2ZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2ltcG9ydHMuZGFydCc7CiAKIGNsYXNzIE9yZ2FuaXplSW1wb3J0c0NvbW1hbmRIYW5kbGVyIGV4dGVuZHMgU2ltcGxlRWRpdENvbW1hbmRIYW5kbGVyIHsKICAgT3JnYW5pemVJbXBvcnRzQ29tbWFuZEhhbmRsZXIoTHNwQW5hbHlzaXNTZXJ2ZXIgc2VydmVyKSA6IHN1cGVyKHNlcnZlcik7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIHJldHVybiBzdWNjZXNzKCk7CiAgICAgICB9CiAKLSAgICAgIGZpbmFsIG9yZ2FuaXplciA9IERpcmVjdGl2ZU9yZ2FuaXplcihjb2RlLCB1bml0LCByZXN1bHQuZXJyb3JzKTsKKyAgICAgIGZpbmFsIG9yZ2FuaXplciA9IEltcG9ydE9yZ2FuaXplcihjb2RlLCB1bml0LCByZXN1bHQuZXJyb3JzKTsKICAgICAgIGZpbmFsIGVkaXRzID0gb3JnYW5pemVyLm9yZ2FuaXplKCk7CiAKICAgICAgIHJldHVybiBzZW5kU291cmNlRWRpdHNUb0NsaWVudChkb2NJZGVudGlmaWVyLCB1bml0LCBlZGl0cyk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2hhbmRsZXJzL2hhbmRsZXJfY29kZV9hY3Rpb25zLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2hhbmRsZXJzL2hhbmRsZXJfY29kZV9hY3Rpb25zLmRhcnQKaW5kZXggNjkzMTgwNC4uZGE1N2VlMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2xzcC9oYW5kbGVycy9oYW5kbGVyX2NvZGVfYWN0aW9ucy5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvaGFuZGxlcnMvaGFuZGxlcl9jb2RlX2FjdGlvbnMuZGFydApAQCAtMzAsNiArMzAsNyBAQAogY2xhc3MgQ29kZUFjdGlvbkhhbmRsZXIgZXh0ZW5kcyBNZXNzYWdlSGFuZGxlcjxDb2RlQWN0aW9uUGFyYW1zLAogICAgIExpc3Q8RWl0aGVyMjxDb21tYW5kLCBDb2RlQWN0aW9uPj4+IHsKICAgQ29kZUFjdGlvbkhhbmRsZXIoTHNwQW5hbHlzaXNTZXJ2ZXIgc2VydmVyKSA6IHN1cGVyKHNlcnZlcik7CisKICAgQG92ZXJyaWRlCiAgIE1ldGhvZCBnZXQgaGFuZGxlc01lc3NhZ2UgPT4gTWV0aG9kLnRleHREb2N1bWVudF9jb2RlQWN0aW9uOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2hhbmRsZXJzL2hhbmRsZXJfY29tcGxldGlvbi5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL2xzcC9oYW5kbGVycy9oYW5kbGVyX2NvbXBsZXRpb24uZGFydAppbmRleCA3ZDQ0NDVkLi5jYzRiNDE1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvbHNwL2hhbmRsZXJzL2hhbmRsZXJfY29tcGxldGlvbi5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9sc3AvaGFuZGxlcnMvaGFuZGxlcl9jb21wbGV0aW9uLmRhcnQKQEAgLTE4OSwxNTQgKzE4OSwxNTQgQEAKICAgICBwZXJmb3JtYW5jZS5zZXRDb250ZW50c0FuZE9mZnNldCh1bml0LmNvbnRlbnQsIG9mZnNldCk7CiAgICAgc2VydmVyLnBlcmZvcm1hbmNlU3RhdHMuY29tcGxldGlvbi5hZGQocGVyZm9ybWFuY2UpOwogCi0gICAgZmluYWwgY29tcGxldGlvblJlcXVlc3QgPSBDb21wbGV0aW9uUmVxdWVzdEltcGwoCi0gICAgICAgIHVuaXQsIG9mZnNldCwgc2VydmVyLm9wdGlvbnMudXNlTmV3UmVsZXZhbmNlLCBwZXJmb3JtYW5jZSk7Ci0gICAgZmluYWwgZGlyZWN0aXZlSW5mbyA9Ci0gICAgICAgIHNlcnZlci5nZXREYXJ0ZG9jRGlyZWN0aXZlSW5mb0Zvcihjb21wbGV0aW9uUmVxdWVzdC5yZXN1bHQpOwotICAgIGZpbmFsIGRhcnRDb21wbGV0aW9uUmVxdWVzdCA9Ci0gICAgICAgIGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbShjb21wbGV0aW9uUmVxdWVzdCwgZGlyZWN0aXZlSW5mbyk7CisgICAgcmV0dXJuIGF3YWl0IHBlcmZvcm1hbmNlLnJ1blJlcXVlc3RPcGVyYXRpb24oKHBlcmYpIGFzeW5jIHsKKyAgICAgIGZpbmFsIGNvbXBsZXRpb25SZXF1ZXN0ID0gQ29tcGxldGlvblJlcXVlc3RJbXBsKAorICAgICAgICAgIHVuaXQsIG9mZnNldCwgc2VydmVyLm9wdGlvbnMudXNlTmV3UmVsZXZhbmNlLCBwZXJmb3JtYW5jZSk7CisgICAgICBmaW5hbCBkaXJlY3RpdmVJbmZvID0KKyAgICAgICAgICBzZXJ2ZXIuZ2V0RGFydGRvY0RpcmVjdGl2ZUluZm9Gb3IoY29tcGxldGlvblJlcXVlc3QucmVzdWx0KTsKKyAgICAgIGZpbmFsIGRhcnRDb21wbGV0aW9uUmVxdWVzdCA9IGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbSgKKyAgICAgICAgICBwZXJmLCBjb21wbGV0aW9uUmVxdWVzdCwgZGlyZWN0aXZlSW5mbyk7CiAKLSAgICBTZXQ8RWxlbWVudEtpbmQ+IGluY2x1ZGVkRWxlbWVudEtpbmRzOwotICAgIFNldDxTdHJpbmc+IGluY2x1ZGVkRWxlbWVudE5hbWVzOwotICAgIExpc3Q8SW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFnPiBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzOwotICAgIGlmIChpbmNsdWRlU3VnZ2VzdGlvblNldHMpIHsKLSAgICAgIGluY2x1ZGVkRWxlbWVudEtpbmRzID0gPEVsZW1lbnRLaW5kPnt9OwotICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXMgPSA8U3RyaW5nPnt9OwotICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncyA9IDxJbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWc+W107Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHZhciBjb250cmlidXRvciA9IERhcnRDb21wbGV0aW9uTWFuYWdlcigKLSAgICAgICAgZGFydGRvY0RpcmVjdGl2ZUluZm86IGRpcmVjdGl2ZUluZm8sCi0gICAgICAgIGluY2x1ZGVkRWxlbWVudEtpbmRzOiBpbmNsdWRlZEVsZW1lbnRLaW5kcywKLSAgICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXM6IGluY2x1ZGVkRWxlbWVudE5hbWVzLAotICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzOiBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzLAotICAgICAgKTsKLQotICAgICAgZmluYWwgc2VydmVyU3VnZ2VzdGlvbnMgPSBhd2FpdCBjb250cmlidXRvci5jb21wdXRlU3VnZ2VzdGlvbnMoCi0gICAgICAgIGNvbXBsZXRpb25SZXF1ZXN0LAotICAgICAgICBlbmFibGVVcmlDb250cmlidXRvcjogdHJ1ZSwKLSAgICAgICk7Ci0KLSAgICAgIGlmICh0b2tlbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgewotICAgICAgICByZXR1cm4gY2FuY2VsbGVkKCk7CisgICAgICBTZXQ8RWxlbWVudEtpbmQ+IGluY2x1ZGVkRWxlbWVudEtpbmRzOworICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZWRFbGVtZW50TmFtZXM7CisgICAgICBMaXN0PEluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZz4gaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFnczsKKyAgICAgIGlmIChpbmNsdWRlU3VnZ2VzdGlvblNldHMpIHsKKyAgICAgICAgaW5jbHVkZWRFbGVtZW50S2luZHMgPSA8RWxlbWVudEtpbmQ+e307CisgICAgICAgIGluY2x1ZGVkRWxlbWVudE5hbWVzID0gPFN0cmluZz57fTsKKyAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncyA9IDxJbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWc+W107CiAgICAgICB9CiAKLSAgICAgIGZpbmFsIHJlc3VsdHMgPSBzZXJ2ZXJTdWdnZXN0aW9ucwotICAgICAgICAgIC5tYXAoCi0gICAgICAgICAgICAoaXRlbSkgPT4gdG9Db21wbGV0aW9uSXRlbSgKLSAgICAgICAgICAgICAgY29tcGxldGlvbkNhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgY2xpZW50U3VwcG9ydGVkQ29tcGxldGlvbktpbmRzLAotICAgICAgICAgICAgICB1bml0LmxpbmVJbmZvLAotICAgICAgICAgICAgICBpdGVtLAotICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdC5yZXBsYWNlbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgY29tcGxldGlvblJlcXVlc3QucmVwbGFjZW1lbnRMZW5ndGgsCi0gICAgICAgICAgICApLAotICAgICAgICAgICkKLSAgICAgICAgICAudG9MaXN0KCk7Ci0KLSAgICAgIC8vIE5vdyBjb21wdXRlIGl0ZW1zIGluIHN1Z2dlc3Rpb24gc2V0cy4KLSAgICAgIHZhciBpbmNsdWRlZFN1Z2dlc3Rpb25TZXRzID0gPEluY2x1ZGVkU3VnZ2VzdGlvblNldD5bXTsKLSAgICAgIGlmIChpbmNsdWRlZEVsZW1lbnRLaW5kcyAhPSBudWxsICYmIHVuaXQgIT0gbnVsbCkgewotICAgICAgICBjb21wdXRlSW5jbHVkZWRTZXRMaXN0KAotICAgICAgICAgIHNlcnZlci5kZWNsYXJhdGlvbnNUcmFja2VyLAotICAgICAgICAgIHVuaXQsCi0gICAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uU2V0cywKLSAgICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcywKKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBjb250cmlidXRvciA9IERhcnRDb21wbGV0aW9uTWFuYWdlcigKKyAgICAgICAgICBkYXJ0ZG9jRGlyZWN0aXZlSW5mbzogZGlyZWN0aXZlSW5mbywKKyAgICAgICAgICBpbmNsdWRlZEVsZW1lbnRLaW5kczogaW5jbHVkZWRFbGVtZW50S2luZHMsCisgICAgICAgICAgaW5jbHVkZWRFbGVtZW50TmFtZXM6IGluY2x1ZGVkRWxlbWVudE5hbWVzLAorICAgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3M6IGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3MsCiAgICAgICAgICk7Ci0gICAgICB9CiAKLSAgICAgIC8vIEJ1aWxkIGEgZmFzdCBsb29rdXAgZm9yIGltcG9ydGVkIHN5bWJvbHMgc28gdGhhdCB3ZSBjYW4gZmlsdGVyIG91dAotICAgICAgLy8gZHVwbGljYXRlcy4KLSAgICAgIGZpbmFsIGFscmVhZHlJbXBvcnRlZFN5bWJvbHMgPSBfYnVpbGRMb29rdXBPZkltcG9ydGVkU3ltYm9scyh1bml0KTsKKyAgICAgICAgZmluYWwgc2VydmVyU3VnZ2VzdGlvbnMgPSBhd2FpdCBjb250cmlidXRvci5jb21wdXRlU3VnZ2VzdGlvbnMoCisgICAgICAgICAgcGVyZiwKKyAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdCwKKyAgICAgICAgICBlbmFibGVVcmlDb250cmlidXRvcjogdHJ1ZSwKKyAgICAgICAgKTsKIAotICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uU2V0cy5mb3JFYWNoKChpbmNsdWRlZFNldCkgewotICAgICAgICBmaW5hbCBsaWJyYXJ5ID0gc2VydmVyLmRlY2xhcmF0aW9uc1RyYWNrZXIuZ2V0TGlicmFyeShpbmNsdWRlZFNldC5pZCk7Ci0gICAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKLSAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICh0b2tlbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgeworICAgICAgICAgIHJldHVybiBjYW5jZWxsZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIE1ha2UgYSBmYXN0IGxvb2t1cCBmb3IgdGFnIHJlbGV2YW5jZS4KLSAgICAgICAgZmluYWwgdGFnQm9vc3RzID0gPFN0cmluZywgaW50Pnt9OwotICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzCi0gICAgICAgICAgICAuZm9yRWFjaCgodCkgPT4gdGFnQm9vc3RzW3QudGFnXSA9IHQucmVsZXZhbmNlQm9vc3QpOwotCi0gICAgICAgIC8vIE9ubHkgc3BlY2lmaWMgdHlwZXMgb2YgY2hpbGQgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBpbmNsdWRlZC4KLSAgICAgICAgLy8gVGhpcyBsaXN0IG1hdGNoZXMgd2hhdCdzIGluIF9wcm90b2NvbEF2YWlsYWJsZVN1Z2dlc3Rpb24gaW4KLSAgICAgICAgLy8gdGhlIERBUyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgYm9vbCBzaG91bGRJbmNsdWRlQ2hpbGQoRGVjbGFyYXRpb24gY2hpbGQpID0+Ci0gICAgICAgICAgICBjaGlsZC5raW5kID09IERlY2xhcmF0aW9uS2luZC5DT05TVFJVQ1RPUiB8fAotICAgICAgICAgICAgY2hpbGQua2luZCA9PSBEZWNsYXJhdGlvbktpbmQuRU5VTV9DT05TVEFOVCB8fAotICAgICAgICAgICAgKGNoaWxkLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkdFVFRFUiAmJiBjaGlsZC5pc1N0YXRpYykgfHwKLSAgICAgICAgICAgIChjaGlsZC5raW5kID09IERlY2xhcmF0aW9uS2luZC5GSUVMRCAmJiBjaGlsZC5pc1N0YXRpYyk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdCBkZWNsYXJhdGlvbnMgYW5kIHRoZWlyIGNoaWxkcmVuLgotICAgICAgICBmaW5hbCBhbGxEZWNsYXJhdGlvbnMgPSBsaWJyYXJ5LmRlY2xhcmF0aW9ucwotICAgICAgICAgICAgLmZvbGxvd2VkQnkobGlicmFyeS5kZWNsYXJhdGlvbnMKLSAgICAgICAgICAgICAgICAuZXhwYW5kKChkZWNsKSA9PiBkZWNsLmNoaWxkcmVuLndoZXJlKHNob3VsZEluY2x1ZGVDaGlsZCkpKQorICAgICAgICBmaW5hbCByZXN1bHRzID0gc2VydmVyU3VnZ2VzdGlvbnMKKyAgICAgICAgICAgIC5tYXAoCisgICAgICAgICAgICAgIChpdGVtKSA9PiB0b0NvbXBsZXRpb25JdGVtKAorICAgICAgICAgICAgICAgIGNvbXBsZXRpb25DYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgY2xpZW50U3VwcG9ydGVkQ29tcGxldGlvbktpbmRzLAorICAgICAgICAgICAgICAgIHVuaXQubGluZUluZm8sCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdC5yZXBsYWNlbWVudE9mZnNldCwKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdC5yZXBsYWNlbWVudExlbmd0aCwKKyAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKICAgICAgICAgICAgIC50b0xpc3QoKTsKIAotICAgICAgICBmaW5hbCBzZXRSZXN1bHRzID0gYWxsRGVjbGFyYXRpb25zCi0gICAgICAgICAgICAvLyBGaWx0ZXIgdG8gb25seSB0aGUga2luZHMgd2Ugc2hvdWxkIHJldHVybi4KLSAgICAgICAgICAgIC53aGVyZSgoaXRlbSkgPT4KLSAgICAgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnRLaW5kcy5jb250YWlucyhwcm90b2NvbEVsZW1lbnRLaW5kKGl0ZW0ua2luZCkpKQotICAgICAgICAgICAgLndoZXJlKChpdGVtKSB7Ci0gICAgICAgICAgLy8gQ2hlY2sgZXhpc3RpbmcgaW1wb3J0cyB0byBlbnN1cmUgd2UgZG9uJ3QgYWxyZWFkeSBpbXBvcnQKLSAgICAgICAgICAvLyB0aGlzIGVsZW1lbnQgKHRoaXMgZXhhY3QgZWxlbWVudCBmcm9tIGl0cyBkZWNsYXJpbmcKLSAgICAgICAgICAvLyBsaWJyYXJ5LCBub3QganVzdCBzb21ldGhpbmcgd2l0aCB0aGUgc2FtZSBuYW1lKS4gSWYgd2UgZG8KLSAgICAgICAgICAvLyB3ZSdsbCB3YW50IHRvIHNraXAgaXQuCi0gICAgICAgICAgZmluYWwgZGVjbGFyaW5nVXJpID0gaXRlbS5wYXJlbnQgIT0gbnVsbAotICAgICAgICAgICAgICA/IGl0ZW0ucGFyZW50LmxvY2F0aW9uTGlicmFyeVVyaQotICAgICAgICAgICAgICA6IGl0ZW0ubG9jYXRpb25MaWJyYXJ5VXJpOworICAgICAgICAvLyBOb3cgY29tcHV0ZSBpdGVtcyBpbiBzdWdnZXN0aW9uIHNldHMuCisgICAgICAgIHZhciBpbmNsdWRlZFN1Z2dlc3Rpb25TZXRzID0gPEluY2x1ZGVkU3VnZ2VzdGlvblNldD5bXTsKKyAgICAgICAgaWYgKGluY2x1ZGVkRWxlbWVudEtpbmRzICE9IG51bGwgJiYgdW5pdCAhPSBudWxsKSB7CisgICAgICAgICAgY29tcHV0ZUluY2x1ZGVkU2V0TGlzdCgKKyAgICAgICAgICAgIHNlcnZlci5kZWNsYXJhdGlvbnNUcmFja2VyLAorICAgICAgICAgICAgdW5pdCwKKyAgICAgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblNldHMsCisgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcywKKyAgICAgICAgICApOworICAgICAgICB9CiAKLSAgICAgICAgICAvLyBGb3IgZW51bXMgYW5kIG5hbWVkIGNvbnN0cnVjdG9ycywgb25seSB0aGUgcGFyZW50IGVudW0vY2xhc3MgaXMgaW4KLSAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBpbXBvcnRlZCBzeW1ib2xzIHNvIHdlIHVzZSB0aGUgcGFyZW50cyBuYW1lLgotICAgICAgICAgIGZpbmFsIG5hbWVLZXkgPSBpdGVtLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkVOVU1fQ09OU1RBTlQgfHwKLSAgICAgICAgICAgICAgICAgIGl0ZW0ua2luZCA9PSBEZWNsYXJhdGlvbktpbmQuQ09OU1RSVUNUT1IKLSAgICAgICAgICAgICAgPyBpdGVtLnBhcmVudC5uYW1lCi0gICAgICAgICAgICAgIDogaXRlbS5uYW1lOwotICAgICAgICAgIGZpbmFsIGtleSA9IF9jcmVhdGVJbXBvcnRlZFN5bWJvbEtleShuYW1lS2V5LCBkZWNsYXJpbmdVcmkpOwotICAgICAgICAgIGZpbmFsIGltcG9ydGluZ1VyaXMgPSBhbHJlYWR5SW1wb3J0ZWRTeW1ib2xzW2tleV07CisgICAgICAgIC8vIEJ1aWxkIGEgZmFzdCBsb29rdXAgZm9yIGltcG9ydGVkIHN5bWJvbHMgc28gdGhhdCB3ZSBjYW4gZmlsdGVyIG91dAorICAgICAgICAvLyBkdXBsaWNhdGVzLgorICAgICAgICBmaW5hbCBhbHJlYWR5SW1wb3J0ZWRTeW1ib2xzID0gX2J1aWxkTG9va3VwT2ZJbXBvcnRlZFN5bWJvbHModW5pdCk7CiAKLSAgICAgICAgICAvLyBLZWVwIGl0IG9ubHkgaWYgdGhlcmUgYXJlIGVpdGhlcjoKLSAgICAgICAgICAvLyAtIG5vIFVSSXMgaW1wb3J0aW5nIGl0Ci0gICAgICAgICAgLy8gLSB0aGUgVVJJcyBpbXBvcnRpbmcgaXQgaW5jbHVkZSB0aGlzIG9uZQotICAgICAgICAgIHJldHVybiBpbXBvcnRpbmdVcmlzID09IG51bGwgfHwKLSAgICAgICAgICAgICAgaW1wb3J0aW5nVXJpcy5jb250YWlucygnJHtsaWJyYXJ5LnVyaX0nKTsKLSAgICAgICAgfSkubWFwKChpdGVtKSA9PiBkZWNsYXJhdGlvblRvQ29tcGxldGlvbkl0ZW0oCi0gICAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgY2xpZW50U3VwcG9ydGVkQ29tcGxldGlvbktpbmRzLAotICAgICAgICAgICAgICAgICAgdW5pdC5wYXRoLAotICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgaW5jbHVkZWRTZXQsCi0gICAgICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgdGFnQm9vc3RzLAotICAgICAgICAgICAgICAgICAgdW5pdC5saW5lSW5mbywKLSAgICAgICAgICAgICAgICAgIGl0ZW0sCi0gICAgICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdC5yZXBsYWNlbWVudE9mZnNldCwKLSAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25SZXF1ZXN0LnJlcGxhY2VtZW50TGVuZ3RoLAotICAgICAgICAgICAgICAgICkpOwotICAgICAgICByZXN1bHRzLmFkZEFsbChzZXRSZXN1bHRzKTsKLSAgICAgIH0pOworICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25TZXRzLmZvckVhY2goKGluY2x1ZGVkU2V0KSB7CisgICAgICAgICAgZmluYWwgbGlicmFyeSA9IHNlcnZlci5kZWNsYXJhdGlvbnNUcmFja2VyLmdldExpYnJhcnkoaW5jbHVkZWRTZXQuaWQpOworICAgICAgICAgIGlmIChsaWJyYXJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CiAKLSAgICAgIC8vIFBlcmZvcm0gZnV6enkgbWF0Y2hpbmcgYmFzZWQgb24gdGhlIGlkZW50aWZpZXIgaW4gZnJvbnQgb2YgdGhlIGNhcmV0IHRvCi0gICAgICAvLyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQuCi0gICAgICBmaW5hbCBmdXp6eVBhdHRlcm4gPSBkYXJ0Q29tcGxldGlvblJlcXVlc3QudGFyZ2V0UHJlZml4OwotICAgICAgZmluYWwgZnV6enlNYXRjaGVyID0KLSAgICAgICAgICBGdXp6eU1hdGNoZXIoZnV6enlQYXR0ZXJuLCBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlLlRFWFQpOworICAgICAgICAgIC8vIE1ha2UgYSBmYXN0IGxvb2t1cCBmb3IgdGFnIHJlbGV2YW5jZS4KKyAgICAgICAgICBmaW5hbCB0YWdCb29zdHMgPSA8U3RyaW5nLCBpbnQ+e307CisgICAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncworICAgICAgICAgICAgICAuZm9yRWFjaCgodCkgPT4gdGFnQm9vc3RzW3QudGFnXSA9IHQucmVsZXZhbmNlQm9vc3QpOwogCi0gICAgICBmaW5hbCBtYXRjaGluZ1Jlc3VsdHMgPQotICAgICAgICAgIHJlc3VsdHMud2hlcmUoKGUpID0+IGZ1enp5TWF0Y2hlci5zY29yZShlLmxhYmVsKSA+IDApLnRvTGlzdCgpOworICAgICAgICAgIC8vIE9ubHkgc3BlY2lmaWMgdHlwZXMgb2YgY2hpbGQgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgICAgICAvLyBUaGlzIGxpc3QgbWF0Y2hlcyB3aGF0J3MgaW4gX3Byb3RvY29sQXZhaWxhYmxlU3VnZ2VzdGlvbiBpbgorICAgICAgICAgIC8vIHRoZSBEQVMgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgYm9vbCBzaG91bGRJbmNsdWRlQ2hpbGQoRGVjbGFyYXRpb24gY2hpbGQpID0+CisgICAgICAgICAgICAgIGNoaWxkLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkNPTlNUUlVDVE9SIHx8CisgICAgICAgICAgICAgIGNoaWxkLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkVOVU1fQ09OU1RBTlQgfHwKKyAgICAgICAgICAgICAgKGNoaWxkLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkdFVFRFUiAmJiBjaGlsZC5pc1N0YXRpYykgfHwKKyAgICAgICAgICAgICAgKGNoaWxkLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkZJRUxEICYmIGNoaWxkLmlzU3RhdGljKTsKIAotICAgICAgcGVyZm9ybWFuY2Uubm90aWZpY2F0aW9uQ291bnQgPSAxOwotICAgICAgcGVyZm9ybWFuY2Uuc3VnZ2VzdGlvbkNvdW50Rmlyc3QgPSByZXN1bHRzLmxlbmd0aDsKLSAgICAgIHBlcmZvcm1hbmNlLnN1Z2dlc3Rpb25Db3VudExhc3QgPSByZXN1bHRzLmxlbmd0aDsKLSAgICAgIHBlcmZvcm1hbmNlLmNvbXBsZXRlKCk7CisgICAgICAgICAgLy8gQ29sbGVjdCBkZWNsYXJhdGlvbnMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICAgICAgICAgIGZpbmFsIGFsbERlY2xhcmF0aW9ucyA9IGxpYnJhcnkuZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgIC5mb2xsb3dlZEJ5KGxpYnJhcnkuZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgICAuZXhwYW5kKChkZWNsKSA9PiBkZWNsLmNoaWxkcmVuLndoZXJlKHNob3VsZEluY2x1ZGVDaGlsZCkpKQorICAgICAgICAgICAgICAudG9MaXN0KCk7CiAKLSAgICAgIHJldHVybiBzdWNjZXNzKG1hdGNoaW5nUmVzdWx0cyk7Ci0gICAgfSBvbiBBYm9ydENvbXBsZXRpb24gewotICAgICAgcmV0dXJuIHN1Y2Nlc3MoW10pOwotICAgIH0KKyAgICAgICAgICBmaW5hbCBzZXRSZXN1bHRzID0gYWxsRGVjbGFyYXRpb25zCisgICAgICAgICAgICAgIC8vIEZpbHRlciB0byBvbmx5IHRoZSBraW5kcyB3ZSBzaG91bGQgcmV0dXJuLgorICAgICAgICAgICAgICAud2hlcmUoKGl0ZW0pID0+CisgICAgICAgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnRLaW5kcy5jb250YWlucyhwcm90b2NvbEVsZW1lbnRLaW5kKGl0ZW0ua2luZCkpKQorICAgICAgICAgICAgICAud2hlcmUoKGl0ZW0pIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGV4aXN0aW5nIGltcG9ydHMgdG8gZW5zdXJlIHdlIGRvbid0IGFscmVhZHkgaW1wb3J0CisgICAgICAgICAgICAvLyB0aGlzIGVsZW1lbnQgKHRoaXMgZXhhY3QgZWxlbWVudCBmcm9tIGl0cyBkZWNsYXJpbmcKKyAgICAgICAgICAgIC8vIGxpYnJhcnksIG5vdCBqdXN0IHNvbWV0aGluZyB3aXRoIHRoZSBzYW1lIG5hbWUpLiBJZiB3ZSBkbworICAgICAgICAgICAgLy8gd2UnbGwgd2FudCB0byBza2lwIGl0LgorICAgICAgICAgICAgZmluYWwgZGVjbGFyaW5nVXJpID0gaXRlbS5wYXJlbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gaXRlbS5wYXJlbnQubG9jYXRpb25MaWJyYXJ5VXJpCisgICAgICAgICAgICAgICAgOiBpdGVtLmxvY2F0aW9uTGlicmFyeVVyaTsKKworICAgICAgICAgICAgLy8gRm9yIGVudW1zIGFuZCBuYW1lZCBjb25zdHJ1Y3RvcnMsIG9ubHkgdGhlIHBhcmVudCBlbnVtL2NsYXNzIGlzIGluCisgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBpbXBvcnRlZCBzeW1ib2xzIHNvIHdlIHVzZSB0aGUgcGFyZW50cyBuYW1lLgorICAgICAgICAgICAgZmluYWwgbmFtZUtleSA9IGl0ZW0ua2luZCA9PSBEZWNsYXJhdGlvbktpbmQuRU5VTV9DT05TVEFOVCB8fAorICAgICAgICAgICAgICAgICAgICBpdGVtLmtpbmQgPT0gRGVjbGFyYXRpb25LaW5kLkNPTlNUUlVDVE9SCisgICAgICAgICAgICAgICAgPyBpdGVtLnBhcmVudC5uYW1lCisgICAgICAgICAgICAgICAgOiBpdGVtLm5hbWU7CisgICAgICAgICAgICBmaW5hbCBrZXkgPSBfY3JlYXRlSW1wb3J0ZWRTeW1ib2xLZXkobmFtZUtleSwgZGVjbGFyaW5nVXJpKTsKKyAgICAgICAgICAgIGZpbmFsIGltcG9ydGluZ1VyaXMgPSBhbHJlYWR5SW1wb3J0ZWRTeW1ib2xzW2tleV07CisKKyAgICAgICAgICAgIC8vIEtlZXAgaXQgb25seSBpZiB0aGVyZSBhcmUgZWl0aGVyOgorICAgICAgICAgICAgLy8gLSBubyBVUklzIGltcG9ydGluZyBpdAorICAgICAgICAgICAgLy8gLSB0aGUgVVJJcyBpbXBvcnRpbmcgaXQgaW5jbHVkZSB0aGlzIG9uZQorICAgICAgICAgICAgcmV0dXJuIGltcG9ydGluZ1VyaXMgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIGltcG9ydGluZ1VyaXMuY29udGFpbnMoJyR7bGlicmFyeS51cml9Jyk7CisgICAgICAgICAgfSkubWFwKChpdGVtKSA9PiBkZWNsYXJhdGlvblRvQ29tcGxldGlvbkl0ZW0oCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25DYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFN1cHBvcnRlZENvbXBsZXRpb25LaW5kcywKKyAgICAgICAgICAgICAgICAgICAgdW5pdC5wYXRoLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkU2V0LAorICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICB0YWdCb29zdHMsCisgICAgICAgICAgICAgICAgICAgIHVuaXQubGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25SZXF1ZXN0LnJlcGxhY2VtZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uUmVxdWVzdC5yZXBsYWNlbWVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKHNldFJlc3VsdHMpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBQZXJmb3JtIGZ1enp5IG1hdGNoaW5nIGJhc2VkIG9uIHRoZSBpZGVudGlmaWVyIGluIGZyb250IG9mIHRoZSBjYXJldCB0bworICAgICAgICAvLyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQuCisgICAgICAgIGZpbmFsIGZ1enp5UGF0dGVybiA9IGRhcnRDb21wbGV0aW9uUmVxdWVzdC50YXJnZXRQcmVmaXg7CisgICAgICAgIGZpbmFsIGZ1enp5TWF0Y2hlciA9CisgICAgICAgICAgICBGdXp6eU1hdGNoZXIoZnV6enlQYXR0ZXJuLCBtYXRjaFN0eWxlOiBNYXRjaFN0eWxlLlRFWFQpOworCisgICAgICAgIGZpbmFsIG1hdGNoaW5nUmVzdWx0cyA9CisgICAgICAgICAgICByZXN1bHRzLndoZXJlKChlKSA9PiBmdXp6eU1hdGNoZXIuc2NvcmUoZS5sYWJlbCkgPiAwKS50b0xpc3QoKTsKKworICAgICAgICBwZXJmb3JtYW5jZS5zdWdnZXN0aW9uQ291bnQgPSByZXN1bHRzLmxlbmd0aDsKKworICAgICAgICByZXR1cm4gc3VjY2VzcyhtYXRjaGluZ1Jlc3VsdHMpOworICAgICAgfSBvbiBBYm9ydENvbXBsZXRpb24geworICAgICAgICByZXR1cm4gc3VjY2VzcyhbXSk7CisgICAgICB9CisgICAgfSk7CiAgIH0KIAogICBJdGVyYWJsZTxDb21wbGV0aW9uSXRlbT4gX3BsdWdpblJlc3VsdHNUb0l0ZW1zKApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZlci9kcml2ZXIuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2ZXIvZHJpdmVyLmRhcnQKaW5kZXggNWQ5YTFmOC4uY2MwZjQwNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZlci9kcml2ZXIuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmVyL2RyaXZlci5kYXJ0CkBAIC00MzcsMTIgKzQzNywxMiBAQAogICAgIH0KIAogICAgIGZpbmFsIGRlZmF1bHRTZGtQYXRoID0gX2dldFNka1BhdGgocmVzdWx0cyk7Ci0gICAgZmluYWwgZGFydFNka01hbmFnZXIgPSBEYXJ0U2RrTWFuYWdlcihkZWZhdWx0U2RrUGF0aCwgdHJ1ZSk7CisgICAgZmluYWwgZGFydFNka01hbmFnZXIgPSBEYXJ0U2RrTWFuYWdlcihkZWZhdWx0U2RrUGF0aCk7CiAKICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBJdCB3b3VsZCBiZSBuaWNlIHRvIGF2b2lkIGNyZWF0aW5nIGFuIFNESyB0aGF0CiAgICAgLy8gY2Fubm90IGJlIHJlLXVzZWQsIGJ1dCB0aGUgU0RLIGlzIG5lZWRlZCB0byBjcmVhdGUgYSBwYWNrYWdlIG1hcCBwcm92aWRlcgogICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gcnVuIGBwdWJgIGluIG9yZGVyIHRvIGdldCB0aGUgcGFja2FnZSBtYXAuCi0gICAgdmFyIGRlZmF1bHRTZGsgPSBfY3JlYXRlRGVmYXVsdFNkayhkZWZhdWx0U2RrUGF0aCwgdHJ1ZSk7CisgICAgdmFyIGRlZmF1bHRTZGsgPSBfY3JlYXRlRGVmYXVsdFNkayhkZWZhdWx0U2RrUGF0aCk7CiAgICAgLy8KICAgICAvLyBJbml0aWFsaXplIHRoZSBpbnN0cnVtZW50YXRpb24gc2VydmljZS4KICAgICAvLwpAQCAtODI1LDEyICs4MjUsMTIgQEAKICAgICByZXR1cm4gcGFyc2VyOwogICB9CiAKLSAgRGFydFNkayBfY3JlYXRlRGVmYXVsdFNkayhTdHJpbmcgZGVmYXVsdFNka1BhdGgsIGJvb2wgdXNlU3VtbWFyaWVzKSB7CisgIERhcnRTZGsgX2NyZWF0ZURlZmF1bHRTZGsoU3RyaW5nIGRlZmF1bHRTZGtQYXRoKSB7CiAgICAgdmFyIHJlc291cmNlUHJvdmlkZXIgPSBQaHlzaWNhbFJlc291cmNlUHJvdmlkZXIuSU5TVEFOQ0U7Ci0gICAgdmFyIHNkayA9IEZvbGRlckJhc2VkRGFydFNkaygKLSAgICAgICAgcmVzb3VyY2VQcm92aWRlciwgcmVzb3VyY2VQcm92aWRlci5nZXRGb2xkZXIoZGVmYXVsdFNka1BhdGgpKTsKLSAgICBzZGsudXNlU3VtbWFyeSA9IHVzZVN1bW1hcmllczsKLSAgICByZXR1cm4gc2RrOworICAgIHJldHVybiBGb2xkZXJCYXNlZERhcnRTZGsoCisgICAgICByZXNvdXJjZVByb3ZpZGVyLAorICAgICAgcmVzb3VyY2VQcm92aWRlci5nZXRGb2xkZXIoZGVmYXVsdFNka1BhdGgpLAorICAgICk7CiAgIH0KIAogICAvLy8gQ29uc3RydWN0cyBhIHV1aWQgY29tYmluaW5nIHRoZSBjdXJyZW50IGRhdGUgYW5kIGEgcmFuZG9tIGludGVnZXIuCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9jb21wbGV0aW9uX3BlcmZvcm1hbmNlLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9jb21wbGV0aW9uX3BlcmZvcm1hbmNlLmRhcnQKaW5kZXggYzljMGZkYy4uZTIzM2QxMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vY29tcGxldGlvbl9wZXJmb3JtYW5jZS5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2NvbXBsZXRpb25fcGVyZm9ybWFuY2UuZGFydApAQCAtMiw2ICsyLDggQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwvcGVyZm9ybWFuY2Uvb3BlcmF0aW9uX3BlcmZvcm1hbmNlLmRhcnQnOworCiAvLy8gQ29tcHV0ZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBjb2RlIGNvbXBsZXRpb24gb3BlcmF0aW9uIGF0IHRoZQogLy8vIGdpdmVuIHNvdXJjZSBhbmQgbG9jYXRpb24uCiAvLy8KQEAgLTM2LDcxICszOCwzNCBAQAogCiAvLy8gT3ZlcmFsbCBwZXJmb3JtYW5jZSBvZiBhIGNvZGUgY29tcGxldGlvbiBvcGVyYXRpb24uCiBjbGFzcyBDb21wbGV0aW9uUGVyZm9ybWFuY2UgewotICBmaW5hbCBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLm5vdygpOwotICBmaW5hbCBNYXA8U3RyaW5nLCBEdXJhdGlvbj4gX3N0YXJ0VGltZXMgPSA8U3RyaW5nLCBEdXJhdGlvbj57fTsKLSAgZmluYWwgU3RvcHdhdGNoIF9zdG9wd2F0Y2ggPSBTdG9wd2F0Y2goKTsKLSAgZmluYWwgTGlzdDxPcGVyYXRpb25QZXJmb3JtYW5jZT4gb3BlcmF0aW9ucyA9IDxPcGVyYXRpb25QZXJmb3JtYW5jZT5bXTsKLQogICBTdHJpbmcgcGF0aDsKICAgU3RyaW5nIHNuaXBwZXQgPSAnJzsKLSAgaW50IG5vdGlmaWNhdGlvbkNvdW50ID0gLTE7Ci0gIGludCBzdWdnZXN0aW9uQ291bnRGaXJzdCA9IC0xOwotICBpbnQgc3VnZ2VzdGlvbkNvdW50TGFzdCA9IC0xOwotICBEdXJhdGlvbiBfZmlyc3ROb3RpZmljYXRpb247CisgIGludCBzdWdnZXN0aW9uQ291bnQgPSAtMTsKKyAgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIF9vcGVyYXRpb247CiAKLSAgQ29tcGxldGlvblBlcmZvcm1hbmNlKCkgewotICAgIF9zdG9wd2F0Y2guc3RhcnQoKTsKKyAgaW50IGdldCBlbGFwc2VkSW5NaWxsaXNlY29uZHMgeworICAgIHJldHVybiBfb3BlcmF0aW9uLmVsYXBzZWQuaW5NaWxsaXNlY29uZHM7CiAgIH0KIAotICBpbnQgZ2V0IGVsYXBzZWRJbk1pbGxpc2Vjb25kcyA9PgotICAgICAgb3BlcmF0aW9ucy5pc05vdEVtcHR5ID8gb3BlcmF0aW9ucy5sYXN0LmVsYXBzZWQuaW5NaWxsaXNlY29uZHMgOiAwOwotCi0gIFN0cmluZyBnZXQgc3VnZ2VzdGlvbkNvdW50IHsKLSAgICBpZiAobm90aWZpY2F0aW9uQ291bnQgPCAxKSByZXR1cm4gJyc7Ci0gICAgaWYgKG5vdGlmaWNhdGlvbkNvdW50ID09IDEpIHJldHVybiAnJHN1Z2dlc3Rpb25Db3VudEZpcnN0JzsKLSAgICByZXR1cm4gJyRzdWdnZXN0aW9uQ291bnRGaXJzdCwgICRzdWdnZXN0aW9uQ291bnRMYXN0JzsKKyAgU3RyaW5nIGdldCBzdWdnZXN0aW9uQ291bnRTdHIgeworICAgIGlmIChzdWdnZXN0aW9uQ291bnQgPCAxKSByZXR1cm4gJyc7CisgICAgcmV0dXJuICckc3VnZ2VzdGlvbkNvdW50JzsKICAgfQogCi0gIHZvaWQgY29tcGxldGUoW1N0cmluZyB0YWddKSB7Ci0gICAgX3N0b3B3YXRjaC5zdG9wKCk7Ci0gICAgX2xvZ0R1cmF0aW9uKHRhZyA/PyAndG90YWwgdGltZScsIF9zdG9wd2F0Y2guZWxhcHNlZCk7Ci0gIH0KLQotICB2b2lkIGxvZ0VsYXBzZVRpbWUoU3RyaW5nIHRhZykgewotICAgIHZhciBlbmQgPSBfc3RvcHdhdGNoLmVsYXBzZWQ7Ci0gICAgdmFyIHN0YXJ0ID0gX3N0YXJ0VGltZXNbdGFnXTsKLSAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewotICAgICAgX2xvZ0R1cmF0aW9uKHRhZywgbnVsbCk7Ci0gICAgICByZXR1cm4gbnVsbDsKKyAgRnV0dXJlPFQ+IHJ1blJlcXVlc3RPcGVyYXRpb248VD4oCisgICAgRnV0dXJlPFQ+IEZ1bmN0aW9uKE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCkgb3BlcmF0aW9uLAorICApIGFzeW5jIHsKKyAgICB2YXIgcm9vdE9wZXJhdGlvbiA9IE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCgnPHJvb3Q+Jyk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiByb290T3BlcmF0aW9uLnJ1bkFzeW5jKCc8cmVxdWVzdD4nLCAocGVyZm9ybWFuY2UpIGFzeW5jIHsKKyAgICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbihwZXJmb3JtYW5jZSk7CisgICAgICB9KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgX29wZXJhdGlvbiA9IHJvb3RPcGVyYXRpb24uY2hpbGRyZW4uZmlyc3Q7CiAgICAgfQotICAgIF9sb2dEdXJhdGlvbih0YWcsIGVuZCAtIHN0YXJ0KTsKLSAgfQotCi0gIHZvaWQgbG9nRmlyc3ROb3RpZmljYXRpb25Db21wbGV0ZShTdHJpbmcgdGFnKSB7Ci0gICAgX2ZpcnN0Tm90aWZpY2F0aW9uID0gX3N0b3B3YXRjaC5lbGFwc2VkOwotICAgIF9sb2dEdXJhdGlvbih0YWcsIF9maXJzdE5vdGlmaWNhdGlvbik7Ci0gIH0KLQotICB2b2lkIGxvZ1N0YXJ0VGltZShTdHJpbmcgdGFnKSB7Ci0gICAgX3N0YXJ0VGltZXNbdGFnXSA9IF9zdG9wd2F0Y2guZWxhcHNlZDsKICAgfQogCiAgIHZvaWQgc2V0Q29udGVudHNBbmRPZmZzZXQoU3RyaW5nIGNvbnRlbnRzLCBpbnQgb2Zmc2V0KSB7CiAgICAgc25pcHBldCA9IGNvbXB1dGVDb21wbGV0aW9uU25pcHBldChjb250ZW50cywgb2Zmc2V0KTsKICAgfQotCi0gIHZvaWQgX2xvZ0R1cmF0aW9uKFN0cmluZyB0YWcsIER1cmF0aW9uIGVsYXBzZWQpIHsKLSAgICBvcGVyYXRpb25zLmFkZChPcGVyYXRpb25QZXJmb3JtYW5jZSh0YWcsIGVsYXBzZWQpKTsKLSAgfQotfQotCi0vLy8gVGhlIHBlcmZvcm1hbmNlIG9mIGFuIG9wZXJhdGlvbiB3aGVuIGNvbXB1dGluZyBjb2RlIGNvbXBsZXRpb24uCi1jbGFzcyBPcGVyYXRpb25QZXJmb3JtYW5jZSB7Ci0gIC8vLyBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uCi0gIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gIC8vLyBUaGUgZWxhcHNlIHRpbWUgb3IgYG51bGxgIGlmIHVuZGVmaW5lZC4KLSAgZmluYWwgRHVyYXRpb24gZWxhcHNlZDsKLQotICBPcGVyYXRpb25QZXJmb3JtYW5jZSh0aGlzLm5hbWUsIHRoaXMuZWxhcHNlZCk7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fbWFuYWdlci5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9jb21wbGV0aW9uX21hbmFnZXIuZGFydAppbmRleCBmMDlmOGE4Li4xMTE4Y2UwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fbWFuYWdlci5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvY29tcGxldGlvbl9tYW5hZ2VyLmRhcnQKQEAgLTYsNyArNiw3IEBACiAKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3Byb3RvY29sX3NlcnZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3Byb3Zpc2lvbmFsL2NvbXBsZXRpb24vY29tcGxldGlvbl9jb3JlLmRhcnQnCi0gICAgc2hvdyBBYm9ydENvbXBsZXRpb24sIENvbXBsZXRpb25Db250cmlidXRvciwgQ29tcGxldGlvblJlcXVlc3Q7CisgICAgc2hvdyBBYm9ydENvbXBsZXRpb24sIENvbXBsZXRpb25SZXF1ZXN0OwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvcHJvdmlzaW9uYWwvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vY29tcGxldGlvbl9jb3JlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29tcGxldGlvbi9jb21wbGV0aW9uX3BlcmZvcm1hbmNlLmRhcnQnOwpAQCAtNDUsNiArNDUsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0ZG9jL2RhcnRkb2NfZGlyZWN0aXZlX2luZm8uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwvcGVyZm9ybWFuY2Uvb3BlcmF0aW9uX3BlcmZvcm1hbmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi9wcm90b2NvbC9wcm90b2NvbF9jb21tb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbW1vbi5kYXJ0JyBhcyBwcm90b2NvbDsKIGltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vc3JjL3V0aWxpdGllcy9jb21wbGV0aW9uL2NvbXBsZXRpb25fdGFyZ2V0LmRhcnQnOwpAQCAtNTMsNyArNTQsNyBAQAogCiAvLy8gW0RhcnRDb21wbGV0aW9uTWFuYWdlcl0gZGV0ZXJtaW5lcyBpZiBhIGNvbXBsZXRpb24gcmVxdWVzdCBpcyBEYXJ0IHNwZWNpZmljCiAvLy8gYW5kIGZvcndhcmRzIHRob3NlIHJlcXVlc3RzIHRvIGFsbCBbRGFydENvbXBsZXRpb25Db250cmlidXRvcl1zLgotY2xhc3MgRGFydENvbXBsZXRpb25NYW5hZ2VyIGltcGxlbWVudHMgQ29tcGxldGlvbkNvbnRyaWJ1dG9yIHsKK2NsYXNzIERhcnRDb21wbGV0aW9uTWFuYWdlciB7CiAgIC8vLyBUaGUgW2NvbnRyaWJ1dGlvblNvcnRlcl0gaXMgYSBsb25nLWxpdmVkIG9iamVjdCB0aGF0IGlzbid0IGFsbG93ZWQKICAgLy8vIHRvIG1haW50YWluIHN0YXRlIGJldHdlZW4gY2FsbHMgdG8gW0RhcnRDb250cmlidXRpb25Tb3J0ZXIjc29ydCguLi4pXS4KICAgc3RhdGljIERhcnRDb250cmlidXRpb25Tb3J0ZXIgY29udHJpYnV0aW9uU29ydGVyID0gQ29tbW9uVXNhZ2VTb3J0ZXIoKTsKQEAgLTk4LDggKzk5LDggQEAKICAgICAgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcyA9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncyA9PSBudWxsKSk7CiAKLSAgQG92ZXJyaWRlCiAgIEZ1dHVyZTxMaXN0PENvbXBsZXRpb25TdWdnZXN0aW9uPj4gY29tcHV0ZVN1Z2dlc3Rpb25zKAorICAgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKICAgICBDb21wbGV0aW9uUmVxdWVzdCByZXF1ZXN0LCB7CiAgICAgQHJlcXVpcmVkIGJvb2wgZW5hYmxlVXJpQ29udHJpYnV0b3IsCiAgIH0pIGFzeW5jIHsKQEAgLTEwOCwxNSArMTA5LDE5IEBACiAgICAgICByZXR1cm4gY29uc3QgPENvbXBsZXRpb25TdWdnZXN0aW9uPltdOwogICAgIH0KIAotICAgIHZhciBwZXJmb3JtYW5jZSA9IChyZXF1ZXN0IGFzIENvbXBsZXRpb25SZXF1ZXN0SW1wbCkucGVyZm9ybWFuY2U7Ci0gICAgRGFydENvbXBsZXRpb25SZXF1ZXN0SW1wbCBkYXJ0UmVxdWVzdCA9Ci0gICAgICAgIGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbShyZXF1ZXN0LCBkYXJ0ZG9jRGlyZWN0aXZlSW5mbyk7CisgICAgdmFyIGRhcnRSZXF1ZXN0ID0gYXdhaXQgRGFydENvbXBsZXRpb25SZXF1ZXN0SW1wbC5mcm9tKAorICAgICAgcGVyZm9ybWFuY2UsCisgICAgICByZXF1ZXN0LAorICAgICAgZGFydGRvY0RpcmVjdGl2ZUluZm8sCisgICAgKTsKIAogICAgIC8vIERvbid0IHN1Z2dlc3QgaW4gY29tbWVudHMuCiAgICAgaWYgKGRhcnRSZXF1ZXN0LnRhcmdldC5pc0NvbW1lbnRUZXh0KSB7CiAgICAgICByZXR1cm4gY29uc3QgPENvbXBsZXRpb25TdWdnZXN0aW9uPltdOwogICAgIH0KIAorICAgIHJlcXVlc3QuY2hlY2tBYm9ydGVkKCk7CisKICAgICBmaW5hbCByYW5raW5nID0gQ29tcGxldGlvblJhbmtpbmcuaW5zdGFuY2U7CiAgICAgdmFyIHByb2JhYmlsaXR5RnV0dXJlID0KICAgICAgICAgcmFua2luZyAhPSBudWxsID8gcmFua2luZy5wcmVkaWN0KGRhcnRSZXF1ZXN0KSA6IEZ1dHVyZS52YWx1ZShudWxsKTsKQEAgLTE1NiwxMSArMTYxLDEyIEBACiAKICAgICB0cnkgewogICAgICAgZm9yICh2YXIgY29udHJpYnV0b3IgaW4gY29udHJpYnV0b3JzKSB7Ci0gICAgICAgIHZhciBjb250cmlidXRvclRhZyA9Ci0gICAgICAgICAgICAnRGFydENvbXBsZXRpb25NYW5hZ2VyIC0gJHtjb250cmlidXRvci5ydW50aW1lVHlwZX0nOwotICAgICAgICBwZXJmb3JtYW5jZS5sb2dTdGFydFRpbWUoY29udHJpYnV0b3JUYWcpOwotICAgICAgICBhd2FpdCBjb250cmlidXRvci5jb21wdXRlU3VnZ2VzdGlvbnMoZGFydFJlcXVlc3QsIGJ1aWxkZXIpOwotICAgICAgICBwZXJmb3JtYW5jZS5sb2dFbGFwc2VUaW1lKGNvbnRyaWJ1dG9yVGFnKTsKKyAgICAgICAgYXdhaXQgcGVyZm9ybWFuY2UucnVuQXN5bmMoCisgICAgICAgICAgJ0RhcnRDb21wbGV0aW9uTWFuYWdlciAtICR7Y29udHJpYnV0b3IucnVudGltZVR5cGV9JywKKyAgICAgICAgICAoXykgYXN5bmMgeworICAgICAgICAgICAgYXdhaXQgY29udHJpYnV0b3IuY29tcHV0ZVN1Z2dlc3Rpb25zKGRhcnRSZXF1ZXN0LCBidWlsZGVyKTsKKyAgICAgICAgICB9LAorICAgICAgICApOwogICAgICAgICByZXF1ZXN0LmNoZWNrQWJvcnRlZCgpOwogICAgICAgfQogICAgIH0gb24gSW5jb25zaXN0ZW50QW5hbHlzaXNFeGNlcHRpb24gewpAQCAtMTcyLDMzICsxNzgsMzMgQEAKICAgICAvLyBBZGp1c3Qgc3VnZ2VzdGlvbiByZWxldmFuY2UgYmVmb3JlIHJldHVybmluZwogICAgIHZhciBzdWdnZXN0aW9ucyA9IGJ1aWxkZXIuc3VnZ2VzdGlvbnMudG9MaXN0KCk7CiAgICAgY29uc3QgU09SVF9UQUcgPSAnRGFydENvbXBsZXRpb25NYW5hZ2VyIC0gc29ydCc7Ci0gICAgcGVyZm9ybWFuY2UubG9nU3RhcnRUaW1lKFNPUlRfVEFHKTsKLSAgICBpZiAocmFua2luZyAhPSBudWxsKSB7Ci0gICAgICByZXF1ZXN0LmNoZWNrQWJvcnRlZCgpOwotICAgICAgdHJ5IHsKLSAgICAgICAgc3VnZ2VzdGlvbnMgPSBhd2FpdCByYW5raW5nLnJlcmFuaygKLSAgICAgICAgICAgIHByb2JhYmlsaXR5RnV0dXJlLAotICAgICAgICAgICAgc3VnZ2VzdGlvbnMsCi0gICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcywKLSAgICAgICAgICAgIGluY2x1ZGVkU3VnZ2VzdGlvblJlbGV2YW5jZVRhZ3MsCi0gICAgICAgICAgICBkYXJ0UmVxdWVzdCwKLSAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LnVuaXQuZmVhdHVyZVNldCk7Ci0gICAgICB9IGNhdGNoIChleGNlcHRpb24sIHN0YWNrVHJhY2UpIHsKLSAgICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgU2h1dGRvd24gdGhlIGlzb2xhdGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgICAgLy8gIHN0YXJ0ZWQuCi0gICAgICAgIC8vIERpc2FibGUgc21hcnQgcmFua2luZyBpZiBwcmVkaWN0aW9uIGZhaWxzLgotICAgICAgICBDb21wbGV0aW9uUmFua2luZy5pbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIEFuYWx5c2lzRW5naW5lLmluc3RhbmNlLmluc3RydW1lbnRhdGlvblNlcnZpY2UubG9nRXhjZXB0aW9uKAotICAgICAgICAgICAgQ2F1Z2h0RXhjZXB0aW9uLndpdGhNZXNzYWdlKAotICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcmVyYW5rIGNvbXBsZXRpb24gc3VnZ2VzdGlvbnMnLAotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBzdGFja1RyYWNlKSk7CisgICAgYXdhaXQgcGVyZm9ybWFuY2UucnVuQXN5bmMoU09SVF9UQUcsIChfKSBhc3luYyB7CisgICAgICBpZiAocmFua2luZyAhPSBudWxsKSB7CisgICAgICAgIHJlcXVlc3QuY2hlY2tBYm9ydGVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc3VnZ2VzdGlvbnMgPSBhd2FpdCByYW5raW5nLnJlcmFuaygKKyAgICAgICAgICAgICAgcHJvYmFiaWxpdHlGdXR1cmUsCisgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLAorICAgICAgICAgICAgICBpbmNsdWRlZEVsZW1lbnROYW1lcywKKyAgICAgICAgICAgICAgaW5jbHVkZWRTdWdnZXN0aW9uUmVsZXZhbmNlVGFncywKKyAgICAgICAgICAgICAgZGFydFJlcXVlc3QsCisgICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LnVuaXQuZmVhdHVyZVNldCk7CisgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiwgc3RhY2tUcmFjZSkgeworICAgICAgICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIFNodXRkb3duIHRoZSBpc29sYXRlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuCisgICAgICAgICAgLy8gIHN0YXJ0ZWQuCisgICAgICAgICAgLy8gRGlzYWJsZSBzbWFydCByYW5raW5nIGlmIHByZWRpY3Rpb24gZmFpbHMuCisgICAgICAgICAgQ29tcGxldGlvblJhbmtpbmcuaW5zdGFuY2UgPSBudWxsOworICAgICAgICAgIEFuYWx5c2lzRW5naW5lLmluc3RhbmNlLmluc3RydW1lbnRhdGlvblNlcnZpY2UubG9nRXhjZXB0aW9uKAorICAgICAgICAgICAgICBDYXVnaHRFeGNlcHRpb24ud2l0aE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHJlcmFuayBjb21wbGV0aW9uIHN1Z2dlc3Rpb25zJywKKyAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgIHN0YWNrVHJhY2UpKTsKKyAgICAgICAgICBhd2FpdCBjb250cmlidXRpb25Tb3J0ZXIuc29ydChkYXJ0UmVxdWVzdCwgc3VnZ2VzdGlvbnMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFyZXF1ZXN0LnVzZU5ld1JlbGV2YW5jZSkgewogICAgICAgICBhd2FpdCBjb250cmlidXRpb25Tb3J0ZXIuc29ydChkYXJ0UmVxdWVzdCwgc3VnZ2VzdGlvbnMpOwogICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXJlcXVlc3QudXNlTmV3UmVsZXZhbmNlKSB7Ci0gICAgICBhd2FpdCBjb250cmlidXRpb25Tb3J0ZXIuc29ydChkYXJ0UmVxdWVzdCwgc3VnZ2VzdGlvbnMpOwotICAgIH0KLSAgICBwZXJmb3JtYW5jZS5sb2dFbGFwc2VUaW1lKFNPUlRfVEFHKTsKKyAgICB9KTsKICAgICByZXF1ZXN0LmNoZWNrQWJvcnRlZCgpOwogICAgIHJldHVybiBzdWdnZXN0aW9uczsKICAgfQpAQCAtNDMwLDMwICs0MzYsMzIgQEAKICAgLy8vIFJldHVybiBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdpdGggYSBuZXdseSBjcmVhdGVkIGNvbXBsZXRpb24gcmVxdWVzdAogICAvLy8gYmFzZWQgb24gdGhlIGdpdmVuIFtyZXF1ZXN0XS4gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBbQWJvcnRDb21wbGV0aW9uXQogICAvLy8gaWYgdGhlIGNvbXBsZXRpb24gcmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLgotICBzdGF0aWMgRnV0dXJlPERhcnRDb21wbGV0aW9uUmVxdWVzdD4gZnJvbShDb21wbGV0aW9uUmVxdWVzdCByZXF1ZXN0LAorICBzdGF0aWMgRnV0dXJlPERhcnRDb21wbGV0aW9uUmVxdWVzdD4gZnJvbSgKKyAgICAgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICAgIENvbXBsZXRpb25SZXF1ZXN0IHJlcXVlc3QsCiAgICAgICBEYXJ0ZG9jRGlyZWN0aXZlSW5mbyBkYXJ0ZG9jRGlyZWN0aXZlSW5mbykgYXN5bmMgewogICAgIHJlcXVlc3QuY2hlY2tBYm9ydGVkKCk7Ci0gICAgdmFyIHBlcmZvcm1hbmNlID0gKHJlcXVlc3QgYXMgQ29tcGxldGlvblJlcXVlc3RJbXBsKS5wZXJmb3JtYW5jZTsKLSAgICBjb25zdCBCVUlMRF9SRVFVRVNUX1RBRyA9ICdidWlsZCBEYXJ0Q29tcGxldGlvblJlcXVlc3QnOwotICAgIHBlcmZvcm1hbmNlLmxvZ1N0YXJ0VGltZShCVUlMRF9SRVFVRVNUX1RBRyk7CiAKLSAgICB2YXIgdW5pdCA9IHJlcXVlc3QucmVzdWx0LnVuaXQ7Ci0gICAgdmFyIGxpYlNvdXJjZSA9IHVuaXQuZGVjbGFyZWRFbGVtZW50LmxpYnJhcnkuc291cmNlOwotICAgIHZhciBvYmplY3RUeXBlID0gcmVxdWVzdC5yZXN1bHQudHlwZVByb3ZpZGVyLm9iamVjdFR5cGU7CisgICAgcmV0dXJuIHBlcmZvcm1hbmNlLnJ1bigKKyAgICAgICdidWlsZCBEYXJ0Q29tcGxldGlvblJlcXVlc3QnLAorICAgICAgKF8pIHsKKyAgICAgICAgdmFyIHVuaXQgPSByZXF1ZXN0LnJlc3VsdC51bml0OworICAgICAgICB2YXIgbGliU291cmNlID0gdW5pdC5kZWNsYXJlZEVsZW1lbnQubGlicmFyeS5zb3VyY2U7CisgICAgICAgIHZhciBvYmplY3RUeXBlID0gcmVxdWVzdC5yZXN1bHQudHlwZVByb3ZpZGVyLm9iamVjdFR5cGU7CiAKLSAgICB2YXIgZGFydFJlcXVlc3QgPSBEYXJ0Q29tcGxldGlvblJlcXVlc3RJbXBsLl8oCi0gICAgICAgIHJlcXVlc3QucmVzdWx0LAotICAgICAgICByZXF1ZXN0LnJlc291cmNlUHJvdmlkZXIsCi0gICAgICAgIG9iamVjdFR5cGUsCi0gICAgICAgIGxpYlNvdXJjZSwKLSAgICAgICAgcmVxdWVzdC5zb3VyY2UsCi0gICAgICAgIHJlcXVlc3Qub2Zmc2V0LAotICAgICAgICB1bml0LAotICAgICAgICBkYXJ0ZG9jRGlyZWN0aXZlSW5mbywKLSAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgcGVyZm9ybWFuY2UpOwotCi0gICAgcGVyZm9ybWFuY2UubG9nRWxhcHNlVGltZShCVUlMRF9SRVFVRVNUX1RBRyk7Ci0gICAgcmV0dXJuIGRhcnRSZXF1ZXN0OworICAgICAgICByZXR1cm4gRGFydENvbXBsZXRpb25SZXF1ZXN0SW1wbC5fKAorICAgICAgICAgIHJlcXVlc3QucmVzdWx0LAorICAgICAgICAgIHJlcXVlc3QucmVzb3VyY2VQcm92aWRlciwKKyAgICAgICAgICBvYmplY3RUeXBlLAorICAgICAgICAgIGxpYlNvdXJjZSwKKyAgICAgICAgICByZXF1ZXN0LnNvdXJjZSwKKyAgICAgICAgICByZXF1ZXN0Lm9mZnNldCwKKyAgICAgICAgICB1bml0LAorICAgICAgICAgIGRhcnRkb2NEaXJlY3RpdmVJbmZvLAorICAgICAgICAgIHJlcXVlc3QsCisgICAgICAgICAgKHJlcXVlc3QgYXMgQ29tcGxldGlvblJlcXVlc3RJbXBsKS5wZXJmb3JtYW5jZSwKKyAgICAgICAgKTsKKyAgICAgIH0sCisgICAgKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9jb21wbGV0aW9uX3JhbmtpbmcuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvY29tcGxldGlvbl9yYW5raW5nLmRhcnQKaW5kZXggYzgwZTUwZi4uNmJlNmY1NCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9jb21wbGV0aW9uX3JhbmtpbmcuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fcmFua2luZy5kYXJ0CkBAIC0xMDUsOCArMTA1LDYgQEAKICAgICAgIHJldHVybiBGdXR1cmUudmFsdWUoKTsKICAgICB9CiAKLSAgICByZXF1ZXN0LmNoZWNrQWJvcnRlZCgpOwotCiAgICAgcGVyZm9ybWFuY2VNZXRyaWNzLl9pbmNyZW1lbnRQcmVkaWN0aW9uUmVxdWVzdENvdW50KCk7CiAKICAgICB2YXIgdGltZXIgPSBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvZmVhdHVyZV9jb21wdXRlci5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyLmRhcnQKaW5kZXggOTQ0ZjhjYy4uNmYxZTU0NSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyLmRhcnQKQEAgLTIyLDcgKzIyLDggQEAKICAgICAgICAgRmllbGRFbGVtZW50LAogICAgICAgICBMaWJyYXJ5RWxlbWVudCwKICAgICAgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsCi0gICAgICAgIFRvcExldmVsVmFyaWFibGVFbGVtZW50OworICAgICAgICBUb3BMZXZlbFZhcmlhYmxlRWxlbWVudCwKKyAgICAgICAgTG9jYWxWYXJpYWJsZUVsZW1lbnQ7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwpAQCAtODMsMTAgKzg0LDEwIEBACiAgIHZhciB0b3RhbFdlaWdodCA9IDAuMDsKICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07CisgICAgdmFyIHdlaWdodCA9IHdlaWdodHNbaV07CisgICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0OwogICAgIGlmICh2YWx1ZSA+PSAwLjApIHsKLSAgICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRzW2ldOwogICAgICAgdG90YWxWYWx1ZSArPSB2YWx1ZSAqIHdlaWdodDsKLSAgICAgIHRvdGFsV2VpZ2h0ICs9IHdlaWdodDsKICAgICB9CiAgIH0KICAgaWYgKHRvdGFsV2VpZ2h0ID09IDAuMCkgewpAQCAtMjM2LDkgKzIzNyw2IEBACiAgIGRvdWJsZSBpbmhlcml0YW5jZURpc3RhbmNlRmVhdHVyZSgKICAgICAgIENsYXNzRWxlbWVudCBzdWJjbGFzcywgQ2xhc3NFbGVtZW50IHN1cGVyY2xhc3MpIHsKICAgICB2YXIgZGlzdGFuY2UgPSBfaW5oZXJpdGFuY2VEaXN0YW5jZShzdWJjbGFzcywgc3VwZXJjbGFzcywge30pOwotICAgIGlmIChkaXN0YW5jZSA8IDApIHsKLSAgICAgIHJldHVybiAwLjA7Ci0gICAgfQogICAgIHJldHVybiBfZGlzdGFuY2VUb1BlcmNlbnQoZGlzdGFuY2UpOwogICB9CiAKQEAgLTI4Niw2ICsyODQsODcgQEAKICAgICByZXR1cm4gcmFuZ2UudXBwZXI7CiAgIH0KIAorICAvLy8gUmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBbcmVmZXJlbmNlXSBhbmQgdGhlIHJlZmVyZW5jZWQgbG9jYWwKKyAgLy8vIFt2YXJpYWJsZV0sIHdoZXJlIHRoZSBkaXN0YW5jZSBpcyBkZWZpbmVkIHRvIGJlIHRoZSBudW1iZXIgb2YgdmFyaWFibGUKKyAgLy8vIGRlY2xhcmF0aW9ucyBiZXR3ZWVuIHRoZSBsb2NhbCB2YXJpYWJsZSBhbmQgdGhlIHJlZmVyZW5jZS4KKyAgaW50IGxvY2FsVmFyaWFibGVEaXN0YW5jZShBc3ROb2RlIHJlZmVyZW5jZSwgTG9jYWxWYXJpYWJsZUVsZW1lbnQgdmFyaWFibGUpIHsKKyAgICB2YXIgZGlzdGFuY2UgPSAwOworICAgIHZhciBub2RlID0gcmVmZXJlbmNlOworICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKKyAgICAgIGlmIChub2RlIGlzIEZvclN0YXRlbWVudCB8fCBub2RlIGlzIEZvckVsZW1lbnQpIHsKKyAgICAgICAgdmFyIGxvb3BQYXJ0cyA9IG5vZGUgaXMgRm9yU3RhdGVtZW50CisgICAgICAgICAgICA/IG5vZGUuZm9yTG9vcFBhcnRzCisgICAgICAgICAgICA6IChub2RlIGFzIEZvckVsZW1lbnQpLmZvckxvb3BQYXJ0czsKKyAgICAgICAgaWYgKGxvb3BQYXJ0cyBpcyBGb3JQYXJ0c1dpdGhEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICBmb3IgKHZhciBkZWNsYXJlZFZhcmlhYmxlIGluIGxvb3BQYXJ0cy52YXJpYWJsZXMudmFyaWFibGVzLnJldmVyc2VkKSB7CisgICAgICAgICAgICBpZiAoZGVjbGFyZWRWYXJpYWJsZS5kZWNsYXJlZEVsZW1lbnQgPT0gdmFyaWFibGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobG9vcFBhcnRzIGlzIEZvckVhY2hQYXJ0c1dpdGhEZWNsYXJhdGlvbikgeworICAgICAgICAgIGlmIChsb29wUGFydHMubG9vcFZhcmlhYmxlLmRlY2xhcmVkRWxlbWVudCA9PSB2YXJpYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlOworICAgICAgICAgIH0KKyAgICAgICAgICBkaXN0YW5jZSsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG5vZGUgaXMgVmFyaWFibGVEZWNsYXJhdGlvbikgeworICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CisgICAgICAgIGlmIChwYXJlbnQgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QpIHsKKyAgICAgICAgICB2YXIgdmFyaWFibGVzID0gcGFyZW50LnZhcmlhYmxlczsKKyAgICAgICAgICB2YXIgaW5kZXggPSB2YXJpYWJsZXMuaW5kZXhPZihub2RlKTsKKyAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgdmFyIGRlY2xhcmVkVmFyaWFibGUgPSB2YXJpYWJsZXNbaV07CisgICAgICAgICAgICBpZiAoZGVjbGFyZWRWYXJpYWJsZS5kZWNsYXJlZEVsZW1lbnQgPT0gdmFyaWFibGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBDYXRjaENsYXVzZSkgeworICAgICAgICBpZiAobm9kZS5leGNlcHRpb25QYXJhbWV0ZXI/LnN0YXRpY0VsZW1lbnQgPT0gdmFyaWFibGUgfHwKKyAgICAgICAgICAgIG5vZGUuc3RhY2tUcmFjZVBhcmFtZXRlcj8uc3RhdGljRWxlbWVudCA9PSB2YXJpYWJsZSkgeworICAgICAgICAgIHJldHVybiBkaXN0YW5jZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG5vZGUgaXMgU3RhdGVtZW50KSB7CisgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDsKKyAgICAgICAgdmFyIHN0YXRlbWVudHMgPSBjb25zdCA8U3RhdGVtZW50PltdOworICAgICAgICBpZiAocGFyZW50IGlzIEJsb2NrKSB7CisgICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBTd2l0Y2hDYXNlKSB7CisgICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBTd2l0Y2hEZWZhdWx0KSB7CisgICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOworICAgICAgICB9CisgICAgICAgIHZhciBpbmRleCA9IHN0YXRlbWVudHMuaW5kZXhPZihub2RlKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICB2YXIgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTsKKyAgICAgICAgICBpZiAoc3RhdGVtZW50IGlzIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGRlY2xhcmVkVmFyaWFibGUKKyAgICAgICAgICAgICAgICBpbiBzdGF0ZW1lbnQudmFyaWFibGVzLnZhcmlhYmxlcy5yZXZlcnNlZCkgeworICAgICAgICAgICAgICBpZiAoZGVjbGFyZWRWYXJpYWJsZS5kZWNsYXJlZEVsZW1lbnQgPT0gdmFyaWFibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIF9sb2NhbCB2YXJpYWJsZSBkaXN0YW5jZV8gZmVhdHVyZSBmb3IgYSBsb2NhbAorICAvLy8gdmFyaWFibGUgd2hvc2UgZGVjbGFyYXRpb24gaXMgc2VwYXJhdGVkIGZyb20gdGhlIGNvbXBsZXRpb24gbG9jYXRpb24gYnkKKyAgLy8vIFtkaXN0YW5jZV0gb3RoZXIgdmFyaWFibGUgZGVjbGFyYXRpb25zLgorICBkb3VibGUgbG9jYWxWYXJpYWJsZURpc3RhbmNlRmVhdHVyZSgKKyAgICAgIEFzdE5vZGUgcmVmZXJlbmNlLCBMb2NhbFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZSkgeworICAgIHZhciBkaXN0YW5jZSA9IGxvY2FsVmFyaWFibGVEaXN0YW5jZShyZWZlcmVuY2UsIHZhcmlhYmxlKTsKKyAgICByZXR1cm4gX2Rpc3RhbmNlVG9QZXJjZW50KGRpc3RhbmNlKTsKKyAgfQorCiAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBfc3RhcnRzIHdpdGggZG9sbGFyXyBmZWF0dXJlLgogICBkb3VibGUgc3RhcnRzV2l0aERvbGxhckZlYXR1cmUoU3RyaW5nIG5hbWUpID0+CiAgICAgICBuYW1lLnN0YXJ0c1dpdGgoJ1wkJykgPyAwLjAgOiAxLjA7CkBAIC0yOTcsOCArMzc2LDE0IEBACiAgICAgICAgICAgPyAtMS4wCiAgICAgICAgICAgOiAocHJvcG9zZWRNZW1iZXJOYW1lID09IGNvbnRhaW5pbmdNZXRob2ROYW1lID8gMS4wIDogMC4wKTsKIAotICAvLy8gQ29udmVydCBhIFtkaXN0YW5jZV0gdG8gYSBwZXJjZW50YWdlIHZhbHVlIGFuZCByZXR1cm4gdGhlIHBlcmNlbnRhZ2UuCi0gIGRvdWJsZSBfZGlzdGFuY2VUb1BlcmNlbnQoaW50IGRpc3RhbmNlKSA9PiBtYXRoLnBvdygwLjk1LCBkaXN0YW5jZSk7CisgIC8vLyBDb252ZXJ0IGEgW2Rpc3RhbmNlXSB0byBhIHBlcmNlbnRhZ2UgdmFsdWUgYW5kIHJldHVybiB0aGUgcGVyY2VudGFnZS4gSWYKKyAgLy8vIHRoZSBbZGlzdGFuY2VdIGlzIG5lZ2F0aXZlLCByZXR1cm4gYC0xLjBgLgorICBkb3VibGUgX2Rpc3RhbmNlVG9QZXJjZW50KGludCBkaXN0YW5jZSkgeworICAgIGlmIChkaXN0YW5jZSA8IDApIHsKKyAgICAgIHJldHVybiAtMS4wOworICAgIH0KKyAgICByZXR1cm4gbWF0aC5wb3coMC45OCwgZGlzdGFuY2UpOworICB9CiAKICAgLy8vIFJldHVybiB0aGUgaW5oZXJpdGFuY2UgZGlzdGFuY2UgYmV0d2VlbiB0aGUgW3N1YmNsYXNzXSBhbmQgdGhlCiAgIC8vLyBbc3VwZXJjbGFzc10uIFRoZSBzZXQgb2YgW3Zpc2l0ZWRdIGVsZW1lbnRzIGlzIHVzZWQgdG8gZ3VhcmQgYWdhaW5zdApAQCAtMzYyLDQ3ICs0NDcsNDUgQEAKICAgICBpZiAocmFuZ2UKICAgICAgICAgLmVuZFN0YXJ0KG5vZGUubGVmdFBhcmVudGhlc2lzLCBub2RlLnJpZ2h0UGFyZW50aGVzaXMpCiAgICAgICAgIC5jb250YWlucyhvZmZzZXQpKSB7Ci0gICAgICBmaW5hbCBwYXJhbUVsdHMgPSBub2RlLmZ1bmN0aW9uVHlwZT8ucGFyYW1ldGVyczsKLSAgICAgIGlmIChwYXJhbUVsdHMgPT0gbnVsbCB8fCBwYXJhbUVsdHMuaXNFbXB0eSkgeworICAgICAgZmluYWwgcGFyYW1ldGVycyA9IG5vZGUuZnVuY3Rpb25UeXBlPy5wYXJhbWV0ZXJzOworICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KIAotICAgICAgLy8gUmVxdWlyZWQgcGFyYW1ldGVycwotICAgICAgZmluYWwgcG9zaXRpb25hbFBhcmFtRWx0cyA9Ci0gICAgICAgICAgcGFyYW1FbHRzLndoZXJlKChwYXJhbSkgPT4gIXBhcmFtLmlzTmFtZWQpPy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKLSAgICAgIHZhciBpID0gMDsKLSAgICAgIGlmIChwb3NpdGlvbmFsUGFyYW1FbHRzLmlzTm90RW1wdHkpIHsKLSAgICAgICAgZm9yICg7Ci0gICAgICAgICAgICBpIDwgbm9kZS5hcmd1bWVudHMubGVuZ3RoICYmIGkgPCBwb3NpdGlvbmFsUGFyYW1FbHRzLmxlbmd0aDsKLSAgICAgICAgICAgIGkrKykgewotICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY29tcGFyZSBvZmZzZXRzIGJldHdlZW4gY29tbWFzLCB0ZXN0cyBzaG93IHRoYXQKLSAgICAgICAgICAvLyBzdWNoIHRlc3RzIGFyZW4ndCBuZWVkZWQsIGFsc28gdGhlIGNvbW1hcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZQotICAgICAgICAgIC8vIG9mZnNldHMgYXJlbid0IGFjY2Vzc2libGUgd2l0aCBleGlzdGluZyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotICAgICAgICAgIGlmIChub2RlLmFyZ3VtZW50c1tpXS5jb250YWlucyhvZmZzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9zaXRpb25hbFBhcmFtRWx0c1tpXS50eXBlOworICAgICAgdmFyIGluZGV4ID0gMDsKKworICAgICAgRGFydFR5cGUgdHlwZU9mSW5kZXhQb3NpdGlvbmFsUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAoaW5kZXggPCBwYXJhbWV0ZXJzLmxlbmd0aCkgeworICAgICAgICAgIHZhciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzW2luZGV4XTsKKyAgICAgICAgICBpZiAocGFyYW1ldGVyLmlzUG9zaXRpb25hbCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlci50eXBlOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBUaGUgY2FzZSB3aGVyZSB0aGUgdXNlciBpcyBmaWxsaW5nIG91dCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycwotICAgICAgICBpZiAoaSA8IHBvc2l0aW9uYWxQYXJhbUVsdHMubGVuZ3RoKSB7Ci0gICAgICAgICAgcmV0dXJuIHBvc2l0aW9uYWxQYXJhbUVsdHNbaV0udHlwZTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KLSAgICAgIC8vIE5hbWVkIGFuZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKLSAgICAgIGlmIChwb3NpdGlvbmFsUGFyYW1FbHRzLmxlbmd0aCA8IHBhcmFtRWx0cy5sZW5ndGgpIHsKLSAgICAgICAgZm9yICg7IGkgPCBub2RlLmFyZ3VtZW50cy5sZW5ndGggJiYgaSA8IHBhcmFtRWx0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChub2RlLmFyZ3VtZW50c1tpXS5jb250YWlucyhvZmZzZXQpKSB7Ci0gICAgICAgICAgICBpZiAobm9kZS5hcmd1bWVudHNbaV0gaXMgTmFtZWRFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICAgIHZhciBuYW1lZEV4cHJlc3Npb24gPSBub2RlLmFyZ3VtZW50c1tpXSBhcyBOYW1lZEV4cHJlc3Npb247Ci0gICAgICAgICAgICAgIHZhciBuZWVkbGUgPSBwYXJhbUVsdHMKLSAgICAgICAgICAgICAgICAgIC53aGVyZSgocGFyYW1FbHQpID0+Ci0gICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbHQuaXNOYW1lZCAmJgotICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWx0Lm5hbWUgPT0gbmFtZWRFeHByZXNzaW9uLm5hbWUubGFiZWwubmFtZSkKLSAgICAgICAgICAgICAgICAgID8uZmlyc3Q7Ci0gICAgICAgICAgICAgIHJldHVybiBuZWVkbGU/LnR5cGU7CisKKyAgICAgIEV4cHJlc3Npb24gcHJldmlvdXNBcmd1bWVudDsKKyAgICAgIGZvciAodmFyIGFyZ3VtZW50IGluIG5vZGUuYXJndW1lbnRzKSB7CisgICAgICAgIGlmIChhcmd1bWVudCBpcyBOYW1lZEV4cHJlc3Npb24pIHsKKyAgICAgICAgICBpZiAob2Zmc2V0IDw9IGFyZ3VtZW50Lm9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVPZkluZGV4UG9zaXRpb25hbFBhcmFtZXRlcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYXJndW1lbnQuY29udGFpbnMob2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50LnN0YXRpY1BhcmFtZXRlckVsZW1lbnQ/LnR5cGU7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwcmV2aW91c0FyZ3VtZW50ID09IG51bGwgfHwgcHJldmlvdXNBcmd1bWVudC5lbmQgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPD0gYXJndW1lbnQuZW5kKSB7CisgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGF0aWNQYXJhbWV0ZXJFbGVtZW50Py50eXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KKyAgICAgICAgICBwcmV2aW91c0FyZ3VtZW50ID0gYXJndW1lbnQ7CisgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogICAgICAgfQorCisgICAgICByZXR1cm4gdHlwZU9mSW5kZXhQb3NpdGlvbmFsUGFyYW1ldGVyKCk7CiAgICAgfQogICAgIHJldHVybiBudWxsOwogICB9CkBAIC02NDEsNiArNzI0LDkgQEAKIAogICBAb3ZlcnJpZGUKICAgRGFydFR5cGUgdmlzaXRMYWJlbChMYWJlbCBub2RlKSB7CisgICAgaWYgKG9mZnNldCA9PSBub2RlLm9mZnNldCkgeworICAgICAgcmV0dXJuIF92aXNpdFBhcmVudChub2RlKTsKKyAgICB9CiAgICAgaWYgKG5vZGUuY29sb24uZW5kIDw9IG9mZnNldCkgewogICAgICAgcmV0dXJuIF92aXNpdFBhcmVudChub2RlKTsKICAgICB9CkBAIC02NzksNiArNzY1LDkgQEAKIAogICBAb3ZlcnJpZGUKICAgRGFydFR5cGUgdmlzaXROYW1lZEV4cHJlc3Npb24oTmFtZWRFeHByZXNzaW9uIG5vZGUpIHsKKyAgICBpZiAob2Zmc2V0ID09IG5vZGUub2Zmc2V0KSB7CisgICAgICByZXR1cm4gX3Zpc2l0UGFyZW50KG5vZGUpOworICAgIH0KICAgICBpZiAobm9kZS5uYW1lLmVuZCA8PSBvZmZzZXQpIHsKICAgICAgIHJldHVybiBfdmlzaXRQYXJlbnQobm9kZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9pbXBvcnRlZF9yZWZlcmVuY2VfY29udHJpYnV0b3IuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvaW1wb3J0ZWRfcmVmZXJlbmNlX2NvbnRyaWJ1dG9yLmRhcnQKaW5kZXggZDgzOWVkMy4uYjJjMTMzNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9pbXBvcnRlZF9yZWZlcmVuY2VfY29udHJpYnV0b3IuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2ltcG9ydGVkX3JlZmVyZW5jZV9jb250cmlidXRvci5kYXJ0CkBAIC04LDcgKzgsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2xvY2FsX2xpYnJhcnlfY29udHJpYnV0b3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvc3VnZ2VzdGlvbl9idWlsZGVyLmRhcnQnCiAgICAgc2hvdyBTdWdnZXN0aW9uQnVpbGRlcjsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwogCiAvLy8gQSBjb250cmlidXRvciBmb3IgY2FsY3VsYXRpbmcgc3VnZ2VzdGlvbnMgZm9yIGltcG9ydGVkIHRvcCBsZXZlbCBtZW1iZXJzLgogY2xhc3MgSW1wb3J0ZWRSZWZlcmVuY2VDb250cmlidXRvciBleHRlbmRzIERhcnRDb21wbGV0aW9uQ29udHJpYnV0b3IgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9zdWdnZXN0aW9uX2J1aWxkZXIuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvc3VnZ2VzdGlvbl9idWlsZGVyLmRhcnQKaW5kZXggYWRjZDEzOC4uNmUzZWJlYSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9zdWdnZXN0aW9uX2J1aWxkZXIuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L3N1Z2dlc3Rpb25fYnVpbGRlci5kYXJ0CkBAIC02NjEsMTcgKzY2MSwxOSBAQAogICAgIHZhciB2YXJpYWJsZVR5cGUgPSB2YXJpYWJsZS50eXBlOwogICAgIGludCByZWxldmFuY2U7CiAgICAgaWYgKHJlcXVlc3QudXNlTmV3UmVsZXZhbmNlKSB7Ci0gICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBVc2UgdGhlIGRpc3RhbmNlIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSBhcwotICAgICAgLy8gIGFub3RoZXIgZmVhdHVyZS4KICAgICAgIHZhciBjb250ZXh0VHlwZSA9IHJlcXVlc3QuZmVhdHVyZUNvbXB1dGVyCiAgICAgICAgICAgLmNvbnRleHRUeXBlRmVhdHVyZShyZXF1ZXN0LmNvbnRleHRUeXBlLCB2YXJpYWJsZVR5cGUpOwogICAgICAgdmFyIGVsZW1lbnRLaW5kID0gX2NvbXB1dGVFbGVtZW50S2luZCh2YXJpYWJsZSk7CiAgICAgICB2YXIgaXNDb25zdGFudCA9IHJlcXVlc3QuaW5Db25zdGFudENvbnRleHQKICAgICAgICAgICA/IHJlcXVlc3QuZmVhdHVyZUNvbXB1dGVyLmlzQ29uc3RhbnRGZWF0dXJlKHZhcmlhYmxlKQogICAgICAgICAgIDogLTEuMDsKKyAgICAgIHZhciBsb2NhbFZhcmlhYmxlRGlzdGFuY2UgPSByZXF1ZXN0LmZlYXR1cmVDb21wdXRlcgorICAgICAgICAgIC5sb2NhbFZhcmlhYmxlRGlzdGFuY2VGZWF0dXJlKAorICAgICAgICAgICAgICByZXF1ZXN0LnRhcmdldC5jb250YWluaW5nTm9kZSwgdmFyaWFibGUpOwogICAgICAgcmVsZXZhbmNlID0gdG9SZWxldmFuY2UoCiAgICAgICAgICAgd2VpZ2h0ZWRBdmVyYWdlKAotICAgICAgICAgICAgICBbY29udGV4dFR5cGUsIGVsZW1lbnRLaW5kLCBpc0NvbnN0YW50XSwgWzEuMCwgMS4wLCAxLjBdKSwKKyAgICAgICAgICAgICAgW2NvbnRleHRUeXBlLCBlbGVtZW50S2luZCwgaXNDb25zdGFudCwgbG9jYWxWYXJpYWJsZURpc3RhbmNlXSwKKyAgICAgICAgICAgICAgWzEuMCwgMS4wLCAxLjAsIDEuMF0pLAogICAgICAgICAgIDgwMCk7CiAgICAgICBsaXN0ZW5lcj8uY29tcHV0ZWRGZWF0dXJlcyhjb250ZXh0VHlwZTogY29udGV4dFR5cGUpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L2Fic3RyYWN0X3Byb2R1Y2VyLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L2Fic3RyYWN0X3Byb2R1Y2VyLmRhcnQKaW5kZXggMDBhNWNjNi4uYmYyYzlmMiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC9hYnN0cmFjdF9wcm9kdWNlci5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvYWJzdHJhY3RfcHJvZHVjZXIuZGFydApAQCAtMTUsMTMgKzE1LDE0IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdG9rZW4uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RpYWdub3N0aWMvZGlhZ25vc3RpYy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zb3VyY2Uvc291cmNlX3JhbmdlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3Nlc3Npb25faGVscGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FzdC91dGlsaXRpZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3V0aWxpdGllcy9hc3Npc3QvYXNzaXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi91dGlsaXRpZXMvY2hhbmdlX2J1aWxkZXIvY2hhbmdlX2J1aWxkZXJfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vdXRpbGl0aWVzL2NoYW5nZV9idWlsZGVyL2NoYW5nZV93b3Jrc3BhY2UuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L21ha2VfZmluYWwuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvbWFrZV9maW5hbC5kYXJ0CmluZGV4IGMzNWJjZjguLjMzZDNiMGYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvbWFrZV9maW5hbC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvbWFrZV9maW5hbC5kYXJ0CkBAIC0xNiw5ICsxNiwyMyBAQAogCiAgIEBvdmVycmlkZQogICBGdXR1cmU8dm9pZD4gY29tcHV0ZShEYXJ0Q2hhbmdlQnVpbGRlciBidWlsZGVyKSBhc3luYyB7Ci0gICAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgbGlzdDsKICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTsKICAgICBpZiAobm9kZSBpcyBTaW1wbGVJZGVudGlmaWVyICYmCisgICAgICAgIG5vZGUucGFyZW50IGlzIERlY2xhcmVkSWRlbnRpZmllciAmJgorICAgICAgICBub2RlLnBhcmVudC5wYXJlbnQgaXMgRm9yRWFjaFBhcnRzV2l0aERlY2xhcmF0aW9uKSB7CisgICAgICB2YXIgZGVjbGFyYXRpb24gPSBub2RlLnBhcmVudCBhcyBEZWNsYXJlZElkZW50aWZpZXI7CisgICAgICBhd2FpdCBidWlsZGVyLmFkZEZpbGVFZGl0KGZpbGUsIChEYXJ0RmlsZUVkaXRCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmtleXdvcmQ/LmtleXdvcmQgPT0gS2V5d29yZC5WQVIpIHsKKyAgICAgICAgICBidWlsZGVyLmFkZFNpbXBsZVJlcGxhY2VtZW50KAorICAgICAgICAgICAgICByYW5nZS50b2tlbihkZWNsYXJhdGlvbi5rZXl3b3JkKSwgJ2ZpbmFsJyk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24ua2V5d29yZCA9PSBudWxsKSB7CisgICAgICAgICAgYnVpbGRlci5hZGRTaW1wbGVJbnNlcnRpb24oZGVjbGFyYXRpb24ub2Zmc2V0LCAnZmluYWwgJyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBsaXN0OworICAgIGlmIChub2RlIGlzIFNpbXBsZUlkZW50aWZpZXIgJiYKICAgICAgICAgbm9kZS5wYXJlbnQgaXMgVmFyaWFibGVEZWNsYXJhdGlvbiAmJgogICAgICAgICBub2RlLnBhcmVudC5wYXJlbnQgaXMgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QpIHsKICAgICAgIGxpc3QgPSBub2RlLnBhcmVudC5wYXJlbnQ7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L29yZ2FuaXplX2ltcG9ydHMuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvb3JnYW5pemVfaW1wb3J0cy5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDllMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L29yZ2FuaXplX2ltcG9ydHMuZGFydApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L2Fic3RyYWN0X3Byb2R1Y2VyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXguZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2ltcG9ydHMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc291cmNlL3NvdXJjZV9yYW5nZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vdXRpbGl0aWVzL2NoYW5nZV9idWlsZGVyL2NoYW5nZV9idWlsZGVyX2RhcnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3V0aWxpdGllcy9maXhlcy9maXhlcy5kYXJ0JzsKKworY2xhc3MgT3JnYW5pemVJbXBvcnRzIGV4dGVuZHMgQ29ycmVjdGlvblByb2R1Y2VyIHsKKyAgQG92ZXJyaWRlCisgIEZpeEtpbmQgZ2V0IGZpeEtpbmQgPT4gRGFydEZpeEtpbmQuT1JHQU5JWkVfSU1QT1JUUzsKKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlPHZvaWQ+IGNvbXB1dGUoRGFydENoYW5nZUJ1aWxkZXIgYnVpbGRlcikgYXN5bmMgeworICAgIHZhciBvcmdhbml6ZXIgPQorICAgICAgICBJbXBvcnRPcmdhbml6ZXIocmVzb2x2ZWRSZXN1bHQuY29udGVudCwgdW5pdCwgcmVzb2x2ZWRSZXN1bHQuZXJyb3JzKTsKKyAgICAvLyB0b2RvIChwcSk6IGNvbnNpZGVyIHJlc3RydWN0dXJpbmcgb3JnYW5pemVyIHRvIGFsbG93IGEgcGFzc2VkLWluIGNoYW5nZQorICAgIC8vICBidWlsZGVyCisgICAgZm9yICh2YXIgZWRpdCBpbiBvcmdhbml6ZXIub3JnYW5pemUoKSkgeworICAgICAgYXdhaXQgYnVpbGRlci5hZGRGaWxlRWRpdChmaWxlLCAoRGFydEZpbGVFZGl0QnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkU2ltcGxlUmVwbGFjZW1lbnQoCisgICAgICAgICAgICBTb3VyY2VSYW5nZShlZGl0Lm9mZnNldCwgZWRpdC5sZW5ndGgpLCBlZGl0LnJlcGxhY2VtZW50KTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4gVXNlZCBhcyBhIHRlYXItb2ZmIGluIGBGaXhQcm9jZXNzb3JgLgorICBzdGF0aWMgT3JnYW5pemVJbXBvcnRzIG5ld0luc3RhbmNlKCkgPT4gT3JnYW5pemVJbXBvcnRzKCk7Cit9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L3NvcnRfZGlyZWN0aXZlcy5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC9zb3J0X2RpcmVjdGl2ZXMuZGFydApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOTM0MS4uMDAwMDAwMAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L3NvcnRfZGlyZWN0aXZlcy5kYXJ0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQotLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLS8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLWltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC9hYnN0cmFjdF9wcm9kdWNlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9kaXJlY3RpdmVzLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NvdXJjZS9zb3VyY2VfcmFuZ2UuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3V0aWxpdGllcy9jaGFuZ2VfYnVpbGRlci9jaGFuZ2VfYnVpbGRlcl9kYXJ0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi91dGlsaXRpZXMvZml4ZXMvZml4ZXMuZGFydCc7Ci0KLWNsYXNzIFNvcnREaXJlY3RpdmVzIGV4dGVuZHMgQ29ycmVjdGlvblByb2R1Y2VyIHsKLSAgQG92ZXJyaWRlCi0gIEZpeEtpbmQgZ2V0IGZpeEtpbmQgPT4gRGFydEZpeEtpbmQuU09SVF9ESVJFQ1RJVkVTOwotCi0gIEBvdmVycmlkZQotICBGdXR1cmU8dm9pZD4gY29tcHV0ZShEYXJ0Q2hhbmdlQnVpbGRlciBidWlsZGVyKSBhc3luYyB7Ci0gICAgdmFyIG9yZ2FuaXplciA9Ci0gICAgICAgIERpcmVjdGl2ZU9yZ2FuaXplcihyZXNvbHZlZFJlc3VsdC5jb250ZW50LCB1bml0LCByZXNvbHZlZFJlc3VsdC5lcnJvcnMpOwotICAgIC8vIHRvZG8gKHBxKTogY29uc2lkZXIgcmVzdHJ1Y3R1cmluZyBvcmdhbml6ZXIgdG8gYWxsb3cgYSBwYXNzZWQtaW4gY2hhbmdlCi0gICAgLy8gIGJ1aWxkZXIKLSAgICBmb3IgKHZhciBlZGl0IGluIG9yZ2FuaXplci5vcmdhbml6ZSgpKSB7Ci0gICAgICBhd2FpdCBidWlsZGVyLmFkZEZpbGVFZGl0KGZpbGUsIChEYXJ0RmlsZUVkaXRCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgYnVpbGRlci5hZGRTaW1wbGVSZXBsYWNlbWVudCgKLSAgICAgICAgICAgIFNvdXJjZVJhbmdlKGVkaXQub2Zmc2V0LCBlZGl0Lmxlbmd0aCksIGVkaXQucmVwbGFjZW1lbnQpOwotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAgLy8vIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLiBVc2VkIGFzIGEgdGVhci1vZmYgaW4gYEZpeFByb2Nlc3NvcmAuCi0gIHN0YXRpYyBTb3J0RGlyZWN0aXZlcyBuZXdJbnN0YW5jZSgpID0+IFNvcnREaXJlY3RpdmVzKCk7Ci19CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXguZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC5kYXJ0CmluZGV4IGEyNGUzODkuLjNiMTFlY2MgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC5kYXJ0CkBAIC0zMTYsNiArMzE2LDggQEAKICAgICAgICdNb3ZlIHR5cGUgYXJndW1lbnRzIHRvIGFmdGVyIGNsYXNzIG5hbWUnKTsKICAgc3RhdGljIGNvbnN0IE1BS0VfVkFSSUFCTEVfTk9UX0ZJTkFMID0gRml4S2luZCgKICAgICAgICdkYXJ0LmZpeC5tYWtlVmFyaWFibGVOb3RGaW5hbCcsIDUwLCAiTWFrZSB2YXJpYWJsZSAnezB9JyBub3QgZmluYWwiKTsKKyAgc3RhdGljIGNvbnN0IE9SR0FOSVpFX0lNUE9SVFMgPQorICAgICAgRml4S2luZCgnZGFydC5maXgub3JnYW5pemUuaW1wb3J0cycsIDUwLCAnT3JnYW5pemUgSW1wb3J0cycpOwogICBzdGF0aWMgY29uc3QgUVVBTElGWV9SRUZFUkVOQ0UgPQogICAgICAgRml4S2luZCgnZGFydC5maXgucXVhbGlmeVJlZmVyZW5jZScsIDUwLCAiVXNlICd7MH0nIik7CiAgIHN0YXRpYyBjb25zdCBSRU1PVkVfQU5OT1RBVElPTiA9CkBAIC00NDksOCArNDUxLDYgQEAKICAgICAgICdkYXJ0LmZpeC5zb3J0LmNoaWxkUHJvcGVydHlMYXN0JywKICAgICAgIDUwLAogICAgICAgJ01vdmUgY2hpbGQgcHJvcGVydHkgdG8gZW5kIG9mIGFyZ3VtZW50cycpOwotICBzdGF0aWMgY29uc3QgU09SVF9ESVJFQ1RJVkVTID0KLSAgICAgIEZpeEtpbmQoJ2RhcnQuZml4LnNvcnQuZGlyZWN0aXZlcycsIDUwLCAnU29ydCBkaXJlY3RpdmVzJyk7CiAgIHN0YXRpYyBjb25zdCBVUERBVEVfU0RLX0NPTlNUUkFJTlRTID0gRml4S2luZCgKICAgICAgICdkYXJ0LmZpeC51cGRhdGVTZGtDb25zdHJhaW50cycsIDUwLCAnVXBkYXRlIHRoZSBTREsgY29uc3RyYWludHMnKTsKICAgc3RhdGljIGNvbnN0IFVTRV9DT05TVCA9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXhfaW50ZXJuYWwuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeF9pbnRlcm5hbC5kYXJ0CmluZGV4IDNiOTg3ZTkuLjZiODNjOTIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeF9pbnRlcm5hbC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeF9pbnRlcm5hbC5kYXJ0CkBAIC03OSw2ICs3OSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvbWFrZV9maW5hbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC9tYWtlX3ZhcmlhYmxlX25vdF9maW5hbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC9tb3ZlX3R5cGVfYXJndW1lbnRzX3RvX2NsYXNzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L29yZ2FuaXplX2ltcG9ydHMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvcXVhbGlmeV9yZWZlcmVuY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvcmVtb3ZlX2Fubm90YXRpb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvcmVtb3ZlX2FyZ3VtZW50LmRhcnQnOwpAQCAtMTMyLDcgKzEzMyw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvcmVwbGFjZV93aXRoX3RlYXJfb2ZmLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L3JlcGxhY2Vfd2l0aF92YXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2RhcnQvc29ydF9jaGlsZF9wcm9wZXJ0eV9sYXN0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L3NvcnRfZGlyZWN0aXZlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC91cGRhdGVfc2RrX2NvbnN0cmFpbnRzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9kYXJ0L3VzZV9jb25zdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZGFydC91c2VfY3VybHlfYnJhY2VzLmRhcnQnOwpAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgICBBZGREaWFnbm9zdGljUHJvcGVydHlSZWZlcmVuY2UubmV3SW5zdGFuY2UsCiAgICAgXSwKICAgICBMaW50TmFtZXMuZGlyZWN0aXZlc19vcmRlcmluZzogWwotICAgICAgU29ydERpcmVjdGl2ZXMubmV3SW5zdGFuY2UsCisgICAgICBPcmdhbml6ZUltcG9ydHMubmV3SW5zdGFuY2UsCiAgICAgXSwKICAgICBMaW50TmFtZXMuZW1wdHlfY2F0Y2hlczogWwogICAgICAgUmVtb3ZlRW1wdHlDYXRjaC5uZXdJbnN0YW5jZSwKQEAgLTM4Myw2ICszODMsOSBAQAogICAgIExpbnROYW1lcy5wcmVmZXJfZmluYWxfZmllbGRzOiBbCiAgICAgICBNYWtlRmluYWwubmV3SW5zdGFuY2UsCiAgICAgXSwKKyAgICBMaW50TmFtZXMucHJlZmVyX2ZpbmFsX2luX2Zvcl9lYWNoOiBbCisgICAgICBNYWtlRmluYWwubmV3SW5zdGFuY2UsCisgICAgXSwKICAgICBMaW50TmFtZXMucHJlZmVyX2ZpbmFsX2xvY2FsczogWwogICAgICAgTWFrZUZpbmFsLm5ld0luc3RhbmNlLAogICAgIF0sCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9kaXJlY3RpdmVzLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9kaXJlY3RpdmVzLmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmQzY2QuLjAwMDAwMDAKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vb3JnYW5pemVfZGlyZWN0aXZlcy5kYXJ0CisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLS8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi0vLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1pbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy91dGlsaXRpZXMvc3RyaW5ncy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC9hc3QuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdG9rZW4uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvZXJyb3IuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi9wcm90b2NvbC9wcm90b2NvbF9jb21tb24uZGFydCcKLSAgICBoaWRlIEFuYWx5c2lzRXJyb3IsIEVsZW1lbnQ7Ci0KLS8vLyBPcmdhbml6ZXIgb2YgZGlyZWN0aXZlcyBpbiB0aGUgW3VuaXRdLgotY2xhc3MgRGlyZWN0aXZlT3JnYW5pemVyIHsKLSAgZmluYWwgU3RyaW5nIGluaXRpYWxDb2RlOwotICBmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdDsKLSAgZmluYWwgTGlzdDxBbmFseXNpc0Vycm9yPiBlcnJvcnM7Ci0gIGZpbmFsIGJvb2wgcmVtb3ZlVW51c2VkOwotCi0gIFN0cmluZyBjb2RlOwotICBTdHJpbmcgZW5kT2ZMaW5lOwotICBib29sIGhhc1VucmVzb2x2ZWRJZGVudGlmaWVyRXJyb3I7Ci0KLSAgRGlyZWN0aXZlT3JnYW5pemVyKHRoaXMuaW5pdGlhbENvZGUsIHRoaXMudW5pdCwgdGhpcy5lcnJvcnMsCi0gICAgICB7dGhpcy5yZW1vdmVVbnVzZWQgPSB0cnVlfSkgewotICAgIGNvZGUgPSBpbml0aWFsQ29kZTsKLSAgICBlbmRPZkxpbmUgPSBnZXRFT0woY29kZSk7Ci0gICAgaGFzVW5yZXNvbHZlZElkZW50aWZpZXJFcnJvciA9IGVycm9ycy5hbnkoKGVycm9yKSB7Ci0gICAgICByZXR1cm4gZXJyb3IuZXJyb3JDb2RlLmlzVW5yZXNvbHZlZElkZW50aWZpZXI7Ci0gICAgfSk7Ci0gIH0KLQotICAvLy8gUmV0dXJuIHRoZSBbU291cmNlRWRpdF1zIHRoYXQgb3JnYW5pemUgZGlyZWN0aXZlcyBpbiB0aGUgW3VuaXRdLgotICBMaXN0PFNvdXJjZUVkaXQ+IG9yZ2FuaXplKCkgewotICAgIF9vcmdhbml6ZURpcmVjdGl2ZXMoKTsKLSAgICAvLyBwcmVwYXJlIGVkaXRzCi0gICAgdmFyIGVkaXRzID0gPFNvdXJjZUVkaXQ+W107Ci0gICAgaWYgKGNvZGUgIT0gaW5pdGlhbENvZGUpIHsKLSAgICAgIHZhciBzdWZmaXhMZW5ndGggPSBmaW5kQ29tbW9uU3VmZml4KGluaXRpYWxDb2RlLCBjb2RlKTsKLSAgICAgIHZhciBlZGl0ID0gU291cmNlRWRpdCgwLCBpbml0aWFsQ29kZS5sZW5ndGggLSBzdWZmaXhMZW5ndGgsCi0gICAgICAgICAgY29kZS5zdWJzdHJpbmcoMCwgY29kZS5sZW5ndGggLSBzdWZmaXhMZW5ndGgpKTsKLSAgICAgIGVkaXRzLmFkZChlZGl0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRzOwotICB9Ci0KLSAgYm9vbCBfaXNVbnVzZWRJbXBvcnQoVXJpQmFzZWREaXJlY3RpdmUgZGlyZWN0aXZlKSB7Ci0gICAgZm9yICh2YXIgZXJyb3IgaW4gZXJyb3JzKSB7Ci0gICAgICBpZiAoKGVycm9yLmVycm9yQ29kZSA9PSBIaW50Q29kZS5EVVBMSUNBVEVfSU1QT1JUIHx8Ci0gICAgICAgICAgICAgIGVycm9yLmVycm9yQ29kZSA9PSBIaW50Q29kZS5VTlVTRURfSU1QT1JUKSAmJgotICAgICAgICAgIGRpcmVjdGl2ZS51cmkub2Zmc2V0ID09IGVycm9yLm9mZnNldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8vIE9yZ2FuaXplIGFsbCBbRGlyZWN0aXZlXXMuCi0gIHZvaWQgX29yZ2FuaXplRGlyZWN0aXZlcygpIHsKLSAgICB2YXIgbGluZUluZm8gPSB1bml0LmxpbmVJbmZvOwotICAgIHZhciBkaXJlY3RpdmVzID0gPF9EaXJlY3RpdmVJbmZvPltdOwotICAgIGZvciAodmFyIGRpcmVjdGl2ZSBpbiB1bml0LmRpcmVjdGl2ZXMpIHsKLSAgICAgIGlmIChkaXJlY3RpdmUgaXMgVXJpQmFzZWREaXJlY3RpdmUpIHsKLSAgICAgICAgdmFyIHByaW9yaXR5ID0gZ2V0RGlyZWN0aXZlUHJpb3JpdHkoZGlyZWN0aXZlKTsKLSAgICAgICAgaWYgKHByaW9yaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICB2YXIgb2Zmc2V0ID0gZGlyZWN0aXZlLm9mZnNldDsKLQotICAgICAgICAgIHZhciBlbmQgPSBkaXJlY3RpdmUuZW5kOwotICAgICAgICAgIHZhciBsaW5lID0gbGluZUluZm8uZ2V0TG9jYXRpb24oZW5kKS5saW5lTnVtYmVyOwotICAgICAgICAgIFRva2VuIGNvbW1lbnQgPSBkaXJlY3RpdmUuZW5kVG9rZW4ubmV4dC5wcmVjZWRpbmdDb21tZW50czsKLSAgICAgICAgICB3aGlsZSAoY29tbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGluZUluZm8uZ2V0TG9jYXRpb24oY29tbWVudC5vZmZzZXQpLmxpbmVOdW1iZXIgPT0gbGluZSkgewotICAgICAgICAgICAgICBlbmQgPSBjb21tZW50LmVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50Lm5leHQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgdmFyIHRleHQgPSBjb2RlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0gICAgICAgICAgdmFyIHVyaUNvbnRlbnQgPSBkaXJlY3RpdmUudXJpLnN0cmluZ1ZhbHVlOwotICAgICAgICAgIGRpcmVjdGl2ZXMuYWRkKAotICAgICAgICAgICAgX0RpcmVjdGl2ZUluZm8oCi0gICAgICAgICAgICAgIGRpcmVjdGl2ZSwKLSAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgIHVyaUNvbnRlbnQsCi0gICAgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgKSwKLSAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICBpZiAoZGlyZWN0aXZlcy5pc0VtcHR5KSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhciBmaXJzdERpcmVjdGl2ZU9mZnNldCA9IGRpcmVjdGl2ZXMuZmlyc3Qub2Zmc2V0OwotICAgIHZhciBsYXN0RGlyZWN0aXZlRW5kID0gZGlyZWN0aXZlcy5sYXN0LmVuZDsKLSAgICAvLyBzb3J0Ci0gICAgZGlyZWN0aXZlcy5zb3J0KCk7Ci0gICAgLy8gYXBwZW5kIGRpcmVjdGl2ZXMgd2l0aCBncm91cGluZwotICAgIFN0cmluZyBkaXJlY3RpdmVzQ29kZTsKLSAgICB7Ci0gICAgICB2YXIgc2IgPSBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIF9EaXJlY3RpdmVQcmlvcml0eSBjdXJyZW50UHJpb3JpdHk7Ci0gICAgICBmb3IgKHZhciBkaXJlY3RpdmVJbmZvIGluIGRpcmVjdGl2ZXMpIHsKLSAgICAgICAgaWYgKCFoYXNVbnJlc29sdmVkSWRlbnRpZmllckVycm9yKSB7Ci0gICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZUluZm8uZGlyZWN0aXZlOwotICAgICAgICAgIGlmIChyZW1vdmVVbnVzZWQgJiYgX2lzVW51c2VkSW1wb3J0KGRpcmVjdGl2ZSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFByaW9yaXR5ICE9IGRpcmVjdGl2ZUluZm8ucHJpb3JpdHkpIHsKLSAgICAgICAgICBpZiAoc2IubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIHNiLndyaXRlKGVuZE9mTGluZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGN1cnJlbnRQcmlvcml0eSA9IGRpcmVjdGl2ZUluZm8ucHJpb3JpdHk7Ci0gICAgICAgIH0KLSAgICAgICAgc2Iud3JpdGUoZGlyZWN0aXZlSW5mby50ZXh0KTsKLSAgICAgICAgc2Iud3JpdGUoZW5kT2ZMaW5lKTsKLSAgICAgIH0KLSAgICAgIGRpcmVjdGl2ZXNDb2RlID0gc2IudG9TdHJpbmcoKTsKLSAgICAgIGRpcmVjdGl2ZXNDb2RlID0gZGlyZWN0aXZlc0NvZGUudHJpbVJpZ2h0KCk7Ci0gICAgfQotICAgIC8vIHByZXBhcmUgY29kZQotICAgIHZhciBiZWZvcmVEaXJlY3RpdmVzID0gY29kZS5zdWJzdHJpbmcoMCwgZmlyc3REaXJlY3RpdmVPZmZzZXQpOwotICAgIHZhciBhZnRlckRpcmVjdGl2ZXMgPSBjb2RlLnN1YnN0cmluZyhsYXN0RGlyZWN0aXZlRW5kKTsKLSAgICBjb2RlID0gYmVmb3JlRGlyZWN0aXZlcyArIGRpcmVjdGl2ZXNDb2RlICsgYWZ0ZXJEaXJlY3RpdmVzOwotICB9Ci0KLSAgc3RhdGljIF9EaXJlY3RpdmVQcmlvcml0eSBnZXREaXJlY3RpdmVQcmlvcml0eShVcmlCYXNlZERpcmVjdGl2ZSBkaXJlY3RpdmUpIHsKLSAgICB2YXIgdXJpQ29udGVudCA9IGRpcmVjdGl2ZS51cmkuc3RyaW5nVmFsdWU7Ci0gICAgaWYgKGRpcmVjdGl2ZSBpcyBJbXBvcnREaXJlY3RpdmUpIHsKLSAgICAgIGlmICh1cmlDb250ZW50LnN0YXJ0c1dpdGgoJ2RhcnQ6JykpIHsKLSAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5JTVBPUlRfU0RLOwotICAgICAgfSBlbHNlIGlmICh1cmlDb250ZW50LnN0YXJ0c1dpdGgoJ3BhY2thZ2U6JykpIHsKLSAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5JTVBPUlRfUEtHOwotICAgICAgfSBlbHNlIGlmICh1cmlDb250ZW50LmNvbnRhaW5zKCc6Ly8nKSkgewotICAgICAgICByZXR1cm4gX0RpcmVjdGl2ZVByaW9yaXR5LklNUE9SVF9PVEhFUjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuSU1QT1JUX1JFTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRpcmVjdGl2ZSBpcyBFeHBvcnREaXJlY3RpdmUpIHsKLSAgICAgIGlmICh1cmlDb250ZW50LnN0YXJ0c1dpdGgoJ2RhcnQ6JykpIHsKLSAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5FWFBPUlRfU0RLOwotICAgICAgfSBlbHNlIGlmICh1cmlDb250ZW50LnN0YXJ0c1dpdGgoJ3BhY2thZ2U6JykpIHsKLSAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5FWFBPUlRfUEtHOwotICAgICAgfSBlbHNlIGlmICh1cmlDb250ZW50LmNvbnRhaW5zKCc6Ly8nKSkgewotICAgICAgICByZXR1cm4gX0RpcmVjdGl2ZVByaW9yaXR5LkVYUE9SVF9PVEhFUjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuRVhQT1JUX1JFTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRpcmVjdGl2ZSBpcyBQYXJ0RGlyZWN0aXZlKSB7Ci0gICAgICByZXR1cm4gX0RpcmVjdGl2ZVByaW9yaXR5LlBBUlQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLy8vIFJldHVybiB0aGUgRU9MIHRvIHVzZSBmb3IgW2NvZGVdLgotICBzdGF0aWMgU3RyaW5nIGdldEVPTChTdHJpbmcgY29kZSkgewotICAgIGlmIChjb2RlLmNvbnRhaW5zKCdcclxuJykpIHsKLSAgICAgIHJldHVybiAnXHJcbic7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAnXG4nOwotICAgIH0KLSAgfQotfQotCi1jbGFzcyBfRGlyZWN0aXZlSW5mbyBpbXBsZW1lbnRzIENvbXBhcmFibGU8X0RpcmVjdGl2ZUluZm8+IHsKLSAgZmluYWwgVXJpQmFzZWREaXJlY3RpdmUgZGlyZWN0aXZlOwotICBmaW5hbCBfRGlyZWN0aXZlUHJpb3JpdHkgcHJpb3JpdHk7Ci0gIGZpbmFsIFN0cmluZyB1cmk7Ci0KLSAgLy8vIFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHRva2VuLCB1c3VhbGx5IHRoZSBrZXl3b3JkLgotICBmaW5hbCBpbnQgb2Zmc2V0OwotCi0gIC8vLyBUaGUgb2Zmc2V0IGFmdGVyIHRoZSBsZWFzdCB0b2tlbiwgaW5jbHVkaW5nIHRoZSBlbmQtb2YtbGluZSBjb21tZW50LgotICBmaW5hbCBpbnQgZW5kOwotCi0gIC8vLyBUaGUgdGV4dCBiZXR3ZWVuIFtvZmZzZXRdIGFuZCBbZW5kXS4KLSAgZmluYWwgU3RyaW5nIHRleHQ7Ci0KLSAgX0RpcmVjdGl2ZUluZm8oCi0gICAgdGhpcy5kaXJlY3RpdmUsCi0gICAgdGhpcy5wcmlvcml0eSwKLSAgICB0aGlzLnVyaSwKLSAgICB0aGlzLm9mZnNldCwKLSAgICB0aGlzLmVuZCwKLSAgICB0aGlzLnRleHQsCi0gICk7Ci0KLSAgQG92ZXJyaWRlCi0gIGludCBjb21wYXJlVG8oX0RpcmVjdGl2ZUluZm8gb3RoZXIpIHsKLSAgICBpZiAocHJpb3JpdHkgPT0gb3RoZXIucHJpb3JpdHkpIHsKLSAgICAgIHJldHVybiBfY29tcGFyZVVyaSh1cmksIG90aGVyLnVyaSk7Ci0gICAgfQotICAgIHJldHVybiBwcmlvcml0eS5vcmRpbmFsIC0gb3RoZXIucHJpb3JpdHkub3JkaW5hbDsKLSAgfQotCi0gIEBvdmVycmlkZQotICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnKHByaW9yaXR5PSRwcmlvcml0eTsgdGV4dD0kdGV4dCknOwotCi0gIHN0YXRpYyBpbnQgX2NvbXBhcmVVcmkoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgdmFyIGFMaXN0ID0gX3NwbGl0VXJpKGEpOwotICAgIHZhciBiTGlzdCA9IF9zcGxpdFVyaShiKTsKLSAgICBpbnQgcmVzdWx0OwotICAgIGlmICgocmVzdWx0ID0gYUxpc3RbMF0uY29tcGFyZVRvKGJMaXN0WzBdKSkgIT0gMCkgcmV0dXJuIHJlc3VsdDsKLSAgICBpZiAoKHJlc3VsdCA9IGFMaXN0WzFdLmNvbXBhcmVUbyhiTGlzdFsxXSkpICE9IDApIHJldHVybiByZXN1bHQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLy8gU3BsaXQgdGhlIGdpdmVuIFt1cmldIGxpa2UgYHBhY2thZ2U6c29tZS5uYW1lL2FuZC9wYXRoLmRhcnRgIGludG8gYSBsaXN0Ci0gIC8vLyBsaWtlIGBbcGFja2FnZTpzb21lLm5hbWUsIGFuZC9wYXRoLmRhcnRdYC4KLSAgc3RhdGljIExpc3Q8U3RyaW5nPiBfc3BsaXRVcmkoU3RyaW5nIHVyaSkgewotICAgIHZhciBpbmRleCA9IHVyaS5pbmRleE9mKCcvJyk7Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICByZXR1cm4gPFN0cmluZz5bdXJpLCAnJ107Ci0gICAgfQotICAgIHJldHVybiA8U3RyaW5nPlt1cmkuc3Vic3RyaW5nKDAsIGluZGV4KSwgdXJpLnN1YnN0cmluZyhpbmRleCArIDEpXTsKLSAgfQotfQotCi1jbGFzcyBfRGlyZWN0aXZlUHJpb3JpdHkgewotICBzdGF0aWMgY29uc3QgSU1QT1JUX1NESyA9IF9EaXJlY3RpdmVQcmlvcml0eSgnSU1QT1JUX1NESycsIDApOwotICBzdGF0aWMgY29uc3QgSU1QT1JUX1BLRyA9IF9EaXJlY3RpdmVQcmlvcml0eSgnSU1QT1JUX1BLRycsIDEpOwotICBzdGF0aWMgY29uc3QgSU1QT1JUX09USEVSID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdJTVBPUlRfT1RIRVInLCAyKTsKLSAgc3RhdGljIGNvbnN0IElNUE9SVF9SRUwgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0lNUE9SVF9SRUwnLCAzKTsKLSAgc3RhdGljIGNvbnN0IEVYUE9SVF9TREsgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0VYUE9SVF9TREsnLCA0KTsKLSAgc3RhdGljIGNvbnN0IEVYUE9SVF9QS0cgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0VYUE9SVF9QS0cnLCA1KTsKLSAgc3RhdGljIGNvbnN0IEVYUE9SVF9PVEhFUiA9IF9EaXJlY3RpdmVQcmlvcml0eSgnRVhQT1JUX09USEVSJywgNik7Ci0gIHN0YXRpYyBjb25zdCBFWFBPUlRfUkVMID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdFWFBPUlRfUkVMJywgNyk7Ci0gIHN0YXRpYyBjb25zdCBQQVJUID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdQQVJUJywgOCk7Ci0KLSAgZmluYWwgU3RyaW5nIG5hbWU7Ci0gIGZpbmFsIGludCBvcmRpbmFsOwotCi0gIGNvbnN0IF9EaXJlY3RpdmVQcmlvcml0eSh0aGlzLm5hbWUsIHRoaXMub3JkaW5hbCk7Ci0KLSAgQG92ZXJyaWRlCi0gIFN0cmluZyB0b1N0cmluZygpID0+IG5hbWU7Ci19CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9pbXBvcnRzLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9pbXBvcnRzLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwMTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2ltcG9ydHMuZGFydApAQCAtMCwwICsxLDI0MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3V0aWxpdGllcy9zdHJpbmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L2FzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC90b2tlbi5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbW1vbi5kYXJ0JworICAgIGhpZGUgQW5hbHlzaXNFcnJvciwgRWxlbWVudDsKKworLy8vIE9yZ2FuaXplciBvZiBpbXBvcnRzIChhbmQgb3RoZXIgZGlyZWN0aXZlcykgaW4gdGhlIFt1bml0XS4KK2NsYXNzIEltcG9ydE9yZ2FuaXplciB7CisgIGZpbmFsIFN0cmluZyBpbml0aWFsQ29kZTsKKyAgZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQ7CisgIGZpbmFsIExpc3Q8QW5hbHlzaXNFcnJvcj4gZXJyb3JzOworICBmaW5hbCBib29sIHJlbW92ZVVudXNlZDsKKworICBTdHJpbmcgY29kZTsKKyAgU3RyaW5nIGVuZE9mTGluZTsKKyAgYm9vbCBoYXNVbnJlc29sdmVkSWRlbnRpZmllckVycm9yOworCisgIEltcG9ydE9yZ2FuaXplcih0aGlzLmluaXRpYWxDb2RlLCB0aGlzLnVuaXQsIHRoaXMuZXJyb3JzLAorICAgICAge3RoaXMucmVtb3ZlVW51c2VkID0gdHJ1ZX0pIHsKKyAgICBjb2RlID0gaW5pdGlhbENvZGU7CisgICAgZW5kT2ZMaW5lID0gZ2V0RU9MKGNvZGUpOworICAgIGhhc1VucmVzb2x2ZWRJZGVudGlmaWVyRXJyb3IgPSBlcnJvcnMuYW55KChlcnJvcikgeworICAgICAgcmV0dXJuIGVycm9yLmVycm9yQ29kZS5pc1VucmVzb2x2ZWRJZGVudGlmaWVyOworICAgIH0pOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgW1NvdXJjZUVkaXRdcyB0aGF0IG9yZ2FuaXplIGltcG9ydHMgaW4gdGhlIFt1bml0XS4KKyAgTGlzdDxTb3VyY2VFZGl0PiBvcmdhbml6ZSgpIHsKKyAgICBfb3JnYW5pemVEaXJlY3RpdmVzKCk7CisgICAgLy8gcHJlcGFyZSBlZGl0cworICAgIHZhciBlZGl0cyA9IDxTb3VyY2VFZGl0PltdOworICAgIGlmIChjb2RlICE9IGluaXRpYWxDb2RlKSB7CisgICAgICB2YXIgc3VmZml4TGVuZ3RoID0gZmluZENvbW1vblN1ZmZpeChpbml0aWFsQ29kZSwgY29kZSk7CisgICAgICB2YXIgZWRpdCA9IFNvdXJjZUVkaXQoMCwgaW5pdGlhbENvZGUubGVuZ3RoIC0gc3VmZml4TGVuZ3RoLAorICAgICAgICAgIGNvZGUuc3Vic3RyaW5nKDAsIGNvZGUubGVuZ3RoIC0gc3VmZml4TGVuZ3RoKSk7CisgICAgICBlZGl0cy5hZGQoZWRpdCk7CisgICAgfQorICAgIHJldHVybiBlZGl0czsKKyAgfQorCisgIGJvb2wgX2lzVW51c2VkSW1wb3J0KFVyaUJhc2VkRGlyZWN0aXZlIGRpcmVjdGl2ZSkgeworICAgIGZvciAodmFyIGVycm9yIGluIGVycm9ycykgeworICAgICAgaWYgKChlcnJvci5lcnJvckNvZGUgPT0gSGludENvZGUuRFVQTElDQVRFX0lNUE9SVCB8fAorICAgICAgICAgICAgICBlcnJvci5lcnJvckNvZGUgPT0gSGludENvZGUuVU5VU0VEX0lNUE9SVCkgJiYKKyAgICAgICAgICBkaXJlY3RpdmUudXJpLm9mZnNldCA9PSBlcnJvci5vZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBPcmdhbml6ZSBhbGwgW0RpcmVjdGl2ZV1zLgorICB2b2lkIF9vcmdhbml6ZURpcmVjdGl2ZXMoKSB7CisgICAgdmFyIGxpbmVJbmZvID0gdW5pdC5saW5lSW5mbzsKKyAgICB2YXIgZGlyZWN0aXZlcyA9IDxfRGlyZWN0aXZlSW5mbz5bXTsKKyAgICBmb3IgKHZhciBkaXJlY3RpdmUgaW4gdW5pdC5kaXJlY3RpdmVzKSB7CisgICAgICBpZiAoZGlyZWN0aXZlIGlzIFVyaUJhc2VkRGlyZWN0aXZlKSB7CisgICAgICAgIHZhciBwcmlvcml0eSA9IGdldERpcmVjdGl2ZVByaW9yaXR5KGRpcmVjdGl2ZSk7CisgICAgICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7CisgICAgICAgICAgdmFyIG9mZnNldCA9IGRpcmVjdGl2ZS5vZmZzZXQ7CisKKyAgICAgICAgICB2YXIgZW5kID0gZGlyZWN0aXZlLmVuZDsKKyAgICAgICAgICB2YXIgbGluZSA9IGxpbmVJbmZvLmdldExvY2F0aW9uKGVuZCkubGluZU51bWJlcjsKKyAgICAgICAgICBUb2tlbiBjb21tZW50ID0gZGlyZWN0aXZlLmVuZFRva2VuLm5leHQucHJlY2VkaW5nQ29tbWVudHM7CisgICAgICAgICAgd2hpbGUgKGNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxpbmVJbmZvLmdldExvY2F0aW9uKGNvbW1lbnQub2Zmc2V0KS5saW5lTnVtYmVyID09IGxpbmUpIHsKKyAgICAgICAgICAgICAgZW5kID0gY29tbWVudC5lbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5uZXh0OworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciB0ZXh0ID0gY29kZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOworICAgICAgICAgIHZhciB1cmlDb250ZW50ID0gZGlyZWN0aXZlLnVyaS5zdHJpbmdWYWx1ZTsKKyAgICAgICAgICBkaXJlY3RpdmVzLmFkZCgKKyAgICAgICAgICAgIF9EaXJlY3RpdmVJbmZvKAorICAgICAgICAgICAgICBkaXJlY3RpdmUsCisgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICB1cmlDb250ZW50LAorICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgaWYgKGRpcmVjdGl2ZXMuaXNFbXB0eSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgZmlyc3REaXJlY3RpdmVPZmZzZXQgPSBkaXJlY3RpdmVzLmZpcnN0Lm9mZnNldDsKKyAgICB2YXIgbGFzdERpcmVjdGl2ZUVuZCA9IGRpcmVjdGl2ZXMubGFzdC5lbmQ7CisgICAgLy8gc29ydAorICAgIGRpcmVjdGl2ZXMuc29ydCgpOworICAgIC8vIGFwcGVuZCBkaXJlY3RpdmVzIHdpdGggZ3JvdXBpbmcKKyAgICBTdHJpbmcgZGlyZWN0aXZlc0NvZGU7CisgICAgeworICAgICAgdmFyIHNiID0gU3RyaW5nQnVmZmVyKCk7CisgICAgICBfRGlyZWN0aXZlUHJpb3JpdHkgY3VycmVudFByaW9yaXR5OworICAgICAgZm9yICh2YXIgZGlyZWN0aXZlSW5mbyBpbiBkaXJlY3RpdmVzKSB7CisgICAgICAgIGlmICghaGFzVW5yZXNvbHZlZElkZW50aWZpZXJFcnJvcikgeworICAgICAgICAgIHZhciBkaXJlY3RpdmUgPSBkaXJlY3RpdmVJbmZvLmRpcmVjdGl2ZTsKKyAgICAgICAgICBpZiAocmVtb3ZlVW51c2VkICYmIF9pc1VudXNlZEltcG9ydChkaXJlY3RpdmUpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRQcmlvcml0eSAhPSBkaXJlY3RpdmVJbmZvLnByaW9yaXR5KSB7CisgICAgICAgICAgaWYgKHNiLmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICBzYi53cml0ZShlbmRPZkxpbmUpOworICAgICAgICAgIH0KKyAgICAgICAgICBjdXJyZW50UHJpb3JpdHkgPSBkaXJlY3RpdmVJbmZvLnByaW9yaXR5OworICAgICAgICB9CisgICAgICAgIHNiLndyaXRlKGRpcmVjdGl2ZUluZm8udGV4dCk7CisgICAgICAgIHNiLndyaXRlKGVuZE9mTGluZSk7CisgICAgICB9CisgICAgICBkaXJlY3RpdmVzQ29kZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICBkaXJlY3RpdmVzQ29kZSA9IGRpcmVjdGl2ZXNDb2RlLnRyaW1SaWdodCgpOworICAgIH0KKyAgICAvLyBwcmVwYXJlIGNvZGUKKyAgICB2YXIgYmVmb3JlRGlyZWN0aXZlcyA9IGNvZGUuc3Vic3RyaW5nKDAsIGZpcnN0RGlyZWN0aXZlT2Zmc2V0KTsKKyAgICB2YXIgYWZ0ZXJEaXJlY3RpdmVzID0gY29kZS5zdWJzdHJpbmcobGFzdERpcmVjdGl2ZUVuZCk7CisgICAgY29kZSA9IGJlZm9yZURpcmVjdGl2ZXMgKyBkaXJlY3RpdmVzQ29kZSArIGFmdGVyRGlyZWN0aXZlczsKKyAgfQorCisgIHN0YXRpYyBfRGlyZWN0aXZlUHJpb3JpdHkgZ2V0RGlyZWN0aXZlUHJpb3JpdHkoVXJpQmFzZWREaXJlY3RpdmUgZGlyZWN0aXZlKSB7CisgICAgdmFyIHVyaUNvbnRlbnQgPSBkaXJlY3RpdmUudXJpLnN0cmluZ1ZhbHVlOworICAgIGlmIChkaXJlY3RpdmUgaXMgSW1wb3J0RGlyZWN0aXZlKSB7CisgICAgICBpZiAodXJpQ29udGVudC5zdGFydHNXaXRoKCdkYXJ0OicpKSB7CisgICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuSU1QT1JUX1NESzsKKyAgICAgIH0gZWxzZSBpZiAodXJpQ29udGVudC5zdGFydHNXaXRoKCdwYWNrYWdlOicpKSB7CisgICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuSU1QT1JUX1BLRzsKKyAgICAgIH0gZWxzZSBpZiAodXJpQ29udGVudC5jb250YWlucygnOi8vJykpIHsKKyAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5JTVBPUlRfT1RIRVI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX0RpcmVjdGl2ZVByaW9yaXR5LklNUE9SVF9SRUw7CisgICAgICB9CisgICAgfQorICAgIGlmIChkaXJlY3RpdmUgaXMgRXhwb3J0RGlyZWN0aXZlKSB7CisgICAgICBpZiAodXJpQ29udGVudC5zdGFydHNXaXRoKCdkYXJ0OicpKSB7CisgICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuRVhQT1JUX1NESzsKKyAgICAgIH0gZWxzZSBpZiAodXJpQ29udGVudC5zdGFydHNXaXRoKCdwYWNrYWdlOicpKSB7CisgICAgICAgIHJldHVybiBfRGlyZWN0aXZlUHJpb3JpdHkuRVhQT1JUX1BLRzsKKyAgICAgIH0gZWxzZSBpZiAodXJpQ29udGVudC5jb250YWlucygnOi8vJykpIHsKKyAgICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5FWFBPUlRfT1RIRVI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX0RpcmVjdGl2ZVByaW9yaXR5LkVYUE9SVF9SRUw7CisgICAgICB9CisgICAgfQorICAgIGlmIChkaXJlY3RpdmUgaXMgUGFydERpcmVjdGl2ZSkgeworICAgICAgcmV0dXJuIF9EaXJlY3RpdmVQcmlvcml0eS5QQVJUOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIEVPTCB0byB1c2UgZm9yIFtjb2RlXS4KKyAgc3RhdGljIFN0cmluZyBnZXRFT0woU3RyaW5nIGNvZGUpIHsKKyAgICBpZiAoY29kZS5jb250YWlucygnXHJcbicpKSB7CisgICAgICByZXR1cm4gJ1xyXG4nOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJ1xuJzsKKyAgICB9CisgIH0KK30KKworY2xhc3MgX0RpcmVjdGl2ZUluZm8gaW1wbGVtZW50cyBDb21wYXJhYmxlPF9EaXJlY3RpdmVJbmZvPiB7CisgIGZpbmFsIFVyaUJhc2VkRGlyZWN0aXZlIGRpcmVjdGl2ZTsKKyAgZmluYWwgX0RpcmVjdGl2ZVByaW9yaXR5IHByaW9yaXR5OworICBmaW5hbCBTdHJpbmcgdXJpOworCisgIC8vLyBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCB0b2tlbiwgdXN1YWxseSB0aGUga2V5d29yZC4KKyAgZmluYWwgaW50IG9mZnNldDsKKworICAvLy8gVGhlIG9mZnNldCBhZnRlciB0aGUgbGVhc3QgdG9rZW4sIGluY2x1ZGluZyB0aGUgZW5kLW9mLWxpbmUgY29tbWVudC4KKyAgZmluYWwgaW50IGVuZDsKKworICAvLy8gVGhlIHRleHQgYmV0d2VlbiBbb2Zmc2V0XSBhbmQgW2VuZF0uCisgIGZpbmFsIFN0cmluZyB0ZXh0OworCisgIF9EaXJlY3RpdmVJbmZvKAorICAgIHRoaXMuZGlyZWN0aXZlLAorICAgIHRoaXMucHJpb3JpdHksCisgICAgdGhpcy51cmksCisgICAgdGhpcy5vZmZzZXQsCisgICAgdGhpcy5lbmQsCisgICAgdGhpcy50ZXh0LAorICApOworCisgIEBvdmVycmlkZQorICBpbnQgY29tcGFyZVRvKF9EaXJlY3RpdmVJbmZvIG90aGVyKSB7CisgICAgaWYgKHByaW9yaXR5ID09IG90aGVyLnByaW9yaXR5KSB7CisgICAgICByZXR1cm4gX2NvbXBhcmVVcmkodXJpLCBvdGhlci51cmkpOworICAgIH0KKyAgICByZXR1cm4gcHJpb3JpdHkub3JkaW5hbCAtIG90aGVyLnByaW9yaXR5Lm9yZGluYWw7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyhwcmlvcml0eT0kcHJpb3JpdHk7IHRleHQ9JHRleHQpJzsKKworICBzdGF0aWMgaW50IF9jb21wYXJlVXJpKFN0cmluZyBhLCBTdHJpbmcgYikgeworICAgIHZhciBhTGlzdCA9IF9zcGxpdFVyaShhKTsKKyAgICB2YXIgYkxpc3QgPSBfc3BsaXRVcmkoYik7CisgICAgaW50IHJlc3VsdDsKKyAgICBpZiAoKHJlc3VsdCA9IGFMaXN0WzBdLmNvbXBhcmVUbyhiTGlzdFswXSkpICE9IDApIHJldHVybiByZXN1bHQ7CisgICAgaWYgKChyZXN1bHQgPSBhTGlzdFsxXS5jb21wYXJlVG8oYkxpc3RbMV0pKSAhPSAwKSByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFNwbGl0IHRoZSBnaXZlbiBbdXJpXSBsaWtlIGBwYWNrYWdlOnNvbWUubmFtZS9hbmQvcGF0aC5kYXJ0YCBpbnRvIGEgbGlzdAorICAvLy8gbGlrZSBgW3BhY2thZ2U6c29tZS5uYW1lLCBhbmQvcGF0aC5kYXJ0XWAuCisgIHN0YXRpYyBMaXN0PFN0cmluZz4gX3NwbGl0VXJpKFN0cmluZyB1cmkpIHsKKyAgICB2YXIgaW5kZXggPSB1cmkuaW5kZXhPZignLycpOworICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgcmV0dXJuIDxTdHJpbmc+W3VyaSwgJyddOworICAgIH0KKyAgICByZXR1cm4gPFN0cmluZz5bdXJpLnN1YnN0cmluZygwLCBpbmRleCksIHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKV07CisgIH0KK30KKworY2xhc3MgX0RpcmVjdGl2ZVByaW9yaXR5IHsKKyAgc3RhdGljIGNvbnN0IElNUE9SVF9TREsgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0lNUE9SVF9TREsnLCAwKTsKKyAgc3RhdGljIGNvbnN0IElNUE9SVF9QS0cgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0lNUE9SVF9QS0cnLCAxKTsKKyAgc3RhdGljIGNvbnN0IElNUE9SVF9PVEhFUiA9IF9EaXJlY3RpdmVQcmlvcml0eSgnSU1QT1JUX09USEVSJywgMik7CisgIHN0YXRpYyBjb25zdCBJTVBPUlRfUkVMID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdJTVBPUlRfUkVMJywgMyk7CisgIHN0YXRpYyBjb25zdCBFWFBPUlRfU0RLID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdFWFBPUlRfU0RLJywgNCk7CisgIHN0YXRpYyBjb25zdCBFWFBPUlRfUEtHID0gX0RpcmVjdGl2ZVByaW9yaXR5KCdFWFBPUlRfUEtHJywgNSk7CisgIHN0YXRpYyBjb25zdCBFWFBPUlRfT1RIRVIgPSBfRGlyZWN0aXZlUHJpb3JpdHkoJ0VYUE9SVF9PVEhFUicsIDYpOworICBzdGF0aWMgY29uc3QgRVhQT1JUX1JFTCA9IF9EaXJlY3RpdmVQcmlvcml0eSgnRVhQT1JUX1JFTCcsIDcpOworICBzdGF0aWMgY29uc3QgUEFSVCA9IF9EaXJlY3RpdmVQcmlvcml0eSgnUEFSVCcsIDgpOworCisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBpbnQgb3JkaW5hbDsKKworICBjb25zdCBfRGlyZWN0aXZlUHJpb3JpdHkodGhpcy5uYW1lLCB0aGlzLm9yZGluYWwpOworCisgIEBvdmVycmlkZQorICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOworfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL2xpbnRlci9saW50X25hbWVzLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvbGludGVyL2xpbnRfbmFtZXMuZGFydAppbmRleCA4MDRiNmI1Li40YjI4ODNmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvbGludGVyL2xpbnRfbmFtZXMuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvbGludGVyL2xpbnRfbmFtZXMuZGFydApAQCAtNTksNiArNTksNyBAQAogICBzdGF0aWMgY29uc3QgU3RyaW5nIHByZWZlcl9leHByZXNzaW9uX2Z1bmN0aW9uX2JvZGllcyA9CiAgICAgICAncHJlZmVyX2V4cHJlc3Npb25fZnVuY3Rpb25fYm9kaWVzJzsKICAgc3RhdGljIGNvbnN0IFN0cmluZyBwcmVmZXJfZmluYWxfZmllbGRzID0gJ3ByZWZlcl9maW5hbF9maWVsZHMnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIHByZWZlcl9maW5hbF9pbl9mb3JfZWFjaCA9ICdwcmVmZXJfZmluYWxfaW5fZm9yX2VhY2gnOwogICBzdGF0aWMgY29uc3QgU3RyaW5nIHByZWZlcl9maW5hbF9sb2NhbHMgPSAncHJlZmVyX2ZpbmFsX2xvY2Fscyc7CiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgcHJlZmVyX2Zvcl9lbGVtZW50c190b19tYXBfZnJvbUl0ZXJhYmxlID0KICAgICAgICdwcmVmZXJfZm9yX2VsZW1lbnRzX3RvX21hcF9mcm9tSXRlcmFibGUnOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3NlcnZpY2VzL3JlZmFjdG9yaW5nL2V4dHJhY3RfbWV0aG9kLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvcmVmYWN0b3JpbmcvZXh0cmFjdF9tZXRob2QuZGFydAppbmRleCA4YWE0YTc4Li43NWE1MjZiIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvcmVmYWN0b3JpbmcvZXh0cmFjdF9tZXRob2QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc2VydmljZXMvcmVmYWN0b3JpbmcvZXh0cmFjdF9tZXRob2QuZGFydApAQCAtMjYsOCArMjYsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uX2hlbHBlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvdXRpbGl0aWVzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2V4aXRfZGV0ZWN0b3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9qYXZhX2NvcmUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IEV4aXREZXRlY3RvcjsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vdXRpbGl0aWVzL3JhbmdlX2ZhY3RvcnkuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zdGF0dXMvZGlhZ25vc3RpY3MuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvbGliL3NyYy9zdGF0dXMvZGlhZ25vc3RpY3MuZGFydAppbmRleCBlMGMyMGJiLi4zODQ3MGFjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvc3RhdHVzL2RpYWdub3N0aWNzLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci9saWIvc3JjL3N0YXR1cy9kaWFnbm9zdGljcy5kYXJ0CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgIHZhciBzaG9ydE5hbWUgPSBwYXRoQ29udGV4dC5iYXNlbmFtZShjb21wbGV0aW9uLnBhdGgpOwogICAgICAgYnVmLndyaXRlbG4oJzx0cj4nCiAgICAgICAgICAgJzx0ZCBjbGFzcz0icHJlIHJpZ2h0Ij4ke3ByaW50TWlsbGlzZWNvbmRzKGNvbXBsZXRpb24uZWxhcHNlZEluTWlsbGlzZWNvbmRzKX08L3RkPicKLSAgICAgICAgICAnPHRkIGNsYXNzPSJyaWdodCI+JHtjb21wbGV0aW9uLnN1Z2dlc3Rpb25Db3VudH08L3RkPicKKyAgICAgICAgICAnPHRkIGNsYXNzPSJyaWdodCI+JHtjb21wbGV0aW9uLnN1Z2dlc3Rpb25Db3VudFN0cn08L3RkPicKICAgICAgICAgICAnPHRkPiR7ZXNjYXBlKHNob3J0TmFtZSl9PC90ZD4nCiAgICAgICAgICAgJzx0ZD48Y29kZT4ke2VzY2FwZShjb21wbGV0aW9uLnNuaXBwZXQpfTwvY29kZT48L3RkPicKICAgICAgICAgICAnPC90cj4nKTsKQEAgLTUxNiwxMCArNTE2LDYgQEAKICAgICBpZiAoc2RrT3B0aW9ucyAhPSBudWxsKSB7CiAgICAgICBoMygnU0RLIGFuYWx5c2lzIG9wdGlvbnMnKTsKICAgICAgIHAoZGVzY3JpYmUoc2RrT3B0aW9ucyksIHJhdzogdHJ1ZSk7Ci0KLSAgICAgIGlmIChzZGsgaXMgRm9sZGVyQmFzZWREYXJ0U2RrKSB7Ci0gICAgICAgIHAod3JpdGVPcHRpb24oJ1VzZSBzdW1tYXJpZXMnLCBzZGsudXNlU3VtbWFyeSksIHJhdzogdHJ1ZSk7Ci0gICAgICB9CiAgICAgfQogCiAgICAgYnVmLndyaXRlbG4oJzwvZGl2PicpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2FuYWx5c2lzX2Fic3RyYWN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvYW5hbHlzaXNfYWJzdHJhY3QuZGFydAppbmRleCBmNzQwYWExLi42NjAzMzcyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvYW5hbHlzaXNfYWJzdHJhY3QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvYW5hbHlzaXNfYWJzdHJhY3QuZGFydApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICAgIHNlcnZlckNoYW5uZWwsCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIsCiAgICAgICAgIG9wdGlvbnMsCi0gICAgICAgIERhcnRTZGtNYW5hZ2VyKHJlc291cmNlUHJvdmlkZXIuY29udmVydFBhdGgoJy9zZGsnKSwgdHJ1ZSksCisgICAgICAgIERhcnRTZGtNYW5hZ2VyKHJlc291cmNlUHJvdmlkZXIuY29udmVydFBhdGgoJy9zZGsnKSksCiAgICAgICAgIENyYXNoUmVwb3J0aW5nQXR0YWNobWVudHNCdWlsZGVyLmVtcHR5LAogICAgICAgICBJbnN0cnVtZW50YXRpb25TZXJ2aWNlLk5VTExfU0VSVklDRSk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9hbmFseXNpc19zZXJ2ZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2FuYWx5c2lzX3NlcnZlcl90ZXN0LmRhcnQKaW5kZXggNjRhMGZhZS4uZTBiZDNkNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2FuYWx5c2lzX3NlcnZlcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2FuYWx5c2lzX3NlcnZlcl90ZXN0LmRhcnQKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgY2hhbm5lbCwKICAgICAgICAgcmVzb3VyY2VQcm92aWRlciwKICAgICAgICAgQW5hbHlzaXNTZXJ2ZXJPcHRpb25zKCksCi0gICAgICAgIERhcnRTZGtNYW5hZ2VyKGNvbnZlcnRQYXRoKCcvc2RrJyksIGZhbHNlKSwKKyAgICAgICAgRGFydFNka01hbmFnZXIoY29udmVydFBhdGgoJy9zZGsnKSksCiAgICAgICAgIENyYXNoUmVwb3J0aW5nQXR0YWNobWVudHNCdWlsZGVyLmVtcHR5LAogICAgICAgICBJbnN0cnVtZW50YXRpb25TZXJ2aWNlLk5VTExfU0VSVklDRSk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9jbGllbnQvaW1wbC9hYnN0cmFjdF9jbGllbnQuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9jbGllbnQvaW1wbC9hYnN0cmFjdF9jbGllbnQuZGFydAppbmRleCAwYzgyZTUwLi5mNWVhMjQyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvY2xpZW50L2ltcGwvYWJzdHJhY3RfY2xpZW50LmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2NsaWVudC9pbXBsL2Fic3RyYWN0X2NsaWVudC5kYXJ0CkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAgICAgc2VydmVyQ2hhbm5lbCwKICAgICAgICAgcmVzb3VyY2VQcm92aWRlciwKICAgICAgICAgc2VydmVyT3B0aW9ucywKLSAgICAgICAgRGFydFNka01hbmFnZXIoc2RrUGF0aCwgdHJ1ZSksCisgICAgICAgIERhcnRTZGtNYW5hZ2VyKHNka1BhdGgpLAogICAgICAgICBDcmFzaFJlcG9ydGluZ0F0dGFjaG1lbnRzQnVpbGRlci5lbXB0eSwKICAgICAgICAgSW5zdHJ1bWVudGF0aW9uU2VydmljZS5OVUxMX1NFUlZJQ0UpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvY29udGV4dF9tYW5hZ2VyX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9jb250ZXh0X21hbmFnZXJfdGVzdC5kYXJ0CmluZGV4IGI4ZTRhOTkuLjUxZTgxM2YgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9jb250ZXh0X21hbmFnZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9jb250ZXh0X21hbmFnZXJfdGVzdC5kYXJ0CkBAIC0xNTkxLDcgKzE1OTEsNyBAQAogICAgIHJlc291cmNlUHJvdmlkZXIubmV3Rm9sZGVyKHByb2pQYXRoKTsKICAgICAvLyBDcmVhdGUgYW4gU0RLIGluIHRoZSBtb2NrIGZpbGUgc3lzdGVtLgogICAgIE1vY2tTZGsocmVzb3VyY2VQcm92aWRlcjogcmVzb3VyY2VQcm92aWRlcik7Ci0gICAgdmFyIHNka01hbmFnZXIgPSBEYXJ0U2RrTWFuYWdlcihjb252ZXJ0UGF0aCgnL3NkaycpLCB0cnVlKTsKKyAgICB2YXIgc2RrTWFuYWdlciA9IERhcnRTZGtNYW5hZ2VyKGNvbnZlcnRQYXRoKCcvc2RrJykpOwogICAgIG1hbmFnZXIgPSBDb250ZXh0TWFuYWdlckltcGwoCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIsCiAgICAgICAgIHNka01hbmFnZXIsCkBAIC0yMjkwLDcgKzIyOTAsNyBAQAogICAgIGV4cGVjdChjb250ZXh0Um9vdC5yb290LCBwYXRoKTsKICAgICBjdXJyZW50Q29udGV4dFRpbWVzdGFtcHNbcGF0aF0gPSBub3c7CiAKLSAgICB2YXIgYnVpbGRlciA9IGNyZWF0ZUNvbnRleHRCdWlsZGVyKGZvbGRlciwgb3B0aW9ucywgdXNlU3VtbWFyaWVzOiB0cnVlKTsKKyAgICB2YXIgYnVpbGRlciA9IGNyZWF0ZUNvbnRleHRCdWlsZGVyKGZvbGRlciwgb3B0aW9ucyk7CiAgICAgYnVpbGRlci5hbmFseXNpc0RyaXZlclNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICBidWlsZGVyLmJ5dGVTdG9yZSA9IE1lbW9yeUJ5dGVTdG9yZSgpOwogICAgIGJ1aWxkZXIucGVyZm9ybWFuY2VMb2cgPSBsb2dnZXI7CkBAIC0yMzQ3LDggKzIzNDcsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIENvbnRleHRCdWlsZGVyIGNyZWF0ZUNvbnRleHRCdWlsZGVyKEZvbGRlciBmb2xkZXIsIEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zLAotICAgICAge2Jvb2wgdXNlU3VtbWFyaWVzID0gZmFsc2V9KSB7CisgIENvbnRleHRCdWlsZGVyIGNyZWF0ZUNvbnRleHRCdWlsZGVyKEZvbGRlciBmb2xkZXIsIEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zKSB7CiAgICAgdmFyIGJ1aWxkZXJPcHRpb25zID0gQ29udGV4dEJ1aWxkZXJPcHRpb25zKCk7CiAgICAgYnVpbGRlck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zOwogICAgIHZhciBidWlsZGVyID0gQ29udGV4dEJ1aWxkZXIocmVzb3VyY2VQcm92aWRlciwgc2RrTWFuYWdlciwgbnVsbCwKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9kb21haW5fYW5hbHlzaXNfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2RvbWFpbl9hbmFseXNpc190ZXN0LmRhcnQKaW5kZXggMGQ5Yzc5MC4uNDViNTdiMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2RvbWFpbl9hbmFseXNpc190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2RvbWFpbl9hbmFseXNpc190ZXN0LmRhcnQKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgICAgICBzZXJ2ZXJDaGFubmVsLAogICAgICAgICByZXNvdXJjZVByb3ZpZGVyLAogICAgICAgICBBbmFseXNpc1NlcnZlck9wdGlvbnMoKSwKLSAgICAgICAgRGFydFNka01hbmFnZXIoY29udmVydFBhdGgoJy9zZGsnKSwgZmFsc2UpLAorICAgICAgICBEYXJ0U2RrTWFuYWdlcihjb252ZXJ0UGF0aCgnL3NkaycpKSwKICAgICAgICAgQ3Jhc2hSZXBvcnRpbmdBdHRhY2htZW50c0J1aWxkZXIuZW1wdHksCiAgICAgICAgIEluc3RydW1lbnRhdGlvblNlcnZpY2UuTlVMTF9TRVJWSUNFKTsKICAgICBoYW5kbGVyID0gQW5hbHlzaXNEb21haW5IYW5kbGVyKHNlcnZlcik7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvZG9tYWluX2V4ZWN1dGlvbl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvZG9tYWluX2V4ZWN1dGlvbl90ZXN0LmRhcnQKaW5kZXggODUzMjIyMC4uNzJiN2I1YiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2RvbWFpbl9leGVjdXRpb25fdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9kb21haW5fZXhlY3V0aW9uX3Rlc3QuZGFydApAQCAtMzEsNyArMzEsNyBAQAogICAgICAgICAgIE1vY2tTZXJ2ZXJDaGFubmVsKCksCiAgICAgICAgICAgcHJvdmlkZXIsCiAgICAgICAgICAgQW5hbHlzaXNTZXJ2ZXJPcHRpb25zKCksCi0gICAgICAgICAgRGFydFNka01hbmFnZXIoJycsIGZhbHNlKSwKKyAgICAgICAgICBEYXJ0U2RrTWFuYWdlcignJyksCiAgICAgICAgICAgQ3Jhc2hSZXBvcnRpbmdBdHRhY2htZW50c0J1aWxkZXIuZW1wdHksCiAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uU2VydmljZS5OVUxMX1NFUlZJQ0UpOwogICAgICAgaGFuZGxlciA9IEV4ZWN1dGlvbkRvbWFpbkhhbmRsZXIoc2VydmVyKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9kb21haW5fc2VydmVyX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9kb21haW5fc2VydmVyX3Rlc3QuZGFydAppbmRleCBjYjczZWQzLi4xYWM5NGNjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvZG9tYWluX3NlcnZlcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2RvbWFpbl9zZXJ2ZXJfdGVzdC5kYXJ0CkBAIC0yOSw3ICsyOSw3IEBACiAgICAgICAgIHNlcnZlckNoYW5uZWwsCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIsCiAgICAgICAgIEFuYWx5c2lzU2VydmVyT3B0aW9ucygpLAotICAgICAgICBEYXJ0U2RrTWFuYWdlcignJywgZmFsc2UpLAorICAgICAgICBEYXJ0U2RrTWFuYWdlcignJyksCiAgICAgICAgIENyYXNoUmVwb3J0aW5nQXR0YWNobWVudHNCdWlsZGVyLmVtcHR5LAogICAgICAgICBJbnN0cnVtZW50YXRpb25TZXJ2aWNlLk5VTExfU0VSVklDRSk7CiAgICAgaGFuZGxlciA9IFNlcnZlckRvbWFpbkhhbmRsZXIoc2VydmVyKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9sc3AvY29kZV9hY3Rpb25zX2ZpeGVzX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9sc3AvY29kZV9hY3Rpb25zX2ZpeGVzX3Rlc3QuZGFydAppbmRleCAzYzFkNzNiLi5hYzRhNTc1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvbHNwL2NvZGVfYWN0aW9uc19maXhlc190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2xzcC9jb2RlX2FjdGlvbnNfZml4ZXNfdGVzdC5kYXJ0CkBAIC0zLDYgKzMsNyBAQAogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9sc3BfcHJvdG9jb2wvcHJvdG9jb2xfZ2VuZXJhdGVkLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmxpbnRlci9zcmMvcnVsZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApAQCAtMTQ2LDQgKzE0Nyw1MiBAQAogICAgICAgICBhd2FpdCBnZXRDb2RlQWN0aW9ucyhwdWJzcGVjRmlsZVVyaS50b1N0cmluZygpLCByYW5nZTogc3RhcnRPZkRvY1JhbmdlKTsKICAgICBleHBlY3QoY29kZUFjdGlvbnMsIGlzRW1wdHkpOwogICB9CisKKyAgRnV0dXJlPHZvaWQ+IHRlc3Rfb3JnYW5pemVJbXBvcnRzRml4X25hbWVkT3JnYW5pemVJbXBvcnRzKCkgYXN5bmMgeworICAgIHJlZ2lzdGVyTGludFJ1bGVzKCk7CisgICAgbmV3RmlsZShhbmFseXNpc09wdGlvbnNQYXRoLCBjb250ZW50OiAnJycKK2xpbnRlcjoKKyAgcnVsZXM6CisgICAgLSBkaXJlY3RpdmVzX29yZGVyaW5nCisgICAgJycnKTsKKworICAgIC8vIFRoaXMgY29kZSBzaG91bGQgZ2V0IGEgZml4IHRvIHNvcnQgdGhlIGltcG9ydHMuCisgICAgY29uc3QgY29udGVudCA9ICcnJworaW1wb3J0ICdkYXJ0OmlvJzsKK1tbaW1wb3J0ICdkYXJ0OmFzeW5jJ11dOworCitDb21wbGV0ZXIgYTsKK1Byb2Nlc3NJbmZvIGI7CisgICAgJycnOworCisgICAgY29uc3QgZXhwZWN0ZWRDb250ZW50ID0gJycnCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworQ29tcGxldGVyIGE7CitQcm9jZXNzSW5mbyBiOworICAgICcnJzsKKyAgICBhd2FpdCBuZXdGaWxlKG1haW5GaWxlUGF0aCwgY29udGVudDogd2l0aG91dE1hcmtlcnMoY29udGVudCkpOworICAgIGF3YWl0IGluaXRpYWxpemUoCisgICAgICB0ZXh0RG9jdW1lbnRDYXBhYmlsaXRpZXM6IHdpdGhDb2RlQWN0aW9uS2luZHMoCisgICAgICAgICAgZW1wdHlUZXh0RG9jdW1lbnRDbGllbnRDYXBhYmlsaXRpZXMsIFtDb2RlQWN0aW9uS2luZC5RdWlja0ZpeF0pLAorICAgICk7CisKKyAgICBmaW5hbCBjb2RlQWN0aW9ucyA9IGF3YWl0IGdldENvZGVBY3Rpb25zKG1haW5GaWxlVXJpLnRvU3RyaW5nKCksCisgICAgICAgIHJhbmdlOiByYW5nZUZyb21NYXJrZXJzKGNvbnRlbnQpKTsKKyAgICBmaW5hbCBmaXhBY3Rpb24gPSBmaW5kRWRpdEFjdGlvbihjb2RlQWN0aW9ucywKKyAgICAgICAgQ29kZUFjdGlvbktpbmQoJ3F1aWNrZml4Lm9yZ2FuaXplLmltcG9ydHMnKSwgJ09yZ2FuaXplIEltcG9ydHMnKTsKKworICAgIC8vIEVuc3VyZSB0aGUgZWRpdCBjYW1lIGJhY2ssIGFuZCB1c2luZyBjaGFuZ2VzLgorICAgIGV4cGVjdChmaXhBY3Rpb24sIGlzTm90TnVsbCk7CisgICAgZXhwZWN0KGZpeEFjdGlvbi5lZGl0LmNoYW5nZXMsIGlzTm90TnVsbCk7CisgICAgZXhwZWN0KGZpeEFjdGlvbi5lZGl0LmRvY3VtZW50Q2hhbmdlcywgaXNOdWxsKTsKKworICAgIC8vIEVuc3VyZSBhcHBseWluZyB0aGUgY2hhbmdlcyB3aWxsIGdpdmUgdXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQuCisgICAgZmluYWwgY29udGVudHMgPSB7CisgICAgICBtYWluRmlsZVBhdGg6IHdpdGhvdXRNYXJrZXJzKGNvbnRlbnQpLAorICAgIH07CisgICAgYXBwbHlDaGFuZ2VzKGNvbnRlbnRzLCBmaXhBY3Rpb24uZWRpdC5jaGFuZ2VzKTsKKyAgICBleHBlY3QoY29udGVudHNbbWFpbkZpbGVQYXRoXSwgZXF1YWxzKGV4cGVjdGVkQ29udGVudCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvbHNwL3JlbmFtZV90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvbHNwL3JlbmFtZV90ZXN0LmRhcnQKaW5kZXggNTRhNGY0NS4uNWMxMTI3YiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2xzcC9yZW5hbWVfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9sc3AvcmVuYW1lX3Rlc3QuZGFydApAQCAtMjQ4LDYgKzI0OCwxNiBAQAogICAgIGV4cGVjdChlcnJvci5tZXNzYWdlLCBjb250YWlucygnYWxyZWFkeSBkZWNsYXJlcyBjbGFzcyB3aXRoIG5hbWUnKSk7CiAgIH0KIAorICBGdXR1cmU8dm9pZD4gdGVzdF9yZW5hbWVfcmVqZWN0ZWRGb3JTYW1lTmFtZSgpIGFzeW5jIHsKKyAgICBjb25zdCBjb250ZW50ID0gJycnCisgICAgY2xhc3MgTXleQ2xhc3Mge30KKyAgICAnJyc7CisgICAgZmluYWwgZXJyb3IgPSBhd2FpdCBfdGVzdF9yZW5hbWVfZmFpbHVyZShjb250ZW50LCAnTXlDbGFzcycpOworICAgIGV4cGVjdChlcnJvci5jb2RlLCBlcXVhbHMoU2VydmVyRXJyb3JDb2Rlcy5SZW5hbWVOb3RWYWxpZCkpOworICAgIGV4cGVjdChlcnJvci5tZXNzYWdlLAorICAgICAgICBjb250YWlucygnbmV3IG5hbWUgbXVzdCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBuYW1lJykpOworICB9CisKICAgRnV0dXJlPHZvaWQ+IHRlc3RfcmVuYW1lX3JlamVjdGVkRm9yU3RhbGVEb2N1bWVudCgpIGFzeW5jIHsKICAgICBjb25zdCBjb250ZW50ID0gJycnCiAgICAgY2xhc3MgTXlDbGFzcyB7fQpAQCAtMjU5LDYgKzI2OSwyMiBAQAogICAgIGV4cGVjdChlcnJvci5tZXNzYWdlLCBjb250YWlucygnRG9jdW1lbnQgd2FzIG1vZGlmaWVkJykpOwogICB9CiAKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfcmVuYW1lX3JlamVjdGlvbnNEb05vdENyYXNoU2VydmVyKCkgYXN5bmMgeworICAgIC8vIENoZWNrcyB0aGF0IGEgcmVuYW1lIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGUgc2VydmVyIGZyb20gcmVzcG9uZGluZworICAgIC8vIGFzIHdhcyBwcmV2aW91c2x5IHRoZSBjYXNlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy80MjU3MworICAgIC8vIGJlY2F1c2UgdGhlIGVycm9yIGNvZGUgd2FzIGR1cGxpY2F0ZWQvcmV1c2VkIGZvciBDbGllbnRTZXJ2ZXJJbmNvbnNpc3RlbnRTdGF0ZS4KKyAgICBjb25zdCBjb250ZW50ID0gJycnCisgICAgLy8vIFRlc3QgQ2xhc3MKKyAgICBjbGFzcyBNeV5DbGFzcyB7fQorICAgICcnJzsKKyAgICBmaW5hbCBlcnJvciA9IGF3YWl0IF90ZXN0X3JlbmFtZV9mYWlsdXJlKGNvbnRlbnQsICdNeUNsYXNzJyk7CisgICAgZXhwZWN0KGVycm9yLmNvZGUsIGlzTm90TnVsbCk7CisKKyAgICAvLyBTZW5kIGFueSBvdGhlciByZXF1ZXN0IHRvIGVuc3VyZSB0aGUgc2VydmVyIGlzIHN0aWxsIHJlc3BvbnNpdmUuCisgICAgZmluYWwgaG92ZXIgPSBhd2FpdCBnZXRIb3ZlcihtYWluRmlsZVVyaSwgcG9zaXRpb25Gcm9tTWFya2VyKGNvbnRlbnQpKTsKKyAgICBleHBlY3QoaG92ZXI/LmNvbnRlbnRzLCBpc05vdE51bGwpOworICB9CisKICAgRnV0dXJlPHZvaWQ+IHRlc3RfcmVuYW1lX3Nka0NsYXNzKCkgYXN5bmMgewogICAgIGNvbnN0IGNvbnRlbnQgPSAnJycKICAgICBmaW5hbCBhID0gbmV3IFtbT2JeamVjdF1dKCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvbHNwL3NlcnZlcl9hYnN0cmFjdC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L2xzcC9zZXJ2ZXJfYWJzdHJhY3QuZGFydAppbmRleCBiYmYzY2ExLi5hMDBhNDRlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3QvbHNwL3NlcnZlcl9hYnN0cmFjdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9sc3Avc2VydmVyX2Fic3RyYWN0LmRhcnQKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAgICBjaGFubmVsLAogICAgICAgICByZXNvdXJjZVByb3ZpZGVyLAogICAgICAgICBBbmFseXNpc1NlcnZlck9wdGlvbnMoKSwKLSAgICAgICAgRGFydFNka01hbmFnZXIoY29udmVydFBhdGgoJy9zZGsnKSwgZmFsc2UpLAorICAgICAgICBEYXJ0U2RrTWFuYWdlcihjb252ZXJ0UGF0aCgnL3NkaycpKSwKICAgICAgICAgQ3Jhc2hSZXBvcnRpbmdBdHRhY2htZW50c0J1aWxkZXIuZW1wdHksCiAgICAgICAgIEluc3RydW1lbnRhdGlvblNlcnZpY2UuTlVMTF9TRVJWSUNFKTsKICAgICBzZXJ2ZXIucGx1Z2luTWFuYWdlciA9IHBsdWdpbk1hbmFnZXI7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fY29udHJpYnV0b3JfdXRpbC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9jb21wbGV0aW9uX2NvbnRyaWJ1dG9yX3V0aWwuZGFydAppbmRleCBjZGIyYzczLi4yMjQyMTcxIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fY29udHJpYnV0b3JfdXRpbC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvY29tcGxldGlvbl9jb250cmlidXRvcl91dGlsLmRhcnQKQEAgLTYwNywxNyArNjA3LDIxIEBACiAgICAgdmFyIGJhc2VSZXF1ZXN0ID0gQ29tcGxldGlvblJlcXVlc3RJbXBsKHJlc29sdmVSZXN1bHQsIGNvbXBsZXRpb25PZmZzZXQsCiAgICAgICAgIHVzZU5ld1JlbGV2YW5jZSwgQ29tcGxldGlvblBlcmZvcm1hbmNlKCkpOwogCi0gICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKLSAgICB2YXIgcmVxdWVzdCA9Ci0gICAgICAgIGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbShiYXNlUmVxdWVzdCwgZGFydGRvY0luZm8pOworICAgIHJldHVybiBhd2FpdCBiYXNlUmVxdWVzdC5wZXJmb3JtYW5jZS5ydW5SZXF1ZXN0T3BlcmF0aW9uKAorICAgICAgKHBlcmZvcm1hbmNlKSBhc3luYyB7CisgICAgICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0CisgICAgICAgIHZhciByZXF1ZXN0ID0gYXdhaXQgRGFydENvbXBsZXRpb25SZXF1ZXN0SW1wbC5mcm9tKAorICAgICAgICAgICAgcGVyZm9ybWFuY2UsIGJhc2VSZXF1ZXN0LCBkYXJ0ZG9jSW5mbyk7CiAKLSAgICB2YXIgcmFuZ2UgPSByZXF1ZXN0LnRhcmdldC5jb21wdXRlUmVwbGFjZW1lbnRSYW5nZShyZXF1ZXN0Lm9mZnNldCk7Ci0gICAgcmVwbGFjZW1lbnRPZmZzZXQgPSByYW5nZS5vZmZzZXQ7Ci0gICAgcmVwbGFjZW1lbnRMZW5ndGggPSByYW5nZS5sZW5ndGg7CisgICAgICAgIHZhciByYW5nZSA9IHJlcXVlc3QudGFyZ2V0LmNvbXB1dGVSZXBsYWNlbWVudFJhbmdlKHJlcXVlc3Qub2Zmc2V0KTsKKyAgICAgICAgcmVwbGFjZW1lbnRPZmZzZXQgPSByYW5nZS5vZmZzZXQ7CisgICAgICAgIHJlcGxhY2VtZW50TGVuZ3RoID0gcmFuZ2UubGVuZ3RoOwogCi0gICAgLy8gUmVxdWVzdCBjb21wbGV0aW9ucwotICAgIHN1Z2dlc3Rpb25zID0gYXdhaXQgY29tcHV0ZUNvbnRyaWJ1dGVkU3VnZ2VzdGlvbnMocmVxdWVzdCk7Ci0gICAgZXhwZWN0KHN1Z2dlc3Rpb25zLCBpc05vdE51bGwsIHJlYXNvbjogJ2V4cGVjdGVkIHN1Z2dlc3Rpb25zJyk7CisgICAgICAgIC8vIFJlcXVlc3QgY29tcGxldGlvbnMKKyAgICAgICAgc3VnZ2VzdGlvbnMgPSBhd2FpdCBjb21wdXRlQ29udHJpYnV0ZWRTdWdnZXN0aW9ucyhyZXF1ZXN0KTsKKyAgICAgICAgZXhwZWN0KHN1Z2dlc3Rpb25zLCBpc05vdE51bGwsIHJlYXNvbjogJ2V4cGVjdGVkIHN1Z2dlc3Rpb25zJyk7CisgICAgICB9LAorICAgICk7CiAgIH0KIAogICB2b2lkIGZhaWxlZENvbXBsZXRpb24oU3RyaW5nIG1lc3NhZ2UsCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fbWFuYWdlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2NvbXBsZXRpb25fbWFuYWdlcl90ZXN0LmRhcnQKaW5kZXggZWQ3NzZmNS4uYzc3ZTdjZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9jb21wbGV0aW9uX21hbmFnZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvY29tcGxldGlvbl9tYW5hZ2VyX3Rlc3QuZGFydApAQCAtNTEsMTIgKzUxLDE1IEBACiAgICAgICAgIGNvbXBsZXRpb25PZmZzZXQsCiAgICAgICAgIGZhbHNlLAogICAgICAgICBDb21wbGV0aW9uUGVyZm9ybWFuY2UoKSk7Ci0gICAgdmFyIHJlcXVlc3RDb21wbGV0ZXIgPSBDb21wbGV0ZXI8RGFydENvbXBsZXRpb25SZXF1ZXN0PigpOwotICAgIERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbShiYXNlUmVxdWVzdCwgRGFydGRvY0RpcmVjdGl2ZUluZm8oKSkKLSAgICAgICAgLnRoZW4oKERhcnRDb21wbGV0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICByZXF1ZXN0Q29tcGxldGVyLmNvbXBsZXRlKHJlcXVlc3QpOworICAgIGF3YWl0IGJhc2VSZXF1ZXN0LnBlcmZvcm1hbmNlLnJ1blJlcXVlc3RPcGVyYXRpb24oKHBlcmZvcm1hbmNlKSBhc3luYyB7CisgICAgICB2YXIgcmVxdWVzdENvbXBsZXRlciA9IENvbXBsZXRlcjxEYXJ0Q29tcGxldGlvblJlcXVlc3Q+KCk7CisgICAgICBEYXJ0Q29tcGxldGlvblJlcXVlc3RJbXBsLmZyb20oCisgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLCBiYXNlUmVxdWVzdCwgRGFydGRvY0RpcmVjdGl2ZUluZm8oKSkKKyAgICAgICAgICAudGhlbigoRGFydENvbXBsZXRpb25SZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmVxdWVzdENvbXBsZXRlci5jb21wbGV0ZShyZXF1ZXN0KTsKKyAgICAgIH0pOworICAgICAgcmVxdWVzdCA9IGF3YWl0IHBlcmZvcm1BbmFseXNpcygyMDAsIHJlcXVlc3RDb21wbGV0ZXIpOwogICAgIH0pOwotICAgIHJlcXVlc3QgPSBhd2FpdCBwZXJmb3JtQW5hbHlzaXMoMjAwLCByZXF1ZXN0Q29tcGxldGVyKTsKIAogICAgIHZhciBkaXJlY3RpdmVzID0gcmVxdWVzdC50YXJnZXQudW5pdC5kaXJlY3RpdmVzOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2xvY2FsX3JlZmVyZW5jZV9jb250cmlidXRvcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L2xvY2FsX3JlZmVyZW5jZV9jb250cmlidXRvcl90ZXN0LmRhcnQKaW5kZXggYjU2YzEwYy4uNDc1ZjZlNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9sb2NhbF9yZWZlcmVuY2VfY29udHJpYnV0b3JfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvbG9jYWxfcmVmZXJlbmNlX2NvbnRyaWJ1dG9yX3Rlc3QuZGFydApAQCAtMjk5NSw2ICsyOTk1LDMyIEBACiAgICAgYXNzZXJ0Tm90U3VnZ2VzdGVkKCdTdHJpbmcnKTsKICAgfQogCisgIEBmYWlsaW5nVGVzdAorICBGdXR1cmU8dm9pZD4gdGVzdF9Gb3JFYWNoU3RhdGVtZW50X3N0YXRlbWVudF90eXBlZCgpIGFzeW5jIHsKKyAgICAvLyBTdGF0ZW1lbnQgIEZvckVhY2hTdGF0ZW1lbnQKKyAgICBhZGRUZXN0U291cmNlKCdtYWluKGFyZ3MpIHtmb3IgKGludCBmb28gaW4gYmFyKSBefScpOworICAgIGF3YWl0IGNvbXB1dGVTdWdnZXN0aW9ucygpOworCisgICAgZXhwZWN0KHJlcGxhY2VtZW50T2Zmc2V0LCBjb21wbGV0aW9uT2Zmc2V0KTsKKyAgICBleHBlY3QocmVwbGFjZW1lbnRMZW5ndGgsIDApOworICAgIGFzc2VydFN1Z2dlc3RQYXJhbWV0ZXIoJ2FyZ3MnLCBudWxsKTsKKyAgICBhc3NlcnRTdWdnZXN0TG9jYWxWYXJpYWJsZSgnZm9vJywgJ2ludCcpOworICAgIGFzc2VydE5vdFN1Z2dlc3RlZCgnT2JqZWN0Jyk7CisgIH0KKworICBAZmFpbGluZ1Rlc3QKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfRm9yRWFjaFN0YXRlbWVudF9zdGF0ZW1lbnRfdW50eXBlZCgpIGFzeW5jIHsKKyAgICAvLyBTdGF0ZW1lbnQgIEZvckVhY2hTdGF0ZW1lbnQKKyAgICBhZGRUZXN0U291cmNlKCdtYWluKGFyZ3MpIHtmb3IgKHZhciBmb28gaW4gYmFyKSBefScpOworICAgIGF3YWl0IGNvbXB1dGVTdWdnZXN0aW9ucygpOworCisgICAgZXhwZWN0KHJlcGxhY2VtZW50T2Zmc2V0LCBjb21wbGV0aW9uT2Zmc2V0KTsKKyAgICBleHBlY3QocmVwbGFjZW1lbnRMZW5ndGgsIDApOworICAgIGFzc2VydFN1Z2dlc3RQYXJhbWV0ZXIoJ2FyZ3MnLCBudWxsKTsKKyAgICBhc3NlcnRTdWdnZXN0TG9jYWxWYXJpYWJsZSgnZm9vJywgbnVsbCk7CisgICAgYXNzZXJ0Tm90U3VnZ2VzdGVkKCdPYmplY3QnKTsKKyAgfQorCiAgIEZ1dHVyZTx2b2lkPiB0ZXN0X0Zvcm1hbFBhcmFtZXRlckxpc3QoKSBhc3luYyB7CiAgICAgLy8gRm9ybWFsUGFyYW1ldGVyTGlzdCBNZXRob2REZWNsYXJhdGlvbgogICAgIGFkZFRlc3RTb3VyY2UoJycnCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L3JlbGV2YW5jZS9sb2NhbF92YXJpYWJsZV9yZWxldmFuY2VfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9yZWxldmFuY2UvbG9jYWxfdmFyaWFibGVfcmVsZXZhbmNlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjJhOWRiCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9yZWxldmFuY2UvbG9jYWxfdmFyaWFibGVfcmVsZXZhbmNlX3Rlc3QuZGFydApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi9wcm90b2NvbC9wcm90b2NvbF9jb21tb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdF9yZWZsZWN0aXZlX2xvYWRlci90ZXN0X3JlZmxlY3RpdmVfbG9hZGVyLmRhcnQnOworCitpbXBvcnQgJ2NvbXBsZXRpb25fcmVsZXZhbmNlLmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGRlZmluZVJlZmxlY3RpdmVTdWl0ZSgoKSB7CisgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKExvY2FsVmFyaWFibGVSZWxldmFuY2VUZXN0KTsKKyAgfSk7Cit9CisKK0ByZWZsZWN0aXZlVGVzdAorY2xhc3MgTG9jYWxWYXJpYWJsZVJlbGV2YW5jZVRlc3QgZXh0ZW5kcyBDb21wbGV0aW9uUmVsZXZhbmNlVGVzdCB7CisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2xvY2FsVmFyaWFibGVzKCkgYXN5bmMgeworICAgIGF3YWl0IGFkZFRlc3RGaWxlKCcnJworaW50IGYoKSB7CisgIHZhciBhID0gMDsKKyAgdmFyIGIgPSAxOworICB2YXIgYyA9IDI7CisgIHZhciBkID0gXjsKK30KKycnJyk7CisKKyAgICBhc3NlcnRPcmRlcihbCisgICAgICBzdWdnZXN0aW9uV2l0aCgKKyAgICAgICAgICBjb21wbGV0aW9uOiAnYycsCisgICAgICAgICAgZWxlbWVudDogRWxlbWVudEtpbmQuTE9DQUxfVkFSSUFCTEUsCisgICAgICAgICAga2luZDogQ29tcGxldGlvblN1Z2dlc3Rpb25LaW5kLklOVk9DQVRJT04pLAorICAgICAgc3VnZ2VzdGlvbldpdGgoCisgICAgICAgICAgY29tcGxldGlvbjogJ2InLAorICAgICAgICAgIGVsZW1lbnQ6IEVsZW1lbnRLaW5kLkxPQ0FMX1ZBUklBQkxFLAorICAgICAgICAgIGtpbmQ6IENvbXBsZXRpb25TdWdnZXN0aW9uS2luZC5JTlZPQ0FUSU9OKSwKKyAgICAgIHN1Z2dlc3Rpb25XaXRoKAorICAgICAgICAgIGNvbXBsZXRpb246ICdhJywKKyAgICAgICAgICBlbGVtZW50OiBFbGVtZW50S2luZC5MT0NBTF9WQVJJQUJMRSwKKyAgICAgICAgICBraW5kOiBDb21wbGV0aW9uU3VnZ2VzdGlvbktpbmQuSU5WT0NBVElPTiksCisgICAgXSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvcmVsZXZhbmNlL3Rlc3RfYWxsLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29tcGxldGlvbi9kYXJ0L3JlbGV2YW5jZS90ZXN0X2FsbC5kYXJ0CmluZGV4IDM3MmJhZmEuLmNmOGZlMDEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvcmVsZXZhbmNlL3Rlc3RfYWxsLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9yZWxldmFuY2UvdGVzdF9hbGwuZGFydApAQCAtNyw2ICs3LDcgQEAKIGltcG9ydCAnYm9vbF9hc3NpZ25tZW50X3JlbGV2YW5jZV90ZXN0LmRhcnQnIGFzIGJvb2xfYXNzaWdubWVudHM7CiBpbXBvcnQgJ2RlcHJlY2F0ZWRfbWVtYmVyX3JlbGV2YW5jZV90ZXN0LmRhcnQnIGFzIGRlcHJlY2F0ZWRfbWVtYmVyczsKIGltcG9ydCAnaW5zdGFuY2VfbWVtYmVyX3JlbGV2YW5jZV90ZXN0LmRhcnQnIGFzIGluc3RhbmNlX21lbWJlcl9yZWxldmFuY2U7CitpbXBvcnQgJ2xvY2FsX3ZhcmlhYmxlX3JlbGV2YW5jZV90ZXN0LmRhcnQnIGFzIGxvY2FsX3ZhcmlhYmxlX3JlbGV2YW5jZTsKIGltcG9ydCAnbmFtZWRfYXJndW1lbnRfcmVsZXZhbmNlX3Rlc3QuZGFydCcgYXMgbmFtZWRfYXJndW1lbnRfcmVsZXZhbmNlOwogaW1wb3J0ICdub25fdHlwZV9tZW1iZXJfcmVsZXZhbmNlX3Rlc3QuZGFydCcgYXMgbm9uX3R5cGVfbWVtYmVyX3JlbGV2YW5jZTsKIGltcG9ydCAnc3RhdGljX21lbWJlcl9yZWxldmFuY2VfdGVzdC5kYXJ0JyBhcyBzdGF0aWNfbWVtYmVyX3JlbGV2YW5jZTsKQEAgLTE2LDYgKzE3LDcgQEAKICAgICBib29sX2Fzc2lnbm1lbnRzLm1haW4oKTsKICAgICBkZXByZWNhdGVkX21lbWJlcnMubWFpbigpOwogICAgIGluc3RhbmNlX21lbWJlcl9yZWxldmFuY2UubWFpbigpOworICAgIGxvY2FsX3ZhcmlhYmxlX3JlbGV2YW5jZS5tYWluKCk7CiAgICAgbmFtZWRfYXJndW1lbnRfcmVsZXZhbmNlLm1haW4oKTsKICAgICBub25fdHlwZV9tZW1iZXJfcmVsZXZhbmNlLm1haW4oKTsKICAgICBzdGF0aWNfbWVtYmVyX3JlbGV2YW5jZS5tYWluKCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc2VydmljZXMvY29ycmVjdGlvbi9vcmdhbml6ZV9kaXJlY3RpdmVzX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2RpcmVjdGl2ZXNfdGVzdC5kYXJ0CmluZGV4IDc4MTc1ZDAuLjJjZmRlNDAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2RpcmVjdGl2ZXNfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2RpcmVjdGl2ZXNfdGVzdC5kYXJ0CkBAIC00LDcgKzQsNyBAQAogCiBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogCi1pbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2RpcmVjdGl2ZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmVyL3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL29yZ2FuaXplX2ltcG9ydHMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvZXJyb3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbW1vbi5kYXJ0JwogICAgIGhpZGUgQW5hbHlzaXNFcnJvcjsKQEAgLTMxNSw3ICszMTUsNyBAQAogICB9CiAKICAgdm9pZCBfYXNzZXJ0T3JnYW5pemUoU3RyaW5nIGV4cGVjdGVkQ29kZSwge2Jvb2wgcmVtb3ZlVW51c2VkID0gZmFsc2V9KSB7Ci0gICAgdmFyIG9yZ2FuaXplciA9IERpcmVjdGl2ZU9yZ2FuaXplcih0ZXN0Q29kZSwgdGVzdFVuaXQsIHRlc3RFcnJvcnMsCisgICAgdmFyIG9yZ2FuaXplciA9IEltcG9ydE9yZ2FuaXplcih0ZXN0Q29kZSwgdGVzdFVuaXQsIHRlc3RFcnJvcnMsCiAgICAgICAgIHJlbW92ZVVudXNlZDogcmVtb3ZlVW51c2VkKTsKICAgICB2YXIgZWRpdHMgPSBvcmdhbml6ZXIub3JnYW5pemUoKTsKICAgICB2YXIgcmVzdWx0ID0gU291cmNlRWRpdC5hcHBseVNlcXVlbmNlKHRlc3RDb2RlLCBlZGl0cyk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc29ja2V0X3NlcnZlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc29ja2V0X3NlcnZlcl90ZXN0LmRhcnQKaW5kZXggMjYwYmYwYi4uYzU0NmIyMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NvY2tldF9zZXJ2ZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zb2NrZXRfc2VydmVyX3Rlc3QuZGFydApAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgZmluYWwgZXJyb3JOb3RpZmllciA9IEVycm9yTm90aWZpZXIoKTsKICAgICBmaW5hbCBzZXJ2ZXIgPSBTb2NrZXRTZXJ2ZXIoCiAgICAgICAgIEFuYWx5c2lzU2VydmVyT3B0aW9ucygpLAotICAgICAgICBEYXJ0U2RrTWFuYWdlcignJywgZmFsc2UpLAorICAgICAgICBEYXJ0U2RrTWFuYWdlcignJyksCiAgICAgICAgIENyYXNoUmVwb3J0aW5nQXR0YWNobWVudHNCdWlsZGVyLmVtcHR5LAogICAgICAgICBlcnJvck5vdGlmaWVyLAogICAgICAgICBudWxsLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb21wbGV0aW9uL2RhcnQvZmVhdHVyZV9jb21wdXRlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyX3Rlc3QuZGFydAppbmRleCA2Njg0ZGM1Li5mYzhlYmE1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvbXBsZXRpb24vZGFydC9mZWF0dXJlX2NvbXB1dGVyX3Rlc3QuZGFydApAQCAtNDIsMjggKzQyLDg2IEBACiAgICAgfQogICB9CiAKLSAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X25hbWVkKCkgYXN5bmMgeworICBGdXR1cmU8dm9pZD4gdGVzdF9hcmd1bWVudExpc3RfbmFtZWRfYWZ0ZXJDb2xvbigpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKIHZvaWQgZih7aW50IGksIFN0cmluZyBzLCBib29sIGJ9KSB7fQotdm9pZCBnKGludCBqKSB7Ci0gIGYoaTpeKTsKLX0KLScnJywgJ2ludCcpOwotICB9Ci0KLSAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X25hbWVkMigpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKLXZvaWQgZih7aW50IGksIFN0cmluZyBzLCBib29sIGJ9KSB7fQotdm9pZCBnKGludCBqKSB7Cit2b2lkIGcoKSB7CiAgIGYoczpeKTsKIH0KICcnJywgJ1N0cmluZycpOwogICB9CiAKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X25hbWVkX2FmdGVyQ29sb25fd2l0aFNwYWNlKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwordm9pZCBmKHtpbnQgaSwgU3RyaW5nIHMsIGJvb2wgYn0pIHt9Cit2b2lkIGcoKSB7CisgIGYoczogXik7Cit9CisnJycsICdTdHJpbmcnKTsKKyAgfQorCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9uYW1lZF9iZWZvcmVDb2xvbigpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKK3ZvaWQgZih7aW50IGkgPSAwfSkge30KK3ZvaWQgZygpIHsKKyAgZihpXjopOworfQorJycnLCBudWxsKTsKKyAgfQorCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9uYW1lZF9iZWZvcmVMYWJlbCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKK3ZvaWQgZih7aW50IGkgPSAwfSkge30KK3ZvaWQgZygpIHsKKyAgZiheaTopOworfQorJycnLCBudWxsKTsKKyAgfQorCisgIEZ1dHVyZTx2b2lkPgorICAgICAgdGVzdF9hcmd1bWVudExpc3RfbmFtZWRfYmVmb3JlTGFiZWxfaGFzUHJldmlvdXNQYXJhbWV0ZXIoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoaW50IGksIHtTdHJpbmcgcyA9ICcnfSkge30KK3ZvaWQgZygpIHsKKyAgZiheczopOworfQorJycnLCAnaW50Jyk7CisgIH0KKworICBGdXR1cmU8dm9pZD4KKyAgICAgIHRlc3RfYXJndW1lbnRMaXN0X25hbWVkX2JlZm9yZUxhYmVsX2hhc1ByZXZpb3VzUGFyYW1ldGVyMigpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKK3ZvaWQgZihpbnQgaSwge1N0cmluZyBzID0gJyd9KSB7fQordm9pZCBnKCkgeworICBmKF4gczopOworfQorJycnLCAnaW50Jyk7CisgIH0KKworICBGdXR1cmU8dm9pZD4gdGVzdF9hcmd1bWVudExpc3RfbmFtZWRfdW5yZXNvbHZlZF9oYXNOYW1lZFBhcmFtZXRlcnMoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoe2ludCBpfSkge30KKwordm9pZCBnKCkgeworICBmKGo6IF4pOworfQorJycnLCBudWxsKTsKKyAgfQorCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9uYW1lZF91bnJlc29sdmVkX25vTmFtZWRQYXJhbWV0ZXJzKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwordm9pZCBmKCkge30KKwordm9pZCBnKCkgeworICBmKGo6IF4pOworfQorJycnLCBudWxsKTsKKyAgfQorCiAgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9uYW1lZF93aXRoX3JlcXVpcmVkUG9zaXRpb25hbCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKIHZvaWQgZihTdHJpbmcgcywge2ludCBpfSkge30KLXZvaWQgZyhpbnQgaikgewordm9pZCBnKCkgewogICBmKCdzdHInLCBpOiBeKTsKIH0KICcnJywgJ2ludCcpOwpAQCAtNzMsNyArMTMxLDcgQEAKICAgICAgIHRlc3RfYXJndW1lbnRMaXN0X25hbWVkX3dpdGhfcmVxdWlyZWRQb3NpdGlvbmFsX2RlZmF1bHRWYWx1ZSgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKIHZvaWQgZihTdHJpbmcgcywge2ludCBpID0gMH0pIHt9Ci12b2lkIGcoaW50IGopIHsKK3ZvaWQgZygpIHsKICAgZignc3RyJywgaTogXik7CiB9CiAnJycsICdpbnQnKTsKQEAgLTExOCwzNSArMTc2LDU0IEBACiAgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9wb3NpdGlvbmFsKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwogdm9pZCBmKFtpbnQgaV0pIHt9Ci12b2lkIGcoaW50IGopIHsKLSAgZihpOl4pOwordm9pZCBnKCkgeworICBmKF4pOwogfQogJycnLCAnaW50Jyk7CiAgIH0KIAotICBGdXR1cmU8dm9pZD4gdGVzdF9hcmd1bWVudExpc3RfcG9zaXRpb25hbF9jb21wbGV0aW9uSW5MYWJlbCgpIGFzeW5jIHsKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3Bvc2l0aW9uYWxfYXNOYW1lZCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKLXZvaWQgZihbaW50IGkgPSAyXSkge30KLXZvaWQgZyhpbnQgaikgewotICBmKF5pOik7Cit2b2lkIGYoW2ludCBpXSkge30KK3ZvaWQgZygpIHsKKyAgZihpOiBeKTsKIH0KICcnJywgbnVsbCk7CiAgIH0KIAotICBGdXR1cmU8dm9pZD4gdGVzdF9hcmd1bWVudExpc3RfcG9zaXRpb25hbF9jb21wbGV0aW9uSW5MYWJlbDIoKSBhc3luYyB7CisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9wb3NpdGlvbmFsX2FzTmFtZWRfYmVmb3JlQ29sb24oKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCi12b2lkIGYoU3RyaW5nIHMsIGJvb2wgYiwgW2ludCBpID0gMl0pIHt9Ci12b2lkIGcoaW50IGopIHsKK3ZvaWQgZihTdHJpbmcgcywgYm9vbCBiLCBbaW50IGkgPSAwXSkge30KK3ZvaWQgZygpIHsKICAgZihpXjopOwogfQogJycnLCBudWxsKTsKICAgfQogCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9wb3NpdGlvbmFsX2FzTmFtZWRfYmVmb3JlTGFiZWwoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoW2ludCBpID0gMF0pIHt9Cit2b2lkIGcoKSB7CisgIGYoXmk6KTsKK30KKycnJywgJ2ludCcpOworICB9CisKKyAgRnV0dXJlPHZvaWQ+CisgICAgICB0ZXN0X2FyZ3VtZW50TGlzdF9wb3NpdGlvbmFsX2FzTmFtZWRfYmVmb3JlTGFiZWxfaGFzUHJldmlvdXNQYXJhbWV0ZXIoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoU3RyaW5nIHMsIFtpbnQgaSA9IDBdKSB7fQordm9pZCBnKCkgeworICBmKF5pOik7Cit9CisnJycsICdTdHJpbmcnKTsKKyAgfQorCiAgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9wb3NpdGlvbmFsX3doaXRlc3BhY2UoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCiB2b2lkIGYoW2ludCBpXSkge30KLXZvaWQgZyhpbnQgaikgewotICBmKGk6ICBeICApOwordm9pZCBnKCkgeworICBmKCAgXiAgKTsKIH0KICcnJywgJ2ludCcpOwogICB9CkBAIC0xNTQsOCArMjMxLDggQEAKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3Bvc2l0aW9uYWxfd2l0aF9yZXF1aXJlZFBvc2l0aW9uYWwoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCiB2b2lkIGYoU3RyaW5nIHMsIGJvb2wgYiwgW2ludCBpXSkge30KLXZvaWQgZyhpbnQgaikgewotICBmKCcnLCAzLCBpOl4pOwordm9pZCBnKCkgeworICBmKCdzdHInLCBmYWxzZSwgXik7CiB9CiAnJycsICdpbnQnKTsKICAgfQpAQCAtMTY0LDE3ICsyNDEsMzUgQEAKICAgICAgIHRlc3RfYXJndW1lbnRMaXN0X3Bvc2l0aW9uYWxfd2l0aF9yZXF1aXJlZFBvc2l0aW9uYWxfZGVmYXVsdFZhbHVlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwogdm9pZCBmKFN0cmluZyBzLCBib29sIGIsIFtpbnQgaSA9IDJdKSB7fQotdm9pZCBnKGludCBqKSB7Ci0gIGYoJycsIDMsIGk6Xik7Cit2b2lkIGcoKSB7CisgIGYoJ3N0cicsIGZhbHNlLCBeKTsKIH0KICcnJywgJ2ludCcpOwogICB9CiAKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9hc05hbWVkKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwordm9pZCBmKGludCBpLCBTdHJpbmcgc3RyLCBib29sIGIpIHt9Cit2b2lkIGcoKSB7CisgIGYoaTogXik7Cit9CisnJycsIG51bGwpOworICB9CisKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9maXJzdCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKIHZvaWQgZihpbnQgaSwgU3RyaW5nIHN0ciwgYm9vbCBiKSB7fQotdm9pZCBnKGludCBqKSB7Ci0gIGYoXmopOwordm9pZCBnKCkgeworICBmKF53KTsKK30KKycnJywgJ2ludCcpOworICB9CisKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9maXJzdDIoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoaW50IGksIFN0cmluZyBzdHIsIGJvb2wgYikge30KK3ZvaWQgZygpIHsKKyAgZiggXiAsICdzdHInKTsKIH0KICcnJywgJ2ludCcpOwogICB9CkBAIC0xOTEsOCArMjg2LDggQEAKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9sYXN0KCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwogdm9pZCBmKGludCBpLCBTdHJpbmcgc3RyLCBib29sIGIpIHt9Ci12b2lkIGcoaW50IGopIHsKLSAgZigxLCAnMicsIHReKTsKK3ZvaWQgZygpIHsKKyAgZigxLCAnc3RyJywgdF4pOwogfQogJycnLCAnYm9vbCcpOwogICB9CkBAIC0yMDAsOCArMjk1LDE3IEBACiAgIEZ1dHVyZTx2b2lkPiB0ZXN0X2FyZ3VtZW50TGlzdF9yZXF1aXJlZFBvc2l0aW9uYWxfbGFzdF9pbXBsaWNpdCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKIHZvaWQgZihpbnQgaSwgU3RyaW5nIHN0ciwgYm9vbCBiLCBudW0gbikge30KLXZvaWQgZyhpbnQgaikgewotICBmKDEsICcyJywgXik7Cit2b2lkIGcoKSB7CisgIGYoMSwgJ3N0cicsIF4pOworfQorJycnLCAnYm9vbCcpOworICB9CisKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9sYXN0X2ltcGxpY2l0MigpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRDb250ZXh0VHlwZSgnJycKK3ZvaWQgZihpbnQgaSwgU3RyaW5nIHN0ciwgYm9vbCBiLCBudW0gbikge30KK3ZvaWQgZygpIHsKKyAgZigxLCAnc3RyJywgXiApOwogfQogJycnLCAnYm9vbCcpOwogICB9CkBAIC0yMDksNyArMzEzLDcgQEAKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9taWRkbGUoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCiB2b2lkIGYoaW50IGksIFN0cmluZyBzdHIsIGJvb2wgYikge30KLXZvaWQgZyhpbnQgaikgewordm9pZCBnKCkgewogICBmKDEsIHdeKTsKIH0KICcnJywgJ1N0cmluZycpOwpAQCAtMjE4LDE2ICszMjIsMjUgQEAKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9taWRkbGUyKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydENvbnRleHRUeXBlKCcnJwogdm9pZCBmKGludCBpLCBTdHJpbmcgc3RyLCBib29sIGIpIHt9Ci12b2lkIGcoaW50IGopIHsKK3ZvaWQgZygpIHsKICAgZigxLCBeLCApOwogfQogJycnLCAnU3RyaW5nJyk7CiAgIH0KIAorICBGdXR1cmU8dm9pZD4gdGVzdF9hcmd1bWVudExpc3RfcmVxdWlyZWRQb3NpdGlvbmFsX21pZGRsZTMoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCit2b2lkIGYoaW50IGksIFN0cmluZyBzdHIsIGJvb2wgYikge30KK3ZvaWQgZygpIHsKKyAgZigxLCBeICwgKTsKK30KKycnJywgJ1N0cmluZycpOworICB9CisKICAgRnV0dXJlPHZvaWQ+IHRlc3RfYXJndW1lbnRMaXN0X3JlcXVpcmVkUG9zaXRpb25hbF9taWRkbGVfaW1wbGljaXQoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Q29udGV4dFR5cGUoJycnCiB2b2lkIGYoaW50IGksIFN0cmluZyBzdHIsIGJvb2wgYikge30KLXZvaWQgZyhpbnQgaikgewordm9pZCBnKCkgewogICBmKDEsIF4gKTsKIH0KICcnJywgJ1N0cmluZycpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC9tYWtlX2ZpbmFsX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvbWFrZV9maW5hbF90ZXN0LmRhcnQKaW5kZXggZTYxNTRiYS4uNGQ0ZGQ2MiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC9tYWtlX2ZpbmFsX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4L21ha2VfZmluYWxfdGVzdC5kYXJ0CkBAIC0xMiwxMyArMTIsMTQgQEAKIAogdm9pZCBtYWluKCkgewogICBkZWZpbmVSZWZsZWN0aXZlU3VpdGUoKCkgewotICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhNYWtlRmluYWxUZXN0KTsKLSAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoTWFrZUZpbmFsV2l0aE5OQkRUZXN0KTsKKyAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoUHJlZmVyRmluYWxJbkZvckVhY2hUZXN0KTsKKyAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoUHJlZmVyRmluYWxGaWVsZHNUZXN0KTsKKyAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoUHJlZmVyRmluYWxGaWVsZHNXaXRoTk5CRFRlc3QpOwogICB9KTsKIH0KIAogQHJlZmxlY3RpdmVUZXN0Ci1jbGFzcyBNYWtlRmluYWxUZXN0IGV4dGVuZHMgRml4UHJvY2Vzc29yTGludFRlc3QgeworY2xhc3MgUHJlZmVyRmluYWxGaWVsZHNUZXN0IGV4dGVuZHMgRml4UHJvY2Vzc29yTGludFRlc3QgewogICBAb3ZlcnJpZGUKICAgRml4S2luZCBnZXQga2luZCA9PiBEYXJ0Rml4S2luZC5NQUtFX0ZJTkFMOwogCkBAIC01Nyw3ICs1OCw3IEBACiB9CiAKIEByZWZsZWN0aXZlVGVzdAotY2xhc3MgTWFrZUZpbmFsV2l0aE5OQkRUZXN0IGV4dGVuZHMgRml4UHJvY2Vzc29yTGludFRlc3QgeworY2xhc3MgUHJlZmVyRmluYWxGaWVsZHNXaXRoTk5CRFRlc3QgZXh0ZW5kcyBGaXhQcm9jZXNzb3JMaW50VGVzdCB7CiAgIEBvdmVycmlkZQogICBMaXN0PFN0cmluZz4gZ2V0IGV4cGVyaW1lbnRzID0+IFtFbmFibGVTdHJpbmcubm9uX251bGxhYmxlXTsKIApAQCAtOTcsMyArOTgsNDYgQEAKICcnJyk7CiAgIH0KIH0KKworQHJlZmxlY3RpdmVUZXN0CitjbGFzcyBQcmVmZXJGaW5hbEluRm9yRWFjaFRlc3QgZXh0ZW5kcyBGaXhQcm9jZXNzb3JMaW50VGVzdCB7CisgIEBvdmVycmlkZQorICBGaXhLaW5kIGdldCBraW5kID0+IERhcnRGaXhLaW5kLk1BS0VfRklOQUw7CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyBnZXQgbGludENvZGUgPT4gTGludE5hbWVzLnByZWZlcl9maW5hbF9pbl9mb3JfZWFjaDsKKworICBGdXR1cmU8dm9pZD4gdGVzdF9ub1R5cGUoKSBhc3luYyB7CisgICAgYXdhaXQgcmVzb2x2ZVRlc3RVbml0KCcnJwordm9pZCBmbigpIHsKKyAgZm9yICh2YXIgaSBpbiBbMSwgMiwgM10pIHsKKyAgICBwcmludChpKTsKKyAgfQorfQorJycnKTsKKyAgICBhd2FpdCBhc3NlcnRIYXNGaXgoJycnCit2b2lkIGZuKCkgeworICBmb3IgKGZpbmFsIGkgaW4gWzEsIDIsIDNdKSB7CisgICAgcHJpbnQoaSk7CisgIH0KK30KKycnJyk7CisgIH0KKworICBGdXR1cmU8dm9pZD4gdGVzdF90eXBlKCkgYXN5bmMgeworICAgIGF3YWl0IHJlc29sdmVUZXN0VW5pdCgnJycKK3ZvaWQgZm4oKSB7CisgIGZvciAoaW50IGkgaW4gWzEsIDIsIDNdKSB7CisgICAgcHJpbnQoaSk7CisgIH0KK30KKycnJyk7CisgICAgYXdhaXQgYXNzZXJ0SGFzRml4KCcnJwordm9pZCBmbigpIHsKKyAgZm9yIChmaW5hbCBpbnQgaSBpbiBbMSwgMiwgM10pIHsKKyAgICBwcmludChpKTsKKyAgfQorfQorJycnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC9vcmdhbml6ZV9pbXBvcnRzX3Rlc3QuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvb3JnYW5pemVfaW1wb3J0c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZGJhYgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvb3JnYW5pemVfaW1wb3J0c190ZXN0LmRhcnQKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvbGludGVyL2xpbnRfbmFtZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3V0aWxpdGllcy9maXhlcy9maXhlcy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CisKK2ltcG9ydCAnZml4X3Byb2Nlc3Nvci5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBkZWZpbmVSZWZsZWN0aXZlU3VpdGUoKCkgeworICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhPcmdhbml6ZUltcG9ydHNUZXN0KTsKKyAgfSk7Cit9CisKK0ByZWZsZWN0aXZlVGVzdAorY2xhc3MgT3JnYW5pemVJbXBvcnRzVGVzdCBleHRlbmRzIEZpeFByb2Nlc3NvckxpbnRUZXN0IHsKKyAgQG92ZXJyaWRlCisgIEZpeEtpbmQgZ2V0IGtpbmQgPT4gRGFydEZpeEtpbmQuT1JHQU5JWkVfSU1QT1JUUzsKKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIGdldCBsaW50Q29kZSA9PiBMaW50TmFtZXMuZGlyZWN0aXZlc19vcmRlcmluZzsKKworICBGdXR1cmU8dm9pZD4gdGVzdF9vcmdhbml6ZUltcG9ydHMoKSBhc3luYyB7CisgICAgYXdhaXQgcmVzb2x2ZVRlc3RVbml0KCcnJworLy9pZ25vcmVfZm9yX2ZpbGU6IHVudXNlZF9pbXBvcnQKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKK3ZvaWQgbWFpbihTdHJlYW08U3RyaW5nPiBhcmdzKSB7IH0KKycnJyk7CisgICAgYXdhaXQgYXNzZXJ0SGFzRml4KCcnJworLy9pZ25vcmVfZm9yX2ZpbGU6IHVudXNlZF9pbXBvcnQKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCit2b2lkIG1haW4oU3RyZWFtPFN0cmluZz4gYXJncykgeyB9CisnJycpOworICB9Cit9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4L3NvcnRfZGlyZWN0aXZlc190ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4L3NvcnRfZGlyZWN0aXZlc190ZXN0LmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2UwMGUuLjAwMDAwMDAKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC9zb3J0X2RpcmVjdGl2ZXNfdGVzdC5kYXJ0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQotLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLS8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLWltcG9ydCAncGFja2FnZTphbmFseXNpc19zZXJ2ZXIvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZlci9zcmMvc2VydmljZXMvbGludGVyL2xpbnRfbmFtZXMuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3V0aWxpdGllcy9maXhlcy9maXhlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7Ci0KLWltcG9ydCAnZml4X3Byb2Nlc3Nvci5kYXJ0JzsKLQotdm9pZCBtYWluKCkgewotICBkZWZpbmVSZWZsZWN0aXZlU3VpdGUoKCkgewotICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhTb3J0RGlyZWN0aXZlc1Rlc3QpOwotICB9KTsKLX0KLQotQHJlZmxlY3RpdmVUZXN0Ci1jbGFzcyBTb3J0RGlyZWN0aXZlc1Rlc3QgZXh0ZW5kcyBGaXhQcm9jZXNzb3JMaW50VGVzdCB7Ci0gIEBvdmVycmlkZQotICBGaXhLaW5kIGdldCBraW5kID0+IERhcnRGaXhLaW5kLlNPUlRfRElSRUNUSVZFUzsKLQotICBAb3ZlcnJpZGUKLSAgU3RyaW5nIGdldCBsaW50Q29kZSA9PiBMaW50TmFtZXMuZGlyZWN0aXZlc19vcmRlcmluZzsKLQotICBGdXR1cmU8dm9pZD4gdGVzdF9zb3J0RGlyZWN0aXZlcygpIGFzeW5jIHsKLSAgICBhd2FpdCByZXNvbHZlVGVzdFVuaXQoJycnCi0vL2lnbm9yZV9mb3JfZmlsZTogdW51c2VkX2ltcG9ydAotaW1wb3J0ICdkYXJ0OmlvJzsKLQotaW1wb3J0ICdkYXJ0OmFzeW5jJzsKLQotdm9pZCBtYWluKFN0cmVhbTxTdHJpbmc+IGFyZ3MpIHsgfQotJycnKTsKLSAgICBhd2FpdCBhc3NlcnRIYXNGaXgoJycnCi0vL2lnbm9yZV9mb3JfZmlsZTogdW51c2VkX2ltcG9ydAotaW1wb3J0ICdkYXJ0OmFzeW5jJzsKLWltcG9ydCAnZGFydDppbyc7Ci0KLXZvaWQgbWFpbihTdHJlYW08U3RyaW5nPiBhcmdzKSB7IH0KLScnJyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvdGVzdF9hbGwuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zcmMvc2VydmljZXMvY29ycmVjdGlvbi9maXgvdGVzdF9hbGwuZGFydAppbmRleCAwMTg1ZGQwLi42ZTUzZTExIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3JjL3NlcnZpY2VzL2NvcnJlY3Rpb24vZml4L3Rlc3RfYWxsLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90ZXN0L3NyYy9zZXJ2aWNlcy9jb3JyZWN0aW9uL2ZpeC90ZXN0X2FsbC5kYXJ0CkBAIC05MSw2ICs5MSw3IEBACiBpbXBvcnQgJ21ha2VfZmluYWxfdGVzdC5kYXJ0JyBhcyBtYWtlX2ZpbmFsOwogaW1wb3J0ICdtYWtlX3ZhcmlhYmxlX25vdF9maW5hbF90ZXN0LmRhcnQnIGFzIG1ha2VfdmFyaWFibGVfbm90X2ZpbmFsOwogaW1wb3J0ICdtb3ZlX3R5cGVfYXJndW1lbnRzX3RvX2NsYXNzX3Rlc3QuZGFydCcgYXMgbW92ZV90eXBlX2FyZ3VtZW50c190b19jbGFzczsKK2ltcG9ydCAnb3JnYW5pemVfaW1wb3J0c190ZXN0LmRhcnQnIGFzIG9yZ2FuaXplX2ltcG9ydHM7CiBpbXBvcnQgJ3F1YWxpZnlfcmVmZXJlbmNlX3Rlc3QuZGFydCcgYXMgcXVhbGlmeV9yZWZlcmVuY2U7CiBpbXBvcnQgJ3JlbW92ZV9hbm5vdGF0aW9uX3Rlc3QuZGFydCcgYXMgcmVtb3ZlX2Fubm90YXRpb247CiBpbXBvcnQgJ3JlbW92ZV9hcmd1bWVudF90ZXN0LmRhcnQnIGFzIHJlbW92ZV9hcmd1bWVudDsKQEAgLTE1MCw3ICsxNTEsNiBAQAogaW1wb3J0ICdyZXBsYWNlX3dpdGhfdGVhcl9vZmZfdGVzdC5kYXJ0JyBhcyByZXBsYWNlX3dpdGhfdGVhcl9vZmY7CiBpbXBvcnQgJ3JlcGxhY2Vfd2l0aF92YXJfdGVzdC5kYXJ0JyBhcyByZXBsYWNlX3dpdGhfdmFyOwogaW1wb3J0ICdzb3J0X2NoaWxkX3Byb3BlcnR5X2xhc3RfdGVzdC5kYXJ0JyBhcyBzb3J0X3Byb3BlcnRpZXNfbGFzdDsKLWltcG9ydCAnc29ydF9kaXJlY3RpdmVzX3Rlc3QuZGFydCcgYXMgc29ydF9kaXJlY3RpdmVzOwogaW1wb3J0ICd1cGRhdGVfc2RrX2NvbnN0cmFpbnRzX3Rlc3QuZGFydCcgYXMgdXBkYXRlX3Nka19jb25zdHJhaW50czsKIGltcG9ydCAndXNlX2NvbnN0X3Rlc3QuZGFydCcgYXMgdXNlX2NvbnN0OwogaW1wb3J0ICd1c2VfZWZmZWN0aXZlX2ludGVnZXJfZGl2aXNpb25fdGVzdC5kYXJ0JwpAQCAtMjQwLDYgKzI0MCw3IEBACiAgICAgbWFrZV9maW5hbC5tYWluKCk7CiAgICAgbWFrZV92YXJpYWJsZV9ub3RfZmluYWwubWFpbigpOwogICAgIG1vdmVfdHlwZV9hcmd1bWVudHNfdG9fY2xhc3MubWFpbigpOworICAgIG9yZ2FuaXplX2ltcG9ydHMubWFpbigpOwogICAgIHF1YWxpZnlfcmVmZXJlbmNlLm1haW4oKTsKICAgICByZW1vdmVfYW5ub3RhdGlvbi5tYWluKCk7CiAgICAgcmVtb3ZlX2FyZ3VtZW50Lm1haW4oKTsKQEAgLTI5NCw3ICsyOTUsNiBAQAogICAgIHJlcGxhY2Vfd2l0aF9udWxsX2F3YXJlLm1haW4oKTsKICAgICByZXBsYWNlX3dpdGhfdGVhcl9vZmYubWFpbigpOwogICAgIHJlcGxhY2Vfd2l0aF92YXIubWFpbigpOwotICAgIHNvcnRfZGlyZWN0aXZlcy5tYWluKCk7CiAgICAgc29ydF9wcm9wZXJ0aWVzX2xhc3QubWFpbigpOwogICAgIHVwZGF0ZV9zZGtfY29uc3RyYWludHMubWFpbigpOwogICAgIHVzZV9jb25zdC5tYWluKCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmVyL3Rlc3Qvc3RyZXNzL2NvbXBsZXRpb24vY29tcGxldGlvbl9ydW5uZXIuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zdHJlc3MvY29tcGxldGlvbi9jb21wbGV0aW9uX3J1bm5lci5kYXJ0CmluZGV4IDJmYjY5YjMuLjE5YTIzZGIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zdHJlc3MvY29tcGxldGlvbi9jb21wbGV0aW9uX3J1bm5lci5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdGVzdC9zdHJlc3MvY29tcGxldGlvbi9jb21wbGV0aW9uX3J1bm5lci5kYXJ0CkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIGluY2x1ZGVkUGF0aHM6IDxTdHJpbmc+W2FuYWx5c2lzUm9vdF0sCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXI6IHJlc291cmNlUHJvdmlkZXIpOwogICAgIHZhciBjb250cmlidXRvciA9IERhcnRDb21wbGV0aW9uTWFuYWdlcigpOwotICAgIHZhciBwZXJmb3JtYW5jZSA9IENvbXBsZXRpb25QZXJmb3JtYW5jZSgpOworICAgIHZhciBzdGF0aXN0aWNzID0gQ29tcGxldGlvblBlcmZvcm1hbmNlKCk7CiAgICAgdmFyIHN0YW1wID0gMTsKIAogICAgIHZhciBmaWxlQ291bnQgPSAwOwpAQCAtMTAwLDEwICsxMDAsMTUgQEAKIAogICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CiAgICAgICAgICAgdmFyIHJlcXVlc3QgPQotICAgICAgICAgICAgICBDb21wbGV0aW9uUmVxdWVzdEltcGwocmVzdWx0LCBvZmZzZXQsIGZhbHNlLCBwZXJmb3JtYW5jZSk7Ci0gICAgICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gYXdhaXQgY29udHJpYnV0b3IuY29tcHV0ZVN1Z2dlc3Rpb25zKAotICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAorICAgICAgICAgICAgICBDb21wbGV0aW9uUmVxdWVzdEltcGwocmVzdWx0LCBvZmZzZXQsIGZhbHNlLCBzdGF0aXN0aWNzKTsKKyAgICAgICAgICB2YXIgc3VnZ2VzdGlvbnMgPSBhd2FpdCByZXF1ZXN0LnBlcmZvcm1hbmNlLnJ1blJlcXVlc3RPcGVyYXRpb24oCisgICAgICAgICAgICAocGVyZm9ybWFuY2UpIGFzeW5jIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRyaWJ1dG9yLmNvbXB1dGVTdWdnZXN0aW9ucygKKyAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAorICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSwKICAgICAgICAgICApOwogICAgICAgICAgIHRpbWVyLnN0b3AoKTsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL2NvbXBsZXRpb25fbWV0cmljcy9jb21wbGV0aW9uX21ldHJpY3MuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdG9vbC9jb21wbGV0aW9uX21ldHJpY3MvY29tcGxldGlvbl9tZXRyaWNzLmRhcnQKaW5kZXggZjU0ODNlYS4uNjZiNGIxZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL2NvbXBsZXRpb25fbWV0cmljcy9jb21wbGV0aW9uX21ldHJpY3MuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rvb2wvY29tcGxldGlvbl9tZXRyaWNzL2NvbXBsZXRpb25fbWV0cmljcy5kYXJ0CkBAIC0zNyw2ICszNyw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnRkb2MvZGFydGRvY19kaXJlY3RpdmVfaW5mby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc2VydmljZXMvYXZhaWxhYmxlX2RlY2xhcmF0aW9ucy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdXRpbC9wZXJmb3JtYW5jZS9vcGVyYXRpb25fcGVyZm9ybWFuY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXJfcGx1Z2luL3Byb3RvY29sL3Byb3RvY29sX2NvbW1vbi5kYXJ0JyBzaG93IEVsZW1lbnRLaW5kOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyX3BsdWdpbi9zcmMvdXRpbGl0aWVzL2NvbXBsZXRpb24vb3B0eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CkBAIC0xNjgsNyArMTcwLDE0IEBACiAKIC8vLyBBbiBpbmRpY2F0aW9uIG9mIHRoZSBncm91cCBpbiB3aGljaCB0aGUgY29tcGxldGlvbiBmYWxscyBmb3IgdGhlIHB1cnBvc2VzIG9mCiAvLy8gc3ViZGl2aWRpbmcgdGhlIHJlc3VsdHMuCi1lbnVtIENvbXBsZXRpb25Hcm91cCB7IGluc3RhbmNlTWVtYmVyLCBzdGF0aWNNZW1iZXIsIHRvcExldmVsIH0KK2VudW0gQ29tcGxldGlvbkdyb3VwIHsKKyAgaW5zdGFuY2VNZW1iZXIsCisgIHN0YXRpY01lbWJlciwKKyAgdHlwZVJlZmVyZW5jZSwKKyAgbG9jYWxSZWZlcmVuY2UsCisgIHBhcmFtUmVmZXJlbmNlLAorICB0b3BMZXZlbAorfQogCiAvLy8gQSB3cmFwcGVyIGZvciB0aGUgY29sbGVjdGlvbiBvZiBbQ291bnRlcl0gYW5kIFtNZWFuUmVjaXByb2NhbFJhbmtDb21wdXRlcl0KIC8vLyBvYmplY3RzIGZvciBhIHJ1biBvZiBbQ29tcGxldGlvbk1ldHJpY3NDb21wdXRlcl0uCkBAIC0yMDgsNiArMjE3LDE1IEBACiAgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyIHN0YXRpY01lbWJlck1yckNvbXB1dGVyID0KICAgICAgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyKCdzdGF0aWMgbWVtYmVyIGNvbXBsZXRpb25zJyk7CiAKKyAgTWVhblJlY2lwcm9jYWxSYW5rQ29tcHV0ZXIgdHlwZVJlZk1yckNvbXB1dGVyID0KKyAgICAgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyKCd0eXBlIHJlZmVyZW5jZSBjb21wbGV0aW9ucycpOworCisgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyIGxvY2FsUmVmTXJyQ29tcHV0ZXIgPQorICAgICAgTWVhblJlY2lwcm9jYWxSYW5rQ29tcHV0ZXIoJ2xvY2FsIHJlZmVyZW5jZSBjb21wbGV0aW9ucycpOworCisgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyIHBhcmFtUmVmTXJyQ29tcHV0ZXIgPQorICAgICAgTWVhblJlY2lwcm9jYWxSYW5rQ29tcHV0ZXIoJ3BhcmFtIHJlZmVyZW5jZSBjb21wbGV0aW9ucycpOworCiAgIE1lYW5SZWNpcHJvY2FsUmFua0NvbXB1dGVyIHRvcExldmVsTXJyQ29tcHV0ZXIgPQogICAgICAgTWVhblJlY2lwcm9jYWxSYW5rQ29tcHV0ZXIoJ25vbi10eXBlIG1lbWJlciBjb21wbGV0aW9ucycpOwogCkBAIC0yMzgsNiArMjU2LDE4IEBACiAgIExpc3Q8Q29tcGxldGlvblJlc3VsdD4gc3RhdGljTWVtYmVyV29yc3RSZXN1bHRzID0gW107CiAKICAgLy8vIEEgbGlzdCBvZiB0aGUgdG9wIFttYXhXb3JzdFJlc3VsdHNdIGNvbXBsZXRpb24gcmVzdWx0cyB3aXRoIHRoZSBoaWdoZXN0CisgIC8vLyAod29yc3QpIHJhbmtzIGZvciBjb21wbGV0aW5nIHRvIHR5cGUgcmVmZXJlbmNlcy4KKyAgTGlzdDxDb21wbGV0aW9uUmVzdWx0PiB0eXBlUmVmV29yc3RSZXN1bHRzID0gW107CisKKyAgLy8vIEEgbGlzdCBvZiB0aGUgdG9wIFttYXhXb3JzdFJlc3VsdHNdIGNvbXBsZXRpb24gcmVzdWx0cyB3aXRoIHRoZSBoaWdoZXN0CisgIC8vLyAod29yc3QpIHJhbmtzIGZvciBjb21wbGV0aW5nIHRvIGxvY2FsIHJlZmVyZW5jZXMuCisgIExpc3Q8Q29tcGxldGlvblJlc3VsdD4gbG9jYWxSZWZXb3JzdFJlc3VsdHMgPSBbXTsKKworICAvLy8gQSBsaXN0IG9mIHRoZSB0b3AgW21heFdvcnN0UmVzdWx0c10gY29tcGxldGlvbiByZXN1bHRzIHdpdGggdGhlIGhpZ2hlc3QKKyAgLy8vICh3b3JzdCkgcmFua3MgZm9yIGNvbXBsZXRpbmcgdG8gcGFyYW1ldGVyIHJlZmVyZW5jZXMuCisgIExpc3Q8Q29tcGxldGlvblJlc3VsdD4gcGFyYW1SZWZXb3JzdFJlc3VsdHMgPSBbXTsKKworICAvLy8gQSBsaXN0IG9mIHRoZSB0b3AgW21heFdvcnN0UmVzdWx0c10gY29tcGxldGlvbiByZXN1bHRzIHdpdGggdGhlIGhpZ2hlc3QKICAgLy8vICh3b3JzdCkgcmFua3MgZm9yIGNvbXBsZXRpbmcgdG8gdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4KICAgTGlzdDxDb21wbGV0aW9uUmVzdWx0PiB0b3BMZXZlbFdvcnN0UmVzdWx0cyA9IFtdOwogCkBAIC0yNTAsNiArMjgwLDE4IEBACiAgIExpc3Q8Q29tcGxldGlvblJlc3VsdD4gc3RhdGljTWVtYmVyU2xvd2VzdFJlc3VsdHMgPSBbXTsKIAogICAvLy8gQSBsaXN0IG9mIHRoZSB0b3AgW21heFNsb3dlc3RSZXN1bHRzXSBjb21wbGV0aW9uIHJlc3VsdHMgdGhhdCB0b29rIHRoZQorICAvLy8gbG9uZ2VzdCB0b3AgY29tcHV0ZSBmb3IgdHlwZSByZWZlcmVuY2VzLgorICBMaXN0PENvbXBsZXRpb25SZXN1bHQ+IHR5cGVSZWZTbG93ZXN0UmVzdWx0cyA9IFtdOworCisgIC8vLyBBIGxpc3Qgb2YgdGhlIHRvcCBbbWF4U2xvd2VzdFJlc3VsdHNdIGNvbXBsZXRpb24gcmVzdWx0cyB0aGF0IHRvb2sgdGhlCisgIC8vLyBsb25nZXN0IHRvcCBjb21wdXRlIGZvciBsb2NhbCByZWZlcmVuY2VzLgorICBMaXN0PENvbXBsZXRpb25SZXN1bHQ+IGxvY2FsUmVmU2xvd2VzdFJlc3VsdHMgPSBbXTsKKworICAvLy8gQSBsaXN0IG9mIHRoZSB0b3AgW21heFNsb3dlc3RSZXN1bHRzXSBjb21wbGV0aW9uIHJlc3VsdHMgdGhhdCB0b29rIHRoZQorICAvLy8gbG9uZ2VzdCB0b3AgY29tcHV0ZSBmb3IgcGFyYW1ldGVyIHJlZmVyZW5jZXMuCisgIExpc3Q8Q29tcGxldGlvblJlc3VsdD4gcGFyYW1SZWZTbG93ZXN0UmVzdWx0cyA9IFtdOworCisgIC8vLyBBIGxpc3Qgb2YgdGhlIHRvcCBbbWF4U2xvd2VzdFJlc3VsdHNdIGNvbXBsZXRpb24gcmVzdWx0cyB0aGF0IHRvb2sgdGhlCiAgIC8vLyBsb25nZXN0IHRvcCBjb21wdXRlIGZvciB0b3AtbGV2ZWwgZGVjbGFyYXRpb25zLgogICBMaXN0PENvbXBsZXRpb25SZXN1bHQ+IHRvcExldmVsU2xvd2VzdFJlc3VsdHMgPSBbXTsKIApAQCAtMjkyLDYgKzMzNCwxNSBAQAogICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAuc3RhdGljTWVtYmVyOgogICAgICAgICBzdGF0aWNNZW1iZXJNcnJDb21wdXRlci5hZGRSYW5rKHJhbmspOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ29tcGxldGlvbkdyb3VwLnR5cGVSZWZlcmVuY2U6CisgICAgICAgIHR5cGVSZWZNcnJDb21wdXRlci5hZGRSYW5rKHJhbmspOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ29tcGxldGlvbkdyb3VwLmxvY2FsUmVmZXJlbmNlOgorICAgICAgICBsb2NhbFJlZk1yckNvbXB1dGVyLmFkZFJhbmsocmFuayk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAucGFyYW1SZWZlcmVuY2U6CisgICAgICAgIHBhcmFtUmVmTXJyQ29tcHV0ZXIuYWRkUmFuayhyYW5rKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIENvbXBsZXRpb25Hcm91cC50b3BMZXZlbDoKICAgICAgICAgdG9wTGV2ZWxNcnJDb21wdXRlci5hZGRSYW5rKHJhbmspOwogICAgICAgICBicmVhazsKQEAgLTMxNCw2ICszNjUsMTIgQEAKICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VNZW1iZXJTbG93ZXN0UmVzdWx0czsKICAgICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAuc3RhdGljTWVtYmVyOgogICAgICAgICAgIHJldHVybiBzdGF0aWNNZW1iZXJTbG93ZXN0UmVzdWx0czsKKyAgICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAudHlwZVJlZmVyZW5jZToKKyAgICAgICAgICByZXR1cm4gdHlwZVJlZlNsb3dlc3RSZXN1bHRzOworICAgICAgICBjYXNlIENvbXBsZXRpb25Hcm91cC5sb2NhbFJlZmVyZW5jZToKKyAgICAgICAgICByZXR1cm4gbG9jYWxSZWZTbG93ZXN0UmVzdWx0czsKKyAgICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAucGFyYW1SZWZlcmVuY2U6CisgICAgICAgICAgcmV0dXJuIHBhcmFtUmVmU2xvd2VzdFJlc3VsdHM7CiAgICAgICAgIGNhc2UgQ29tcGxldGlvbkdyb3VwLnRvcExldmVsOgogICAgICAgICAgIHJldHVybiB0b3BMZXZlbFNsb3dlc3RSZXN1bHRzOwogICAgICAgfQpAQCAtMzQ0LDYgKzQwMSwxMiBAQAogICAgICAgICAgIHJldHVybiBpbnN0YW5jZU1lbWJlcldvcnN0UmVzdWx0czsKICAgICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAuc3RhdGljTWVtYmVyOgogICAgICAgICAgIHJldHVybiBzdGF0aWNNZW1iZXJXb3JzdFJlc3VsdHM7CisgICAgICAgIGNhc2UgQ29tcGxldGlvbkdyb3VwLnR5cGVSZWZlcmVuY2U6CisgICAgICAgICAgcmV0dXJuIHR5cGVSZWZXb3JzdFJlc3VsdHM7CisgICAgICAgIGNhc2UgQ29tcGxldGlvbkdyb3VwLmxvY2FsUmVmZXJlbmNlOgorICAgICAgICAgIHJldHVybiBsb2NhbFJlZldvcnN0UmVzdWx0czsKKyAgICAgICAgY2FzZSBDb21wbGV0aW9uR3JvdXAucGFyYW1SZWZlcmVuY2U6CisgICAgICAgICAgcmV0dXJuIHBhcmFtUmVmV29yc3RSZXN1bHRzOwogICAgICAgICBjYXNlIENvbXBsZXRpb25Hcm91cC50b3BMZXZlbDoKICAgICAgICAgICByZXR1cm4gdG9wTGV2ZWxXb3JzdFJlc3VsdHM7CiAgICAgICB9CkBAIC01MTIsNiArNTc1LDE1IEBACiAgICAgbWV0cmljcy5zdGF0aWNNZW1iZXJNcnJDb21wdXRlci5wcmludE1lYW4oKTsKICAgICBwcmludCgnJyk7CiAKKyAgICBtZXRyaWNzLnR5cGVSZWZNcnJDb21wdXRlci5wcmludE1lYW4oKTsKKyAgICBwcmludCgnJyk7CisKKyAgICBtZXRyaWNzLmxvY2FsUmVmTXJyQ29tcHV0ZXIucHJpbnRNZWFuKCk7CisgICAgcHJpbnQoJycpOworCisgICAgbWV0cmljcy5wYXJhbVJlZk1yckNvbXB1dGVyLnByaW50TWVhbigpOworICAgIHByaW50KCcnKTsKKwogICAgIG1ldHJpY3MudG9wTGV2ZWxNcnJDb21wdXRlci5wcmludE1lYW4oKTsKICAgICBwcmludCgnJyk7CiAKQEAgLTU4Niw2ICs2NTgsMTAgQEAKICAgICBfcHJpbnRTbG93ZXN0UmVzdWx0cygKICAgICAgICAgJ0luc3RhbmNlIG1lbWJlcnMnLCBtZXRyaWNzLmluc3RhbmNlTWVtYmVyU2xvd2VzdFJlc3VsdHMpOwogICAgIF9wcmludFNsb3dlc3RSZXN1bHRzKCdTdGF0aWMgbWVtYmVycycsIG1ldHJpY3Muc3RhdGljTWVtYmVyU2xvd2VzdFJlc3VsdHMpOworICAgIF9wcmludFNsb3dlc3RSZXN1bHRzKCdUeXBlIHJlZmVyZW5jZXMnLCBtZXRyaWNzLnR5cGVSZWZTbG93ZXN0UmVzdWx0cyk7CisgICAgX3ByaW50U2xvd2VzdFJlc3VsdHMoJ0xvY2FsIHJlZmVyZW5jZXMnLCBtZXRyaWNzLmxvY2FsUmVmU2xvd2VzdFJlc3VsdHMpOworICAgIF9wcmludFNsb3dlc3RSZXN1bHRzKAorICAgICAgICAnUGFyYW1ldGVyIHJlZmVyZW5jZXMnLCBtZXRyaWNzLnBhcmFtUmVmU2xvd2VzdFJlc3VsdHMpOwogICAgIF9wcmludFNsb3dlc3RSZXN1bHRzKCdUb3AgbGV2ZWwnLCBtZXRyaWNzLnRvcExldmVsU2xvd2VzdFJlc3VsdHMpOwogICB9CiAKQEAgLTU5NSw2ICs2NzEsOSBAQAogICAgIHByaW50KCdUaGUgd29yc3QgY29tcGxldGlvbiByZXN1bHRzJyk7CiAgICAgX3ByaW50V29yc3RSZXN1bHRzKCdJbnN0YW5jZSBtZW1iZXJzJywgbWV0cmljcy5pbnN0YW5jZU1lbWJlcldvcnN0UmVzdWx0cyk7CiAgICAgX3ByaW50V29yc3RSZXN1bHRzKCdTdGF0aWMgbWVtYmVycycsIG1ldHJpY3Muc3RhdGljTWVtYmVyV29yc3RSZXN1bHRzKTsKKyAgICBfcHJpbnRXb3JzdFJlc3VsdHMoJ1R5cGUgcmVmZXJlbmNlcycsIG1ldHJpY3MudG9wTGV2ZWxXb3JzdFJlc3VsdHMpOworICAgIF9wcmludFdvcnN0UmVzdWx0cygnTG9jYWwgcmVmZXJlbmNlcycsIG1ldHJpY3MubG9jYWxSZWZXb3JzdFJlc3VsdHMpOworICAgIF9wcmludFdvcnN0UmVzdWx0cygnUGFyYW1ldGVyIHJlZmVyZW5jZXMnLCBtZXRyaWNzLnBhcmFtUmVmV29yc3RSZXN1bHRzKTsKICAgICBfcHJpbnRXb3JzdFJlc3VsdHMoJ1RvcCBsZXZlbCcsIG1ldHJpY3MudG9wTGV2ZWxXb3JzdFJlc3VsdHMpOwogICB9CiAKQEAgLTYxOCw3ICs2OTcsOSBAQAogICB9CiAKICAgRnV0dXJlPExpc3Q8cHJvdG9jb2wuQ29tcGxldGlvblN1Z2dlc3Rpb24+PiBfY29tcHV0ZUNvbXBsZXRpb25TdWdnZXN0aW9ucygKLSAgICAgIE1ldHJpY3NTdWdnZXN0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIENvbXBsZXRpb25SZXF1ZXN0SW1wbCByZXF1ZXN0LAorICAgICAgTWV0cmljc1N1Z2dlc3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICAgIENvbXBsZXRpb25SZXF1ZXN0SW1wbCByZXF1ZXN0LAogICAgICAgW0RlY2xhcmF0aW9uc1RyYWNrZXIgZGVjbGFyYXRpb25zVHJhY2tlciwKICAgICAgIHByb3RvY29sLkNvbXBsZXRpb25BdmFpbGFibGVTdWdnZXN0aW9uc1BhcmFtcwogICAgICAgICAgIGF2YWlsYWJsZVN1Z2dlc3Rpb25zUGFyYW1zXSkgYXN5bmMgewpAQCAtNjMwLDYgKzcxMSw3IEBACiAgICAgICAgIGRhcnRkb2NEaXJlY3RpdmVJbmZvOiBEYXJ0ZG9jRGlyZWN0aXZlSW5mbygpLAogICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXIsCiAgICAgICApLmNvbXB1dGVTdWdnZXN0aW9ucygKKyAgICAgICAgcGVyZm9ybWFuY2UsCiAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAogICAgICAgKTsKQEAgLTY0Nyw2ICs3MjksNyBAQAogICAgICAgICBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdzOiBpbmNsdWRlZFN1Z2dlc3Rpb25SZWxldmFuY2VUYWdMaXN0LAogICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXIsCiAgICAgICApLmNvbXB1dGVTdWdnZXN0aW9ucygKKyAgICAgICAgcGVyZm9ybWFuY2UsCiAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgIGVuYWJsZVVyaUNvbnRyaWJ1dG9yOiB0cnVlLAogICAgICAgKTsKQEAgLTc5NCwxMiArODc3LDI0IEBACiAgICAgICAgICAgICAgICAgQ29tcGxldGlvblBlcmZvcm1hbmNlKCksCiAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgIHZhciBkaXJlY3RpdmVJbmZvID0gRGFydGRvY0RpcmVjdGl2ZUluZm8oKTsKLSAgICAgICAgICAgICAgdmFyIGRhcnRSZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgIGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbShyZXF1ZXN0LCBkaXJlY3RpdmVJbmZvKTsKLSAgICAgICAgICAgICAgdmFyIG9wVHlwZSA9Ci0gICAgICAgICAgICAgICAgICBPcFR5cGUuZm9yQ29tcGxldGlvbihkYXJ0UmVxdWVzdC50YXJnZXQsIHJlcXVlc3Qub2Zmc2V0KTsKLSAgICAgICAgICAgICAgdmFyIHN1Z2dlc3Rpb25zID0gYXdhaXQgX2NvbXB1dGVDb21wbGV0aW9uU3VnZ2VzdGlvbnMobGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICByZXF1ZXN0LCBkZWNsYXJhdGlvbnNUcmFja2VyLCBhdmFpbGFibGVTdWdnZXN0aW9uc1BhcmFtcyk7CisKKyAgICAgICAgICAgICAgT3BUeXBlIG9wVHlwZTsKKyAgICAgICAgICAgICAgTGlzdDxwcm90b2NvbC5Db21wbGV0aW9uU3VnZ2VzdGlvbj4gc3VnZ2VzdGlvbnM7CisgICAgICAgICAgICAgIGF3YWl0IHJlcXVlc3QucGVyZm9ybWFuY2UucnVuUmVxdWVzdE9wZXJhdGlvbigKKyAgICAgICAgICAgICAgICAocGVyZm9ybWFuY2UpIGFzeW5jIHsKKyAgICAgICAgICAgICAgICAgIHZhciBkYXJ0UmVxdWVzdCA9IGF3YWl0IERhcnRDb21wbGV0aW9uUmVxdWVzdEltcGwuZnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSwgcmVxdWVzdCwgZGlyZWN0aXZlSW5mbyk7CisgICAgICAgICAgICAgICAgICBvcFR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgIE9wVHlwZS5mb3JDb21wbGV0aW9uKGRhcnRSZXF1ZXN0LnRhcmdldCwgcmVxdWVzdC5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMgPSBhd2FpdCBfY29tcHV0ZUNvbXBsZXRpb25TdWdnZXN0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnNUcmFja2VyLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdWdnZXN0aW9uc1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgc3RvcHdhdGNoLnN0b3AoKTsKIAogICAgICAgICAgICAgICByZXR1cm4gZm9yRWFjaEV4cGVjdGVkQ29tcGxldGlvbigKQEAgLTEwMTIsNiArMTEwNywxNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHJldHVybiBDb21wbGV0aW9uR3JvdXAuaW5zdGFuY2VNZW1iZXI7CiAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRDb21wbGV0aW9uLmVsZW1lbnRLaW5kID09IEVsZW1lbnRLaW5kLkNMQVNTIHx8CisgICAgICAgICAgZXhwZWN0ZWRDb21wbGV0aW9uLmVsZW1lbnRLaW5kID09IEVsZW1lbnRLaW5kLk1JWElOIHx8CisgICAgICAgICAgZXhwZWN0ZWRDb21wbGV0aW9uLmVsZW1lbnRLaW5kID09IEVsZW1lbnRLaW5kLkVOVU0gfHwKKyAgICAgICAgICBleHBlY3RlZENvbXBsZXRpb24uZWxlbWVudEtpbmQgPT0gRWxlbWVudEtpbmQuVFlQRV9QQVJBTUVURVIpIHsKKyAgICAgICAgcmV0dXJuIENvbXBsZXRpb25Hcm91cC50eXBlUmVmZXJlbmNlOworICAgICAgfSBlbHNlIGlmIChleHBlY3RlZENvbXBsZXRpb24uZWxlbWVudEtpbmQgPT0gRWxlbWVudEtpbmQuTE9DQUxfVkFSSUFCTEUpIHsKKyAgICAgICAgcmV0dXJuIENvbXBsZXRpb25Hcm91cC5sb2NhbFJlZmVyZW5jZTsKKyAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRDb21wbGV0aW9uLmVsZW1lbnRLaW5kID09IEVsZW1lbnRLaW5kLlBBUkFNRVRFUikgeworICAgICAgICByZXR1cm4gQ29tcGxldGlvbkdyb3VwLnBhcmFtUmVmZXJlbmNlOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gQ29tcGxldGlvbkdyb3VwLnRvcExldmVsOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL2NvbXBsZXRpb25fbWV0cmljcy9yZWxldmFuY2VfbWV0cmljcy5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL2NvbXBsZXRpb25fbWV0cmljcy9yZWxldmFuY2VfbWV0cmljcy5kYXJ0CmluZGV4IDgzM2ExYTYuLjRkYzYzNTIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdG9vbC9jb21wbGV0aW9uX21ldHJpY3MvcmVsZXZhbmNlX21ldHJpY3MuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rvb2wvY29tcGxldGlvbl9tZXRyaWNzL3JlbGV2YW5jZV9tZXRyaWNzLmRhcnQKQEAgLTE0OTUsNzIgKzE0OTUsNiBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLy8vIFJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgW3JlZmVyZW5jZV0gYW5kIHRoZSByZWZlcmVuY2VkIGxvY2FsCi0gIC8vLyBbdmFyaWFibGVdLCB3aGVyZSB0aGUgZGlzdGFuY2UgaXMgZGVmaW5lZCB0byBiZSB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlCi0gIC8vLyBkZWNsYXJhdGlvbnMgYmV0d2VlbiB0aGUgbG9jYWwgdmFyaWFibGUgYW5kIHRoZSByZWZlcmVuY2UuCi0gIGludCBfbG9jYWxWYXJpYWJsZURpc3RhbmNlKEFzdE5vZGUgcmVmZXJlbmNlLCBMb2NhbFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZSkgewotICAgIHZhciBkaXN0YW5jZSA9IDA7Ci0gICAgdmFyIG5vZGUgPSByZWZlcmVuY2U7Ci0gICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgaWYgKG5vZGUgaXMgRm9yU3RhdGVtZW50IHx8IG5vZGUgaXMgRm9yRWxlbWVudCkgewotICAgICAgICB2YXIgbG9vcFBhcnRzID0gbm9kZSBpcyBGb3JTdGF0ZW1lbnQKLSAgICAgICAgICAgID8gbm9kZS5mb3JMb29wUGFydHMKLSAgICAgICAgICAgIDogKG5vZGUgYXMgRm9yRWxlbWVudCkuZm9yTG9vcFBhcnRzOwotICAgICAgICBpZiAobG9vcFBhcnRzIGlzIEZvclBhcnRzV2l0aERlY2xhcmF0aW9ucykgewotICAgICAgICAgIGZvciAodmFyIGRlY2xhcmVkVmFyaWFibGUgaW4gbG9vcFBhcnRzLnZhcmlhYmxlcy52YXJpYWJsZXMucmV2ZXJzZWQpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJlZFZhcmlhYmxlLmRlY2xhcmVkRWxlbWVudCA9PSB2YXJpYWJsZSkgewotICAgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXN0YW5jZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsb29wUGFydHMgaXMgRm9yRWFjaFBhcnRzV2l0aERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgaWYgKGxvb3BQYXJ0cy5sb29wVmFyaWFibGUuZGVjbGFyZWRFbGVtZW50ID09IHZhcmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRpc3RhbmNlKys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSB7Ci0gICAgICAgIGZvciAodmFyIGRlY2xhcmVkVmFyaWFibGUgaW4gbm9kZS52YXJpYWJsZXMudmFyaWFibGVzLnJldmVyc2VkKSB7Ci0gICAgICAgICAgaWYgKGRlY2xhcmVkVmFyaWFibGUuZGVjbGFyZWRFbGVtZW50ID09IHZhcmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRpc3RhbmNlKys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobm9kZSBpcyBDYXRjaENsYXVzZSkgewotICAgICAgICBpZiAobm9kZS5leGNlcHRpb25QYXJhbWV0ZXI/LnN0YXRpY0VsZW1lbnQgPT0gdmFyaWFibGUgfHwKLSAgICAgICAgICAgIG5vZGUuc3RhY2tUcmFjZVBhcmFtZXRlcj8uc3RhdGljRWxlbWVudCA9PSB2YXJpYWJsZSkgewotICAgICAgICAgIHJldHVybiBkaXN0YW5jZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG5vZGUgaXMgU3RhdGVtZW50KSB7Ci0gICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDsKLSAgICAgICAgdmFyIHN0YXRlbWVudHMgPSBjb25zdCA8U3RhdGVtZW50PltdOwotICAgICAgICBpZiAocGFyZW50IGlzIEJsb2NrKSB7Ci0gICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBTd2l0Y2hDYXNlKSB7Ci0gICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpcyBTd2l0Y2hEZWZhdWx0KSB7Ci0gICAgICAgICAgc3RhdGVtZW50cyA9IHBhcmVudC5zdGF0ZW1lbnRzOwotICAgICAgICB9Ci0gICAgICAgIHZhciBpbmRleCA9IHN0YXRlbWVudHMuaW5kZXhPZihub2RlKTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICAgICAgdmFyIHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV07Ci0gICAgICAgICAgaWYgKHN0YXRlbWVudCBpcyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSB7Ci0gICAgICAgICAgICBmb3IgKHZhciBkZWNsYXJlZFZhcmlhYmxlCi0gICAgICAgICAgICAgICAgaW4gc3RhdGVtZW50LnZhcmlhYmxlcy52YXJpYWJsZXMucmV2ZXJzZWQpIHsKLSAgICAgICAgICAgICAgaWYgKGRlY2xhcmVkVmFyaWFibGUuZGVjbGFyZWRFbGVtZW50ID09IHZhcmlhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRpc3RhbmNlKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBub2RlID0gbm9kZS5wYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLSAgfQotCiAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBmdW5jdGlvbnMgYmV0d2VlbiB0aGUgW3JlZmVyZW5jZV0gYW5kIHRoZSBbZnVuY3Rpb25dCiAgIC8vLyBpbiB3aGljaCB0aGUgcmVmZXJlbmNlZCBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQuCiAgIGludCBfcGFyYW1ldGVyUmVmZXJlbmNlRGVwdGgoQXN0Tm9kZSByZWZlcmVuY2UsIEVsZW1lbnQgZnVuY3Rpb24pIHsKQEAgLTE3NzgsMTAgKzE3MTIsNyBAQAogICAgICAgLy8gIGFkZGl0aW9uYWxseSBtZWFzdXJpbmcgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBib3VuZGFyaWVzIHRoYXQgYXJlCiAgICAgICAvLyAgY3Jvc3NlZCBhbmQgdGhlbiByZXBvcnRpbmcgdGhlIGRpc3RhbmNlIHdpdGggYSBsYWJlbCBzdWNoIGFzCiAgICAgICAvLyAgJ2xvY2FsIHZhcmlhYmxlICgkYm91bmRhcnlDb3VudCknLgotICAgICAgdmFyIGRpc3RhbmNlID0gX2xvY2FsVmFyaWFibGVEaXN0YW5jZShub2RlLCBlbGVtZW50KTsKLSAgICAgIGlmIChkaXN0YW5jZSA8IDApIHsKLSAgICAgICAgRGF0ZVRpbWUubm93KCk7Ci0gICAgICB9CisgICAgICB2YXIgZGlzdGFuY2UgPSBmZWF0dXJlQ29tcHV0ZXIubG9jYWxWYXJpYWJsZURpc3RhbmNlKG5vZGUsIGVsZW1lbnQpOwogICAgICAgX3JlY29yZERpc3RhbmNlKCdkaXN0YW5jZSB0byBsb2NhbCB2YXJpYWJsZScsIGRpc3RhbmNlKTsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgV2UgbWlnaHQgd2FudCB0byBjcm9zcyByZWZlcmVuY2UgdGhlIGRlcHRoIG9mCkBAIC0xOTEzLDkgKzE4NDQsNiBAQAogICAgICAgICAgIGRpc3RhbmNlID0gZmVhdHVyZUNvbXB1dGVyLmluaGVyaXRhbmNlRGlzdGFuY2UoCiAgICAgICAgICAgICAgIGFyZ3VtZW50VHlwZS5lbGVtZW50LCBwYXJhbWV0ZXJUeXBlLmVsZW1lbnQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkaXN0YW5jZSA8IDApIHsKLSAgICAgICAgICBEYXRlVGltZS5ub3coKTsKLSAgICAgICAgfQogICAgICAgICBkYXRhLnJlY29yZERpc3RhbmNlKCdTdWJ0eXBlIG9mIGNvbnRleHQgdHlwZSAoJGRlc2NyaXB0b3IpJywgZGlzdGFuY2UpOwogICAgICAgICBkYXRhLnJlY29yZERpc3RhbmNlKCdTdWJ0eXBlIG9mIGNvbnRleHQgdHlwZSAoYWxsKScsIGRpc3RhbmNlKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdG9vbC9sc3Bfc3BlYy9SRUFETUUubWQgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rvb2wvbHNwX3NwZWMvUkVBRE1FLm1kCmluZGV4IDhkNDFiNzAuLmQ0ODkwZTQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2ZXIvdG9vbC9sc3Bfc3BlYy9SRUFETUUubWQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL2xzcF9zcGVjL1JFQURNRS5tZApAQCAtNSw2ICs1LDcgQEAKICMjIFVzaW5nIHRoZSBEYXJ0IExTUCBzZXJ2ZXIgaW4gZWRpdG9ycwogCiAtIFtVc2luZyBMU1Agd2l0aCBEYXJ0LVZpbV0oaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9kYXJ0LXZpbS1wbHVnaW4vYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI2hvdy1kby1pLWNvbmZpZ3VyZS1hbi1sc3AtcGx1Z2luLXRvLXN0YXJ0LXRoZS1hbmFseXNpcy1zZXJ2ZXIpCistIFtVc2luZyBMU1Agd2l0aCBFbWFjc10oaHR0cHM6Ly9lbWFjcy1sc3AuZ2l0aHViLmlvL2xzcC1kYXJ0KQogCiAjIyBSdW5uaW5nIHRoZSBTZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL21pZ3JhdGlvbl9ydW5uZXIuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2ZXIvdG9vbC9taWdyYXRpb25fcnVubmVyLmRhcnQKaW5kZXggODUxODg1Yy4uOGI5ODljZCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZlci90b29sL21pZ3JhdGlvbl9ydW5uZXIuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmVyL3Rvb2wvbWlncmF0aW9uX3J1bm5lci5kYXJ0CkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICAgIHNlcnZlckNoYW5uZWwsCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIsCiAgICAgICAgIG9wdGlvbnMsCi0gICAgICAgIERhcnRTZGtNYW5hZ2VyKHNka1BhdGgsIHRydWUpLAorICAgICAgICBEYXJ0U2RrTWFuYWdlcihzZGtQYXRoKSwKICAgICAgICAgQ3Jhc2hSZXBvcnRpbmdBdHRhY2htZW50c0J1aWxkZXIuZW1wdHksCiAgICAgICAgIEluc3RydW1lbnRhdGlvblNlcnZpY2UuTlVMTF9TRVJWSUNFKTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL0NIQU5HRUxPRy5tZCBiL3BrZy9hbmFseXplci9DSEFOR0VMT0cubWQKaW5kZXggMmRmYzc4MS4uY2UzOTA2ZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL0NIQU5HRUxPRy5tZAorKysgYi9wa2cvYW5hbHl6ZXIvQ0hBTkdFTE9HLm1kCkBAIC0xLDggKzEsMjMgQEAKLSMjIDAuMzkuMTEtZGV2CisjIyAwLjM5LjEzLWRldgorKiBBZGRlZCAnZGFydC9zZGsvYnVpbGRfc2RrX3N1bW1hcnkuZGFydCcgd2l0aCBgYnVpbGRTZGtTdW1tYXJ5YC4KKyogQWRkZWQgYER5bmFtaWNUeXBlYCwgYE5ldmVyVHlwZWAsIGFuZCBgVm9pZFR5cGVgIGludGVyZmFjZXMuCisKKyMjIDAuMzkuMTIKKyogRGVwcmVjYXRlZCBgY2FuVXNlU3VtbWFyaWVzYCBpbiBgRGFydFNka01hbmFnZXJgIGNvbnN0cnVjdG9yLgorICBTdW1tYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgdGhpcyB3YXkgZm9yIFNESy4KKyogU2V0IHVyaSBmb3IgaW1wbGljaXQgZGFydDpjb3JlIGltcG9ydC4KKyogQWRkIG92ZXJyaWRlS25vd25GZWF0dXJlc0FzeW5jKCkgZm9yIERhcnREb2MgdGVzdGluZy4KKyogUmVtb3ZlIERhcnRTZGsudXNlU3VtbWFyeS4KKyogTW92ZSBUeXBlU3lzdGVtSW1wbCB0byBzcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQKKworIyMgMC4zOS4xMQogKiBEZXByZWNhdGVkIGBDbGFzc0VsZW1lbnQuaGFzUmVmZXJlbmNlVG9TdXBlcmAuCiAgIEl0IHdhcyB1c2VkIGludGVybmFsbHksIHNob3VsZCBub3QgYmUgcGFydCBvZiBBUEkuCiAqIERlcHJlY2F0ZWQgYExpYnJhcnlFbGVtZW50Lmxhbmd1YWdlVmVyc2lvbk1ham9yL21pbm9yYC4KICAgVXNlIGBMaWJyYXJ5RWxlbWVudC5sYW5ndWFnZVZlcnNpb25gIHRvIGFjY2VzcyBtb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uLgorKiBCdWcgZml4ZXM6ICM0MjAwNywgIzQyNDc0LCAjMzcyOTMsICM0MjM4NSwgIzM2MzE1LCAjNDIzNTYsICM0MjI3NCwgIzQyMzIxLAorICAjNDIzMzcsICMyNzM4NywgIzM0ODA2LCAjMzc4MTAsICM0MTA3MiwgIzQyMjc4LCAjMzgzMDYsICMzNTAzNiwgIzIzMzUzLAorICAjNDIxNzgsICM0MjIxNiwgIzQyMjAxLgogCiAjIyAwLjM5LjEwCiAqIFJlc3RvcmVkIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGluIGludGVybmFsIGBTdW1tYXJ5QnVpbGRlcmAsCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvYW5hbHlzaXNfb3B0aW9ucy55YW1sIGIvcGtnL2FuYWx5emVyL2FuYWx5c2lzX29wdGlvbnMueWFtbAppbmRleCBlNmQzYTdjLi5mZTU5Nzc2IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvYW5hbHlzaXNfb3B0aW9ucy55YW1sCisrKyBiL3BrZy9hbmFseXplci9hbmFseXNpc19vcHRpb25zLnlhbWwKQEAgLTEsMjcgKzEsMTcgQEAKIGluY2x1ZGU6IHBhY2thZ2U6cGVkYW50aWMvYW5hbHlzaXNfb3B0aW9ucy4xLjkuMC55YW1sCiAKIGFuYWx5emVyOgotICAjIFRoaXMgY3VycmVudGx5IGZpbmRzIH40LDUwMCBpbXBsaWNpdC1jYXN0cyBpc3N1ZXMgd2hlbiBlbmFibGVkLgotICAjIHN0cm9uZy1tb2RlOgotICAjICAgaW1wbGljaXQtY2FzdHM6IGZhbHNlCiAgIGVycm9yczoKICAgICAjIEluY3JlYXNlIHRoZSBzZXZlcml0eSBvZiB0aGUgdW51c2VkX2ltcG9ydCBoaW50LgogICAgIHVudXNlZF9pbXBvcnQ6IHdhcm5pbmcKLSAgICAjIFRoZXJlIGFyZSBjdXJyZW50bHkgMTQwIHZpb2xhdGlvbnMgaW4gbGliLy4KKyAgICAjIFRoZXJlIGFyZSBjdXJyZW50bHkgMTBrIHZpb2xhdGlvbnMgaW4gdGVzdC8gYW5kIHRvb2wvLgogICAgIGFsd2F5c19kZWNsYXJlX3JldHVybl90eXBlczogaWdub3JlCi0gICAgIyBUaGVyZSBhcmUgY3VycmVudGx5IDU1MDAgdmlvbGF0aW9ucyBpbiBsaWIvLiBUaGlzIGp1c3QgZG9lcyBub3QgZml0IHdlbGwKKyAgICAjIFRoZXJlIGFyZSBjdXJyZW50bHkgNTAwMCB2aW9sYXRpb25zIGluIGxpYi8uIFRoaXMganVzdCBkb2VzIG5vdCBmaXQgd2VsbAogICAgICMgd2l0aCB0aGUgYW5hbHl6ZXIgdGVhbSdzIHN0eWxlLgogICAgIG9taXRfbG9jYWxfdmFyaWFibGVfdHlwZXM6IGlnbm9yZQogICAgICMgVGhlcmUgYXJlIGN1cnJlbnRseSAzMzYwIHZpb2xhdGlvbnMgaW4gbGliLy4KICAgICBwcmVmZXJfc2luZ2xlX3F1b3RlczogaWdub3JlCi0gICAgIyBJZ25vcmluZyAic3R5bGUiIGxpbnQgcnVsZXMgZnJvbSBwZWRhbnRpYyBmb3Igbm93LiBUaGVyZSBhcmUgcHJlLWV4aXN0aW5nCi0gICAgIyB2aW9sYXRpb25zIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkIHVwLiBFYWNoIG9uZSBjYW4gYmUgY2xlYW5lZCB1cCBhbmQKLSAgICAjIGVuYWJsZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBwcm92aWRlZC4KLSAgICAjIFRPRE8oc3Jhd2xpbnMpOiBBdCB0aGUgdGltZSBvZiB3cml0aW5nLCAxNzAwIHZpb2xhdGlvbnMgaW4gbGliLy4gVGhlIGZpeAotICAgICMgaXMgbWVjaGFuaWNhbCwgdmlhIGBkYXJ0Zm10IC0tZml4LWRvYy1jb21tZW50c2AsIGJ1dCBub3Qgd29ydGggdGhlIGNodXJuCi0gICAgIyB0b2RheS4KLSAgICBzbGFzaF9mb3JfZG9jX2NvbW1lbnRzOiBpZ25vcmUKLSAgICAjIFRoZXJlIGFyZSBjdXJyZW50bHkgMTk4MCB2aW9sYXRpb25zIGluIGxpYi8uCisgICAgIyBUaGVyZSBhcmUgY3VycmVudGx5IDIwMDAgdmlvbGF0aW9ucyBpbiBsaWIvLgogICAgIHVubmVjZXNzYXJ5X3RoaXM6IGlnbm9yZQogCiBsaW50ZXI6CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvYW5hbHlzaXMvZGVjbGFyZWRfdmFyaWFibGVzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvYW5hbHlzaXMvZGVjbGFyZWRfdmFyaWFibGVzLmRhcnQKaW5kZXggMmI4MGU3Yi4uMDEwNDE4MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FuYWx5c2lzL2RlY2xhcmVkX3ZhcmlhYmxlcy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvZGFydC9hbmFseXNpcy9kZWNsYXJlZF92YXJpYWJsZXMuZGFydApAQCAtNSw3ICs1LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2NvbnN0YW50L3ZhbHVlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2NvbnN0YW50L2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIAogLy8vIEFuIG9iamVjdCB1c2VkIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuCiAvLy8gZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIHRoZSBgLURgIG9wdGlvbi4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZGFydC9hbmFseXNpcy9yZXN1bHRzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvYW5hbHlzaXMvcmVzdWx0cy5kYXJ0CmluZGV4IGZlNjMxN2QuLjlhY2Q0YWQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvZGFydC9hbmFseXNpcy9yZXN1bHRzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FuYWx5c2lzL3Jlc3VsdHMuZGFydApAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbTsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogCiAvLy8gVGhlIHJlc3VsdCBvZiBwZXJmb3JtaW5nIHNvbWUga2luZCBvZiBhbmFseXNpcyBvbiBhIHNpbmdsZSBmaWxlLiBFdmVyeQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FuYWx5c2lzL3Nlc3Npb24uZGFydCBiL3BrZy9hbmFseXplci9saWIvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQKaW5kZXggODllMTEzYi4uMjg0NTBjYiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FuYWx5c2lzL3Nlc3Npb24uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvYW5hbHlzaXMvc2Vzc2lvbi5kYXJ0CkBAIC0xMiw3ICsxMiw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXhjZXB0aW9uL2V4Y2VwdGlvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbTsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogCiAvLy8gQSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHJlc3VsdHMgb2YgYW5hbHl6aW5nIG9uZSBvciBtb3JlIGZpbGVzLgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FzdC9hc3QuZGFydCBiL3BrZy9hbmFseXplci9saWIvZGFydC9hc3QvYXN0LmRhcnQKaW5kZXggODQyM2IxMS4uZmIxNDkyZiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2FzdC9hc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvYXN0L2FzdC5kYXJ0CkBAIC00MDI4LDcgKzQwMjgsNyBAQAogICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgbm9kZSk7CiAKICAgLy8vIFVzZSB0aGUgZ2l2ZW4gW3Zpc2l0b3JdIHRvIHZpc2l0IGVhY2ggb2YgdGhlIG5vZGVzIGluIHRoaXMgbGlzdC4KLSAgYWNjZXB0KEFzdFZpc2l0b3IgdmlzaXRvcik7CisgIHZvaWQgYWNjZXB0KEFzdFZpc2l0b3IgdmlzaXRvcik7CiB9CiAKIC8vLyBBIGZvcm1hbCBwYXJhbWV0ZXIgdGhhdCBpcyByZXF1aXJlZCAoaXMgbm90IG9wdGlvbmFsKS4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCBiL3BrZy9hbmFseXplci9saWIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydAppbmRleCBkZGE3MjUwLi5lMjVhNWIzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0CkBAIC00Miw5ICs0Miw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2Vycm9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2NvbnN0YW50L2V2YWx1YXRpb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCcgc2hvdyBOYW1lc3BhY2U7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCcgc2hvdyBBbmFseXNpc0NvbnRleHQ7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9qYXZhX2VuZ2luZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgTmFtZXNwYWNlOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2RhcnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3Rhc2svYXBpL21vZGVsLmRhcnQnIHNob3cgQW5hbHlzaXNUYXJnZXQ7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvZWxlbWVudC90eXBlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvZWxlbWVudC90eXBlLmRhcnQKaW5kZXggNGFkYmY0Ni4uZTNkODY0ZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvZGFydC9lbGVtZW50L3R5cGUuZGFydApAQCAtMTY1LDYgKzE2NSwxMiBAQAogICAgICAgTGlzdDxEYXJ0VHlwZT4gYXJndW1lbnRUeXBlcywgTGlzdDxEYXJ0VHlwZT4gcGFyYW1ldGVyVHlwZXMpOwogfQogCisvLy8gVGhlIHR5cGUgYGR5bmFtaWNgIGlzIGEgdHlwZSB3aGljaCBpcyBhIHN1cGVydHlwZSBvZiBhbGwgb3RoZXIgdHlwZXMsIGp1c3QKKy8vLyBsaWtlIGBPYmplY3RgLCB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhlIHN0YXRpYyBhbmFseXNpcyBhc3N1bWVzIHRoYXQKKy8vLyBldmVyeSBtZW1iZXIgYWNjZXNzIGhhcyBhIGNvcnJlc3BvbmRpbmcgbWVtYmVyIHdpdGggYSBzaWduYXR1cmUgdGhhdAorLy8vIGFkbWl0cyB0aGUgZ2l2ZW4gYWNjZXNzLgorYWJzdHJhY3QgY2xhc3MgRHluYW1pY1R5cGUgaW1wbGVtZW50cyBEYXJ0VHlwZSB7fQorCiAvLy8gVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiwgbWV0aG9kLCBjb25zdHJ1Y3RvciwgZ2V0dGVyLCBvciBzZXR0ZXIuIEZ1bmN0aW9uCiAvLy8gdHlwZXMgY29tZSBpbiB0aHJlZSB2YXJpYXRpb25zOgogLy8vCkBAIC01NTEsNiArNTU3LDkgQEAKICAgICAgIEludGVyZmFjZVR5cGVJbXBsLmdldFNtYXJ0TGVhc3RVcHBlckJvdW5kKGZpcnN0LCBzZWNvbmQpOwogfQogCisvLy8gVGhlIHR5cGUgYE5ldmVyYCByZXByZXNlbnRzIHRoZSB1bmluaGFiaXRlZCBib3R0b20gdHlwZS4KK2Fic3RyYWN0IGNsYXNzIE5ldmVyVHlwZSBpbXBsZW1lbnRzIERhcnRUeXBlIHt9CisKIC8vLyBBIHR5cGUgdGhhdCBjYW4gdHJhY2sgc3Vic3RpdHV0ZWQgdHlwZSBwYXJhbWV0ZXJzLCBlaXRoZXIgZm9yIGl0c2VsZiBhZnRlcgogLy8vIGluc3RhbnRpYXRpb24sIG9yIGZyb20gYSBzdXJyb3VuZGluZyBjb250ZXh0LgogLy8vCkBAIC02MDEsMyArNjEwLDEyIEBACiAgIEBvdmVycmlkZQogICBUeXBlUGFyYW1ldGVyRWxlbWVudCBnZXQgZWxlbWVudDsKIH0KKworLy8vIFRoZSBzcGVjaWFsIHR5cGUgYHZvaWRgIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgb2YgYW4KKy8vLyBleHByZXNzaW9uIGlzIG1lYW5pbmdsZXNzLCBhbmQgaW50ZW5kZWQgdG8gYmUgZGlzY2FyZGVkLgorYWJzdHJhY3QgY2xhc3MgVm9pZFR5cGUgaW1wbGVtZW50cyBEYXJ0VHlwZSB7CisgIEBvdmVycmlkZQorICBAZGVwcmVjYXRlZAorICBWb2lkVHlwZSBzdWJzdGl0dXRlMigKKyAgICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50VHlwZXMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlclR5cGVzKTsKK30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydAppbmRleCAzODVkMzAyLi5lY2M2M2Y1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0CkBAIC01LDcgKzUsNiBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2NvbnN0YW50L3ZhbHVlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIAogLy8vIFRoZSBpbnRlcmZhY2UgYFR5cGVQcm92aWRlcmAgZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2Ygb2JqZWN0cyB0aGF0IHByb3ZpZGUKIC8vLyBhY2Nlc3MgdG8gdHlwZXMgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvc2RrL2J1aWxkX3Nka19zdW1tYXJ5LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2RhcnQvc2RrL2J1aWxkX3Nka19zdW1tYXJ5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlMDFmZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9hbmFseXplci9saWIvZGFydC9zZGsvYnVpbGRfc2RrX3N1bW1hcnkuZGFydApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKKworaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3Nkay9hbGxvd2VkX2V4cGVyaW1lbnRzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYW5hbHlzaXMvZmVhdHVyZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hbmFseXNpcy91dGlsaXRpZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3Nlc3Npb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9zZGsvc2RrLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2Zvcm1hdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9zdW1tYXJpemVfZWxlbWVudHMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2xpbmsuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2xpbmtlZF9lbGVtZW50X2ZhY3RvcnkuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL3JlZmVyZW5jZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6eWFtbC95YW1sLmRhcnQnOworCisvLy8gQnVpbGQgc3VtbWFyeSBmb3IgU0RLIGF0IHRoZSBnaXZlbiBbc2RrUGF0aF0uCisvLy8KKy8vLyBJZiBbZW1iZWRkZXJZYW1sUGF0aF0gaXMgcHJvdmlkZWQsIHRoZW4gbGlicmFyaWVzIGZyb20gdGhpcyBmaWxlIGFyZQorLy8vIGFwcGVuZGVkIHRvIHRoZSBsaWJyYXJpZXMgb2YgdGhlIHNwZWNpZmllZCBTREsuCitVaW50OExpc3QgYnVpbGRTZGtTdW1tYXJ5KHsKKyAgQHJlcXVpcmVkIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwKKyAgQHJlcXVpcmVkIFN0cmluZyBzZGtQYXRoLAorICBTdHJpbmcgZW1iZWRkZXJZYW1sUGF0aCwKK30pIHsKKyAgdmFyIHNkayA9IEZvbGRlckJhc2VkRGFydFNkaygKKyAgICByZXNvdXJjZVByb3ZpZGVyLAorICAgIHJlc291cmNlUHJvdmlkZXIuZ2V0Rm9sZGVyKHNka1BhdGgpLAorICApOworICBzZGsuYW5hbHlzaXNPcHRpb25zID0gQW5hbHlzaXNPcHRpb25zSW1wbCgpOworCisgIC8vIEFwcGVuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZW1iZWRkZXIuCisgIGlmIChlbWJlZGRlcllhbWxQYXRoICE9IG51bGwpIHsKKyAgICB2YXIgZmlsZSA9IHJlc291cmNlUHJvdmlkZXIuZ2V0RmlsZShlbWJlZGRlcllhbWxQYXRoKTsKKyAgICB2YXIgY29udGVudCA9IGZpbGUucmVhZEFzU3RyaW5nU3luYygpOworICAgIHZhciBtYXAgPSBsb2FkWWFtbChjb250ZW50KSBhcyBZYW1sTWFwOworICAgIHZhciBlbWJlZGRlclNkayA9IEVtYmVkZGVyU2RrKHJlc291cmNlUHJvdmlkZXIsIHtmaWxlLnBhcmVudDogbWFwfSk7CisgICAgZm9yICh2YXIgbGlicmFyeSBpbiBlbWJlZGRlclNkay5zZGtMaWJyYXJpZXMpIHsKKyAgICAgIHZhciB1cmlTdHIgPSBsaWJyYXJ5LnNob3J0TmFtZTsKKyAgICAgIGlmIChzZGsubGlicmFyeU1hcC5nZXRMaWJyYXJ5KHVyaVN0cikgPT0gbnVsbCkgeworICAgICAgICBzZGsubGlicmFyeU1hcC5zZXRMaWJyYXJ5KHVyaVN0ciwgbGlicmFyeSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdmFyIGxpYnJhcnlTb3VyY2VzID0gc2RrLnNka0xpYnJhcmllcy5tYXAoKGUpIHsKKyAgICByZXR1cm4gc2RrLm1hcERhcnRVcmkoZS5zaG9ydE5hbWUpOworICB9KS50b0xpc3QoKTsKKworICByZXR1cm4gX0J1aWxkZXIoCisgICAgc2RrLmNvbnRleHQsCisgICAgc2RrLmFsbG93ZWRFeHBlcmltZW50c0pzb24sCisgICAgbGlicmFyeVNvdXJjZXMsCisgICkuYnVpbGQoKTsKK30KKworY2xhc3MgX0J1aWxkZXIgeworICBmaW5hbCBBbmFseXNpc0NvbnRleHQgY29udGV4dDsKKyAgZmluYWwgU3RyaW5nIGFsbG93ZWRFeHBlcmltZW50c0pzb247CisgIGZpbmFsIEl0ZXJhYmxlPFNvdXJjZT4gbGlicmFyeVNvdXJjZXM7CisKKyAgZmluYWwgU2V0PFN0cmluZz4gbGlicmFyeVVyaXMgPSA8U3RyaW5nPnt9OworICBmaW5hbCBMaXN0PExpbmtJbnB1dExpYnJhcnk+IGlucHV0TGlicmFyaWVzID0gW107CisKKyAgQWxsb3dlZEV4cGVyaW1lbnRzIGFsbG93ZWRFeHBlcmltZW50czsKKyAgZmluYWwgUGFja2FnZUJ1bmRsZUFzc2VtYmxlciBidW5kbGVBc3NlbWJsZXIgPSBQYWNrYWdlQnVuZGxlQXNzZW1ibGVyKCk7CisKKyAgX0J1aWxkZXIoCisgICAgdGhpcy5jb250ZXh0LAorICAgIHRoaXMuYWxsb3dlZEV4cGVyaW1lbnRzSnNvbiwKKyAgICB0aGlzLmxpYnJhcnlTb3VyY2VzLAorICApIHsKKyAgICBhbGxvd2VkRXhwZXJpbWVudHMgPSBfcGFyc2VBbGxvd2VkRXhwZXJpbWVudHMoYWxsb3dlZEV4cGVyaW1lbnRzSnNvbik7CisgIH0KKworICAvLy8gQnVpbGQgdGhlIGxpbmtlZCBidW5kbGUgYW5kIHJldHVybiBpdHMgYnl0ZXMuCisgIFVpbnQ4TGlzdCBidWlsZCgpIHsKKyAgICBsaWJyYXJ5U291cmNlcy5mb3JFYWNoKF9hZGRMaWJyYXJ5KTsKKworICAgIHZhciBlbGVtZW50RmFjdG9yeSA9IExpbmtlZEVsZW1lbnRGYWN0b3J5KAorICAgICAgY29udGV4dCwKKyAgICAgIEFuYWx5c2lzU2Vzc2lvbkltcGwobnVsbCksCisgICAgICBSZWZlcmVuY2Uucm9vdCgpLAorICAgICk7CisKKyAgICB2YXIgbGlua1Jlc3VsdCA9IGxpbmsoZWxlbWVudEZhY3RvcnksIGlucHV0TGlicmFyaWVzKTsKKyAgICBidW5kbGVBc3NlbWJsZXIuc2V0QnVuZGxlMihsaW5rUmVzdWx0LmJ1bmRsZSk7CisKKyAgICB2YXIgYnVmZmVyID0gUGFja2FnZUJ1bmRsZUJ1aWxkZXIoCisgICAgICBidW5kbGUyOiBsaW5rUmVzdWx0LmJ1bmRsZSwKKyAgICAgIHNkazogUGFja2FnZUJ1bmRsZVNka0J1aWxkZXIoCisgICAgICAgIGFsbG93ZWRFeHBlcmltZW50c0pzb246IGFsbG93ZWRFeHBlcmltZW50c0pzb24sCisgICAgICApLAorICAgICkudG9CdWZmZXIoKTsKKworICAgIHJldHVybiBidWZmZXIgaXMgVWludDhMaXN0ID8gYnVmZmVyIDogVWludDhMaXN0LmZyb21MaXN0KGJ1ZmZlcik7CisgIH0KKworICB2b2lkIF9hZGRMaWJyYXJ5KFNvdXJjZSBzb3VyY2UpIHsKKyAgICBTdHJpbmcgdXJpU3RyID0gc291cmNlLnVyaS50b1N0cmluZygpOworICAgIGlmICghbGlicmFyeVVyaXMuYWRkKHVyaVN0cikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgaW5wdXRVbml0cyA9IDxMaW5rSW5wdXRVbml0PltdOworCisgICAgQ29tcGlsYXRpb25Vbml0IGRlZmluaW5nVW5pdCA9IF9wYXJzZShzb3VyY2UpOworICAgIGlucHV0VW5pdHMuYWRkKAorICAgICAgTGlua0lucHV0VW5pdChudWxsLCBzb3VyY2UsIGZhbHNlLCBkZWZpbmluZ1VuaXQpLAorICAgICk7CisKKyAgICBmb3IgKERpcmVjdGl2ZSBkaXJlY3RpdmUgaW4gZGVmaW5pbmdVbml0LmRpcmVjdGl2ZXMpIHsKKyAgICAgIGlmIChkaXJlY3RpdmUgaXMgTmFtZXNwYWNlRGlyZWN0aXZlKSB7CisgICAgICAgIFN0cmluZyBsaWJVcmkgPSBkaXJlY3RpdmUudXJpLnN0cmluZ1ZhbHVlOworICAgICAgICBTb3VyY2UgbGliU291cmNlID0gY29udGV4dC5zb3VyY2VGYWN0b3J5LnJlc29sdmVVcmkoc291cmNlLCBsaWJVcmkpOworICAgICAgICBfYWRkTGlicmFyeShsaWJTb3VyY2UpOworICAgICAgfSBlbHNlIGlmIChkaXJlY3RpdmUgaXMgUGFydERpcmVjdGl2ZSkgeworICAgICAgICBTdHJpbmcgcGFydFVyaSA9IGRpcmVjdGl2ZS51cmkuc3RyaW5nVmFsdWU7CisgICAgICAgIFNvdXJjZSBwYXJ0U291cmNlID0gY29udGV4dC5zb3VyY2VGYWN0b3J5LnJlc29sdmVVcmkoc291cmNlLCBwYXJ0VXJpKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHBhcnRVbml0ID0gX3BhcnNlKHBhcnRTb3VyY2UpOworICAgICAgICBpbnB1dFVuaXRzLmFkZCgKKyAgICAgICAgICBMaW5rSW5wdXRVbml0KHBhcnRVcmksIHBhcnRTb3VyY2UsIGZhbHNlLCBwYXJ0VW5pdCksCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorCisgICAgaW5wdXRMaWJyYXJpZXMuYWRkKAorICAgICAgTGlua0lucHV0TGlicmFyeShzb3VyY2UsIGlucHV0VW5pdHMpLAorICAgICk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBbRmVhdHVyZVNldF0gZm9yIHRoZSBnaXZlbiBbdXJpXSwgbXVzdCBiZSBhIGBkYXJ0OmAgVVJJLgorICBGZWF0dXJlU2V0IF9mZWF0dXJlU2V0KFVyaSB1cmkpIHsKKyAgICBpZiAodXJpLmlzU2NoZW1lKCdkYXJ0JykpIHsKKyAgICAgIHZhciBwYXRoU2VnbWVudHMgPSB1cmkucGF0aFNlZ21lbnRzOworICAgICAgaWYgKHBhdGhTZWdtZW50cy5pc05vdEVtcHR5KSB7CisgICAgICAgIHZhciBsaWJyYXJ5TmFtZSA9IHBhdGhTZWdtZW50cy5maXJzdDsKKyAgICAgICAgdmFyIGV4cGVyaW1lbnRzID0gYWxsb3dlZEV4cGVyaW1lbnRzLmZvclNka0xpYnJhcnkobGlicmFyeU5hbWUpOworICAgICAgICByZXR1cm4gRmVhdHVyZVNldC5mcm9tRW5hYmxlRmxhZ3MoZXhwZXJpbWVudHMpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBTdGF0ZUVycm9yKCdFeHBlY3RlZCBhIHZhbGlkIGRhcnQ6IFVSSTogJHVyaScpOworICB9CisKKyAgQ29tcGlsYXRpb25Vbml0IF9wYXJzZShTb3VyY2Ugc291cmNlKSB7CisgICAgdmFyIHJlc3VsdCA9IHBhcnNlU3RyaW5nKAorICAgICAgY29udGVudDogc291cmNlLmNvbnRlbnRzLmRhdGEsCisgICAgICBmZWF0dXJlU2V0OiBfZmVhdHVyZVNldChzb3VyY2UudXJpKSwKKyAgICAgIHRocm93SWZEaWFnbm9zdGljczogZmFsc2UsCisgICAgKTsKKworICAgIGlmIChyZXN1bHQuZXJyb3JzLmlzTm90RW1wdHkpIHsKKyAgICAgIHZhciBlcnJvcnNTdHIgPSByZXN1bHQuZXJyb3JzLm1hcCgoZSkgeworICAgICAgICB2YXIgbG9jYXRpb24gPSByZXN1bHQubGluZUluZm8uZ2V0TG9jYXRpb24oZS5vZmZzZXQpOworICAgICAgICByZXR1cm4gJyR7c291cmNlLmZ1bGxOYW1lfTokbG9jYXRpb24gLSAke2UubWVzc2FnZX0nOworICAgICAgfSkuam9pbignXG4nKTsKKyAgICAgIHRocm93IFN0YXRlRXJyb3IoCisgICAgICAgICdVbmV4cGVjdGVkIGRpYWdub3N0aWNzOlxuJGVycm9yc1N0cicsCisgICAgICApOworICAgIH0KKworICAgIHZhciB1bml0ID0gcmVzdWx0LnVuaXQgYXMgQ29tcGlsYXRpb25Vbml0SW1wbDsKKyAgICB1bml0Lmxhbmd1YWdlVmVyc2lvbiA9IExpYnJhcnlMYW5ndWFnZVZlcnNpb24oCisgICAgICBwYWNrYWdlOiBFeHBlcmltZW50U3RhdHVzLmN1cnJlbnRWZXJzaW9uLAorICAgICAgb3ZlcnJpZGU6IG51bGwsCisgICAgKTsKKworICAgIHJldHVybiByZXN1bHQudW5pdDsKKyAgfQorCisgIHN0YXRpYyBBbGxvd2VkRXhwZXJpbWVudHMgX3BhcnNlQWxsb3dlZEV4cGVyaW1lbnRzKFN0cmluZyBjb250ZW50KSB7CisgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEFsbG93ZWRFeHBlcmltZW50cygKKyAgICAgICAgc2RrRGVmYXVsdEV4cGVyaW1lbnRzOiBbXSwKKyAgICAgICAgc2RrTGlicmFyeUV4cGVyaW1lbnRzOiB7fSwKKyAgICAgICAgcGFja2FnZUV4cGVyaW1lbnRzOiB7fSwKKyAgICAgICk7CisgICAgfQorCisgICAgcmV0dXJuIHBhcnNlQWxsb3dlZEV4cGVyaW1lbnRzKGNvbnRlbnQpOworICB9Cit9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2Vycm9yL2Vycm9yLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2Vycm9yL2Vycm9yLmRhcnQKaW5kZXggM2U5MDViMS4uZDY3NTIyMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9lcnJvci9lcnJvci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvZXJyb3IvZXJyb3IuZGFydApAQCAtODQ0LDE2ICs4NDQsMTIgQEAKICAgVG9kb0NvZGUuVE9ETywKIF07CiAKLS8qKgotICogVGhlIGxhenkgaW5pdGlhbGl6ZWQgbWFwIGZyb20gW0Vycm9yQ29kZS51bmlxdWVOYW1lXSB0byB0aGUgW0Vycm9yQ29kZV0KLSAqIGluc3RhbmNlLgotICovCisvLy8gVGhlIGxhenkgaW5pdGlhbGl6ZWQgbWFwIGZyb20gW0Vycm9yQ29kZS51bmlxdWVOYW1lXSB0byB0aGUgW0Vycm9yQ29kZV0KKy8vLyBpbnN0YW5jZS4KIEhhc2hNYXA8U3RyaW5nLCBFcnJvckNvZGU+IF91bmlxdWVOYW1lVG9Db2RlTWFwOwogCi0vKioKLSAqIFJldHVybiB0aGUgW0Vycm9yQ29kZV0gd2l0aCB0aGUgZ2l2ZW4gW3VuaXF1ZU5hbWVdLCBvciBgbnVsbGAgaWYgbm90Ci0gKiBmb3VuZC4KLSAqLworLy8vIFJldHVybiB0aGUgW0Vycm9yQ29kZV0gd2l0aCB0aGUgZ2l2ZW4gW3VuaXF1ZU5hbWVdLCBvciBgbnVsbGAgaWYgbm90CisvLy8gZm91bmQuCiBFcnJvckNvZGUgZXJyb3JDb2RlQnlVbmlxdWVOYW1lKFN0cmluZyB1bmlxdWVOYW1lKSB7CiAgIGlmIChfdW5pcXVlTmFtZVRvQ29kZU1hcCA9PSBudWxsKSB7CiAgICAgX3VuaXF1ZU5hbWVUb0NvZGVNYXAgPSBIYXNoTWFwPFN0cmluZywgRXJyb3JDb2RlPigpOwpAQCAtODY0LDI5ICs4NjAsMjEgQEAKICAgcmV0dXJuIF91bmlxdWVOYW1lVG9Db2RlTWFwW3VuaXF1ZU5hbWVdOwogfQogCi0vKioKLSAqIEFuIGVycm9yIGRpc2NvdmVyZWQgZHVyaW5nIHRoZSBhbmFseXNpcyBvZiBzb21lIERhcnQgY29kZS4KLSAqCi0gKiBTZWUgW0FuYWx5c2lzRXJyb3JMaXN0ZW5lcl0uCi0gKi8KKy8vLyBBbiBlcnJvciBkaXNjb3ZlcmVkIGR1cmluZyB0aGUgYW5hbHlzaXMgb2Ygc29tZSBEYXJ0IGNvZGUuCisvLy8KKy8vLyBTZWUgW0FuYWx5c2lzRXJyb3JMaXN0ZW5lcl0uCiBjbGFzcyBBbmFseXNpc0Vycm9yIGltcGxlbWVudHMgRGlhZ25vc3RpYyB7Ci0gIC8qKgotICAgKiBBbiBlbXB0eSBhcnJheSBvZiBlcnJvcnMgdXNlZCB3aGVuIG5vIGVycm9ycyBhcmUgZXhwZWN0ZWQuCi0gICAqLworICAvLy8gQW4gZW1wdHkgYXJyYXkgb2YgZXJyb3JzIHVzZWQgd2hlbiBubyBlcnJvcnMgYXJlIGV4cGVjdGVkLgogICBzdGF0aWMgY29uc3QgTGlzdDxBbmFseXNpc0Vycm9yPiBOT19FUlJPUlMgPSA8QW5hbHlzaXNFcnJvcj5bXTsKIAotICAvKioKLSAgICogQSBbQ29tcGFyYXRvcl0gdGhhdCBzb3J0cyBieSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHRoZSBbQW5hbHlzaXNFcnJvcl0KLSAgICogd2FzIGZvdW5kLgotICAgKi8KKyAgLy8vIEEgW0NvbXBhcmF0b3JdIHRoYXQgc29ydHMgYnkgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB0aGUgW0FuYWx5c2lzRXJyb3JdCisgIC8vLyB3YXMgZm91bmQuCiAgIHN0YXRpYyBDb21wYXJhdG9yPEFuYWx5c2lzRXJyb3I+IEZJTEVfQ09NUEFSQVRPUiA9CiAgICAgICAoQW5hbHlzaXNFcnJvciBvMSwgQW5hbHlzaXNFcnJvciBvMikgPT4KICAgICAgICAgICBvMS5zb3VyY2Uuc2hvcnROYW1lLmNvbXBhcmVUbyhvMi5zb3VyY2Uuc2hvcnROYW1lKTsKIAotICAvKioKLSAgICogQSBbQ29tcGFyYXRvcl0gdGhhdCBzb3J0cyBlcnJvciBjb2RlcyBmaXJzdCBieSB0aGVpciBzZXZlcml0eSAoZXJyb3JzCi0gICAqIGZpcnN0LCB3YXJuaW5ncyBzZWNvbmQpLCBhbmQgdGhlbiBieSB0aGUgZXJyb3IgY29kZSB0eXBlLgotICAgKi8KKyAgLy8vIEEgW0NvbXBhcmF0b3JdIHRoYXQgc29ydHMgZXJyb3IgY29kZXMgZmlyc3QgYnkgdGhlaXIgc2V2ZXJpdHkgKGVycm9ycworICAvLy8gZmlyc3QsIHdhcm5pbmdzIHNlY29uZCksIGFuZCB0aGVuIGJ5IHRoZSBlcnJvciBjb2RlIHR5cGUuCiAgIHN0YXRpYyBDb21wYXJhdG9yPEFuYWx5c2lzRXJyb3I+IEVSUk9SX0NPREVfQ09NUEFSQVRPUiA9CiAgICAgICAoQW5hbHlzaXNFcnJvciBvMSwgQW5hbHlzaXNFcnJvciBvMikgewogICAgIEVycm9yQ29kZSBlcnJvckNvZGUxID0gbzEuZXJyb3JDb2RlOwpAQCAtOTAyLDQwICs4OTAsMjggQEAKICAgICB9CiAgIH07CiAKLSAgLyoqCi0gICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0gICAqLworICAvLy8gVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4KICAgZmluYWwgRXJyb3JDb2RlIGVycm9yQ29kZTsKIAotICAvKioKLSAgICogVGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgcHJvYmxlbS4KLSAgICovCisgIC8vLyBUaGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLgogICBEaWFnbm9zdGljTWVzc2FnZSBfcHJvYmxlbU1lc3NhZ2U7CiAKLSAgLyoqCi0gICAqIFRoZSBjb250ZXh0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvYmxlbS4gVGhpcyBsaXN0IHdpbGwgYmUgZW1wdHkKLSAgICogaWYgdGhlcmUgYXJlIG5vIGNvbnRleHQgbWVzc2FnZXMuCi0gICAqLworICAvLy8gVGhlIGNvbnRleHQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9ibGVtLiBUaGlzIGxpc3Qgd2lsbCBiZSBlbXB0eQorICAvLy8gaWYgdGhlcmUgYXJlIG5vIGNvbnRleHQgbWVzc2FnZXMuCiAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IF9jb250ZXh0TWVzc2FnZXM7CiAKLSAgLyoqCi0gICAqIFRoZSBjb3JyZWN0aW9uIHRvIGJlIGRpc3BsYXllZCBmb3IgdGhpcyBlcnJvciwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vCi0gICAqIGNvcnJlY3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgZXJyb3IuCi0gICAqLworICAvLy8gVGhlIGNvcnJlY3Rpb24gdG8gYmUgZGlzcGxheWVkIGZvciB0aGlzIGVycm9yLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8KKyAgLy8vIGNvcnJlY3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgZXJyb3IuCiAgIFN0cmluZyBfY29ycmVjdGlvbjsKIAotICAvKioKLSAgICogVGhlIHNvdXJjZSBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQsIG9yIGBudWxsYCBpZiB1bmtub3duLgotICAgKi8KKyAgLy8vIFRoZSBzb3VyY2UgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLCBvciBgbnVsbGAgaWYgdW5rbm93bi4KICAgZmluYWwgU291cmNlIHNvdXJjZTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgYW5hbHlzaXMgZXJyb3IuIFRoZSBlcnJvciBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAqIGdpdmVuIFtzb3VyY2VdIGFuZCBpcyBsb2NhdGVkIGF0IHRoZSBnaXZlbiBbb2Zmc2V0XSB3aXRoIHRoZSBnaXZlbgotICAgKiBbbGVuZ3RoXS4gVGhlIGVycm9yIHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gW2Vycm9yQ29kZV0gYW5kIHRoZSBsaXN0IG9mCi0gICAqIFthcmd1bWVudHNdIHdpbGwgYmUgdXNlZCB0byBjb21wbGV0ZSB0aGUgbWVzc2FnZSBhbmQgY29ycmVjdGlvbi4gSWYgYW55Ci0gICAqIFtjb250ZXh0TWVzc2FnZXNdIGFyZSBwcm92aWRlZCwgdGhleSB3aWxsIGJlIHJlY29yZGVkIHdpdGggdGhlIGVycm9yLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGFuYWx5c2lzIGVycm9yLiBUaGUgZXJyb3IgaXMgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gW3NvdXJjZV0gYW5kIGlzIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIFtvZmZzZXRdIHdpdGggdGhlIGdpdmVuCisgIC8vLyBbbGVuZ3RoXS4gVGhlIGVycm9yIHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gW2Vycm9yQ29kZV0gYW5kIHRoZSBsaXN0IG9mCisgIC8vLyBbYXJndW1lbnRzXSB3aWxsIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlIG1lc3NhZ2UgYW5kIGNvcnJlY3Rpb24uIElmIGFueQorICAvLy8gW2NvbnRleHRNZXNzYWdlc10gYXJlIHByb3ZpZGVkLCB0aGV5IHdpbGwgYmUgcmVjb3JkZWQgd2l0aCB0aGUgZXJyb3IuCiAgIEFuYWx5c2lzRXJyb3IodGhpcy5zb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIHRoaXMuZXJyb3JDb2RlLAogICAgICAgW0xpc3Q8T2JqZWN0PiBhcmd1bWVudHMsCiAgICAgICBMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBjb250ZXh0TWVzc2FnZXMgPSBjb25zdCBbXV0pIHsKQEAgLTk1Miw5ICs5MjgsNyBAQAogICAgIF9jb250ZXh0TWVzc2FnZXMgPSBjb250ZXh0TWVzc2FnZXM7CiAgIH0KIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgYW5hbHlzaXMgZXJyb3Igd2l0aCBnaXZlbiB2YWx1ZXMuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgYW5hbHlzaXMgZXJyb3Igd2l0aCBnaXZlbiB2YWx1ZXMuCiAgIEFuYWx5c2lzRXJyb3IuZm9yVmFsdWVzKHRoaXMuc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCB0aGlzLmVycm9yQ29kZSwKICAgICAgIFN0cmluZyBtZXNzYWdlLCB0aGlzLl9jb3JyZWN0aW9uLAogICAgICAge0xpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IGNvbnRleHRNZXNzYWdlcyA9IGNvbnN0IFtdfSkgewpAQCAtOTY5LDExICs5NDMsOSBAQAogICBAb3ZlcnJpZGUKICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gZ2V0IGNvbnRleHRNZXNzYWdlcyA9PiBfY29udGV4dE1lc3NhZ2VzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0aW9uIHRvIGJlIGRpc3BsYXllZCBmb3IgdGhpcwotICAgKiBlcnJvciwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGNvcnJlY3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgZXJyb3IuIFRoZQotICAgKiBjb3JyZWN0aW9uIHNob3VsZCBpbmRpY2F0ZSBob3cgdGhlIHVzZXIgY2FuIGZpeCB0aGUgZXJyb3IuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB0ZW1wbGF0ZSB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ycmVjdGlvbiB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMKKyAgLy8vIGVycm9yLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gY29ycmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlcnJvci4gVGhlCisgIC8vLyBjb3JyZWN0aW9uIHNob3VsZCBpbmRpY2F0ZSBob3cgdGhlIHVzZXIgY2FuIGZpeCB0aGUgZXJyb3IuCiAgIFN0cmluZyBnZXQgY29ycmVjdGlvbiA9PiBfY29ycmVjdGlvbjsKIAogICBAb3ZlcnJpZGUKQEAgLTk4NywyMiArOTU5LDE2IEBACiAgICAgcmV0dXJuIGhhc2hDb2RlOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgc291cmNlIHdoaWNoCi0gICAqIGVuY29tcGFzc2VzIHRoZSBjb21waWxhdGlvbiBlcnJvci4KLSAgICovCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgb2Zmc2V0IHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSB3aGljaAorICAvLy8gZW5jb21wYXNzZXMgdGhlIGNvbXBpbGF0aW9uIGVycm9yLgogICBpbnQgZ2V0IGxlbmd0aCA9PiBfcHJvYmxlbU1lc3NhZ2UubGVuZ3RoOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGZvciB0aGlzIGVycm9yLiBUaGUgbWVzc2FnZSBzaG91bGQKLSAgICogaW5kaWNhdGUgd2hhdCBpcyB3cm9uZyBhbmQgd2h5IGl0IGlzIHdyb25nLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMgZXJyb3IuIFRoZSBtZXNzYWdlIHNob3VsZAorICAvLy8gaW5kaWNhdGUgd2hhdCBpcyB3cm9uZyBhbmQgd2h5IGl0IGlzIHdyb25nLgogICBTdHJpbmcgZ2V0IG1lc3NhZ2UgPT4gX3Byb2JsZW1NZXNzYWdlLm1lc3NhZ2U7CiAKLSAgLyoqCi0gICAqIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc291cmNlICh6ZXJvIGJhc2VkKSB3aGVyZQotICAgKiB0aGUgZXJyb3Igb2NjdXJyZWQuCi0gICAqLworICAvLy8gVGhlIGNoYXJhY3RlciBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UgKHplcm8gYmFzZWQpIHdoZXJlCisgIC8vLyB0aGUgZXJyb3Igb2NjdXJyZWQuCiAgIGludCBnZXQgb2Zmc2V0ID0+IF9wcm9ibGVtTWVzc2FnZS5vZmZzZXQ7CiAKICAgQG92ZXJyaWRlCkBAIC0xMDYzLDEwICsxMDI5LDggQEAKICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgIH0KIAotICAvKioKLSAgICogTWVyZ2UgYWxsIG9mIHRoZSBlcnJvcnMgaW4gdGhlIGxpc3RzIGluIHRoZSBnaXZlbiBsaXN0IG9mIFtlcnJvckxpc3RzXSBpbnRvCi0gICAqIGEgc2luZ2xlIGxpc3Qgb2YgZXJyb3JzLgotICAgKi8KKyAgLy8vIE1lcmdlIGFsbCBvZiB0aGUgZXJyb3JzIGluIHRoZSBsaXN0cyBpbiB0aGUgZ2l2ZW4gbGlzdCBvZiBbZXJyb3JMaXN0c10KKyAgLy8vIGludG8gYSBzaW5nbGUgbGlzdCBvZiBlcnJvcnMuCiAgIHN0YXRpYyBMaXN0PEFuYWx5c2lzRXJyb3I+IG1lcmdlTGlzdHMoTGlzdDxMaXN0PEFuYWx5c2lzRXJyb3I+PiBlcnJvckxpc3RzKSB7CiAgICAgU2V0PEFuYWx5c2lzRXJyb3I+IGVycm9ycyA9IEhhc2hTZXQ8QW5hbHlzaXNFcnJvcj4oKTsKICAgICBmb3IgKExpc3Q8QW5hbHlzaXNFcnJvcj4gZXJyb3JMaXN0IGluIGVycm9yTGlzdHMpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZXJyb3IvbGlzdGVuZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvZXJyb3IvbGlzdGVuZXIuZGFydAppbmRleCA5NzU0NDA4Li5lOTU1NDhmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL2Vycm9yL2xpc3RlbmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9lcnJvci9saXN0ZW5lci5kYXJ0CkBAIC0xNiwzNiArMTYsMjQgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpzb3VyY2Vfc3Bhbi9zb3VyY2Vfc3Bhbi5kYXJ0JzsKIAotLyoqCi0gKiBBbiBvYmplY3QgdGhhdCBsaXN0ZW4gZm9yIFtBbmFseXNpc0Vycm9yXXMgYmVpbmcgcHJvZHVjZWQgYnkgdGhlIGFuYWx5c2lzCi0gKiBlbmdpbmUuCi0gKi8KKy8vLyBBbiBvYmplY3QgdGhhdCBsaXN0ZW4gZm9yIFtBbmFseXNpc0Vycm9yXXMgYmVpbmcgcHJvZHVjZWQgYnkgdGhlIGFuYWx5c2lzCisvLy8gZW5naW5lLgogYWJzdHJhY3QgY2xhc3MgQW5hbHlzaXNFcnJvckxpc3RlbmVyIHsKLSAgLyoqCi0gICAqIEFuIGVycm9yIGxpc3RlbmVyIHRoYXQgaWdub3JlcyBlcnJvcnMgdGhhdCBhcmUgcmVwb3J0ZWQgdG8gaXQuCi0gICAqLworICAvLy8gQW4gZXJyb3IgbGlzdGVuZXIgdGhhdCBpZ25vcmVzIGVycm9ycyB0aGF0IGFyZSByZXBvcnRlZCB0byBpdC4KICAgc3RhdGljIGZpbmFsIEFuYWx5c2lzRXJyb3JMaXN0ZW5lciBOVUxMX0xJU1RFTkVSID0gX051bGxFcnJvckxpc3RlbmVyKCk7CiAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBhbiBbZXJyb3JdIGhhcyBiZWVuIGZvdW5kIGJ5IHRoZSBhbmFseXNpcwotICAgKiBlbmdpbmUuCi0gICAqLworICAvLy8gVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIGFuIFtlcnJvcl0gaGFzIGJlZW4gZm91bmQgYnkgdGhlIGFuYWx5c2lzCisgIC8vLyBlbmdpbmUuCiAgIHZvaWQgb25FcnJvcihBbmFseXNpc0Vycm9yIGVycm9yKTsKIH0KIAotLyoqCi0gKiBBbiBbQW5hbHlzaXNFcnJvckxpc3RlbmVyXSB0aGF0IGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgYW55IGVycm9yIGhhcyBiZWVuCi0gKiByZXBvcnRlZCB0byBpdC4KLSAqLworLy8vIEFuIFtBbmFseXNpc0Vycm9yTGlzdGVuZXJdIHRoYXQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhbnkgZXJyb3IgaGFzIGJlZW4KKy8vLyByZXBvcnRlZCB0byBpdC4KIGNsYXNzIEJvb2xlYW5FcnJvckxpc3RlbmVyIGltcGxlbWVudHMgQW5hbHlzaXNFcnJvckxpc3RlbmVyIHsKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhpcyBsaXN0ZW5lci4KLSAgICovCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGVycm9yIGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoaXMgbGlzdGVuZXIuCiAgIGJvb2wgX2Vycm9yUmVwb3J0ZWQgPSBmYWxzZTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiBhbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGlzIGxpc3RlbmVyLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgYW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gdGhpcyBsaXN0ZW5lci4KICAgYm9vbCBnZXQgZXJyb3JSZXBvcnRlZCA9PiBfZXJyb3JSZXBvcnRlZDsKIAogICBAb3ZlcnJpZGUKQEAgLTU0LDM2ICs0MiwyNCBAQAogICB9CiB9CiAKLS8qKgotICogQW4gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIGFuYWx5c2lzIGVycm9ycyBhbmQgcmVwb3J0IHRoZW4gdG8gYW4gZXJyb3IKLSAqIGxpc3RlbmVyLgotICovCisvLy8gQW4gb2JqZWN0IHVzZWQgdG8gY3JlYXRlIGFuYWx5c2lzIGVycm9ycyBhbmQgcmVwb3J0IHRoZW4gdG8gYW4gZXJyb3IKKy8vLyBsaXN0ZW5lci4KIGNsYXNzIEVycm9yUmVwb3J0ZXIgewotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkLgotICAgKi8KKyAgLy8vIFRoZSBlcnJvciBsaXN0ZW5lciB0byB3aGljaCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KICAgZmluYWwgQW5hbHlzaXNFcnJvckxpc3RlbmVyIF9lcnJvckxpc3RlbmVyOwogCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBzb3VyY2UgdG8gYmUgdXNlZCB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCi0gICAqLworICAvLy8gVGhlIGRlZmF1bHQgc291cmNlIHRvIGJlIHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICBmaW5hbCBTb3VyY2UgX2RlZmF1bHRTb3VyY2U7CiAKLSAgLyoqCi0gICAqIElzIGB0cnVlYCBpZiB0aGUgbGlicmFyeSBiZWluZyBhbmFseXplZCBpcyBub24tbnVsbGFibGUgYnkgZGVmYXVsdC4KLSAgICovCisgIC8vLyBJcyBgdHJ1ZWAgaWYgdGhlIGxpYnJhcnkgYmVpbmcgYW5hbHl6ZWQgaXMgbm9uLW51bGxhYmxlIGJ5IGRlZmF1bHQuCiAgIGZpbmFsIGJvb2wgaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDsKIAotICAvKioKLSAgICogVGhlIHNvdXJjZSB0byBiZSB1c2VkIHdoZW4gcmVwb3J0aW5nIGVycm9ycy4KLSAgICovCisgIC8vLyBUaGUgc291cmNlIHRvIGJlIHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICBTb3VyY2UgX3NvdXJjZTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZXJyb3IgcmVwb3J0ZXIgdGhhdCB3aWxsIHJlcG9ydCBlcnJvcnMgdG8gdGhlCi0gICAqIGdpdmVuIFtfZXJyb3JMaXN0ZW5lcl0uIEVycm9ycyB3aWxsIGJlIHJlcG9ydGVkIGFnYWluc3QgdGhlCi0gICAqIFtfZGVmYXVsdFNvdXJjZV0gdW5sZXNzIGFub3RoZXIgc291cmNlIGlzIHByb3ZpZGVkIGxhdGVyLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVycm9yIHJlcG9ydGVyIHRoYXQgd2lsbCByZXBvcnQgZXJyb3JzIHRvIHRoZQorICAvLy8gZ2l2ZW4gW19lcnJvckxpc3RlbmVyXS4gRXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQgYWdhaW5zdCB0aGUKKyAgLy8vIFtfZGVmYXVsdFNvdXJjZV0gdW5sZXNzIGFub3RoZXIgc291cmNlIGlzIHByb3ZpZGVkIGxhdGVyLgogICBFcnJvclJlcG9ydGVyKHRoaXMuX2Vycm9yTGlzdGVuZXIsIHRoaXMuX2RlZmF1bHRTb3VyY2UsCiAgICAgICB7dGhpcy5pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0gZmFsc2V9KSB7CiAgICAgaWYgKF9lcnJvckxpc3RlbmVyID09IG51bGwpIHsKQEAgLTk2LDI2ICs3MiwyMCBAQAogCiAgIFNvdXJjZSBnZXQgc291cmNlID0+IF9zb3VyY2U7CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgc291cmNlIHRvIGJlIHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3JzIHRvIHRoZSBnaXZlbiBbc291cmNlXS4KLSAgICogU2V0dGluZyB0aGUgc291cmNlIHRvIGBudWxsYCB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IHNvdXJjZSB0byBiZSB1c2VkLgotICAgKi8KKyAgLy8vIFNldCB0aGUgc291cmNlIHRvIGJlIHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3JzIHRvIHRoZSBnaXZlbiBbc291cmNlXS4KKyAgLy8vIFNldHRpbmcgdGhlIHNvdXJjZSB0byBgbnVsbGAgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBzb3VyY2UgdG8gYmUgdXNlZC4KICAgQERlcHJlY2F0ZWQoJ0NyZWF0ZSBzZXBhcmF0ZSByZXBvcnRlcnMgZm9yIHNlcGFyYXRlIGZpbGVzJykKICAgc2V0IHNvdXJjZShTb3VyY2Ugc291cmNlKSB7CiAgICAgdGhpcy5fc291cmNlID0gc291cmNlID8/IF9kZWZhdWx0U291cmNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgZ2l2ZW4gW2Vycm9yXS4KLSAgICovCisgIC8vLyBSZXBvcnQgdGhlIGdpdmVuIFtlcnJvcl0uCiAgIHZvaWQgcmVwb3J0RXJyb3IoQW5hbHlzaXNFcnJvciBlcnJvcikgewogICAgIF9lcnJvckxpc3RlbmVyLm9uRXJyb3IoZXJyb3IpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlcG9ydCBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBbZXJyb3JDb2RlXSBhbmQgW2FyZ3VtZW50c10uIFRoZSBbZWxlbWVudF0KLSAgICogaXMgdXNlZCB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqLworICAvLy8gUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIFtlbGVtZW50XQorICAvLy8gaXMgdXNlZCB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCiAgIHZvaWQgcmVwb3J0RXJyb3JGb3JFbGVtZW50KEVycm9yQ29kZSBlcnJvckNvZGUsIEVsZW1lbnQgZWxlbWVudCwKICAgICAgIFtMaXN0PE9iamVjdD4gYXJndW1lbnRzXSkgewogICAgIHJlcG9ydEVycm9yRm9yT2Zmc2V0KApAQCAtMTM4LDE5ICsxMDgsMTUgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4KLSAgICogVGhlIFtub2RlXSBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICovCisgIC8vLyBSZXBvcnQgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gW2Vycm9yQ29kZV0gYW5kIFthcmd1bWVudHNdLgorICAvLy8gVGhlIFtub2RlXSBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KICAgdm9pZCByZXBvcnRFcnJvckZvck5vZGUoRXJyb3JDb2RlIGVycm9yQ29kZSwgQXN0Tm9kZSBub2RlLAogICAgICAgW0xpc3Q8T2JqZWN0PiBhcmd1bWVudHNdKSB7CiAgICAgcmVwb3J0RXJyb3JGb3JPZmZzZXQoZXJyb3JDb2RlLCBub2RlLm9mZnNldCwgbm9kZS5sZW5ndGgsIGFyZ3VtZW50cyk7CiAgIH0KIAotICAvKioKLSAgICogUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIGxvY2F0aW9uIG9mCi0gICAqIHRoZSBlcnJvciBpcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFtvZmZzZXRdIGFuZCBbbGVuZ3RoXS4KLSAgICovCisgIC8vLyBSZXBvcnQgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gW2Vycm9yQ29kZV0gYW5kIFthcmd1bWVudHNdLiBUaGUgbG9jYXRpb24KKyAgLy8vIG9mIHRoZSBlcnJvciBpcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFtvZmZzZXRdIGFuZCBbbGVuZ3RoXS4KICAgdm9pZCByZXBvcnRFcnJvckZvck9mZnNldChFcnJvckNvZGUgZXJyb3JDb2RlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAogICAgICAgW0xpc3Q8T2JqZWN0PiBhcmd1bWVudHNdKSB7CiAgICAgX2NvbnZlcnRFbGVtZW50cyhhcmd1bWVudHMpOwpAQCAtMTU5LDQ1ICsxMjUsMzcgQEAKICAgICAgICAgQW5hbHlzaXNFcnJvcihfc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgZXJyb3JDb2RlLCBhcmd1bWVudHMsIG1lc3NhZ2VzKSk7CiAgIH0KIAotICAvKioKLSAgICogUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIGxvY2F0aW9uIG9mCi0gICAqIHRoZSBlcnJvciBpcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFtzcGFuXS4KLSAgICovCisgIC8vLyBSZXBvcnQgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gW2Vycm9yQ29kZV0gYW5kIFthcmd1bWVudHNdLiBUaGUgbG9jYXRpb24KKyAgLy8vIG9mIHRoZSBlcnJvciBpcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFtzcGFuXS4KICAgdm9pZCByZXBvcnRFcnJvckZvclNwYW4oRXJyb3JDb2RlIGVycm9yQ29kZSwgU291cmNlU3BhbiBzcGFuLAogICAgICAgW0xpc3Q8T2JqZWN0PiBhcmd1bWVudHNdKSB7CiAgICAgcmVwb3J0RXJyb3JGb3JPZmZzZXQoZXJyb3JDb2RlLCBzcGFuLnN0YXJ0Lm9mZnNldCwgc3Bhbi5sZW5ndGgsIGFyZ3VtZW50cyk7CiAgIH0KIAotICAvKioKLSAgICogUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIFt0b2tlbl0gaXMKLSAgICogdXNlZCB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqLworICAvLy8gUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIFt0b2tlbl0gaXMKKyAgLy8vIHVzZWQgdG8gY29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgogICB2b2lkIHJlcG9ydEVycm9yRm9yVG9rZW4oRXJyb3JDb2RlIGVycm9yQ29kZSwgVG9rZW4gdG9rZW4sCiAgICAgICBbTGlzdDxPYmplY3Q+IGFyZ3VtZW50c10pIHsKICAgICByZXBvcnRFcnJvckZvck9mZnNldChlcnJvckNvZGUsIHRva2VuLm9mZnNldCwgdG9rZW4ubGVuZ3RoLCBhcmd1bWVudHMpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlcG9ydCBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBbZXJyb3JDb2RlXSBhbmQgW21lc3NhZ2VdLiBUaGUgbG9jYXRpb24gb2YKLSAgICogdGhlIGVycm9yIGlzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gW29mZnNldF0gYW5kIFtsZW5ndGhdLgotICAgKi8KKyAgLy8vIFJlcG9ydCBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBbZXJyb3JDb2RlXSBhbmQgW21lc3NhZ2VdLiBUaGUgbG9jYXRpb24gb2YKKyAgLy8vIHRoZSBlcnJvciBpcyBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFtvZmZzZXRdIGFuZCBbbGVuZ3RoXS4KICAgdm9pZCByZXBvcnRFcnJvck1lc3NhZ2UoCiAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICBfZXJyb3JMaXN0ZW5lci5vbkVycm9yKEFuYWx5c2lzRXJyb3IuZm9yVmFsdWVzKAogICAgICAgICBfc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgZXJyb3JDb2RlLCBtZXNzYWdlLm1lc3NhZ2UsIG1lc3NhZ2UudGlwKSk7CiAgIH0KIAotICAvKioKLSAgICogUmVwb3J0IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIFtlcnJvckNvZGVdIGFuZCBbYXJndW1lbnRzXS4gVGhlIFtub2RlXSBpcwotICAgKiB1c2VkIHRvIGNvbXB1dGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4gVGhlIGFyZ3VtZW50cyBhcmUgZXhwZWN0ZWQgdG8KLSAgICogY29udGFpbiB0d28gb3IgbW9yZSB0eXBlcy4gQ29udmVydCB0aGUgdHlwZXMgaW50byBzdHJpbmdzIGJ5IHVzaW5nIHRoZQotICAgKiBkaXNwbGF5IG5hbWVzIG9mIHRoZSB0eXBlcywgdW5sZXNzIHRoZXJlIGFyZSB0d28gb3IgbW9yZSB0eXBlcyB3aXRoIHRoZQotICAgKiBzYW1lIG5hbWVzLCBpbiB3aGljaCBjYXNlIHRoZSBleHRlbmRlZCBkaXNwbGF5IG5hbWVzIG9mIHRoZSB0eXBlcyB3aWxsIGJlCi0gICAqIHVzZWQgaW4gb3JkZXIgdG8gY2xhcmlmeSB0aGUgbWVzc2FnZS4KLSAgICoKLSAgICogSWYgdGhlcmUgYXJlIG5vdCB0d28gb3IgbW9yZSB0eXBlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgdGhlIG1ldGhvZAotICAgKiBbcmVwb3J0RXJyb3JGb3JOb2RlXSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotICAgKi8KKyAgLy8vIFJlcG9ydCBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBbZXJyb3JDb2RlXSBhbmQgW2FyZ3VtZW50c10uIFRoZSBbbm9kZV0gaXMKKyAgLy8vIHVzZWQgdG8gY29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLiBUaGUgYXJndW1lbnRzIGFyZSBleHBlY3RlZCB0bworICAvLy8gY29udGFpbiB0d28gb3IgbW9yZSB0eXBlcy4gQ29udmVydCB0aGUgdHlwZXMgaW50byBzdHJpbmdzIGJ5IHVzaW5nIHRoZQorICAvLy8gZGlzcGxheSBuYW1lcyBvZiB0aGUgdHlwZXMsIHVubGVzcyB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgdHlwZXMgd2l0aCB0aGUKKyAgLy8vIHNhbWUgbmFtZXMsIGluIHdoaWNoIGNhc2UgdGhlIGV4dGVuZGVkIGRpc3BsYXkgbmFtZXMgb2YgdGhlIHR5cGVzIHdpbGwgYmUKKyAgLy8vIHVzZWQgaW4gb3JkZXIgdG8gY2xhcmlmeSB0aGUgbWVzc2FnZS4KKyAgLy8vCisgIC8vLyBJZiB0aGVyZSBhcmUgbm90IHR3byBvciBtb3JlIHR5cGVzIGluIHRoZSBhcmd1bWVudCBsaXN0LCB0aGUgbWV0aG9kCisgIC8vLyBbcmVwb3J0RXJyb3JGb3JOb2RlXSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogICBARGVwcmVjYXRlZCgnVXNlIHJlcG9ydEVycm9yRm9yTm9kZSgpLCBpdCB3aWxsIGNvbnZlcnQgdHlwZXMgYXMgd2VsbCcpCiAgIHZvaWQgcmVwb3J0VHlwZUVycm9yRm9yTm9kZSgKICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsIEFzdE5vZGUgbm9kZSwgTGlzdDxPYmplY3Q+IGFyZ3VtZW50cykgewpAQCAtMjIwLDEzICsxNzgsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogR2l2ZW4gYW4gYXJyYXkgb2YgW2FyZ3VtZW50c10gdGhhdCBpcyBleHBlY3RlZCB0byBjb250YWluIHR3byBvciBtb3JlCi0gICAqIHR5cGVzLCBjb252ZXJ0IHRoZSB0eXBlcyBpbnRvIHN0cmluZ3MgYnkgdXNpbmcgdGhlIGRpc3BsYXkgbmFtZXMgb2YgdGhlCi0gICAqIHR5cGVzLCB1bmxlc3MgdGhlcmUgYXJlIHR3byBvciBtb3JlIHR5cGVzIHdpdGggdGhlIHNhbWUgbmFtZXMsIGluIHdoaWNoCi0gICAqIGNhc2UgdGhlIGV4dGVuZGVkIGRpc3BsYXkgbmFtZXMgb2YgdGhlIHR5cGVzIHdpbGwgYmUgdXNlZCBpbiBvcmRlciB0bwotICAgKiBjbGFyaWZ5IHRoZSBtZXNzYWdlLgotICAgKi8KKyAgLy8vIEdpdmVuIGFuIGFycmF5IG9mIFthcmd1bWVudHNdIHRoYXQgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiB0d28gb3IgbW9yZQorICAvLy8gdHlwZXMsIGNvbnZlcnQgdGhlIHR5cGVzIGludG8gc3RyaW5ncyBieSB1c2luZyB0aGUgZGlzcGxheSBuYW1lcyBvZiB0aGUKKyAgLy8vIHR5cGVzLCB1bmxlc3MgdGhlcmUgYXJlIHR3byBvciBtb3JlIHR5cGVzIHdpdGggdGhlIHNhbWUgbmFtZXMsIGluIHdoaWNoCisgIC8vLyBjYXNlIHRoZSBleHRlbmRlZCBkaXNwbGF5IG5hbWVzIG9mIHRoZSB0eXBlcyB3aWxsIGJlIHVzZWQgaW4gb3JkZXIgdG8KKyAgLy8vIGNsYXJpZnkgdGhlIG1lc3NhZ2UuCiAgIExpc3Q8RGlhZ25vc3RpY01lc3NhZ2U+IF9jb252ZXJ0VHlwZU5hbWVzKExpc3Q8T2JqZWN0PiBhcmd1bWVudHMpIHsKICAgICB2YXIgbWVzc2FnZXMgPSA8RGlhZ25vc3RpY01lc3NhZ2U+W107CiAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CkBAIC0yOTUsMTYgKzI1MSwxMiBAQAogICB9CiB9CiAKLS8qKgotICogQW4gZXJyb3IgbGlzdGVuZXIgdGhhdCB3aWxsIHJlY29yZCB0aGUgZXJyb3JzIHRoYXQgYXJlIHJlcG9ydGVkIHRvIGl0IGluIGEKLSAqIHdheSB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciBjYWNoaW5nIHRob3NlIGVycm9ycyB3aXRoaW4gYW4gYW5hbHlzaXMgY29udGV4dC4KLSAqLworLy8vIEFuIGVycm9yIGxpc3RlbmVyIHRoYXQgd2lsbCByZWNvcmQgdGhlIGVycm9ycyB0aGF0IGFyZSByZXBvcnRlZCB0byBpdCBpbiBhCisvLy8gd2F5IHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIGNhY2hpbmcgdGhvc2UgZXJyb3JzIHdpdGhpbiBhbiBhbmFseXNpcyBjb250ZXh0LgogY2xhc3MgUmVjb3JkaW5nRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIEFuYWx5c2lzRXJyb3JMaXN0ZW5lciB7CiAgIFNldDxBbmFseXNpc0Vycm9yPiBfZXJyb3JzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVycm9ycyBjb2xsZWN0ZWQgYnkgdGhlIGxpc3RlbmVyLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZXJyb3JzIGNvbGxlY3RlZCBieSB0aGUgbGlzdGVuZXIuCiAgIExpc3Q8QW5hbHlzaXNFcnJvcj4gZ2V0IGVycm9ycyB7CiAgICAgaWYgKF9lcnJvcnMgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIGNvbnN0IDxBbmFseXNpc0Vycm9yPltdOwpAQCAtMzEyLDkgKzI2NCw3IEBACiAgICAgcmV0dXJuIF9lcnJvcnMudG9MaXN0KCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlcnJvcnMgY29sbGVjdGVkIGJ5IHRoZSBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIFtzb3VyY2VdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZXJyb3JzIGNvbGxlY3RlZCBieSB0aGUgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBbc291cmNlXS4KICAgTGlzdDxBbmFseXNpc0Vycm9yPiBnZXRFcnJvcnNGb3JTb3VyY2UoU291cmNlIHNvdXJjZSkgewogICAgIGlmIChfZXJyb3JzID09IG51bGwpIHsKICAgICAgIHJldHVybiBjb25zdCA8QW5hbHlzaXNFcnJvcj5bXTsKQEAgLTMyOSw5ICsyNzksNyBAQAogICB9CiB9CiAKLS8qKgotICogQW4gW0FuYWx5c2lzRXJyb3JMaXN0ZW5lcl0gdGhhdCBpZ25vcmVzIGVycm9yLgotICovCisvLy8gQW4gW0FuYWx5c2lzRXJyb3JMaXN0ZW5lcl0gdGhhdCBpZ25vcmVzIGVycm9yLgogY2xhc3MgX051bGxFcnJvckxpc3RlbmVyIGltcGxlbWVudHMgQW5hbHlzaXNFcnJvckxpc3RlbmVyIHsKICAgQG92ZXJyaWRlCiAgIHZvaWQgb25FcnJvcihBbmFseXNpc0Vycm9yIGV2ZW50KSB7CkBAIC0zMzksMTAgKzI4Nyw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBVc2VkIGJ5IGBFcnJvclJlcG9ydGVyLl9jb252ZXJ0VHlwZU5hbWVzYCB0byBrZWVwIHRyYWNrIG9mIGEgdHlwZSB0aGF0IGlzCi0gKiBiZWluZyBjb252ZXJ0ZWQuCi0gKi8KKy8vLyBVc2VkIGJ5IGBFcnJvclJlcG9ydGVyLl9jb252ZXJ0VHlwZU5hbWVzYCB0byBrZWVwIHRyYWNrIG9mIGEgdHlwZSB0aGF0IGlzCisvLy8gYmVpbmcgY29udmVydGVkLgogY2xhc3MgX1R5cGVUb0NvbnZlcnQgewogICBmaW5hbCBpbnQgaW5kZXg7CiAgIGZpbmFsIERhcnRUeXBlIHR5cGU7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2V4Y2VwdGlvbi9leGNlcHRpb24uZGFydCBiL3BrZy9hbmFseXplci9saWIvZXhjZXB0aW9uL2V4Y2VwdGlvbi5kYXJ0CmluZGV4IGQwMGM5NjcuLjZhMmJkNmMgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvZXhjZXB0aW9uL2V4Y2VwdGlvbi5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvZXhjZXB0aW9uL2V4Y2VwdGlvbi5kYXJ0CkBAIC0yLDI1ICsyLDE3IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLyoqCi0gKiBBbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGFuYWx5c2lzIG9mIG9uZSBvciBtb3JlIHNvdXJjZXMuCi0gKi8KKy8vLyBBbiBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGFuYWx5c2lzIG9mIG9uZSBvciBtb3JlIHNvdXJjZXMuCiBjbGFzcyBBbmFseXNpc0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0aGF0IGV4cGxhaW5zIHdoeSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLgotICAgKi8KKyAgLy8vIFRoZSBtZXNzYWdlIHRoYXQgZXhwbGFpbnMgd2h5IHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCiAgIGZpbmFsIFN0cmluZyBtZXNzYWdlOwogCi0gIC8qKgotICAgKiBUaGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBvciBgbnVsbGAgaWYgdGhpcyBleGNlcHRpb24gd2FzCi0gICAqIG5vdCBjYXVzZWQgYnkgYW5vdGhlciBleGNlcHRpb24uCi0gICAqLworICAvLy8gVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiwgb3IgYG51bGxgIGlmIHRoaXMgZXhjZXB0aW9uIHdhcworICAvLy8gbm90IGNhdXNlZCBieSBhbm90aGVyIGV4Y2VwdGlvbi4KICAgZmluYWwgQ2F1Z2h0RXhjZXB0aW9uIGNhdXNlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBleGNlcHRpb24gdG8gaGF2ZSB0aGUgZ2l2ZW4gW21lc3NhZ2VdIGFuZAotICAgKiBbY2F1c2VdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGV4Y2VwdGlvbiB0byBoYXZlIHRoZSBnaXZlbiBbbWVzc2FnZV0gYW5kCisgIC8vLyBbY2F1c2VdLgogICBBbmFseXNpc0V4Y2VwdGlvbihbdGhpcy5tZXNzYWdlID0gJ0V4Y2VwdGlvbicsIHRoaXMuY2F1c2VdKTsKIAogICBAb3ZlcnJpZGUKQEAgLTM2LDQ1ICsyOCwzMSBAQAogICB9CiB9CiAKLS8qKgotICogQW4gZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodCBhbmQgaGFzIGFuIGFzc29jaWF0ZWQgc3RhY2sgdHJhY2UuCi0gKi8KKy8vLyBBbiBleGNlcHRpb24gdGhhdCB3YXMgY2F1Z2h0IGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBzdGFjayB0cmFjZS4KIGNsYXNzIENhdWdodEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7Ci0gIC8qKgotICAgKiBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodC4KLSAgICovCisgIC8vLyBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIGNhdWdodC4KICAgZmluYWwgT2JqZWN0IGV4Y2VwdGlvbjsKIAotICAvKioKLSAgICogVGhlIG1lc3NhZ2UgZGVzY3JpYmluZyB3aGVyZS9ob3cvd2h5IHRoaXMgd2FzIGNhdWdodC4KLSAgICovCisgIC8vLyBUaGUgbWVzc2FnZSBkZXNjcmliaW5nIHdoZXJlL2hvdy93aHkgdGhpcyB3YXMgY2F1Z2h0LgogICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKIAotICAvKioKLSAgICogVGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgotICAgKi8KKyAgLy8vIFRoZSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KICAgU3RhY2tUcmFjZSBzdGFja1RyYWNlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjYXVnaHQgZXhjZXB0aW9uIHRvIGhhdmUgdGhlIGdpdmVuIFtleGNlcHRpb25dCi0gICAqIGFuZCBbc3RhY2tUcmFjZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY2F1Z2h0IGV4Y2VwdGlvbiB0byBoYXZlIHRoZSBnaXZlbiBbZXhjZXB0aW9uXQorICAvLy8gYW5kIFtzdGFja1RyYWNlXS4KICAgQ2F1Z2h0RXhjZXB0aW9uKGV4Y2VwdGlvbiwgc3RhY2tUcmFjZSkKICAgICAgIDogdGhpcy53aXRoTWVzc2FnZShudWxsLCBleGNlcHRpb24sIHN0YWNrVHJhY2UpOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjYXVnaHQgZXhjZXB0aW9uIHRvIGhhdmUgdGhlIGdpdmVuIFtleGNlcHRpb25dLAotICAgKiBbc3RhY2tUcmFjZV0sIGFuZCBbbWVzc2FnZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY2F1Z2h0IGV4Y2VwdGlvbiB0byBoYXZlIHRoZSBnaXZlbiBbZXhjZXB0aW9uXSwKKyAgLy8vIFtzdGFja1RyYWNlXSwgYW5kIFttZXNzYWdlXS4KICAgQ2F1Z2h0RXhjZXB0aW9uLndpdGhNZXNzYWdlKHRoaXMubWVzc2FnZSwgdGhpcy5leGNlcHRpb24sIHN0YWNrVHJhY2UpCiAgICAgICA6IHRoaXMuc3RhY2tUcmFjZSA9IHN0YWNrVHJhY2UgPz8gU3RhY2tUcmFjZS5jdXJyZW50OwogCi0gIC8qKgotICAgKiBSZWN1cnNpdmVseSB1bndyYXAgdGhpcyBbQ2F1Z2h0RXhjZXB0aW9uXSBpZiBpdCBpdHNlbGYgY29udGFpbnMgYQotICAgKiBbQ2F1Z2h0RXhjZXB0aW9uXS4KLSAgICoKLSAgICogSWYgaXQgZG9lcyBub3QgY29udGFpbiBhIFtDYXVnaHRFeGNlcHRpb25dLCBzaW1wbHkgcmV0dXJuIHRoaXMgaW5zdGFuY2UuCi0gICAqLworICAvLy8gUmVjdXJzaXZlbHkgdW53cmFwIHRoaXMgW0NhdWdodEV4Y2VwdGlvbl0gaWYgaXQgaXRzZWxmIGNvbnRhaW5zIGEKKyAgLy8vIFtDYXVnaHRFeGNlcHRpb25dLgorICAvLy8KKyAgLy8vIElmIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBbQ2F1Z2h0RXhjZXB0aW9uXSwgc2ltcGx5IHJldHVybiB0aGlzIGluc3RhbmNlLgogICBDYXVnaHRFeGNlcHRpb24gZ2V0IHJvb3RDYXVnaHRFeGNlcHRpb24gewogICAgIGlmIChleGNlcHRpb24gaXMgQ2F1Z2h0RXhjZXB0aW9uKSB7CiAgICAgICByZXR1cm4gKGV4Y2VwdGlvbiBhcyBDYXVnaHRFeGNlcHRpb24pLnJvb3RDYXVnaHRFeGNlcHRpb247CkBAIC04OSwxMCArNjcsOCBAQAogICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNhdWdodCBleGNlcHRpb24gYW5kIGl0cyBhc3NvY2lhdGVkCi0gICAqIHN0YWNrIHRyYWNlLgotICAgKi8KKyAgLy8vIFdyaXRlIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2F1Z2h0IGV4Y2VwdGlvbiBhbmQgaXRzIGFzc29jaWF0ZWQKKyAgLy8vIHN0YWNrIHRyYWNlLgogICB2b2lkIF93cml0ZU9uKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7CiAgICAgICBidWZmZXIud3JpdGVsbihtZXNzYWdlKTsKQEAgLTExNywxOSArOTMsMTYgQEAKICAgfQogfQogCi0vKioKLSAqIEEgZm9ybSBvZiBbQ2F1Z2h0RXhjZXB0aW9uXSB0aGF0IHNob3VsZCBiZSBzaWxlbnQgdG8gdXNlcnMuCi0gKgotICogVGhpcyBpcyBzdGlsbCBjb25zaWRlcmVkIGFuIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbiBhbmQgd2lsbCBiZSBzZW50IHRvIGNyYXNoCi0gKiByZXBvcnRpbmcuCi0gKi8KKy8vLyBBIGZvcm0gb2YgW0NhdWdodEV4Y2VwdGlvbl0gdGhhdCBzaG91bGQgYmUgc2lsZW50IHRvIHVzZXJzLgorLy8vCisvLy8gVGhpcyBpcyBzdGlsbCBjb25zaWRlcmVkIGFuIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbiBhbmQgd2lsbCBiZSBzZW50IHRvIGNyYXNoCisvLy8gcmVwb3J0aW5nLgogY2xhc3MgU2lsZW50RXhjZXB0aW9uIGV4dGVuZHMgQ2F1Z2h0RXhjZXB0aW9uIHsKICAgU2lsZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBleGNlcHRpb24sIHN0YWNrVHJhY2UpCiAgICAgICA6IHN1cGVyLndpdGhNZXNzYWdlKG1lc3NhZ2UsIGV4Y2VwdGlvbiwgc3RhY2tUcmFjZSk7CiAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIFtTaWxlbnRFeGNlcHRpb25dIHRvIHdyYXAgYSBbQ2F1Z2h0RXhjZXB0aW9uXSwgYWRkaW5nIGEgW21lc3NhZ2VdLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIFtTaWxlbnRFeGNlcHRpb25dIHRvIHdyYXAgYSBbQ2F1Z2h0RXhjZXB0aW9uXSwgYWRkaW5nIGEKKyAgLy8vIFttZXNzYWdlXS4KICAgU2lsZW50RXhjZXB0aW9uLndyYXBJbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIENhdWdodEV4Y2VwdGlvbiBleGNlcHRpb24pCiAgICAgICA6IHRoaXMobWVzc2FnZSwgZXhjZXB0aW9uLCBudWxsKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydCBiL3BrZy9hbmFseXplci9saWIvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydAppbmRleCA2MTc3MGExLi42Yzg3MzViIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0CkBAIC0xMCw3OSArMTAsNTcgQEAKIAogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKIAotLyoqCi0gKiBbRmlsZV1zIGFyZSBsZWFmIFtSZXNvdXJjZV1zIHdoaWNoIGNvbnRhaW4gZGF0YS4KLSAqLworLy8vIFtGaWxlXXMgYXJlIGxlYWYgW1Jlc291cmNlXXMgd2hpY2ggY29udGFpbiBkYXRhLgogYWJzdHJhY3QgY2xhc3MgRmlsZSBpbXBsZW1lbnRzIFJlc291cmNlIHsKLSAgLyoqCi0gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoaXMgZmlsZQotICAgKi8KKyAgLy8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoaXMgZmlsZQogICBTdHJlYW08V2F0Y2hFdmVudD4gZ2V0IGNoYW5nZXM7CiAKLSAgLyoqCi0gICAqIFN5bmNocm9ub3VzbHkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuCi0gICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgotICAgKi8KKyAgLy8vIFN5bmNocm9ub3VzbHkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuCisgIC8vLyBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscy4KICAgaW50IGdldCBsZW5ndGhTeW5jOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxhc3QtbW9kaWZpZWQgc3RhbXAgb2YgdGhlIGZpbGUuCi0gICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxhc3QtbW9kaWZpZWQgc3RhbXAgb2YgdGhlIGZpbGUuCisgIC8vLyBUaHJvd3MgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCiAgIGludCBnZXQgbW9kaWZpY2F0aW9uU3RhbXA7CiAKICAgQG92ZXJyaWRlCiAgIEZpbGUgY29weVRvKEZvbGRlciBwYXJlbnRGb2xkZXIpOwogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgW1NvdXJjZV0gaW5zdGFuY2UgdGhhdCBzZXJ2ZXMgdGhpcyBmaWxlLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIG5ldyBbU291cmNlXSBpbnN0YW5jZSB0aGF0IHNlcnZlcyB0aGlzIGZpbGUuCiAgIFNvdXJjZSBjcmVhdGVTb3VyY2UoW1VyaSB1cmldKTsKIAotICAvKioKLSAgICogU3luY2hyb25vdXNseSByZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBhIGxpc3Qgb2YgYnl0ZXMuCi0gICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgotICAgKi8KKyAgLy8vIFN5bmNocm9ub3VzbHkgcmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBsaXN0IG9mIGJ5dGVzLgorICAvLy8gVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgIExpc3Q8aW50PiByZWFkQXNCeXRlc1N5bmMoKTsKIAotICAvKioKLSAgICogU3luY2hyb25vdXNseSByZWFkIHRoZSBlbnRpcmUgZmlsZSBjb250ZW50cyBhcyBhIFtTdHJpbmddLgotICAgKiBUaHJvd3MgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgotICAgKi8KKyAgLy8vIFN5bmNocm9ub3VzbHkgcmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudHMgYXMgYSBbU3RyaW5nXS4KKyAgLy8vIFRocm93cyBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCiAgIFN0cmluZyByZWFkQXNTdHJpbmdTeW5jKCk7CiAKLSAgLyoqCi0gICAqIFN5bmNocm9ub3VzbHkgcmVuYW1lIHRoaXMgZmlsZS4KLSAgICogUmV0dXJuIGEgW0ZpbGVdIGluc3RhbmNlIGZvciB0aGUgcmVuYW1lZCBmaWxlLgotICAgKgotICAgKiBUaGUgW25ld1BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCi0gICAqCi0gICAqIElmIFtuZXdQYXRoXSBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGZpbGUsIHRoYXQgZmlsZSBpcyByZXBsYWNlZC4KLSAgICogSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2UgdGhlIG9wZXJhdGlvbiBtaWdodCBmYWlsIGFuZAotICAgKiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKi8KKyAgLy8vIFN5bmNocm9ub3VzbHkgcmVuYW1lIHRoaXMgZmlsZS4KKyAgLy8vIFJldHVybiBhIFtGaWxlXSBpbnN0YW5jZSBmb3IgdGhlIHJlbmFtZWQgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGUgW25ld1BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCisgIC8vLworICAvLy8gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgZmlsZSwgdGhhdCBmaWxlIGlzIHJlcGxhY2VkLgorICAvLy8gSWYgW25ld1BhdGhdIGlkZW50aWZpZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2UgdGhlIG9wZXJhdGlvbiBtaWdodCBmYWlsIGFuZAorICAvLy8gYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgRmlsZSByZW5hbWVTeW5jKFN0cmluZyBuZXdQYXRoKTsKIAotICAvKioKLSAgICogU3luY2hyb25vdXNseSB3cml0ZSB0aGUgZ2l2ZW4gW2J5dGVzXSB0byB0aGUgZmlsZS4gVGhlIG5ldyBjb250ZW50IHdpbGwKLSAgICogcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29udGVudC4KLSAgICoKLSAgICogVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCi0gICAqLworICAvLy8gU3luY2hyb25vdXNseSB3cml0ZSB0aGUgZ2l2ZW4gW2J5dGVzXSB0byB0aGUgZmlsZS4gVGhlIG5ldyBjb250ZW50IHdpbGwKKyAgLy8vIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvbnRlbnQuCisgIC8vLworICAvLy8gVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgIHZvaWQgd3JpdGVBc0J5dGVzU3luYyhMaXN0PGludD4gYnl0ZXMpOwogCi0gIC8qKgotICAgKiBTeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBnaXZlbiBbY29udGVudF0gdG8gdGhlIGZpbGUuIFRoZSBuZXcgY29udGVudCB3aWxsCi0gICAqIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvbnRlbnQuCi0gICAqCi0gICAqIFRocm93cyBhIFtGaWxlU3lzdGVtRXhjZXB0aW9uXSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzLgotICAgKi8KKyAgLy8vIFN5bmNocm9ub3VzbHkgd3JpdGUgdGhlIGdpdmVuIFtjb250ZW50XSB0byB0aGUgZmlsZS4gVGhlIG5ldyBjb250ZW50IHdpbGwKKyAgLy8vIHJlcGxhY2UgYW55IGV4aXN0aW5nIGNvbnRlbnQuCisgIC8vLworICAvLy8gVGhyb3dzIGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuCiAgIHZvaWQgd3JpdGVBc1N0cmluZ1N5bmMoU3RyaW5nIGNvbnRlbnQpOwogfQogCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCBmaWxlIHN5c3RlbSBleGNlcHRpb25zLgotICovCisvLy8gQmFzZSBjbGFzcyBmb3IgYWxsIGZpbGUgc3lzdGVtIGV4Y2VwdGlvbnMuCiBjbGFzcyBGaWxlU3lzdGVtRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAgZmluYWwgU3RyaW5nIHBhdGg7CiAgIGZpbmFsIFN0cmluZyBtZXNzYWdlOwpAQCAtOTMsMTg3ICs3MSwxMzYgQEAKICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0ZpbGVTeXN0ZW1FeGNlcHRpb24ocGF0aD0kcGF0aDsgbWVzc2FnZT0kbWVzc2FnZSknOwogfQogCi0vKioKLSAqIFtGb2xkZXJdcyBhcmUgW1Jlc291cmNlXXMgd2hpY2ggbWF5IGNvbnRhaW4gZmlsZXMgYW5kL29yIG90aGVyIGZvbGRlcnMuCi0gKi8KKy8vLyBbRm9sZGVyXXMgYXJlIFtSZXNvdXJjZV1zIHdoaWNoIG1heSBjb250YWluIGZpbGVzIGFuZC9vciBvdGhlciBmb2xkZXJzLgogYWJzdHJhY3QgY2xhc3MgRm9sZGVyIGltcGxlbWVudHMgUmVzb3VyY2UgewotICAvKioKLSAgICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGZpbGVzIGluc2lkZSB0aGlzIGZvbGRlciAoYW5kIGluIGFueSBuZXN0ZWQKLSAgICogZm9sZGVycywgaW5jbHVkaW5nIGZvbGRlcnMgcmVhY2hhYmxlIHZpYSBsaW5rcykuCi0gICAqLworICAvLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGZpbGVzIGluc2lkZSB0aGlzIGZvbGRlciAoYW5kIGluIGFueSBuZXN0ZWQKKyAgLy8vIGZvbGRlcnMsIGluY2x1ZGluZyBmb2xkZXJzIHJlYWNoYWJsZSB2aWEgbGlua3MpLgogICBTdHJlYW08V2F0Y2hFdmVudD4gZ2V0IGNoYW5nZXM7CiAKLSAgLyoqCi0gICAqIElmIHRoZSBwYXRoIFtwYXRoXSBpcyBhIHJlbGF0aXZlIHBhdGgsIGNvbnZlcnQgaXQgdG8gYW4gYWJzb2x1dGUgcGF0aAotICAgKiBieSBpbnRlcnByZXRpbmcgaXQgcmVsYXRpdmUgdG8gdGhpcyBmb2xkZXIuICBJZiBpdCBpcyBhbHJlYWR5IGFuIGFic29sdXRlCi0gICAqIHBhdGgsIHRoZW4gZG9uJ3QgY2hhbmdlIGl0LgotICAgKgotICAgKiBIb3dldmVyLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgW3BhdGhdIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlLCBub3JtYWxpemUKLSAgICogaXQgYnkgcmVtb3ZpbmcgcGF0aCBjb21wb25lbnRzIG9mIHRoZSBmb3JtICcuJyBvciAnLi4nLgotICAgKi8KKyAgLy8vIElmIHRoZSBwYXRoIFtwYXRoXSBpcyBhIHJlbGF0aXZlIHBhdGgsIGNvbnZlcnQgaXQgdG8gYW4gYWJzb2x1dGUgcGF0aAorICAvLy8gYnkgaW50ZXJwcmV0aW5nIGl0IHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyLiAgSWYgaXQgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZQorICAvLy8gcGF0aCwgdGhlbiBkb24ndCBjaGFuZ2UgaXQuCisgIC8vLworICAvLy8gSG93ZXZlciwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFtwYXRoXSBpcyByZWxhdGl2ZSBvciBhYnNvbHV0ZSwgbm9ybWFsaXplCisgIC8vLyBpdCBieSByZW1vdmluZyBwYXRoIGNvbXBvbmVudHMgb2YgdGhlIGZvcm0gJy4nIG9yICcuLicuCiAgIFN0cmluZyBjYW5vbmljYWxpemVQYXRoKFN0cmluZyBwYXRoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgW3BhdGhdIHJlZmVyZW5jZXMgYSByZXNvdXJjZSBpbiB0aGlzIGZvbGRlci4KLSAgICoKLSAgICogVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtwYXRoXSByZWZlcmVuY2VzIGEgcmVzb3VyY2UgaW4gdGhpcyBmb2xkZXIuCisgIC8vLworICAvLy8gVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgogICBib29sIGNvbnRhaW5zKFN0cmluZyBwYXRoKTsKIAogICBAb3ZlcnJpZGUKICAgRm9sZGVyIGNvcHlUbyhGb2xkZXIgcGFyZW50Rm9sZGVyKTsKIAotICAvKioKLSAgICogSWYgdGhpcyBmb2xkZXIgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgotICAgKi8KKyAgLy8vIElmIHRoaXMgZm9sZGVyIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KICAgdm9pZCBjcmVhdGUoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGFuIGV4aXN0aW5nIGNoaWxkIFtSZXNvdXJjZV0gd2l0aCB0aGUgZ2l2ZW4gW3JlbFBhdGhdLgotICAgKiBSZXR1cm4gYSBub3QgZXhpc3RpbmcgW0ZpbGVdIGlmIG5vIHN1Y2ggY2hpbGQgZXhpc3QuCi0gICAqLworICAvLy8gUmV0dXJuIGFuIGV4aXN0aW5nIGNoaWxkIFtSZXNvdXJjZV0gd2l0aCB0aGUgZ2l2ZW4gW3JlbFBhdGhdLgorICAvLy8gUmV0dXJuIGEgbm90IGV4aXN0aW5nIFtGaWxlXSBpZiBubyBzdWNoIGNoaWxkIGV4aXN0LgogICBSZXNvdXJjZSBnZXRDaGlsZChTdHJpbmcgcmVsUGF0aCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIFtGaWxlXSByZXByZXNlbnRpbmcgYSBjaGlsZCBbUmVzb3VyY2VdIHdpdGggdGhlIGdpdmVuCi0gICAqIFtyZWxQYXRoXS4gIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAqIGV4aXN0cyBvbiB0aGUgZmlsZXN5c3RlbSAtIGNsaWVudCBtdXN0IGNhbGwgdGhlIFtGaWxlXSdzIGBleGlzdHNgIGdldHRlcgotICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZm9sZGVyIGFjdHVhbGx5IGV4aXN0cy4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBbRmlsZV0gcmVwcmVzZW50aW5nIGEgY2hpbGQgW1Jlc291cmNlXSB3aXRoIHRoZSBnaXZlbgorICAvLy8gW3JlbFBhdGhdLiAgVGhpcyBjYWxsIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgYSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAgLy8vIGV4aXN0cyBvbiB0aGUgZmlsZXN5c3RlbSAtIGNsaWVudCBtdXN0IGNhbGwgdGhlIFtGaWxlXSdzIGBleGlzdHNgIGdldHRlcgorICAvLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvbGRlciBhY3R1YWxseSBleGlzdHMuCiAgIEZpbGUgZ2V0Q2hpbGRBc3N1bWluZ0ZpbGUoU3RyaW5nIHJlbFBhdGgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBbRm9sZGVyXSByZXByZXNlbnRpbmcgYSBjaGlsZCBbUmVzb3VyY2VdIHdpdGggdGhlIGdpdmVuCi0gICAqIFtyZWxQYXRoXS4gIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIGEgZm9sZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICogZXhpc3RzIG9uIHRoZSBmaWxlc3lzdGVtLS1jbGllbnQgbXVzdCBjYWxsIHRoZSBbRm9sZGVyXSdzIGBleGlzdHNgIGdldHRlcgotICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZm9sZGVyIGFjdHVhbGx5IGV4aXN0cy4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBbRm9sZGVyXSByZXByZXNlbnRpbmcgYSBjaGlsZCBbUmVzb3VyY2VdIHdpdGggdGhlIGdpdmVuCisgIC8vLyBbcmVsUGF0aF0uICBUaGlzIGNhbGwgZG9lcyBub3QgY2hlY2sgd2hldGhlciBhIGZvbGRlciB3aXRoIHRoZSBnaXZlbiBuYW1lCisgIC8vLyBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0tLWNsaWVudCBtdXN0IGNhbGwgdGhlIFtGb2xkZXJdJ3MgYGV4aXN0c2AgZ2V0dGVyCisgIC8vLyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZm9sZGVyIGFjdHVhbGx5IGV4aXN0cy4KICAgRm9sZGVyIGdldENoaWxkQXNzdW1pbmdGb2xkZXIoU3RyaW5nIHJlbFBhdGgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIGV4aXN0aW5nIGRpcmVjdCBjaGlsZHJlbiBbUmVzb3VyY2VdcyAoZm9sZGVycyBhbmQgZmlsZXMpCi0gICAqIGluIHRoaXMgZm9sZGVyLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotICAgKgotICAgKiBPbiBJL08gZXJyb3JzLCB0aGlzIHdpbGwgdGhyb3cgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3Qgb2YgZXhpc3RpbmcgZGlyZWN0IGNoaWxkcmVuIFtSZXNvdXJjZV1zIChmb2xkZXJzIGFuZCBmaWxlcykKKyAgLy8vIGluIHRoaXMgZm9sZGVyLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICAvLy8KKyAgLy8vIE9uIEkvTyBlcnJvcnMsIHRoaXMgd2lsbCB0aHJvdyBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCiAgIExpc3Q8UmVzb3VyY2U+IGdldENoaWxkcmVuKCk7CiB9CiAKLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIFtSZXNvdXJjZV0gaXMgYW4gYWJzdHJhY3Rpb24gb2YgZmlsZSBvciBmb2xkZXIuCi0gKi8KKy8vLyBUaGUgYWJzdHJhY3QgY2xhc3MgW1Jlc291cmNlXSBpcyBhbiBhYnN0cmFjdGlvbiBvZiBmaWxlIG9yIGZvbGRlci4KIGFic3RyYWN0IGNsYXNzIFJlc291cmNlIHsKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyByZXNvdXJjZSBleGlzdHMuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHJlc291cmNlIGV4aXN0cy4KICAgYm9vbCBnZXQgZXhpc3RzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtGb2xkZXJdIHRoYXQgY29udGFpbnMgdGhpcyByZXNvdXJjZSwgb3IgYG51bGxgIGlmIHRoaXMgcmVzb3VyY2UKLSAgICogaXMgYSByb290IGZvbGRlci4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtGb2xkZXJdIHRoYXQgY29udGFpbnMgdGhpcyByZXNvdXJjZSwgb3IgYG51bGxgIGlmIHRoaXMKKyAgLy8vIHJlc291cmNlIGlzIGEgcm9vdCBmb2xkZXIuCiAgIEZvbGRlciBnZXQgcGFyZW50OwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byB0aGlzIHJlc291cmNlLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZnVsbCBwYXRoIHRvIHRoaXMgcmVzb3VyY2UuCiAgIFN0cmluZyBnZXQgcGF0aDsKIAotICAvKioKLSAgICogUmV0dXJuIGEgc2hvcnQgdmVyc2lvbiBvZiB0aGUgbmFtZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgdG8KLSAgICogZGVub3RlIHRoaXMgcmVzb3VyY2UuCi0gICAqLworICAvLy8gUmV0dXJuIGEgc2hvcnQgdmVyc2lvbiBvZiB0aGUgbmFtZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgdG8KKyAgLy8vIGRlbm90ZSB0aGlzIHJlc291cmNlLgogICBTdHJpbmcgZ2V0IHNob3J0TmFtZTsKIAotICAvKioKLSAgICogQ29weSB0aGlzIHJlc291cmNlIHRvIGEgY2hpbGQgb2YgdGhlIFtwYXJlbnRGb2xkZXJdIHdpdGggdGhlIHNhbWUga2luZCBhbmQKLSAgICogW3Nob3J0TmFtZV0gYXMgdGhpcyByZXNvdXJjZS4gSWYgdGhpcyByZXNvdXJjZSBpcyBhIGZvbGRlciwgdGhlbiBhbGwgb2YgdGhlCi0gICAqIGNvbnRlbnRzIG9mIHRoZSBmb2xkZXIgd2lsbCBiZSByZWN1cnNpdmVseSBjb3BpZWQuCi0gICAqCi0gICAqIFRoZSBwYXJlbnQgZm9sZGVyIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLSAgICoKLSAgICogRXhpc3RpbmcgZmlsZXMgYW5kIGZvbGRlcnMgd2lsbCBiZSBvdmVyd3JpdHRlbi4KLSAgICoKLSAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVzb3VyY2UgaW4gdGhlIHBhcmVudCBmb2xkZXIuCi0gICAqLworICAvLy8gQ29weSB0aGlzIHJlc291cmNlIHRvIGEgY2hpbGQgb2YgdGhlIFtwYXJlbnRGb2xkZXJdIHdpdGggdGhlIHNhbWUga2luZCBhbmQKKyAgLy8vIFtzaG9ydE5hbWVdIGFzIHRoaXMgcmVzb3VyY2UuIElmIHRoaXMgcmVzb3VyY2UgaXMgYSBmb2xkZXIsIHRoZW4gYWxsIG9mCisgIC8vLyB0aGUgY29udGVudHMgb2YgdGhlIGZvbGRlciB3aWxsIGJlIHJlY3Vyc2l2ZWx5IGNvcGllZC4KKyAgLy8vCisgIC8vLyBUaGUgcGFyZW50IGZvbGRlciBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgIC8vLworICAvLy8gRXhpc3RpbmcgZmlsZXMgYW5kIGZvbGRlcnMgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZXNvdXJjZSBpbiB0aGUgcGFyZW50IGZvbGRlci4KICAgUmVzb3VyY2UgY29weVRvKEZvbGRlciBwYXJlbnRGb2xkZXIpOwogCi0gIC8qKgotICAgKiBTeW5jaHJvbm91c2x5IGRlbGV0ZXMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLgotICAgKgotICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUgZGVsZXRlZC4KLSAgICovCisgIC8vLyBTeW5jaHJvbm91c2x5IGRlbGV0ZXMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLgorICAvLy8KKyAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBkZWxldGVkLgogICB2b2lkIGRlbGV0ZSgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIGFic29sdXRlIFtwYXRoXSByZWZlcmVuY2VzIHRoaXMgcmVzb3VyY2Ugb3IgYSByZXNvdXJjZSBpbgotICAgKiB0aGlzIGZvbGRlci4KLSAgICoKLSAgICogVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgYWJzb2x1dGUgW3BhdGhdIHJlZmVyZW5jZXMgdGhpcyByZXNvdXJjZSBvciBhIHJlc291cmNlIGluCisgIC8vLyB0aGlzIGZvbGRlci4KKyAgLy8vCisgIC8vLyBUaGUgW3BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCiAgIGJvb2wgaXNPckNvbnRhaW5zKFN0cmluZyBwYXRoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgcmVzb3VyY2UgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgcmVzb3VyY2UgYXMgdGhpcyByZXNvdXJjZSwgYnV0Ci0gICAqIHdob3NlIHBhdGggZG9lcyBub3QgY29udGFpbiBhbnkgc3ltYm9saWMgbGlua3MuCi0gICAqLworICAvLy8gUmV0dXJuIGEgcmVzb3VyY2UgdGhhdCByZWZlcnMgdG8gdGhlIHNhbWUgcmVzb3VyY2UgYXMgdGhpcyByZXNvdXJjZSwgYnV0CisgIC8vLyB3aG9zZSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYW55IHN5bWJvbGljIGxpbmtzLgogICBSZXNvdXJjZSByZXNvbHZlU3ltYm9saWNMaW5rc1N5bmMoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgVXJpIHJlcHJlc2VudGluZyB0aGlzIHJlc291cmNlLgotICAgKi8KKyAgLy8vIFJldHVybiBhIFVyaSByZXByZXNlbnRpbmcgdGhpcyByZXNvdXJjZS4KICAgVXJpIHRvVXJpKCk7CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBbUmVzb3VyY2VQcm92aWRlcl0gY29udmVydCBbU3RyaW5nXSBwYXRocyBpbnRvCi0gKiBbUmVzb3VyY2Vdcy4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgW1Jlc291cmNlUHJvdmlkZXJdIGNvbnZlcnQgW1N0cmluZ10gcGF0aHMgaW50bworLy8vIFtSZXNvdXJjZV1zLgogYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VQcm92aWRlciB7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHBhdGggY29udGV4dCB1c2VkIGJ5IHRoaXMgcmVzb3VyY2UgcHJvdmlkZXIuCi0gICAqLworICAvLy8gR2V0IHRoZSBwYXRoIGNvbnRleHQgdXNlZCBieSB0aGlzIHJlc291cmNlIHByb3ZpZGVyLgogICBDb250ZXh0IGdldCBwYXRoQ29udGV4dDsKIAotICAvKioKLSAgICogUmV0dXJuIGEgW0ZpbGVdIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIFtwYXRoXS4KLSAgICoKLSAgICogVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgotICAgKgotICAgKiBBIGZpbGUgbWF5IG9yIG1heSBub3QgZXhpc3QgYXQgdGhpcyBsb2NhdGlvbi4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBbRmlsZV0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gW3BhdGhdLgorICAvLy8KKyAgLy8vIFRoZSBbcGF0aF0gbXVzdCBiZSBhYnNvbHV0ZSBhbmQgbm9ybWFsaXplZC4KKyAgLy8vCisgIC8vLyBBIGZpbGUgbWF5IG9yIG1heSBub3QgZXhpc3QgYXQgdGhpcyBsb2NhdGlvbi4KICAgRmlsZSBnZXRGaWxlKFN0cmluZyBwYXRoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgW0ZvbGRlcl0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gW3BhdGhdLgotICAgKgotICAgKiBUaGUgW3BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCi0gICAqCi0gICAqIEEgZm9sZGVyIG1heSBvciBtYXkgbm90IGV4aXN0IGF0IHRoaXMgbG9jYXRpb24uCi0gICAqLworICAvLy8gUmV0dXJuIGEgW0ZvbGRlcl0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gW3BhdGhdLgorICAvLy8KKyAgLy8vIFRoZSBbcGF0aF0gbXVzdCBiZSBhYnNvbHV0ZSBhbmQgbm9ybWFsaXplZC4KKyAgLy8vCisgIC8vLyBBIGZvbGRlciBtYXkgb3IgbWF5IG5vdCBleGlzdCBhdCB0aGlzIGxvY2F0aW9uLgogICBGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBwYXRoKTsKIAotICAvKioKLSAgICogQ29tcGxldGUgd2l0aCBhIGxpc3Qgb2YgbW9kaWZpY2F0aW9uIHRpbWVzIGZvciB0aGUgZ2l2ZW4gW3NvdXJjZXNdLgotICAgKgotICAgKiBJZiB0aGUgZmlsZSBvZiBhIHNvdXJjZSBpcyBub3QgbWFuYWdlZCBieSB0aGlzIHByb3ZpZGVyLCByZXR1cm4gYG51bGxgLgotICAgKiBJZiB0aGUgZmlsZSBhIHNvdXJjZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGAtMWAuCi0gICAqLworICAvLy8gQ29tcGxldGUgd2l0aCBhIGxpc3Qgb2YgbW9kaWZpY2F0aW9uIHRpbWVzIGZvciB0aGUgZ2l2ZW4gW3NvdXJjZXNdLgorICAvLy8KKyAgLy8vIElmIHRoZSBmaWxlIG9mIGEgc291cmNlIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgcHJvdmlkZXIsIHJldHVybiBgbnVsbGAuCisgIC8vLyBJZiB0aGUgZmlsZSBhIHNvdXJjZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGAtMWAuCiAgIEZ1dHVyZTxMaXN0PGludD4+IGdldE1vZGlmaWNhdGlvblRpbWVzKExpc3Q8U291cmNlPiBzb3VyY2VzKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBbUmVzb3VyY2VdIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIFtwYXRoXS4KLSAgICoKLSAgICogVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgW1Jlc291cmNlXSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBbcGF0aF0uCisgIC8vLworICAvLy8gVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgogICBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZm9sZGVyIGluIHdoaWNoIHRoZSBwbHVnaW4gd2l0aCB0aGUgZ2l2ZW4gW3BsdWdpbklkXSBjYW4gc3RvcmUKLSAgICogc3RhdGUgdGhhdCB3aWxsIHBlcnNpc3QgYWNyb3NzIHNlc3Npb25zLiBUaGUgZm9sZGVyIHJldHVybmVkIGZvciBhIGdpdmVuIGlkCi0gICAqIHdpbGwgbm90IGJlIHJldHVybmVkIGZvciBhIGRpZmZlcmVudCBpZCwgZW5zdXJpbmcgdGhhdCBwbHVnaW5zIGRvIG5vdCBuZWVkCi0gICAqIHRvIGJlIGNvbmNlcm5lZCB3aXRoIGZpbGUgbmFtZSBjb2xsaXNpb25zIHdpdGggb3RoZXIgcGx1Z2lucywgYXNzdW1pbmcgdGhhdAotICAgKiB0aGUgcGx1Z2luIGlkcyBhcmUgdW5pcXVlLiBUaGUgcGx1Z2luIGlkcyBtdXN0IGJlIHZhbGlkIGZvbGRlciBuYW1lcy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGZvbGRlciBpbiB3aGljaCB0aGUgcGx1Z2luIHdpdGggdGhlIGdpdmVuIFtwbHVnaW5JZF0gY2FuIHN0b3JlCisgIC8vLyBzdGF0ZSB0aGF0IHdpbGwgcGVyc2lzdCBhY3Jvc3Mgc2Vzc2lvbnMuIFRoZSBmb2xkZXIgcmV0dXJuZWQgZm9yIGEgZ2l2ZW4KKyAgLy8vIGlkIHdpbGwgbm90IGJlIHJldHVybmVkIGZvciBhIGRpZmZlcmVudCBpZCwgZW5zdXJpbmcgdGhhdCBwbHVnaW5zIGRvIG5vdAorICAvLy8gbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCBmaWxlIG5hbWUgY29sbGlzaW9ucyB3aXRoIG90aGVyIHBsdWdpbnMsCisgIC8vLyBhc3N1bWluZyB0aGF0IHRoZSBwbHVnaW4gaWRzIGFyZSB1bmlxdWUuIFRoZSBwbHVnaW4gaWRzIG11c3QgYmUgdmFsaWQKKyAgLy8vIGZvbGRlciBuYW1lcy4KICAgRm9sZGVyIGdldFN0YXRlTG9jYXRpb24oU3RyaW5nIHBsdWdpbklkKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvZmlsZV9zeXN0ZW0vbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0CmluZGV4IDZkNmRiODQuLjE3ODE3MzggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvZmlsZV9zeXN0ZW0vbWVtb3J5X2ZpbGVfc3lzdGVtLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9maWxlX3N5c3RlbS9tZW1vcnlfZmlsZV9zeXN0ZW0uZGFydApAQCAtMTMsMTAgKzEzLDggQEAKIGltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aG9zOwogaW1wb3J0ICdwYWNrYWdlOndhdGNoZXIvd2F0Y2hlci5kYXJ0JzsKIAotLyoqCi0gKiBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgW1Jlc291cmNlUHJvdmlkZXJdLgotICogVXNlIGAvYCBhcyBhIHBhdGggc2VwYXJhdG9yLgotICovCisvLy8gQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIFtSZXNvdXJjZVByb3ZpZGVyXS4KKy8vLyBVc2UgYC9gIGFzIGEgcGF0aCBzZXBhcmF0b3IuCiBjbGFzcyBNZW1vcnlSZXNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUmVzb3VyY2VQcm92aWRlciB7CiAgIGZpbmFsIE1hcDxTdHJpbmcsIF9NZW1vcnlSZXNvdXJjZT4gX3BhdGhUb1Jlc291cmNlID0KICAgICAgIEhhc2hNYXA8U3RyaW5nLCBfTWVtb3J5UmVzb3VyY2U+KCk7CkBAIC00MCwxMiArMzgsMTAgQEAKICAgQG92ZXJyaWRlCiAgIHBhdGhvcy5Db250ZXh0IGdldCBwYXRoQ29udGV4dCA9PiBfcGF0aENvbnRleHQ7CiAKLSAgLyoqCi0gICAqIENvbnZlcnQgdGhlIGdpdmVuIHBvc2l4IFtwYXRoXSB0byBjb25mb3JtIHRvIHRoaXMgcHJvdmlkZXIncyBwYXRoIGNvbnRleHQuCi0gICAqCi0gICAqIFRoaXMgaXMgYSB1dGlsaXR5IG1ldGhvZCBmb3IgdGVzdGluZzsgcGF0aHMgcGFzc2VkIGluIHRvIG90aGVyIG1ldGhvZHMgaW4KLSAgICogdGhpcyBjbGFzcyBhcmUgbmV2ZXIgY29udmVydGVkIGF1dG9tYXRpY2FsbHkuCi0gICAqLworICAvLy8gQ29udmVydCB0aGUgZ2l2ZW4gcG9zaXggW3BhdGhdIHRvIGNvbmZvcm0gdG8gdGhpcyBwcm92aWRlcidzIHBhdGggY29udGV4dC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgdXRpbGl0eSBtZXRob2QgZm9yIHRlc3Rpbmc7IHBhdGhzIHBhc3NlZCBpbiB0byBvdGhlciBtZXRob2RzIGluCisgIC8vLyB0aGlzIGNsYXNzIGFyZSBuZXZlciBjb252ZXJ0ZWQgYXV0b21hdGljYWxseS4KICAgU3RyaW5nIGNvbnZlcnRQYXRoKFN0cmluZyBwYXRoKSB7CiAgICAgaWYgKHBhdGhDb250ZXh0LnN0eWxlID09IHBhdGhvcy53aW5kb3dzLnN0eWxlKSB7CiAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKHBhdGhvcy5wb3NpeC5zZXBhcmF0b3IpKSB7CkBAIC01Niw5ICs1Miw3IEBACiAgICAgcmV0dXJuIHBhdGg7CiAgIH0KIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIHBhdGguCi0gICAqLworICAvLy8gRGVsZXRlIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIHBhdGguCiAgIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgewogICAgIF9jaGVja0ZpbGVBdFBhdGgocGF0aCk7CiAgICAgX3BhdGhUb1Jlc291cmNlLnJlbW92ZShwYXRoKTsKQEAgLTY3LDEwICs2MSw4IEBACiAgICAgX25vdGlmeVdhdGNoZXJzKHBhdGgsIENoYW5nZVR5cGUuUkVNT1ZFKTsKICAgfQogCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGZvbGRlciB3aXRoIHRoZSBnaXZlbiBwYXRoCi0gICAqIGFuZCByZWN1cnNpdmVseSBkZWxldGUgbmVzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLgotICAgKi8KKyAgLy8vIERlbGV0ZSB0aGUgZm9sZGVyIHdpdGggdGhlIGdpdmVuIHBhdGgKKyAgLy8vIGFuZCByZWN1cnNpdmVseSBkZWxldGUgbmVzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLgogICB2b2lkIGRlbGV0ZUZvbGRlcihTdHJpbmcgcGF0aCkgewogICAgIF9jaGVja0ZvbGRlckF0UGF0aChwYXRoKTsKICAgICBfTWVtb3J5Rm9sZGVyIGZvbGRlciA9IF9wYXRoVG9SZXNvdXJjZVtwYXRoXTsKQEAgLTEyOCwxMCArMTIwLDggQEAKICAgICBfbm90aWZ5V2F0Y2hlcnMocGF0aCwgQ2hhbmdlVHlwZS5NT0RJRlkpOwogICB9CiAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIHJlc291cmNlIHJlcHJlc2VudGluZyBhIGR1bW15IGxpbmsgKHRoYXQgaXMsIGEgRmlsZSBvYmplY3Qgd2hpY2gKLSAgICogYXBwZWFycyBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeSwgYnV0IHdob3NlIGBleGlzdHNgIHByb3BlcnR5IGlzIGZhbHNlKQotICAgKi8KKyAgLy8vIENyZWF0ZSBhIHJlc291cmNlIHJlcHJlc2VudGluZyBhIGR1bW15IGxpbmsgKHRoYXQgaXMsIGEgRmlsZSBvYmplY3Qgd2hpY2gKKyAgLy8vIGFwcGVhcnMgaW4gaXRzIHBhcmVudCBkaXJlY3RvcnksIGJ1dCB3aG9zZSBgZXhpc3RzYCBwcm9wZXJ0eSBpcyBmYWxzZSkKICAgRmlsZSBuZXdEdW1teUxpbmsoU3RyaW5nIHBhdGgpIHsKICAgICBfZW5zdXJlQWJzb2x1dGVBbmROb3JtYWxpemVkKHBhdGgpOwogICAgIG5ld0ZvbGRlcihwYXRoQ29udGV4dC5kaXJuYW1lKHBhdGgpKTsKQEAgLTE5Nyw5ICsxODcsNyBAQAogICAgIHJldHVybiBmaWxlOwogICB9CiAKLSAgLyoqCi0gICAqIFdyaXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpbGUgc3lzdGVtIG9uIHRoZSBnaXZlbiBbc2lua10uCi0gICAqLworICAvLy8gV3JpdGUgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0gb24gdGhlIGdpdmVuIFtzaW5rXS4KICAgdm9pZCB3cml0ZU9uKFN0cmluZ1Npbmsgc2luaykgewogICAgIExpc3Q8U3RyaW5nPiBwYXRocyA9IF9wYXRoVG9SZXNvdXJjZS5rZXlzLnRvTGlzdCgpOwogICAgIHBhdGhzLnNvcnQoKTsKQEAgLTIyOSwxMCArMjE3LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHN1cHBvcnRzIG9ubHkgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQgcGF0aHMuCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdmFsaWRhdGUgYW55IGlucHV0IHBhdGhzIHRvIHByZXZlbnQgZXJyb3JzIGxhdGVyLgotICAgKi8KKyAgLy8vIFRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiBzdXBwb3J0cyBvbmx5IGFic29sdXRlIGFuZCBub3JtYWxpemVkIHBhdGhzLgorICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB2YWxpZGF0ZSBhbnkgaW5wdXQgcGF0aHMgdG8gcHJldmVudCBlcnJvcnMgbGF0ZXIuCiAgIHZvaWQgX2Vuc3VyZUFic29sdXRlQW5kTm9ybWFsaXplZChTdHJpbmcgcGF0aCkgewogICAgIGlmICghcGF0aENvbnRleHQuaXNBYnNvbHV0ZShwYXRoKSkgewogICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiUGF0aCBtdXN0IGJlIGFic29sdXRlIDogJHBhdGgiKTsKQEAgLTI0Miw5ICsyMjgsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgW19NZW1vcnlGaWxlXSB3aXRob3V0IGFueSBjb250ZW50LgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIG5ldyBbX01lbW9yeUZpbGVdIHdpdGhvdXQgYW55IGNvbnRlbnQuCiAgIF9NZW1vcnlGaWxlIF9uZXdGaWxlKFN0cmluZyBwYXRoKSB7CiAgICAgU3RyaW5nIGZvbGRlclBhdGggPSBwYXRoQ29udGV4dC5kaXJuYW1lKHBhdGgpOwogICAgIF9NZW1vcnlSZXNvdXJjZSBmb2xkZXIgPSBfcGF0aFRvUmVzb3VyY2VbZm9sZGVyUGF0aF07CkBAIC0zMDEsMTAgKzI4NSw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVdIHdoaWNoIGFjdHMgbGlrZSBhIHN5bWJvbGljIGxpbmsgdG8gYQotICogbm9uLWV4aXN0ZW50IGZpbGUuCi0gKi8KKy8vLyBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVdIHdoaWNoIGFjdHMgbGlrZSBhIHN5bWJvbGljIGxpbmsgdG8gYQorLy8vIG5vbi1leGlzdGVudCBmaWxlLgogY2xhc3MgX01lbW9yeUR1bW15TGluayBleHRlbmRzIF9NZW1vcnlSZXNvdXJjZSBpbXBsZW1lbnRzIEZpbGUgewogICBfTWVtb3J5RHVtbXlMaW5rKE1lbW9yeVJlc291cmNlUHJvdmlkZXIgcHJvdmlkZXIsIFN0cmluZyBwYXRoKQogICAgICAgOiBzdXBlcihwcm92aWRlciwgcGF0aCk7CkBAIC0zODIsOSArMzY0LDcgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiBbRmlsZV0uCi0gKi8KKy8vLyBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVdLgogY2xhc3MgX01lbW9yeUZpbGUgZXh0ZW5kcyBfTWVtb3J5UmVzb3VyY2UgaW1wbGVtZW50cyBGaWxlIHsKICAgX01lbW9yeUZpbGUoTWVtb3J5UmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIHBhdGgpCiAgICAgICA6IHN1cGVyKHByb3ZpZGVyLCBwYXRoKTsKQEAgLTQ2Nyw5ICs0NDcsNyBAQAogICB9CiB9CiAKLS8qKgotICogQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIFtGb2xkZXJdLgotICovCisvLy8gQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIFtGb2xkZXJdLgogY2xhc3MgX01lbW9yeUZvbGRlciBleHRlbmRzIF9NZW1vcnlSZXNvdXJjZSBpbXBsZW1lbnRzIEZvbGRlciB7CiAgIF9NZW1vcnlGb2xkZXIoTWVtb3J5UmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIHBhdGgpCiAgICAgICA6IHN1cGVyKHByb3ZpZGVyLCBwYXRoKTsKQEAgLTU2Niw5ICs1NDQsNyBAQAogICBVcmkgdG9VcmkoKSA9PiBfcHJvdmlkZXIucGF0aENvbnRleHQudG9VcmkocGF0aCArICcvJyk7CiB9CiAKLS8qKgotICogQW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIFtSZXNvdXJjZV0uCi0gKi8KKy8vLyBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgW1Jlc291cmNlXS4KIGFic3RyYWN0IGNsYXNzIF9NZW1vcnlSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc291cmNlIHsKICAgZmluYWwgTWVtb3J5UmVzb3VyY2VQcm92aWRlciBfcHJvdmlkZXI7CiAgIEBvdmVycmlkZQpAQCAtNTkzLDcgKzU2OSw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgZ2V0IGhhc2hDb2RlID0+IHBhdGguaGFzaENvZGU7CisgIGludCBnZXQgaGFzaENvZGUgPT4gcGF0aC5oYXNoQ29kZTsKIAogICBAb3ZlcnJpZGUKICAgRm9sZGVyIGdldCBwYXJlbnQgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9maWxlX3N5c3RlbS9vdmVybGF5X2ZpbGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL292ZXJsYXlfZmlsZV9zeXN0ZW0uZGFydAppbmRleCBkMWU2MzZhLi42MDFiOTEzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL292ZXJsYXlfZmlsZV9zeXN0ZW0uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL292ZXJsYXlfZmlsZV9zeXN0ZW0uZGFydApAQCAtMTQsMzggKzE0LDI4IEBACiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGhvczsKIGltcG9ydCAncGFja2FnZTp3YXRjaGVyL3dhdGNoZXIuZGFydCc7CiAKLS8qKgotICogQSByZXNvdXJjZSBwcm92aWRlciB0aGF0IGFsbG93cyBjbGllbnRzIHRvIG92ZXJsYXkgdGhlIGZpbGUgc3lzdGVtIHByb3ZpZGVkCi0gKiBieSBhIGJhc2UgcmVzb3VyY2UgcHJvdmlkZXIuIFRoZXNlIG92ZXJsYXlzIGFsbG93IGJvdGggdGhlIGNvbnRlbnRzIGFuZAotICogbW9kaWZpY2F0aW9uIHN0YW1wcyBvZiBmaWxlcyB0byBiZSBkaWZmZXJlbnQgdGhhbiB3aGF0IHRoZSBiYXNlIHJlc291cmNlCi0gKiBwcm92aWRlciB3b3VsZCByZXBvcnQuCi0gKgotICogVGhpcyBwcm92aWRlciBkb2VzIG5vdCByZXBvcnQgd2F0Y2ggZXZlbnRzIHdoZW4gb3ZlcmxheXMgYXJlIGFkZGVkLCBtb2RpZmllZAotICogb3IgcmVtb3ZlZC4KLSAqLworLy8vIEEgcmVzb3VyY2UgcHJvdmlkZXIgdGhhdCBhbGxvd3MgY2xpZW50cyB0byBvdmVybGF5IHRoZSBmaWxlIHN5c3RlbSBwcm92aWRlZAorLy8vIGJ5IGEgYmFzZSByZXNvdXJjZSBwcm92aWRlci4gVGhlc2Ugb3ZlcmxheXMgYWxsb3cgYm90aCB0aGUgY29udGVudHMgYW5kCisvLy8gbW9kaWZpY2F0aW9uIHN0YW1wcyBvZiBmaWxlcyB0byBiZSBkaWZmZXJlbnQgdGhhbiB3aGF0IHRoZSBiYXNlIHJlc291cmNlCisvLy8gcHJvdmlkZXIgd291bGQgcmVwb3J0LgorLy8vCisvLy8gVGhpcyBwcm92aWRlciBkb2VzIG5vdCByZXBvcnQgd2F0Y2ggZXZlbnRzIHdoZW4gb3ZlcmxheXMgYXJlIGFkZGVkLCBtb2RpZmllZAorLy8vIG9yIHJlbW92ZWQuCiBjbGFzcyBPdmVybGF5UmVzb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFJlc291cmNlUHJvdmlkZXIgewotICAvKioKLSAgICogVGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgZmlsZXMgYW5kIGZvbGRlcnMgdGhhdAotICAgKiBkbyBub3QgaGF2ZSBhbiBvdmVybGF5LgotICAgKi8KKyAgLy8vIFRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQKKyAgLy8vIGRvIG5vdCBoYXZlIGFuIG92ZXJsYXkuCiAgIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgYmFzZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBBIG1hcCBmcm9tIHRoZSBwYXRocyBvZiBmaWxlcyBmb3Igd2hpY2ggdGhlcmUgaXMgYW4gb3ZlcmxheSB0byB0aGUgY29udGVudHMKLSAgICogb2YgdGhlIGZpbGVzLgotICAgKi8KKyAgLy8vIEEgbWFwIGZyb20gdGhlIHBhdGhzIG9mIGZpbGVzIGZvciB3aGljaCB0aGVyZSBpcyBhbiBvdmVybGF5IHRvIHRoZQorICAvLy8gY29udGVudHMgb2YgdGhlIGZpbGVzLgogICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IF9vdmVybGF5Q29udGVudCA9IDxTdHJpbmcsIFN0cmluZz57fTsKIAotICAvKioKLSAgICogQSBtYXAgZnJvbSB0aGUgcGF0aHMgb2YgZmlsZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGFuIG92ZXJsYXkgdG8gdGhlCi0gICAqIG1vZGlmaWNhdGlvbiBzdGFtcHMgb2YgdGhlIGZpbGVzLgotICAgKi8KKyAgLy8vIEEgbWFwIGZyb20gdGhlIHBhdGhzIG9mIGZpbGVzIGZvciB3aGljaCB0aGVyZSBpcyBhbiBvdmVybGF5IHRvIHRoZQorICAvLy8gbW9kaWZpY2F0aW9uIHN0YW1wcyBvZiB0aGUgZmlsZXMuCiAgIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gX292ZXJsYXlNb2RpZmljYXRpb25TdGFtcHMgPSA8U3RyaW5nLCBpbnQ+e307CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHByb3ZpZGVyIHRvIHJlcHJlc2VudCBhbiBvdmVybGF5IG9uIHRoZQotICAgKiBnaXZlbiBbYmFzZVByb3ZpZGVyXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZXNvdXJjZSBwcm92aWRlciB0byByZXByZXNlbnQgYW4gb3ZlcmxheSBvbgorICAvLy8gdGhlIGdpdmVuIFtiYXNlUHJvdmlkZXJdLgogICBPdmVybGF5UmVzb3VyY2VQcm92aWRlcih0aGlzLmJhc2VQcm92aWRlcik7CiAKICAgQG92ZXJyaWRlCkBAIC04MSwxNiArNzEsMTIgQEAKICAgRm9sZGVyIGdldFN0YXRlTG9jYXRpb24oU3RyaW5nIHBsdWdpbklkKSA9PgogICAgICAgX092ZXJsYXlGb2xkZXIodGhpcywgYmFzZVByb3ZpZGVyLmdldFN0YXRlTG9jYXRpb24ocGx1Z2luSWQpKTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGVyZSBpcyBhbiBvdmVybGF5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4KLSAgICogW3BhdGhdLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gb3ZlcmxheSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgYXQgdGhlIGdpdmVuCisgIC8vLyBbcGF0aF0uCiAgIGJvb2wgaGFzT3ZlcmxheShTdHJpbmcgcGF0aCkgPT4gX292ZXJsYXlDb250ZW50LmNvbnRhaW5zS2V5KHBhdGgpOwogCi0gIC8qKgotICAgKiBSZW1vdmUgYW55IG92ZXJsYXkgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIFtwYXRoXS4gVGhlIHN0YXRlIG9mIHRoZSBmaWxlCi0gICAqIGluIHRoZSBiYXNlIHJlc291cmNlIHByb3ZpZGVyIHdpbGwgbm90IGJlIGFmZmVjdGVkLgotICAgKi8KKyAgLy8vIFJlbW92ZSBhbnkgb3ZlcmxheSBvZiB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gW3BhdGhdLiBUaGUgc3RhdGUgb2YgdGhlIGZpbGUKKyAgLy8vIGluIHRoZSBiYXNlIHJlc291cmNlIHByb3ZpZGVyIHdpbGwgbm90IGJlIGFmZmVjdGVkLgogICBib29sIHJlbW92ZU92ZXJsYXkoU3RyaW5nIHBhdGgpIHsKICAgICBib29sIGhhZE92ZXJsYXkgPSBfb3ZlcmxheUNvbnRlbnQuY29udGFpbnNLZXkocGF0aCk7CiAgICAgX292ZXJsYXlDb250ZW50LnJlbW92ZShwYXRoKTsKQEAgLTk4LDExICs4NCw5IEBACiAgICAgcmV0dXJuIGhhZE92ZXJsYXk7CiAgIH0KIAotICAvKioKLSAgICogT3ZlcmxheSB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gW3BhdGhdLiBUaGUgZmlsZSB3aWxsIGFwcGVhcgotICAgKiB0byBoYXZlIHRoZSBnaXZlbiBbY29udGVudF0gYW5kIFttb2RpZmljYXRpb25TdGFtcF0gZXZlbiBpZiB0aGUgZmlsZSBpcwotICAgKiBtb2RpZmllZCBpbiB0aGUgYmFzZSByZXNvdXJjZSBwcm92aWRlci4KLSAgICovCisgIC8vLyBPdmVybGF5IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBbcGF0aF0uIFRoZSBmaWxlIHdpbGwgYXBwZWFyCisgIC8vLyB0byBoYXZlIHRoZSBnaXZlbiBbY29udGVudF0gYW5kIFttb2RpZmljYXRpb25TdGFtcF0gZXZlbiBpZiB0aGUgZmlsZSBpcworICAvLy8gbW9kaWZpZWQgaW4gdGhlIGJhc2UgcmVzb3VyY2UgcHJvdmlkZXIuCiAgIHZvaWQgc2V0T3ZlcmxheShTdHJpbmcgcGF0aCwKICAgICAgIHtAcmVxdWlyZWQgU3RyaW5nIGNvbnRlbnQsIEByZXF1aXJlZCBpbnQgbW9kaWZpY2F0aW9uU3RhbXB9KSB7CiAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewpAQCAtMTEwLDE2ICs5NCwxNSBAQAogICAgICAgICAgICdPdmVybGF5UmVzb3VyY2VQcm92aWRlci5zZXRPdmVybGF5OiBjb250ZW50IGNhbm5vdCBiZSBudWxsJyk7CiAgICAgfSBlbHNlIGlmIChtb2RpZmljYXRpb25TdGFtcCA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKAotICAgICAgICAgICdPdmVybGF5UmVzb3VyY2VQcm92aWRlci5zZXRPdmVybGF5OiBtb2RpZmljYXRpb25TdGFtcCBjYW5ub3QgYmUgbnVsbCcpOworICAgICAgICAgICdPdmVybGF5UmVzb3VyY2VQcm92aWRlci5zZXRPdmVybGF5OiBtb2RpZmljYXRpb25TdGFtcCBjYW5ub3QgYmUgJworICAgICAgICAgICdudWxsJyk7CiAgICAgfQogICAgIF9vdmVybGF5Q29udGVudFtwYXRoXSA9IGNvbnRlbnQ7CiAgICAgX292ZXJsYXlNb2RpZmljYXRpb25TdGFtcHNbcGF0aF0gPSBtb2RpZmljYXRpb25TdGFtcDsKICAgfQogCi0gIC8qKgotICAgKiBDb3B5IGFueSBvdmVybGF5IGZvciB0aGUgZmlsZSBhdCB0aGUgW29sZFBhdGhdIHRvIGJlIGFuIG92ZXJsYXkgZm9yIHRoZQotICAgKiBmaWxlIHdpdGggdGhlIFtuZXdQYXRoXS4KLSAgICovCisgIC8vLyBDb3B5IGFueSBvdmVybGF5IGZvciB0aGUgZmlsZSBhdCB0aGUgW29sZFBhdGhdIHRvIGJlIGFuIG92ZXJsYXkgZm9yIHRoZQorICAvLy8gZmlsZSB3aXRoIHRoZSBbbmV3UGF0aF0uCiAgIHZvaWQgX2NvcHlPdmVybGF5KFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewogICAgIGlmIChoYXNPdmVybGF5KG9sZFBhdGgpKSB7CiAgICAgICBfb3ZlcmxheUNvbnRlbnRbbmV3UGF0aF0gPSBfb3ZlcmxheUNvbnRlbnRbb2xkUGF0aF07CkBAIC0xMjcsNDUgKzExMCwzMyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIG92ZXJsYXkgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIFtwYXRoXSwgb3IKLSAgICogYG51bGxgIGlmIHRoZXJlIGlzIG5vIG92ZXJsYXkgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIG92ZXJsYXkgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIFtwYXRoXSwgb3IKKyAgLy8vIGBudWxsYCBpZiB0aGVyZSBpcyBubyBvdmVybGF5IGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgIFN0cmluZyBfZ2V0T3ZlcmxheUNvbnRlbnQoU3RyaW5nIHBhdGgpIHsKICAgICByZXR1cm4gX292ZXJsYXlDb250ZW50W3BhdGhdOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mIHRoZSBvdmVybGF5IG9mIHRoZSBmaWxlIGF0IHRoZSBnaXZlbgotICAgKiBbcGF0aF0sIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBvdmVybGF5IGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIG92ZXJsYXkgb2YgdGhlIGZpbGUgYXQgdGhlIGdpdmVuCisgIC8vLyBbcGF0aF0sIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBvdmVybGF5IGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgIGludCBfZ2V0T3ZlcmxheU1vZGlmaWNhdGlvblN0YW1wKFN0cmluZyBwYXRoKSB7CiAgICAgcmV0dXJuIF9vdmVybGF5TW9kaWZpY2F0aW9uU3RhbXBzW3BhdGhdOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgaXMgYW4gb3ZlcmxheSBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGZpbGUKLSAgICogY29udGFpbmVkIGluc2lkZSB0aGUgZm9sZGVyIHdpdGggdGhlIGdpdmVuIFtmb2xkZXJQYXRoXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZXJlIGlzIGFuIG92ZXJsYXkgYXNzb2NpYXRlZCB3aXRoIGF0IGxlYXN0IG9uZSBmaWxlCisgIC8vLyBjb250YWluZWQgaW5zaWRlIHRoZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gW2ZvbGRlclBhdGhdLgogICBib29sIF9oYXNPdmVybGF5SW4oU3RyaW5nIGZvbGRlclBhdGgpID0+IF9vdmVybGF5Q29udGVudC5rZXlzCiAgICAgICAuYW55KChmaWxlUGF0aCkgPT4gcGF0aENvbnRleHQuaXNXaXRoaW4oZm9sZGVyUGF0aCwgZmlsZVBhdGgpKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBwYXRocyBvZiBhbGwgb2YgdGhlIG92ZXJsYWlkIGZpbGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZQotICAgKiBnaXZlbiBbZm9sZGVyXSwgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBwYXRocyBvZiBhbGwgb2YgdGhlIG92ZXJsYWlkIGZpbGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZQorICAvLy8gZ2l2ZW4gW2ZvbGRlcl0sIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LgogICBJdGVyYWJsZTxTdHJpbmc+IF9vdmVybGF5c0luRm9sZGVyKFN0cmluZyBmb2xkZXJQYXRoKSA9PiBfb3ZlcmxheUNvbnRlbnQua2V5cwogICAgICAgLndoZXJlKChmaWxlUGF0aCkgPT4gcGF0aENvbnRleHQuaXNXaXRoaW4oZm9sZGVyUGF0aCwgZmlsZVBhdGgpKTsKIH0KIAotLyoqCi0gKiBBIGZpbGUgZnJvbSBhbiBbT3ZlcmxheVJlc291cmNlUHJvdmlkZXJdLgotICovCisvLy8gQSBmaWxlIGZyb20gYW4gW092ZXJsYXlSZXNvdXJjZVByb3ZpZGVyXS4KIGNsYXNzIF9PdmVybGF5RmlsZSBleHRlbmRzIF9PdmVybGF5UmVzb3VyY2UgaW1wbGVtZW50cyBGaWxlIHsKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGZpbGUgdG8gaGF2ZSB0aGUgZ2l2ZW4gW3Byb3ZpZGVyXSBhbmQgdG8KLSAgICogY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gW2ZpbGVdIGZyb20gdGhlIHByb3ZpZGVyJ3MgYmFzZSByZXNvdXJjZSBwcm92aWRlci4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBmaWxlIHRvIGhhdmUgdGhlIGdpdmVuIFtwcm92aWRlcl0gYW5kIHRvCisgIC8vLyBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiBbZmlsZV0gZnJvbSB0aGUgcHJvdmlkZXIncyBiYXNlIHJlc291cmNlIHByb3ZpZGVyLgogICBfT3ZlcmxheUZpbGUoT3ZlcmxheVJlc291cmNlUHJvdmlkZXIgcHJvdmlkZXIsIEZpbGUgZmlsZSkKICAgICAgIDogc3VwZXIocHJvdmlkZXIsIGZpbGUpOwogCkBAIC0xOTMsMTAgKzE2NCw4IEBACiAgICAgcmV0dXJuIF9maWxlLm1vZGlmaWNhdGlvblN0YW1wOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZmlsZSBmcm9tIHRoZSBiYXNlIHJlc291cmNlIHByb3ZpZGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcwotICAgKiBmb2xkZXIuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBmaWxlIGZyb20gdGhlIGJhc2UgcmVzb3VyY2UgcHJvdmlkZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzCisgIC8vLyBmb2xkZXIuCiAgIEZpbGUgZ2V0IF9maWxlID0+IF9yZXNvdXJjZSBhcyBGaWxlOwogCiAgIEBvdmVycmlkZQpAQCAtMjcxLDE1ICsyNDAsMTEgQEAKICAgfQogfQogCi0vKioKLSAqIEEgZm9sZGVyIGZyb20gYW4gW092ZXJsYXlSZXNvdXJjZVByb3ZpZGVyXS4KLSAqLworLy8vIEEgZm9sZGVyIGZyb20gYW4gW092ZXJsYXlSZXNvdXJjZVByb3ZpZGVyXS4KIGNsYXNzIF9PdmVybGF5Rm9sZGVyIGV4dGVuZHMgX092ZXJsYXlSZXNvdXJjZSBpbXBsZW1lbnRzIEZvbGRlciB7Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBmb2xkZXIgdG8gaGF2ZSB0aGUgZ2l2ZW4gW3Byb3ZpZGVyXSBhbmQgdG8KLSAgICogY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gW2ZvbGRlcl0gZnJvbSB0aGUgcHJvdmlkZXIncyBiYXNlIHJlc291cmNlCi0gICAqIHByb3ZpZGVyLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGZvbGRlciB0byBoYXZlIHRoZSBnaXZlbiBbcHJvdmlkZXJdIGFuZCB0bworICAvLy8gY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gW2ZvbGRlcl0gZnJvbSB0aGUgcHJvdmlkZXIncyBiYXNlIHJlc291cmNlCisgIC8vLyBwcm92aWRlci4KICAgX092ZXJsYXlGb2xkZXIoT3ZlcmxheVJlc291cmNlUHJvdmlkZXIgcHJvdmlkZXIsIEZvbGRlciBmb2xkZXIpCiAgICAgICA6IHN1cGVyKHByb3ZpZGVyLCBmb2xkZXIpOwogCkBAIC0yODksMTAgKzI1NCw4IEBACiAgIEBvdmVycmlkZQogICBib29sIGdldCBleGlzdHMgPT4gX3Byb3ZpZGVyLl9oYXNPdmVybGF5SW4ocGF0aCkgfHwgX3Jlc291cmNlLmV4aXN0czsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBmb2xkZXIgZnJvbSB0aGUgYmFzZSByZXNvdXJjZSBwcm92aWRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKLSAgICogZm9sZGVyLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZm9sZGVyIGZyb20gdGhlIGJhc2UgcmVzb3VyY2UgcHJvdmlkZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzCisgIC8vLyBmb2xkZXIuCiAgIEZvbGRlciBnZXQgX2ZvbGRlciA9PiBfcmVzb3VyY2UgYXMgRm9sZGVyOwogCiAgIEBvdmVycmlkZQpAQCAtMzQyLDggKzMwNSw4IEBACiAgICAgICAgIGNoaWxkcmVuW2NoaWxkLnBhdGhdID0gX092ZXJsYXlSZXNvdXJjZS5fZnJvbShfcHJvdmlkZXIsIGNoaWxkKTsKICAgICAgIH0KICAgICB9IG9uIEZpbGVTeXN0ZW1FeGNlcHRpb24gewotICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB0aHJvdyBpZiB3ZSdyZSBhIGZvbGRlciB0aGF0IG9ubHkgZXhpc3RzIGluIHRoZSBvdmVybGF5Ci0gICAgICAvLyBhbmQgbm90IG9uIGRpc2suCisgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlJ3JlIGEgZm9sZGVyIHRoYXQgb25seSBleGlzdHMgaW4gdGhlCisgICAgICAvLyBvdmVybGF5IGFuZCBub3Qgb24gZGlzay4KICAgICB9CiAKICAgICBmb3IgKFN0cmluZyBvdmVybGF5UGF0aCBpbiBfcHJvdmlkZXIuX292ZXJsYXlzSW5Gb2xkZXIocGF0aCkpIHsKQEAgLTM2MSwzMiArMzI0LDIyIEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgcmVzb3VyY2VzIGZyb20gYW4gW092ZXJsYXlSZXNvdXJjZVByb3ZpZGVyXS4KLSAqLworLy8vIFRoZSBiYXNlIGNsYXNzIGZvciByZXNvdXJjZXMgZnJvbSBhbiBbT3ZlcmxheVJlc291cmNlUHJvdmlkZXJdLgogYWJzdHJhY3QgY2xhc3MgX092ZXJsYXlSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc291cmNlIHsKLSAgLyoqCi0gICAqIFRoZSByZXNvdXJjZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNvdXJjZS4KLSAgICovCisgIC8vLyBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzb3VyY2UuCiAgIGZpbmFsIE92ZXJsYXlSZXNvdXJjZVByb3ZpZGVyIF9wcm92aWRlcjsKIAotICAvKioKLSAgICogVGhlIHJlc291cmNlIGZyb20gdGhlIHByb3ZpZGVyJ3MgYmFzZSBwcm92aWRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKLSAgICogcmVzb3VyY2UuCi0gICAqLworICAvLy8gVGhlIHJlc291cmNlIGZyb20gdGhlIHByb3ZpZGVyJ3MgYmFzZSBwcm92aWRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKKyAgLy8vIHJlc291cmNlLgogICBmaW5hbCBSZXNvdXJjZSBfcmVzb3VyY2U7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIG9mIGEgcmVzb3VyY2UgdG8gaGF2ZSB0aGUgZ2l2ZW4KLSAgICogW19wcm92aWRlcl0gYW5kIHRvIHJlcHJlc2VudCB0aGUgW19yZXNvdXJjZV0gZnJvbSB0aGUgcHJvdmlkZXIncyBiYXNlCi0gICAqIHJlc291cmNlIHByb3ZpZGVyLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIG9mIGEgcmVzb3VyY2UgdG8gaGF2ZSB0aGUgZ2l2ZW4KKyAgLy8vIFtfcHJvdmlkZXJdIGFuZCB0byByZXByZXNlbnQgdGhlIFtfcmVzb3VyY2VdIGZyb20gdGhlIHByb3ZpZGVyJ3MgYmFzZQorICAvLy8gcmVzb3VyY2UgcHJvdmlkZXIuCiAgIF9PdmVybGF5UmVzb3VyY2UodGhpcy5fcHJvdmlkZXIsIHRoaXMuX3Jlc291cmNlKTsKIAotICAvKioKLSAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0gICAqIFtyZXNvdXJjZV0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFtwcm92aWRlcl0uCi0gICAqLworICAvLy8gUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyBnaXZlbiBbcmVzb3VyY2VdIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBbcHJvdmlkZXJdLgogICBmYWN0b3J5IF9PdmVybGF5UmVzb3VyY2UuX2Zyb20oCiAgICAgICBPdmVybGF5UmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKICAgICBpZiAocmVzb3VyY2UgaXMgRm9sZGVyKSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL3BoeXNpY2FsX2ZpbGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL2ZpbGVfc3lzdGVtL3BoeXNpY2FsX2ZpbGVfc3lzdGVtLmRhcnQKaW5kZXggMmJkNDM0My4uYmQ5MTRlMiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9maWxlX3N5c3RlbS9waHlzaWNhbF9maWxlX3N5c3RlbS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvZmlsZV9zeXN0ZW0vcGh5c2ljYWxfZmlsZV9zeXN0ZW0uZGFydApAQCAtMTIsMTkgKzEyLDE1IEBACiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOndhdGNoZXIvd2F0Y2hlci5kYXJ0JzsKIAotLyoqCi0gKiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcGx1Z2luIHNwZWNpZmljIHN1YmZvbGRlcnMgdXNlZCB0byBzdG9yZQotICogZGF0YSBhY3Jvc3Mgc2Vzc2lvbnMuCi0gKi8KKy8vLyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcGx1Z2luIHNwZWNpZmljIHN1YmZvbGRlcnMgdXNlZCB0bworLy8vIHN0b3JlIGRhdGEgYWNyb3NzIHNlc3Npb25zLgogY29uc3QgU3RyaW5nIF9TRVJWRVJfRElSID0gIi5kYXJ0U2VydmVyIjsKIAotLyoqCi0gKiBSZXR1cm5zIHRoZSBwYXRoIHRvIGRlZmF1bHQgc3RhdGUgbG9jYXRpb24uCi0gKgotICogR2VuZXJhbGx5IHRoaXMgaXMgfi8uZGFydFNlcnZlci4gSXQgY2FuIGJlIG92ZXJyaWRkZW4gdmlhIHRoZQotICogQU5BTFlaRVJfU1RBVEVfTE9DQVRJT05fT1ZFUlJJREUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGluIHdoaWNoIGNhc2UgdGhpcwotICogbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlLgotICovCisvLy8gUmV0dXJucyB0aGUgcGF0aCB0byBkZWZhdWx0IHN0YXRlIGxvY2F0aW9uLgorLy8vCisvLy8gR2VuZXJhbGx5IHRoaXMgaXMgfi8uZGFydFNlcnZlci4gSXQgY2FuIGJlIG92ZXJyaWRkZW4gdmlhIHRoZQorLy8vIEFOQUxZWkVSX1NUQVRFX0xPQ0FUSU9OX09WRVJSSURFIGVudmlyb25tZW50IHZhcmlhYmxlLCBpbiB3aGljaCBjYXNlIHRoaXMKKy8vLyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUuCiBTdHJpbmcgX2dldFN0YW5kYXJkU3RhdGVMb2NhdGlvbigpIHsKICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBpby5QbGF0Zm9ybS5lbnZpcm9ubWVudDsKICAgaWYgKGVudi5jb250YWluc0tleSgnQU5BTFlaRVJfU1RBVEVfTE9DQVRJT05fT1ZFUlJJREUnKSkgewpAQCAtMzcsMTQgKzMzLDEyIEBACiAgICAgICA6IG51bGw7CiB9CiAKLS8qKgotICogUmV0dXJuIG1vZGlmaWNhdGlvbiB0aW1lcyBmb3IgZXZlcnkgZmlsZSBwYXRoIGluIFtwYXRoc10uCi0gKgotICogSWYgYSBwYXRoIGlzIGBudWxsYCwgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIGFsc28gYG51bGxgLgotICoKLSAqIElmIGFueSBleGNlcHRpb24gaGFwcGVucywgdGhlIGZpbGUgaXMgY29uc2lkZXJlZCBhcyBhIG5vdCBleGlzdGluZyBhbmQKLSAqIGAtMWAgaXMgaXRzIG1vZGlmaWNhdGlvbiB0aW1lLgotICovCisvLy8gUmV0dXJuIG1vZGlmaWNhdGlvbiB0aW1lcyBmb3IgZXZlcnkgZmlsZSBwYXRoIGluIFtwYXRoc10uCisvLy8KKy8vLyBJZiBhIHBhdGggaXMgYG51bGxgLCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgYWxzbyBgbnVsbGAuCisvLy8KKy8vLyBJZiBhbnkgZXhjZXB0aW9uIGhhcHBlbnMsIHRoZSBmaWxlIGlzIGNvbnNpZGVyZWQgYXMgYSBub3QgZXhpc3RpbmcgYW5kCisvLy8gYC0xYCBpcyBpdHMgbW9kaWZpY2F0aW9uIHRpbWUuCiBMaXN0PGludD4gX3BhdGhzVG9UaW1lcyhMaXN0PFN0cmluZz4gcGF0aHMpIHsKICAgcmV0dXJuIHBhdGhzLm1hcCgocGF0aCkgewogICAgIGlmIChwYXRoICE9IG51bGwpIHsKQEAgLTYwLDkgKzU0LDcgQEAKICAgfSkudG9MaXN0KCk7CiB9CiAKLS8qKgotICogQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW1Jlc291cmNlUHJvdmlkZXJdLgotICovCisvLy8gQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW1Jlc291cmNlUHJvdmlkZXJdLgogY2xhc3MgUGh5c2ljYWxSZXNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUmVzb3VyY2VQcm92aWRlciB7CiAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRnVuY3Rpb24oU3RyaW5nKSBOT1JNQUxJWkVfRU9MX0FMV0FZUyA9CiAgICAgICAoU3RyaW5nIHN0cmluZykgPT4gc3RyaW5nLnJlcGxhY2VBbGwoUmVnRXhwKCdcclxuPycpLCAnXG4nKTsKQEAgLTcwLDkgKzYyLDcgQEAKICAgc3RhdGljIGZpbmFsIFBoeXNpY2FsUmVzb3VyY2VQcm92aWRlciBJTlNUQU5DRSA9CiAgICAgICBQaHlzaWNhbFJlc291cmNlUHJvdmlkZXIobnVsbCk7CiAKLSAgLyoqCi0gICAqIFRoZSBwYXRoIHRvIHRoZSBiYXNlIGZvbGRlciB3aGVyZSBzdGF0ZSBpcyBzdG9yZWQuCi0gICAqLworICAvLy8gVGhlIHBhdGggdG8gdGhlIGJhc2UgZm9sZGVyIHdoZXJlIHN0YXRlIGlzIHN0b3JlZC4KICAgZmluYWwgU3RyaW5nIF9zdGF0ZUxvY2F0aW9uOwogCiAgIFBoeXNpY2FsUmVzb3VyY2VQcm92aWRlcihTdHJpbmcgRnVuY3Rpb24oU3RyaW5nKSBmaWxlUmVhZE1vZGUsCkBAIC0xMjQsMTAgKzExNCw4IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICAvKioKLSAgICogVGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHN1cHBvcnRzIG9ubHkgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQgcGF0aHMuCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdmFsaWRhdGUgYW55IGlucHV0IHBhdGhzIHRvIHByZXZlbnQgZXJyb3JzIGxhdGVyLgotICAgKi8KKyAgLy8vIFRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiBzdXBwb3J0cyBvbmx5IGFic29sdXRlIGFuZCBub3JtYWxpemVkIHBhdGhzLgorICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB2YWxpZGF0ZSBhbnkgaW5wdXQgcGF0aHMgdG8gcHJldmVudCBlcnJvcnMgbGF0ZXIuCiAgIHZvaWQgX2Vuc3VyZUFic29sdXRlQW5kTm9ybWFsaXplZChTdHJpbmcgcGF0aCkgewogICAgIGFzc2VydCgoKSB7CiAgICAgICBpZiAoIXBhdGhDb250ZXh0LmlzQWJzb2x1dGUocGF0aCkpIHsKQEAgLTE0MSw5ICsxMjksNyBAQAogICB9CiB9CiAKLS8qKgotICogQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVdLgotICovCisvLy8gQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW0ZpbGVdLgogY2xhc3MgX1BoeXNpY2FsRmlsZSBleHRlbmRzIF9QaHlzaWNhbFJlc291cmNlIGltcGxlbWVudHMgRmlsZSB7CiAgIF9QaHlzaWNhbEZpbGUoaW8uRmlsZSBmaWxlKSA6IHN1cGVyKGZpbGUpOwogCkBAIC0xNjgsOSArMTU0LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGZpbGUgYmVpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyB3cmFwcGVyLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgdW5kZXJseWluZyBmaWxlIGJlaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgd3JhcHBlci4KICAgaW8uRmlsZSBnZXQgX2ZpbGUgPT4gX2VudHJ5IGFzIGlvLkZpbGU7CiAKICAgQG92ZXJyaWRlCkBAIC0yNTEsOSArMjM1LDcgQEAKICAgfQogfQogCi0vKioKLSAqIEEgYGRhcnQ6aW9gIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFtGb2xkZXJdLgotICovCisvLy8gQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW0ZvbGRlcl0uCiBjbGFzcyBfUGh5c2ljYWxGb2xkZXIgZXh0ZW5kcyBfUGh5c2ljYWxSZXNvdXJjZSBpbXBsZW1lbnRzIEZvbGRlciB7CiAgIF9QaHlzaWNhbEZvbGRlcihpby5EaXJlY3RvcnkgZGlyZWN0b3J5KSA6IHN1cGVyKGRpcmVjdG9yeSk7CiAKQEAgLTI2Nyw5ICsyNDksNyBAQAogICAgICAgICAgICAgICAhZXJyb3IubWVzc2FnZQogICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgoIkRpcmVjdG9yeSB3YXRjaGVyIGNsb3NlZCB1bmV4cGVjdGVkbHkiKSk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdW5kZXJseWluZyBmaWxlIGJlaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgd3JhcHBlci4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHVuZGVybHlpbmcgZmlsZSBiZWluZyByZXByZXNlbnRlZCBieSB0aGlzIHdyYXBwZXIuCiAgIGlvLkRpcmVjdG9yeSBnZXQgX2RpcmVjdG9yeSA9PiBfZW50cnkgYXMgaW8uRGlyZWN0b3J5OwogCiAgIEBvdmVycmlkZQpAQCAtMzYxLDkgKzM0MSw3IEBACiAgIFVyaSB0b1VyaSgpID0+IFVyaS5kaXJlY3RvcnkocGF0aCk7CiB9CiAKLS8qKgotICogQSBgZGFydDppb2AgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgW1Jlc291cmNlXS4KLSAqLworLy8vIEEgYGRhcnQ6aW9gIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFtSZXNvdXJjZV0uCiBhYnN0cmFjdCBjbGFzcyBfUGh5c2ljYWxSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc291cmNlIHsKICAgZmluYWwgaW8uRmlsZVN5c3RlbUVudGl0eSBfZW50cnk7CiAKQEAgLTM3OSw3ICszNTcsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIGdldCBoYXNoQ29kZSA9PiBwYXRoLmhhc2hDb2RlOworICBpbnQgZ2V0IGhhc2hDb2RlID0+IHBhdGguaGFzaENvZGU7CiAKICAgQG92ZXJyaWRlCiAgIEZvbGRlciBnZXQgcGFyZW50IHsKQEAgLTM5Myw5ICszNzEsNyBAQAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIGdldCBwYXRoID0+IF9lbnRyeS5wYXRoOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBhdGggY29udGV4dCB1c2VkIGJ5IHRoaXMgcmVzb3VyY2UgcHJvdmlkZXIuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBwYXRoIGNvbnRleHQgdXNlZCBieSB0aGlzIHJlc291cmNlIHByb3ZpZGVyLgogICBDb250ZXh0IGdldCBwYXRoQ29udGV4dCA9PiBpby5QbGF0Zm9ybS5pc1dpbmRvd3MgPyB3aW5kb3dzIDogcG9zaXg7CiAKICAgQG92ZXJyaWRlCkBAIC00MjEsMTIgKzM5NywxMCBAQAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gcGF0aDsKIAotICAvKioKLSAgICogSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cyBhbmQgdGhlIHJlc291cmNlIHJlZmVyZW5jZXMgb25lIG9mIHRoZQotICAgKiBkZXZpY2UgZHJpdmVycywgdGhyb3cgYSBbRmlsZVN5c3RlbUV4Y2VwdGlvbl0uCi0gICAqCi0gICAqIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzc0NDk2Ci0gICAqLworICAvLy8gSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgV2luZG93cyBhbmQgdGhlIHJlc291cmNlIHJlZmVyZW5jZXMgb25lIG9mIHRoZQorICAvLy8gZGV2aWNlIGRyaXZlcnMsIHRocm93IGEgW0ZpbGVTeXN0ZW1FeGNlcHRpb25dLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzc0NDk2CiAgIHZvaWQgX3Rocm93SWZXaW5kb3dzRGV2aWNlRHJpdmVyKCkgewogICAgIGlmIChpby5QbGF0Zm9ybS5pc1dpbmRvd3MpIHsKICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSB0aGlzLnNob3J0TmFtZS50b1VwcGVyQ2FzZSgpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zb3VyY2UvbGluZV9pbmZvLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NvdXJjZS9saW5lX2luZm8uZGFydAppbmRleCBkYTAzYzNiLi5kYmQwZTJmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NvdXJjZS9saW5lX2luZm8uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NvdXJjZS9saW5lX2luZm8uZGFydApAQCAtNSw0MSArNSwyOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiAKLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIGEgY2hhcmFjdGVyIHJlcHJlc2VudGVkIGFzIGEgbGluZSBhbmQgY29sdW1uIHBhaXIuCi0gKi8KKy8vLyBUaGUgbG9jYXRpb24gb2YgYSBjaGFyYWN0ZXIgcmVwcmVzZW50ZWQgYXMgYSBsaW5lIGFuZCBjb2x1bW4gcGFpci4KIC8vIGlnbm9yZTogZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCiBjbGFzcyBDaGFyYWN0ZXJMb2NhdGlvbiBleHRlbmRzIExpbmVJbmZvX0xvY2F0aW9uIHsKICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgUmVwbGFjZSB0aGUgYm9keSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGJvZHkgb2YKICAgLy8gTGluZUluZm9fTG9jYXRpb24gYW5kIHJlbW92ZSBMaW5lSW5mb19Mb2NhdGlvbi4KLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGxvY2F0aW9uIHRvIHJlcHJlc2VudCB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAqIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gW2xpbmVOdW1iZXJdIGFuZCBbY29sdW1uTnVtYmVyXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBsb2NhdGlvbiB0byByZXByZXNlbnQgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAvLy8gY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBbbGluZU51bWJlcl0gYW5kIFtjb2x1bW5OdW1iZXJdLgogICBDaGFyYWN0ZXJMb2NhdGlvbihpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKICAgICAgIDogc3VwZXIobGluZU51bWJlciwgY29sdW1uTnVtYmVyKTsKIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gd2l0aGluIGEgc291cmNlIGZpbGUuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gd2l0aGluIGEgc291cmNlIGZpbGUuCiBjbGFzcyBMaW5lSW5mbyB7Ci0gIC8qKgotICAgKiBBIGxpc3QgY29udGFpbmluZyB0aGUgb2Zmc2V0cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggbGluZSBpbiB0aGUKLSAgICogc291cmNlIGNvZGUuCi0gICAqLworICAvLy8gQSBsaXN0IGNvbnRhaW5pbmcgdGhlIG9mZnNldHMgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBlYWNoIGxpbmUgaW4gdGhlCisgIC8vLyBzb3VyY2UgY29kZS4KICAgZmluYWwgTGlzdDxpbnQ+IGxpbmVTdGFydHM7CiAKLSAgLyoqCi0gICAqIFRoZSB6ZXJvLWJhc2VkIFtsaW5lU3RhcnRzXSBpbmRleCByZXN1bHRpbmcgZnJvbSB0aGUgbGFzdCBjYWxsIHRvCi0gICAqIFtnZXRMb2NhdGlvbl0uCi0gICAqLworICAvLy8gVGhlIHplcm8tYmFzZWQgW2xpbmVTdGFydHNdIGluZGV4IHJlc3VsdGluZyBmcm9tIHRoZSBsYXN0IGNhbGwgdG8KKyAgLy8vIFtnZXRMb2NhdGlvbl0uCiAgIGludCBfcHJldmlvdXNMaW5lID0gMDsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2V0IG9mIGxpbmUgaW5mb3JtYXRpb24gdG8gcmVwcmVzZW50IHRoZSBkYXRhCi0gICAqIGVuY29kZWQgaW4gdGhlIGdpdmVuIGxpc3Qgb2YgW2xpbmVTdGFydHNdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNldCBvZiBsaW5lIGluZm9ybWF0aW9uIHRvIHJlcHJlc2VudCB0aGUgZGF0YQorICAvLy8gZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gbGlzdCBvZiBbbGluZVN0YXJ0c10uCiAgIExpbmVJbmZvKHRoaXMubGluZVN0YXJ0cykgewogICAgIGlmIChsaW5lU3RhcnRzID09IG51bGwpIHsKICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoImxpbmVTdGFydHMgbXVzdCBiZSBub24tbnVsbCIpOwpAQCAtNDgsMjUgKzM2LDE4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNldCBvZiBsaW5lIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqIGdpdmVuIGZpbGUgW2NvbnRlbnRdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNldCBvZiBsaW5lIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyBnaXZlbiBmaWxlIFtjb250ZW50XS4KICAgZmFjdG9yeSBMaW5lSW5mby5mcm9tQ29udGVudChTdHJpbmcgY29udGVudCkgPT4KICAgICAgIExpbmVJbmZvKFN0cmluZ1V0aWxpdGllcy5jb21wdXRlTGluZVN0YXJ0cyhjb250ZW50KSk7CiAKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgbGluZXMuCi0gICAqLworICAvLy8gVGhlIG51bWJlciBvZiBsaW5lcy4KICAgaW50IGdldCBsaW5lQ291bnQgPT4gbGluZVN0YXJ0cy5sZW5ndGg7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIFtvZmZzZXRdLgotICAgKgotICAgKiBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJIHdpbGwgcmV0dXJuIGEgW0NoYXJhY3RlckxvY2F0aW9uXSByYXRoZXIgdGhhbgotICAgICAgICAvLyBpZ25vcmU6IGRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQotICAgKiBhIFtMaW5lSW5mb19Mb2NhdGlvbl0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gW29mZnNldF0uCisgIC8vLworICAvLy8gQSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIEFQSSB3aWxsIHJldHVybiBhIFtDaGFyYWN0ZXJMb2NhdGlvbl0gcmF0aGVyIHRoYW4KKyAgLy8vIGEgW0xpbmVJbmZvX0xvY2F0aW9uXS4gLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKICAgTGluZUluZm9fTG9jYXRpb24gZ2V0TG9jYXRpb24oaW50IG9mZnNldCkgewogICAgIHZhciBtaW4gPSAwOwpAQCAtMTAyLDEwICs4Myw4IEBACiAgICAgcmV0dXJuIENoYXJhY3RlckxvY2F0aW9uKG1pbiArIDEsIG9mZnNldCAtIGxpbmVTdGFydHNbbWluXSArIDEpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUgd2l0aCB0aGUgZ2l2ZW4KLSAgICogW2xpbmVOdW1iZXJdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIFtsaW5lTnVtYmVyXS4KICAgaW50IGdldE9mZnNldE9mTGluZShpbnQgbGluZU51bWJlcikgewogICAgIGlmIChsaW5lTnVtYmVyIDwgMCB8fCBsaW5lTnVtYmVyID49IGxpbmVDb3VudCkgewogICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigKQEAgLTExNCwxMCArOTMsOCBAQAogICAgIHJldHVybiBsaW5lU3RhcnRzW2xpbmVOdW1iZXJdOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUgZm9sbG93aW5nIHRoZSBsaW5lCi0gICAqIGNvbnRhaW5pbmcgdGhlIGdpdmVuIFtvZmZzZXRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUgZm9sbG93aW5nIHRoZSBsaW5lCisgIC8vLyBjb250YWluaW5nIHRoZSBnaXZlbiBbb2Zmc2V0XS4KICAgaW50IGdldE9mZnNldE9mTGluZUFmdGVyKGludCBvZmZzZXQpIHsKICAgICByZXR1cm4gZ2V0T2Zmc2V0T2ZMaW5lKGdldExvY2F0aW9uKG9mZnNldCkubGluZU51bWJlcik7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc291cmNlL3NvdXJjZV9yYW5nZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zb3VyY2Uvc291cmNlX3JhbmdlLmRhcnQKaW5kZXggNGFjN2E5Mi4uZDkzNGFiZCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zb3VyY2Uvc291cmNlX3JhbmdlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zb3VyY2Uvc291cmNlX3JhbmdlLmRhcnQKQEAgLTQsMzUgKzQsMjMgQEAKIAogaW1wb3J0ICJkYXJ0Om1hdGgiIGFzIG1hdGg7CiAKLS8qKgotICogQSBzb3VyY2UgcmFuZ2UgZGVmaW5lcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aGluIHNvdXJjZSBjb2RlLgotICovCisvLy8gQSBzb3VyY2UgcmFuZ2UgZGVmaW5lcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aGluIHNvdXJjZSBjb2RlLgogY2xhc3MgU291cmNlUmFuZ2UgewotICAvKioKLSAgICogQW4gZW1wdHkgc291cmNlIHJhbmdlIChhIHJhbmdlIHdpdGggb2Zmc2V0IGAwYCBhbmQgbGVuZ3RoIGAwYCkuCi0gICAqLworICAvLy8gQW4gZW1wdHkgc291cmNlIHJhbmdlIChhIHJhbmdlIHdpdGggb2Zmc2V0IGAwYCBhbmQgbGVuZ3RoIGAwYCkuCiAgIHN0YXRpYyBjb25zdCBTb3VyY2VSYW5nZSBFTVBUWSA9IFNvdXJjZVJhbmdlKDAsIDApOwogCi0gIC8qKgotICAgKiBUaGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzb3VyY2UgcmFuZ2UuCi0gICAqLworICAvLy8gVGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc291cmNlIHJhbmdlLgogICBmaW5hbCBpbnQgb2Zmc2V0OwogCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSByYW5nZS4KLSAgICovCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSByYW5nZS4KICAgZmluYWwgaW50IGxlbmd0aDsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc291cmNlIHJhbmdlIHVzaW5nIHRoZSBnaXZlbiBbb2Zmc2V0XSBhbmQKLSAgICogW2xlbmd0aF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc291cmNlIHJhbmdlIHVzaW5nIHRoZSBnaXZlbiBbb2Zmc2V0XSBhbmQKKyAgLy8vIFtsZW5ndGhdLgogICBjb25zdCBTb3VyY2VSYW5nZSh0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciB0aGlzIHNvdXJjZQotICAgKiByYW5nZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciB0aGlzIHNvdXJjZQorICAvLy8gcmFuZ2UuCiAgIGludCBnZXQgZW5kID0+IG9mZnNldCArIGxlbmd0aDsKIAogICBAb3ZlcnJpZGUKQEAgLTQ1LDU3ICszMyw0MCBAQAogICAgICAgICBvdGhlci5sZW5ndGggPT0gbGVuZ3RoOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgW3hdIGlzIGluIHRoZSBpbnRlcnZhbCBgW29mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoXWAuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBbeF0gaXMgaW4gdGhlIGludGVydmFsIGBbb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGhdYC4KICAgYm9vbCBjb250YWlucyhpbnQgeCkgPT4gb2Zmc2V0IDw9IHggJiYgeCA8PSBvZmZzZXQgKyBsZW5ndGg7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgW3hdIGlzIGluIHRoZSBpbnRlcnZhbCBgKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKWAuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBbeF0gaXMgaW4gdGhlIGludGVydmFsIGAob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpYC4KICAgYm9vbCBjb250YWluc0V4Y2x1c2l2ZShpbnQgeCkgPT4gb2Zmc2V0IDwgeCAmJiB4IDwgb2Zmc2V0ICsgbGVuZ3RoOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbb3RoZXJSYW5nZV0gY292ZXJzIHRoaXMgc291cmNlIHJhbmdlLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtvdGhlclJhbmdlXSBjb3ZlcnMgdGhpcyBzb3VyY2UgcmFuZ2UuCiAgIGJvb2wgY292ZXJlZEJ5KFNvdXJjZVJhbmdlIG90aGVyUmFuZ2UpID0+IG90aGVyUmFuZ2UuY292ZXJzKHRoaXMpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc291cmNlIHJhbmdlIGNvdmVycyB0aGUgW290aGVyUmFuZ2VdLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBzb3VyY2UgcmFuZ2UgY292ZXJzIHRoZSBbb3RoZXJSYW5nZV0uCiAgIGJvb2wgY292ZXJzKFNvdXJjZVJhbmdlIG90aGVyUmFuZ2UpID0+CiAgICAgICBvZmZzZXQgPD0gb3RoZXJSYW5nZS5vZmZzZXQgJiYgb3RoZXJSYW5nZS5lbmQgPD0gZW5kOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc291cmNlIHJhbmdlIGVuZHMgaW5zaWRlIHRoZSBbb3RoZXJSYW5nZV0uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHNvdXJjZSByYW5nZSBlbmRzIGluc2lkZSB0aGUgW290aGVyUmFuZ2VdLgogICBib29sIGVuZHNJbihTb3VyY2VSYW5nZSBvdGhlclJhbmdlKSB7CiAgICAgaW50IHRoaXNFbmQgPSBlbmQ7CiAgICAgcmV0dXJuIG90aGVyUmFuZ2UuY29udGFpbnModGhpc0VuZCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgc291cmNlIHJhbmdlIGNvdmVyaW5nIFtkZWx0YV0gY2hhcmFjdGVycyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoaXMKLSAgICogc291cmNlIHJhbmdlIGFuZCBbZGVsdGFdIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIHNvdXJjZSByYW5nZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBzb3VyY2UgcmFuZ2UgY292ZXJpbmcgW2RlbHRhXSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhpcworICAvLy8gc291cmNlIHJhbmdlIGFuZCBbZGVsdGFdIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIHNvdXJjZSByYW5nZS4KICAgU291cmNlUmFuZ2UgZ2V0RXhwYW5kZWQoaW50IGRlbHRhKSA9PgogICAgICAgU291cmNlUmFuZ2Uob2Zmc2V0IC0gZGVsdGEsIGRlbHRhICsgbGVuZ3RoICsgZGVsdGEpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzb3VyY2UgcmFuZ2Ugd2l0aCB0aGUgc2FtZSBvZmZzZXQgYXMgdGhpcyBzb3VyY2UgcmFuZ2UgYnV0IHdob3NlCi0gICAqIGxlbmd0aCBpcyBbZGVsdGFdIGNoYXJhY3RlcnMgbG9uZ2VyIHRoYW4gdGhpcyBzb3VyY2UgcmFuZ2UuCi0gICAqLworICAvLy8gUmV0dXJuIGEgc291cmNlIHJhbmdlIHdpdGggdGhlIHNhbWUgb2Zmc2V0IGFzIHRoaXMgc291cmNlIHJhbmdlIGJ1dCB3aG9zZQorICAvLy8gbGVuZ3RoIGlzIFtkZWx0YV0gY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGlzIHNvdXJjZSByYW5nZS4KICAgU291cmNlUmFuZ2UgZ2V0TW92ZUVuZChpbnQgZGVsdGEpID0+IFNvdXJjZVJhbmdlKG9mZnNldCwgbGVuZ3RoICsgZGVsdGEpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzb3VyY2UgcmFuZ2Ugd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhpcyBzb3VyY2UgcmFuZ2UgYnV0IHdob3NlCi0gICAqIG9mZnNldCBpcyBbZGVsdGFdIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIG9mZnNldCBvZiB0aGlzIHNvdXJjZSByYW5nZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBzb3VyY2UgcmFuZ2Ugd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhpcyBzb3VyY2UgcmFuZ2UgYnV0IHdob3NlCisgIC8vLyBvZmZzZXQgaXMgW2RlbHRhXSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBvZmZzZXQgb2YgdGhpcyBzb3VyY2UgcmFuZ2UuCiAgIFNvdXJjZVJhbmdlIGdldFRyYW5zbGF0ZWQoaW50IGRlbHRhKSA9PiBTb3VyY2VSYW5nZShvZmZzZXQgKyBkZWx0YSwgbGVuZ3RoKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBtaW5pbWFsIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyBib3RoIHRoaXMgYW5kIHRoZSBbb3RoZXJSYW5nZV0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBtaW5pbWFsIHNvdXJjZSByYW5nZSB0aGF0IGNvdmVycyBib3RoIHRoaXMgYW5kIHRoZQorICAvLy8gW290aGVyUmFuZ2VdLgogICBTb3VyY2VSYW5nZSBnZXRVbmlvbihTb3VyY2VSYW5nZSBvdGhlclJhbmdlKSB7CiAgICAgaW50IG5ld09mZnNldCA9IG1hdGgubWluKG9mZnNldCwgb3RoZXJSYW5nZS5vZmZzZXQpOwogICAgIGludCBuZXdFbmQgPQpAQCAtMTAzLDkgKzc0LDcgQEAKICAgICByZXR1cm4gU291cmNlUmFuZ2UobmV3T2Zmc2V0LCBuZXdFbmQgLSBuZXdPZmZzZXQpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBzb3VyY2UgcmFuZ2UgaW50ZXJzZWN0cyB0aGUgW290aGVyUmFuZ2VdLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBzb3VyY2UgcmFuZ2UgaW50ZXJzZWN0cyB0aGUgW290aGVyUmFuZ2VdLgogICBib29sIGludGVyc2VjdHMoU291cmNlUmFuZ2Ugb3RoZXJSYW5nZSkgewogICAgIGlmIChvdGhlclJhbmdlID09IG51bGwpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTExOSw5ICs4OCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHNvdXJjZSByYW5nZSBzdGFydHMgaW4gdGhlIFtvdGhlclJhbmdlXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc291cmNlIHJhbmdlIHN0YXJ0cyBpbiB0aGUgW290aGVyUmFuZ2VdLgogICBib29sIHN0YXJ0c0luKFNvdXJjZVJhbmdlIG90aGVyUmFuZ2UpID0+IG90aGVyUmFuZ2UuY29udGFpbnMob2Zmc2V0KTsKIAogICBAb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2FuYWx5c2lzX29wdGlvbnMvZXJyb3Ivb3B0aW9uX2NvZGVzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9hbmFseXNpc19vcHRpb25zL2Vycm9yL29wdGlvbl9jb2Rlcy5kYXJ0CmluZGV4IDk5NzdjMGYuLjQzYWUwNjggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2FuYWx5c2lzX29wdGlvbnMvZXJyb3Ivb3B0aW9uX2NvZGVzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvYW5hbHlzaXNfb3B0aW9ucy9lcnJvci9vcHRpb25fY29kZXMuZGFydApAQCAtNCwzOSArNCwzMSBAQAogCiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvZXJyb3IuZGFydCc7CiAKLS8qKgotICogVGhlIGVycm9yIGNvZGVzIHVzZWQgZm9yIGVycm9ycyBpbiBhbmFseXNpcyBvcHRpb25zIGZpbGVzLiBUaGUgY29udmVudGlvbiBmb3IKLSAqIHRoaXMgY2xhc3MgaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIGluZGljYXRlIHRoZSBwcm9ibGVtIHRoYXQKLSAqIGNhdXNlZCB0aGUgZXJyb3IgdG8gYmUgZ2VuZXJhdGVkIGFuZCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgdG8gZXhwbGFpbiB3aGF0IGlzCi0gKiB3cm9uZyBhbmQsIHdoZW4gYXBwcm9wcmlhdGUsIGhvdyB0aGUgcHJvYmxlbSBjYW4gYmUgY29ycmVjdGVkLgotICovCisvLy8gVGhlIGVycm9yIGNvZGVzIHVzZWQgZm9yIGVycm9ycyBpbiBhbmFseXNpcyBvcHRpb25zIGZpbGVzLiBUaGUgY29udmVudGlvbgorLy8vIGZvciB0aGlzIGNsYXNzIGlzIGZvciB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgY29kZSB0byBpbmRpY2F0ZSB0aGUgcHJvYmxlbQorLy8vIHRoYXQgY2F1c2VkIHRoZSBlcnJvciB0byBiZSBnZW5lcmF0ZWQgYW5kIGZvciB0aGUgZXJyb3IgbWVzc2FnZSB0byBleHBsYWluCisvLy8gd2hhdCBpcyB3cm9uZyBhbmQsIHdoZW4gYXBwcm9wcmlhdGUsIGhvdyB0aGUgcHJvYmxlbSBjYW4gYmUgY29ycmVjdGVkLgogY2xhc3MgQW5hbHlzaXNPcHRpb25zRXJyb3JDb2RlIGV4dGVuZHMgRXJyb3JDb2RlIHsKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIGEgc3ludGFjdGljIGVycm9yIGluIHRoZSBpbmNsdWRlZAotICAgKiBmaWxlLgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAwOiB0aGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvcgotICAgKiAxOiB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSB0ZXh0IGluIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVycm9yCi0gICAqIDI6IHRoZSBlbmRpbmcgb2Zmc2V0IG9mIHRoZSB0ZXh0IGluIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVycm9yCi0gICAqIDM6IHRoZSBlcnJvciBtZXNzYWdlCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgYSBzeW50YWN0aWMgZXJyb3IgaW4gdGhlIGluY2x1ZGVkCisgIC8vLyBmaWxlLgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvcgorICAvLy8gMTogdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgdGV4dCBpbiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvcgorICAvLy8gMjogdGhlIGVuZGluZyBvZmZzZXQgb2YgdGhlIHRleHQgaW4gdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZXJyb3IKKyAgLy8vIDM6IHRoZSBlcnJvciBtZXNzYWdlCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNFcnJvckNvZGUgSU5DTFVERURfRklMRV9QQVJTRV9FUlJPUiA9CiAgICAgICBBbmFseXNpc09wdGlvbnNFcnJvckNvZGUoCiAgICAgICAgICAgJ0lOQ0xVREVEX0ZJTEVfUEFSU0VfRVJST1InLCAnezN9IGluIHswfSh7MX0uLnsyfSknKTsKIAotICAvKioKLSAgICogQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgYSBzeW50YWN0aWMgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqIDA6IHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHBhcnNlIGVycm9yCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgYSBzeW50YWN0aWMgZXJyb3IgaW4gdGhlIGZpbGUuCisgIC8vLworICAvLy8gUGFyYW1ldGVyczoKKyAgLy8vIDA6IHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHBhcnNlIGVycm9yCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNFcnJvckNvZGUgUEFSU0VfRVJST1IgPQogICAgICAgQW5hbHlzaXNPcHRpb25zRXJyb3JDb2RlKCdQQVJTRV9FUlJPUicsICd7MH0nKTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZXJyb3IgY29kZSB0byBoYXZlIHRoZSBnaXZlbiBbbmFtZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZXJyb3IgY29kZSB0byBoYXZlIHRoZSBnaXZlbiBbbmFtZV0uCiAgIGNvbnN0IEFuYWx5c2lzT3B0aW9uc0Vycm9yQ29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgICB7U3RyaW5nIGNvcnJlY3Rpb259KQogICAgICAgOiBzdXBlci50ZW1wb3JhcnkobmFtZSwgbWVzc2FnZSwgY29ycmVjdGlvbjogY29ycmVjdGlvbik7CkBAIC00OSw0OCArNDEsNDEgQEAKIH0KIAogY2xhc3MgQW5hbHlzaXNPcHRpb25zSGludENvZGUgZXh0ZW5kcyBFcnJvckNvZGUgewotICAvKioKLSAgICogQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBhbmFseXNpcyBvcHRpb25zIGZpbGUgbmFtZSBpcyBkZXByZWNhdGVkIGFuZAotICAgKiB0aGUgZmlsZSBzaG91bGQgYmUgcmVuYW1lZC4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogMDogdGhlIHVyaSBvZiB0aGUgZmlsZSB3aGljaCBzaG91bGQgYmUgcmVuYW1lZAotICAgKi8KKyAgLy8vIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgYW5hbHlzaXMgb3B0aW9ucyBmaWxlIG5hbWUgaXMgZGVwcmVjYXRlZCBhbmQKKyAgLy8vIHRoZSBmaWxlIHNob3VsZCBiZSByZW5hbWVkLgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgdXJpIG9mIHRoZSBmaWxlIHdoaWNoIHNob3VsZCBiZSByZW5hbWVkCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNIaW50Q29kZSBERVBSRUNBVEVEX0FOQUxZU0lTX09QVElPTlNfRklMRV9OQU1FID0KICAgICAgIEFuYWx5c2lzT3B0aW9uc0hpbnRDb2RlKAogICAgICAgICAgICdERVBSRUNBVEVEX0FOQUxZU0lTX09QVElPTlNfRklMRV9OQU1FJywKICAgICAgICAgICAiVGhlIG5hbWUgb2YgdGhlIGFuYWx5c2lzIG9wdGlvbnMgZmlsZSB7MH0gaXMgZGVwcmVjYXRlZDsiCiAgICAgICAgICAgICAgICIgY29uc2lkZXIgcmVuYW1pbmcgaXQgdG8gYW5hbHlzaXNfb3B0aW9ucy55YW1sLiIpOwogCi0gIC8qKgotICAgKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW5hYmxlUHJldmlld0RhcnQyIHNldHRpbmcgaXMgZGVwcmVjYXRlZC4KLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW5hYmxlUHJldmlld0RhcnQyIHNldHRpbmcgaXMKKyAgLy8vIGRlcHJlY2F0ZWQuCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNIaW50Q29kZSBQUkVWSUVXX0RBUlRfMl9TRVRUSU5HX0RFUFJFQ0FURUQgPQogICAgICAgQW5hbHlzaXNPcHRpb25zSGludENvZGUoJ1BSRVZJRVdfREFSVF8yX1NFVFRJTkdfREVQUkVDQVRFRCcsCiAgICAgICAgICAgIlRoZSAnZW5hYmxlUHJldmlld0RhcnQyJyBzZXR0aW5nIGlzIGRlcHJlY2F0ZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGVuYWJsZSBEYXJ0IDIuIik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHN0cm9uZy1tb2RlOiB0cnVlIGlzIGRlcHJlY2F0ZWQuCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgc3Ryb25nLW1vZGU6IHRydWUgaXMgZGVwcmVjYXRlZC4KICAgc3RhdGljIGNvbnN0IEFuYWx5c2lzT3B0aW9uc0hpbnRDb2RlIFNUUk9OR19NT0RFX1NFVFRJTkdfREVQUkVDQVRFRCA9CiAgICAgICBBbmFseXNpc09wdGlvbnNIaW50Q29kZSgnU1RST05HX01PREVfU0VUVElOR19ERVBSRUNBVEVEJywKICAgICAgICAgICAiVGhlICdzdHJvbmctbW9kZTogdHJ1ZScgc2V0dGluZyBpcyBkZXByZWNhdGVkLiIsCiAgICAgICAgICAgY29ycmVjdGlvbjoKICAgICAgICAgICAgICAgIkl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBlbmFibGUgc3Ryb25nIG1vZGUuIik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbmFibGVQcmV2aWV3RGFydDIgc2V0dGluZyBpcyBkZXByZWNhdGVkLgotICAgKi8KKyAgLy8vIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbmFibGVQcmV2aWV3RGFydDIgc2V0dGluZyBpcworICAvLy8gZGVwcmVjYXRlZC4KICAgc3RhdGljIGNvbnN0IEFuYWx5c2lzT3B0aW9uc0hpbnRDb2RlIFNVUEVSX01JWElOU19TRVRUSU5HX0RFUFJFQ0FURUQgPQogICAgICAgQW5hbHlzaXNPcHRpb25zSGludENvZGUoJ1NVUEVSX01JWElOU19TRVRUSU5HX0RFUFJFQ0FURUQnLAogICAgICAgICAgICJUaGUgJ2VuYWJsZVN1cGVyTWl4aW5zJyBzZXR0aW5nIGlzIGRlcHJlY2F0ZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOgotICAgICAgICAgICAgICAiU3VwcG9ydCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UgZm9yICdtaXhpbicgYmFzZWQgbWl4aW5zLiIpOworICAgICAgICAgICAgICAiU3VwcG9ydCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UgZm9yICdtaXhpbicgYmFzZWQgIgorICAgICAgICAgICAgICAnbWl4aW5zLicpOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBoaW50IGNvZGUgdG8gaGF2ZSB0aGUgZ2l2ZW4gW25hbWVdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGhpbnQgY29kZSB0byBoYXZlIHRoZSBnaXZlbiBbbmFtZV0uCiAgIGNvbnN0IEFuYWx5c2lzT3B0aW9uc0hpbnRDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZSwKICAgICAgIHtTdHJpbmcgY29ycmVjdGlvbn0pCiAgICAgICA6IHN1cGVyLnRlbXBvcmFyeShuYW1lLCBtZXNzYWdlLCBjb3JyZWN0aW9uOiBjb3JyZWN0aW9uKTsKQEAgLTEwMiw2NSArODcsNTEgQEAKICAgRXJyb3JUeXBlIGdldCB0eXBlID0+IEVycm9yVHlwZS5ISU5UOwogfQogCi0vKioKLSAqIFRoZSBlcnJvciBjb2RlcyB1c2VkIGZvciB3YXJuaW5ncyBpbiBhbmFseXNpcyBvcHRpb25zIGZpbGVzLiBUaGUgY29udmVudGlvbgotICogZm9yIHRoaXMgY2xhc3MgaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIGluZGljYXRlIHRoZSBwcm9ibGVtIHRoYXQKLSAqIGNhdXNlZCB0aGUgZXJyb3IgdG8gYmUgZ2VuZXJhdGVkIGFuZCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgdG8gZXhwbGFpbiB3aGF0IGlzCi0gKiB3cm9uZyBhbmQsIHdoZW4gYXBwcm9wcmlhdGUsIGhvdyB0aGUgcHJvYmxlbSBjYW4gYmUgY29ycmVjdGVkLgotICovCisvLy8gVGhlIGVycm9yIGNvZGVzIHVzZWQgZm9yIHdhcm5pbmdzIGluIGFuYWx5c2lzIG9wdGlvbnMgZmlsZXMuIFRoZSBjb252ZW50aW9uCisvLy8gZm9yIHRoaXMgY2xhc3MgaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIGluZGljYXRlIHRoZSBwcm9ibGVtCisvLy8gdGhhdCBjYXVzZWQgdGhlIGVycm9yIHRvIGJlIGdlbmVyYXRlZCBhbmQgZm9yIHRoZSBlcnJvciBtZXNzYWdlIHRvIGV4cGxhaW4KKy8vLyB3aGF0IGlzIHdyb25nIGFuZCwgd2hlbiBhcHByb3ByaWF0ZSwgaG93IHRoZSBwcm9ibGVtIGNhbiBiZSBjb3JyZWN0ZWQuCiBjbGFzcyBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBleHRlbmRzIEVycm9yQ29kZSB7Ci0gIC8qKgotICAgKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZ2l2ZW4gb3B0aW9uIGlzIGRlcHJlY2F0ZWQuCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGdpdmVuIG9wdGlvbiBpcyBkZXByZWNhdGVkLgogICBzdGF0aWMgY29uc3QgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUgQU5BTFlTSVNfT1BUSU9OX0RFUFJFQ0FURUQgPQogICAgICAgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUoJ0FOQUxZU0lTX09QVElPTl9ERVBSRUNBVEVEJywKICAgICAgICAgICAiVGhlIG9wdGlvbiAnezB9JyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiIpOwogCi0gIC8qKgotICAgKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgYSBzcGVjaWZpZWQgaW5jbHVkZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogMDogdGhlIHVyaSBvZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZAotICAgKiAxOiB0aGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQotICAgKi8KKyAgLy8vIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhIHNwZWNpZmllZCBpbmNsdWRlIGZpbGUgY291bGQgbm90IGJlIGZvdW5kLgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgdXJpIG9mIHRoZSBmaWxlIHRvIGJlIGluY2x1ZGVkCisgIC8vLyAxOiB0aGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQogICBzdGF0aWMgY29uc3QgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUgSU5DTFVERV9GSUxFX05PVF9GT1VORCA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgnSU5DTFVERV9GSUxFX05PVF9GT1VORCcsCiAgICAgICAgICAgIlRoZSBpbmNsdWRlIGZpbGUgezB9IGluIHsxfSBjYW5ub3QgYmUgZm91bmQuIik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhIHNwZWNpZmllZCBpbmNsdWRlIGZpbGUgaGFzIGEgd2FybmluZy4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogMDogdGhlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgd2FybmluZ3MKLSAgICogMTogdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgdGV4dCBpbiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSB3YXJuaW5nCi0gICAqIDI6IHRoZSBlbmRpbmcgb2Zmc2V0IG9mIHRoZSB0ZXh0IGluIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHdhcm5pbmcKLSAgICogMzogdGhlIHdhcm5pbmcgbWVzc2FnZQotICAgKi8KKyAgLy8vIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhIHNwZWNpZmllZCBpbmNsdWRlIGZpbGUgaGFzIGEgd2FybmluZy4KKyAgLy8vCisgIC8vLyBQYXJhbWV0ZXJzOgorICAvLy8gMDogdGhlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgd2FybmluZ3MKKyAgLy8vIDE6IHRoZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlIHRleHQgaW4gdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgd2FybmluZworICAvLy8gMjogdGhlIGVuZGluZyBvZmZzZXQgb2YgdGhlIHRleHQgaW4gdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgd2FybmluZworICAvLy8gMzogdGhlIHdhcm5pbmcgbWVzc2FnZQogICBzdGF0aWMgY29uc3QgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUgSU5DTFVERURfRklMRV9XQVJOSU5HID0KICAgICAgIEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlKCdJTkNMVURFRF9GSUxFX1dBUk5JTkcnLAogICAgICAgICAgICJXYXJuaW5nIGluIHRoZSBpbmNsdWRlZCBvcHRpb25zIGZpbGUgezB9KHsxfS4uezJ9KTogezN9Iik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcGx1Z2luIGlzIGJlaW5nIGNvbmZpZ3VyZWQgd2l0aCBhbiBpbnZhbGlkCi0gICAqIHZhbHVlIGZvciBhbiBvcHRpb24gYW5kIGEgZGV0YWlsIG1lc3NhZ2UgaXMgcHJvdmlkZWQuCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBwbHVnaW4gaXMgYmVpbmcgY29uZmlndXJlZCB3aXRoIGFuIGludmFsaWQKKyAgLy8vIHZhbHVlIGZvciBhbiBvcHRpb24gYW5kIGEgZGV0YWlsIG1lc3NhZ2UgaXMgcHJvdmlkZWQuCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBJTlZBTElEX09QVElPTiA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgKICAgICAgICAgICAnSU5WQUxJRF9PUFRJT04nLCAiSW52YWxpZCBvcHRpb24gc3BlY2lmaWVkIGZvciAnezB9JzogezF9Iik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGZvcm1hdCBmb3IgYW4gb3B0aW9ucyBmaWxlIHNlY3Rpb24uCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqIDA6IHRoZSBzZWN0aW9uIG5hbWUKLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBmb3JtYXQgZm9yIGFuIG9wdGlvbnMgZmlsZSBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgc2VjdGlvbiBuYW1lCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBJTlZBTElEX1NFQ1RJT05fRk9STUFUID0KICAgICAgIEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlKAogICAgICAgICAgICdJTlZBTElEX1NFQ1RJT05fRk9STUFUJywgIkludmFsaWQgZm9ybWF0IGZvciB0aGUgJ3swfScgc2VjdGlvbi4iKTsKIAotICAvKioKLSAgICogQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgc3Ryb25nLW1vZGU6IGZhbHNlIGlzIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAqLworICAvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgc3Ryb25nLW1vZGU6IGZhbHNlIGlzIGhhcyBiZWVuIHJlbW92ZWQuCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBTUEVDX01PREVfUkVNT1ZFRCA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgnU1BFQ19NT0RFX1JFTU9WRUQnLAogICAgICAgICAgICJUaGUgb3B0aW9uICdzdHJvbmctbW9kZTogZmFsc2UnIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIiwKQEAgLTE2OCw3NyArMTM5LDY1IEBACiAgICAgICAgICAgICAgICJJdCdzIHJlY29tbWVuZGVkIHRvIHJlbW92ZSB0aGUgJ3N0cm9uZy1tb2RlOicgc2V0dGluZyAoYW5kIG1ha2UgIgogICAgICAgICAgICAgICAieW91ciBjb2RlIERhcnQgMiBjb21wbGlhbnQpLiIpOwogCi0gIC8qKgotICAgKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiB1bnJlY29nbml6ZWQgZXJyb3IgY29kZSBpcyBiZWluZyB1c2VkIHRvCi0gICAqIHNwZWNpZnkgYW4gZXJyb3IgZmlsdGVyLgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAwOiB0aGUgdW5yZWNvZ25pemVkIGVycm9yIGNvZGUKLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiB1bnJlY29nbml6ZWQgZXJyb3IgY29kZSBpcyBiZWluZyB1c2VkIHRvCisgIC8vLyBzcGVjaWZ5IGFuIGVycm9yIGZpbHRlci4KKyAgLy8vCisgIC8vLyBQYXJhbWV0ZXJzOgorICAvLy8gMDogdGhlIHVucmVjb2duaXplZCBlcnJvciBjb2RlCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBVTlJFQ09HTklaRURfRVJST1JfQ09ERSA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgKICAgICAgICAgICAnVU5SRUNPR05JWkVEX0VSUk9SX0NPREUnLCAiJ3swfScgaXNuJ3QgYSByZWNvZ25pemVkIGVycm9yIGNvZGUuIik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcGx1Z2luIGlzIGJlaW5nIGNvbmZpZ3VyZWQgd2l0aCBhbgotICAgKiB1bnN1cHBvcnRlZCBvcHRpb24gd2hlcmUgdGhlcmUgaXMganVzdCBvbmUgbGVnYWwgdmFsdWUuCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqIDA6IHRoZSBwbHVnaW4gbmFtZQotICAgKiAxOiB0aGUgdW5zdXBwb3J0ZWQgb3B0aW9uIGtleQotICAgKiAyOiB0aGUgbGVnYWwgdmFsdWUKLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHBsdWdpbiBpcyBiZWluZyBjb25maWd1cmVkIHdpdGggYW4KKyAgLy8vIHVuc3VwcG9ydGVkIG9wdGlvbiB3aGVyZSB0aGVyZSBpcyBqdXN0IG9uZSBsZWdhbCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBQYXJhbWV0ZXJzOgorICAvLy8gMDogdGhlIHBsdWdpbiBuYW1lCisgIC8vLyAxOiB0aGUgdW5zdXBwb3J0ZWQgb3B0aW9uIGtleQorICAvLy8gMjogdGhlIGxlZ2FsIHZhbHVlCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBVTlNVUFBPUlRFRF9PUFRJT05fV0lUSF9MRUdBTF9WQUxVRSA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgKICAgICAgICAgICAnVU5TVVBQT1JURURfT1BUSU9OX1dJVEhfTEVHQUxfVkFMVUUnLAogICAgICAgICAgICJUaGUgb3B0aW9uICd7MX0nIGlzbid0IHN1cHBvcnRlZCBieSAnezB9Jy4gIgogICAgICAgICAgICAgICAiVHJ5IHVzaW5nIHRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb246ICd7Mn0nLiIpOwogCi0gIC8qKgotICAgKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHBsdWdpbiBpcyBiZWluZyBjb25maWd1cmVkIHdpdGggYW4KLSAgICogdW5zdXBwb3J0ZWQgb3B0aW9uIGFuZCBsZWdhbCBvcHRpb25zIGFyZSBwcm92aWRlZC4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogMDogdGhlIHBsdWdpbiBuYW1lCi0gICAqIDE6IHRoZSB1bnN1cHBvcnRlZCBvcHRpb24ga2V5Ci0gICAqIDI6IGxlZ2FsIHZhbHVlcwotICAgKi8KKyAgLy8vIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcGx1Z2luIGlzIGJlaW5nIGNvbmZpZ3VyZWQgd2l0aCBhbgorICAvLy8gdW5zdXBwb3J0ZWQgb3B0aW9uIGFuZCBsZWdhbCBvcHRpb25zIGFyZSBwcm92aWRlZC4KKyAgLy8vCisgIC8vLyBQYXJhbWV0ZXJzOgorICAvLy8gMDogdGhlIHBsdWdpbiBuYW1lCisgIC8vLyAxOiB0aGUgdW5zdXBwb3J0ZWQgb3B0aW9uIGtleQorICAvLy8gMjogbGVnYWwgdmFsdWVzCiAgIHN0YXRpYyBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSBVTlNVUFBPUlRFRF9PUFRJT05fV0lUSF9MRUdBTF9WQUxVRVMgPQogICAgICAgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUoJ1VOU1VQUE9SVEVEX09QVElPTl9XSVRIX0xFR0FMX1ZBTFVFUycsCiAgICAgICAgICAgIlRoZSBvcHRpb24gJ3sxfScgaXNuJ3Qgc3VwcG9ydGVkIGJ5ICd7MH0nLiIsCiAgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSB1c2luZyBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvcHRpb25zOiB7Mn0uIik7CiAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgcGx1Z2luIGlzIGJlaW5nIGNvbmZpZ3VyZWQgd2l0aCBhbgotICAgKiB1bnN1cHBvcnRlZCBvcHRpb24gYW5kIGxlZ2FsIG9wdGlvbnMgYXJlIHByb3ZpZGVkLgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAwOiB0aGUgcGx1Z2luIG5hbWUKLSAgICogMTogdGhlIHVuc3VwcG9ydGVkIG9wdGlvbiBrZXkKLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHBsdWdpbiBpcyBiZWluZyBjb25maWd1cmVkIHdpdGggYW4KKyAgLy8vIHVuc3VwcG9ydGVkIG9wdGlvbiBhbmQgbGVnYWwgb3B0aW9ucyBhcmUgcHJvdmlkZWQuCisgIC8vLworICAvLy8gUGFyYW1ldGVyczoKKyAgLy8vIDA6IHRoZSBwbHVnaW4gbmFtZQorICAvLy8gMTogdGhlIHVuc3VwcG9ydGVkIG9wdGlvbiBrZXkKICAgc3RhdGljIGNvbnN0IEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlIFVOU1VQUE9SVEVEX09QVElPTl9XSVRIT1VUX1ZBTFVFUyA9CiAgICAgICBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZSgKICAgICAnVU5TVVBQT1JURURfT1BUSU9OX1dJVEhPVVRfVkFMVUVTJywKICAgICAiVGhlIG9wdGlvbiAnezF9JyBpc24ndCBzdXBwb3J0ZWQgYnkgJ3swfScuIiwKICAgKTsKIAotICAvKioKLSAgICogQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gb3B0aW9uIGVudHJ5IGlzIGJlaW5nIGNvbmZpZ3VyZWQgd2l0aCBhbgotICAgKiB1bnN1cHBvcnRlZCB2YWx1ZS4KLSAgICoKLSAgICogUGFyYW1ldGVyczoKLSAgICogMDogdGhlIG9wdGlvbiBuYW1lCi0gICAqIDE6IHRoZSB1bnN1cHBvcnRlZCB2YWx1ZQotICAgKiAyOiBsZWdhbCB2YWx1ZXMKLSAgICovCisgIC8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBvcHRpb24gZW50cnkgaXMgYmVpbmcgY29uZmlndXJlZCB3aXRoIGFuCisgIC8vLyB1bnN1cHBvcnRlZCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBQYXJhbWV0ZXJzOgorICAvLy8gMDogdGhlIG9wdGlvbiBuYW1lCisgIC8vLyAxOiB0aGUgdW5zdXBwb3J0ZWQgdmFsdWUKKyAgLy8vIDI6IGxlZ2FsIHZhbHVlcwogICBzdGF0aWMgY29uc3QgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUgVU5TVVBQT1JURURfVkFMVUUgPQogICAgICAgQW5hbHlzaXNPcHRpb25zV2FybmluZ0NvZGUoCiAgICAgICAgICAgJ1VOU1VQUE9SVEVEX1ZBTFVFJywgIlRoZSB2YWx1ZSAnezF9JyBpc24ndCBzdXBwb3J0ZWQgYnkgJ3swfScuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IHVzaW5nIG9uZSBvZiB0aGUgc3VwcG9ydGVkIG9wdGlvbnM6IHsyfS4iKTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgd2FybmluZyBjb2RlIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB3YXJuaW5nIGNvZGUgdG8gaGF2ZSB0aGUgZ2l2ZW4gW25hbWVdLgogICBjb25zdCBBbmFseXNpc09wdGlvbnNXYXJuaW5nQ29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2UsCiAgICAgICB7U3RyaW5nIGNvcnJlY3Rpb259KQogICAgICAgOiBzdXBlci50ZW1wb3JhcnkobmFtZSwgbWVzc2FnZSwgY29ycmVjdGlvbjogY29ycmVjdGlvbik7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb21tYW5kX2xpbmUvYXJndW1lbnRzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb21tYW5kX2xpbmUvYXJndW1lbnRzLmRhcnQKaW5kZXggNjY3ODQ5MS4uZjNiMmMzNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvY29tbWFuZF9saW5lL2FyZ3VtZW50cy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2NvbW1hbmRfbGluZS9hcmd1bWVudHMuZGFydApAQCAtMTAsNyArMTAsNiBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc2RrLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCc7CiAKIGNvbnN0IFN0cmluZyBhbmFseXNpc09wdGlvbnNGaWxlT3B0aW9uID0gJ29wdGlvbnMnOwogY29uc3QgU3RyaW5nIGRlZmluZVZhcmlhYmxlT3B0aW9uID0gJ0QnOwpAQCAtNTUsOSArNTQsNyBAQAogICB9CiB9CiAKLS8qKgotICogVXNlIHRoZSBjb21tYW5kLWxpbmUgW2FyZ3NdIHRvIGNyZWF0ZSBhIGNvbnRleHQgYnVpbGRlci4KLSAqLworLy8vIFVzZSB0aGUgY29tbWFuZC1saW5lIFthcmdzXSB0byBjcmVhdGUgYSBjb250ZXh0IGJ1aWxkZXIuCiBDb250ZXh0QnVpbGRlck9wdGlvbnMgY3JlYXRlQ29udGV4dEJ1aWxkZXJPcHRpb25zKEFyZ1Jlc3VsdHMgYXJncykgewogICBDb250ZXh0QnVpbGRlck9wdGlvbnMgYnVpbGRlck9wdGlvbnMgPSBDb250ZXh0QnVpbGRlck9wdGlvbnMoKTsKICAgYnVpbGRlck9wdGlvbnMuYXJnUmVzdWx0cyA9IGFyZ3M7CkBAIC0xMDEsMzQgKzk4LDI0IEBACiAgIHJldHVybiBidWlsZGVyT3B0aW9uczsKIH0KIAotLyoqCi0gKiBVc2UgdGhlIGdpdmVuIFtyZXNvdXJjZVByb3ZpZGVyXSBhbmQgY29tbWFuZC1saW5lIFthcmdzXSB0byBjcmVhdGUgYSBEYXJ0IFNESwotICogbWFuYWdlci4gVGhlIG1hbmFnZXIgd2lsbCB1c2Ugc3VtbWFyeSBpbmZvcm1hdGlvbiBpZiBbdXNlU3VtbWFyaWVzXSBpcyBgdHJ1ZWAKLSAqIGFuZCBpZiB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBleGlzdHMuCi0gKi8KKy8vLyBVc2UgdGhlIGdpdmVuIFtyZXNvdXJjZVByb3ZpZGVyXSBhbmQgY29tbWFuZC1saW5lIFthcmdzXSB0byBjcmVhdGUgYSBEYXJ0CisvLy8gU0RLIG1hbmFnZXIuIFRoZSBtYW5hZ2VyIHdpbGwgdXNlIHN1bW1hcnkgaW5mb3JtYXRpb24gaWYgW3VzZVN1bW1hcmllc10gaXMKKy8vLyBgdHJ1ZWAgYW5kIGlmIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uIGV4aXN0cy4KIERhcnRTZGtNYW5hZ2VyIGNyZWF0ZURhcnRTZGtNYW5hZ2VyKAotICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwgYm9vbCB1c2VTdW1tYXJpZXMsIEFyZ1Jlc3VsdHMgYXJncykgeworICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwgQXJnUmVzdWx0cyBhcmdzKSB7CiAgIFN0cmluZyBzZGtQYXRoID0gYXJnc1tzZGtQYXRoT3B0aW9uXTsKIAotICBib29sIGNhblVzZVN1bW1hcmllcyA9IHVzZVN1bW1hcmllcyAmJgotICAgICAgYXJncy5yZXN0LmV2ZXJ5KChTdHJpbmcgc291cmNlUGF0aCkgewotICAgICAgICBzb3VyY2VQYXRoID0gY29udGV4dC5hYnNvbHV0ZShzb3VyY2VQYXRoKTsKLSAgICAgICAgc291cmNlUGF0aCA9IGNvbnRleHQubm9ybWFsaXplKHNvdXJjZVBhdGgpOwotICAgICAgICByZXR1cm4gIWNvbnRleHQuaXNXaXRoaW4oc2RrUGF0aCwgc291cmNlUGF0aCk7Ci0gICAgICB9KTsKICAgcmV0dXJuIERhcnRTZGtNYW5hZ2VyKAotICAgICAgc2RrUGF0aCA/PyBGb2xkZXJCYXNlZERhcnRTZGsuZGVmYXVsdFNka0RpcmVjdG9yeShyZXNvdXJjZVByb3ZpZGVyKT8ucGF0aCwKLSAgICAgIGNhblVzZVN1bW1hcmllcyk7CisgICAgc2RrUGF0aCA/PyBGb2xkZXJCYXNlZERhcnRTZGsuZGVmYXVsdFNka0RpcmVjdG9yeShyZXNvdXJjZVByb3ZpZGVyKT8ucGF0aCwKKyAgKTsKIH0KIAotLyoqCi0gKiBBZGQgdGhlIHN0YW5kYXJkIGZsYWdzIGFuZCBvcHRpb25zIHRvIHRoZSBnaXZlbiBbcGFyc2VyXS4gVGhlIHN0YW5kYXJkIGZsYWdzCi0gKiBhcmUgdGhvc2UgdGhhdCBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gY29udHJvbCB0aGUgd2F5IGluIHdoaWNoIHRoZSBjb2RlIGlzCi0gKiBhbmFseXplZC4KLSAqCi0gKiBUT0RPKGRhbnJ1YmVsKSBVcGRhdGUgRERDIHRvIHN1cHBvcnQgYWxsIHRoZSBvcHRpb25zIGRlZmluZWQgaW4gdGhpcyBtZXRob2QKLSAqIHRoZW4gcmVtb3ZlIHRoZSBbZGRjXSBuYW1lZCBhcmd1bWVudCBmcm9tIHRoaXMgbWV0aG9kLgotICovCisvLy8gQWRkIHRoZSBzdGFuZGFyZCBmbGFncyBhbmQgb3B0aW9ucyB0byB0aGUgZ2l2ZW4gW3BhcnNlcl0uIFRoZSBzdGFuZGFyZCBmbGFncworLy8vIGFyZSB0aG9zZSB0aGF0IGFyZSB0eXBpY2FsbHkgdXNlZCB0byBjb250cm9sIHRoZSB3YXkgaW4gd2hpY2ggdGhlIGNvZGUgaXMKKy8vLyBhbmFseXplZC4KKy8vLworLy8vIFRPRE8oZGFucnViZWwpIFVwZGF0ZSBEREMgdG8gc3VwcG9ydCBhbGwgdGhlIG9wdGlvbnMgZGVmaW5lZCBpbiB0aGlzIG1ldGhvZAorLy8vIHRoZW4gcmVtb3ZlIHRoZSBbZGRjXSBuYW1lZCBhcmd1bWVudCBmcm9tIHRoaXMgbWV0aG9kLgogdm9pZCBkZWZpbmVBbmFseXNpc0FyZ3VtZW50cyhBcmdQYXJzZXIgcGFyc2VyLAogICAgIHtib29sIGhpZGUgPSB0cnVlLCBkZGMgPSBmYWxzZX0pIHsKICAgcGFyc2VyLmFkZE9wdGlvbihzZGtQYXRoT3B0aW9uLApAQCAtMTYwLDggKzE0Nyw4IEBACiAgIHBhcnNlci5hZGRNdWx0aU9wdGlvbihkZWZpbmVWYXJpYWJsZU9wdGlvbiwKICAgICAgIGFiYnI6ICdEJywKICAgICAgIGhlbHA6Ci0gICAgICAgICAgJ0RlZmluZSBhbiBlbnZpcm9ubWVudCBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGUsICItRGZvbz1iYXIiIGRlZmluZXMgYW4gJwotICAgICAgICAgICdlbnZpcm9ubWVudCBkZWNsYXJhdGlvbiBuYW1lZCAiZm9vIiB3aG9zZSB2YWx1ZSBpcyAiYmFyIi4nLAorICAgICAgICAgICdEZWZpbmUgYW4gZW52aXJvbm1lbnQgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCAiLURmb289YmFyIiBkZWZpbmVzICcKKyAgICAgICAgICAnYW4gZW52aXJvbm1lbnQgZGVjbGFyYXRpb24gbmFtZWQgImZvbyIgd2hvc2UgdmFsdWUgaXMgImJhciIuJywKICAgICAgIGhpZGU6IGhpZGUpOwogICBwYXJzZXIuYWRkT3B0aW9uKHBhY2thZ2VzT3B0aW9uLAogICAgICAgaGVscDogJ1RoZSBwYXRoIHRvIHRoZSBwYWNrYWdlIHJlc29sdXRpb24gY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCAnCkBAIC0xODIsMTIgKzE2OSwxMCBAQAogICB9CiB9CiAKLS8qKgotICogRmluZCBhcmd1bWVudHMgb2YgdGhlIGZvcm0gLURrZXk9dmFsdWUKLSAqIG9yIGFyZ3VtZW50IHBhaXJzIG9mIHRoZSBmb3JtIC1Ea2V5IHZhbHVlCi0gKiBhbmQgcGxhY2UgdGhvc2Uga2V5L3ZhbHVlIHBhaXJzIGludG8gW2RlZmluZWRWYXJpYWJsZXNdLgotICogUmV0dXJuIGEgbGlzdCBvZiBhcmd1bWVudHMgd2l0aCB0aGUga2V5L3ZhbHVlIGFyZ3VtZW50cyByZW1vdmVkLgotICovCisvLy8gRmluZCBhcmd1bWVudHMgb2YgdGhlIGZvcm0gLURrZXk9dmFsdWUKKy8vLyBvciBhcmd1bWVudCBwYWlycyBvZiB0aGUgZm9ybSAtRGtleSB2YWx1ZQorLy8vIGFuZCBwbGFjZSB0aG9zZSBrZXkvdmFsdWUgcGFpcnMgaW50byBbZGVmaW5lZFZhcmlhYmxlc10uCisvLy8gUmV0dXJuIGEgbGlzdCBvZiBhcmd1bWVudHMgd2l0aCB0aGUga2V5L3ZhbHVlIGFyZ3VtZW50cyByZW1vdmVkLgogTGlzdDxTdHJpbmc+IGV4dHJhY3REZWZpbmVkVmFyaWFibGVzKAogICAgIExpc3Q8U3RyaW5nPiBhcmdzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlZmluZWRWYXJpYWJsZXMpIHsKICAgLy9UT0RPKGRhbnJ1YmVsKSBleHRyYWN0aW5nIGRlZmluZWQgdmFyaWFibGVzIGlzIGFscmVhZHkgaGFuZGxlZCBieSB0aGUKQEAgLTIxNywxOSArMjAyLDE3IEBACiAgIHJldHVybiByZW1haW5pbmdBcmdzOwogfQogCi0vKioKLSAqIFJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBjb250YWluaW5nIGFsbCBvZiB0aGUgZ2l2ZW4gW2FyZ3NdCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBbcGFyc2VyXS4gQW4gYXJndW1lbnQgaXMgY29uc2lkZXJlZCB0byBiZQotICogZGVmaW5lZCBieSB0aGUgcGFyc2VyIGlmCi0gKiAtIGl0IHN0YXJ0cyB3aXRoICctLScgYW5kIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudCAobWludXMgYW55IHZhbHVlCi0gKiAgIGludHJvZHVjZWQgYnkgJz0nKSBpcyB0aGUgbmFtZSBvZiBhIGtub3duIG9wdGlvbiwKLSAqIC0gaXQgc3RhcnRzIHdpdGggJy0nIGFuZCB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnQgKG1pbnVzIGFueSB2YWx1ZQotICogICBpbnRyb2R1Y2VkIGJ5ICc9JykgaXMgdGhlIG5hbWUgb2YgYSBrbm93biBhYmJyZXZpYXRpb24sIG9yCi0gKiAtIGl0IHN0YXJ0cyB3aXRoIHNvbWV0aGluZyBvdGhlciB0aGFuICctLScgb3IgJy0nLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbW1hbmQtbGluZSB0b29scyB0byBpbXBsZW1lbnQgdGhlCi0gKiAnLS1pZ25vcmUtdW5yZWNvZ25pemVkLWZsYWdzJyBvcHRpb24uCi0gKi8KKy8vLyBSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgY29udGFpbmluZyBhbGwgb2YgdGhlIGdpdmVuIFthcmdzXQorLy8vIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIGdpdmVuIFtwYXJzZXJdLiBBbiBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHRvIGJlCisvLy8gZGVmaW5lZCBieSB0aGUgcGFyc2VyIGlmCisvLy8gLSBpdCBzdGFydHMgd2l0aCAnLS0nIGFuZCB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnQgKG1pbnVzIGFueSB2YWx1ZQorLy8vICAgaW50cm9kdWNlZCBieSAnPScpIGlzIHRoZSBuYW1lIG9mIGEga25vd24gb3B0aW9uLAorLy8vIC0gaXQgc3RhcnRzIHdpdGggJy0nIGFuZCB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnQgKG1pbnVzIGFueSB2YWx1ZQorLy8vICAgaW50cm9kdWNlZCBieSAnPScpIGlzIHRoZSBuYW1lIG9mIGEga25vd24gYWJicmV2aWF0aW9uLCBvcgorLy8vIC0gaXQgc3RhcnRzIHdpdGggc29tZXRoaW5nIG90aGVyIHRoYW4gJy0tJyBvciAnLScuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb21tYW5kLWxpbmUgdG9vbHMgdG8gaW1wbGVtZW50IHRoZQorLy8vICctLWlnbm9yZS11bnJlY29nbml6ZWQtZmxhZ3MnIG9wdGlvbi4KIExpc3Q8U3RyaW5nPiBmaWx0ZXJVbmtub3duQXJndW1lbnRzKExpc3Q8U3RyaW5nPiBhcmdzLCBBcmdQYXJzZXIgcGFyc2VyKSB7CiAgIFNldDxTdHJpbmc+IGtub3duT3B0aW9ucyA9IEhhc2hTZXQ8U3RyaW5nPigpOwogICBTZXQ8U3RyaW5nPiBrbm93bkFiYnJldmlhdGlvbnMgPSBIYXNoU2V0PFN0cmluZz4oKTsKQEAgLTI2OSwxMCArMjUyLDggQEAKICAgcmV0dXJuIGZpbHRlcmVkOwogfQogCi0vKioKLSAqIFVzZSB0aGUgZ2l2ZW4gW3BhcnNlcl0gdG8gcGFyc2UgdGhlIGdpdmVuIGNvbW1hbmQtbGluZSBbYXJnc10sIGFuZCByZXR1cm4gdGhlCi0gKiByZXN1bHQuCi0gKi8KKy8vLyBVc2UgdGhlIGdpdmVuIFtwYXJzZXJdIHRvIHBhcnNlIHRoZSBnaXZlbiBjb21tYW5kLWxpbmUgW2FyZ3NdLCBhbmQgcmV0dXJuCisvLy8gdGhlIHJlc3VsdC4KIEFyZ1Jlc3VsdHMgcGFyc2UoCiAgICAgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwgQXJnUGFyc2VyIHBhcnNlciwgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKICAgYXJncyA9IHByZXByb2Nlc3NBcmdzKHByb3ZpZGVyLCBhcmdzKTsKQEAgLTI4MiwxMiArMjYzLDEwIEBACiAgIHJldHVybiBwYXJzZXIucGFyc2UoYXJncyk7CiB9CiAKLS8qKgotICogUHJlcHJvY2VzcyB0aGUgZ2l2ZW4gbGlzdCBvZiBjb21tYW5kIGxpbmUgW2FyZ3NdLgotICogSWYgdGhlIGZpbmFsIGFyZyBpcyBgQGZpbGVfcGF0aGAgKEJhemVsIHdvcmtlciBtb2RlKSwKLSAqIHRoZW4gcmVhZCBpbiBhbGwgdGhlIGxpbmVzIG9mIHRoYXQgZmlsZSBhbmQgYWRkIHRob3NlIGFzIGFyZ3MuCi0gKiBBbHdheXMgcmV0dXJucyBhIG5ldyBtb2RpZmlhYmxlIGxpc3QuCi0gKi8KKy8vLyBQcmVwcm9jZXNzIHRoZSBnaXZlbiBsaXN0IG9mIGNvbW1hbmQgbGluZSBbYXJnc10uCisvLy8gSWYgdGhlIGZpbmFsIGFyZyBpcyBgQGZpbGVfcGF0aGAgKEJhemVsIHdvcmtlciBtb2RlKSwKKy8vLyB0aGVuIHJlYWQgaW4gYWxsIHRoZSBsaW5lcyBvZiB0aGF0IGZpbGUgYW5kIGFkZCB0aG9zZSBhcyBhcmdzLgorLy8vIEFsd2F5cyByZXR1cm5zIGEgbmV3IG1vZGlmaWFibGUgbGlzdC4KIExpc3Q8U3RyaW5nPiBwcmVwcm9jZXNzQXJncyhSZXNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyLCBMaXN0PFN0cmluZz4gYXJncykgewogICBhcmdzID0gTGlzdC5mcm9tKGFyZ3MpOwogICBpZiAoYXJncy5pc0VtcHR5KSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2J1aWxkZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2NvbnRleHQvYnVpbGRlci5kYXJ0CmluZGV4IDcxMWE5MzAuLjNiY2M4OWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2NvbnRleHQvYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2NvbnRleHQvYnVpbGRlci5kYXJ0CkBAIC0yNDIsMTUgKzI0MiwxMyBAQAogICAgIH0KIAogICAgIFN0cmluZyBzZGtQYXRoID0gc2RrTWFuYWdlci5kZWZhdWx0U2RrRGlyZWN0b3J5OwotICAgIFNka0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0KLSAgICAgICAgU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bc2RrUGF0aF0sIGFuYWx5c2lzT3B0aW9ucyk7CisgICAgU2RrRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBTZGtEZXNjcmlwdGlvbihzZGtQYXRoKTsKICAgICByZXR1cm4gc2RrTWFuYWdlci5nZXRTZGsoZGVzY3JpcHRpb24sICgpIHsKICAgICAgIHZhciBzZGsgPSBGb2xkZXJCYXNlZERhcnRTZGsoCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIsCiAgICAgICAgIHJlc291cmNlUHJvdmlkZXIuZ2V0Rm9sZGVyKHNka1BhdGgpLAogICAgICAgKTsKICAgICAgIHNkay5hbmFseXNpc09wdGlvbnMgPSBhbmFseXNpc09wdGlvbnM7Ci0gICAgICBzZGsudXNlU3VtbWFyeSA9IHNka01hbmFnZXIuY2FuVXNlU3VtbWFyaWVzOwogICAgICAgcmV0dXJuIHNkazsKICAgICB9KTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvY29udGV4dC9jb250ZXh0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2NvbnRleHQuZGFydAppbmRleCBkY2YzMTNlLi5jNWJkZmQ0IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2NvbnRleHQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2NvbnRleHQuZGFydApAQCAtNSwxNSArNSwxMyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3Nlc3Npb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCi0vKioKLSAqIEFuIFtBbmFseXNpc0NvbnRleHRdIGluIHdoaWNoIGFuYWx5c2lzIGNhbiBiZSBwZXJmb3JtZWQuCi0gKi8KKy8vLyBBbiBbQW5hbHlzaXNDb250ZXh0XSBpbiB3aGljaCBhbmFseXNpcyBjYW4gYmUgcGVyZm9ybWVkLgogY2xhc3MgQW5hbHlzaXNDb250ZXh0SW1wbCBpbXBsZW1lbnRzIEFuYWx5c2lzQ29udGV4dCB7CiAgIGZpbmFsIFN5bmNocm9ub3VzU2Vzc2lvbiBfc3luY2hyb25vdXNTZXNzaW9uOwogCkBAIC04NSwxNSArODMsMTEgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIFtBbmFseXNpc0NvbnRleHRdIHRoYXQgb25seSBjb250YWlucyBzb3VyY2VzIGZvciBhIERhcnQgU0RLLgotICovCisvLy8gQW4gW0FuYWx5c2lzQ29udGV4dF0gdGhhdCBvbmx5IGNvbnRhaW5zIHNvdXJjZXMgZm9yIGEgRGFydCBTREsuCiBjbGFzcyBTZGtBbmFseXNpc0NvbnRleHQgZXh0ZW5kcyBBbmFseXNpc0NvbnRleHRJbXBsIHsKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIFNESyBhbmFseXNpcyBjb250ZXh0IHdpdGggdGhlIGdpdmVuIFtvcHRpb25zXS4KLSAgICogQW5hbHlzaXMgb3B0aW9ucyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlcndhcmRzLiAgSWYgdGhlIGdpdmVuIFtvcHRpb25zXSBhcmUKLSAgICogYG51bGxgLCB0aGVuIGRlZmF1bHQgb3B0aW9ucyBhcmUgdXNlZC4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBTREsgYW5hbHlzaXMgY29udGV4dCB3aXRoIHRoZSBnaXZlbiBbb3B0aW9uc10uCisgIC8vLyBBbmFseXNpcyBvcHRpb25zIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyd2FyZHMuICBJZiB0aGUgZ2l2ZW4gW29wdGlvbnNdIGFyZQorICAvLy8gYG51bGxgLCB0aGVuIGRlZmF1bHQgb3B0aW9ucyBhcmUgdXNlZC4KICAgU2RrQW5hbHlzaXNDb250ZXh0KEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zLCBTb3VyY2VGYWN0b3J5IHNvdXJjZUZhY3RvcnkpCiAgICAgICA6IHN1cGVyKFN5bmNocm9ub3VzU2Vzc2lvbihvcHRpb25zLCBEZWNsYXJlZFZhcmlhYmxlcygpKSwgc291cmNlRmFjdG9yeSk7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2NvbnRleHRfcm9vdC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvY29udGV4dC9jb250ZXh0X3Jvb3QuZGFydAppbmRleCA1NTc0N2IxLi4yYjA1OGU1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L2NvbnRleHRfcm9vdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2NvbnRleHQvY29udGV4dF9yb290LmRhcnQKQEAgLTYsMzkgKzYsMjcgQEAKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvb3QgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFseXNpcyBjb250ZXh0LgotICoKLSAqIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSByb290IGRpcmVjdG9yeSBhc3NvY2lhdGVkIHdpdGggYW4gYW5hbHlzaXMgY29udGV4dC4KKy8vLworLy8vIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KIGNsYXNzIENvbnRleHRSb290IHsKLSAgLyoqCi0gICAqIFRoZSBwYXRoIGNvbnRleHQgdG8gdXNlIHdoZW4gbWFuaXB1bGF0aW5nIHBhdGhzLgotICAgKi8KKyAgLy8vIFRoZSBwYXRoIGNvbnRleHQgdG8gdXNlIHdoZW4gbWFuaXB1bGF0aW5nIHBhdGhzLgogICBmaW5hbCBwYXRoLkNvbnRleHQgcGF0aENvbnRleHQ7CiAKLSAgLyoqCi0gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByb290IGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyB0byBiZQotICAgKiBhbmFseXplZC4KLSAgICovCisgIC8vLyBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gYmUKKyAgLy8vIGFuYWx5emVkLgogICBmaW5hbCBTdHJpbmcgcm9vdDsKIAotICAvKioKLSAgICogQSBsaXN0IG9mIHRoZSBhYnNvbHV0ZSBwYXRocyBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aGluIHRoZSByb290Ci0gICAqIGRpcmVjdG9yeSB0aGF0IHNob3VsZCBub3QgYmUgYW5hbHl6ZWQuCi0gICAqLworICAvLy8gQSBsaXN0IG9mIHRoZSBhYnNvbHV0ZSBwYXRocyBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aGluIHRoZSByb290CisgIC8vLyBkaXJlY3RvcnkgdGhhdCBzaG91bGQgbm90IGJlIGFuYWx5emVkLgogICBmaW5hbCBMaXN0PFN0cmluZz4gZXhjbHVkZTsKIAotICAvKioKLSAgICogQW4gaW5mb3JtYXRpdmUgdmFsdWUgZm9yIHRoZSBmaWxlIHBhdGggdGhhdCB0aGUgYW5hbHlzaXMgb3B0aW9ucyB3ZXJlIHJlYWQKLSAgICogZnJvbS4gVGhpcyB2YWx1ZSBjYW4gYmUgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGFuYWx5c2lzIG9wdGlvbnMgZmlsZSBvciBpZgotICAgKiB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgaGFzIG5vdCB5ZXQgYmVlbiBkaXNjb3ZlcmVkLgotICAgKi8KKyAgLy8vIEFuIGluZm9ybWF0aXZlIHZhbHVlIGZvciB0aGUgZmlsZSBwYXRoIHRoYXQgdGhlIGFuYWx5c2lzIG9wdGlvbnMgd2VyZSByZWFkCisgIC8vLyBmcm9tLiBUaGlzIHZhbHVlIGNhbiBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYW5hbHlzaXMgb3B0aW9ucyBmaWxlIG9yIGlmCisgIC8vLyB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgaGFzIG5vdCB5ZXQgYmVlbiBkaXNjb3ZlcmVkLgogICBTdHJpbmcgb3B0aW9uc0ZpbGVQYXRoOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHJvb3QuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY29udGV4dCByb290LgogICBDb250ZXh0Um9vdCh0aGlzLnJvb3QsIHRoaXMuZXhjbHVkZSwge0ByZXF1aXJlZCBwYXRoLkNvbnRleHQgcGF0aENvbnRleHR9KQogICAgICAgOiBwYXRoQ29udGV4dCA9IHBhdGhDb250ZXh0ID8/IHBhdGguY29udGV4dDsKIApAQCAtNTksMTIgKzQ3LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSBpcyBjb250YWluZWQgd2l0aGluCi0gICAqIHRoaXMgY29udGV4dCByb290LiBBIGZpbGUgY29udGFpbmVkIGluIGEgY29udGV4dCByb290IGlmIGl0IGlzIHdpdGhpbiB0aGUKLSAgICogY29udGV4dCBbcm9vdF0gbmVpdGhlciBleHBsaWNpdGx5IGV4Y2x1ZGVkIG9yIHdpdGhpbiBvbmUgb2YgdGhlIGV4Y2x1ZGVkCi0gICAqIGRpcmVjdG9yaWVzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSBpcyBjb250YWluZWQgd2l0aGluCisgIC8vLyB0aGlzIGNvbnRleHQgcm9vdC4gQSBmaWxlIGNvbnRhaW5lZCBpbiBhIGNvbnRleHQgcm9vdCBpZiBpdCBpcyB3aXRoaW4gdGhlCisgIC8vLyBjb250ZXh0IFtyb290XSBuZWl0aGVyIGV4cGxpY2l0bHkgZXhjbHVkZWQgb3Igd2l0aGluIG9uZSBvZiB0aGUgZXhjbHVkZWQKKyAgLy8vIGRpcmVjdG9yaWVzLgogICBib29sIGNvbnRhaW5zRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKICAgICBpZiAoIXBhdGhDb250ZXh0LmlzV2l0aGluKHJvb3QsIGZpbGVQYXRoKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvY29udGV4dC9zb3VyY2UuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2NvbnRleHQvc291cmNlLmRhcnQKaW5kZXggOGYzMTU5NC4uNzRhODVkYyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvY29udGV4dC9zb3VyY2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9jb250ZXh0L3NvdXJjZS5kYXJ0CkBAIC0xMywyNSArMTMsMTcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy93b3Jrc3BhY2UvcGFja2FnZV9idWlsZC5kYXJ0JzsKIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBTb3VyY2VGYWN0b3J5YCByZXNvbHZlIHBvc3NpYmx5IHJlbGF0aXZlIFVSSSdzCi0gKiBhZ2FpbnN0IGFuIGV4aXN0aW5nIFtTb3VyY2VdLgotICovCisvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgU291cmNlRmFjdG9yeWAgcmVzb2x2ZSBwb3NzaWJseSByZWxhdGl2ZSBVUkkncworLy8vIGFnYWluc3QgYW4gZXhpc3RpbmcgW1NvdXJjZV0uCiBjbGFzcyBTb3VyY2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFNvdXJjZUZhY3RvcnkgewotICAvKioKLSAgICogVGhlIHJlc29sdmVycyB1c2VkIHRvIHJlc29sdmUgYWJzb2x1dGUgVVJJJ3MuCi0gICAqLworICAvLy8gVGhlIHJlc29sdmVycyB1c2VkIHRvIHJlc29sdmUgYWJzb2x1dGUgVVJJJ3MuCiAgIGZpbmFsIExpc3Q8VXJpUmVzb2x2ZXI+IHJlc29sdmVyczsKIAotICAvKioKLSAgICogQ2FjaGUgb2YgbWFwcGluZyBvZiBhYnNvbHV0ZSBbVXJpXXMgdG8gW1NvdXJjZV1zLgotICAgKi8KKyAgLy8vIENhY2hlIG9mIG1hcHBpbmcgb2YgYWJzb2x1dGUgW1VyaV1zIHRvIFtTb3VyY2Vdcy4KICAgZmluYWwgSGFzaE1hcDxVcmksIFNvdXJjZT4gX2Fic29sdXRlVXJpVG9Tb3VyY2VDYWNoZSA9IEhhc2hNYXA8VXJpLCBTb3VyY2U+KCk7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNvdXJjZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIGFic29sdXRlIFVSSQotICAgKiBbcmVzb2x2ZXJzXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzb3VyY2UgZmFjdG9yeSB3aXRoIHRoZSBnaXZlbiBhYnNvbHV0ZSBVUkkKKyAgLy8vIFtyZXNvbHZlcnNdLgogICBTb3VyY2VGYWN0b3J5SW1wbCh0aGlzLnJlc29sdmVycyk7CiAKICAgQG92ZXJyaWRlCkBAIC0xNDgsMTggKzE0MCwxNyBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIHNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkkgdGhhdCByZXN1bHRzIGZyb20gcmVzb2x2aW5nCi0gICAqIHRoZSBnaXZlbiAocG9zc2libHkgcmVsYXRpdmUpIGNvbnRhaW5lZCBVUkkgYWdhaW5zdCB0aGUgVVJJIGFzc29jaWF0ZWQKLSAgICogd2l0aCBhbiBleGlzdGluZyBzb3VyY2Ugb2JqZWN0LCBvciBgbnVsbGAgaWYgdGhlIFVSSSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBjb250YWluaW5nU291cmNlIHRoZSBzb3VyY2UgY29udGFpbmluZyB0aGUgZ2l2ZW4gVVJJCi0gICAqIEBwYXJhbSBjb250YWluZWRVcmkgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlCi0gICAqICAgICAgICBjb250YWluaW5nIHNvdXJjZQotICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBjb250YWluZWQgVVJJCi0gICAqIEB0aHJvd3MgQW5hbHlzaXNFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBjb250YWluZWQgVVJJIGlzIGludmFsaWQgb3IgaWYgaXQKLSAgICogICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgc291cmNlIG9iamVjdCdzIFVSSQotICAgKi8KKyAgLy8vIFJldHVybiBhIHNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkkgdGhhdCByZXN1bHRzIGZyb20gcmVzb2x2aW5nCisgIC8vLyB0aGUgZ2l2ZW4gKHBvc3NpYmx5IHJlbGF0aXZlKSBjb250YWluZWQgVVJJIGFnYWluc3QgdGhlIFVSSSBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIGFuIGV4aXN0aW5nIHNvdXJjZSBvYmplY3QsIG9yIGBudWxsYCBpZiB0aGUgVVJJIGNvdWxkIG5vdCBiZQorICAvLy8gcmVzb2x2ZWQuCisgIC8vLworICAvLy8gQHBhcmFtIGNvbnRhaW5pbmdTb3VyY2UgdGhlIHNvdXJjZSBjb250YWluaW5nIHRoZSBnaXZlbiBVUkkKKyAgLy8vIEBwYXJhbSBjb250YWluZWRVcmkgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlCisgIC8vLyAgICAgICAgY29udGFpbmluZyBzb3VyY2UKKyAgLy8vIEByZXR1cm4gdGhlIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIGNvbnRhaW5lZCBVUkkKKyAgLy8vIEB0aHJvd3MgQW5hbHlzaXNFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBjb250YWluZWQgVVJJIGlzIGludmFsaWQgb3IgaWYgaXQKKyAgLy8vICAgICAgICAgY2Fubm90IGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIHNvdXJjZSBvYmplY3QncyBVUkkKICAgU291cmNlIF9pbnRlcm5hbFJlc29sdmVVcmkoU291cmNlIGNvbnRhaW5pbmdTb3VyY2UsIFVyaSBjb250YWluZWRVcmkpIHsKICAgICBpZiAoIWNvbnRhaW5lZFVyaS5pc0Fic29sdXRlKSB7CiAgICAgICBpZiAoY29udGFpbmluZ1NvdXJjZSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2J5dGVfc3RvcmUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvYnl0ZV9zdG9yZS5kYXJ0CmluZGV4IGI3MzQ5M2UuLmZiYjVhZmIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvYnl0ZV9zdG9yZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvYnl0ZV9zdG9yZS5kYXJ0CkBAIC00LDM0ICs0LDI2IEBACiAKIGltcG9ydCAnY2FjaGUuZGFydCc7CiAKLS8qKgotICogU3RvcmUgb2YgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIHN0cmluZyBrZXlzLgotICoKLSAqIEVhY2gga2V5IG11c3QgYmUgbm90IGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBjb25zaXN0IG9mIG9ubHkgYFthLXpdYCwKLSAqIGBbMC05XWAsIGAuYCBhbmQgYF9gIGNoYXJhY3RlcnMuIFRoZSBrZXkgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZywgdGhlCi0gKiBsaXRlcmFsIGAuYCwgb3IgY29udGFpbiB0aGUgc2VxdWVuY2UgYC4uYC4KLSAqCi0gKiBOb3RlIHRoYXQgYXNzb2NpYXRpb25zIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBwZXJzaXN0ZW50LiBUaGUgdmFsdWUKLSAqIGFzc29jaWF0ZWQgd2l0aCBhIGtleSBjYW4gY2hhbmdlIG9yIGJlY29tZSBgbnVsbGAgYXQgYW55IHBvaW50IGluIHRpbWUuCi0gKgotICogVE9ETyhzY2hlZ2xvdikgUmVzZWFyY2ggdXNpbmcgYXN5bmNocm9ub3VzIEFQSS4KLSAqLworLy8vIFN0b3JlIG9mIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCBzdHJpbmcga2V5cy4KKy8vLworLy8vIEVhY2gga2V5IG11c3QgYmUgbm90IGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBjb25zaXN0IG9mIG9ubHkgYFthLXpdYCwKKy8vLyBgWzAtOV1gLCBgLmAgYW5kIGBfYCBjaGFyYWN0ZXJzLiBUaGUga2V5IGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcsIHRoZQorLy8vIGxpdGVyYWwgYC5gLCBvciBjb250YWluIHRoZSBzZXF1ZW5jZSBgLi5gLgorLy8vCisvLy8gTm90ZSB0aGF0IGFzc29jaWF0aW9ucyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcGVyc2lzdGVudC4gVGhlIHZhbHVlCisvLy8gYXNzb2NpYXRlZCB3aXRoIGEga2V5IGNhbiBjaGFuZ2Ugb3IgYmVjb21lIGBudWxsYCBhdCBhbnkgcG9pbnQgaW4gdGltZS4KKy8vLworLy8vIFRPRE8oc2NoZWdsb3YpIFJlc2VhcmNoIHVzaW5nIGFzeW5jaHJvbm91cyBBUEkuCiBhYnN0cmFjdCBjbGFzcyBCeXRlU3RvcmUgewotICAvKioKLSAgICogUmV0dXJuIHRoZSBieXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFtrZXldLgotICAgKiBSZXR1cm4gYG51bGxgIGlmIHRoZSBhc3NvY2lhdGlvbiBkb2VzIG5vdCBleGlzdC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gW2tleV0uCisgIC8vLyBSZXR1cm4gYG51bGxgIGlmIHRoZSBhc3NvY2lhdGlvbiBkb2VzIG5vdCBleGlzdC4KICAgTGlzdDxpbnQ+IGdldChTdHJpbmcga2V5KTsKIAotICAvKioKLSAgICogQXNzb2NpYXRlIHRoZSBnaXZlbiBbYnl0ZXNdIHdpdGggdGhlIFtrZXldLgotICAgKi8KKyAgLy8vIEFzc29jaWF0ZSB0aGUgZ2l2ZW4gW2J5dGVzXSB3aXRoIHRoZSBba2V5XS4KICAgdm9pZCBwdXQoU3RyaW5nIGtleSwgTGlzdDxpbnQ+IGJ5dGVzKTsKIH0KIAotLyoqCi0gKiBbQnl0ZVN0b3JlXSB3aGljaCBzdG9yZXMgZGF0YSBvbmx5IGluIG1lbW9yeS4KLSAqLworLy8vIFtCeXRlU3RvcmVdIHdoaWNoIHN0b3JlcyBkYXRhIG9ubHkgaW4gbWVtb3J5LgogY2xhc3MgTWVtb3J5Qnl0ZVN0b3JlIGltcGxlbWVudHMgQnl0ZVN0b3JlIHsKICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxpbnQ+PiBfbWFwID0ge307CiAKQEAgLTQ2LDkgKzM4LDcgQEAKICAgfQogfQogCi0vKioKLSAqIEEgd3JhcHBlciBhcm91bmQgW0J5dGVTdG9yZV0gd2hpY2ggYWRkcyBhbiBpbi1tZW1vcnkgTFJVIGNhY2hlIHRvIGl0LgotICovCisvLy8gQSB3cmFwcGVyIGFyb3VuZCBbQnl0ZVN0b3JlXSB3aGljaCBhZGRzIGFuIGluLW1lbW9yeSBMUlUgY2FjaGUgdG8gaXQuCiBjbGFzcyBNZW1vcnlDYWNoaW5nQnl0ZVN0b3JlIGltcGxlbWVudHMgQnl0ZVN0b3JlIHsKICAgZmluYWwgQnl0ZVN0b3JlIF9zdG9yZTsKICAgZmluYWwgQ2FjaGU8U3RyaW5nLCBMaXN0PGludD4+IF9jYWNoZTsKQEAgLTY4LDkgKzU4LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFtCeXRlU3RvcmVdIHdoaWNoIGRvZXMgbm90IHN0b3JlIGFueSBkYXRhLgotICovCisvLy8gW0J5dGVTdG9yZV0gd2hpY2ggZG9lcyBub3Qgc3RvcmUgYW55IGRhdGEuCiBjbGFzcyBOdWxsQnl0ZVN0b3JlIGltcGxlbWVudHMgQnl0ZVN0b3JlIHsKICAgQG92ZXJyaWRlCiAgIExpc3Q8aW50PiBnZXQoU3RyaW5nIGtleSkgPT4gbnVsbDsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY2FjaGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY2FjaGUuZGFydAppbmRleCAxYTZkOGU0Li5kN2ZlNzUzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NhY2hlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9jYWNoZS5kYXJ0CkBAIC0yLDkgKzIsNyBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogTFJVIGNhY2hlIG9mIG9iamVjdHMuCi0gKi8KKy8vLyBMUlUgY2FjaGUgb2Ygb2JqZWN0cy4KIGNsYXNzIENhY2hlPEssIFY+IHsKICAgZmluYWwgaW50IF9tYXhTaXplQnl0ZXM7CiAgIGZpbmFsIGludCBGdW5jdGlvbihWKSBfbWV0ZXI7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NvbnRleHRfYnVpbGRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9jb250ZXh0X2J1aWxkZXIuZGFydAppbmRleCBlZTA4N2RiLi5mZGU0NjBlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NvbnRleHRfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY29udGV4dF9idWlsZGVyLmRhcnQKQEAgLTI1LDI4ICsyNSwyMCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnIHNob3cgQ29udGVudENhY2hlOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRleHQgYnVpbGRlci4KLSAqLworLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgY29udGV4dCBidWlsZGVyLgogY2xhc3MgQ29udGV4dEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29udGV4dEJ1aWxkZXIgewotICAvKioKLSAgICogVGhlIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4KLSAgICovCisgIC8vLyBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLgogICBmaW5hbCBSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXI7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGNvbnRleHQgYnVpbGRlci4gSWYgYSBbcmVzb3VyY2VQcm92aWRlcl0gaXMKLSAgICogZ2l2ZW4sIHRoZW4gaXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0sIG90aGVyd2lzZSB0aGUKLSAgICogZGVmYXVsdCByZXNvdXJjZSBwcm92aWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY29udGV4dCBidWlsZGVyLiBJZiBhIFtyZXNvdXJjZVByb3ZpZGVyXSBpcworICAvLy8gZ2l2ZW4sIHRoZW4gaXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0sIG90aGVyd2lzZSB0aGUKKyAgLy8vIGRlZmF1bHQgcmVzb3VyY2UgcHJvdmlkZXIgd2lsbCBiZSB1c2VkLgogICBDb250ZXh0QnVpbGRlckltcGwoe1Jlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcn0pCiAgICAgICA6IHJlc291cmNlUHJvdmlkZXIgPQogICAgICAgICAgICAgcmVzb3VyY2VQcm92aWRlciA/PyBQaHlzaWNhbFJlc291cmNlUHJvdmlkZXIuSU5TVEFOQ0U7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgU0RLLCBvciBgbnVsbGAgaWYgdGhlIHNkawotICAgKiBjYW5ub3QgYmUgZm91bmQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBTREssIG9yIGBudWxsYCBpZiB0aGUgc2RrCisgIC8vLyBjYW5ub3QgYmUgZm91bmQuCiAgIFN0cmluZyBnZXQgX2RlZmF1bHRTZGtQYXRoID0+CiAgICAgICBGb2xkZXJCYXNlZERhcnRTZGsuZGVmYXVsdFNka0RpcmVjdG9yeShyZXNvdXJjZVByb3ZpZGVyKT8ucGF0aDsKIApAQCAtNjgsNyArNjAsNyBAQAogICAgIGlmIChzZGtQYXRoID09IG51bGwpIHsKICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ0Nhbm5vdCBmaW5kIHBhdGggdG8gdGhlIFNESycpOwogICAgIH0KLSAgICBEYXJ0U2RrTWFuYWdlciBzZGtNYW5hZ2VyID0gRGFydFNka01hbmFnZXIoc2RrUGF0aCwgdHJ1ZSk7CisgICAgRGFydFNka01hbmFnZXIgc2RrTWFuYWdlciA9IERhcnRTZGtNYW5hZ2VyKHNka1BhdGgpOwogCiAgICAgaWYgKHNjaGVkdWxlciA9PSBudWxsKSB7CiAgICAgICBzY2hlZHVsZXIgPSBBbmFseXNpc0RyaXZlclNjaGVkdWxlcihwZXJmb3JtYW5jZUxvZyk7CkBAIC0xMTMsMTAgKzEwNSw4IEBACiAgICAgcmV0dXJuIGNvbnRleHQ7CiAgIH0KIAotICAvKioKLSAgICogQ29udmVydCB0aGUgW2RlY2xhcmVkVmFyaWFibGVzXSBpbnRvIGEgbWFwIGZvciB1c2Ugd2l0aCB0aGUgb2xkIGNvbnRleHQKLSAgICogYnVpbGRlci4KLSAgICovCisgIC8vLyBDb252ZXJ0IHRoZSBbZGVjbGFyZWRWYXJpYWJsZXNdIGludG8gYSBtYXAgZm9yIHVzZSB3aXRoIHRoZSBvbGQgY29udGV4dAorICAvLy8gYnVpbGRlci4KICAgTWFwPFN0cmluZywgU3RyaW5nPiBfdG9NYXAoRGVjbGFyZWRWYXJpYWJsZXMgZGVjbGFyZWRWYXJpYWJsZXMpIHsKICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IDxTdHJpbmcsIFN0cmluZz57fTsKICAgICBmb3IgKFN0cmluZyBuYW1lIGluIGRlY2xhcmVkVmFyaWFibGVzLnZhcmlhYmxlTmFtZXMpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY29udGV4dF9sb2NhdG9yLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NvbnRleHRfbG9jYXRvci5kYXJ0CmluZGV4IDdiZmE4M2YuLjgwNzQ3MGMgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY29udGV4dF9sb2NhdG9yLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9jb250ZXh0X2xvY2F0b3IuZGFydApAQCAtMzIsMzcgKzMyLDI1IEBACiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnlhbWwveWFtbC5kYXJ0JzsKIAotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRleHQgbG9jYXRvci4KLSAqLworLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgY29udGV4dCBsb2NhdG9yLgogY2xhc3MgQ29udGV4dExvY2F0b3JJbXBsIGltcGxlbWVudHMgQ29udGV4dExvY2F0b3IgewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYW5hbHlzaXMgb3B0aW9ucyBmaWxlLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIEFOQUxZU0lTX09QVElPTlNfTkFNRSA9ICdhbmFseXNpc19vcHRpb25zLnlhbWwnOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZXMgZmlsZS4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZXMgZmlsZS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBQQUNLQUdFU19GSUxFX05BTUUgPSAnLnBhY2thZ2VzJzsKIAotICAvKioKLSAgICogVGhlIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4KLSAgICovCisgIC8vLyBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLgogICBmaW5hbCBSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXI7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGNvbnRleHQgbG9jYXRvci4gSWYgYSBbcmVzb3VyY2VQcm92aWRlcl0gaXMKLSAgICogc3VwcGxpZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLiBPdGhlcndpc2UgdGhlIGRlZmF1bHQKLSAgICogcmVzb3VyY2UgcHJvdmlkZXIgd2lsbCBiZSB1c2VkLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGNvbnRleHQgbG9jYXRvci4gSWYgYSBbcmVzb3VyY2VQcm92aWRlcl0gaXMKKyAgLy8vIHN1cHBsaWVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0CisgIC8vLyByZXNvdXJjZSBwcm92aWRlciB3aWxsIGJlIHVzZWQuCiAgIENvbnRleHRMb2NhdG9ySW1wbCh7UmVzb3VyY2VQcm92aWRlciByZXNvdXJjZVByb3ZpZGVyfSkKICAgICAgIDogdGhpcy5yZXNvdXJjZVByb3ZpZGVyID0KICAgICAgICAgICAgIHJlc291cmNlUHJvdmlkZXIgPz8gUGh5c2ljYWxSZXNvdXJjZVByb3ZpZGVyLklOU1RBTkNFOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIFNESy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIFNESy4KICAgU3RyaW5nIGdldCBfZGVmYXVsdFNka1BhdGggPT4KICAgICAgIEZvbGRlckJhc2VkRGFydFNkay5kZWZhdWx0U2RrRGlyZWN0b3J5KHJlc291cmNlUHJvdmlkZXIpLnBhdGg7CiAKQEAgLTg0LDggKzcyLDcgQEAKICAgICB9CiAgICAgUGVyZm9ybWFuY2VMb2cgcGVyZm9ybWFuY2VMb2cgPSBQZXJmb3JtYW5jZUxvZyhTdHJpbmdCdWZmZXIoKSk7CiAgICAgQW5hbHlzaXNEcml2ZXJTY2hlZHVsZXIgc2NoZWR1bGVyID0gQW5hbHlzaXNEcml2ZXJTY2hlZHVsZXIocGVyZm9ybWFuY2VMb2cpOwotICAgIERhcnRTZGtNYW5hZ2VyIHNka01hbmFnZXIgPQotICAgICAgICBEYXJ0U2RrTWFuYWdlcihzZGtQYXRoID8/IF9kZWZhdWx0U2RrUGF0aCwgdHJ1ZSk7CisgICAgRGFydFNka01hbmFnZXIgc2RrTWFuYWdlciA9IERhcnRTZGtNYW5hZ2VyKHNka1BhdGggPz8gX2RlZmF1bHRTZGtQYXRoKTsKICAgICBzY2hlZHVsZXIuc3RhcnQoKTsKICAgICBDb250ZXh0QnVpbGRlck9wdGlvbnMgb3B0aW9ucyA9IENvbnRleHRCdWlsZGVyT3B0aW9ucygpOwogICAgIENvbnRleHRCdWlsZGVyIGJ1aWxkZXIgPQpAQCAtMTg5LDI2ICsxNzYsMjMgQEAKICAgICByZXR1cm4gcm9vdHM7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3Jlc291cmNlXSBpcyBjb250YWluZWQgaW4gb25lIG9yIG1vcmUgb2YgdGhlCi0gICAqIGdpdmVuIFtmb2xkZXJzXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbcmVzb3VyY2VdIGlzIGNvbnRhaW5lZCBpbiBvbmUgb3IgbW9yZSBvZiB0aGUKKyAgLy8vIGdpdmVuIFtmb2xkZXJzXS4KICAgYm9vbCBfY29udGFpbmVkSW5BbnkoSXRlcmFibGU8Rm9sZGVyPiBmb2xkZXJzLCBSZXNvdXJjZSByZXNvdXJjZSkgPT4KICAgICAgIGZvbGRlcnMuYW55KChGb2xkZXIgZm9sZGVyKSA9PiBmb2xkZXIuY29udGFpbnMocmVzb3VyY2UucGF0aCkpOwogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2ZvbGRlcl0gc2hvdWxkIGJlIHRoZSByb290IG9mIGEgbmV3IGFuYWx5c2lzIGNvbnRleHQsIHRoZW4KLSAgICogY3JlYXRlIGEgbmV3IGNvbnRleHQgcm9vdCBmb3IgaXQgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBjb250ZXh0IFtyb290c10uCi0gICAqIFRoZSBbY29udGFpbmluZ1Jvb3RdIGlzIHRoZSBjb250ZXh0IHJvb3QgZnJvbSBhbiBlbmNsb3NpbmcgZGlyZWN0b3J5IGFuZCBpcwotICAgKiB1c2VkIHRvIGluaGVyaXQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGlzbid0IG92ZXJyaWRkZW4uCi0gICAqCi0gICAqIElmIGVpdGhlciB0aGUgW29wdGlvbnNGaWxlXSBvciBbcGFja2FnZXNGaWxlXSBpcyBub24tYG51bGxgIHRoZW4gdGhlIGdpdmVuCi0gICAqIGZpbGUgd2lsbCBiZSB1c2VkIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSBmaWxlLgotICAgKgotICAgKiBGb3IgZWFjaCBkaXJlY3Rvcnkgd2l0aGluIHRoZSBnaXZlbiBbZm9sZGVyXSB0aGF0IGlzIG5laXRoZXIgaW4gdGhlIGxpc3Qgb2YKLSAgICogW2V4Y2x1ZGVkRm9sZGVyc10gbm9yIGV4Y2x1ZGVkIGJ5IHRoZSBbZXhjbHVkZWRGaWxlUGF0dGVybnNdLCByZWN1cnNpdmVseQotICAgKiBzZWFyY2ggZm9yIG5lc3RlZCBjb250ZXh0IHJvb3RzLgotICAgKi8KKyAgLy8vIElmIHRoZSBnaXZlbiBbZm9sZGVyXSBzaG91bGQgYmUgdGhlIHJvb3Qgb2YgYSBuZXcgYW5hbHlzaXMgY29udGV4dCwgdGhlbgorICAvLy8gY3JlYXRlIGEgbmV3IGNvbnRleHQgcm9vdCBmb3IgaXQgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBjb250ZXh0CisgIC8vLyBbcm9vdHNdLiBUaGUgW2NvbnRhaW5pbmdSb290XSBpcyB0aGUgY29udGV4dCByb290IGZyb20gYW4gZW5jbG9zaW5nCisgIC8vLyBkaXJlY3RvcnkgYW5kIGlzIHVzZWQgdG8gaW5oZXJpdCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgaXNuJ3QKKyAgLy8vIG92ZXJyaWRkZW4uCisgIC8vLworICAvLy8gSWYgZWl0aGVyIHRoZSBbb3B0aW9uc0ZpbGVdIG9yIFtwYWNrYWdlc0ZpbGVdIGlzIG5vbi1gbnVsbGAgdGhlbiB0aGUgZ2l2ZW4KKyAgLy8vIGZpbGUgd2lsbCBiZSB1c2VkIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSBmaWxlLgorICAvLy8KKyAgLy8vIEZvciBlYWNoIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGdpdmVuIFtmb2xkZXJdIHRoYXQgaXMgbmVpdGhlciBpbiB0aGUgbGlzdAorICAvLy8gb2YgW2V4Y2x1ZGVkRm9sZGVyc10gbm9yIGV4Y2x1ZGVkIGJ5IHRoZSBbZXhjbHVkZWRGaWxlUGF0dGVybnNdLAorICAvLy8gcmVjdXJzaXZlbHkgc2VhcmNoIGZvciBuZXN0ZWQgY29udGV4dCByb290cy4KICAgdm9pZCBfY3JlYXRlQ29udGV4dFJvb3RzKAogICAgICAgTGlzdDxDb250ZXh0Um9vdD4gcm9vdHMsCiAgICAgICBGb2xkZXIgZm9sZGVyLApAQCAtMjUzLDE0ICsyMzcsMTMgQEAKICAgICAgICAgZXhjbHVkZWRGaWxlUGF0dGVybnMsIG9wdGlvbnNGaWxlLCBwYWNrYWdlc0ZpbGUpOwogICB9CiAKLSAgLyoqCi0gICAqIEZvciBlYWNoIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGdpdmVuIFtmb2xkZXJdIHRoYXQgaXMgbmVpdGhlciBpbiB0aGUgbGlzdCBvZgotICAgKiBbZXhjbHVkZWRGb2xkZXJzXSBub3IgZXhjbHVkZWQgYnkgdGhlIFtleGNsdWRlZEZpbGVQYXR0ZXJuc10sIHJlY3Vyc2l2ZWx5Ci0gICAqIHNlYXJjaCBmb3IgbmVzdGVkIGNvbnRleHQgcm9vdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIFtyb290c10uCi0gICAqCi0gICAqIElmIGVpdGhlciB0aGUgW29wdGlvbnNGaWxlXSBvciBbcGFja2FnZXNGaWxlXSBpcyBub24tYG51bGxgIHRoZW4gdGhlIGdpdmVuCi0gICAqIGZpbGUgd2lsbCBiZSB1c2VkIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIEZvciBlYWNoIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGdpdmVuIFtmb2xkZXJdIHRoYXQgaXMgbmVpdGhlciBpbiB0aGUgbGlzdAorICAvLy8gb2YgW2V4Y2x1ZGVkRm9sZGVyc10gbm9yIGV4Y2x1ZGVkIGJ5IHRoZSBbZXhjbHVkZWRGaWxlUGF0dGVybnNdLAorICAvLy8gcmVjdXJzaXZlbHkgc2VhcmNoIGZvciBuZXN0ZWQgY29udGV4dCByb290cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpc3Qgb2YKKyAgLy8vIFtyb290c10uCisgIC8vLworICAvLy8gSWYgZWl0aGVyIHRoZSBbb3B0aW9uc0ZpbGVdIG9yIFtwYWNrYWdlc0ZpbGVdIGlzIG5vbi1gbnVsbGAgdGhlbiB0aGUgZ2l2ZW4KKyAgLy8vIGZpbGUgd2lsbCBiZSB1c2VkIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSBmaWxlLgogICB2b2lkIF9jcmVhdGVDb250ZXh0Um9vdHNJbigKICAgICAgIExpc3Q8Q29udGV4dFJvb3Q+IHJvb3RzLAogICAgICAgRm9sZGVyIGZvbGRlciwKQEAgLTMwMywxMSArMjg2LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbmFseXNpcyBvcHRpb25zIGZpbGUgdG8gYmUgdXNlZCB0byBhbmFseXplIGZpbGVzIGluIHRoZSBnaXZlbgotICAgKiBbZm9sZGVyXSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGFuYWx5c2lzIG9wdGlvbnMgZmlsZSBpbiB0aGUgZ2l2ZW4KLSAgICogZm9sZGVyIG9yIGFueSBwYXJlbnQgZm9sZGVyLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgYW5hbHlzaXMgb3B0aW9ucyBmaWxlIHRvIGJlIHVzZWQgdG8gYW5hbHl6ZSBmaWxlcyBpbiB0aGUgZ2l2ZW4KKyAgLy8vIFtmb2xkZXJdLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYW5hbHlzaXMgb3B0aW9ucyBmaWxlIGluIHRoZSBnaXZlbgorICAvLy8gZm9sZGVyIG9yIGFueSBwYXJlbnQgZm9sZGVyLgogICBGaWxlIF9maW5kT3B0aW9uc0ZpbGUoRm9sZGVyIGZvbGRlcikgewogICAgIHdoaWxlIChmb2xkZXIgIT0gbnVsbCkgewogICAgICAgRmlsZSBwYWNrYWdlc0ZpbGUgPSBfZ2V0T3B0aW9uc0ZpbGUoZm9sZGVyKTsKQEAgLTMxOSwxMSArMzAwLDkgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBhY2thZ2VzIGZpbGUgdG8gYmUgdXNlZCB0byBhbmFseXplIGZpbGVzIGluIHRoZSBnaXZlbiBbZm9sZGVyXSwKLSAgICogb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHBhY2thZ2VzIGZpbGUgaW4gdGhlIGdpdmVuIGZvbGRlciBvciBhbnkgcGFyZW50Ci0gICAqIGZvbGRlci4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHBhY2thZ2VzIGZpbGUgdG8gYmUgdXNlZCB0byBhbmFseXplIGZpbGVzIGluIHRoZSBnaXZlbgorICAvLy8gW2ZvbGRlcl0sIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBwYWNrYWdlcyBmaWxlIGluIHRoZSBnaXZlbiBmb2xkZXIgb3IKKyAgLy8vIGFueSBwYXJlbnQgZm9sZGVyLgogICBGaWxlIF9maW5kUGFja2FnZXNGaWxlKEZvbGRlciBmb2xkZXIpIHsKICAgICB3aGlsZSAoZm9sZGVyICE9IG51bGwpIHsKICAgICAgIEZpbGUgcGFja2FnZXNGaWxlID0gX2dldFBhY2thZ2VzRmlsZShmb2xkZXIpOwpAQCAtMzc1LDEwICszNTQsOCBAQAogICAgIHJldHVybiBwYXR0ZXJuczsKICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2RpcmVjdG9yeV0gY29udGFpbnMgYSBmaWxlIHdpdGggdGhlIGdpdmVuIFtuYW1lXSwgdGhlbiByZXR1cm4KLSAgICogdGhlIGZpbGUuIE90aGVyd2lzZSwgcmV0dXJuIGBudWxsYC4KLSAgICovCisgIC8vLyBJZiB0aGUgZ2l2ZW4gW2RpcmVjdG9yeV0gY29udGFpbnMgYSBmaWxlIHdpdGggdGhlIGdpdmVuIFtuYW1lXSwgdGhlbgorICAvLy8gcmV0dXJuIHRoZSBmaWxlLiBPdGhlcndpc2UsIHJldHVybiBgbnVsbGAuCiAgIEZpbGUgX2dldEZpbGUoRm9sZGVyIGRpcmVjdG9yeSwgU3RyaW5nIG5hbWUpIHsKICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRpcmVjdG9yeS5nZXRDaGlsZChuYW1lKTsKICAgICBpZiAocmVzb3VyY2UgaXMgRmlsZSAmJiByZXNvdXJjZS5leGlzdHMpIHsKQEAgLTM4NywyNCArMzY0LDE4IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBhbmFseXNpcyBvcHRpb25zIGZpbGUgaW4gdGhlIGdpdmVuIFtmb2xkZXJdLCBvciBgbnVsbGAgaWYgdGhlCi0gICAqIGZvbGRlciBkb2VzIG5vdCBjb250YWluIGFuIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGFuYWx5c2lzIG9wdGlvbnMgZmlsZSBpbiB0aGUgZ2l2ZW4gW2ZvbGRlcl0sIG9yIGBudWxsYCBpZiB0aGUKKyAgLy8vIGZvbGRlciBkb2VzIG5vdCBjb250YWluIGFuIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KICAgRmlsZSBfZ2V0T3B0aW9uc0ZpbGUoRm9sZGVyIGZvbGRlcikgPT4KICAgICAgIF9nZXRGaWxlKGZvbGRlciwgQU5BTFlTSVNfT1BUSU9OU19OQU1FKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBwYWNrYWdlcyBmaWxlIGluIHRoZSBnaXZlbiBbZm9sZGVyXSwgb3IgYG51bGxgIGlmIHRoZSBmb2xkZXIKLSAgICogZG9lcyBub3QgY29udGFpbiBhIHBhY2thZ2VzIGZpbGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBwYWNrYWdlcyBmaWxlIGluIHRoZSBnaXZlbiBbZm9sZGVyXSwgb3IgYG51bGxgIGlmIHRoZSBmb2xkZXIKKyAgLy8vIGRvZXMgbm90IGNvbnRhaW4gYSBwYWNrYWdlcyBmaWxlLgogICBGaWxlIF9nZXRQYWNrYWdlc0ZpbGUoRm9sZGVyIGZvbGRlcikgPT4gX2dldEZpbGUoZm9sZGVyLCBQQUNLQUdFU19GSUxFX05BTUUpOwogCi0gIC8qKgotICAgKiBBZGQgdG8gdGhlIGdpdmVuIGxpc3RzIG9mIFtmb2xkZXJzXSBhbmQgW2ZpbGVzXSBhbGwgb2YgdGhlIHJlc291cmNlcyBpbiB0aGUKLSAgICogZ2l2ZW4gbGlzdCBvZiBbcGF0aHNdIHRoYXQgZXhpc3QgYW5kIGFyZSBub3QgY29udGFpbmVkIHdpdGhpbiBvbmUgb2YgdGhlCi0gICAqIGZvbGRlcnMuCi0gICAqLworICAvLy8gQWRkIHRvIHRoZSBnaXZlbiBsaXN0cyBvZiBbZm9sZGVyc10gYW5kIFtmaWxlc10gYWxsIG9mIHRoZSByZXNvdXJjZXMgaW4KKyAgLy8vIHRoZSBnaXZlbiBsaXN0IG9mIFtwYXRoc10gdGhhdCBleGlzdCBhbmQgYXJlIG5vdCBjb250YWluZWQgd2l0aGluIG9uZSBvZgorICAvLy8gdGhlIGZvbGRlcnMuCiAgIHZvaWQgX3Jlc291cmNlc0Zyb21QYXRocygKICAgICAgIExpc3Q8U3RyaW5nPiBwYXRocywgTGlzdDxGb2xkZXI+IGZvbGRlcnMsIExpc3Q8RmlsZT4gZmlsZXMpIHsKICAgICBmb3IgKFN0cmluZyBwYXRoIGluIF91bmlxdWVTb3J0ZWRQYXRocyhwYXRocykpIHsKQEAgLTQyMSwxMCArMzkyLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBvZiBwYXRocyB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlCi0gICAqIGdpdmVuIGxpc3Qgb2YgW3BhdGhzXSwgc29ydGVkIHN1Y2ggdGhhdCBzaG9ydGVyIHBhdGhzIGFyZSBmaXJzdC4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSB1bmlxdWUgZWxlbWVudHMgZnJvbSB0aGUKKyAgLy8vIGdpdmVuIGxpc3Qgb2YgW3BhdGhzXSwgc29ydGVkIHN1Y2ggdGhhdCBzaG9ydGVyIHBhdGhzIGFyZSBmaXJzdC4KICAgTGlzdDxTdHJpbmc+IF91bmlxdWVTb3J0ZWRQYXRocyhMaXN0PFN0cmluZz4gcGF0aHMpIHsKICAgICBTZXQ8U3RyaW5nPiB1bmlxdWVQYXRocyA9IEhhc2hTZXQ8U3RyaW5nPi5mcm9tKHBhdGhzKTsKICAgICBMaXN0PFN0cmluZz4gc29ydGVkUGF0aHMgPSB1bmlxdWVQYXRocy50b0xpc3QoKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY29udGV4dF9yb290LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NvbnRleHRfcm9vdC5kYXJ0CmluZGV4IDg4ZDA4NWEuLmU2NTI3MTAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY29udGV4dF9yb290LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9jb250ZXh0X3Jvb3QuZGFydApAQCAtNiw5ICs2LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCc7CiAKLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBjb250ZXh0IHJvb3QuCi0gKi8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRleHQgcm9vdC4KIGNsYXNzIENvbnRleHRSb290SW1wbCBpbXBsZW1lbnRzIENvbnRleHRSb290IHsKICAgQG92ZXJyaWRlCiAgIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcjsKQEAgLTI4LDkgKzI2LDcgQEAKICAgQG92ZXJyaWRlCiAgIEZpbGUgcGFja2FnZXNGaWxlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHJvb3QuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY29udGV4dCByb290LgogICBDb250ZXh0Um9vdEltcGwodGhpcy5yZXNvdXJjZVByb3ZpZGVyLCB0aGlzLnJvb3QpOwogCiAgIEBvdmVycmlkZQpAQCAtNzEsMTAgKzY3LDggQEAKICAgICByZXR1cm4gX2lzSW5jbHVkZWQocGF0aCkgJiYgIV9pc0V4Y2x1ZGVkKHBhdGgpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYWJzb2x1dGUgcGF0aHMgb2YgYWxsIG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUKLSAgICogZ2l2ZW4gW2ZvbGRlcl0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRocyBvZiBhbGwgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZQorICAvLy8gZ2l2ZW4gW2ZvbGRlcl0uCiAgIEl0ZXJhYmxlPFN0cmluZz4gX2luY2x1ZGVkRmlsZXNJbkZvbGRlcihGb2xkZXIgZm9sZGVyKSBzeW5jKiB7CiAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSBpbiBmb2xkZXIuZ2V0Q2hpbGRyZW4oKSkgewogICAgICAgU3RyaW5nIHBhdGggPSByZXNvdXJjZS5wYXRoOwpAQCAtOTEsMTAgKzg1LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3BhdGhdIGlzIGVpdGhlciB0aGUgc2FtZSBhcyBvciBpbnNpZGUgb2Ygb25lIG9mCi0gICAqIHRoZSBbZXhjbHVkZWRQYXRoc10uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3BhdGhdIGlzIGVpdGhlciB0aGUgc2FtZSBhcyBvciBpbnNpZGUgb2Ygb25lCisgIC8vLyBvZiB0aGUgW2V4Y2x1ZGVkUGF0aHNdLgogICBib29sIF9pc0V4Y2x1ZGVkKFN0cmluZyBwYXRoKSB7CiAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVzb3VyY2VQcm92aWRlci5wYXRoQ29udGV4dDsKICAgICBTdHJpbmcgbmFtZSA9IGNvbnRleHQuYmFzZW5hbWUocGF0aCk7CkBAIC0xMjAsMTAgKzExMiw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtwYXRoXSBpcyBlaXRoZXIgdGhlIHNhbWUgYXMgb3IgaW5zaWRlIG9mIG9uZSBvZgotICAgKiB0aGUgW2luY2x1ZGVkUGF0aHNdLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtwYXRoXSBpcyBlaXRoZXIgdGhlIHNhbWUgYXMgb3IgaW5zaWRlIG9mIG9uZQorICAvLy8gb2YgdGhlIFtpbmNsdWRlZFBhdGhzXS4KICAgYm9vbCBfaXNJbmNsdWRlZChTdHJpbmcgcGF0aCkgewogICAgIENvbnRleHQgY29udGV4dCA9IHJlc291cmNlUHJvdmlkZXIucGF0aENvbnRleHQ7CiAgICAgZm9yIChTdHJpbmcgaW5jbHVkZWRQYXRoIGluIGluY2x1ZGVkUGF0aHMpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY3JjMzIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvY3JjMzIuZGFydAppbmRleCAyZjJkNTA0Li4zNzQwOTdjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2NyYzMyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9jcmMzMi5kYXJ0CkBAIC0yNjEsMTAgKzI2MSw4IEBACiAgIDB4MkQwMkVGOEQKIF07CiAKLS8qKgotICogR2V0IHRoZSBDUkMtMzIgY2hlY2tzdW0gb2YgdGhlIGdpdmVuIGFycmF5LiBZb3UgY2FuIGFwcGVuZCBieXRlcyB0byBhbgotICogYWxyZWFkeSBjb21wdXRlZCBjcmMgYnkgc3BlY2lmeWluZyB0aGUgcHJldmlvdXMgW2NyY10gdmFsdWUuCi0gKi8KKy8vLyBHZXQgdGhlIENSQy0zMiBjaGVja3N1bSBvZiB0aGUgZ2l2ZW4gYXJyYXkuIFlvdSBjYW4gYXBwZW5kIGJ5dGVzIHRvIGFuCisvLy8gYWxyZWFkeSBjb21wdXRlZCBjcmMgYnkgc3BlY2lmeWluZyB0aGUgcHJldmlvdXMgW2NyY10gdmFsdWUuCiBpbnQgZ2V0Q3JjMzIoTGlzdDxpbnQ+IGFycmF5LCBbaW50IGNyYyA9IDBdKSB7CiAgIGludCBsZW4gPSBhcnJheS5sZW5ndGg7CiAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmY7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2RlZmluZWRfbmFtZXMuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZGVmaW5lZF9uYW1lcy5kYXJ0CmluZGV4IGQ3NjYzMWEuLmVkM2NmYjcgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZGVmaW5lZF9uYW1lcy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZGVmaW5lZF9uYW1lcy5kYXJ0CkBAIC00LDkgKzQsNyBAQAogCiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogCi0vKioKLSAqIENvbXB1dGUgdGhlIFtEZWZpbmVkTmFtZXNdIGZvciB0aGUgZ2l2ZW4gW3VuaXRdLgotICovCisvLy8gQ29tcHV0ZSB0aGUgW0RlZmluZWROYW1lc10gZm9yIHRoZSBnaXZlbiBbdW5pdF0uCiBEZWZpbmVkTmFtZXMgY29tcHV0ZURlZmluZWROYW1lcyhDb21waWxhdGlvblVuaXQgdW5pdCkgewogICBEZWZpbmVkTmFtZXMgbmFtZXMgPSBEZWZpbmVkTmFtZXMoKTsKIApAQCAtNDcsOSArNDUsNyBAQAogICByZXR1cm4gbmFtZXM7CiB9CiAKLS8qKgotICogRGVmaW5lZCB0b3AtbGV2ZWwgYW5kIGNsYXNzIG1lbWJlciBuYW1lcy4KLSAqLworLy8vIERlZmluZWQgdG9wLWxldmVsIGFuZCBjbGFzcyBtZW1iZXIgbmFtZXMuCiBjbGFzcyBEZWZpbmVkTmFtZXMgewogICBmaW5hbCBTZXQ8U3RyaW5nPiB0b3BMZXZlbE5hbWVzID0gPFN0cmluZz57fTsKICAgZmluYWwgU2V0PFN0cmluZz4gY2xhc3NNZW1iZXJOYW1lcyA9IDxTdHJpbmc+e307CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXIuZGFydAppbmRleCAzZWM4ODhhLi5mNzExNjI4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyLmRhcnQKQEAgLTkxLDcgKzkxLDcgQEAKIC8vLyBUT0RPKHNjaGVnbG92KSBDbGVhbiB1cCB0aGUgbGlzdCBvZiBpbXBsaWNpdGx5IGFuYWx5emVkIGZpbGVzLgogY2xhc3MgQW5hbHlzaXNEcml2ZXIgaW1wbGVtZW50cyBBbmFseXNpc0RyaXZlckdlbmVyaWMgewogICAvLy8gVGhlIHZlcnNpb24gb2YgZGF0YSBmb3JtYXQsIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvbiBldmVyeSBmb3JtYXQgY2hhbmdlLgotICBzdGF0aWMgY29uc3QgaW50IERBVEFfVkVSU0lPTiA9IDEwMzsKKyAgc3RhdGljIGNvbnN0IGludCBEQVRBX1ZFUlNJT04gPSAxMDQ7CiAKICAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIGxpc3QgcmV0dXJuZWQgYnkgW19jb21wdXRlRGVjbGFyZWRWYXJpYWJsZXNTaWduYXR1cmVdLgogICBzdGF0aWMgY29uc3QgaW50IF9kZWNsYXJlZFZhcmlhYmxlc1NpZ25hdHVyZUxlbmd0aCA9IDQ7CkBAIC0xNDQsMTIgKzE0NCwxOCBAQAogICBhcGkuQW5hbHlzaXNDb250ZXh0IGFuYWx5c2lzQ29udGV4dDsKIAogICAvLy8gVGhlIHNhbHQgdG8gbWl4IGludG8gYWxsIGhhc2hlcyB1c2VkIGFzIGtleXMgZm9yIHVubGlua2VkIGRhdGEuCi0gIGZpbmFsIFVpbnQzMkxpc3QgX3VubGlua2VkU2FsdCA9Ci0gICAgICBVaW50MzJMaXN0KDIgKyBBbmFseXNpc09wdGlvbnNJbXBsLnVubGlua2VkU2lnbmF0dXJlTGVuZ3RoKTsKKyAgZmluYWwgVWludDMyTGlzdCBfc2FsdEZvclVubGlua2VkID0KKyAgICAgIFVpbnQzMkxpc3QoMiArIEFuYWx5c2lzT3B0aW9uc0ltcGwuc2lnbmF0dXJlTGVuZ3RoKTsKKworICAvLy8gVGhlIHNhbHQgdG8gbWl4IGludG8gYWxsIGhhc2hlcyB1c2VkIGFzIGtleXMgZm9yIGVsZW1lbnRzLgorICBmaW5hbCBVaW50MzJMaXN0IF9zYWx0Rm9yRWxlbWVudHMgPSBVaW50MzJMaXN0KDEgKworICAgICAgQW5hbHlzaXNPcHRpb25zSW1wbC5zaWduYXR1cmVMZW5ndGggKworICAgICAgX2RlY2xhcmVkVmFyaWFibGVzU2lnbmF0dXJlTGVuZ3RoKTsKIAogICAvLy8gVGhlIHNhbHQgdG8gbWl4IGludG8gYWxsIGhhc2hlcyB1c2VkIGFzIGtleXMgZm9yIGxpbmtlZCBkYXRhLgotICBmaW5hbCBVaW50MzJMaXN0IF9saW5rZWRTYWx0ID0gVWludDMyTGlzdCgKLSAgICAgIDIgKyBBbmFseXNpc09wdGlvbnMuc2lnbmF0dXJlTGVuZ3RoICsgX2RlY2xhcmVkVmFyaWFibGVzU2lnbmF0dXJlTGVuZ3RoKTsKKyAgZmluYWwgVWludDMyTGlzdCBfc2FsdEZvclJlc29sdXRpb24gPSBVaW50MzJMaXN0KDIgKworICAgICAgQW5hbHlzaXNPcHRpb25zSW1wbC5zaWduYXR1cmVMZW5ndGggKworICAgICAgX2RlY2xhcmVkVmFyaWFibGVzU2lnbmF0dXJlTGVuZ3RoKTsKIAogICAvLy8gVGhlIHNldCBvZiBwcmlvcml0eSBmaWxlcywgdGhhdCBzaG91bGQgYmUgYW5hbHl6ZWQgc29vbmVyLgogICBmaW5hbCBfcHJpb3JpdHlGaWxlcyA9IDxTdHJpbmc+e307CkBAIC0yMzUsMjggKzI0MSw5IEBACiAgIC8vLyBUaGUgW0ZpbGVUcmFja2VyXSB1c2VkIGJ5IHRoaXMgZHJpdmVyLgogICBGaWxlVHJhY2tlciBfZmlsZVRyYWNrZXI7CiAKLSAgLy8vIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBzZXQgb2YgYW5hbHl6ZWQgZmlsZXMgbXVzdCBub3QgY2hhbmdlLAotICAvLy8gYW5kIGFsbCBbQW5hbHlzaXNSZXN1bHRdcyBhcmUgY2FjaGVkIGluZmluaXRlbHkuCi0gIC8vLwotICAvLy8gVGhlIGZsYWcgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igbm9uLWludGVyYWN0aXZlIGNsaWVudHMsIGxpa2UgRERDLAotICAvLy8gd2hpY2ggc3RhcnQgYSBuZXcgYW5hbHlzaXMgc2Vzc2lvbiwgbG9hZCBhIHNldCBvZiBmaWxlcywgcmVzb2x2ZSBhbGwgb2YKLSAgLy8vIHRoZW0sIHByb2Nlc3MgdGhlIHJlc29sdmVkIHVuaXRzLCBhbmQgdGhlbiB0aHJvdyBhd2F5IHRoYXQgd2hvbGUgc2Vzc2lvbi4KLSAgLy8vCi0gIC8vLyBUaGUga2V5IHByb2JsZW0gdGhhdCB0aGlzIGZsYWcgaXMgc29sdmluZyBpcyB0aGF0IHRoZSBkcml2ZXIgYW5hbHl6ZXMgdGhlCi0gIC8vLyB3aG9sZSBsaWJyYXJ5IHdoZW4gdGhlIHJlc3VsdCBmb3IgYSB1bml0IG9mIHRoZSBsaWJyYXJ5IGlzIHJlcXVlc3RlZC4gU28sCi0gIC8vLyB3aGVuIHRoZSBjbGllbnQgcmVxdWVzdHMgc2VxdWVudGlhbGx5IHRoZSBkZWZpbmluZyB1bml0LCB0aGVuIHRoZSBmaXJzdAotICAvLy8gcGFydCwgdGhlbiB0aGUgc2Vjb25kIHBhcnQsIHRoZSBkcml2ZXIgaGFzIHRvIHBlcmZvcm0gYW5hbHlzaXMgb2YgdGhlCi0gIC8vLyBsaWJyYXJ5IHRocmVlIHRpbWVzIGFuZCBldmVyeSB0aW1lIHRocm93IGF3YXkgYWxsIHRoZSB1bml0cyBleGNlcHQgdGhlIG9uZQotICAvLy8gd2hpY2ggd2FzIHJlcXVlc3RlZC4gV2l0aCB0aGlzIGZsYWcgc2V0IHRvIGB0cnVlYCwgdGhlIGRyaXZlciBjYW4gYW5hbHl6ZQotICAvLy8gb25jZSBhbmQgY2FjaGUgYWxsIHRoZSByZXNvbHZlZCB1bml0cy4KLSAgZmluYWwgYm9vbCBkaXNhYmxlQ2hhbmdlc0FuZENhY2hlQWxsUmVzdWx0czsKLQogICAvLy8gV2hldGhlciByZXNvbHZlZCB1bml0cyBzaG91bGQgYmUgaW5kZXhlZC4KICAgZmluYWwgYm9vbCBlbmFibGVJbmRleDsKIAotICAvLy8gVGhlIGNhY2hlIHRvIHVzZSB3aXRoIFtkaXNhYmxlQ2hhbmdlc0FuZENhY2hlQWxsUmVzdWx0c10uCi0gIGZpbmFsIE1hcDxTdHJpbmcsIEFuYWx5c2lzUmVzdWx0PiBfYWxsQ2FjaGVkUmVzdWx0cyA9IHt9OwotCiAgIC8vLyBUaGUgY3VycmVudCBhbmFseXNpcyBzZXNzaW9uLgogICBBbmFseXNpc1Nlc3Npb25JbXBsIF9jdXJyZW50U2Vzc2lvbjsKIApAQCAtMjg4LDcgKzI3NSw2IEBACiAgICAgICBTb3VyY2VGYWN0b3J5IHNvdXJjZUZhY3RvcnksCiAgICAgICB0aGlzLl9hbmFseXNpc09wdGlvbnMsCiAgICAgICB7UGFja2FnZXMgcGFja2FnZXMsCi0gICAgICB0aGlzLmRpc2FibGVDaGFuZ2VzQW5kQ2FjaGVBbGxSZXN1bHRzID0gZmFsc2UsCiAgICAgICB0aGlzLmVuYWJsZUluZGV4ID0gZmFsc2UsCiAgICAgICBTdW1tYXJ5RGF0YVN0b3JlIGV4dGVybmFsU3VtbWFyaWVzLAogICAgICAgYm9vbCByZXRhaW5EYXRhRm9yVGVzdGluZyA9IGZhbHNlfSkKQEAgLTQ4Miw3ICs0NjgsNiBAQAogICAvLy8gW2NoYW5nZUZpbGVdIGludm9jYXRpb24uCiAgIHZvaWQgY2hhbmdlRmlsZShTdHJpbmcgcGF0aCkgewogICAgIF90aHJvd0lmTm90QWJzb2x1dGVQYXRoKHBhdGgpOwotICAgIF90aHJvd0lmQ2hhbmdlc0FyZU5vdEFsbG93ZWQoKTsKICAgICBfY2hhbmdlRmlsZShwYXRoKTsKICAgfQogCkBAIC01NDcsMTEgKzUzMiw3IEBACiAgIC8vLyBUaGUgW3BhdGhdIGNhbiBiZSBhbnkgZmlsZSAtIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBhbmFseXplZCwgb3IgbmVpdGhlci4KICAgUmVzb2x2ZWRVbml0UmVzdWx0IGdldENhY2hlZFJlc3VsdChTdHJpbmcgcGF0aCkgewogICAgIF90aHJvd0lmTm90QWJzb2x1dGVQYXRoKHBhdGgpOwotICAgIFJlc29sdmVkVW5pdFJlc3VsdCByZXN1bHQgPSBfcHJpb3JpdHlSZXN1bHRzW3BhdGhdOwotICAgIGlmIChkaXNhYmxlQ2hhbmdlc0FuZENhY2hlQWxsUmVzdWx0cykgewotICAgICAgcmVzdWx0ID8/PSBfYWxsQ2FjaGVkUmVzdWx0c1twYXRoXTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gX3ByaW9yaXR5UmVzdWx0c1twYXRoXTsKICAgfQogCiAgIC8vLyBSZXR1cm4gYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSBbRXJyb3JzUmVzdWx0XSBmb3IgdGhlIERhcnQKQEAgLTg4NSw3ICs4NjYsNyBAQAogICAgIF90aHJvd0lmTm90QWJzb2x1dGVQYXRoKHBhdGgpOwogICAgIHZhciBmaWxlID0gZnNTdGF0ZS5nZXRGaWxlRm9yUGF0aChwYXRoKTsKICAgICBBcGlTaWduYXR1cmUgc2lnbmF0dXJlID0gQXBpU2lnbmF0dXJlKCk7Ci0gICAgc2lnbmF0dXJlLmFkZFVpbnQzMkxpc3QoX2xpbmtlZFNhbHQpOworICAgIHNpZ25hdHVyZS5hZGRVaW50MzJMaXN0KF9zYWx0Rm9yUmVzb2x1dGlvbik7CiAgICAgc2lnbmF0dXJlLmFkZFN0cmluZyhmaWxlLnRyYW5zaXRpdmVTaWduYXR1cmUpOwogICAgIHJldHVybiBzaWduYXR1cmU7CiAgIH0KQEAgLTExNzksNyArMTE2MCw2IEBACiAgIC8vLyBidXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoaXMuCiAgIHZvaWQgcmVtb3ZlRmlsZShTdHJpbmcgcGF0aCkgewogICAgIF90aHJvd0lmTm90QWJzb2x1dGVQYXRoKHBhdGgpOwotICAgIF90aHJvd0lmQ2hhbmdlc0FyZU5vdEFsbG93ZWQoKTsKICAgICBfZmlsZVRyYWNrZXIucmVtb3ZlRmlsZShwYXRoKTsKICAgICBjbGVhckxpYnJhcnlDb250ZXh0KCk7CiAgICAgX3ByaW9yaXR5UmVzdWx0cy5jbGVhcigpOwpAQCAtMTMyMywxMiArMTMwMyw2IEBACiAgICAgICAgICAgICBieXRlcyA9IHVuaXRCeXRlczsKICAgICAgICAgICAgIHJlc29sdmVkVW5pdCA9IHVuaXRSZXN1bHQudW5pdDsKICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRpc2FibGVDaGFuZ2VzQW5kQ2FjaGVBbGxSZXN1bHRzKSB7Ci0gICAgICAgICAgICBBbmFseXNpc1Jlc3VsdCByZXN1bHQgPSBfZ2V0QW5hbHlzaXNSZXN1bHRGcm9tQnl0ZXMoCi0gICAgICAgICAgICAgICAgdW5pdEZpbGUsIHVuaXRTaWduYXR1cmUsIHVuaXRCeXRlcywKLSAgICAgICAgICAgICAgICBjb250ZW50OiB1bml0RmlsZS5jb250ZW50LCByZXNvbHZlZFVuaXQ6IHVuaXRSZXN1bHQudW5pdCk7Ci0gICAgICAgICAgICBfYWxsQ2FjaGVkUmVzdWx0c1t1bml0RmlsZS5wYXRoXSA9IHJlc3VsdDsKLSAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCwgZnVsbCBvciBwYXJ0aWFsLgpAQCAtMTQ5Myw4ICsxNDY3LDggQEAKICAgICAgIHNvdXJjZUZhY3RvcnksCiAgICAgICBhbmFseXNpc09wdGlvbnMsCiAgICAgICBkZWNsYXJlZFZhcmlhYmxlcywKLSAgICAgIF91bmxpbmtlZFNhbHQsCi0gICAgICBfbGlua2VkU2FsdCwKKyAgICAgIF9zYWx0Rm9yVW5saW5rZWQsCisgICAgICBfc2FsdEZvckVsZW1lbnRzLAogICAgICAgZmVhdHVyZVNldFByb3ZpZGVyLAogICAgICAgZXh0ZXJuYWxTdW1tYXJpZXM6IF9leHRlcm5hbFN1bW1hcmllcywKICAgICApOwpAQCAtMTUxMiw2ICsxNDg2LDcgQEAKICAgICBOdWxsU2FmZXR5VW5kZXJzdGFuZGluZ0ZsYWcuZW5hYmxlTnVsbFNhZmV0eVR5cGVzKCgpIHsKICAgICAgIGlmIChfbGlicmFyeUNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICBfbGlicmFyeUNvbnRleHQgPSBMaWJyYXJ5Q29udGV4dCgKKyAgICAgICAgICB0ZXN0VmlldzogX3Rlc3RWaWV3LmxpYnJhcnlDb250ZXh0LAogICAgICAgICAgIHNlc3Npb246IGN1cnJlbnRTZXNzaW9uLAogICAgICAgICAgIGxvZ2dlcjogX2xvZ2dlciwKICAgICAgICAgICBieXRlU3RvcmU6IF9ieXRlU3RvcmUsCkBAIC0xNTQzLDMxICsxNTE4LDQ3IEBACiAgICAgX2Rpc2NvdmVyQXZhaWxhYmxlRmlsZXNUYXNrID8/PSBfRGlzY292ZXJBdmFpbGFibGVGaWxlc1Rhc2sodGhpcyk7CiAgIH0KIAotICAvLy8gRmlsbCBbX3VubGlua2VkU2FsdF0gYW5kIFtfbGlua2VkU2FsdF0gd2l0aCBkYXRhLgogICB2b2lkIF9maWxsU2FsdCgpIHsKLSAgICBfdW5saW5rZWRTYWx0WzBdID0gREFUQV9WRVJTSU9OOwotICAgIF91bmxpbmtlZFNhbHRbMV0gPSBlbmFibGVJbmRleCA/IDEgOiAwOwotICAgIF91bmxpbmtlZFNhbHQuc2V0QWxsKDIsIF9hbmFseXNpc09wdGlvbnMudW5saW5rZWRTaWduYXR1cmUpOwotCi0gICAgX2ZpbGxTYWx0TGlua2VkKCk7CisgICAgX2ZpbGxTYWx0Rm9yVW5saW5rZWQoKTsKKyAgICBfZmlsbFNhbHRGb3JFbGVtZW50cygpOworICAgIF9maWxsU2FsdEZvclJlc29sdXRpb24oKTsKICAgfQogCi0gIHZvaWQgX2ZpbGxTYWx0TGlua2VkKCkgeworICB2b2lkIF9maWxsU2FsdEZvckVsZW1lbnRzKCkgewogICAgIHZhciBpbmRleCA9IDA7CiAKLSAgICBfbGlua2VkU2FsdFtpbmRleF0gPSBEQVRBX1ZFUlNJT047CisgICAgX3NhbHRGb3JFbGVtZW50c1tpbmRleF0gPSBEQVRBX1ZFUlNJT047CiAgICAgaW5kZXgrKzsKIAotICAgIF9saW5rZWRTYWx0W2luZGV4XSA9IGVuYWJsZUluZGV4ID8gMSA6IDA7Ci0gICAgaW5kZXgrKzsKKyAgICBfc2FsdEZvckVsZW1lbnRzLnNldEFsbChpbmRleCwgX2FuYWx5c2lzT3B0aW9ucy5zaWduYXR1cmVGb3JFbGVtZW50cyk7CisgICAgaW5kZXggKz0gQW5hbHlzaXNPcHRpb25zSW1wbC5zaWduYXR1cmVMZW5ndGg7CiAKLSAgICBfbGlua2VkU2FsdC5zZXRBbGwoaW5kZXgsIF9hbmFseXNpc09wdGlvbnMuc2lnbmF0dXJlKTsKLSAgICBpbmRleCArPSBBbmFseXNpc09wdGlvbnNJbXBsLnVubGlua2VkU2lnbmF0dXJlTGVuZ3RoOwotCi0gICAgX2xpbmtlZFNhbHQuc2V0QWxsKGluZGV4LCBfY29tcHV0ZURlY2xhcmVkVmFyaWFibGVzU2lnbmF0dXJlKCkpOworICAgIF9zYWx0Rm9yUmVzb2x1dGlvbi5zZXRBbGwoaW5kZXgsIF9jb21wdXRlRGVjbGFyZWRWYXJpYWJsZXNTaWduYXR1cmUoKSk7CiAgICAgaW5kZXggKz0gX2RlY2xhcmVkVmFyaWFibGVzU2lnbmF0dXJlTGVuZ3RoOwogICB9CiAKKyAgdm9pZCBfZmlsbFNhbHRGb3JSZXNvbHV0aW9uKCkgeworICAgIHZhciBpbmRleCA9IDA7CisKKyAgICBfc2FsdEZvclJlc29sdXRpb25baW5kZXhdID0gREFUQV9WRVJTSU9OOworICAgIGluZGV4Kys7CisKKyAgICBfc2FsdEZvclJlc29sdXRpb25baW5kZXhdID0gZW5hYmxlSW5kZXggPyAxIDogMDsKKyAgICBpbmRleCsrOworCisgICAgX3NhbHRGb3JSZXNvbHV0aW9uLnNldEFsbChpbmRleCwgX2FuYWx5c2lzT3B0aW9ucy5zaWduYXR1cmUpOworICAgIGluZGV4ICs9IEFuYWx5c2lzT3B0aW9uc0ltcGwuc2lnbmF0dXJlTGVuZ3RoOworCisgICAgX3NhbHRGb3JSZXNvbHV0aW9uLnNldEFsbChpbmRleCwgX2NvbXB1dGVEZWNsYXJlZFZhcmlhYmxlc1NpZ25hdHVyZSgpKTsKKyAgICBpbmRleCArPSBfZGVjbGFyZWRWYXJpYWJsZXNTaWduYXR1cmVMZW5ndGg7CisgIH0KKworICB2b2lkIF9maWxsU2FsdEZvclVubGlua2VkKCkgeworICAgIF9zYWx0Rm9yVW5saW5rZWRbMF0gPSBEQVRBX1ZFUlNJT047CisgICAgX3NhbHRGb3JVbmxpbmtlZFsxXSA9IGVuYWJsZUluZGV4ID8gMSA6IDA7CisgICAgX3NhbHRGb3JVbmxpbmtlZC5zZXRBbGwoMiwgX2FuYWx5c2lzT3B0aW9ucy51bmxpbmtlZFNpZ25hdHVyZSk7CisgIH0KKwogICAvLy8gTG9hZCB0aGUgW0FuYWx5c2lzUmVzdWx0XSBmb3IgdGhlIGdpdmVuIFtmaWxlXSBmcm9tIHRoZSBbYnl0ZXNdLiBTZXQKICAgLy8vIG9wdGlvbmFsIFtjb250ZW50XSBhbmQgW3Jlc29sdmVkVW5pdF0uCiAgIEFuYWx5c2lzUmVzdWx0IF9nZXRBbmFseXNpc1Jlc3VsdEZyb21CeXRlcygKQEAgLTE2MTIsNyArMTYwMyw3IEBACiAgIC8vLyBpbiB0aGUgW2xpYnJhcnldLCBlLmcuIGVsZW1lbnQgbW9kZWwsIGVycm9ycywgaW5kZXgsIGV0Yy4KICAgU3RyaW5nIF9nZXRSZXNvbHZlZFVuaXRTaWduYXR1cmUoRmlsZVN0YXRlIGxpYnJhcnksIEZpbGVTdGF0ZSBmaWxlKSB7CiAgICAgQXBpU2lnbmF0dXJlIHNpZ25hdHVyZSA9IEFwaVNpZ25hdHVyZSgpOwotICAgIHNpZ25hdHVyZS5hZGRVaW50MzJMaXN0KF9saW5rZWRTYWx0KTsKKyAgICBzaWduYXR1cmUuYWRkVWludDMyTGlzdChfc2FsdEZvclJlc29sdXRpb24pOwogICAgIHNpZ25hdHVyZS5hZGRTdHJpbmcobGlicmFyeS50cmFuc2l0aXZlU2lnbmF0dXJlKTsKICAgICBzaWduYXR1cmUuYWRkU3RyaW5nKGZpbGUuY29udGVudEhhc2gpOwogICAgIHJldHVybiBzaWduYXR1cmUudG9IZXgoKTsKQEAgLTE3MjMsMTQgKzE3MTQsNiBAQAogICAgIH0KICAgfQogCi0gIC8vLyBJZiB0aGUgZHJpdmVyIGlzIHVzZWQgaW4gdGhlIHJlYWQtb25seSBtb2RlIHdpdGggaW5maW5pdGUgY2FjaGUsCi0gIC8vLyB3ZSBzaG91bGQgbm90IGFsbG93IGludm9jYXRpb25zIHRoYXQgY2hhbmdlIGZpbGVzLgotICB2b2lkIF90aHJvd0lmQ2hhbmdlc0FyZU5vdEFsbG93ZWQoKSB7Ci0gICAgaWYgKGRpc2FibGVDaGFuZ2VzQW5kQ2FjaGVBbGxSZXN1bHRzKSB7Ci0gICAgICB0aHJvdyBTdGF0ZUVycm9yKCdDaGFuZ2luZyBmaWxlcyBpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBkcml2ZXIuJyk7Ci0gICAgfQotICB9Ci0KICAgLy8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgb25seSBhYnNvbHV0ZSBwYXRocywgdGhpcyBtZXRob2QgaXMgdXNlZCB0byB2YWxpZGF0ZQogICAvLy8gYW55IGlucHV0IHBhdGhzIHRvIHByZXZlbnQgZXJyb3JzIGxhdGVyLgogICB2b2lkIF90aHJvd0lmTm90QWJzb2x1dGVQYXRoKFN0cmluZyBwYXRoKSB7CkBAIC0xOTg5LDYgKzE5NzIsNyBAQAogQHZpc2libGVGb3JUZXN0aW5nCiBjbGFzcyBBbmFseXNpc0RyaXZlclRlc3RWaWV3IHsKICAgZmluYWwgQW5hbHlzaXNEcml2ZXIgZHJpdmVyOworICBmaW5hbCBMaWJyYXJ5Q29udGV4dFRlc3RWaWV3IGxpYnJhcnlDb250ZXh0ID0gTGlicmFyeUNvbnRleHRUZXN0VmlldygpOwogCiAgIGludCBudW1PZkFuYWx5emVkTGlicmFyaWVzID0gMDsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfYmFzZWRfYW5hbHlzaXNfY29udGV4dC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfYmFzZWRfYW5hbHlzaXNfY29udGV4dC5kYXJ0CmluZGV4IDFjYTQ0ZDIuLjU4MmEzNjYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX2Jhc2VkX2FuYWx5c2lzX2NvbnRleHQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlcl9iYXNlZF9hbmFseXNpc19jb250ZXh0LmRhcnQKQEAgLTExLDMyICsxMSwyMyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnIHNob3cgQW5hbHlzaXNPcHRpb25zOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy93b3Jrc3BhY2Uvd29ya3NwYWNlLmRhcnQnOwogCi0vKioKLSAqIEFuIGFuYWx5c2lzIGNvbnRleHQgd2hvc2UgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYW5hbHlzaXMgZHJpdmVyLgotICovCisvLy8gQW4gYW5hbHlzaXMgY29udGV4dCB3aG9zZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbmFseXNpcyBkcml2ZXIuCiBjbGFzcyBEcml2ZXJCYXNlZEFuYWx5c2lzQ29udGV4dCBpbXBsZW1lbnRzIEFuYWx5c2lzQ29udGV4dCB7Ci0gIC8qKgotICAgKiBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLgotICAgKi8KKyAgLy8vIFRoZSByZXNvdXJjZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0uCiAgIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcjsKIAogICBAb3ZlcnJpZGUKICAgZmluYWwgQ29udGV4dFJvb3QgY29udGV4dFJvb3Q7CiAKLSAgLyoqCi0gICAqIFRoZSBkcml2ZXIgb24gd2hpY2ggdGhpcyBjb250ZXh0IGlzIGJhc2VkLgotICAgKi8KKyAgLy8vIFRoZSBkcml2ZXIgb24gd2hpY2ggdGhpcyBjb250ZXh0IGlzIGJhc2VkLgogICBmaW5hbCBBbmFseXNpc0RyaXZlciBkcml2ZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBbV29ya3NwYWNlXSBmb3IgdGhpcyBjb250ZXh0LCBgbnVsbGAgaWYgbm90IHlldCBjcmVhdGVkLgotICAgKi8KKyAgLy8vIFRoZSBbV29ya3NwYWNlXSBmb3IgdGhpcyBjb250ZXh0LCBgbnVsbGAgaWYgbm90IHlldCBjcmVhdGVkLgogICBXb3Jrc3BhY2UgX3dvcmtzcGFjZTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgY29udGV4dCB0aGF0IHVzZXMgdGhlIGdpdmVuIFtyZXNvdXJjZVByb3ZpZGVyXQotICAgKiB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtIGFuZCB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmFseXNpcyBbZHJpdmVyXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHRoYXQgdXNlcyB0aGUgZ2l2ZW4gW3Jlc291cmNlUHJvdmlkZXJdCisgIC8vLyB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtIGFuZCB0aGF0IGlzIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmFseXNpcworICAvLy8gW2RyaXZlcl0uCiAgIERyaXZlckJhc2VkQW5hbHlzaXNDb250ZXh0KAogICAgICAgdGhpcy5yZXNvdXJjZVByb3ZpZGVyLCB0aGlzLmNvbnRleHRSb290LCB0aGlzLmRyaXZlcikgewogICAgIGRyaXZlci5hbmFseXNpc0NvbnRleHQgPSB0aGlzOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50cy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50cy5kYXJ0CmluZGV4IDMyNTNmNGUuLjU1ZDFhMzQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmRhcnQKQEAgLTMzLDcgKzMzLDcgQEAKICAgc3RhdGljIGZpbmFsIFZlcnNpb24gY3VycmVudFZlcnNpb24gPSBWZXJzaW9uLnBhcnNlKF9jdXJyZW50VmVyc2lvbik7CiAKICAgLy8vIEEgbWFwIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGtub3duIGV4cGVyaW1lbnRhbCBmbGFncy4KLSAgc3RhdGljIGNvbnN0IGtub3duRmVhdHVyZXMgPSBfa25vd25GZWF0dXJlczsKKyAgc3RhdGljIGNvbnN0IE1hcDxTdHJpbmcsIEV4cGVyaW1lbnRhbEZlYXR1cmU+IGtub3duRmVhdHVyZXMgPSBfa25vd25GZWF0dXJlczsKIAogICBmaW5hbCBMaXN0PGJvb2w+IF9lbmFibGVGbGFnczsKIApAQCAtNzIsNyArNzIsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgeworICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvdGhlcikgewogICAgIGlmIChvdGhlciBpcyBFeHBlcmltZW50U3RhdHVzKSB7CiAgICAgICBpZiAoX2VuYWJsZUZsYWdzLmxlbmd0aCAhPSBvdGhlci5fZW5hYmxlRmxhZ3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9lbmFibGVGbGFncy5sZW5ndGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50cy5nLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmcuZGFydAppbmRleCBhYWQwMmRmLi45ODY2M2Q5IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmcuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmcuZGFydApAQCAtODUsODMgKzg1LDEwNyBAQAogCiBjbGFzcyBFeHBlcmltZW50YWxGZWF0dXJlcyB7CiAgIHN0YXRpYyBjb25zdCBjb25zdGFudF91cGRhdGVfMjAxOCA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICAwLAotICAgICAgRW5hYmxlU3RyaW5nLmNvbnN0YW50X3VwZGF0ZV8yMDE4LAotICAgICAgSXNFbmFibGVkQnlEZWZhdWx0LmNvbnN0YW50X3VwZGF0ZV8yMDE4LAotICAgICAgSXNFeHBpcmVkLmNvbnN0YW50X3VwZGF0ZV8yMDE4LAotICAgICAgJ0VuaGFuY2VkIGNvbnN0YW50IGV4cHJlc3Npb25zJywKLSAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzIuNC4xJyk7CisgICAgaW5kZXg6IDAsCisgICAgZW5hYmxlU3RyaW5nOiBFbmFibGVTdHJpbmcuY29uc3RhbnRfdXBkYXRlXzIwMTgsCisgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBJc0VuYWJsZWRCeURlZmF1bHQuY29uc3RhbnRfdXBkYXRlXzIwMTgsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQuY29uc3RhbnRfdXBkYXRlXzIwMTgsCisgICAgZG9jdW1lbnRhdGlvbjogJ0VuaGFuY2VkIGNvbnN0YW50IGV4cHJlc3Npb25zJywKKyAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcyLjQuMScsCisgICk7CiAKICAgc3RhdGljIGNvbnN0IGNvbnRyb2xfZmxvd19jb2xsZWN0aW9ucyA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICAxLAotICAgICAgRW5hYmxlU3RyaW5nLmNvbnRyb2xfZmxvd19jb2xsZWN0aW9ucywKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC5jb250cm9sX2Zsb3dfY29sbGVjdGlvbnMsCi0gICAgICBJc0V4cGlyZWQuY29udHJvbF9mbG93X2NvbGxlY3Rpb25zLAotICAgICAgJ0NvbnRyb2wgRmxvdyBDb2xsZWN0aW9ucycsCi0gICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcyLjIuMicpOworICAgIGluZGV4OiAxLAorICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLmNvbnRyb2xfZmxvd19jb2xsZWN0aW9ucywKKyAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC5jb250cm9sX2Zsb3dfY29sbGVjdGlvbnMsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQuY29udHJvbF9mbG93X2NvbGxlY3Rpb25zLAorICAgIGRvY3VtZW50YXRpb246ICdDb250cm9sIEZsb3cgQ29sbGVjdGlvbnMnLAorICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzIuMi4yJywKKyAgKTsKIAogICBzdGF0aWMgY29uc3QgZXh0ZW5zaW9uX21ldGhvZHMgPSBFeHBlcmltZW50YWxGZWF0dXJlKAotICAgICAgMiwKLSAgICAgIEVuYWJsZVN0cmluZy5leHRlbnNpb25fbWV0aG9kcywKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC5leHRlbnNpb25fbWV0aG9kcywKLSAgICAgIElzRXhwaXJlZC5leHRlbnNpb25fbWV0aG9kcywKLSAgICAgICdFeHRlbnNpb24gTWV0aG9kcycsCi0gICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcyLjYuMCcpOworICAgIGluZGV4OiAyLAorICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLmV4dGVuc2lvbl9tZXRob2RzLAorICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogSXNFbmFibGVkQnlEZWZhdWx0LmV4dGVuc2lvbl9tZXRob2RzLAorICAgIGlzRXhwaXJlZDogSXNFeHBpcmVkLmV4dGVuc2lvbl9tZXRob2RzLAorICAgIGRvY3VtZW50YXRpb246ICdFeHRlbnNpb24gTWV0aG9kcycsCisgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMi42LjAnLAorICApOwogCiAgIHN0YXRpYyBjb25zdCBub25fbnVsbGFibGUgPSBFeHBlcmltZW50YWxGZWF0dXJlKAotICAgICAgMywKLSAgICAgIEVuYWJsZVN0cmluZy5ub25fbnVsbGFibGUsCi0gICAgICBJc0VuYWJsZWRCeURlZmF1bHQubm9uX251bGxhYmxlLAotICAgICAgSXNFeHBpcmVkLm5vbl9udWxsYWJsZSwKLSAgICAgICdOb24gTnVsbGFibGUgYnkgZGVmYXVsdCcpOworICAgIGluZGV4OiAzLAorICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLm5vbl9udWxsYWJsZSwKKyAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC5ub25fbnVsbGFibGUsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQubm9uX251bGxhYmxlLAorICAgIGRvY3VtZW50YXRpb246ICdOb24gTnVsbGFibGUgYnkgZGVmYXVsdCcsCisgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICApOwogCiAgIHN0YXRpYyBjb25zdCBub25mdW5jdGlvbl90eXBlX2FsaWFzZXMgPSBFeHBlcmltZW50YWxGZWF0dXJlKAotICAgICAgNCwKLSAgICAgIEVuYWJsZVN0cmluZy5ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMsCi0gICAgICBJc0VuYWJsZWRCeURlZmF1bHQubm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzLAotICAgICAgSXNFeHBpcmVkLm5vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcywKLSAgICAgICdUeXBlIGFsaWFzZXMgZGVmaW5lIGEgPHR5cGU+LCBub3QganVzdCBhIDxmdW5jdGlvblR5cGU+LicpOworICAgIGluZGV4OiA0LAorICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLm5vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcywKKyAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC5ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQubm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzLAorICAgIGRvY3VtZW50YXRpb246ICdUeXBlIGFsaWFzZXMgZGVmaW5lIGEgPHR5cGU+LCBub3QganVzdCBhIDxmdW5jdGlvblR5cGU+JywKKyAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICk7CiAKLSAgc3RhdGljIGNvbnN0IHNldF9saXRlcmFscyA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoNSwgRW5hYmxlU3RyaW5nLnNldF9saXRlcmFscywKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC5zZXRfbGl0ZXJhbHMsIElzRXhwaXJlZC5zZXRfbGl0ZXJhbHMsICdTZXQgTGl0ZXJhbHMnLAotICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMi4yLjAnKTsKKyAgc3RhdGljIGNvbnN0IHNldF9saXRlcmFscyA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgaW5kZXg6IDUsCisgICAgZW5hYmxlU3RyaW5nOiBFbmFibGVTdHJpbmcuc2V0X2xpdGVyYWxzLAorICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogSXNFbmFibGVkQnlEZWZhdWx0LnNldF9saXRlcmFscywKKyAgICBpc0V4cGlyZWQ6IElzRXhwaXJlZC5zZXRfbGl0ZXJhbHMsCisgICAgZG9jdW1lbnRhdGlvbjogJ1NldCBMaXRlcmFscycsCisgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMi4yLjAnLAorICApOwogCiAgIHN0YXRpYyBjb25zdCBzcHJlYWRfY29sbGVjdGlvbnMgPSBFeHBlcmltZW50YWxGZWF0dXJlKAotICAgICAgNiwKLSAgICAgIEVuYWJsZVN0cmluZy5zcHJlYWRfY29sbGVjdGlvbnMsCi0gICAgICBJc0VuYWJsZWRCeURlZmF1bHQuc3ByZWFkX2NvbGxlY3Rpb25zLAotICAgICAgSXNFeHBpcmVkLnNwcmVhZF9jb2xsZWN0aW9ucywKLSAgICAgICdTcHJlYWQgQ29sbGVjdGlvbnMnLAotICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMi4yLjInKTsKKyAgICBpbmRleDogNiwKKyAgICBlbmFibGVTdHJpbmc6IEVuYWJsZVN0cmluZy5zcHJlYWRfY29sbGVjdGlvbnMsCisgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBJc0VuYWJsZWRCeURlZmF1bHQuc3ByZWFkX2NvbGxlY3Rpb25zLAorICAgIGlzRXhwaXJlZDogSXNFeHBpcmVkLnNwcmVhZF9jb2xsZWN0aW9ucywKKyAgICBkb2N1bWVudGF0aW9uOiAnU3ByZWFkIENvbGxlY3Rpb25zJywKKyAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcyLjIuMicsCisgICk7CiAKICAgc3RhdGljIGNvbnN0IHRyaXBsZV9zaGlmdCA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICA3LAotICAgICAgRW5hYmxlU3RyaW5nLnRyaXBsZV9zaGlmdCwKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC50cmlwbGVfc2hpZnQsCi0gICAgICBJc0V4cGlyZWQudHJpcGxlX3NoaWZ0LAotICAgICAgJ1RyaXBsZS1zaGlmdCBvcGVyYXRvcicpOworICAgIGluZGV4OiA3LAorICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLnRyaXBsZV9zaGlmdCwKKyAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC50cmlwbGVfc2hpZnQsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQudHJpcGxlX3NoaWZ0LAorICAgIGRvY3VtZW50YXRpb246ICdUcmlwbGUtc2hpZnQgb3BlcmF0b3InLAorICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgKTsKIAotICBzdGF0aWMgY29uc3QgdmFyaWFuY2UgPSBFeHBlcmltZW50YWxGZWF0dXJlKDgsIEVuYWJsZVN0cmluZy52YXJpYW5jZSwKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC52YXJpYW5jZSwgSXNFeHBpcmVkLnZhcmlhbmNlLCAnU291bmQgdmFyaWFuY2UuJyk7CisgIHN0YXRpYyBjb25zdCB2YXJpYW5jZSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgaW5kZXg6IDgsCisgICAgZW5hYmxlU3RyaW5nOiBFbmFibGVTdHJpbmcudmFyaWFuY2UsCisgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBJc0VuYWJsZWRCeURlZmF1bHQudmFyaWFuY2UsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQudmFyaWFuY2UsCisgICAgZG9jdW1lbnRhdGlvbjogJ1NvdW5kIHZhcmlhbmNlJywKKyAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICk7CiAKICAgQGRlcHJlY2F0ZWQKICAgc3RhdGljIGNvbnN0IGJvZ3VzX2Rpc2FibGVkID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKLSAgICAgIDksCi0gICAgICAvLyBpZ25vcmU6IGRlcHJlY2F0ZWRfbWVtYmVyX3VzZV9mcm9tX3NhbWVfcGFja2FnZQotICAgICAgRW5hYmxlU3RyaW5nLmJvZ3VzX2Rpc2FibGVkLAotICAgICAgSXNFbmFibGVkQnlEZWZhdWx0LmJvZ3VzX2Rpc2FibGVkLAotICAgICAgSXNFeHBpcmVkLmJvZ3VzX2Rpc2FibGVkLAotICAgICAgbnVsbCk7CisgICAgaW5kZXg6IDksCisgICAgLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKKyAgICBlbmFibGVTdHJpbmc6IEVuYWJsZVN0cmluZy5ib2d1c19kaXNhYmxlZCwKKyAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC5ib2d1c19kaXNhYmxlZCwKKyAgICBpc0V4cGlyZWQ6IElzRXhwaXJlZC5ib2d1c19kaXNhYmxlZCwKKyAgICBkb2N1bWVudGF0aW9uOiBudWxsLAorICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgKTsKIAogICBAZGVwcmVjYXRlZAogICBzdGF0aWMgY29uc3QgYm9ndXNfZW5hYmxlZCA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICAxMCwKLSAgICAgIC8vIGlnbm9yZTogZGVwcmVjYXRlZF9tZW1iZXJfdXNlX2Zyb21fc2FtZV9wYWNrYWdlCi0gICAgICBFbmFibGVTdHJpbmcuYm9ndXNfZW5hYmxlZCwKLSAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC5ib2d1c19lbmFibGVkLAotICAgICAgSXNFeHBpcmVkLmJvZ3VzX2VuYWJsZWQsCi0gICAgICBudWxsLAotICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnKTsKKyAgICBpbmRleDogMTAsCisgICAgLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKKyAgICBlbmFibGVTdHJpbmc6IEVuYWJsZVN0cmluZy5ib2d1c19lbmFibGVkLAorICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogSXNFbmFibGVkQnlEZWZhdWx0LmJvZ3VzX2VuYWJsZWQsCisgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQuYm9ndXNfZW5hYmxlZCwKKyAgICBkb2N1bWVudGF0aW9uOiBudWxsLAorICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJywKKyAgKTsKIH0KIAogLy8vIENvbnN0YW50IGJvb2xzIGluZGljYXRpbmcgd2hldGhlciBlYWNoIGV4cGVyaW1lbnRhbCBmbGFnIGlzIGN1cnJlbnRseQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50c19pbXBsLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzX2ltcGwuZGFydAppbmRleCBjYTViOTkzLi43YjMyZTQwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzX2ltcGwuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzX2ltcGwuZGFydApAQCAtMTIsNiArMTIsOSBAQAogTWFwPFN0cmluZywgRXhwZXJpbWVudGFsRmVhdHVyZT4gX2tub3duRmVhdHVyZXMgPQogICAgIEV4cGVyaW1lbnRTdGF0dXMua25vd25GZWF0dXJlczsKIAorLy8vIFRoaXMgZmxhZyBpcyBgdHJ1ZWAgd2hpbGUgW292ZXJyaWRlS25vd25GZWF0dXJlc0FzeW5jXSBpcyBleGVjdXRpbmcuCitib29sIF9vdmVycmlkZUtub3duRmVhdHVyZXNBc3luY0V4ZWN1dGluZyA9IGZhbHNlOworCiAvLy8gRGVjb2RlcyB0aGUgc3RyaW5ncyBnaXZlbiBpbiBbZmxhZ3NdIGludG8gYSBsaXN0IG9mIGJvb2xlYW5zIHJlcHJlc2VudGluZwogLy8vIGV4cGVyaW1lbnRzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQuCiAvLy8KQEAgLTc2LDEwICs3OSwxMiBAQAogLy8vCiAvLy8gSXQgaXNuJ3Qgc2FmZSB0byBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBiZWNhdXNlIGl0CiAvLy8gb25seSBjaGFuZ2VzIHRoZSBzZXQgb2Yga25vd24gZmVhdHVyZXMgZHVyaW5nIHRoZSB0aW1lIHRoYXQgW2NhbGxiYWNrXSBpcwotLy8vIChzeW5jaHJvbm91c2x5KSBleGVjdXRpbmcuCisvLy8gKHN5bmNocm9ub3VzbHkpIGV4ZWN1dGluZy4gVXNlIFtvdmVycmlkZUtub3duRmVhdHVyZXNBc3luY10gaW5zdGVhZC4KIEB2aXNpYmxlRm9yVGVzdGluZwogVCBvdmVycmlkZUtub3duRmVhdHVyZXM8VD4oCi0gICAgTWFwPFN0cmluZywgRXhwZXJpbWVudGFsRmVhdHVyZT4ga25vd25GZWF0dXJlcywgVCBGdW5jdGlvbigpIGNhbGxiYWNrKSB7CisgIE1hcDxTdHJpbmcsIEV4cGVyaW1lbnRhbEZlYXR1cmU+IGtub3duRmVhdHVyZXMsCisgIFQgRnVuY3Rpb24oKSBjYWxsYmFjaywKKykgewogICB2YXIgb2xkS25vd25GZWF0dXJlcyA9IF9rbm93bkZlYXR1cmVzOwogICB0cnkgewogICAgIF9rbm93bkZlYXR1cmVzID0ga25vd25GZWF0dXJlczsKQEAgLTg5LDYgKzk0LDMwIEBACiAgIH0KIH0KIAorLy8vIEV4ZWN1dGUgdGhlIGNhbGxiYWNrLCBwcmV0ZW5kaW5nIHRoYXQgdGhlIGdpdmVuIFtrbm93bkZlYXR1cmVzXSB0YWtlIHRoZQorLy8vIHBsYWNlIG9mIFtFeHBlcmltZW50U3RhdHVzLmtub3duRmVhdHVyZXNdLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgaW52b2tlZCBiZWZvcmUgaXRzIHByZXZpb3VzIGludm9jYXRpb24gY29tcGxldGVzLgorQHZpc2libGVGb3JUZXN0aW5nCitGdXR1cmU8VD4gb3ZlcnJpZGVLbm93bkZlYXR1cmVzQXN5bmM8VD4oCisgIE1hcDxTdHJpbmcsIEV4cGVyaW1lbnRhbEZlYXR1cmU+IGtub3duRmVhdHVyZXMsCisgIEZ1dHVyZTxUPiBGdW5jdGlvbigpIGNhbGxiYWNrLAorKSBhc3luYyB7CisgIGlmIChfb3ZlcnJpZGVLbm93bkZlYXR1cmVzQXN5bmNFeGVjdXRpbmcpIHsKKyAgICB0aHJvdyBTdGF0ZUVycm9yKCdvdmVycmlkZUtub3duRmVhdHVyZXNBc3luYyBpcyBub3QgcmVlbnRyYW50Jyk7CisgIH0KKworICBfb3ZlcnJpZGVLbm93bkZlYXR1cmVzQXN5bmNFeGVjdXRpbmcgPSB0cnVlOworICB2YXIgb2xkS25vd25GZWF0dXJlcyA9IF9rbm93bkZlYXR1cmVzOworICB0cnkgeworICAgIF9rbm93bkZlYXR1cmVzID0ga25vd25GZWF0dXJlczsKKyAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKTsKKyAgfSBmaW5hbGx5IHsKKyAgICBfa25vd25GZWF0dXJlcyA9IG9sZEtub3duRmVhdHVyZXM7CisgICAgX292ZXJyaWRlS25vd25GZWF0dXJlc0FzeW5jRXhlY3V0aW5nID0gZmFsc2U7CisgIH0KK30KKwogLy8vIENvbXB1dGVzIGEgbmV3IHNldCBvZiBlbmFibGUgZmxhZ3MgYmFzZWQgb24gW2ZsYWdzXSwgYnV0IHdpdGggYW55IGZlYXR1cmVzCiAvLy8gdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGxhbmd1YWdlIFt2ZXJzaW9uXSBzZXQgdG8gYGZhbHNlYC4KIExpc3Q8Ym9vbD4gcmVzdHJpY3RFbmFibGVGbGFnc1RvVmVyc2lvbihMaXN0PGJvb2w+IGZsYWdzLCBWZXJzaW9uIHZlcnNpb24pIHsKQEAgLTI3MiwxMCArMzAxLDE0IEBACiAKICAgZmluYWwgU3RyaW5nIF9maXJzdFN1cHBvcnRlZFZlcnNpb247CiAKLSAgY29uc3QgRXhwZXJpbWVudGFsRmVhdHVyZSh0aGlzLmluZGV4LCB0aGlzLmVuYWJsZVN0cmluZywKLSAgICAgIHRoaXMuaXNFbmFibGVkQnlEZWZhdWx0LCB0aGlzLmlzRXhwaXJlZCwgdGhpcy5kb2N1bWVudGF0aW9uLAotICAgICAge1N0cmluZyBmaXJzdFN1cHBvcnRlZFZlcnNpb259KQotICAgICAgOiBfZmlyc3RTdXBwb3J0ZWRWZXJzaW9uID0gZmlyc3RTdXBwb3J0ZWRWZXJzaW9uLAorICBjb25zdCBFeHBlcmltZW50YWxGZWF0dXJlKHsKKyAgICBAcmVxdWlyZWQgdGhpcy5pbmRleCwKKyAgICBAcmVxdWlyZWQgdGhpcy5lbmFibGVTdHJpbmcsCisgICAgQHJlcXVpcmVkIHRoaXMuaXNFbmFibGVkQnlEZWZhdWx0LAorICAgIEByZXF1aXJlZCB0aGlzLmlzRXhwaXJlZCwKKyAgICBAcmVxdWlyZWQgdGhpcy5kb2N1bWVudGF0aW9uLAorICAgIEByZXF1aXJlZCBTdHJpbmcgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uLAorICB9KSAgOiBfZmlyc3RTdXBwb3J0ZWRWZXJzaW9uID0gZmlyc3RTdXBwb3J0ZWRWZXJzaW9uLAogICAgICAgICBhc3NlcnQoaW5kZXggIT0gbnVsbCksCiAgICAgICAgIGFzc2VydChpc0VuYWJsZWRCeURlZmF1bHQKICAgICAgICAgICAgID8gZmlyc3RTdXBwb3J0ZWRWZXJzaW9uICE9IG51bGwKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV9ieXRlX3N0b3JlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2ZpbGVfYnl0ZV9zdG9yZS5kYXJ0CmluZGV4IGE1NjUyZWMuLmI5M2E2YzggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV9ieXRlX3N0b3JlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9maWxlX2J5dGVfc3RvcmUuZGFydApAQCAtMTIsOSArMTIsNyBAQAogaW1wb3J0ICdieXRlX3N0b3JlLmRhcnQnOwogaW1wb3J0ICdmbGV0Y2hlcjE2LmRhcnQnOwogCi0vKioKLSAqIFRoZSByZXF1ZXN0IHRoYXQgaXMgc2VudCBmcm9tIHRoZSBtYWluIGlzb2xhdGUgdG8gdGhlIGNsZWFuLXVwIGlzb2xhdGUuCi0gKi8KKy8vLyBUaGUgcmVxdWVzdCB0aGF0IGlzIHNlbnQgZnJvbSB0aGUgbWFpbiBpc29sYXRlIHRvIHRoZSBjbGVhbi11cCBpc29sYXRlLgogY2xhc3MgQ2FjaGVDbGVhblVwUmVxdWVzdCB7CiAgIGZpbmFsIFN0cmluZyBjYWNoZVBhdGg7CiAgIGZpbmFsIGludCBtYXhTaXplQnl0ZXM7CkBAIC0yMywxMyArMjEsMTEgQEAKICAgQ2FjaGVDbGVhblVwUmVxdWVzdCh0aGlzLmNhY2hlUGF0aCwgdGhpcy5tYXhTaXplQnl0ZXMsIHRoaXMucmVwbHlUbyk7CiB9CiAKLS8qKgotICogW0J5dGVTdG9yZV0gdGhhdCBzdG9yZXMgdmFsdWVzIGFzIGZpbGVzIGFuZCBwZXJmb3JtcyBjYWNoZSBldmljdGlvbi4KLSAqCi0gKiBPbmx5IHRoZSBwcm9jZXNzIHRoYXQgbWFuYWdlcyB0aGUgY2FjaGUsIGUuZy4gQW5hbHlzaXMgU2VydmVyLCBzaG91bGQgdXNlCi0gKiB0aGlzIGNsYXNzLiBPdGhlciBwcm9jZXNzZXMsIGUuZy4gQW5hbHlzaXMgU2VydmVyIHBsdWdpbnMsIHNob3VsZCB1c2UKLSAqIFtGaWxlQnl0ZVN0b3JlXSBpbnN0ZWFkIGFuZCBsZXQgdGhlIG1haW4gcHJvY2VzcyB0byBwZXJmb3JtIGV2aWN0aW9uLgotICovCisvLy8gW0J5dGVTdG9yZV0gdGhhdCBzdG9yZXMgdmFsdWVzIGFzIGZpbGVzIGFuZCBwZXJmb3JtcyBjYWNoZSBldmljdGlvbi4KKy8vLworLy8vIE9ubHkgdGhlIHByb2Nlc3MgdGhhdCBtYW5hZ2VzIHRoZSBjYWNoZSwgZS5nLiBBbmFseXNpcyBTZXJ2ZXIsIHNob3VsZCB1c2UKKy8vLyB0aGlzIGNsYXNzLiBPdGhlciBwcm9jZXNzZXMsIGUuZy4gQW5hbHlzaXMgU2VydmVyIHBsdWdpbnMsIHNob3VsZCB1c2UKKy8vLyBbRmlsZUJ5dGVTdG9yZV0gaW5zdGVhZCBhbmQgbGV0IHRoZSBtYWluIHByb2Nlc3MgdG8gcGVyZm9ybSBldmljdGlvbi4KIGNsYXNzIEV2aWN0aW5nRmlsZUJ5dGVTdG9yZSBpbXBsZW1lbnRzIEJ5dGVTdG9yZSB7CiAgIHN0YXRpYyBib29sIF9jbGVhblVwU2VuZFBvcnRTaG91bGRCZVByZXBhcmVkID0gdHJ1ZTsKICAgc3RhdGljIFNlbmRQb3J0IF9jbGVhblVwU2VuZFBvcnQ7CkBAIC01OSw5ICs1NSw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIElmIHRoZSBjYWNoZSBjbGVhbiB1cCBwcm9jZXNzIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQgeWV0LCByZXF1ZXN0IGl0LgotICAgKi8KKyAgLy8vIElmIHRoZSBjYWNoZSBjbGVhbiB1cCBwcm9jZXNzIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQgeWV0LCByZXF1ZXN0IGl0LgogICBGdXR1cmU8dm9pZD4gX3JlcXVlc3RDYWNoZUNsZWFuVXAoKSBhc3luYyB7CiAgICAgaWYgKF9jbGVhblVwU2VuZFBvcnRTaG91bGRCZVByZXBhcmVkKSB7CiAgICAgICBfY2xlYW5VcFNlbmRQb3J0U2hvdWxkQmVQcmVwYXJlZCA9IGZhbHNlOwpAQCAtODgsMTAgKzgyLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyBzdGFydGVkIGluIGEgbmV3IGlzb2xhdGUsIHJlY2VpdmVzIGNhY2hlIGZvbGRlciBjbGVhbiB1cAotICAgKiByZXF1ZXN0cyBhbmQgZXZpY3RzIG9sZGVyIGZpbGVzIGZyb20gdGhlIGZvbGRlci4KLSAgICovCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHN0YXJ0ZWQgaW4gYSBuZXcgaXNvbGF0ZSwgcmVjZWl2ZXMgY2FjaGUgZm9sZGVyIGNsZWFuIHVwCisgIC8vLyByZXF1ZXN0cyBhbmQgZXZpY3RzIG9sZGVyIGZpbGVzIGZyb20gdGhlIGZvbGRlci4KICAgc3RhdGljIHZvaWQgX2NhY2hlQ2xlYW5VcEZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICBTZW5kUG9ydCBpbml0aWFsUmVwbHlUbyA9IG1lc3NhZ2U7CiAgICAgUmVjZWl2ZVBvcnQgcG9ydCA9IFJlY2VpdmVQb3J0KCk7CkBAIC0xNDksOSArMTQxLDcgQEAKICAgfQogfQogCi0vKioKLSAqIFtCeXRlU3RvcmVdIHRoYXQgc3RvcmVzIHZhbHVlcyBhcyBmaWxlcy4KLSAqLworLy8vIFtCeXRlU3RvcmVdIHRoYXQgc3RvcmVzIHZhbHVlcyBhcyBmaWxlcy4KIGNsYXNzIEZpbGVCeXRlU3RvcmUgaW1wbGVtZW50cyBCeXRlU3RvcmUgewogICBzdGF0aWMgZmluYWwgRmlsZUJ5dGVTdG9yZVZhbGlkYXRvciBfdmFsaWRhdG9yID0gRmlsZUJ5dGVTdG9yZVZhbGlkYXRvcigpOwogICBzdGF0aWMgZmluYWwgX2RvdENvZGVVbml0ID0gJy4nLmNvZGVVbml0QXQoMCk7CkBAIC0xNjEsMTAgKzE1MSw4IEBACiAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8aW50Pj4gX3dyaXRlSW5Qcm9ncmVzcyA9IHt9OwogICBmaW5hbCBGdXR1cmVQb29sIF9wb29sID0gRnV0dXJlUG9vbCgyMCk7CiAKLSAgLyoqCi0gICAqIElmIHRoZSBzYW1lIGNhY2hlIHBhdGggaXMgdXNlZCBmcm9tIG1vcmUgdGhhbiBvbmUgaXNvbGF0ZSBvZiB0aGUgc2FtZQotICAgKiBwcm9jZXNzLCB0aGVuIGEgdW5pcXVlIFt0ZW1wTmFtZVN1ZmZpeF0gbXVzdCBiZSBwcm92aWRlZCBmb3IgZWFjaCBpc29sYXRlLgotICAgKi8KKyAgLy8vIElmIHRoZSBzYW1lIGNhY2hlIHBhdGggaXMgdXNlZCBmcm9tIG1vcmUgdGhhbiBvbmUgaXNvbGF0ZSBvZiB0aGUgc2FtZQorICAvLy8gcHJvY2VzcywgdGhlbiBhIHVuaXF1ZSBbdGVtcE5hbWVTdWZmaXhdIG11c3QgYmUgcHJvdmlkZWQgZm9yIGVhY2ggaXNvbGF0ZS4KICAgRmlsZUJ5dGVTdG9yZSh0aGlzLl9jYWNoZVBhdGgsIHtTdHJpbmcgdGVtcE5hbWVTdWZmaXggPSAnJ30pCiAgICAgICA6IF90ZW1wU3VmZml4ID0KICAgICAgICAgICAgICctdGVtcC0kcGlkJHt0ZW1wTmFtZVN1ZmZpeC5pc0VtcHR5ID8gJycgOiAnLSR0ZW1wTmFtZVN1ZmZpeCd9JzsKQEAgLTIyOSwyMSArMjE3LDE3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBHZW5lcmFsbHkgc3BlYWtpbmcsIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBhbnkgZGF0YSB3cml0dGVuIGludG8gYSBmaWxlCi0gKiB3aWxsIHN0YXkgdGhlIHNhbWUgLSB0aGVyZSBpcyBhbHdheXMgYSBjaGFuY2Ugb2YgYSBoYXJkd2FyZSBwcm9ibGVtLCBmaWxlCi0gKiBzeXN0ZW0gcHJvYmxlbSwgdHJ1bmNhdGVkIGRhdGEsIGV0Yy4KLSAqCi0gKiBTbywgd2UgbmVlZCB0byBlbWJlZCBzb21lIHZhbGlkYXRpb24gaW50byBkYXRhIGl0c2VsZi4gVGhpcyBjbGFzcyBhcHBlbmQgdGhlCi0gKiB2ZXJzaW9uIGFuZCB0aGUgY2hlY2tzdW0gdG8gZGF0YS4KLSAqLworLy8vIEdlbmVyYWxseSBzcGVha2luZywgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGFueSBkYXRhIHdyaXR0ZW4gaW50byBhIGZpbGUKKy8vLyB3aWxsIHN0YXkgdGhlIHNhbWUgLSB0aGVyZSBpcyBhbHdheXMgYSBjaGFuY2Ugb2YgYSBoYXJkd2FyZSBwcm9ibGVtLCBmaWxlCisvLy8gc3lzdGVtIHByb2JsZW0sIHRydW5jYXRlZCBkYXRhLCBldGMuCisvLy8KKy8vLyBTbywgd2UgbmVlZCB0byBlbWJlZCBzb21lIHZhbGlkYXRpb24gaW50byBkYXRhIGl0c2VsZi4gVGhpcyBjbGFzcyBhcHBlbmQgdGhlCisvLy8gdmVyc2lvbiBhbmQgdGhlIGNoZWNrc3VtIHRvIGRhdGEuCiBjbGFzcyBGaWxlQnl0ZVN0b3JlVmFsaWRhdG9yIHsKICAgc3RhdGljIGNvbnN0IExpc3Q8aW50PiBfVkVSU0lPTiA9IFsweDAxLCAweDAwXTsKIAotICAvKioKLSAgICogSWYgdGhlIFtyYXdCeXRlc10gaGF2ZSB0aGUgdmFsaWQgdmVyc2lvbiBhbmQgY2hlY2tzdW0sIGV4dHJhY3QgYW5kCi0gICAqIHJldHVybiB0aGUgZGF0YSBmcm9tIGl0LiBPdGhlcndpc2UgcmV0dXJuIGBudWxsYC4KLSAgICovCisgIC8vLyBJZiB0aGUgW3Jhd0J5dGVzXSBoYXZlIHRoZSB2YWxpZCB2ZXJzaW9uIGFuZCBjaGVja3N1bSwgZXh0cmFjdCBhbmQKKyAgLy8vIHJldHVybiB0aGUgZGF0YSBmcm9tIGl0LiBPdGhlcndpc2UgcmV0dXJuIGBudWxsYC4KICAgTGlzdDxpbnQ+IGdldERhdGEoTGlzdDxpbnQ+IHJhd0J5dGVzKSB7CiAgICAgLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmVyc2lvbiBhbmQgdGhlIGNoZWNrc3VtIGluIHRoZSByYXcgYnl0ZXMuCiAgICAgaWYgKHJhd0J5dGVzLmxlbmd0aCA8IDQpIHsKQEAgLTI2OCwxMCArMjUyLDggQEAKICAgICByZXR1cm4gZGF0YTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYnl0ZXMgdGhhdCBpbmNsdWRlIHRoZSBnaXZlbiBbZGF0YV0gcGx1cyB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZAotICAgKiB0aGUgY2hlY2tzdW0gb2YgdGhlIFtkYXRhXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYnl0ZXMgdGhhdCBpbmNsdWRlIHRoZSBnaXZlbiBbZGF0YV0gcGx1cyB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZAorICAvLy8gdGhlIGNoZWNrc3VtIG9mIHRoZSBbZGF0YV0uCiAgIExpc3Q8aW50PiB3cmFwRGF0YShMaXN0PGludD4gZGF0YSkgewogICAgIGludCBsZW4gPSBkYXRhLmxlbmd0aDsKICAgICB2YXIgYnl0ZXMgPSBVaW50OExpc3QobGVuICsgNCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2ZpbGVfc3RhdGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV9zdGF0ZS5kYXJ0CmluZGV4IDBlMDBiNjMuLjhkNDdlMTQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV9zdGF0ZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV9zdGF0ZS5kYXJ0CkBAIC00NywzMCArNDcsMjIgQEAKIHZhciBjb3VudGVyVW5saW5rZWRMaW5rZWRCeXRlcyA9IDA7CiB2YXIgdGltZXJGaWxlU3RhdGVSZWZyZXNoID0gU3RvcHdhdGNoKCk7CiAKLS8qKgotICogW0ZpbGVDb250ZW50T3ZlcmxheV0gaXMgdXNlZCB0byB0ZW1wb3Jhcnkgb3ZlcnJpZGUgY29udGVudCBvZiBmaWxlcy4KLSAqLworLy8vIFtGaWxlQ29udGVudE92ZXJsYXldIGlzIHVzZWQgdG8gdGVtcG9yYXJ5IG92ZXJyaWRlIGNvbnRlbnQgb2YgZmlsZXMuCiBjbGFzcyBGaWxlQ29udGVudE92ZXJsYXkgewogICBmaW5hbCBfbWFwID0gPFN0cmluZywgU3RyaW5nPnt9OwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBhdGhzIGN1cnJlbnRseSBiZWluZyBvdmVycmlkZGVuLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgcGF0aHMgY3VycmVudGx5IGJlaW5nIG92ZXJyaWRkZW4uCiAgIEl0ZXJhYmxlPFN0cmluZz4gZ2V0IHBhdGhzID0+IF9tYXAua2V5czsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFtwYXRoXSwgb3IgYG51bGxgIHRoZQotICAgKiBvdmVybGF5IGRvZXMgbm90IG92ZXJyaWRlIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlLgotICAgKgotICAgKiBUaGUgW3BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFtwYXRoXSwgb3IgYG51bGxgIHRoZQorICAvLy8gb3ZlcmxheSBkb2VzIG5vdCBvdmVycmlkZSB0aGUgY29udGVudCBvZiB0aGUgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGUgW3BhdGhdIG11c3QgYmUgYWJzb2x1dGUgYW5kIG5vcm1hbGl6ZWQuCiAgIFN0cmluZyBvcGVyYXRvciBbXShTdHJpbmcgcGF0aCkgPT4gX21hcFtwYXRoXTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBuZXcgW2NvbnRlbnRdIG9mIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFtwYXRoXS4KLSAgICoKLSAgICogVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbmV3IFtjb250ZW50XSBvZiB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0uCisgIC8vLworICAvLy8gVGhlIFtwYXRoXSBtdXN0IGJlIGFic29sdXRlIGFuZCBub3JtYWxpemVkLgogICB2b2lkIG9wZXJhdG9yIFtdPShTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnQpIHsKICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7CiAgICAgICBfbWFwLnJlbW92ZShwYXRoKTsKQEAgLTgwLDU2ICs3Miw0MiBAQAogICB9CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGJlaW5nIGFuYWx5emVkLCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkuCi0gKgotICogSXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IHZpZXcgb24gaXRzIHByb3BlcnRpZXMuCi0gKgotICogVGhlIHByb3BlcnRpZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHJlcHJlc2VudCB0aGUgbW9zdCByZWNlbnQgc3RhdGUKLSAqIG9mIHRoZSBmaWxlIHN5c3RlbS4gVG8gdXBkYXRlIHRoZSBmaWxlIHRvIHRoZSBtb3N0IHJlY2VudCBzdGF0ZSwgW3JlZnJlc2hdCi0gKiBzaG91bGQgYmUgY2FsbGVkLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGJlaW5nIGFuYWx5emVkLCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkuCisvLy8KKy8vLyBJdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgdmlldyBvbiBpdHMgcHJvcGVydGllcy4KKy8vLworLy8vIFRoZSBwcm9wZXJ0aWVzIGFyZSBub3QgZ3VhcmFudGVlZCB0byByZXByZXNlbnQgdGhlIG1vc3QgcmVjZW50IHN0YXRlCisvLy8gb2YgdGhlIGZpbGUgc3lzdGVtLiBUbyB1cGRhdGUgdGhlIGZpbGUgdG8gdGhlIG1vc3QgcmVjZW50IHN0YXRlLCBbcmVmcmVzaF0KKy8vLyBzaG91bGQgYmUgY2FsbGVkLgogY2xhc3MgRmlsZVN0YXRlIHsKICAgZmluYWwgRmlsZVN5c3RlbVN0YXRlIF9mc1N0YXRlOwogCi0gIC8qKgotICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KLSAgICovCisgIC8vLyBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgZmluYWwgU3RyaW5nIHBhdGg7CiAKLSAgLyoqCi0gICAqIFRoZSBhYnNvbHV0ZSBVUkkgb2YgdGhlIGZpbGUuCi0gICAqLworICAvLy8gVGhlIGFic29sdXRlIFVSSSBvZiB0aGUgZmlsZS4KICAgZmluYWwgVXJpIHVyaTsKIAotICAvKioKLSAgICogVGhlIFtTb3VyY2VdIG9mIHRoZSBmaWxlIHdpdGggdGhlIFt1cmldLgotICAgKi8KKyAgLy8vIFRoZSBbU291cmNlXSBvZiB0aGUgZmlsZSB3aXRoIHRoZSBbdXJpXS4KICAgZmluYWwgU291cmNlIHNvdXJjZTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIGZpbGUgaXMgYSBzdHViIGNyZWF0ZWQgZm9yIGEgZmlsZSBpbiB0aGUgcHJvdmlkZWQKLSAgICogZXh0ZXJuYWwgc3VtbWFyeSBzdG9yZS4gVGhlIHZhbHVlcyBvZiBtb3N0IHByb3BlcnRpZXMgYXJlIG5vdCB0aGUgc2FtZQotICAgKiBhcyB0aGV5IHdvdWxkIGJlIGlmIHRoZSBmaWxlIHdlcmUgYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLSAgICogVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBbdXJpXSBpcyBjb3JyZWN0LgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBmaWxlIGlzIGEgc3R1YiBjcmVhdGVkIGZvciBhIGZpbGUgaW4gdGhlIHByb3ZpZGVkCisgIC8vLyBleHRlcm5hbCBzdW1tYXJ5IHN0b3JlLiBUaGUgdmFsdWVzIG9mIG1vc3QgcHJvcGVydGllcyBhcmUgbm90IHRoZSBzYW1lCisgIC8vLyBhcyB0aGV5IHdvdWxkIGJlIGlmIHRoZSBmaWxlIHdlcmUgYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KKyAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgW3VyaV0gaXMgY29ycmVjdC4KICAgZmluYWwgYm9vbCBpc0luRXh0ZXJuYWxTdW1tYXJpZXM7CiAKLSAgLyoqCi0gICAqIFRoZSBbRmVhdHVyZVNldF0gZm9yIGFsbCBmaWxlcyBpbiB0aGUgYW5hbHlzaXMgY29udGV4dC4KLSAgICoKLSAgICogVXN1YWxseSBpdCBpcyB0aGUgZmVhdHVyZSBzZXQgb2YgdGhlIGxhdGVzdCBsYW5ndWFnZSB2ZXJzaW9uLCBwbHVzCi0gICAqIHBvc3NpYmx5IGFkZGl0aW9uYWwgZW5hYmxlZCBleHBlcmltZW50cyAoZnJvbSB0aGUgYW5hbHlzaXMgb3B0aW9ucyBmaWxlLAotICAgKiBvciBmcm9tIFNESyBhbGxvd2VkIGV4cGVyaW1lbnRzKS4KLSAgICoKLSAgICogVGhpcyBmZWF0dXJlIHNldCBpcyB0aGVuIHJlc3RyaWN0ZWQsIHdpdGggdGhlIFtfcGFja2FnZUxhbmd1YWdlVmVyc2lvbl0sCi0gICAqIG9yIHdpdGggYSBgQGRhcnRgIGxhbmd1YWdlIG92ZXJyaWRlIHRva2VuIGluIHRoZSBmaWxlIGhlYWRlci4KLSAgICovCisgIC8vLyBUaGUgW0ZlYXR1cmVTZXRdIGZvciBhbGwgZmlsZXMgaW4gdGhlIGFuYWx5c2lzIGNvbnRleHQuCisgIC8vLworICAvLy8gVXN1YWxseSBpdCBpcyB0aGUgZmVhdHVyZSBzZXQgb2YgdGhlIGxhdGVzdCBsYW5ndWFnZSB2ZXJzaW9uLCBwbHVzCisgIC8vLyBwb3NzaWJseSBhZGRpdGlvbmFsIGVuYWJsZWQgZXhwZXJpbWVudHMgKGZyb20gdGhlIGFuYWx5c2lzIG9wdGlvbnMgZmlsZSwKKyAgLy8vIG9yIGZyb20gU0RLIGFsbG93ZWQgZXhwZXJpbWVudHMpLgorICAvLy8KKyAgLy8vIFRoaXMgZmVhdHVyZSBzZXQgaXMgdGhlbiByZXN0cmljdGVkLCB3aXRoIHRoZSBbX3BhY2thZ2VMYW5ndWFnZVZlcnNpb25dLAorICAvLy8gb3Igd2l0aCBhIGBAZGFydGAgbGFuZ3VhZ2Ugb3ZlcnJpZGUgdG9rZW4gaW4gdGhlIGZpbGUgaGVhZGVyLgogICBmaW5hbCBGZWF0dXJlU2V0IF9jb250ZXh0RmVhdHVyZVNldDsKIAotICAvKioKLSAgICogVGhlIGxhbmd1YWdlIHZlcnNpb24gZm9yIHRoZSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhpcyBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBsYW5ndWFnZSB2ZXJzaW9uIGZvciB0aGUgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmlsZS4KICAgZmluYWwgVmVyc2lvbiBfcGFja2FnZUxhbmd1YWdlVmVyc2lvbjsKIAogICBib29sIF9leGlzdHM7CkBAIC0xNTcsMTAgKzEzNSw4IEBACiAgIFN0cmluZyBfdHJhbnNpdGl2ZVNpZ25hdHVyZTsKICAgU3RyaW5nIF90cmFuc2l0aXZlU2lnbmF0dXJlTGlua2VkOwogCi0gIC8qKgotICAgKiBUaGUgZmxhZyB0aGF0IHNob3dzIHdoZXRoZXIgdGhlIGZpbGUgaGFzIGFuIGVycm9yIG9yIHdhcm5pbmcgdGhhdAotICAgKiBtaWdodCBiZSBmaXhlZCBieSBhIGNoYW5nZSB0byBhbm90aGVyIGZpbGUuCi0gICAqLworICAvLy8gVGhlIGZsYWcgdGhhdCBzaG93cyB3aGV0aGVyIHRoZSBmaWxlIGhhcyBhbiBlcnJvciBvciB3YXJuaW5nIHRoYXQKKyAgLy8vIG1pZ2h0IGJlIGZpeGVkIGJ5IGEgY2hhbmdlIHRvIGFub3RoZXIgZmlsZS4KICAgYm9vbCBoYXNFcnJvck9yV2FybmluZyA9IGZhbHNlOwogCiAgIEZpbGVTdGF0ZS5fKApAQCAtMTgzLDgxICsxNTksNTggQEAKICAgICBfbGlicmFyeUN5Y2xlID0gTGlicmFyeUN5Y2xlLmV4dGVybmFsKCk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIHVubGlua2VkIEFQSSBzaWduYXR1cmUgb2YgdGhlIGZpbGUuCi0gICAqLworICAvLy8gVGhlIHVubGlua2VkIEFQSSBzaWduYXR1cmUgb2YgdGhlIGZpbGUuCiAgIExpc3Q8aW50PiBnZXQgYXBpU2lnbmF0dXJlID0+IF9hcGlTaWduYXR1cmU7CiAKLSAgLyoqCi0gICAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLgogICBTdHJpbmcgZ2V0IGNvbnRlbnQgPT4gX2NvbnRlbnQ7CiAKLSAgLyoqCi0gICAqIFRoZSBNRDUgaGFzaCBvZiB0aGUgW2NvbnRlbnRdLgotICAgKi8KKyAgLy8vIFRoZSBNRDUgaGFzaCBvZiB0aGUgW2NvbnRlbnRdLgogICBTdHJpbmcgZ2V0IGNvbnRlbnRIYXNoID0+IF9jb250ZW50SGFzaDsKIAotICAvKioKLSAgICogVGhlIGNsYXNzIG1lbWJlciBuYW1lcyBkZWZpbmVkIGJ5IHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBjbGFzcyBtZW1iZXIgbmFtZXMgZGVmaW5lZCBieSB0aGUgZmlsZS4KICAgU2V0PFN0cmluZz4gZ2V0IGRlZmluZWRDbGFzc01lbWJlck5hbWVzIHsKICAgICByZXR1cm4gX2RlZmluZWRDbGFzc01lbWJlck5hbWVzID8/PQogICAgICAgICBfZHJpdmVyVW5saW5rZWRVbml0LmRlZmluZWRDbGFzc01lbWJlck5hbWVzLnRvU2V0KCk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIHRvcC1sZXZlbCBuYW1lcyBkZWZpbmVkIGJ5IHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSB0b3AtbGV2ZWwgbmFtZXMgZGVmaW5lZCBieSB0aGUgZmlsZS4KICAgU2V0PFN0cmluZz4gZ2V0IGRlZmluZWRUb3BMZXZlbE5hbWVzIHsKICAgICByZXR1cm4gX2RlZmluZWRUb3BMZXZlbE5hbWVzID8/PQogICAgICAgICBfZHJpdmVyVW5saW5rZWRVbml0LmRlZmluZWRUb3BMZXZlbE5hbWVzLnRvU2V0KCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzZXQgb2YgYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgZmlsZXMgLSBpbXBvcnRlZCwgZXhwb3J0ZWQgb3IKLSAgICogcGFydGVkLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc2V0IG9mIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIGZpbGVzIC0gaW1wb3J0ZWQsIGV4cG9ydGVkIG9yCisgIC8vLyBwYXJ0ZWQuCiAgIFNldDxGaWxlU3RhdGU+IGdldCBkaXJlY3RSZWZlcmVuY2VkRmlsZXMgPT4gX2RpcmVjdFJlZmVyZW5jZWRGaWxlczsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzZXQgb2YgYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgbGlicmFyaWVzIC0gaW1wb3J0ZWQgb3IgZXhwb3J0ZWQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzZXQgb2YgYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgbGlicmFyaWVzIC0gaW1wb3J0ZWQgb3IKKyAgLy8vIGV4cG9ydGVkLgogICBTZXQ8RmlsZVN0YXRlPiBnZXQgZGlyZWN0UmVmZXJlbmNlZExpYnJhcmllcyA9PiBfZGlyZWN0UmVmZXJlbmNlZExpYnJhcmllczsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlsZSBleGlzdHMuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlsZSBleGlzdHMuCiAgIGJvb2wgZ2V0IGV4aXN0cyA9PiBfZXhpc3RzOwogCi0gIC8qKgotICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGlzIGZpbGUgZXhwb3J0cy4KLSAgICovCisgIC8vLyBUaGUgbGlzdCBvZiBmaWxlcyB0aGlzIGZpbGUgZXhwb3J0cy4KICAgTGlzdDxGaWxlU3RhdGU+IGdldCBleHBvcnRlZEZpbGVzID0+IF9leHBvcnRlZEZpbGVzOwogCiAgIEBvdmVycmlkZQogICBpbnQgZ2V0IGhhc2hDb2RlID0+IHVyaS5oYXNoQ29kZTsKIAotICAvKioKLSAgICogVGhlIGxpc3Qgb2YgZmlsZXMgdGhpcyBmaWxlIGltcG9ydHMuCi0gICAqLworICAvLy8gVGhlIGxpc3Qgb2YgZmlsZXMgdGhpcyBmaWxlIGltcG9ydHMuCiAgIExpc3Q8RmlsZVN0YXRlPiBnZXQgaW1wb3J0ZWRGaWxlcyA9PiBfaW1wb3J0ZWRGaWxlczsKIAogICBMaWJyYXJ5Q3ljbGUgZ2V0IGludGVybmFsX2xpYnJhcnlDeWNsZSA9PiBfbGlicmFyeUN5Y2xlOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBmaWxlIGlzIGEgc3R1YiBjcmVhdGVkIGZvciBhIGxpYnJhcnkgaW4gdGhlIHByb3ZpZGVkCi0gICAqIGV4dGVybmFsIHN1bW1hcnkgc3RvcmUuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlsZSBpcyBhIHN0dWIgY3JlYXRlZCBmb3IgYSBsaWJyYXJ5IGluIHRoZSBwcm92aWRlZAorICAvLy8gZXh0ZXJuYWwgc3VtbWFyeSBzdG9yZS4KICAgYm9vbCBnZXQgaXNFeHRlcm5hbExpYnJhcnkgewogICAgIHJldHVybiBfZnNTdGF0ZS5leHRlcm5hbFN1bW1hcmllcyAhPSBudWxsICYmCiAgICAgICAgIF9mc1N0YXRlLmV4dGVybmFsU3VtbWFyaWVzLmhhc0xpbmtlZExpYnJhcnkodXJpU3RyKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBmaWxlIGRvZXMgbm90IGhhdmUgYSBgbGlicmFyeWAgZGlyZWN0aXZlLCBhbmQgaGFzIGEKLSAgICogYHBhcnQgb2ZgIGRpcmVjdGl2ZSwgc28gaXMgcHJvYmFibHkgYSBwYXJ0LgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGZpbGUgZG9lcyBub3QgaGF2ZSBhIGBsaWJyYXJ5YCBkaXJlY3RpdmUsIGFuZCBoYXMgYQorICAvLy8gYHBhcnQgb2ZgIGRpcmVjdGl2ZSwgc28gaXMgcHJvYmFibHkgYSBwYXJ0LgogICBib29sIGdldCBpc1BhcnQgewogICAgIGlmIChfZnNTdGF0ZS5leHRlcm5hbFN1bW1hcmllcyAhPSBudWxsICYmCiAgICAgICAgIF9mc1N0YXRlLmV4dGVybmFsU3VtbWFyaWVzLmhhc1VubGlua2VkVW5pdCh1cmlTdHIpKSB7CkBAIC0yNjYsMTcgKzIxOSwxMyBAQAogICAgIHJldHVybiAhX3VubGlua2VkMi5oYXNMaWJyYXJ5RGlyZWN0aXZlICYmIF91bmxpbmtlZDIuaGFzUGFydE9mRGlyZWN0aXZlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGZpbGUgaXMgdGhlICJ1bnJlc29sdmVkIiBmaWxlLCB3aGljaCBkb2VzIG5vdCBoYXZlCi0gICAqIG5laXRoZXIgYSB2YWxpZCBVUkksIG5vciBhIHBhdGguCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlsZSBpcyB0aGUgInVucmVzb2x2ZWQiIGZpbGUsIHdoaWNoIGRvZXMgbm90IGhhdmUKKyAgLy8vIG5laXRoZXIgYSB2YWxpZCBVUkksIG5vciBhIHBhdGguCiAgIGJvb2wgZ2V0IGlzVW5yZXNvbHZlZCA9PiB1cmkgPT0gbnVsbDsKIAotICAvKioKLSAgICogSWYgdGhlIGZpbGUgW2lzUGFydF0sIHJldHVybiBhIGN1cnJlbnRseSBrbm93IGxpYnJhcnkgdGhlIGZpbGUgaXMgYSBwYXJ0Ci0gICAqIG9mLiBSZXR1cm4gYG51bGxgIGlmIGEgbGlicmFyeSBpcyBub3Qga25vd24sIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgaGF2ZQotICAgKiBub3QgcHJvY2Vzc2VkIGEgbGlicmFyeSBmaWxlIHlldC4KLSAgICovCisgIC8vLyBJZiB0aGUgZmlsZSBbaXNQYXJ0XSwgcmV0dXJuIGEgY3VycmVudGx5IGtub3cgbGlicmFyeSB0aGUgZmlsZSBpcyBhIHBhcnQKKyAgLy8vIG9mLiBSZXR1cm4gYG51bGxgIGlmIGEgbGlicmFyeSBpcyBub3Qga25vd24sIGZvciBleGFtcGxlIGJlY2F1c2Ugd2UgaGF2ZQorICAvLy8gbm90IHByb2Nlc3NlZCBhIGxpYnJhcnkgZmlsZSB5ZXQuCiAgIEZpbGVTdGF0ZSBnZXQgbGlicmFyeSB7CiAgICAgTGlzdDxGaWxlU3RhdGU+IGxpYnJhcmllcyA9IF9mc1N0YXRlLl9wYXJ0VG9MaWJyYXJpZXNbdGhpc107CiAgICAgaWYgKGxpYnJhcmllcyA9PSBudWxsIHx8IGxpYnJhcmllcy5pc0VtcHR5KSB7CkBAIC0yOTcsMzEgKzI0NiwyMyBAQAogICAgIH0KIAogICAgIGlmIChfbGlicmFyeUN5Y2xlID09IG51bGwpIHsKLSAgICAgIGNvbXB1dGVMaWJyYXJ5Q3ljbGUoX2ZzU3RhdGUuX2xpbmtlZFNhbHQsIHRoaXMpOworICAgICAgY29tcHV0ZUxpYnJhcnlDeWNsZShfZnNTdGF0ZS5fc2FsdEZvckVsZW1lbnRzLCB0aGlzKTsKICAgICB9CiAKICAgICByZXR1cm4gX2xpYnJhcnlDeWNsZTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgbGlzdCBvZiBmaWxlcyBmaWxlcyB0aGF0IHRoaXMgbGlicmFyeSBjb25zaXN0cyBvZiwgaS5lLiB0aGlzIGxpYnJhcnkKLSAgICogZmlsZSBpdHNlbGYgYW5kIGl0cyBbcGFydGVkRmlsZXNdLgotICAgKi8KKyAgLy8vIFRoZSBsaXN0IG9mIGZpbGVzIGZpbGVzIHRoYXQgdGhpcyBsaWJyYXJ5IGNvbnNpc3RzIG9mLCBpLmUuIHRoaXMgbGlicmFyeQorICAvLy8gZmlsZSBpdHNlbGYgYW5kIGl0cyBbcGFydGVkRmlsZXNdLgogICBMaXN0PEZpbGVTdGF0ZT4gZ2V0IGxpYnJhcnlGaWxlcyA9PiBfbGlicmFyeUZpbGVzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbGluZSBpbiB0aGUgZmlsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbGluZSBpbiB0aGUgZmlsZS4KICAgTGluZUluZm8gZ2V0IGxpbmVJbmZvID0+IF9saW5lSW5mbzsKIAotICAvKioKLSAgICogVGhlIGxpc3Qgb2YgZmlsZXMgdGhpcyBsaWJyYXJ5IGZpbGUgcmVmZXJlbmNlcyBhcyBwYXJ0cy4KLSAgICovCisgIC8vLyBUaGUgbGlzdCBvZiBmaWxlcyB0aGlzIGxpYnJhcnkgZmlsZSByZWZlcmVuY2VzIGFzIHBhcnRzLgogICBMaXN0PEZpbGVTdGF0ZT4gZ2V0IHBhcnRlZEZpbGVzID0+IF9wYXJ0ZWRGaWxlczsKIAotICAvKioKLSAgICogVGhlIGV4dGVybmFsIG5hbWVzIHJlZmVyZW5jZWQgYnkgdGhlIGZpbGUuCi0gICAqLworICAvLy8gVGhlIGV4dGVybmFsIG5hbWVzIHJlZmVyZW5jZWQgYnkgdGhlIGZpbGUuCiAgIFNldDxTdHJpbmc+IGdldCByZWZlcmVuY2VkTmFtZXMgewogICAgIHJldHVybiBfcmVmZXJlbmNlZE5hbWVzID8/PSBfZHJpdmVyVW5saW5rZWRVbml0LnJlZmVyZW5jZWROYW1lcy50b1NldCgpOwogICB9CkBAIC0zMjksMTAgKzI3MCw4IEBACiAgIEB2aXNpYmxlRm9yVGVzdGluZwogICBGaWxlU3RhdGVUZXN0VmlldyBnZXQgdGVzdCA9PiBGaWxlU3RhdGVUZXN0Vmlldyh0aGlzKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzZXQgb2YgdHJhbnNpdGl2ZSBmaWxlcyAtIHRoZSBmaWxlIGl0c2VsZiBhbmQgYWxsIG9mIHRoZQotICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgZmlsZXMuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzZXQgb2YgdHJhbnNpdGl2ZSBmaWxlcyAtIHRoZSBmaWxlIGl0c2VsZiBhbmQgYWxsIG9mIHRoZQorICAvLy8gZGlyZWN0bHkgb3IgaW5kaXJlY3RseSByZWZlcmVuY2VkIGZpbGVzLgogICBTZXQ8RmlsZVN0YXRlPiBnZXQgdHJhbnNpdGl2ZUZpbGVzIHsKICAgICB2YXIgdHJhbnNpdGl2ZUZpbGVzID0gPEZpbGVTdGF0ZT57fTsKIApAQCAtMzQ2LDMwICsyODUsMjIgQEAKICAgICByZXR1cm4gdHJhbnNpdGl2ZUZpbGVzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2lnbmF0dXJlIG9mIHRoZSBmaWxlLCBiYXNlZCBvbiBBUEkgc2lnbmF0dXJlcyBvZiB0aGUKLSAgICogdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGltcG9ydGVkIC8gZXhwb3J0ZWQgZmlsZXMuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzaWduYXR1cmUgb2YgdGhlIGZpbGUsIGJhc2VkIG9uIEFQSSBzaWduYXR1cmVzIG9mIHRoZQorICAvLy8gdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGltcG9ydGVkIC8gZXhwb3J0ZWQgZmlsZXMuCiAgIFN0cmluZyBnZXQgdHJhbnNpdGl2ZVNpZ25hdHVyZSB7CiAgICAgdGhpcy5saWJyYXJ5Q3ljbGU7IC8vIHNldHMgX3RyYW5zaXRpdmVTaWduYXR1cmUKICAgICByZXR1cm4gX3RyYW5zaXRpdmVTaWduYXR1cmU7CiAgIH0KIAotICAvKioKLSAgICogVGhlIHZhbHVlIGB0cmFuc2l0aXZlU2lnbmF0dXJlLmxpbmtlZGAgaXMgdXNlZCBvZnRlbiwgc28gd2UgY2FjaGUgaXQuCi0gICAqLworICAvLy8gVGhlIHZhbHVlIGB0cmFuc2l0aXZlU2lnbmF0dXJlLmxpbmtlZGAgaXMgdXNlZCBvZnRlbiwgc28gd2UgY2FjaGUgaXQuCiAgIFN0cmluZyBnZXQgdHJhbnNpdGl2ZVNpZ25hdHVyZUxpbmtlZCB7CiAgICAgcmV0dXJuIF90cmFuc2l0aXZlU2lnbmF0dXJlTGlua2VkID8/PSAnJHRyYW5zaXRpdmVTaWduYXR1cmUubGlua2VkJzsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgW1VubGlua2VkVW5pdDJdIG9mIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBbVW5saW5rZWRVbml0Ml0gb2YgdGhlIGZpbGUuCiAgIFVubGlua2VkVW5pdDIgZ2V0IHVubGlua2VkMiA9PiBfdW5saW5rZWQyOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFt1cmldIHN0cmluZy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFt1cmldIHN0cmluZy4KICAgU3RyaW5nIGdldCB1cmlTdHIgPT4gdXJpLnRvU3RyaW5nKCk7CiAKICAgQG92ZXJyaWRlCkBAIC0zODgsMTEgKzMxOSw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIG5ldyBwYXJzZWQgdW5yZXNvbHZlZCBbQ29tcGlsYXRpb25Vbml0XS4KLSAgICoKLSAgICogSWYgYW4gZXhjZXB0aW9uIGhhcHBlbnMgZHVyaW5nIHBhcnNpbmcsIGFuIGVtcHR5IHVuaXQgaXMgcmV0dXJuZWQuCi0gICAqLworICAvLy8gUmV0dXJuIGEgbmV3IHBhcnNlZCB1bnJlc29sdmVkIFtDb21waWxhdGlvblVuaXRdLgorICAvLy8KKyAgLy8vIElmIGFuIGV4Y2VwdGlvbiBoYXBwZW5zIGR1cmluZyBwYXJzaW5nLCBhbiBlbXB0eSB1bml0IGlzIHJldHVybmVkLgogICBDb21waWxhdGlvblVuaXQgcGFyc2UoW0FuYWx5c2lzRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyXSkgewogICAgIGVycm9yTGlzdGVuZXIgPz89IEFuYWx5c2lzRXJyb3JMaXN0ZW5lci5OVUxMX0xJU1RFTkVSOwogICAgIHRyeSB7CkBAIC00MDQsMTYgKzMzMywxNCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZWFkIHRoZSBmaWxlIGNvbnRlbnQgYW5kIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgZmlsZSBwcm9wZXJ0aWVzIGFyZQotICAgKiBjb25zaXN0ZW50IHdpdGggdGhlIHJlYWQgY29udGVudCwgaW5jbHVkaW5nIEFQSSBzaWduYXR1cmUuCi0gICAqCi0gICAqIElmIFthbGxvd0NhY2hlZF0gaXMgYHRydWVgLCBkb24ndCByZWFkIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGlmIGl0Ci0gICAqIGlzIGFscmVhZHkgY2FjaGVkIChpbiBhbm90aGVyIFtGaWxlU3lzdGVtU3RhdGVdLCBiZWNhdXNlIG90aGVyd2lzZSB3ZQotICAgKiB3b3VsZCBub3QgY3JlYXRlIHRoaXMgbmV3IGluc3RhbmNlIG9mIFtGaWxlU3RhdGVdIGFuZCByZWZyZXNoIGl0KS4KLSAgICoKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgQVBJIHNpZ25hdHVyZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHJlZnJlc2guCi0gICAqLworICAvLy8gUmVhZCB0aGUgZmlsZSBjb250ZW50IGFuZCBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIGZpbGUgcHJvcGVydGllcyBhcmUKKyAgLy8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVhZCBjb250ZW50LCBpbmNsdWRpbmcgQVBJIHNpZ25hdHVyZS4KKyAgLy8vCisgIC8vLyBJZiBbYWxsb3dDYWNoZWRdIGlzIGB0cnVlYCwgZG9uJ3QgcmVhZCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBpZiBpdAorICAvLy8gaXMgYWxyZWFkeSBjYWNoZWQgKGluIGFub3RoZXIgW0ZpbGVTeXN0ZW1TdGF0ZV0sIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlCisgIC8vLyB3b3VsZCBub3QgY3JlYXRlIHRoaXMgbmV3IGluc3RhbmNlIG9mIFtGaWxlU3RhdGVdIGFuZCByZWZyZXNoIGl0KS4KKyAgLy8vCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBBUEkgc2lnbmF0dXJlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgcmVmcmVzaC4KICAgYm9vbCByZWZyZXNoKHtib29sIGFsbG93Q2FjaGVkID0gZmFsc2V9KSB7CiAgICAgY291bnRlckZpbGVTdGF0ZVJlZnJlc2grKzsKIApAQCAtNDM1LDcgKzM2Miw3IEBACiAgICAgTGlzdDxpbnQ+IGNvbnRlbnRTaWduYXR1cmU7CiAgICAgewogICAgICAgdmFyIHNpZ25hdHVyZSA9IEFwaVNpZ25hdHVyZSgpOwotICAgICAgc2lnbmF0dXJlLmFkZFVpbnQzMkxpc3QoX2ZzU3RhdGUuX3VubGlua2VkU2FsdCk7CisgICAgICBzaWduYXR1cmUuYWRkVWludDMyTGlzdChfZnNTdGF0ZS5fc2FsdEZvclVubGlua2VkKTsKICAgICAgIHNpZ25hdHVyZS5hZGRGZWF0dXJlU2V0KF9jb250ZXh0RmVhdHVyZVNldCk7CiAgICAgICBzaWduYXR1cmUuYWRkTGFuZ3VhZ2VWZXJzaW9uKF9wYWNrYWdlTGFuZ3VhZ2VWZXJzaW9uKTsKICAgICAgIHNpZ25hdHVyZS5hZGRTdHJpbmcoX2NvbnRlbnRIYXNoKTsKQEAgLTU3OSwxMCArNTA2LDggQEAKICAgICByZXR1cm4gdW5pdDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtGaWxlU3RhdGVdIGZvciB0aGUgZ2l2ZW4gW3JlbGF0aXZlVXJpXSwgbWF5YmUgInVucmVzb2x2ZWQiCi0gICAqIGZpbGUgaWYgdGhlIFVSSSBjYW5ub3QgYmUgcGFyc2VkLCBjYW5ub3QgY29ycmVzcG9uZCBhbnkgZmlsZSwgZXRjLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgW0ZpbGVTdGF0ZV0gZm9yIHRoZSBnaXZlbiBbcmVsYXRpdmVVcmldLCBtYXliZSAidW5yZXNvbHZlZCIKKyAgLy8vIGZpbGUgaWYgdGhlIFVSSSBjYW5ub3QgYmUgcGFyc2VkLCBjYW5ub3QgY29ycmVzcG9uZCBhbnkgZmlsZSwgZXRjLgogICBGaWxlU3RhdGUgX2ZpbGVGb3JSZWxhdGl2ZVVyaShTdHJpbmcgcmVsYXRpdmVVcmkpIHsKICAgICBpZiAocmVsYXRpdmVVcmkuaXNFbXB0eSkgewogICAgICAgcmV0dXJuIF9mc1N0YXRlLnVucmVzb2x2ZWRGaWxlOwpAQCAtNTk4LDEwICs1MjMsOCBAQAogICAgIHJldHVybiBfZnNTdGF0ZS5nZXRGaWxlRm9yVXJpKGFic29sdXRlVXJpKTsKICAgfQogCi0gIC8qKgotICAgKiBJbnZhbGlkYXRlIGFueSBkYXRhIHRoYXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCB1bmxpbmtlZCBkYXRhIG9mIHRoZSBmaWxlLAotICAgKiBiZWNhdXNlIFtyZWZyZXNoXSBpcyBnb2luZyB0byByZWNvbXB1dGUgdGhlIHVubGlua2VkIGRhdGEuCi0gICAqLworICAvLy8gSW52YWxpZGF0ZSBhbnkgZGF0YSB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdW5saW5rZWQgZGF0YSBvZiB0aGUgZmlsZSwKKyAgLy8vIGJlY2F1c2UgW3JlZnJlc2hdIGlzIGdvaW5nIHRvIHJlY29tcHV0ZSB0aGUgdW5saW5rZWQgZGF0YS4KICAgdm9pZCBfaW52YWxpZGF0ZUN1cnJlbnRVbnJlc29sdmVkRGF0YSgpIHsKICAgICAvLyBJbnZhbGlkYXRlIHVubGlua2VkIGluZm9ybWF0aW9uLgogICAgIF9kZWZpbmVkVG9wTGV2ZWxOYW1lcyA9IG51bGw7CkBAIC03NTksOSArNjgyLDcgQEAKICAgICApOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJ5dGUgbGlzdHMgYXJlIGVxdWFsLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJ5dGUgbGlzdHMgYXJlIGVxdWFsLgogICBzdGF0aWMgYm9vbCBfZXF1YWxCeXRlTGlzdHMoTGlzdDxpbnQ+IGEsIExpc3Q8aW50PiBiKSB7CiAgICAgaWYgKGEgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIGIgPT0gbnVsbDsKQEAgLTgwNSw5ICs3MjYsNyBAQAogICBTdHJpbmcgZ2V0IHVubGlua2VkS2V5ID0+IGZpbGUuX3VubGlua2VkS2V5OwogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGtub3duIGZpbGUgc3lzdGVtIHN0YXRlLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQga25vd24gZmlsZSBzeXN0ZW0gc3RhdGUuCiBjbGFzcyBGaWxlU3lzdGVtU3RhdGUgewogICBmaW5hbCBQZXJmb3JtYW5jZUxvZyBfbG9nZ2VyOwogICBmaW5hbCBSZXNvdXJjZVByb3ZpZGVyIF9yZXNvdXJjZVByb3ZpZGVyOwpAQCAtODE3LDc2ICs3MzYsNTIgQEAKICAgZmluYWwgU291cmNlRmFjdG9yeSBfc291cmNlRmFjdG9yeTsKICAgZmluYWwgQW5hbHlzaXNPcHRpb25zIF9hbmFseXNpc09wdGlvbnM7CiAgIGZpbmFsIERlY2xhcmVkVmFyaWFibGVzIF9kZWNsYXJlZFZhcmlhYmxlczsKLSAgZmluYWwgVWludDMyTGlzdCBfdW5saW5rZWRTYWx0OwotICBmaW5hbCBVaW50MzJMaXN0IF9saW5rZWRTYWx0OworICBmaW5hbCBVaW50MzJMaXN0IF9zYWx0Rm9yVW5saW5rZWQ7CisgIGZpbmFsIFVpbnQzMkxpc3QgX3NhbHRGb3JFbGVtZW50czsKIAogICBmaW5hbCBGZWF0dXJlU2V0UHJvdmlkZXIgZmVhdHVyZVNldFByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgb3B0aW9uYWwgc3RvcmUgd2l0aCBleHRlcm5hbGx5IHByb3ZpZGVkIHVubGlua2VkIGFuZCBjb3JyZXNwb25kaW5nCi0gICAqIGxpbmtlZCBzdW1tYXJpZXMuIFRoZXNlIHN1bW1hcmllcyBhcmUgYWx3YXlzIGFkZGVkIHRvIHRoZSBzdG9yZSBmb3IgYW55Ci0gICAqIGZpbGUgYW5hbHlzaXMuCi0gICAqCi0gICAqIFdoaWxlIHdhbGtpbmcgdGhlIGZpbGUgZ3JhcGgsIHdoZW4gd2UgcmVhY2ggYSBmaWxlIHRoYXQgZXhpc3RzIGluIHRoZQotICAgKiBleHRlcm5hbCBzdG9yZSwgd2UgYWRkIGEgc3R1YiBbRmlsZVN0YXRlXSwgYnV0IGRvbid0IGF0dGVtcHQgdG8gcmVhZCBpdHMKLSAgICogY29udGVudCwgb3IgaXRzIHVubGlua2VkIHVuaXQsIG9yIGltcG9ydGVkIGxpYnJhcmllcywgZXRjLgotICAgKi8KKyAgLy8vIFRoZSBvcHRpb25hbCBzdG9yZSB3aXRoIGV4dGVybmFsbHkgcHJvdmlkZWQgdW5saW5rZWQgYW5kIGNvcnJlc3BvbmRpbmcKKyAgLy8vIGxpbmtlZCBzdW1tYXJpZXMuIFRoZXNlIHN1bW1hcmllcyBhcmUgYWx3YXlzIGFkZGVkIHRvIHRoZSBzdG9yZSBmb3IgYW55CisgIC8vLyBmaWxlIGFuYWx5c2lzLgorICAvLy8KKyAgLy8vIFdoaWxlIHdhbGtpbmcgdGhlIGZpbGUgZ3JhcGgsIHdoZW4gd2UgcmVhY2ggYSBmaWxlIHRoYXQgZXhpc3RzIGluIHRoZQorICAvLy8gZXh0ZXJuYWwgc3RvcmUsIHdlIGFkZCBhIHN0dWIgW0ZpbGVTdGF0ZV0sIGJ1dCBkb24ndCBhdHRlbXB0IHRvIHJlYWQgaXRzCisgIC8vLyBjb250ZW50LCBvciBpdHMgdW5saW5rZWQgdW5pdCwgb3IgaW1wb3J0ZWQgbGlicmFyaWVzLCBldGMuCiAgIGZpbmFsIFN1bW1hcnlEYXRhU3RvcmUgZXh0ZXJuYWxTdW1tYXJpZXM7CiAKLSAgLyoqCi0gICAqIE1hcHBpbmcgZnJvbSBhIFVSSSB0byB0aGUgY29ycmVzcG9uZGluZyBbRmlsZVN0YXRlXS4KLSAgICovCisgIC8vLyBNYXBwaW5nIGZyb20gYSBVUkkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0ZpbGVTdGF0ZV0uCiAgIGZpbmFsIE1hcDxVcmksIEZpbGVTdGF0ZT4gX3VyaVRvRmlsZSA9IHt9OwogCi0gIC8qKgotICAgKiBBbGwga25vd24gZmlsZSBwYXRocy4KLSAgICovCisgIC8vLyBBbGwga25vd24gZmlsZSBwYXRocy4KICAgZmluYWwgU2V0PFN0cmluZz4ga25vd25GaWxlUGF0aHMgPSA8U3RyaW5nPnt9OwogCi0gIC8qKgotICAgKiBBbGwga25vd24gZmlsZXMuCi0gICAqLworICAvLy8gQWxsIGtub3duIGZpbGVzLgogICBmaW5hbCBMaXN0PEZpbGVTdGF0ZT4ga25vd25GaWxlcyA9IFtdOwogCi0gIC8qKgotICAgKiBNYXBwaW5nIGZyb20gYSBwYXRoIHRvIHRoZSBmbGFnIHdoZXRoZXIgdGhlcmUgaXMgYSBVUkkgZm9yIHRoZSBwYXRoLgotICAgKi8KKyAgLy8vIE1hcHBpbmcgZnJvbSBhIHBhdGggdG8gdGhlIGZsYWcgd2hldGhlciB0aGVyZSBpcyBhIFVSSSBmb3IgdGhlIHBhdGguCiAgIGZpbmFsIE1hcDxTdHJpbmcsIGJvb2w+IF9oYXNVcmlGb3JQYXRoID0ge307CiAKLSAgLyoqCi0gICAqIE1hcHBpbmcgZnJvbSBhIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0ZpbGVTdGF0ZV1zLCBjYW5vbmljYWwgb3Igbm90LgotICAgKi8KKyAgLy8vIE1hcHBpbmcgZnJvbSBhIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgW0ZpbGVTdGF0ZV1zLCBjYW5vbmljYWwgb3Igbm90LgogICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEZpbGVTdGF0ZT4+IF9wYXRoVG9GaWxlcyA9IHt9OwogCi0gIC8qKgotICAgKiBNYXBwaW5nIGZyb20gYSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbm9uaWNhbCBbRmlsZVN0YXRlXS4KLSAgICovCisgIC8vLyBNYXBwaW5nIGZyb20gYSBwYXRoIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbm9uaWNhbCBbRmlsZVN0YXRlXS4KICAgZmluYWwgTWFwPFN0cmluZywgRmlsZVN0YXRlPiBfcGF0aFRvQ2Fub25pY2FsRmlsZSA9IHt9OwogCi0gIC8qKgotICAgKiBNYXBwaW5nIGZyb20gYSBwYXJ0IHRvIHRoZSBsaWJyYXJpZXMgaXQgaXMgYSBwYXJ0IG9mLgotICAgKi8KKyAgLy8vIE1hcHBpbmcgZnJvbSBhIHBhcnQgdG8gdGhlIGxpYnJhcmllcyBpdCBpcyBhIHBhcnQgb2YuCiAgIGZpbmFsIE1hcDxGaWxlU3RhdGUsIExpc3Q8RmlsZVN0YXRlPj4gX3BhcnRUb0xpYnJhcmllcyA9IHt9OwogCi0gIC8qKgotICAgKiBUaGUgbWFwIG9mIHN1YnR5cGVkIG5hbWVzIHRvIGZpbGVzIHdoZXJlIHRoZXNlIG5hbWVzIGFyZSBzdWJ0eXBlZC4KLSAgICovCisgIC8vLyBUaGUgbWFwIG9mIHN1YnR5cGVkIG5hbWVzIHRvIGZpbGVzIHdoZXJlIHRoZXNlIG5hbWVzIGFyZSBzdWJ0eXBlZC4KICAgZmluYWwgTWFwPFN0cmluZywgU2V0PEZpbGVTdGF0ZT4+IF9zdWJ0eXBlZE5hbWVUb0ZpbGVzID0ge307CiAKLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGluY3JlbWVudGVkIHdoZW4gdGhlIHNldCBvZiBmaWxlcyBpcyB1cGRhdGVkLgotICAgKi8KKyAgLy8vIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGluY3JlbWVudGVkIHdoZW4gdGhlIHNldCBvZiBmaWxlcyBpcyB1cGRhdGVkLgogICBpbnQgZmlsZVN0YW1wID0gMDsKIAotICAvKioKLSAgICogVGhlIFtGaWxlU3RhdGVdIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZCB0byBhbiB1bnJlc29sdmVkIFVSSS4KLSAgICovCisgIC8vLyBUaGUgW0ZpbGVTdGF0ZV0gaW5zdGFuY2UgdGhhdCBjb3JyZXNwb25kIHRvIGFuIHVucmVzb2x2ZWQgVVJJLgogICBGaWxlU3RhdGUgX3VucmVzb2x2ZWRGaWxlOwogCi0gIC8qKgotICAgKiBUaGUgY2FjaGUgb2YgY29udGVudCBvZiBmaWxlcywgcG9zc2libHkgc2hhcmVkIHdpdGggb3RoZXIgZmlsZSBzeXN0ZW0KLSAgICogc3RhdGVzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2UgcHJvdmlkZXIgYW5kIHRoZSBjb250ZW50IG92ZXJsYXkuCi0gICAqLworICAvLy8gVGhlIGNhY2hlIG9mIGNvbnRlbnQgb2YgZmlsZXMsIHBvc3NpYmx5IHNoYXJlZCB3aXRoIG90aGVyIGZpbGUgc3lzdGVtCisgIC8vLyBzdGF0ZXMgd2l0aCB0aGUgc2FtZSByZXNvdXJjZSBwcm92aWRlciBhbmQgdGhlIGNvbnRlbnQgb3ZlcmxheS4KICAgX0ZpbGVDb250ZW50Q2FjaGUgX2ZpbGVDb250ZW50Q2FjaGU7CiAKICAgRmlsZVN5c3RlbVN0YXRlVGVzdFZpZXcgX3Rlc3RWaWV3OwpAQCAtOTAwLDggKzc5NSw4IEBACiAgICAgdGhpcy5fc291cmNlRmFjdG9yeSwKICAgICB0aGlzLl9hbmFseXNpc09wdGlvbnMsCiAgICAgdGhpcy5fZGVjbGFyZWRWYXJpYWJsZXMsCi0gICAgdGhpcy5fdW5saW5rZWRTYWx0LAotICAgIHRoaXMuX2xpbmtlZFNhbHQsCisgICAgdGhpcy5fc2FsdEZvclVubGlua2VkLAorICAgIHRoaXMuX3NhbHRGb3JFbGVtZW50cywKICAgICB0aGlzLmZlYXR1cmVTZXRQcm92aWRlciwgewogICAgIHRoaXMuZXh0ZXJuYWxTdW1tYXJpZXMsCiAgIH0pIHsKQEAgLTkxNSw5ICs4MTAsNyBAQAogICBAdmlzaWJsZUZvclRlc3RpbmcKICAgRmlsZVN5c3RlbVN0YXRlVGVzdFZpZXcgZ2V0IHRlc3QgPT4gX3Rlc3RWaWV3OwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtGaWxlU3RhdGVdIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZCB0byBhbiB1bnJlc29sdmVkIFVSSS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtGaWxlU3RhdGVdIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZCB0byBhbiB1bnJlc29sdmVkIFVSSS4KICAgRmlsZVN0YXRlIGdldCB1bnJlc29sdmVkRmlsZSB7CiAgICAgaWYgKF91bnJlc29sdmVkRmlsZSA9PSBudWxsKSB7CiAgICAgICB2YXIgZmVhdHVyZVNldCA9IEZlYXR1cmVTZXQuZnJvbUVuYWJsZUZsYWdzKFtdKTsKQEAgLTkyOCwxMyArODIxLDExIEBACiAgICAgcmV0dXJuIF91bnJlc29sdmVkRmlsZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBbRmlsZVN0YXRlXSBmb3IgdGhlIGdpdmVuIGFic29sdXRlIFtwYXRoXS4gVGhlCi0gICAqIHJldHVybmVkIGZpbGUgaGFzIHRoZSBsYXN0IGtub3duIHN0YXRlIHNpbmNlIGlmIHdhcyBsYXN0IHJlZnJlc2hlZC4KLSAgICoKLSAgICogSGVyZSAiY2Fub25pY2FsIiBtZWFucyB0aGF0IGlmIHRoZSBbcGF0aF0gaXMgaW4gYSBwYWNrYWdlIGBsaWJgIHRoZW4gdGhlCi0gICAqIHJldHVybmVkIGZpbGUgd2lsbCBoYXZlIHRoZSBgcGFja2FnZTpgIHN0eWxlIFVSSS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGNhbm9uaWNhbCBbRmlsZVN0YXRlXSBmb3IgdGhlIGdpdmVuIGFic29sdXRlIFtwYXRoXS4gVGhlCisgIC8vLyByZXR1cm5lZCBmaWxlIGhhcyB0aGUgbGFzdCBrbm93biBzdGF0ZSBzaW5jZSBpZiB3YXMgbGFzdCByZWZyZXNoZWQuCisgIC8vLworICAvLy8gSGVyZSAiY2Fub25pY2FsIiBtZWFucyB0aGF0IGlmIHRoZSBbcGF0aF0gaXMgaW4gYSBwYWNrYWdlIGBsaWJgIHRoZW4gdGhlCisgIC8vLyByZXR1cm5lZCBmaWxlIHdpbGwgaGF2ZSB0aGUgYHBhY2thZ2U6YCBzdHlsZSBVUkkuCiAgIEZpbGVTdGF0ZSBnZXRGaWxlRm9yUGF0aChTdHJpbmcgcGF0aCkgewogICAgIEZpbGVTdGF0ZSBmaWxlID0gX3BhdGhUb0Nhbm9uaWNhbEZpbGVbcGF0aF07CiAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewpAQCAtOTYzLDEyICs4NTQsMTAgQEAKICAgICByZXR1cm4gZmlsZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtGaWxlU3RhdGVdIGZvciB0aGUgZ2l2ZW4gYWJzb2x1dGUgW3VyaV0uIE1heSByZXR1cm4gdGhlCi0gICAqICJ1bnJlc29sdmVkIiBmaWxlIGlmIHRoZSBbdXJpXSBpcyBpbnZhbGlkLCBlLmcuIGEgYHBhY2thZ2U6YCBVUkkgd2l0aG91dAotICAgKiBhIHBhY2thZ2UgbmFtZS4gVGhlIHJldHVybmVkIGZpbGUgaGFzIHRoZSBsYXN0IGtub3duIHN0YXRlIHNpbmNlIGlmIHdhcwotICAgKiBsYXN0IHJlZnJlc2hlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtGaWxlU3RhdGVdIGZvciB0aGUgZ2l2ZW4gYWJzb2x1dGUgW3VyaV0uIE1heSByZXR1cm4gdGhlCisgIC8vLyAidW5yZXNvbHZlZCIgZmlsZSBpZiB0aGUgW3VyaV0gaXMgaW52YWxpZCwgZS5nLiBhIGBwYWNrYWdlOmAgVVJJIHdpdGhvdXQKKyAgLy8vIGEgcGFja2FnZSBuYW1lLiBUaGUgcmV0dXJuZWQgZmlsZSBoYXMgdGhlIGxhc3Qga25vd24gc3RhdGUgc2luY2UgaWYgd2FzCisgIC8vLyBsYXN0IHJlZnJlc2hlZC4KICAgRmlsZVN0YXRlIGdldEZpbGVGb3JVcmkoVXJpIHVyaSkgewogICAgIEZpbGVTdGF0ZSBmaWxlID0gX3VyaVRvRmlsZVt1cmldOwogICAgIGlmIChmaWxlID09IG51bGwpIHsKQEAgLTEwMDcsMTAgKzg5Niw4IEBACiAgICAgcmV0dXJuIGZpbGU7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBbRmlsZVN0YXRlXXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gW3BhdGhdLiBUaGUKLSAgICogbGlzdCBoYXMgYXQgbGVhc3Qgb25lIGl0ZW0sIGFuZCB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgY2Fub25pY2FsIGZpbGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBbRmlsZVN0YXRlXXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gW3BhdGhdLiBUaGUKKyAgLy8vIGxpc3QgaGFzIGF0IGxlYXN0IG9uZSBpdGVtLCBhbmQgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGNhbm9uaWNhbCBmaWxlLgogICBMaXN0PEZpbGVTdGF0ZT4gZ2V0RmlsZXNGb3JQYXRoKFN0cmluZyBwYXRoKSB7CiAgICAgRmlsZVN0YXRlIGNhbm9uaWNhbEZpbGUgPSBnZXRGaWxlRm9yUGF0aChwYXRoKTsKICAgICBMaXN0PEZpbGVTdGF0ZT4gYWxsRmlsZXMgPSBfcGF0aFRvRmlsZXNbcGF0aF0udG9MaXN0KCk7CkBAIC0xMDIyLDIxICs5MDksMTcgQEAKICAgICAgIC4uaW5zZXJ0KDAsIGNhbm9uaWNhbEZpbGUpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBmaWxlcyB3aGVyZSB0aGUgZ2l2ZW4gW25hbWVdIGlzIHN1YnR5cGVkLCBpLmUuIHVzZWQgaW4gYGV4dGVuZHNgLAotICAgKiBgd2l0aGAgb3IgYGltcGxlbWVudHNgIGNsYXVzZXMuCi0gICAqLworICAvLy8gUmV0dXJuIGZpbGVzIHdoZXJlIHRoZSBnaXZlbiBbbmFtZV0gaXMgc3VidHlwZWQsIGkuZS4gdXNlZCBpbiBgZXh0ZW5kc2AsCisgIC8vLyBgd2l0aGAgb3IgYGltcGxlbWVudHNgIGNsYXVzZXMuCiAgIFNldDxGaWxlU3RhdGU+IGdldEZpbGVzU3VidHlwaW5nTmFtZShTdHJpbmcgbmFtZSkgewogICAgIHJldHVybiBfc3VidHlwZWROYW1lVG9GaWxlc1tuYW1lXTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZXJlIGlzIGEgVVJJIHRoYXQgY2FuIGJlIHJlc29sdmVkIHRvIHRoZSBbcGF0aF0uCi0gICAqCi0gICAqIFdoZW4gYSBmaWxlIGV4aXN0cywgYnV0IGZvciB0aGUgVVJJIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUgaXMKLSAgICogcmVzb2x2ZWQgdG8gYW5vdGhlciBmaWxlLCBlLmcuIGEgZ2VuZXJhdGVkIG9uZSBpbiBCYXplbCwgR24sIGV0Yywgd2UKLSAgICogY2Fubm90IGFuYWx5emUgdGhlIG9yaWdpbmFsIGZpbGUuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGVyZSBpcyBhIFVSSSB0aGF0IGNhbiBiZSByZXNvbHZlZCB0byB0aGUgW3BhdGhdLgorICAvLy8KKyAgLy8vIFdoZW4gYSBmaWxlIGV4aXN0cywgYnV0IGZvciB0aGUgVVJJIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUgaXMKKyAgLy8vIHJlc29sdmVkIHRvIGFub3RoZXIgZmlsZSwgZS5nLiBhIGdlbmVyYXRlZCBvbmUgaW4gQmF6ZWwsIEduLCBldGMsIHdlCisgIC8vLyBjYW5ub3QgYW5hbHl6ZSB0aGUgb3JpZ2luYWwgZmlsZS4KICAgYm9vbCBoYXNVcmkoU3RyaW5nIHBhdGgpIHsKICAgICBib29sIGZsYWcgPSBfaGFzVXJpRm9yUGF0aFtwYXRoXTsKICAgICBpZiAoZmxhZyA9PSBudWxsKSB7CkBAIC0xMDUwLDI3ICs5MzMsMjEgQEAKICAgICByZXR1cm4gZmxhZzsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0gbWlnaHQgaGF2ZSBjaGFuZ2VkLCBzbyBlbnN1cmUgdGhhdCBpdCBpcwotICAgKiByZWFkIHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVmcmVzaGVkLgotICAgKi8KKyAgLy8vIFRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFtwYXRoXSBtaWdodCBoYXZlIGNoYW5nZWQsIHNvIGVuc3VyZSB0aGF0IGl0IGlzCisgIC8vLyByZWFkIHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVmcmVzaGVkLgogICB2b2lkIG1hcmtGaWxlRm9yUmVhZGluZyhTdHJpbmcgcGF0aCkgewogICAgIF9maWxlQ29udGVudENhY2hlLnJlbW92ZShwYXRoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW3BhdGhdLgotICAgKi8KKyAgLy8vIFJlbW92ZSB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0uCiAgIHZvaWQgcmVtb3ZlRmlsZShTdHJpbmcgcGF0aCkgewogICAgIG1hcmtGaWxlRm9yUmVhZGluZyhwYXRoKTsKICAgICBfY2xlYXJGaWxlcygpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlc2V0IFVSSSByZXNvbHV0aW9uLCBhbmQgZm9yZ2V0IGFsbCBmaWxlcy4gU28sIHRoZSBuZXh0IHRpbWUgYW55IGZpbGUgaXMKLSAgICogcmVxdWVzdGVkLCBpdCB3aWxsIGJlIHJlYWQsIGFuZCBpdHMgd2hvbGUgKHBvdGVudGlhbGx5IGRpZmZlcmVudCkgZ3JhcGgKLSAgICogd2lsbCBiZSBidWlsdC4KLSAgICovCisgIC8vLyBSZXNldCBVUkkgcmVzb2x1dGlvbiwgYW5kIGZvcmdldCBhbGwgZmlsZXMuIFNvLCB0aGUgbmV4dCB0aW1lIGFueSBmaWxlIGlzCisgIC8vLyByZXF1ZXN0ZWQsIGl0IHdpbGwgYmUgcmVhZCwgYW5kIGl0cyB3aG9sZSAocG90ZW50aWFsbHkgZGlmZmVyZW50KSBncmFwaAorICAvLy8gd2lsbCBiZSBidWlsdC4KICAgdm9pZCByZXNldFVyaVJlc29sdXRpb24oKSB7CiAgICAgX3NvdXJjZUZhY3RvcnkuY2xlYXJDYWNoZSgpOwogICAgIF9maWxlQ29udGVudENhY2hlLmNsZWFyKCk7CkBAIC0xMTE0LDkgKzk5MSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGVudCBvZiBhIGZpbGUuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGVudCBvZiBhIGZpbGUuCiBjbGFzcyBfRmlsZUNvbnRlbnQgewogICBmaW5hbCBTdHJpbmcgcGF0aDsKICAgZmluYWwgYm9vbCBleGlzdHM7CkBAIC0xMTI2LDIzICsxMDAxLDE3IEBACiAgIF9GaWxlQ29udGVudCh0aGlzLnBhdGgsIHRoaXMuZXhpc3RzLCB0aGlzLmNvbnRlbnQsIHRoaXMuY29udGVudEhhc2gpOwogfQogCi0vKioKLSAqIFRoZSBjYWNoZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBjb250ZW50IG9mIGZpbGVzLgotICovCisvLy8gVGhlIGNhY2hlIG9mIGluZm9ybWF0aW9uIGFib3V0IGNvbnRlbnQgb2YgZmlsZXMuCiBjbGFzcyBfRmlsZUNvbnRlbnRDYWNoZSB7Ci0gIC8qKgotICAgKiBXZWFrIG1hcCBvZiBjYWNoZSBpbnN0YW5jZXMuCi0gICAqCi0gICAqIE91dGVyIGtleSBpcyBhIFtGaWxlQ29udGVudE92ZXJsYXldLgotICAgKiBJbm5lciBrZXkgaXMgYSBbUmVzb3VyY2VQcm92aWRlcl0uCi0gICAqLworICAvLy8gV2VhayBtYXAgb2YgY2FjaGUgaW5zdGFuY2VzLgorICAvLy8KKyAgLy8vIE91dGVyIGtleSBpcyBhIFtGaWxlQ29udGVudE92ZXJsYXldLgorICAvLy8gSW5uZXIga2V5IGlzIGEgW1Jlc291cmNlUHJvdmlkZXJdLgogICBzdGF0aWMgZmluYWwgX2luc3RhbmNlcyA9IEV4cGFuZG88RXhwYW5kbzxfRmlsZUNvbnRlbnRDYWNoZT4+KCk7CiAKLSAgLyoqCi0gICAqIFdlYWsgbWFwIG9mIGNhY2hlIGluc3RhbmNlcy4KLSAgICoKLSAgICogS2V5IGlzIGEgW1Jlc291cmNlUHJvdmlkZXJdLgotICAgKi8KKyAgLy8vIFdlYWsgbWFwIG9mIGNhY2hlIGluc3RhbmNlcy4KKyAgLy8vCisgIC8vLyBLZXkgaXMgYSBbUmVzb3VyY2VQcm92aWRlcl0uCiAgIHN0YXRpYyBmaW5hbCBfaW5zdGFuY2VzMiA9IEV4cGFuZG88X0ZpbGVDb250ZW50Q2FjaGU+KCk7CiAKICAgZmluYWwgUmVzb3VyY2VQcm92aWRlciBfcmVzb3VyY2VQcm92aWRlcjsKQEAgLTExNTUsMTIgKzEwMjQsMTAgQEAKICAgICBfcGF0aFRvRmlsZS5jbGVhcigpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0uCi0gICAqCi0gICAqIElmIFthbGxvd0NhY2hlZF0gaXMgYHRydWVgLCBhbmQgdGhlIGZpbGUgaXMgaW4gdGhlIGNhY2hlLCByZXR1cm4gdGhlCi0gICAqIGNhY2hlZCBkYXRhLiBPdGhlcndpc2UgcmVhZCB0aGUgZmlsZSwgY29tcHV0ZSBhbmQgY2FjaGUgdGhlIGRhdGEuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFtwYXRoXS4KKyAgLy8vCisgIC8vLyBJZiBbYWxsb3dDYWNoZWRdIGlzIGB0cnVlYCwgYW5kIHRoZSBmaWxlIGlzIGluIHRoZSBjYWNoZSwgcmV0dXJuIHRoZQorICAvLy8gY2FjaGVkIGRhdGEuIE90aGVyd2lzZSByZWFkIHRoZSBmaWxlLCBjb21wdXRlIGFuZCBjYWNoZSB0aGUgZGF0YS4KICAgX0ZpbGVDb250ZW50IGdldChTdHJpbmcgcGF0aCwgYm9vbCBhbGxvd0NhY2hlZCkgewogICAgIHZhciBmaWxlID0gYWxsb3dDYWNoZWQgPyBfcGF0aFRvRmlsZVtwYXRoXSA6IG51bGw7CiAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewpAQCAtMTE4OCw5ICsxMDU1LDcgQEAKICAgICByZXR1cm4gZmlsZTsKICAgfQogCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW3BhdGhdIGZyb20gdGhlIGNhY2hlLgotICAgKi8KKyAgLy8vIFJlbW92ZSB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0gZnJvbSB0aGUgY2FjaGUuCiAgIHZvaWQgcmVtb3ZlKFN0cmluZyBwYXRoKSB7CiAgICAgX3BhdGhUb0ZpbGUucmVtb3ZlKHBhdGgpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2ZpbGVfdHJhY2tlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9maWxlX3RyYWNrZXIuZGFydAppbmRleCA1N2VhYTA2Li5hYmQyOGE1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2ZpbGVfdHJhY2tlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvZmlsZV90cmFja2VyLmRhcnQKQEAgLTExLDc2ICsxMSw1NCBAQAogLy8vIGBudWxsYCBpZiBtdWx0aXBsZSBmaWxlcyB3ZXJlIGFkZGVkLCBjaGFuZ2VkLCBvciByZW1vdmVkLgogdHlwZWRlZiBGaWxlVHJhY2tlckNoYW5nZUhvb2sgPSB2b2lkIEZ1bmN0aW9uKFN0cmluZyBwYXRoKTsKIAotLyoqCi0gKiBNYWludGFpbnMgdGhlIGZpbGUgc3lzdGVtIHN0YXRlIG5lZWRlZCBieSB0aGUgYW5hbHlzaXMgZHJpdmVyLCBhcyB3ZWxsIGFzCi0gKiBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZCBhbmQgdGhlIGltcGFjdCBvZiB0aG9zZSBjaGFuZ2VzLgotICoKLSAqIFRocmVlIHJlbGF0ZWQgc2V0cyBvZiBmaWxlcyBhcmUgdHJhY2tlZDogImFkZGVkIGZpbGVzIiBpcyB0aGUgc2V0IG9mIGZpbGVzCi0gKiBmb3Igd2hpY2ggdGhlIGNsaWVudCB3b3VsZCBsaWtlIGFuYWx5c2lzLiAgImNoYW5nZWQgZmlsZXMiIGlzIHRoZSBzZXQgb2YKLSAqIGZpbGVzIHdoaWNoIGlzIGtub3duIHRvIGhhdmUgY2hhbmdlZCwgYnV0IGZvciB3aGljaCB3ZSBoYXZlIG5vdCB5ZXQgbWVhc3VyZWQKLSAqIHRoZSBpbXBhY3Qgb2YgdGhlIGNoYW5nZS4gICJwZW5kaW5nIGZpbGVzIiBpcyB0aGUgc3Vic2V0IG9mICJhZGRlZCBmaWxlcyIKLSAqIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBpbXBhY3RlZCBieSBhIGNoYW5nZSwgYW5kIHRodXMgbmVlZCBhbmFseXNpcy4KLSAqCi0gKiBQcm92aWRlcyBtZXRob2RzIGZvciB1cGRhdGluZyB0aGUgZmlsZSBzeXN0ZW0gc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcy4KLSAqLworLy8vIE1haW50YWlucyB0aGUgZmlsZSBzeXN0ZW0gc3RhdGUgbmVlZGVkIGJ5IHRoZSBhbmFseXNpcyBkcml2ZXIsIGFzIHdlbGwgYXMKKy8vLyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZCBhbmQgdGhlIGltcGFjdCBvZiB0aG9zZSBjaGFuZ2VzLgorLy8vCisvLy8gVGhyZWUgcmVsYXRlZCBzZXRzIG9mIGZpbGVzIGFyZSB0cmFja2VkOiAiYWRkZWQgZmlsZXMiIGlzIHRoZSBzZXQgb2YgZmlsZXMKKy8vLyBmb3Igd2hpY2ggdGhlIGNsaWVudCB3b3VsZCBsaWtlIGFuYWx5c2lzLiAgImNoYW5nZWQgZmlsZXMiIGlzIHRoZSBzZXQgb2YKKy8vLyBmaWxlcyB3aGljaCBpcyBrbm93biB0byBoYXZlIGNoYW5nZWQsIGJ1dCBmb3Igd2hpY2ggd2UgaGF2ZSBub3QgeWV0IG1lYXN1cmVkCisvLy8gdGhlIGltcGFjdCBvZiB0aGUgY2hhbmdlLiAgInBlbmRpbmcgZmlsZXMiIGlzIHRoZSBzdWJzZXQgb2YgImFkZGVkIGZpbGVzIgorLy8vIHdoaWNoIG1pZ2h0IGhhdmUgYmVlbiBpbXBhY3RlZCBieSBhIGNoYW5nZSwgYW5kIHRodXMgbmVlZCBhbmFseXNpcy4KKy8vLworLy8vIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHVwZGF0aW5nIHRoZSBmaWxlIHN5c3RlbSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2VzLgogY2xhc3MgRmlsZVRyYWNrZXIgewotICAvKioKLSAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgdGhhdCBtYXkgcmVxdWlyZSB0aGUgY2xpZW50IHRvCi0gICAqIHBlcmZvcm0gYW5hbHlzaXMuCi0gICAqLworICAvLy8gQ2FsbGJhY2sgaW52b2tlZCB3aGVuZXZlciBhIGNoYW5nZSBvY2N1cnMgdGhhdCBtYXkgcmVxdWlyZSB0aGUgY2xpZW50IHRvCisgIC8vLyBwZXJmb3JtIGFuYWx5c2lzLgogICBmaW5hbCBGaWxlVHJhY2tlckNoYW5nZUhvb2sgX2NoYW5nZUhvb2s7CiAKLSAgLyoqCi0gICAqIFRoZSBsb2dnZXIgdG8gd3JpdGUgcGVyZm9ybWVkIG9wZXJhdGlvbnMgYW5kIHBlcmZvcm1hbmNlIHRvLgotICAgKi8KKyAgLy8vIFRoZSBsb2dnZXIgdG8gd3JpdGUgcGVyZm9ybWVkIG9wZXJhdGlvbnMgYW5kIHBlcmZvcm1hbmNlIHRvLgogICBmaW5hbCBQZXJmb3JtYW5jZUxvZyBfbG9nZ2VyOwogCi0gIC8qKgotICAgKiBUaGUgY3VycmVudCBmaWxlIHN5c3RlbSBzdGF0ZS4KLSAgICovCisgIC8vLyBUaGUgY3VycmVudCBmaWxlIHN5c3RlbSBzdGF0ZS4KICAgZmluYWwgRmlsZVN5c3RlbVN0YXRlIF9mc1N0YXRlOwogCi0gIC8qKgotICAgKiBUaGUgc2V0IG9mIGFkZGVkIGZpbGVzLgotICAgKi8KKyAgLy8vIFRoZSBzZXQgb2YgYWRkZWQgZmlsZXMuCiAgIGZpbmFsIGFkZGVkRmlsZXMgPSA8U3RyaW5nPnt9OwogCi0gIC8qKgotICAgKiBUaGUgc2V0IG9mIGZpbGVzIHdlcmUgcmVwb3J0ZWQgYXMgY2hhbmdlZCB0aHJvdWdoIFtjaGFuZ2VGaWxlXSBhbmQgbm90Ci0gICAqIGNoZWNrZWQgZm9yIGFjdHVhbCBjaGFuZ2VzIHlldC4KLSAgICovCisgIC8vLyBUaGUgc2V0IG9mIGZpbGVzIHdlcmUgcmVwb3J0ZWQgYXMgY2hhbmdlZCB0aHJvdWdoIFtjaGFuZ2VGaWxlXSBhbmQgbm90CisgIC8vLyBjaGVja2VkIGZvciBhY3R1YWwgY2hhbmdlcyB5ZXQuCiAgIGZpbmFsIF9jaGFuZ2VkRmlsZXMgPSA8U3RyaW5nPnt9OwogCi0gIC8qKgotICAgKiBUaGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGN1cnJlbnRseSBzY2hlZHVsZWQgZm9yIGFuYWx5c2lzLCB3aGljaCB3ZXJlCi0gICAqIHJlcG9ydGVkIGFzIGNoYW5nZWQgdGhyb3VnaCBbY2hhbmdlRmlsZV0uCi0gICAqLworICAvLy8gVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2NoZWR1bGVkIGZvciBhbmFseXNpcywgd2hpY2ggd2VyZQorICAvLy8gcmVwb3J0ZWQgYXMgY2hhbmdlZCB0aHJvdWdoIFtjaGFuZ2VGaWxlXS4KICAgdmFyIF9wZW5kaW5nQ2hhbmdlZEZpbGVzID0gPFN0cmluZz57fTsKIAotICAvKioKLSAgICogVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2NoZWR1bGVkIGZvciBhbmFseXNpcywgd2hpY2ggZGlyZWN0bHkKLSAgICogaW1wb3J0IGEgY2hhbmdlZCBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IHNjaGVkdWxlZCBmb3IgYW5hbHlzaXMsIHdoaWNoIGRpcmVjdGx5CisgIC8vLyBpbXBvcnQgYSBjaGFuZ2VkIGZpbGUuCiAgIHZhciBfcGVuZGluZ0ltcG9ydEZpbGVzID0gPFN0cmluZz57fTsKIAotICAvKioKLSAgICogVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2NoZWR1bGVkIGZvciBhbmFseXNpcywgd2hpY2ggaGF2ZSBhbgotICAgKiBlcnJvciBvciBhIHdhcm5pbmcsIHdoaWNoIG1pZ2h0IGJlIGZpeGVkIGJ5IGEgY2hhbmdlZCBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IHNjaGVkdWxlZCBmb3IgYW5hbHlzaXMsIHdoaWNoIGhhdmUgYW4KKyAgLy8vIGVycm9yIG9yIGEgd2FybmluZywgd2hpY2ggbWlnaHQgYmUgZml4ZWQgYnkgYSBjaGFuZ2VkIGZpbGUuCiAgIHZhciBfcGVuZGluZ0Vycm9yRmlsZXMgPSA8U3RyaW5nPnt9OwogCi0gIC8qKgotICAgKiBUaGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGN1cnJlbnRseSBzY2hlZHVsZWQgZm9yIGFuYWx5c2lzLCBhbmQgZG9uJ3QKLSAgICogaGF2ZSBhbnkgc3BlY2lhbCByZWxhdGlvbiB3aXRoIGNoYW5nZWQgZmlsZXMuCi0gICAqLworICAvLy8gVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2NoZWR1bGVkIGZvciBhbmFseXNpcywgYW5kIGRvbid0CisgIC8vLyBoYXZlIGFueSBzcGVjaWFsIHJlbGF0aW9uIHdpdGggY2hhbmdlZCBmaWxlcy4KICAgdmFyIF9wZW5kaW5nRmlsZXMgPSA8U3RyaW5nPnt9OwogCiAgIEZpbGVUcmFja2VyKHRoaXMuX2xvZ2dlciwgdGhpcy5fZnNTdGF0ZSwgdGhpcy5fY2hhbmdlSG9vayk7CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhdGggdG8gZXhhY3RseSBvbmUgdGhhdCBuZWVkcyBhbmFseXNpcy4gIFRocm93cyBhIFtTdGF0ZUVycm9yXQotICAgKiBpZiBubyBmaWxlcyBuZWVkIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybnMgdGhlIHBhdGggdG8gZXhhY3RseSBvbmUgdGhhdCBuZWVkcyBhbmFseXNpcy4gIFRocm93cyBhCisgIC8vLyBbU3RhdGVFcnJvcl0gaWYgbm8gZmlsZXMgbmVlZCBhbmFseXNpcy4KICAgU3RyaW5nIGdldCBhbnlQZW5kaW5nRmlsZSB7CiAgICAgaWYgKF9wZW5kaW5nQ2hhbmdlZEZpbGVzLmlzTm90RW1wdHkpIHsKICAgICAgIHJldHVybiBfcGVuZGluZ0NoYW5nZWRGaWxlcy5maXJzdDsKQEAgLTk0LDI3ICs3MiwxOSBAQAogICAgIHJldHVybiBfcGVuZGluZ0ZpbGVzLmZpcnN0OwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBhcmUgYW55IGZpbGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLAotICAgKiBidXQgZm9yIHdoaWNoIHRoZSBpbXBhY3Qgb2YgdGhlIGNoYW5nZXMgaGFzbid0IGJlZW4gbWVhc3VyZWQuCi0gICAqLworICAvLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgZmlsZXMgdGhhdCBoYXZlCisgIC8vLyBjaGFuZ2VkLCBidXQgZm9yIHdoaWNoIHRoZSBpbXBhY3Qgb2YgdGhlIGNoYW5nZXMgaGFzbid0IGJlZW4gbWVhc3VyZWQuCiAgIGJvb2wgZ2V0IGhhc0NoYW5nZWRGaWxlcyA9PiBfY2hhbmdlZEZpbGVzLmlzTm90RW1wdHk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGNoYW5nZWQgZmlsZXMgdGhhdCBuZWVkIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGNoYW5nZWQgZmlsZXMgdGhhdCBuZWVkIGFuYWx5c2lzLgogICBib29sIGdldCBoYXNQZW5kaW5nQ2hhbmdlZEZpbGVzID0+IF9wZW5kaW5nQ2hhbmdlZEZpbGVzLmlzTm90RW1wdHk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGZpbGVzIHRoYXQgaGF2ZSBhbiBlcnJvciBvciB3YXJuaW5nLCBhbmQgdGhhdAotICAgKiBuZWVkIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGZpbGVzIHRoYXQgaGF2ZSBhbiBlcnJvciBvciB3YXJuaW5nLCBhbmQgdGhhdAorICAvLy8gbmVlZCBhbmFseXNpcy4KICAgYm9vbCBnZXQgaGFzUGVuZGluZ0Vycm9yRmlsZXMgPT4gX3BlbmRpbmdFcnJvckZpbGVzLmlzTm90RW1wdHk7CiAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBhcmUgYW55IGZpbGVzIHRoYXQgbmVlZAotICAgKiBhbmFseXNpcy4KLSAgICovCisgIC8vLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBmaWxlcyB0aGF0IG5lZWQKKyAgLy8vIGFuYWx5c2lzLgogICBib29sIGdldCBoYXNQZW5kaW5nRmlsZXMgewogICAgIHJldHVybiBoYXNQZW5kaW5nQ2hhbmdlZEZpbGVzIHx8CiAgICAgICAgIGhhc1BlbmRpbmdJbXBvcnRGaWxlcyB8fApAQCAtMTIyLDE1ICs5MiwxMSBAQAogICAgICAgICBfcGVuZGluZ0ZpbGVzLmlzTm90RW1wdHk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGVyZSBhcmUgZmlsZXMgdGhhdCBkaXJlY3RseSBpbXBvcnQgYSBjaGFuZ2VkIGZpbGUgdGhhdAotICAgKiBuZWVkIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGZpbGVzIHRoYXQgZGlyZWN0bHkgaW1wb3J0IGEgY2hhbmdlZCBmaWxlIHRoYXQKKyAgLy8vIG5lZWQgYW5hbHlzaXMuCiAgIGJvb2wgZ2V0IGhhc1BlbmRpbmdJbXBvcnRGaWxlcyA9PiBfcGVuZGluZ0ltcG9ydEZpbGVzLmlzTm90RW1wdHk7CiAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBjb3VudCBvZiBob3cgbWFueSBmaWxlcyBuZWVkIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybnMgYSBjb3VudCBvZiBob3cgbWFueSBmaWxlcyBuZWVkIGFuYWx5c2lzLgogICBpbnQgZ2V0IG51bWJlck9mUGVuZGluZ0ZpbGVzIHsKICAgICByZXR1cm4gX3BlbmRpbmdDaGFuZ2VkRmlsZXMubGVuZ3RoICsKICAgICAgICAgX3BlbmRpbmdJbXBvcnRGaWxlcy5sZW5ndGggKwpAQCAtMTM4LDkgKzEwNCw3IEBACiAgICAgICAgIF9wZW5kaW5nRmlsZXMubGVuZ3RoOwogICB9CiAKLSAgLyoqCi0gICAqIEFkZHMgdGhlIGdpdmVuIFtwYXRoXSB0byB0aGUgc2V0IG9mICJhZGRlZCBmaWxlcyIuCi0gICAqLworICAvLy8gQWRkcyB0aGUgZ2l2ZW4gW3BhdGhdIHRvIHRoZSBzZXQgb2YgImFkZGVkIGZpbGVzIi4KICAgdm9pZCBhZGRGaWxlKFN0cmluZyBwYXRoKSB7CiAgICAgX2ZzU3RhdGUubWFya0ZpbGVGb3JSZWFkaW5nKHBhdGgpOwogICAgIGFkZGVkRmlsZXMuYWRkKHBhdGgpOwpAQCAtMTQ4LDE4ICsxMTIsMTQgQEAKICAgICBfY2hhbmdlSG9vayhwYXRoKTsKICAgfQogCi0gIC8qKgotICAgKiBBZGRzIHRoZSBnaXZlbiBbcGF0aHNdIHRvIHRoZSBzZXQgb2YgImFkZGVkIGZpbGVzIi4KLSAgICovCisgIC8vLyBBZGRzIHRoZSBnaXZlbiBbcGF0aHNdIHRvIHRoZSBzZXQgb2YgImFkZGVkIGZpbGVzIi4KICAgdm9pZCBhZGRGaWxlcyhJdGVyYWJsZTxTdHJpbmc+IHBhdGhzKSB7CiAgICAgYWRkZWRGaWxlcy5hZGRBbGwocGF0aHMpOwogICAgIF9wZW5kaW5nRmlsZXMuYWRkQWxsKHBhdGhzKTsKICAgICBfY2hhbmdlSG9vayhudWxsKTsKICAgfQogCi0gIC8qKgotICAgKiBBZGRzIHRoZSBnaXZlbiBbcGF0aF0gdG8gdGhlIHNldCBvZiAiY2hhbmdlZCBmaWxlcyIuCi0gICAqLworICAvLy8gQWRkcyB0aGUgZ2l2ZW4gW3BhdGhdIHRvIHRoZSBzZXQgb2YgImNoYW5nZWQgZmlsZXMiLgogICB2b2lkIGNoYW5nZUZpbGUoU3RyaW5nIHBhdGgpIHsKICAgICBfY2hhbmdlZEZpbGVzLmFkZChwYXRoKTsKICAgICBpZiAoYWRkZWRGaWxlcy5jb250YWlucyhwYXRoKSkgewpAQCAtMTY5LDExICsxMjksOSBAQAogICAgIF9jaGFuZ2VIb29rKHBhdGgpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlbW92ZXMgdGhlIGdpdmVuIFtwYXRoXSBmcm9tIHRoZSBzZXQgb2YgInBlbmRpbmcgZmlsZXMiLgotICAgKgotICAgKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBjbGllbnQgaGFzIGFuYWx5emVkIGEgZmlsZS4KLSAgICovCisgIC8vLyBSZW1vdmVzIHRoZSBnaXZlbiBbcGF0aF0gZnJvbSB0aGUgc2V0IG9mICJwZW5kaW5nIGZpbGVzIi4KKyAgLy8vCisgIC8vLyBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBjbGllbnQgaGFzIGFuYWx5emVkIGEgZmlsZS4KICAgdm9pZCBmaWxlV2FzQW5hbHl6ZWQoU3RyaW5nIHBhdGgpIHsKICAgICBfcGVuZGluZ0NoYW5nZWRGaWxlcy5yZW1vdmUocGF0aCk7CiAgICAgX3BlbmRpbmdJbXBvcnRGaWxlcy5yZW1vdmUocGF0aCk7CkBAIC0xODEsMTAgKzEzOSw4IEBACiAgICAgX3BlbmRpbmdGaWxlcy5yZW1vdmUocGF0aCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBbcGF0aF0gcG9pbnRzIHRvIGEgZmlsZSB0aGF0Ci0gICAqIHJlcXVpcmVzIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gW3BhdGhdIHBvaW50cyB0byBhIGZpbGUKKyAgLy8vIHRoYXQgcmVxdWlyZXMgYW5hbHlzaXMuCiAgIGJvb2wgaXNGaWxlUGVuZGluZyhTdHJpbmcgcGF0aCkgewogICAgIHJldHVybiBfcGVuZGluZ0NoYW5nZWRGaWxlcy5jb250YWlucyhwYXRoKSB8fAogICAgICAgICBfcGVuZGluZ0ltcG9ydEZpbGVzLmNvbnRhaW5zKHBhdGgpIHx8CkBAIC0xOTIsOSArMTQ4LDcgQEAKICAgICAgICAgX3BlbmRpbmdGaWxlcy5jb250YWlucyhwYXRoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBbcGF0aF0gZnJvbSB0aGUgc2V0IG9mICJhZGRlZCBmaWxlcyIuCi0gICAqLworICAvLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gW3BhdGhdIGZyb20gdGhlIHNldCBvZiAiYWRkZWQgZmlsZXMiLgogICB2b2lkIHJlbW92ZUZpbGUoU3RyaW5nIHBhdGgpIHsKICAgICBhZGRlZEZpbGVzLnJlbW92ZShwYXRoKTsKICAgICBfcGVuZGluZ0NoYW5nZWRGaWxlcy5yZW1vdmUocGF0aCk7CkBAIC0yMDgsMTcgKzE2MiwxMyBAQAogICAgIF9jaGFuZ2VIb29rKHBhdGgpOwogICB9CiAKLSAgLyoqCi0gICAqIFNjaGVkdWxlIGFsbCBhZGRlZCBmaWxlcyBmb3IgYW5hbHlzaXMuCi0gICAqLworICAvLy8gU2NoZWR1bGUgYWxsIGFkZGVkIGZpbGVzIGZvciBhbmFseXNpcy4KICAgdm9pZCBzY2hlZHVsZUFsbEFkZGVkRmlsZXMoKSB7CiAgICAgX3BlbmRpbmdGaWxlcy5hZGRBbGwoYWRkZWRGaWxlcyk7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoZSBBUEkgc2lnbmF0dXJlIGZvciB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbcGF0aF0sIGFuZCBkZWNpZGUKLSAgICogd2hpY2ggbGlua2VkIGxpYnJhcmllcyBzaG91bGQgYmUgaW52YWxpZGF0ZWQsIGFuZCBmaWxlcyByZWFuYWx5emVkLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGUgQVBJIHNpZ25hdHVyZSBmb3IgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW3BhdGhdLCBhbmQgZGVjaWRlCisgIC8vLyB3aGljaCBsaW5rZWQgbGlicmFyaWVzIHNob3VsZCBiZSBpbnZhbGlkYXRlZCwgYW5kIGZpbGVzIHJlYW5hbHl6ZWQuCiAgIEZpbGVTdGF0ZSB2ZXJpZnlBcGlTaWduYXR1cmUoU3RyaW5nIHBhdGgpIHsKICAgICByZXR1cm4gX2xvZ2dlci5ydW4oJ1ZlcmlmeSBBUEkgc2lnbmF0dXJlIG9mICRwYXRoJywgKCkgewogICAgICAgX2xvZ2dlci53cml0ZWxuKCdXb3JrIGluICR7X2ZzU3RhdGUuY29udGV4dE5hbWV9Jyk7CkBAIC0yODYsMTIgKzIzNiwxMCBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIElmIGF0IGxlYXN0IG9uZSBmaWxlIGlzIGluIHRoZSAiY2hhbmdlZCBmaWxlcyIgc2V0LCBkZXRlcm1pbmVzIHRoZSBpbXBhY3QKLSAgICogb2YgdGhlIGNoYW5nZSwgdXBkYXRlcyB0aGUgc2V0IG9mIHBlbmRpbmcgZmlsZXMsIGFuZCByZXR1cm5zIGB0cnVlYC4KLSAgICoKLSAgICogSWYgbm8gZmlsZXMgYXJlIGluIHRoZSAiY2hhbmdlZCBmaWxlcyIgc2V0LCByZXR1cm5zIGBmYWxzZWAuCi0gICAqLworICAvLy8gSWYgYXQgbGVhc3Qgb25lIGZpbGUgaXMgaW4gdGhlICJjaGFuZ2VkIGZpbGVzIiBzZXQsIGRldGVybWluZXMgdGhlIGltcGFjdAorICAvLy8gb2YgdGhlIGNoYW5nZSwgdXBkYXRlcyB0aGUgc2V0IG9mIHBlbmRpbmcgZmlsZXMsIGFuZCByZXR1cm5zIGB0cnVlYC4KKyAgLy8vCisgIC8vLyBJZiBubyBmaWxlcyBhcmUgaW4gdGhlICJjaGFuZ2VkIGZpbGVzIiBzZXQsIHJldHVybnMgYGZhbHNlYC4KICAgYm9vbCB2ZXJpZnlDaGFuZ2VkRmlsZXNJZk5lZWRlZCgpIHsKICAgICAvLyBWZXJpZnkgYWxsIGNoYW5nZWQgZmlsZXMgb25lIGF0IGEgdGltZS4KICAgICBpZiAoX2NoYW5nZWRGaWxlcy5pc05vdEVtcHR5KSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2luZGV4LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2luZGV4LmRhcnQKaW5kZXggODE2Njg1ZC4uNjMwZTM5NSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9pbmRleC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvaW5kZXguZGFydApAQCAtNTcsMTAgKzU3LDggQEAKICAgcmV0dXJuIGVsZW1lbnQ7CiB9CiAKLS8qKgotICogUmV0dXJuIHRoZSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0gdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgW2VsZW1lbnRdLgotICogVGhyb3cgW1N0YXRlRXJyb3JdIGlmIHRoZSBbZWxlbWVudF0gaXMgbm90IGxpbmtlZCBpbnRvIGEgdW5pdC4KLSAqLworLy8vIFJldHVybiB0aGUgW0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRdIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIFtlbGVtZW50XS4KKy8vLyBUaHJvdyBbU3RhdGVFcnJvcl0gaWYgdGhlIFtlbGVtZW50XSBpcyBub3QgbGlua2VkIGludG8gYSB1bml0LgogQ29tcGlsYXRpb25Vbml0RWxlbWVudCBnZXRVbml0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKICAgZm9yIChFbGVtZW50IGUgPSBlbGVtZW50OyBlICE9IG51bGw7IGUgPSBlLmVuY2xvc2luZ0VsZW1lbnQpIHsKICAgICBpZiAoZSBpcyBDb21waWxhdGlvblVuaXRFbGVtZW50KSB7CkBAIC03Myw5ICs3MSw3IEBACiAgIHRocm93IFN0YXRlRXJyb3IoJ0VsZW1lbnQgbm90IGNvbnRhaW5lZCBpbiBjb21waWxhdGlvbiB1bml0OiAkZWxlbWVudCcpOwogfQogCi0vKioKLSAqIEluZGV4IHRoZSBbdW5pdF0gaW50byBhIG5ldyBbQW5hbHlzaXNEcml2ZXJVbml0SW5kZXhCdWlsZGVyXS4KLSAqLworLy8vIEluZGV4IHRoZSBbdW5pdF0gaW50byBhIG5ldyBbQW5hbHlzaXNEcml2ZXJVbml0SW5kZXhCdWlsZGVyXS4KIEFuYWx5c2lzRHJpdmVyVW5pdEluZGV4QnVpbGRlciBpbmRleFVuaXQoQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKICAgcmV0dXJuIF9JbmRleEFzc2VtYmxlcigpLmFzc2VtYmxlKHVuaXQpOwogfQpAQCAtMTIzLDExICsxMTksMTAgQEAKICAgfSk7CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudCB0aGF0IGlzIGFjdHVhbGx5IHB1dCBpbnRvIGluZGV4IGZvciBzb21lIG90aGVyCi0gKiByZWxhdGVkIGVsZW1lbnQuIEZvciBleGFtcGxlIGZvciBhIHN5bnRoZXRpYyBnZXR0ZXIgdGhpcyBpcyB0aGUgY29ycmVzcG9uZGluZwotICogbm9uLXN5bnRoZXRpYyBmaWVsZCBhbmQgW0luZGV4U3ludGhldGljRWxlbWVudEtpbmQuZ2V0dGVyXSBhcyB0aGUgW2tpbmRdLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudCB0aGF0IGlzIGFjdHVhbGx5IHB1dCBpbnRvIGluZGV4IGZvciBzb21lIG90aGVyCisvLy8gcmVsYXRlZCBlbGVtZW50LiBGb3IgZXhhbXBsZSBmb3IgYSBzeW50aGV0aWMgZ2V0dGVyIHRoaXMgaXMgdGhlCisvLy8gY29ycmVzcG9uZGluZyBub24tc3ludGhldGljIGZpZWxkIGFuZCBbSW5kZXhTeW50aGV0aWNFbGVtZW50S2luZC5nZXR0ZXJdIGFzCisvLy8gdGhlIFtraW5kXS4KIGNsYXNzIEluZGV4RWxlbWVudEluZm8gewogICBmaW5hbCBFbGVtZW50IGVsZW1lbnQ7CiAgIGZpbmFsIEluZGV4U3ludGhldGljRWxlbWVudEtpbmQga2luZDsKQEAgLTE4OSw1MSArMTg0LDM1IEBACiAgIEluZGV4RWxlbWVudEluZm8uXyh0aGlzLmVsZW1lbnQsIHRoaXMua2luZCk7CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudCByZWZlcmVuY2VkIGluIGluZGV4LgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudCByZWZlcmVuY2VkIGluIGluZGV4LgogY2xhc3MgX0VsZW1lbnRJbmZvIHsKLSAgLyoqCi0gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0gY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCi0gICAqLworICAvLy8gVGhlIGlkZW50aWZpZXIgb2YgdGhlIFtDb21waWxhdGlvblVuaXRFbGVtZW50XSBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KICAgZmluYWwgaW50IHVuaXRJZDsKIAotICAvKioKLSAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRvcC1sZXZlbCBuYW1lLCBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMgYQotICAgKiByZWZlcmVuY2UgdG8gdGhlIHVuaXQuCi0gICAqLworICAvLy8gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHRvcC1sZXZlbCBuYW1lLCBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMgYQorICAvLy8gcmVmZXJlbmNlIHRvIHRoZSB1bml0LgogICBmaW5hbCBfU3RyaW5nSW5mbyBuYW1lSWRVbml0TWVtYmVyOwogCi0gIC8qKgotICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MgbWVtYmVyIG5hbWUsIG9yIGBudWxsYCBpZiB0aGUgZWxlbWVudCBpcyBub3QgYQotICAgKiBjbGFzcyBtZW1iZXIgb3IgYSBuYW1lZCBwYXJhbWV0ZXIgb2YgYSBjbGFzcyBtZW1iZXIuCi0gICAqLworICAvLy8gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzIG1lbWJlciBuYW1lLCBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGEKKyAgLy8vIGNsYXNzIG1lbWJlciBvciBhIG5hbWVkIHBhcmFtZXRlciBvZiBhIGNsYXNzIG1lbWJlci4KICAgZmluYWwgX1N0cmluZ0luZm8gbmFtZUlkQ2xhc3NNZW1iZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBuYW1lZCBwYXJhbWV0ZXIgbmFtZSwgb3IgYG51bGxgIGlmIHRoZSBlbGVtZW50IGlzIG5vdAotICAgKiBhIG5hbWVkIHBhcmFtZXRlci4KLSAgICovCisgIC8vLyBUaGUgaWRlbnRpZmllciBvZiB0aGUgbmFtZWQgcGFyYW1ldGVyIG5hbWUsIG9yIGBudWxsYCBpZiB0aGUgZWxlbWVudCBpcworICAvLy8gbm90IGEgbmFtZWQgcGFyYW1ldGVyLgogICBmaW5hbCBfU3RyaW5nSW5mbyBuYW1lSWRQYXJhbWV0ZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBraW5kIG9mIHRoZSBlbGVtZW50LgotICAgKi8KKyAgLy8vIFRoZSBraW5kIG9mIHRoZSBlbGVtZW50LgogICBmaW5hbCBJbmRleFN5bnRoZXRpY0VsZW1lbnRLaW5kIGtpbmQ7CiAKLSAgLyoqCi0gICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGVsZW1lbnQuICBJdCBpcyBzZXQgYWZ0ZXIgaW5kZXhpbmcgb2YgdGhlIHdob2xlCi0gICAqIHBhY2thZ2UgaXMgZG9uZSBhbmQgd2UgYXJlIGFzc2VtYmxpbmcgdGhlIGZ1bGwgcGFja2FnZSBpbmRleC4KLSAgICovCisgIC8vLyBUaGUgdW5pcXVlIGlkIG9mIHRoZSBlbGVtZW50LiAgSXQgaXMgc2V0IGFmdGVyIGluZGV4aW5nIG9mIHRoZSB3aG9sZQorICAvLy8gcGFja2FnZSBpcyBkb25lIGFuZCB3ZSBhcmUgYXNzZW1ibGluZyB0aGUgZnVsbCBwYWNrYWdlIGluZGV4LgogICBpbnQgaWQ7CiAKICAgX0VsZW1lbnRJbmZvKHRoaXMudW5pdElkLCB0aGlzLm5hbWVJZFVuaXRNZW1iZXIsIHRoaXMubmFtZUlkQ2xhc3NNZW1iZXIsCiAgICAgICB0aGlzLm5hbWVJZFBhcmFtZXRlciwgdGhpcy5raW5kKTsKIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSByZWxhdGlvbiBpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcmVsYXRpb24gaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4KIGNsYXNzIF9FbGVtZW50UmVsYXRpb25JbmZvIHsKICAgZmluYWwgX0VsZW1lbnRJbmZvIGVsZW1lbnRJbmZvOwogICBmaW5hbCBJbmRleFJlbGF0aW9uS2luZCBraW5kOwpAQCAtMjQ1LDczICsyMjQsNTEgQEAKICAgICAgIHRoaXMuZWxlbWVudEluZm8sIHRoaXMua2luZCwgdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoLCB0aGlzLmlzUXVhbGlmaWVkKTsKIH0KIAotLyoqCi0gKiBBc3NlbWJsZXIgb2YgYSBzaW5nbGUgW0NvbXBpbGF0aW9uVW5pdF0gaW5kZXguCi0gKgotICogVGhlIGludGVuZGVkIHVzYWdlIHNlcXVlbmNlOgotICoKLSAqICAtIENhbGwgW2FkZEVsZW1lbnRSZWxhdGlvbl0gZm9yIGVhY2ggZWxlbWVudCByZWxhdGlvbiBmb3VuZCBpbiB0aGUgdW5pdC4KLSAqICAtIENhbGwgW2FkZE5hbWVSZWxhdGlvbl0gZm9yIGVhY2ggbmFtZSByZWxhdGlvbiBmb3VuZCBpbiB0aGUgdW5pdC4KLSAqICAtIEFzc2lnbiBpZHMgdG8gYWxsIHRoZSBbX0VsZW1lbnRJbmZvXSBpbiBbZWxlbWVudFJlbGF0aW9uc10uCi0gKiAgLSBDYWxsIFthc3NlbWJsZV0gdG8gcHJvZHVjZSB0aGUgZmluYWwgdW5pdCBpbmRleC4KLSAqLworLy8vIEFzc2VtYmxlciBvZiBhIHNpbmdsZSBbQ29tcGlsYXRpb25Vbml0XSBpbmRleC4KKy8vLworLy8vIFRoZSBpbnRlbmRlZCB1c2FnZSBzZXF1ZW5jZToKKy8vLworLy8vICAtIENhbGwgW2FkZEVsZW1lbnRSZWxhdGlvbl0gZm9yIGVhY2ggZWxlbWVudCByZWxhdGlvbiBmb3VuZCBpbiB0aGUgdW5pdC4KKy8vLyAgLSBDYWxsIFthZGROYW1lUmVsYXRpb25dIGZvciBlYWNoIG5hbWUgcmVsYXRpb24gZm91bmQgaW4gdGhlIHVuaXQuCisvLy8gIC0gQXNzaWduIGlkcyB0byBhbGwgdGhlIFtfRWxlbWVudEluZm9dIGluIFtlbGVtZW50UmVsYXRpb25zXS4KKy8vLyAgLSBDYWxsIFthc3NlbWJsZV0gdG8gcHJvZHVjZSB0aGUgZmluYWwgdW5pdCBpbmRleC4KIGNsYXNzIF9JbmRleEFzc2VtYmxlciB7Ci0gIC8qKgotICAgKiBUaGUgc3RyaW5nIHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgYG51bGxgIHN0cmluZy4KLSAgICovCisgIC8vLyBUaGUgc3RyaW5nIHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgYG51bGxgIHN0cmluZy4KICAgc3RhdGljIGNvbnN0IE5VTExfU1RSSU5HID0gJy0tbnVsbFN0cmluZy0tJzsKIAotICAvKioKLSAgICogTWFwIGFzc29jaWF0aW5nIHJlZmVyZW5jZWQgZWxlbWVudHMgd2l0aCB0aGVpciBbX0VsZW1lbnRJbmZvXXMuCi0gICAqLworICAvLy8gTWFwIGFzc29jaWF0aW5nIHJlZmVyZW5jZWQgZWxlbWVudHMgd2l0aCB0aGVpciBbX0VsZW1lbnRJbmZvXXMuCiAgIGZpbmFsIE1hcDxFbGVtZW50LCBfRWxlbWVudEluZm8+IGVsZW1lbnRNYXAgPSB7fTsKIAotICAvKioKLSAgICogTWFwIGFzc29jaWF0aW5nIFtDb21waWxhdGlvblVuaXRFbGVtZW50XXMgd2l0aCB0aGVpciBpZGVudGlmaWVycywgd2hpY2gKLSAgICogYXJlIGluZGljZXMgaW50byBbdW5pdExpYnJhcnlVcmlzXSBhbmQgW3VuaXRVbml0VXJpc10uCi0gICAqLworICAvLy8gTWFwIGFzc29jaWF0aW5nIFtDb21waWxhdGlvblVuaXRFbGVtZW50XXMgd2l0aCB0aGVpciBpZGVudGlmaWVycywgd2hpY2gKKyAgLy8vIGFyZSBpbmRpY2VzIGludG8gW3VuaXRMaWJyYXJ5VXJpc10gYW5kIFt1bml0VW5pdFVyaXNdLgogICBmaW5hbCBNYXA8Q29tcGlsYXRpb25Vbml0RWxlbWVudCwgaW50PiB1bml0TWFwID0ge307CiAKLSAgLyoqCi0gICAqIFRoZSBmaWVsZHMgW3VuaXRMaWJyYXJ5VXJpc10gYW5kIFt1bml0VW5pdFVyaXNdIGFyZSB1c2VkIHRvZ2V0aGVyIHRvCi0gICAqIGRlc2NyaWJlIGVhY2ggdW5pcXVlIFtDb21waWxhdGlvblVuaXRFbGVtZW50XS4KLSAgICoKLSAgICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgbGlicmFyeSBVUkkgb2YgYSB1bml0LgotICAgKi8KKyAgLy8vIFRoZSBmaWVsZHMgW3VuaXRMaWJyYXJ5VXJpc10gYW5kIFt1bml0VW5pdFVyaXNdIGFyZSB1c2VkIHRvZ2V0aGVyIHRvCisgIC8vLyBkZXNjcmliZSBlYWNoIHVuaXF1ZSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0uCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjb250YWlucyB0aGUgbGlicmFyeSBVUkkgb2YgYSB1bml0LgogICBmaW5hbCBMaXN0PF9TdHJpbmdJbmZvPiB1bml0TGlicmFyeVVyaXMgPSBbXTsKIAotICAvKioKLSAgICogVGhlIGZpZWxkcyBbdW5pdExpYnJhcnlVcmlzXSBhbmQgW3VuaXRVbml0VXJpc10gYXJlIHVzZWQgdG9nZXRoZXIgdG8KLSAgICogZGVzY3JpYmUgZWFjaCB1bmlxdWUgW0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRdLgotICAgKgotICAgKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSB1bml0IFVSSSBvZiBhIHVuaXQsIHdoaWNoIG1pZ2h0IGJlIHRoZSBzYW1lIGFzCi0gICAqIHRoZSBsaWJyYXJ5IFVSSSBmb3IgdGhlIGRlZmluaW5nIHVuaXQsIG9yIGEgZGlmZmVyZW50IG9uZSBmb3IgYSBwYXJ0LgotICAgKi8KKyAgLy8vIFRoZSBmaWVsZHMgW3VuaXRMaWJyYXJ5VXJpc10gYW5kIFt1bml0VW5pdFVyaXNdIGFyZSB1c2VkIHRvZ2V0aGVyIHRvCisgIC8vLyBkZXNjcmliZSBlYWNoIHVuaXF1ZSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0uCisgIC8vLworICAvLy8gVGhpcyBmaWVsZCBjb250YWlucyB0aGUgdW5pdCBVUkkgb2YgYSB1bml0LCB3aGljaCBtaWdodCBiZSB0aGUgc2FtZSBhcworICAvLy8gdGhlIGxpYnJhcnkgVVJJIGZvciB0aGUgZGVmaW5pbmcgdW5pdCwgb3IgYSBkaWZmZXJlbnQgb25lIGZvciBhIHBhcnQuCiAgIGZpbmFsIExpc3Q8X1N0cmluZ0luZm8+IHVuaXRVbml0VXJpcyA9IFtdOwogCi0gIC8qKgotICAgKiBNYXAgYXNzb2NpYXRpbmcgc3RyaW5ncyB3aXRoIHRoZWlyIFtfU3RyaW5nSW5mb11zLgotICAgKi8KKyAgLy8vIE1hcCBhc3NvY2lhdGluZyBzdHJpbmdzIHdpdGggdGhlaXIgW19TdHJpbmdJbmZvXXMuCiAgIGZpbmFsIE1hcDxTdHJpbmcsIF9TdHJpbmdJbmZvPiBzdHJpbmdNYXAgPSB7fTsKIAotICAvKioKLSAgICogQWxsIGVsZW1lbnQgcmVsYXRpb25zLgotICAgKi8KKyAgLy8vIEFsbCBlbGVtZW50IHJlbGF0aW9ucy4KICAgZmluYWwgTGlzdDxfRWxlbWVudFJlbGF0aW9uSW5mbz4gZWxlbWVudFJlbGF0aW9ucyA9IFtdOwogCi0gIC8qKgotICAgKiBBbGwgdW5yZXNvbHZlZCBuYW1lIHJlbGF0aW9ucy4KLSAgICovCisgIC8vLyBBbGwgdW5yZXNvbHZlZCBuYW1lIHJlbGF0aW9ucy4KICAgZmluYWwgTGlzdDxfTmFtZVJlbGF0aW9uSW5mbz4gbmFtZVJlbGF0aW9ucyA9IFtdOwogCi0gIC8qKgotICAgKiBBbGwgc3VidHlwZXMgZGVjbGFyZWQgaW4gdGhlIHVuaXQuCi0gICAqLworICAvLy8gQWxsIHN1YnR5cGVzIGRlY2xhcmVkIGluIHRoZSB1bml0LgogICBmaW5hbCBMaXN0PF9TdWJ0eXBlSW5mbz4gc3VidHlwZXMgPSBbXTsKIAotICAvKioKLSAgICogVGhlIFtfU3RyaW5nSW5mb10gdG8gdXNlIGZvciBgbnVsbGAgc3RyaW5ncy4KLSAgICovCisgIC8vLyBUaGUgW19TdHJpbmdJbmZvXSB0byB1c2UgZm9yIGBudWxsYCBzdHJpbmdzLgogICBfU3RyaW5nSW5mbyBudWxsU3RyaW5nOwogCiAgIF9JbmRleEFzc2VtYmxlcigpIHsKQEAgLTM0Myw5ICszMDAsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBJbmRleCB0aGUgW3VuaXRdIGFuZCBhc3NlbWJsZSBhIG5ldyBbQW5hbHlzaXNEcml2ZXJVbml0SW5kZXhCdWlsZGVyXS4KLSAgICovCisgIC8vLyBJbmRleCB0aGUgW3VuaXRdIGFuZCBhc3NlbWJsZSBhIG5ldyBbQW5hbHlzaXNEcml2ZXJVbml0SW5kZXhCdWlsZGVyXS4KICAgQW5hbHlzaXNEcml2ZXJVbml0SW5kZXhCdWlsZGVyIGFzc2VtYmxlKENvbXBpbGF0aW9uVW5pdCB1bml0KSB7CiAgICAgdW5pdC5hY2NlcHQoX0luZGV4Q29udHJpYnV0b3IodGhpcykpOwogCkBAIC00MjIsMTAgKzM3Nyw4IEBACiAgICAgICAgIH0pLnRvTGlzdCgpKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHVuaXF1ZSBbX0VsZW1lbnRJbmZvXSBjb3JyZXNwb25kaW5nIHRoZSBbZWxlbWVudF0uICBUaGUgZmllbGQKLSAgICogW19FbGVtZW50SW5mby5pZF0gaXMgZmlsbGVkIGJ5IFthc3NlbWJsZV0gZHVyaW5nIGZpbmFsIHNvcnRpbmcuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB1bmlxdWUgW19FbGVtZW50SW5mb10gY29ycmVzcG9uZGluZyB0aGUgW2VsZW1lbnRdLiAgVGhlIGZpZWxkCisgIC8vLyBbX0VsZW1lbnRJbmZvLmlkXSBpcyBmaWxsZWQgYnkgW2Fzc2VtYmxlXSBkdXJpbmcgZmluYWwgc29ydGluZy4KICAgX0VsZW1lbnRJbmZvIF9nZXRFbGVtZW50SW5mbyhFbGVtZW50IGVsZW1lbnQpIHsKICAgICBlbGVtZW50ID0gZWxlbWVudC5kZWNsYXJhdGlvbjsKICAgICByZXR1cm4gZWxlbWVudE1hcC5wdXRJZkFic2VudChlbGVtZW50LCAoKSB7CkBAIC00MzUsMTAgKzM4OCw4IEBACiAgICAgfSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB1bmlxdWUgW19TdHJpbmdJbmZvXSBjb3JyZXNwb25kaW5nIHRoZSBnaXZlbiBbc3RyaW5nXS4gIFRoZQotICAgKiBmaWVsZCBbX1N0cmluZ0luZm8uaWRdIGlzIGZpbGxlZCBieSBbYXNzZW1ibGVdIGR1cmluZyBmaW5hbCBzb3J0aW5nLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgdW5pcXVlIFtfU3RyaW5nSW5mb10gY29ycmVzcG9uZGluZyB0aGUgZ2l2ZW4gW3N0cmluZ10uICBUaGUKKyAgLy8vIGZpZWxkIFtfU3RyaW5nSW5mby5pZF0gaXMgZmlsbGVkIGJ5IFthc3NlbWJsZV0gZHVyaW5nIGZpbmFsIHNvcnRpbmcuCiAgIF9TdHJpbmdJbmZvIF9nZXRTdHJpbmdJbmZvKFN0cmluZyBzdHJpbmcpIHsKICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsU3RyaW5nOwpAQCAtNDQ5LDExICs0MDAsOSBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBbdW5pdEVsZW1lbnRdIHRvIFt1bml0VW5pdFVyaXNdIGFuZAotICAgKiBbdW5pdExpYnJhcnlVcmlzXSBpZiBuZWNlc3NhcnksIGFuZCByZXR1cm4gdGhlIGxvY2F0aW9uIGluIHRob3NlCi0gICAqIGFycmF5cyByZXByZXNlbnRpbmcgW3VuaXRFbGVtZW50XS4KLSAgICovCisgIC8vLyBBZGQgaW5mb3JtYXRpb24gYWJvdXQgW3VuaXRFbGVtZW50XSB0byBbdW5pdFVuaXRVcmlzXSBhbmQKKyAgLy8vIFt1bml0TGlicmFyeVVyaXNdIGlmIG5lY2Vzc2FyeSwgYW5kIHJldHVybiB0aGUgbG9jYXRpb24gaW4gdGhvc2UKKyAgLy8vIGFycmF5cyByZXByZXNlbnRpbmcgW3VuaXRFbGVtZW50XS4KICAgaW50IF9nZXRVbml0SWQoQ29tcGlsYXRpb25Vbml0RWxlbWVudCB1bml0RWxlbWVudCkgewogICAgIHJldHVybiB1bml0TWFwLnB1dElmQWJzZW50KHVuaXRFbGVtZW50LCAoKSB7CiAgICAgICBhc3NlcnQodW5pdExpYnJhcnlVcmlzLmxlbmd0aCA9PSB1bml0VW5pdFVyaXMubGVuZ3RoKTsKQEAgLTQ2NCwxOSArNDEzLDE1IEBACiAgICAgfSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB1bmlxdWUgW19TdHJpbmdJbmZvXSBjb3JyZXNwb25kaW5nIFt1cmldLiAgVGhlIGZpZWxkCi0gICAqIFtfU3RyaW5nSW5mby5pZF0gaXMgZmlsbGVkIGJ5IFthc3NlbWJsZV0gZHVyaW5nIGZpbmFsIHNvcnRpbmcuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB1bmlxdWUgW19TdHJpbmdJbmZvXSBjb3JyZXNwb25kaW5nIFt1cmldLiAgVGhlIGZpZWxkCisgIC8vLyBbX1N0cmluZ0luZm8uaWRdIGlzIGZpbGxlZCBieSBbYXNzZW1ibGVdIGR1cmluZyBmaW5hbCBzb3J0aW5nLgogICBfU3RyaW5nSW5mbyBfZ2V0VXJpSW5mbyhVcmkgdXJpKSB7CiAgICAgU3RyaW5nIHN0ciA9IHVyaS50b1N0cmluZygpOwogICAgIHJldHVybiBfZ2V0U3RyaW5nSW5mbyhzdHIpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIG5ldyBbX0VsZW1lbnRJbmZvXSBmb3IgdGhlIGdpdmVuIFtlbGVtZW50XSBpbiB0aGUgZ2l2ZW4gW3VuaXRJZF0uCi0gICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYywgc28gaXQgY2Fubm90IGFkZCBhbnkgaW5mb3JtYXRpb24gdG8gdGhlIGluZGV4LgotICAgKi8KKyAgLy8vIFJldHVybiBhIG5ldyBbX0VsZW1lbnRJbmZvXSBmb3IgdGhlIGdpdmVuIFtlbGVtZW50XSBpbiB0aGUgZ2l2ZW4gW3VuaXRJZF0uCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBzdGF0aWMsIHNvIGl0IGNhbm5vdCBhZGQgYW55IGluZm9ybWF0aW9uIHRvIHRoZSBpbmRleC4KICAgX0VsZW1lbnRJbmZvIF9uZXdFbGVtZW50SW5mbyhpbnQgdW5pdElkLCBFbGVtZW50IGVsZW1lbnQpIHsKICAgICBJbmRleEVsZW1lbnRJbmZvIGluZm8gPSBJbmRleEVsZW1lbnRJbmZvKGVsZW1lbnQpOwogICAgIGVsZW1lbnQgPSBpbmZvLmVsZW1lbnQ7CkBAIC00OTIsOSArNDM3LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFZpc2l0cyBhIHJlc29sdmVkIEFTVCBhbmQgYWRkcyByZWxhdGlvbnNoaXBzIGludG8gdGhlIFthc3NlbWJsZXJdLgotICovCisvLy8gVmlzaXRzIGEgcmVzb2x2ZWQgQVNUIGFuZCBhZGRzIHJlbGF0aW9uc2hpcHMgaW50byB0aGUgW2Fzc2VtYmxlcl0uCiBjbGFzcyBfSW5kZXhDb250cmlidXRvciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3IgewogICBmaW5hbCBfSW5kZXhBc3NlbWJsZXIgYXNzZW1ibGVyOwogCkBAIC01MDQsOSArNDQ3LDcgQEAKICAgICBfcmVjb3JkSXNBbmNlc3Rvck9mKGRlc2NlbmRhbnQsIGRlc2NlbmRhbnQsIGZhbHNlLCA8Q2xhc3NFbGVtZW50PltdKTsKICAgfQogCi0gIC8qKgotICAgKiBSZWNvcmQgdGhhdCB0aGUgbmFtZSBbbm9kZV0gaGFzIGEgcmVsYXRpb24gb2YgdGhlIGdpdmVuIFtraW5kXS4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhhdCB0aGUgbmFtZSBbbm9kZV0gaGFzIGEgcmVsYXRpb24gb2YgdGhlIGdpdmVuIFtraW5kXS4KICAgdm9pZCByZWNvcmROYW1lUmVsYXRpb24oCiAgICAgICBTaW1wbGVJZGVudGlmaWVyIG5vZGUsIEluZGV4UmVsYXRpb25LaW5kIGtpbmQsIGJvb2wgaXNRdWFsaWZpZWQpIHsKICAgICBpZiAobm9kZSAhPSBudWxsKSB7CkBAIC01MTQsMTkgKzQ1NSwxNSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZWNvcmQgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBvcGVyYXRvciBbRWxlbWVudF0uCi0gICAqLworICAvLy8gUmVjb3JkIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gb3BlcmF0b3IgW0VsZW1lbnRdLgogICB2b2lkIHJlY29yZE9wZXJhdG9yUmVmZXJlbmNlKFRva2VuIG9wZXJhdG9yLCBFbGVtZW50IGVsZW1lbnQpIHsKICAgICByZWNvcmRSZWxhdGlvblRva2VuKGVsZW1lbnQsIEluZGV4UmVsYXRpb25LaW5kLklTX0lOVk9LRURfQlksIG9wZXJhdG9yKTsKICAgfQogCi0gIC8qKgotICAgKiBSZWNvcmQgdGhhdCBbZWxlbWVudF0gaGFzIGEgcmVsYXRpb24gb2YgdGhlIGdpdmVuIFtraW5kXSBhdCB0aGUgbG9jYXRpb24KLSAgICogb2YgdGhlIGdpdmVuIFtub2RlXS4gIFRoZSBmbGFnIFtpc1F1YWxpZmllZF0gaXMgYHRydWVgIGlmIFtub2RlXSBoYXMgYW4KLSAgICogZXhwbGljaXQgb3IgaW1wbGljaXQgcXVhbGlmaWVyLCBzbyBjYW5ub3QgYmUgc2hhZG93ZWQgYnkgYSBsb2NhbAotICAgKiBkZWNsYXJhdGlvbi4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhhdCBbZWxlbWVudF0gaGFzIGEgcmVsYXRpb24gb2YgdGhlIGdpdmVuIFtraW5kXSBhdCB0aGUgbG9jYXRpb24KKyAgLy8vIG9mIHRoZSBnaXZlbiBbbm9kZV0uICBUaGUgZmxhZyBbaXNRdWFsaWZpZWRdIGlzIGB0cnVlYCBpZiBbbm9kZV0gaGFzIGFuCisgIC8vLyBleHBsaWNpdCBvciBpbXBsaWNpdCBxdWFsaWZpZXIsIHNvIGNhbm5vdCBiZSBzaGFkb3dlZCBieSBhIGxvY2FsCisgIC8vLyBkZWNsYXJhdGlvbi4KICAgdm9pZCByZWNvcmRSZWxhdGlvbigKICAgICAgIEVsZW1lbnQgZWxlbWVudCwgSW5kZXhSZWxhdGlvbktpbmQga2luZCwgQXN0Tm9kZSBub2RlLCBib29sIGlzUXVhbGlmaWVkKSB7CiAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBub2RlICE9IG51bGwpIHsKQEAgLTUzNSwxMiArNDcyLDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCB0aGF0IFtlbGVtZW50XSBoYXMgYSByZWxhdGlvbiBvZiB0aGUgZ2l2ZW4gW2tpbmRdIGF0IHRoZSBnaXZlbgotICAgKiBbb2Zmc2V0XSBhbmQgW2xlbmd0aF0uICBUaGUgZmxhZyBbaXNRdWFsaWZpZWRdIGlzIGB0cnVlYCBpZiB0aGUgcmVsYXRpb24KLSAgICogaGFzIGFuIGV4cGxpY2l0IG9yIGltcGxpY2l0IHF1YWxpZmllciwgc28gW2VsZW1lbnRdIGNhbm5vdCBiZSBzaGFkb3dlZCBieQotICAgKiBhIGxvY2FsIGRlY2xhcmF0aW9uLgotICAgKi8KKyAgLy8vIFJlY29yZCB0aGF0IFtlbGVtZW50XSBoYXMgYSByZWxhdGlvbiBvZiB0aGUgZ2l2ZW4gW2tpbmRdIGF0IHRoZSBnaXZlbgorICAvLy8gW29mZnNldF0gYW5kIFtsZW5ndGhdLiAgVGhlIGZsYWcgW2lzUXVhbGlmaWVkXSBpcyBgdHJ1ZWAgaWYgdGhlIHJlbGF0aW9uCisgIC8vLyBoYXMgYW4gZXhwbGljaXQgb3IgaW1wbGljaXQgcXVhbGlmaWVyLCBzbyBbZWxlbWVudF0gY2Fubm90IGJlIHNoYWRvd2VkIGJ5CisgIC8vLyBhIGxvY2FsIGRlY2xhcmF0aW9uLgogICB2b2lkIHJlY29yZFJlbGF0aW9uT2Zmc2V0KEVsZW1lbnQgZWxlbWVudCwgSW5kZXhSZWxhdGlvbktpbmQga2luZCwgaW50IG9mZnNldCwKICAgICAgIGludCBsZW5ndGgsIGJvb2wgaXNRdWFsaWZpZWQpIHsKICAgICAvLyBJZ25vcmUgZWxlbWVudHMgdGhhdCBjYW4ndCBiZSByZWZlcmVuY2VkIG91dHNpZGUgb2YgdGhlIHVuaXQuCkBAIC01ODIsMTAgKzUxNyw4IEBACiAgICAgYXNzZW1ibGVyLmFkZEVsZW1lbnRSZWxhdGlvbihlbGVtZW50LCBraW5kLCBvZmZzZXQsIGxlbmd0aCwgaXNRdWFsaWZpZWQpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCB0aGF0IFtlbGVtZW50XSBoYXMgYSByZWxhdGlvbiBvZiB0aGUgZ2l2ZW4gW2tpbmRdIGF0IHRoZSBsb2NhdGlvbgotICAgKiBvZiB0aGUgZ2l2ZW4gW3Rva2VuXS4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhhdCBbZWxlbWVudF0gaGFzIGEgcmVsYXRpb24gb2YgdGhlIGdpdmVuIFtraW5kXSBhdCB0aGUgbG9jYXRpb24KKyAgLy8vIG9mIHRoZSBnaXZlbiBbdG9rZW5dLgogICB2b2lkIHJlY29yZFJlbGF0aW9uVG9rZW4oCiAgICAgICBFbGVtZW50IGVsZW1lbnQsIEluZGV4UmVsYXRpb25LaW5kIGtpbmQsIFRva2VuIHRva2VuKSB7CiAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiB0b2tlbiAhPSBudWxsKSB7CkBAIC01OTMsOSArNTI2LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmVjb3JkIGEgcmVsYXRpb24gYmV0d2VlbiBhIHN1cGVyIFt0eXBlTmFtZV0gYW5kIGl0cyBbRWxlbWVudF0uCi0gICAqLworICAvLy8gUmVjb3JkIGEgcmVsYXRpb24gYmV0d2VlbiBhIHN1cGVyIFt0eXBlTmFtZV0gYW5kIGl0cyBbRWxlbWVudF0uCiAgIHZvaWQgcmVjb3JkU3VwZXJUeXBlKFR5cGVOYW1lIHR5cGVOYW1lLCBJbmRleFJlbGF0aW9uS2luZCBraW5kKSB7CiAgICAgSWRlbnRpZmllciBuYW1lID0gdHlwZU5hbWU/Lm5hbWU7CiAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewpAQCAtNjIxLDE5ICs1NTIsMTkgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdEFzc2lnbm1lbnRFeHByZXNzaW9uKEFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEFzc2lnbm1lbnRFeHByZXNzaW9uKEFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUpIHsKICAgICByZWNvcmRPcGVyYXRvclJlZmVyZW5jZShub2RlLm9wZXJhdG9yLCBub2RlLnN0YXRpY0VsZW1lbnQpOwogICAgIHN1cGVyLnZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRCaW5hcnlFeHByZXNzaW9uKEJpbmFyeUV4cHJlc3Npb24gbm9kZSkgeworICB2b2lkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKICAgICByZWNvcmRPcGVyYXRvclJlZmVyZW5jZShub2RlLm9wZXJhdG9yLCBub2RlLnN0YXRpY0VsZW1lbnQpOwogICAgIHN1cGVyLnZpc2l0QmluYXJ5RXhwcmVzc2lvbihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKENsYXNzRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9hZGRTdWJ0eXBlRm9yQ2xhc3NEZWNsYXJhdGlvbihub2RlKTsKICAgICBpZiAobm9kZS5leHRlbmRzQ2xhdXNlID09IG51bGwpIHsKICAgICAgIENsYXNzRWxlbWVudCBvYmplY3RFbGVtZW50ID0gbm9kZS5kZWNsYXJlZEVsZW1lbnQuc3VwZXJ0eXBlPy5lbGVtZW50OwpAQCAtNjQ1LDE0ICs1NzYsMTQgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENsYXNzVHlwZUFsaWFzKENsYXNzVHlwZUFsaWFzIG5vZGUpIHsKKyAgdm9pZCB2aXNpdENsYXNzVHlwZUFsaWFzKENsYXNzVHlwZUFsaWFzIG5vZGUpIHsKICAgICBfYWRkU3VidHlwZUZvckNsYXNzVHlwZUFsaXMobm9kZSk7CiAgICAgcmVjb3JkSXNBbmNlc3Rvck9mKG5vZGUuZGVjbGFyZWRFbGVtZW50KTsKICAgICBzdXBlci52aXNpdENsYXNzVHlwZUFsaWFzKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q29uc3RydWN0b3JGaWVsZEluaXRpYWxpemVyKENvbnN0cnVjdG9yRmllbGRJbml0aWFsaXplciBub2RlKSB7CisgIHZvaWQgdmlzaXRDb25zdHJ1Y3RvckZpZWxkSW5pdGlhbGl6ZXIoQ29uc3RydWN0b3JGaWVsZEluaXRpYWxpemVyIG5vZGUpIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIGZpZWxkTmFtZSA9IG5vZGUuZmllbGROYW1lOwogICAgIGlmIChmaWVsZE5hbWUgIT0gbnVsbCkgewogICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmllbGROYW1lLnN0YXRpY0VsZW1lbnQ7CkBAIC02NjIsNyArNTkzLDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENvbnN0cnVjdG9yTmFtZShDb25zdHJ1Y3Rvck5hbWUgbm9kZSkgeworICB2b2lkIHZpc2l0Q29uc3RydWN0b3JOYW1lKENvbnN0cnVjdG9yTmFtZSBub2RlKSB7CiAgICAgQ29uc3RydWN0b3JFbGVtZW50IGVsZW1lbnQgPSBub2RlLnN0YXRpY0VsZW1lbnQ7CiAgICAgZWxlbWVudCA9IF9nZXRBY3R1YWxDb25zdHJ1Y3RvckVsZW1lbnQoZWxlbWVudCk7CiAgICAgLy8gcmVjb3JkIHJlbGF0aW9uCkBAIC02ODAsMTQgKzYxMSwxNCBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0RXhwb3J0RGlyZWN0aXZlKEV4cG9ydERpcmVjdGl2ZSBub2RlKSB7CisgIHZvaWQgdmlzaXRFeHBvcnREaXJlY3RpdmUoRXhwb3J0RGlyZWN0aXZlIG5vZGUpIHsKICAgICBFeHBvcnRFbGVtZW50IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICAgcmVjb3JkVXJpUmVmZXJlbmNlKGVsZW1lbnQ/LmV4cG9ydGVkTGlicmFyeSwgbm9kZS51cmkpOwogICAgIHN1cGVyLnZpc2l0RXhwb3J0RGlyZWN0aXZlKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0RXhwcmVzc2lvbihFeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gbm9kZS5zdGF0aWNQYXJhbWV0ZXJFbGVtZW50OwogICAgIGlmIChwYXJhbWV0ZXJFbGVtZW50ICE9IG51bGwgJiYgcGFyYW1ldGVyRWxlbWVudC5pc09wdGlvbmFsUG9zaXRpb25hbCkgewogICAgICAgcmVjb3JkUmVsYXRpb25PZmZzZXQocGFyYW1ldGVyRWxlbWVudCwgSW5kZXhSZWxhdGlvbktpbmQuSVNfUkVGRVJFTkNFRF9CWSwKQEAgLTY5NywyNiArNjI4LDI2IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRFeHRlbmRzQ2xhdXNlKEV4dGVuZHNDbGF1c2Ugbm9kZSkgeworICB2b2lkIHZpc2l0RXh0ZW5kc0NsYXVzZShFeHRlbmRzQ2xhdXNlIG5vZGUpIHsKICAgICByZWNvcmRTdXBlclR5cGUobm9kZS5zdXBlcmNsYXNzLCBJbmRleFJlbGF0aW9uS2luZC5JU19FWFRFTkRFRF9CWSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRJbXBsZW1lbnRzQ2xhdXNlKEltcGxlbWVudHNDbGF1c2Ugbm9kZSkgeworICB2b2lkIHZpc2l0SW1wbGVtZW50c0NsYXVzZShJbXBsZW1lbnRzQ2xhdXNlIG5vZGUpIHsKICAgICBmb3IgKFR5cGVOYW1lIHR5cGVOYW1lIGluIG5vZGUuaW50ZXJmYWNlcykgewogICAgICAgcmVjb3JkU3VwZXJUeXBlKHR5cGVOYW1lLCBJbmRleFJlbGF0aW9uS2luZC5JU19JTVBMRU1FTlRFRF9CWSk7CiAgICAgfQogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0SW1wb3J0RGlyZWN0aXZlKEltcG9ydERpcmVjdGl2ZSBub2RlKSB7CisgIHZvaWQgdmlzaXRJbXBvcnREaXJlY3RpdmUoSW1wb3J0RGlyZWN0aXZlIG5vZGUpIHsKICAgICBJbXBvcnRFbGVtZW50IGVsZW1lbnQgPSBub2RlLmVsZW1lbnQ7CiAgICAgcmVjb3JkVXJpUmVmZXJlbmNlKGVsZW1lbnQ/LmltcG9ydGVkTGlicmFyeSwgbm9kZS51cmkpOwogICAgIHN1cGVyLnZpc2l0SW1wb3J0RGlyZWN0aXZlKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0SW5kZXhFeHByZXNzaW9uKEluZGV4RXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRJbmRleEV4cHJlc3Npb24oSW5kZXhFeHByZXNzaW9uIG5vZGUpIHsKICAgICBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBub2RlLnN0YXRpY0VsZW1lbnQ7CiAgICAgaWYgKGVsZW1lbnQgaXMgTWV0aG9kRWxlbWVudCkgewogICAgICAgVG9rZW4gb3BlcmF0b3IgPSBub2RlLmxlZnRCcmFja2V0OwpAQCAtNzI2LDEwICs2NTcsMTAgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdExpYnJhcnlJZGVudGlmaWVyKExpYnJhcnlJZGVudGlmaWVyIG5vZGUpIHt9CisgIHZvaWQgdmlzaXRMaWJyYXJ5SWRlbnRpZmllcihMaWJyYXJ5SWRlbnRpZmllciBub2RlKSB7fQogCiAgIEBvdmVycmlkZQotICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgIFNpbXBsZUlkZW50aWZpZXIgbmFtZSA9IG5vZGUubWV0aG9kTmFtZTsKICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lLnN0YXRpY0VsZW1lbnQ7CiAgICAgLy8gdW5yZXNvbHZlZCBuYW1lIGludm9jYXRpb24KQEAgLTc0OCwyMSArNjc5LDIxIEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRNaXhpbkRlY2xhcmF0aW9uKE1peGluRGVjbGFyYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0TWl4aW5EZWNsYXJhdGlvbihNaXhpbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBfYWRkU3VidHlwZUZvck1peGluRGVjbGFyYXRpb24obm9kZSk7CiAgICAgcmVjb3JkSXNBbmNlc3Rvck9mKG5vZGUuZGVjbGFyZWRFbGVtZW50KTsKICAgICBzdXBlci52aXNpdE1peGluRGVjbGFyYXRpb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRPbkNsYXVzZShPbkNsYXVzZSBub2RlKSB7CisgIHZvaWQgdmlzaXRPbkNsYXVzZShPbkNsYXVzZSBub2RlKSB7CiAgICAgZm9yIChUeXBlTmFtZSB0eXBlTmFtZSBpbiBub2RlLnN1cGVyY2xhc3NDb25zdHJhaW50cykgewogICAgICAgcmVjb3JkU3VwZXJUeXBlKHR5cGVOYW1lLCBJbmRleFJlbGF0aW9uS2luZC5JU19JTVBMRU1FTlRFRF9CWSk7CiAgICAgfQogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0UGFydERpcmVjdGl2ZShQYXJ0RGlyZWN0aXZlIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFBhcnREaXJlY3RpdmUoUGFydERpcmVjdGl2ZSBub2RlKSB7CiAgICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBlbGVtZW50ID0gbm9kZS5lbGVtZW50OwogICAgIGlmIChlbGVtZW50Py5zb3VyY2UgIT0gbnVsbCkgewogICAgICAgcmVjb3JkVXJpUmVmZXJlbmNlKGVsZW1lbnQsIG5vZGUudXJpKTsKQEAgLTc3MSwxOSArNzAyLDIwIEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRQb3N0Zml4RXhwcmVzc2lvbihQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRQb3N0Zml4RXhwcmVzc2lvbihQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgcmVjb3JkT3BlcmF0b3JSZWZlcmVuY2Uobm9kZS5vcGVyYXRvciwgbm9kZS5zdGF0aWNFbGVtZW50KTsKICAgICBzdXBlci52aXNpdFBvc3RmaXhFeHByZXNzaW9uKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0UHJlZml4RXhwcmVzc2lvbihQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFByZWZpeEV4cHJlc3Npb24oUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgcmVjb3JkT3BlcmF0b3JSZWZlcmVuY2Uobm9kZS5vcGVyYXRvciwgbm9kZS5zdGF0aWNFbGVtZW50KTsKICAgICBzdXBlci52aXNpdFByZWZpeEV4cHJlc3Npb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRSZWRpcmVjdGluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbihSZWRpcmVjdGluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRSZWRpcmVjdGluZ0NvbnN0cnVjdG9ySW52b2NhdGlvbigKKyAgICAgIFJlZGlyZWN0aW5nQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKICAgICBDb25zdHJ1Y3RvckVsZW1lbnQgZWxlbWVudCA9IG5vZGUuc3RhdGljRWxlbWVudDsKICAgICBpZiAobm9kZS5jb25zdHJ1Y3Rvck5hbWUgIT0gbnVsbCkgewogICAgICAgaW50IG9mZnNldCA9IG5vZGUucGVyaW9kLm9mZnNldDsKQEAgLTc5OSw3ICs3MzEsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgLy8gbmFtZSBpbiBkZWNsYXJhdGlvbgogICAgIGlmIChub2RlLmluRGVjbGFyYXRpb25Db250ZXh0KCkpIHsKICAgICAgIHJldHVybjsKQEAgLTg0NSw3ICs3NzcsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewogICAgIENvbnN0cnVjdG9yRWxlbWVudCBlbGVtZW50ID0gbm9kZS5zdGF0aWNFbGVtZW50OwogICAgIGlmIChub2RlLmNvbnN0cnVjdG9yTmFtZSAhPSBudWxsKSB7CiAgICAgICBpbnQgb2Zmc2V0ID0gbm9kZS5wZXJpb2Qub2Zmc2V0OwpAQCAtODYxLDcgKzc5Myw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRUeXBlTmFtZShUeXBlTmFtZSBub2RlKSB7CisgIHZvaWQgdmlzaXRUeXBlTmFtZShUeXBlTmFtZSBub2RlKSB7CiAgICAgQXN0Tm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICBpZiAocGFyZW50IGlzIENsYXNzVHlwZUFsaWFzICYmIHBhcmVudC5zdXBlcmNsYXNzID09IG5vZGUpIHsKICAgICAgIHJlY29yZFN1cGVyVHlwZShub2RlLCBJbmRleFJlbGF0aW9uS2luZC5JU19FWFRFTkRFRF9CWSk7CkBAIC04NzEsMTUgKzgwMywxMyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0V2l0aENsYXVzZShXaXRoQ2xhdXNlIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFdpdGhDbGF1c2UoV2l0aENsYXVzZSBub2RlKSB7CiAgICAgZm9yIChUeXBlTmFtZSB0eXBlTmFtZSBpbiBub2RlLm1peGluVHlwZXMpIHsKICAgICAgIHJlY29yZFN1cGVyVHlwZSh0eXBlTmFtZSwgSW5kZXhSZWxhdGlvbktpbmQuSVNfTUlYRURfSU5fQlkpOwogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZWNvcmQgdGhlIGdpdmVuIGNsYXNzIGFzIGEgc3ViY2xhc3Mgb2YgaXRzIGRpcmVjdCBzdXBlcmNsYXNzZXMuCi0gICAqLworICAvLy8gUmVjb3JkIHRoZSBnaXZlbiBjbGFzcyBhcyBhIHN1YmNsYXNzIG9mIGl0cyBkaXJlY3Qgc3VwZXJjbGFzc2VzLgogICB2b2lkIF9hZGRTdWJ0eXBlKFN0cmluZyBuYW1lLAogICAgICAge1R5cGVOYW1lIHN1cGVyY2xhc3MsCiAgICAgICBXaXRoQ2xhdXNlIHdpdGhDbGF1c2UsCkBAIC05MzUsOSArODY1LDcgQEAKICAgICBhc3NlbWJsZXIuYWRkU3VidHlwZShuYW1lLCBtZW1iZXJzLCBzdXBlcnR5cGVzKTsKICAgfQogCi0gIC8qKgotICAgKiBSZWNvcmQgdGhlIGdpdmVuIGNsYXNzIGFzIGEgc3ViY2xhc3Mgb2YgaXRzIGRpcmVjdCBzdXBlcmNsYXNzZXMuCi0gICAqLworICAvLy8gUmVjb3JkIHRoZSBnaXZlbiBjbGFzcyBhcyBhIHN1YmNsYXNzIG9mIGl0cyBkaXJlY3Qgc3VwZXJjbGFzc2VzLgogICB2b2lkIF9hZGRTdWJ0eXBlRm9yQ2xhc3NEZWNsYXJhdGlvbihDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBfYWRkU3VidHlwZShub2RlLm5hbWUubmFtZSwKICAgICAgICAgc3VwZXJjbGFzczogbm9kZS5leHRlbmRzQ2xhdXNlPy5zdXBlcmNsYXNzLApAQCAtOTQ2LDkgKzg3NCw3IEBACiAgICAgICAgIG1lbWJlck5vZGVzOiBub2RlLm1lbWJlcnMpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCB0aGUgZ2l2ZW4gY2xhc3MgYXMgYSBzdWJjbGFzcyBvZiBpdHMgZGlyZWN0IHN1cGVyY2xhc3Nlcy4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhlIGdpdmVuIGNsYXNzIGFzIGEgc3ViY2xhc3Mgb2YgaXRzIGRpcmVjdCBzdXBlcmNsYXNzZXMuCiAgIHZvaWQgX2FkZFN1YnR5cGVGb3JDbGFzc1R5cGVBbGlzKENsYXNzVHlwZUFsaWFzIG5vZGUpIHsKICAgICBfYWRkU3VidHlwZShub2RlLm5hbWUubmFtZSwKICAgICAgICAgc3VwZXJjbGFzczogbm9kZS5zdXBlcmNsYXNzLApAQCAtOTU3LDkgKzg4Myw3IEBACiAgICAgICAgIG1lbWJlck5vZGVzOiBjb25zdCBbXSk7CiAgIH0KIAotICAvKioKLSAgICogUmVjb3JkIHRoZSBnaXZlbiBtaXhpbiBhcyBhIHN1YmNsYXNzIG9mIGl0cyBkaXJlY3Qgc3VwZXJjbGFzc2VzLgotICAgKi8KKyAgLy8vIFJlY29yZCB0aGUgZ2l2ZW4gbWl4aW4gYXMgYSBzdWJjbGFzcyBvZiBpdHMgZGlyZWN0IHN1cGVyY2xhc3Nlcy4KICAgdm9pZCBfYWRkU3VidHlwZUZvck1peGluRGVjbGFyYXRpb24oTWl4aW5EZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgX2FkZFN1YnR5cGUobm9kZS5uYW1lLm5hbWUsCiAgICAgICAgIG9uQ2xhdXNlOiBub2RlLm9uQ2xhdXNlLApAQCAtOTY3LDExICs4OTEsOSBAQAogICAgICAgICBtZW1iZXJOb2Rlczogbm9kZS5tZW1iZXJzKTsKICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2NvbnN0cnVjdG9yXSBpcyBhIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciBjcmVhdGVkIGZvciBhCi0gICAqIFtDbGFzc1R5cGVBbGlhc10sIHJldHVybiB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yIG9mIGEgW0NsYXNzRGVjbGFyYXRpb25dCi0gICAqIHdoaWNoIGlzIGludm9rZWQuICBSZXR1cm4gYG51bGxgIGlmIGEgcmVkaXJlY3Rpb24gY3ljbGUgaXMgZGV0ZWN0ZWQuCi0gICAqLworICAvLy8gSWYgdGhlIGdpdmVuIFtjb25zdHJ1Y3Rvcl0gaXMgYSBzeW50aGV0aWMgY29uc3RydWN0b3IgY3JlYXRlZCBmb3IgYQorICAvLy8gW0NsYXNzVHlwZUFsaWFzXSwgcmV0dXJuIHRoZSBhY3R1YWwgY29uc3RydWN0b3Igb2YgYSBbQ2xhc3NEZWNsYXJhdGlvbl0KKyAgLy8vIHdoaWNoIGlzIGludm9rZWQuICBSZXR1cm4gYG51bGxgIGlmIGEgcmVkaXJlY3Rpb24gY3ljbGUgaXMgZGV0ZWN0ZWQuCiAgIENvbnN0cnVjdG9yRWxlbWVudCBfZ2V0QWN0dWFsQ29uc3RydWN0b3JFbGVtZW50KAogICAgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yKSB7CiAgICAgU2V0PENvbnN0cnVjdG9yRWxlbWVudD4gc2VlbkNvbnN0cnVjdG9ycyA9IDxDb25zdHJ1Y3RvckVsZW1lbnQ+e307CkBAIC05ODcsMTAgKzkwOSw4IEBACiAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgW25vZGVdIGhhcyBhbiBleHBsaWNpdCBvciBpbXBsaWNpdCBxdWFsaWZpZXIsIHNvIHRoYXQgaXQKLSAgICogY2Fubm90IGJlIHNoYWRvd2VkIGJ5IGEgbG9jYWwgZGVjbGFyYXRpb24uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiBbbm9kZV0gaGFzIGFuIGV4cGxpY2l0IG9yIGltcGxpY2l0IHF1YWxpZmllciwgc28gdGhhdCBpdAorICAvLy8gY2Fubm90IGJlIHNoYWRvd2VkIGJ5IGEgbG9jYWwgZGVjbGFyYXRpb24uCiAgIGJvb2wgX2lzUXVhbGlmaWVkKFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgewogICAgIGlmIChub2RlLmlzUXVhbGlmaWVkKSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMzQsOSArOTU0LDcgQEAKICAgfQogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG5hbWUgcmVsYXRpb24gaW4gc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBuYW1lIHJlbGF0aW9uIGluIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LgogY2xhc3MgX05hbWVSZWxhdGlvbkluZm8gewogICBmaW5hbCBfU3RyaW5nSW5mbyBuYW1lSW5mbzsKICAgZmluYWwgSW5kZXhSZWxhdGlvbktpbmQga2luZDsKQEAgLTEwNDYsNDEgKzk2NCwyNyBAQAogICBfTmFtZVJlbGF0aW9uSW5mbyh0aGlzLm5hbWVJbmZvLCB0aGlzLmtpbmQsIHRoaXMub2Zmc2V0LCB0aGlzLmlzUXVhbGlmaWVkKTsKIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN0cmluZyByZWZlcmVuY2VkIGluIHRoZSBpbmRleC4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc3RyaW5nIHJlZmVyZW5jZWQgaW4gdGhlIGluZGV4LgogY2xhc3MgX1N0cmluZ0luZm8gewotICAvKioKLSAgICogVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuCi0gICAqLworICAvLy8gVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuCiAgIGZpbmFsIFN0cmluZyB2YWx1ZTsKIAotICAvKioKLSAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgc3RyaW5nLiAgSXQgaXMgc2V0IGFmdGVyIGluZGV4aW5nIG9mIHRoZSB3aG9sZQotICAgKiBwYWNrYWdlIGlzIGRvbmUgYW5kIHdlIGFyZSBhc3NlbWJsaW5nIHRoZSBmdWxsIHBhY2thZ2UgaW5kZXguCi0gICAqLworICAvLy8gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgc3RyaW5nLiAgSXQgaXMgc2V0IGFmdGVyIGluZGV4aW5nIG9mIHRoZSB3aG9sZQorICAvLy8gcGFja2FnZSBpcyBkb25lIGFuZCB3ZSBhcmUgYXNzZW1ibGluZyB0aGUgZnVsbCBwYWNrYWdlIGluZGV4LgogICBpbnQgaWQ7CiAKICAgX1N0cmluZ0luZm8odGhpcy52YWx1ZSk7CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBzdWJ0eXBlIGluIHRoZSBpbmRleC4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc3VidHlwZSBpbiB0aGUgaW5kZXguCiBjbGFzcyBfU3VidHlwZUluZm8gewotICAvKioKLSAgICogVGhlIGlkZW50aWZpZXIgb2YgYSBkaXJlY3Qgc3VwZXJ0eXBlLgotICAgKi8KKyAgLy8vIFRoZSBpZGVudGlmaWVyIG9mIGEgZGlyZWN0IHN1cGVydHlwZS4KICAgZmluYWwgX1N0cmluZ0luZm8gc3VwZXJ0eXBlOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGNsYXNzLgogICBmaW5hbCBfU3RyaW5nSW5mbyBuYW1lOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZXMgb2YgZGVmaW5lZCBpbnN0YW5jZSBtZW1iZXJzLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lcyBvZiBkZWZpbmVkIGluc3RhbmNlIG1lbWJlcnMuCiAgIGZpbmFsIExpc3Q8X1N0cmluZ0luZm8+IG1lbWJlcnM7CiAKICAgX1N1YnR5cGVJbmZvKHRoaXMuc3VwZXJ0eXBlLCB0aGlzLm5hbWUsIHRoaXMubWVtYmVycyk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2xpYnJhcnlfYW5hbHl6ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9hbmFseXplci5kYXJ0CmluZGV4IDQzNjFlZGYuLjRhYWQxMTAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9hbmFseXplci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9hbmFseXplci5kYXJ0CkBAIC0yMSwxMCArMjEsMTIgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lcnJvci9zeW50YWN0aWNfZXJyb3JzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9sZWdhY3lfdHlwZV9hc3NlcnRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Zpc2l0b3IuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCcgc2hvdyBMaWJyYXJ5U2NvcGU7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2Jlc3RfcHJhY3RpY2VzX3ZlcmlmaWVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvZGFydDJqc192ZXJpZmllci5kYXJ0JzsKQEAgLTU4LDkgKzYwLDcgQEAKIHZhciB0aW1lckxpYnJhcnlBbmFseXplclNwbGljZXIgPSBTdG9wd2F0Y2goKTsKIHZhciB0aW1lckxpYnJhcnlBbmFseXplclZlcmlmeSA9IFN0b3B3YXRjaCgpOwogCi0vKioKLSAqIEFuYWx5emVyIG9mIGEgc2luZ2xlIGxpYnJhcnkuCi0gKi8KKy8vLyBBbmFseXplciBvZiBhIHNpbmdsZSBsaWJyYXJ5LgogY2xhc3MgTGlicmFyeUFuYWx5emVyIHsKICAgLy8vIEEgbWFya2VyIG9iamVjdCB1c2VkIHRvIHByZXZlbnQgdGhlIGluaXRpYWxpemF0aW9uIG9mCiAgIC8vLyBbX3ZlcnNpb25Db25zdHJhaW50RnJvbVB1YnNwZWNdIHdoZW4gdGhlIHByZXZpb3VzIGluaXRpYWxpemF0aW9uIGF0dGVtcHQKQEAgLTEwOCwxOCArMTA4LDE0IEBACiAKICAgVHlwZVN5c3RlbUltcGwgZ2V0IF90eXBlU3lzdGVtID0+IF9saWJyYXJ5RWxlbWVudC50eXBlU3lzdGVtOwogCi0gIC8qKgotICAgKiBDb21wdXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGFsbCB1bml0cyBvZiB0aGUgbGlicmFyeS4KLSAgICovCisgIC8vLyBDb21wdXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGFsbCB1bml0cyBvZiB0aGUgbGlicmFyeS4KICAgTWFwPEZpbGVTdGF0ZSwgVW5pdEFuYWx5c2lzUmVzdWx0PiBhbmFseXplKCkgewogICAgIHJldHVybiBQZXJmb3JtYW5jZVN0YXRpc3RpY3MuYW5hbHlzaXMubWFrZUN1cnJlbnRXaGlsZSgoKSB7CiAgICAgICByZXR1cm4gYW5hbHl6ZVN5bmMoKTsKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBDb21wdXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGFsbCB1bml0cyBvZiB0aGUgbGlicmFyeS4KLSAgICovCisgIC8vLyBDb21wdXRlIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGFsbCB1bml0cyBvZiB0aGUgbGlicmFyeS4KICAgTWFwPEZpbGVTdGF0ZSwgVW5pdEFuYWx5c2lzUmVzdWx0PiBhbmFseXplU3luYygpIHsKICAgICB0aW1lckxpYnJhcnlBbmFseXplci5zdGFydCgpOwogICAgIE1hcDxGaWxlU3RhdGUsIENvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSB7fTsKQEAgLTIxNSw5ICsyMTEsNyBAQAogICAgIHVuaXQuYWNjZXB0KGNvbnN0YW50VmVyaWZpZXIpOwogICB9CiAKLSAgLyoqCi0gICAqIENvbXB1dGUgW19jb25zdGFudHNdIGluIGFsbCB1bml0cy4KLSAgICovCisgIC8vLyBDb21wdXRlIFtfY29uc3RhbnRzXSBpbiBhbGwgdW5pdHMuCiAgIHZvaWQgX2NvbXB1dGVDb25zdGFudHMoKSB7CiAgICAgY29tcHV0ZUNvbnN0YW50cyhfdHlwZVByb3ZpZGVyLCBfdHlwZVN5c3RlbSwgX2RlY2xhcmVkVmFyaWFibGVzLAogICAgICAgICBfY29uc3RhbnRzLnRvTGlzdCgpLCBfYW5hbHlzaXNPcHRpb25zLmV4cGVyaW1lbnRTdGF0dXMpOwpAQCAtMzkwLDEwICszODQsOCBAQAogICAgIHVuaXQuYWNjZXB0KEZmaVZlcmlmaWVyKF90eXBlU3lzdGVtLCBlcnJvclJlcG9ydGVyKSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBnaXZlbiBbZXJyb3JzXSB0aGF0IGFyZSBub3QgbWFya2VkIGFzIGlnbm9yZWQgaW4KLSAgICogdGhlIFtmaWxlXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGdpdmVuIFtlcnJvcnNdIHRoYXQgYXJlIG5vdCBtYXJrZWQgYXMgaWdub3JlZCBpbgorICAvLy8gdGhlIFtmaWxlXS4KICAgTGlzdDxBbmFseXNpc0Vycm9yPiBfZmlsdGVySWdub3JlZEVycm9ycygKICAgICAgIEZpbGVTdGF0ZSBmaWxlLCBMaXN0PEFuYWx5c2lzRXJyb3I+IGVycm9ycykgewogICAgIGlmIChlcnJvcnMuaXNFbXB0eSkgewpAQCAtNTA0LDEwICs0OTYsOCBAQAogICAgIHJldHVybiB3b3Jrc3BhY2U/LmZpbmRQYWNrYWdlRm9yKGxpYnJhcnlQYXRoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdGhhdCB0aGUgZ2l2ZW4gcGFydCBpcyBkZWNsYXJlZCB0byBiZSBhCi0gICAqIHBhcnQgb2YsIG9yIGBudWxsYCBpZiB0aGUgcGFydCBkb2VzIG5vdCBjb250YWluIGEgcGFydC1vZiBkaXJlY3RpdmUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHRoYXQgdGhlIGdpdmVuIHBhcnQgaXMgZGVjbGFyZWQgdG8gYmUgYQorICAvLy8gcGFydCBvZiwgb3IgYG51bGxgIGlmIHRoZSBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gYSBwYXJ0LW9mIGRpcmVjdGl2ZS4KICAgX05hbWVPclNvdXJjZSBfZ2V0UGFydExpYnJhcnlOYW1lT3JVcmkoU291cmNlIHBhcnRTb3VyY2UsCiAgICAgICBDb21waWxhdGlvblVuaXQgcGFydFVuaXQsIExpc3Q8RGlyZWN0aXZlPiBkaXJlY3RpdmVzVG9SZXNvbHZlKSB7CiAgICAgZm9yIChEaXJlY3RpdmUgZGlyZWN0aXZlIGluIHBhcnRVbml0LmRpcmVjdGl2ZXMpIHsKQEAgLTUzOSwxNiArNTI5LDEyIEBACiAgICAgcmV0dXJuIHNvdXJjZSA9PSBfbGlicmFyeS5zb3VyY2U7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3NvdXJjZV0gaXMgYSBsaWJyYXJ5LgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtzb3VyY2VdIGlzIGEgbGlicmFyeS4KICAgYm9vbCBfaXNMaWJyYXJ5U291cmNlKFNvdXJjZSBzb3VyY2UpIHsKICAgICByZXR1cm4gX2lzTGlicmFyeVVyaShzb3VyY2UudXJpKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuZXcgcGFyc2VkIHVucmVzb2x2ZWQgW0NvbXBpbGF0aW9uVW5pdF0uCi0gICAqLworICAvLy8gUmV0dXJuIGEgbmV3IHBhcnNlZCB1bnJlc29sdmVkIFtDb21waWxhdGlvblVuaXRdLgogICBDb21waWxhdGlvblVuaXQgX3BhcnNlKEZpbGVTdGF0ZSBmaWxlKSB7CiAgICAgQW5hbHlzaXNFcnJvckxpc3RlbmVyIGVycm9yTGlzdGVuZXIgPSBfZ2V0RXJyb3JMaXN0ZW5lcihmaWxlKTsKICAgICBTdHJpbmcgY29udGVudCA9IGZpbGUuY29udGVudDsKQEAgLTczNCwxMCArNzIwLDggQEAKICAgICAgICAgZmVhdHVyZVNldDogdW5pdC5mZWF0dXJlU2V0LCBmbG93QW5hbHlzaXNIZWxwZXI6IGZsb3dBbmFseXNpc0hlbHBlcikpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlc29sdmUgdGhlIGdpdmVuIFt1cmlDb250ZW50XSwgcmVwb3J0aW5nIGVycm9ycwotICAgKiBhZ2FpbnN0IHRoZSBbdXJpTGl0ZXJhbF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVzb2x2ZSB0aGUgZ2l2ZW4gW3VyaUNvbnRlbnRdLCByZXBvcnRpbmcgZXJyb3JzCisgIC8vLyBhZ2FpbnN0IHRoZSBbdXJpTGl0ZXJhbF0uCiAgIFNvdXJjZSBfcmVzb2x2ZVVyaShGaWxlU3RhdGUgZmlsZSwgYm9vbCBpc0ltcG9ydCwgU3RyaW5nTGl0ZXJhbCB1cmlMaXRlcmFsLAogICAgICAgU3RyaW5nIHVyaUNvbnRlbnQpIHsKICAgICBVcmlWYWxpZGF0aW9uQ29kZSBjb2RlID0KQEAgLTgxMSwxMCArNzk1LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdGhlIGdpdmVuIFtkaXJlY3RpdmVdIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCBzb3VyY2UgZXhpc3RzIGFuZAotICAgKiByZXBvcnQgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QuCi0gICAqLworICAvLy8gQ2hlY2sgdGhlIGdpdmVuIFtkaXJlY3RpdmVdIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlZCBzb3VyY2UgZXhpc3RzIGFuZAorICAvLy8gcmVwb3J0IGFuIGVycm9yIGlmIGl0IGRvZXMgbm90LgogICB2b2lkIF92YWxpZGF0ZVVyaUJhc2VkRGlyZWN0aXZlKAogICAgICAgRmlsZVN0YXRlIGZpbGUsIFVyaUJhc2VkRGlyZWN0aXZlSW1wbCBkaXJlY3RpdmUpIHsKICAgICBTdHJpbmcgdXJpQ29udGVudDsKQEAgLTg0NiwxMCArODI4LDggQEAKICAgICAgICAgLnJlcG9ydEVycm9yRm9yTm9kZShlcnJvckNvZGUsIHVyaUxpdGVyYWwsIFt1cmlDb250ZW50XSk7CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgZWFjaCBkaXJlY3RpdmUgaW4gdGhlIGdpdmVuIFt1bml0XSB0byBzZWUgaWYgdGhlIHJlZmVyZW5jZWQgc291cmNlCi0gICAqIGV4aXN0cyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IGRvZXMgbm90LgotICAgKi8KKyAgLy8vIENoZWNrIGVhY2ggZGlyZWN0aXZlIGluIHRoZSBnaXZlbiBbdW5pdF0gdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIHNvdXJjZQorICAvLy8gZXhpc3RzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QuCiAgIHZvaWQgX3ZhbGlkYXRlVXJpQmFzZWREaXJlY3RpdmVzKEZpbGVTdGF0ZSBmaWxlLCBDb21waWxhdGlvblVuaXQgdW5pdCkgewogICAgIGZvciAoRGlyZWN0aXZlIGRpcmVjdGl2ZSBpbiB1bml0LmRpcmVjdGl2ZXMpIHsKICAgICAgIGlmIChkaXJlY3RpdmUgaXMgVXJpQmFzZWREaXJlY3RpdmUpIHsKQEAgLTg1OCwxMCArODM4LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3NvdXJjZV0gcmVmZXJzIHRvIGEgZmlsZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUKLSAgICogZ2VuZXJhdGVkLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtzb3VyY2VdIHJlZmVycyB0byBhIGZpbGUgdGhhdCBpcyBhc3N1bWVkIHRvIGJlCisgIC8vLyBnZW5lcmF0ZWQuCiAgIHN0YXRpYyBib29sIF9pc0dlbmVyYXRlZChTb3VyY2Ugc291cmNlKSB7CiAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC04ODUsOSArODYzLDcgQEAKICAgfQogfQogCi0vKioKLSAqIEFuYWx5c2lzIHJlc3VsdCBmb3Igc2luZ2xlIGZpbGUuCi0gKi8KKy8vLyBBbmFseXNpcyByZXN1bHQgZm9yIHNpbmdsZSBmaWxlLgogY2xhc3MgVW5pdEFuYWx5c2lzUmVzdWx0IHsKICAgZmluYWwgRmlsZVN0YXRlIGZpbGU7CiAgIGZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0OwpAQCAtODk2LDkgKzg3Miw3IEBACiAgIFVuaXRBbmFseXNpc1Jlc3VsdCh0aGlzLmZpbGUsIHRoaXMudW5pdCwgdGhpcy5lcnJvcnMpOwogfQogCi0vKioKLSAqIEVpdGhlciB0aGUgbmFtZSBvciB0aGUgc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnQtb2YgZGlyZWN0aXZlLgotICovCisvLy8gRWl0aGVyIHRoZSBuYW1lIG9yIHRoZSBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgcGFydC1vZiBkaXJlY3RpdmUuCiBjbGFzcyBfTmFtZU9yU291cmNlIHsKICAgZmluYWwgU3RyaW5nIG5hbWU7CiAgIGZpbmFsIFNvdXJjZSBzb3VyY2U7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2xpYnJhcnlfY29udGV4dC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9saWJyYXJ5X2NvbnRleHQuZGFydAppbmRleCA4NmZkYzdmLi5kZmIwZTA3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2xpYnJhcnlfY29udGV4dC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9jb250ZXh0LmRhcnQKQEAgLTMxLDE1ICszMSwxNCBAQAogdmFyIHRpbWVyTGlua2luZyA9IFN0b3B3YXRjaCgpOwogdmFyIHRpbWVyTG9hZDIgPSBTdG9wd2F0Y2goKTsKIAotLyoqCi0gKiBDb250ZXh0IGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBhbmFseXplIG9uZSBvciBtb3JlIGxpYnJhcmllcyB3aXRoaW4gYW4KLSAqIFtBbmFseXNpc0RyaXZlcl0uCi0gKgotICogQ3VycmVudGx5IHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSB3cmFwcGVyIGFyb3VuZCBbQW5hbHlzaXNDb250ZXh0XS4KLSAqLworLy8vIENvbnRleHQgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGFuYWx5emUgb25lIG9yIG1vcmUgbGlicmFyaWVzIHdpdGhpbiBhbgorLy8vIFtBbmFseXNpc0RyaXZlcl0uCisvLy8KKy8vLyBDdXJyZW50bHkgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHdyYXBwZXIgYXJvdW5kIFtBbmFseXNpc0NvbnRleHRdLgogY2xhc3MgTGlicmFyeUNvbnRleHQgewogICBzdGF0aWMgY29uc3QgX21heExpbmtlZERhdGFJbkJ5dGVzID0gNjQgKiAxMDI0ICogMTAyNDsKIAorICBmaW5hbCBMaWJyYXJ5Q29udGV4dFRlc3RWaWV3IHRlc3RWaWV3OwogICBmaW5hbCBQZXJmb3JtYW5jZUxvZyBsb2dnZXI7CiAgIGZpbmFsIEJ5dGVTdG9yZSBieXRlU3RvcmU7CiAgIGZpbmFsIEFuYWx5c2lzU2Vzc2lvbkltcGwgYW5hbHlzaXNTZXNzaW9uOwpAQCAtNTcsNiArNTYsNyBAQAogICBTZXQ8TGlicmFyeUN5Y2xlPiBsb2FkZWRCdW5kbGVzID0gU2V0PExpYnJhcnlDeWNsZT4uaWRlbnRpdHkoKTsKIAogICBMaWJyYXJ5Q29udGV4dCh7CisgICAgQHJlcXVpcmVkIHRoaXMudGVzdFZpZXcsCiAgICAgQHJlcXVpcmVkIEFuYWx5c2lzU2Vzc2lvbkltcGwgc2Vzc2lvbiwKICAgICBAcmVxdWlyZWQgUGVyZm9ybWFuY2VMb2cgbG9nZ2VyLAogICAgIEByZXF1aXJlZCBCeXRlU3RvcmUgYnl0ZVN0b3JlLApAQCAtNzYsOSArNzYsNyBAQAogICAgIGxvYWQyKHRhcmdldExpYnJhcnkpOwogICB9CiAKLSAgLyoqCi0gICAqIENvbXB1dGVzIGEgW0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRdIGZvciB0aGUgZ2l2ZW4gbGlicmFyeS91bml0IHBhaXIuCi0gICAqLworICAvLy8gQ29tcHV0ZXMgYSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0gZm9yIHRoZSBnaXZlbiBsaWJyYXJ5L3VuaXQgcGFpci4KICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBjb21wdXRlVW5pdEVsZW1lbnQoRmlsZVN0YXRlIGxpYnJhcnksIEZpbGVTdGF0ZSB1bml0KSB7CiAgICAgdmFyIHJlZmVyZW5jZSA9IGVsZW1lbnRGYWN0b3J5LnJvb3RSZWZlcmVuY2UKICAgICAgICAgLmdldENoaWxkKGxpYnJhcnkudXJpU3RyKQpAQCAtODcsMTYgKzg1LDEyIEBACiAgICAgcmV0dXJuIGVsZW1lbnRGYWN0b3J5LmVsZW1lbnRPZlJlZmVyZW5jZShyZWZlcmVuY2UpOwogICB9CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgW0xpYnJhcnlFbGVtZW50XSBmb3IgdGhlIGdpdmVuIGxpYnJhcnkuCi0gICAqLworICAvLy8gR2V0IHRoZSBbTGlicmFyeUVsZW1lbnRdIGZvciB0aGUgZ2l2ZW4gbGlicmFyeS4KICAgTGlicmFyeUVsZW1lbnQgZ2V0TGlicmFyeUVsZW1lbnQoRmlsZVN0YXRlIGxpYnJhcnkpIHsKICAgICByZXR1cm4gZWxlbWVudEZhY3RvcnkubGlicmFyeU9mVXJpKGxpYnJhcnkudXJpU3RyKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbdXJpXSBpcyBrbm93biB0byBiZSBhIGxpYnJhcnkuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3VyaV0gaXMga25vd24gdG8gYmUgYSBsaWJyYXJ5LgogICBib29sIGlzTGlicmFyeVVyaShVcmkgdXJpKSB7CiAgICAgU3RyaW5nIHVyaVN0ciA9IHVyaS50b1N0cmluZygpOwogICAgIHJldHVybiBlbGVtZW50RmFjdG9yeS5pc0xpYnJhcnlVcmkodXJpU3RyKTsKQEAgLTEyOCw2ICsxMjIsMTAgQEAKICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7CiAgICAgICAgIGxpYnJhcmllc0xpbmtlZFRpbWVyLnN0YXJ0KCk7CiAKKyAgICAgICAgdGVzdFZpZXcubGlua2VkQ3ljbGVzLmFkZCgKKyAgICAgICAgICBjeWNsZS5saWJyYXJpZXMubWFwKChlKSA9PiBlLnBhdGgpLnRvU2V0KCksCisgICAgICAgICk7CisKICAgICAgICAgdGltZXJJbnB1dExpYnJhcmllcy5zdGFydCgpOwogICAgICAgICBpbnB1dHNUaW1lci5zdGFydCgpOwogICAgICAgICB2YXIgaW5wdXRMaWJyYXJpZXMgPSA8bGluazIuTGlua0lucHV0TGlicmFyeT5bXTsKQEAgLTMyMCw2ICszMTgsMTAgQEAKICAgfQogfQogCitjbGFzcyBMaWJyYXJ5Q29udGV4dFRlc3RWaWV3IHsKKyAgZmluYWwgTGlzdDxTZXQ8U3RyaW5nPj4gbGlua2VkQ3ljbGVzID0gW107Cit9CisKIC8vLyBUT0RPKHNjaGVnbG92KSByZXBsYWNlIGluIHRoZSBpbnRlcm5hbCBwYXRjaAogY2xhc3MgTGlicmFyeUN5Y2xlTGlua0V4Y2VwdGlvbiBleHRlbmRzIENhdWdodEV4Y2VwdGlvbldpdGhGaWxlcyB7CiAgIExpYnJhcnlDeWNsZUxpbmtFeGNlcHRpb24oCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL2xpYnJhcnlfZ3JhcGguZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9ncmFwaC5kYXJ0CmluZGV4IDJkYjhhYzYuLmY4YmMyZGQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9ncmFwaC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvbGlicmFyeV9ncmFwaC5kYXJ0CkBAIC0xMSw4ICsxMSw4IEBACiAKIC8vLyBFbnN1cmUgdGhhdCB0aGUgW0ZpbGVTdGF0ZS5saWJyYXJ5Q3ljbGVdIGZvciB0aGUgW2ZpbGVdIGFuZCBhbnl0aGluZyBpdAogLy8vIGRlcGVuZHMgb24gaXMgY29tcHV0ZWQuCi12b2lkIGNvbXB1dGVMaWJyYXJ5Q3ljbGUoVWludDMyTGlzdCBsaW5rZWRTYWx0LCBGaWxlU3RhdGUgZmlsZSkgewotICB2YXIgbGlicmFyeVdhbGtlciA9IF9MaWJyYXJ5V2Fsa2VyKGxpbmtlZFNhbHQpOwordm9pZCBjb21wdXRlTGlicmFyeUN5Y2xlKFVpbnQzMkxpc3Qgc2FsdCwgRmlsZVN0YXRlIGZpbGUpIHsKKyAgdmFyIGxpYnJhcnlXYWxrZXIgPSBfTGlicmFyeVdhbGtlcihzYWx0KTsKICAgbGlicmFyeVdhbGtlci53YWxrKGxpYnJhcnlXYWxrZXIuZ2V0Tm9kZShmaWxlKSk7CiB9CiAKQEAgLTg4LDEwICs4OCwxMCBAQAogLy8vIEhlbHBlciB0aGF0IG9yZ2FuaXplcyBkZXBlbmRlbmNpZXMgb2YgYSBsaWJyYXJ5IGludG8gdG9wb2xvZ2ljYWxseQogLy8vIHNvcnRlZCBbTGlicmFyeUN5Y2xlXXMuCiBjbGFzcyBfTGlicmFyeVdhbGtlciBleHRlbmRzIGdyYXBoLkRlcGVuZGVuY3lXYWxrZXI8X0xpYnJhcnlOb2RlPiB7Ci0gIGZpbmFsIFVpbnQzMkxpc3QgX2xpbmtlZFNhbHQ7CisgIGZpbmFsIFVpbnQzMkxpc3QgX3NhbHQ7CiAgIGZpbmFsIE1hcDxGaWxlU3RhdGUsIF9MaWJyYXJ5Tm9kZT4gbm9kZXNPZkZpbGVzID0ge307CiAKLSAgX0xpYnJhcnlXYWxrZXIodGhpcy5fbGlua2VkU2FsdCk7CisgIF9MaWJyYXJ5V2Fsa2VyKHRoaXMuX3NhbHQpOwogCiAgIEBvdmVycmlkZQogICB2b2lkIGV2YWx1YXRlKF9MaWJyYXJ5Tm9kZSB2KSB7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB2YXIgY3ljbGUgPSBMaWJyYXJ5Q3ljbGUoKTsKIAogICAgIHZhciBzaWduYXR1cmUgPSBBcGlTaWduYXR1cmUoKTsKLSAgICBzaWduYXR1cmUuYWRkVWludDMyTGlzdChfbGlua2VkU2FsdCk7CisgICAgc2lnbmF0dXJlLmFkZFVpbnQzMkxpc3QoX3NhbHQpOwogCiAgICAgLy8gU29ydCBsaWJyYXJpZXMgdG8gcHJvZHVjZSBzdGFibGUgc2lnbmF0dXJlcy4KICAgICBzY2Muc29ydCgoZmlyc3QsIHNlY29uZCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9wZXJmb3JtYW5jZV9sb2dnZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvcGVyZm9ybWFuY2VfbG9nZ2VyLmRhcnQKaW5kZXggNmUzY2FhYS4uNGYyNWZlMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9wZXJmb3JtYW5jZV9sb2dnZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3BlcmZvcm1hbmNlX2xvZ2dlci5kYXJ0CkBAIC02NiwxMiArNjYsMTAgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBzZWN0aW9uIGZvciBvcGVyYXRpb25zIHRoYXQgc3RhcnQgYW5kIGVuZAotICogYXQgZGlmZmVyZW50IHBsYWNlIGluIGNvZGUsIHNvIGNhbm5vdCBiZSBydW4gdXNpbmcgW1BlcmZvcm1hbmNlTG9nLnJ1bl0uCi0gKgotICogVGhlIGNsaWVudCBtdXN0IGNhbGwgW2V4aXRdIGZvciBldmVyeSBbUGVyZm9ybWFuY2VMb2cuZW50ZXJdLgotICovCisvLy8gVGhlIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHNlY3Rpb24gZm9yIG9wZXJhdGlvbnMgdGhhdCBzdGFydCBhbmQgZW5kCisvLy8gYXQgZGlmZmVyZW50IHBsYWNlIGluIGNvZGUsIHNvIGNhbm5vdCBiZSBydW4gdXNpbmcgW1BlcmZvcm1hbmNlTG9nLnJ1bl0uCisvLy8KKy8vLyBUaGUgY2xpZW50IG11c3QgY2FsbCBbZXhpdF0gZm9yIGV2ZXJ5IFtQZXJmb3JtYW5jZUxvZy5lbnRlcl0uCiBjbGFzcyBQZXJmb3JtYW5jZUxvZ1NlY3Rpb24gewogICBmaW5hbCBQZXJmb3JtYW5jZUxvZyBfbG9nZ2VyOwogICBmaW5hbCBTdHJpbmcgX21zZzsKQEAgLTc5LDkgKzc3LDcgQEAKIAogICBQZXJmb3JtYW5jZUxvZ1NlY3Rpb24odGhpcy5fbG9nZ2VyLCB0aGlzLl9tc2cpOwogCi0gIC8qKgotICAgKiBTdG9wIHRoZSB0aW1lciwgbG9nIHRoZSB0aW1lLgotICAgKi8KKyAgLy8vIFN0b3AgdGhlIHRpbWVyLCBsb2cgdGhlIHRpbWUuCiAgIHZvaWQgZXhpdCgpIHsKICAgICBfdGltZXIuc3RvcCgpOwogICAgIF9sb2dnZXIuX2xldmVsLS07CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3JlZmVyZW5jZWRfbmFtZXMuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvcmVmZXJlbmNlZF9uYW1lcy5kYXJ0CmluZGV4IDlmNWYyNTAuLjdjMDVhZGYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvcmVmZXJlbmNlZF9uYW1lcy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvcmVmZXJlbmNlZF9uYW1lcy5kYXJ0CkBAIC01LDE5ICs1LDE1IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L3Zpc2l0b3IuZGFydCc7CiAKLS8qKgotICogQ29tcHV0ZSB0aGUgc2V0IG9mIGV4dGVybmFsIG5hbWVzIHJlZmVyZW5jZWQgaW4gdGhlIFt1bml0XS4KLSAqLworLy8vIENvbXB1dGUgdGhlIHNldCBvZiBleHRlcm5hbCBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBbdW5pdF0uCiBTZXQ8U3RyaW5nPiBjb21wdXRlUmVmZXJlbmNlZE5hbWVzKENvbXBpbGF0aW9uVW5pdCB1bml0KSB7CiAgIF9SZWZlcmVuY2VkTmFtZXNDb21wdXRlciBjb21wdXRlciA9IF9SZWZlcmVuY2VkTmFtZXNDb21wdXRlcigpOwogICB1bml0LmFjY2VwdChjb21wdXRlcik7CiAgIHJldHVybiBjb21wdXRlci5uYW1lczsKIH0KIAotLyoqCi0gKiBDb21wdXRlIHRoZSBzZXQgb2YgbmFtZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGV4dGVuZHNgLCBgd2l0aGAgb3IgYGltcGxlbWVudHNgCi0gKiBjbGF1c2VzIGluIHRoZSBmaWxlLiBJbXBvcnQgcHJlZml4ZXMgYW5kIHR5cGUgYXJndW1lbnRzIGFyZSBub3QgaW5jbHVkZWQuCi0gKi8KKy8vLyBDb21wdXRlIHRoZSBzZXQgb2YgbmFtZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGV4dGVuZHNgLCBgd2l0aGAgb3IgYGltcGxlbWVudHNgCisvLy8gY2xhdXNlcyBpbiB0aGUgZmlsZS4gSW1wb3J0IHByZWZpeGVzIGFuZCB0eXBlIGFyZ3VtZW50cyBhcmUgbm90IGluY2x1ZGVkLgogU2V0PFN0cmluZz4gY29tcHV0ZVN1YnR5cGVkTmFtZXMoQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKICAgU2V0PFN0cmluZz4gc3VidHlwZWROYW1lcyA9IDxTdHJpbmc+e307CiAKQEAgLTU0LDkgKzUwLDcgQEAKICAgcmV0dXJuIHN1YnR5cGVkTmFtZXM7CiB9CiAKLS8qKgotICogQ2hhaW5lZCBzZXQgb2YgbG9jYWwgbmFtZXMsIHRoYXQgaGlkZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIG5hbWVzLgotICovCisvLy8gQ2hhaW5lZCBzZXQgb2YgbG9jYWwgbmFtZXMsIHRoYXQgaGlkZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIG5hbWVzLgogY2xhc3MgX0xvY2FsTmFtZVNjb3BlIHsKICAgZmluYWwgX0xvY2FsTmFtZVNjb3BlIGVuY2xvc2luZzsKICAgU2V0PFN0cmluZz4gbmFtZXM7CkBAIC0xNzYsMTQgKzE3MCwxNCBAQAogICB9CiB9CiAKLWNsYXNzIF9SZWZlcmVuY2VkTmFtZXNDb21wdXRlciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3IgeworY2xhc3MgX1JlZmVyZW5jZWROYW1lc0NvbXB1dGVyIGV4dGVuZHMgR2VuZXJhbGl6aW5nQXN0VmlzaXRvcjx2b2lkPiB7CiAgIGZpbmFsIFNldDxTdHJpbmc+IG5hbWVzID0gPFN0cmluZz57fTsKICAgZmluYWwgU2V0PFN0cmluZz4gaW1wb3J0UHJlZml4TmFtZXMgPSA8U3RyaW5nPnt9OwogCiAgIF9Mb2NhbE5hbWVTY29wZSBsb2NhbFNjb3BlID0gX0xvY2FsTmFtZVNjb3BlKG51bGwpOwogCiAgIEBvdmVycmlkZQotICB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEJsb2NrKEJsb2NrIG5vZGUpIHsKICAgICBfTG9jYWxOYW1lU2NvcGUgb3V0ZXJTY29wZSA9IGxvY2FsU2NvcGU7CiAgICAgdHJ5IHsKICAgICAgIGxvY2FsU2NvcGUgPSBfTG9jYWxOYW1lU2NvcGUuZm9yQmxvY2sobG9jYWxTY29wZSwgbm9kZSk7CkBAIC0xOTQsNyArMTg4LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKENsYXNzRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9Mb2NhbE5hbWVTY29wZSBvdXRlclNjb3BlID0gbG9jYWxTY29wZTsKICAgICB0cnkgewogICAgICAgbG9jYWxTY29wZSA9IF9Mb2NhbE5hbWVTY29wZS5mb3JDbGFzcyhsb2NhbFNjb3BlLCBub2RlKTsKQEAgLTIwNSw3ICsxOTksNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q2xhc3NUeXBlQWxpYXMoQ2xhc3NUeXBlQWxpYXMgbm9kZSkgeworICB2b2lkIHZpc2l0Q2xhc3NUeXBlQWxpYXMoQ2xhc3NUeXBlQWxpYXMgbm9kZSkgewogICAgIF9Mb2NhbE5hbWVTY29wZSBvdXRlclNjb3BlID0gbG9jYWxTY29wZTsKICAgICB0cnkgewogICAgICAgbG9jYWxTY29wZSA9IF9Mb2NhbE5hbWVTY29wZS5mb3JDbGFzc1R5cGVBbGlhcyhsb2NhbFNjb3BlLCBub2RlKTsKQEAgLTIxNiwxMyArMjEwLDEzIEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRDb21waWxhdGlvblVuaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKKyAgdm9pZCB2aXNpdENvbXBpbGF0aW9uVW5pdChDb21waWxhdGlvblVuaXQgbm9kZSkgewogICAgIGxvY2FsU2NvcGUgPSBfTG9jYWxOYW1lU2NvcGUuZm9yVW5pdChub2RlKTsKICAgICBzdXBlci52aXNpdENvbXBpbGF0aW9uVW5pdChub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9Mb2NhbE5hbWVTY29wZSBvdXRlclNjb3BlID0gbG9jYWxTY29wZTsKICAgICB0cnkgewogICAgICAgbG9jYWxTY29wZSA9IF9Mb2NhbE5hbWVTY29wZS5mb3JDb25zdHJ1Y3Rvcihsb2NhbFNjb3BlLCBub2RlKTsKQEAgLTIzMywxNCArMjI3LDE0IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRDb25zdHJ1Y3Rvck5hbWUoQ29uc3RydWN0b3JOYW1lIG5vZGUpIHsKKyAgdm9pZCB2aXNpdENvbnN0cnVjdG9yTmFtZShDb25zdHJ1Y3Rvck5hbWUgbm9kZSkgewogICAgIGlmIChub2RlLnBhcmVudCBpcyEgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgewogICAgICAgc3VwZXIudmlzaXRDb25zdHJ1Y3Rvck5hbWUobm9kZSk7CiAgICAgfQogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgX0xvY2FsTmFtZVNjb3BlIG91dGVyU2NvcGUgPSBsb2NhbFNjb3BlOwogICAgIHRyeSB7CiAgICAgICBsb2NhbFNjb3BlID0gX0xvY2FsTmFtZVNjb3BlLmZvckZ1bmN0aW9uKGxvY2FsU2NvcGUsIG5vZGUpOwpAQCAtMjUxLDcgKzI0NSw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGdW5jdGlvblR5cGVBbGlhcyhGdW5jdGlvblR5cGVBbGlhcyBub2RlKSB7CisgIHZvaWQgdmlzaXRGdW5jdGlvblR5cGVBbGlhcyhGdW5jdGlvblR5cGVBbGlhcyBub2RlKSB7CiAgICAgX0xvY2FsTmFtZVNjb3BlIG91dGVyU2NvcGUgPSBsb2NhbFNjb3BlOwogICAgIHRyeSB7CiAgICAgICBsb2NhbFNjb3BlID0gX0xvY2FsTmFtZVNjb3BlLmZvckZ1bmN0aW9uVHlwZUFsaWFzKGxvY2FsU2NvcGUsIG5vZGUpOwpAQCAtMjYyLDcgKzI1Niw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRJbXBvcnREaXJlY3RpdmUoSW1wb3J0RGlyZWN0aXZlIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEltcG9ydERpcmVjdGl2ZShJbXBvcnREaXJlY3RpdmUgbm9kZSkgewogICAgIGlmIChub2RlLnByZWZpeCAhPSBudWxsKSB7CiAgICAgICBpbXBvcnRQcmVmaXhOYW1lcy5hZGQobm9kZS5wcmVmaXgubmFtZSk7CiAgICAgfQpAQCAtMjcwLDcgKzI2NCw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgX0xvY2FsTmFtZVNjb3BlIG91dGVyU2NvcGUgPSBsb2NhbFNjb3BlOwogICAgIHRyeSB7CiAgICAgICBsb2NhbFNjb3BlID0gX0xvY2FsTmFtZVNjb3BlLmZvck1ldGhvZChsb2NhbFNjb3BlLCBub2RlKTsKQEAgLTI4MSw3ICsyNzUsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMuCiAgICAgaWYgKG5vZGUuaW5EZWNsYXJhdGlvbkNvbnRleHQoKSkgewogICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9yZXN1bHRzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3Jlc3VsdHMuZGFydAppbmRleCA2ZTJkNTAzLi5kMTZjMjJkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3Jlc3VsdHMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3Jlc3VsdHMuZGFydApAQCAtMTAsNyArMTAsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2Vycm9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NvdXJjZS9saW5lX2luZm8uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFR5cGVTeXN0ZW1JbXBsOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiAKIGFic3RyYWN0IGNsYXNzIEFuYWx5c2lzUmVzdWx0SW1wbCBpbXBsZW1lbnRzIEFuYWx5c2lzUmVzdWx0IHsKICAgQG92ZXJyaWRlCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3NlYXJjaC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9zZWFyY2guZGFydAppbmRleCAyZjI2M2Q5Li4wMjhlNTRjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3NlYXJjaC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvc2VhcmNoLmRhcnQKQEAgLTI2LDE3ICsyNiwxMyBAQAogICByZXR1cm4gZWxlbWVudDsKIH0KIAotLyoqCi0gKiBTZWFyY2ggc3VwcG9ydCBmb3IgYW4gW0FuYWx5c2lzRHJpdmVyXS4KLSAqLworLy8vIFNlYXJjaCBzdXBwb3J0IGZvciBhbiBbQW5hbHlzaXNEcml2ZXJdLgogY2xhc3MgU2VhcmNoIHsKICAgZmluYWwgQW5hbHlzaXNEcml2ZXIgX2RyaXZlcjsKIAogICBTZWFyY2godGhpcy5fZHJpdmVyKTsKIAotICAvKioKLSAgICogUmV0dXJucyBjbGFzcyBvciBtaXhpbiBtZW1iZXJzIHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KLSAgICovCisgIC8vLyBSZXR1cm5zIGNsYXNzIG9yIG1peGluIG1lbWJlcnMgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgogICBGdXR1cmU8TGlzdDxFbGVtZW50Pj4gY2xhc3NNZW1iZXJzKFN0cmluZyBuYW1lKSBhc3luYyB7CiAgICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IDxFbGVtZW50PltdOwogCkBAIC02Myw5ICs1OSw3IEBACiAgICAgcmV0dXJuIGVsZW1lbnRzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgcmVmZXJlbmNlcyB0byB0aGUgW2VsZW1lbnRdLgotICAgKi8KKyAgLy8vIFJldHVybnMgcmVmZXJlbmNlcyB0byB0aGUgW2VsZW1lbnRdLgogICBGdXR1cmU8TGlzdDxTZWFyY2hSZXN1bHQ+PiByZWZlcmVuY2VzKAogICAgICAgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hlZEZpbGVzIHNlYXJjaGVkRmlsZXMpIGFzeW5jIHsKICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7CkBAIC0xMTAsMTMgKzEwNCwxMSBAQAogICAgIHJldHVybiBjb25zdCA8U2VhcmNoUmVzdWx0PltdOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgc3VidHlwZXMgb2YgdGhlIGdpdmVuIFt0eXBlXS4KLSAgICoKLSAgICogVGhlIFtzZWFyY2hlZEZpbGVzXSBhcmUgY29uc3VsdGVkIHRvIHNlZSBpZiBhIGZpbGUgaXMgIm93bmVkIiBieSB0aGlzCi0gICAqIFtTZWFyY2hdIG9iamVjdCwgc28gc2hvdWxkIGJlIG9ubHkgc2VhcmNoZWQgYnkgaXQgdG8gYXZvaWQgZHVwbGljYXRlCi0gICAqIHJlc3VsdHM7IGFuZCB1cGRhdGVkIHRvIHRha2Ugb3duZXJzaGlwIGlmIHRoZSBmaWxlIGlzIG5vdCBvd25lZCB5ZXQuCi0gICAqLworICAvLy8gUmV0dXJucyBzdWJ0eXBlcyBvZiB0aGUgZ2l2ZW4gW3R5cGVdLgorICAvLy8KKyAgLy8vIFRoZSBbc2VhcmNoZWRGaWxlc10gYXJlIGNvbnN1bHRlZCB0byBzZWUgaWYgYSBmaWxlIGlzICJvd25lZCIgYnkgdGhpcworICAvLy8gW1NlYXJjaF0gb2JqZWN0LCBzbyBzaG91bGQgYmUgb25seSBzZWFyY2hlZCBieSBpdCB0byBhdm9pZCBkdXBsaWNhdGUKKyAgLy8vIHJlc3VsdHM7IGFuZCB1cGRhdGVkIHRvIHRha2Ugb3duZXJzaGlwIGlmIHRoZSBmaWxlIGlzIG5vdCBvd25lZCB5ZXQuCiAgIEZ1dHVyZTxMaXN0PFNlYXJjaFJlc3VsdD4+IHN1YlR5cGVzKAogICAgICAgQ2xhc3NFbGVtZW50IHR5cGUsIFNlYXJjaGVkRmlsZXMgc2VhcmNoZWRGaWxlcykgYXN5bmMgewogICAgIGlmICh0eXBlID09IG51bGwpIHsKQEAgLTEzMSw5ICsxMjMsNyBAQAogICAgIHJldHVybiByZXN1bHRzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBkaXJlY3QgW1N1YnR5cGVSZXN1bHRdcyBmb3IgZWl0aGVyIHRoZSBbdHlwZV0gb3IgW3N1YnR5cGVdLgotICAgKi8KKyAgLy8vIFJldHVybiBkaXJlY3QgW1N1YnR5cGVSZXN1bHRdcyBmb3IgZWl0aGVyIHRoZSBbdHlwZV0gb3IgW3N1YnR5cGVdLgogICBGdXR1cmU8TGlzdDxTdWJ0eXBlUmVzdWx0Pj4gc3VidHlwZXMoU2VhcmNoZWRGaWxlcyBzZWFyY2hlZEZpbGVzLAogICAgICAge0NsYXNzRWxlbWVudCB0eXBlLCBTdWJ0eXBlUmVzdWx0IHN1YnR5cGV9KSBhc3luYyB7CiAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNjgsOSArMTU4LDcgQEAKICAgICByZXR1cm4gcmVzdWx0czsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm5zIHRvcC1sZXZlbCBlbGVtZW50cyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBnaXZlbiBbcmVnRXhwXS4KLSAgICovCisgIC8vLyBSZXR1cm5zIHRvcC1sZXZlbCBlbGVtZW50cyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBnaXZlbiBbcmVnRXhwXS4KICAgRnV0dXJlPExpc3Q8RWxlbWVudD4+IHRvcExldmVsRWxlbWVudHMoUmVnRXhwIHJlZ0V4cCkgYXN5bmMgewogICAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSA8RWxlbWVudD5bXTsKIApAQCAtMTk4LDkgKzE4Niw3IEBACiAgICAgcmV0dXJuIGVsZW1lbnRzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBbbmFtZV0uCi0gICAqLworICAvLy8gUmV0dXJucyB1bnJlc29sdmVkIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIFtuYW1lXS4KICAgRnV0dXJlPExpc3Q8U2VhcmNoUmVzdWx0Pj4gdW5yZXNvbHZlZE1lbWJlclJlZmVyZW5jZXMoCiAgICAgICBTdHJpbmcgbmFtZSwgU2VhcmNoZWRGaWxlcyBzZWFyY2hlZEZpbGVzKSBhc3luYyB7CiAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewpAQCAtMjc0LDkgKzI2MCw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFkZCByZXN1bHRzIGZvciBbZWxlbWVudF0gdXNhZ2UgaW4gdGhlIGdpdmVuIFtmaWxlXS4KLSAgICovCisgIC8vLyBBZGQgcmVzdWx0cyBmb3IgW2VsZW1lbnRdIHVzYWdlIGluIHRoZSBnaXZlbiBbZmlsZV0uCiAgIEZ1dHVyZTx2b2lkPiBfYWRkUmVzdWx0c0luRmlsZSgKICAgICAgIExpc3Q8U2VhcmNoUmVzdWx0PiByZXN1bHRzLAogICAgICAgRWxlbWVudCBlbGVtZW50LApAQCAtNDk3LDkgKzQ4MSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBDb250YWluZXIgdGhhdCBrZWVwcyB0cmFjayBvZiBmaWxlIG93bmVycy4KLSAqLworLy8vIENvbnRhaW5lciB0aGF0IGtlZXBzIHRyYWNrIG9mIGZpbGUgb3duZXJzLgogY2xhc3MgU2VhcmNoZWRGaWxlcyB7CiAgIGZpbmFsIE1hcDxTdHJpbmcsIFNlYXJjaD4gcGF0aE93bmVycyA9IHt9OwogICBmaW5hbCBNYXA8VXJpLCBTZWFyY2g+IHVyaU93bmVycyA9IHt9OwpAQCAtNTIzLDM4ICs1MDUsMjQgQEAKICAgfQogfQogCi0vKioKLSAqIEEgc2luZ2xlIHNlYXJjaCByZXN1bHQuCi0gKi8KKy8vLyBBIHNpbmdsZSBzZWFyY2ggcmVzdWx0LgogY2xhc3MgU2VhcmNoUmVzdWx0IHsKLSAgLyoqCi0gICAqIFRoZSBkZWVwIG1vc3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoaXMgcmVzdWx0LgotICAgKi8KKyAgLy8vIFRoZSBkZWVwIG1vc3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoaXMgcmVzdWx0LgogICBmaW5hbCBFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQ7CiAKLSAgLyoqCi0gICAqIFRoZSBraW5kIG9mIHRoZSBbZWxlbWVudF0gdXNhZ2UuCi0gICAqLworICAvLy8gVGhlIGtpbmQgb2YgdGhlIFtlbGVtZW50XSB1c2FnZS4KICAgZmluYWwgU2VhcmNoUmVzdWx0S2luZCBraW5kOwogCi0gIC8qKgotICAgKiBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5pbmcgZmlsZS4KLSAgICovCisgIC8vLyBUaGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5pbmcgZmlsZS4KICAgZmluYWwgaW50IG9mZnNldDsKIAotICAvKioKLSAgICogVGhlIGxlbmd0aCBvZiB0aGUgdXNhZ2UgaW4gdGhlIGNvbnRhaW5pbmcgZmlsZSBjb250ZXh0LgotICAgKi8KKyAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIHVzYWdlIGluIHRoZSBjb250YWluaW5nIGZpbGUgY29udGV4dC4KICAgZmluYWwgaW50IGxlbmd0aDsKIAotICAvKioKLSAgICogSXMgYHRydWVgIGlmIGEgZmllbGQgb3IgYSBtZXRob2QgaXMgdXNpbmcgd2l0aCBhIHF1YWxpZmllci4KLSAgICovCisgIC8vLyBJcyBgdHJ1ZWAgaWYgYSBmaWVsZCBvciBhIG1ldGhvZCBpcyB1c2luZyB3aXRoIGEgcXVhbGlmaWVyLgogICBmaW5hbCBib29sIGlzUmVzb2x2ZWQ7CiAKLSAgLyoqCi0gICAqIElzIGB0cnVlYCBpZiB0aGUgcmVzdWx0IGlzIGEgcmVzb2x2ZWQgcmVmZXJlbmNlIHRvIFtlbGVtZW50XS4KLSAgICovCisgIC8vLyBJcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdCBpcyBhIHJlc29sdmVkIHJlZmVyZW5jZSB0byBbZWxlbWVudF0uCiAgIGZpbmFsIGJvb2wgaXNRdWFsaWZpZWQ7CiAKICAgU2VhcmNoUmVzdWx0Ll8odGhpcy5lbmNsb3NpbmdFbGVtZW50LCB0aGlzLmtpbmQsIHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCwKQEAgLTU4MSwzMyArNTQ5LDIxIEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUga2luZCBvZiByZWZlcmVuY2UgaW4gYSBbU2VhcmNoUmVzdWx0XS4KLSAqLworLy8vIFRoZSBraW5kIG9mIHJlZmVyZW5jZSBpbiBhIFtTZWFyY2hSZXN1bHRdLgogZW51bSBTZWFyY2hSZXN1bHRLaW5kIHsgUkVBRCwgUkVBRF9XUklURSwgV1JJVEUsIElOVk9DQVRJT04sIFJFRkVSRU5DRSB9CiAKLS8qKgotICogQSBzaW5nbGUgc3VidHlwZSBvZiBhIHR5cGUuCi0gKi8KKy8vLyBBIHNpbmdsZSBzdWJ0eXBlIG9mIGEgdHlwZS4KIGNsYXNzIFN1YnR5cGVSZXN1bHQgewotICAvKioKLSAgICogVGhlIFVSSSBvZiB0aGUgbGlicmFyeS4KLSAgICovCisgIC8vLyBUaGUgVVJJIG9mIHRoZSBsaWJyYXJ5LgogICBmaW5hbCBTdHJpbmcgbGlicmFyeVVyaTsKIAotICAvKioKLSAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN1YnR5cGUuCi0gICAqLworICAvLy8gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN1YnR5cGUuCiAgIGZpbmFsIFN0cmluZyBpZDsKIAotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUuCiAgIGZpbmFsIFN0cmluZyBuYW1lOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZXMgb2YgaW5zdGFuY2UgbWVtYmVycyBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCi0gICAqLworICAvLy8gVGhlIG5hbWVzIG9mIGluc3RhbmNlIG1lbWJlcnMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICBmaW5hbCBMaXN0PFN0cmluZz4gbWVtYmVyczsKIAogICBTdWJ0eXBlUmVzdWx0KHRoaXMubGlicmFyeVVyaSwgdGhpcy5pZCwgdGhpcy5uYW1lLCB0aGlzLm1lbWJlcnMpOwpAQCAtNjE2LDE3ICs1NzIsMTUgQEAKICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gaWQ7CiB9CiAKLS8qKgotICogQSB2aXNpdG9yIHRoYXQgZmluZHMgdGhlIGRlZXAtbW9zdCBbRWxlbWVudF0gdGhhdCBjb250YWlucyB0aGUgW29mZnNldF0uCi0gKi8KLWNsYXNzIF9Db250YWluaW5nRWxlbWVudEZpbmRlciBleHRlbmRzIEdlbmVyYWxpemluZ0VsZW1lbnRWaXNpdG9yIHsKKy8vLyBBIHZpc2l0b3IgdGhhdCBmaW5kcyB0aGUgZGVlcC1tb3N0IFtFbGVtZW50XSB0aGF0IGNvbnRhaW5zIHRoZSBbb2Zmc2V0XS4KK2NsYXNzIF9Db250YWluaW5nRWxlbWVudEZpbmRlciBleHRlbmRzIEdlbmVyYWxpemluZ0VsZW1lbnRWaXNpdG9yPHZvaWQ+IHsKICAgZmluYWwgaW50IG9mZnNldDsKICAgRWxlbWVudCBjb250YWluaW5nRWxlbWVudDsKIAogICBfQ29udGFpbmluZ0VsZW1lbnRGaW5kZXIodGhpcy5vZmZzZXQpOwogCiAgIEBvdmVycmlkZQotICB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7CisgIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmIChlbGVtZW50IGlzIEVsZW1lbnRJbXBsKSB7CiAgICAgICBpZiAoZWxlbWVudC5jb2RlT2Zmc2V0ICE9IG51bGwgJiYKICAgICAgICAgICBlbGVtZW50LmNvZGVPZmZzZXQgPD0gb2Zmc2V0ICYmCkBAIC02MzgsMTAgKzU5Miw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBWaXNpdG9yIHRoYXQgYWRkcyBbU2VhcmNoUmVzdWx0XXMgZm9yIHJlZmVyZW5jZXMgdG8gdGhlIFtpbXBvcnRFbGVtZW50XS4KLSAqLwotY2xhc3MgX0ltcG9ydEVsZW1lbnRSZWZlcmVuY2VzVmlzaXRvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3IgeworLy8vIFZpc2l0b3IgdGhhdCBhZGRzIFtTZWFyY2hSZXN1bHRdcyBmb3IgcmVmZXJlbmNlcyB0byB0aGUgW2ltcG9ydEVsZW1lbnRdLgorY2xhc3MgX0ltcG9ydEVsZW1lbnRSZWZlcmVuY2VzVmlzaXRvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3I8dm9pZD4gewogICBmaW5hbCBMaXN0PFNlYXJjaFJlc3VsdD4gcmVzdWx0cyA9IDxTZWFyY2hSZXN1bHQ+W107CiAKICAgZmluYWwgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50OwpAQCAtNjU2LDEzICs2MDgsMTMgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdEV4cG9ydERpcmVjdGl2ZShFeHBvcnREaXJlY3RpdmUgbm9kZSkge30KKyAgdm9pZCB2aXNpdEV4cG9ydERpcmVjdGl2ZShFeHBvcnREaXJlY3RpdmUgbm9kZSkge30KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRJbXBvcnREaXJlY3RpdmUoSW1wb3J0RGlyZWN0aXZlIG5vZGUpIHt9CisgIHZvaWQgdmlzaXRJbXBvcnREaXJlY3RpdmUoSW1wb3J0RGlyZWN0aXZlIG5vZGUpIHt9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgaWYgKG5vZGUuaW5EZWNsYXJhdGlvbkNvbnRleHQoKSkgewogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTczNCwxMCArNjg2LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBbZWxlbWVudF0ncyBpZGVudGlmaWVyIGluIHRoZSBbaW5kZXhdIG9yIGAtMWAgaWYgdGhlCi0gICAqIFtlbGVtZW50XSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgW2luZGV4XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtlbGVtZW50XSdzIGlkZW50aWZpZXIgaW4gdGhlIFtpbmRleF0gb3IgYC0xYCBpZiB0aGUKKyAgLy8vIFtlbGVtZW50XSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgW2luZGV4XS4KICAgaW50IGZpbmRFbGVtZW50SWQoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgSW5kZXhFbGVtZW50SW5mbyBpbmZvID0gSW5kZXhFbGVtZW50SW5mbyhlbGVtZW50KTsKICAgICBlbGVtZW50ID0gaW5mby5lbGVtZW50OwpAQCAtNzgxLDE0ICs3MzEsMTIgQEAKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBvZiByZXN1bHRzIHdoZXJlIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gW2VsZW1lbnRJZF0gaGFzCi0gICAqIGEgcmVsYXRpb24gd2l0aCB0aGUga2luZCBmcm9tIFtyZWxhdGlvblRvUmVzdWx0S2luZF0uCi0gICAqCi0gICAqIFRoZSBmdW5jdGlvbiBbZ2V0RW5jbG9zaW5nVW5pdEVsZW1lbnRdIGlzIHVzZWQgdG8gbGF6aWx5IGNvbXB1dGUgdGhlCi0gICAqIGVuY2xvc2luZyBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0gaWYgdGhlcmUgaXMgYSByZWxhdGlvbiBvZiBhbgotICAgKiBpbnRlcmVzdGluZyBraW5kLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3Qgb2YgcmVzdWx0cyB3aGVyZSBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIFtlbGVtZW50SWRdIGhhcworICAvLy8gYSByZWxhdGlvbiB3aXRoIHRoZSBraW5kIGZyb20gW3JlbGF0aW9uVG9SZXN1bHRLaW5kXS4KKyAgLy8vCisgIC8vLyBUaGUgZnVuY3Rpb24gW2dldEVuY2xvc2luZ1VuaXRFbGVtZW50XSBpcyB1c2VkIHRvIGxhemlseSBjb21wdXRlIHRoZQorICAvLy8gZW5jbG9zaW5nIFtDb21waWxhdGlvblVuaXRFbGVtZW50XSBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uIG9mIGFuCisgIC8vLyBpbnRlcmVzdGluZyBraW5kLgogICBGdXR1cmU8TGlzdDxTZWFyY2hSZXN1bHQ+PiBnZXRSZWxhdGlvbnMoCiAgICAgICBpbnQgZWxlbWVudElkLAogICAgICAgTWFwPEluZGV4UmVsYXRpb25LaW5kLCBTZWFyY2hSZXN1bHRLaW5kPiByZWxhdGlvblRvUmVzdWx0S2luZCwKQEAgLTgyNSwxMCArNzczLDggQEAKICAgICByZXR1cm4gcmVzdWx0czsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgW3N0cl0gaW4gdGhlIFtpbmRleF0gb3IgYC0xYCBpZiBbc3RyXSBpcyBub3QKLSAgICogdXNlZCBpbiB0aGUgW2luZGV4XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgW3N0cl0gaW4gdGhlIFtpbmRleF0gb3IgYC0xYCBpZiBbc3RyXSBpcyBub3QKKyAgLy8vIHVzZWQgaW4gdGhlIFtpbmRleF0uCiAgIGludCBnZXRTdHJpbmdJZChTdHJpbmcgc3RyKSB7CiAgICAgaWYgKHN0ciA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gaW5kZXgubnVsbFN0cmluZ0lkOwpAQCAtODM3LDEwICs3ODMsOCBAQAogICAgIHJldHVybiBiaW5hcnlTZWFyY2goaW5kZXguc3RyaW5ncywgc3RyKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgdGhlIFtDb21waWxhdGlvblVuaXRFbGVtZW50XSBjb250YWluaW5nIHRoZQotICAgKiBbZWxlbWVudF0gaW4gdGhlIFtpbmRleF0gb3IgYC0xYCBpZiBub3QgZm91bmQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0gY29udGFpbmluZyB0aGUKKyAgLy8vIFtlbGVtZW50XSBpbiB0aGUgW2luZGV4XSBvciBgLTFgIGlmIG5vdCBmb3VuZC4KICAgaW50IGdldFVuaXRJZChFbGVtZW50IGVsZW1lbnQpIHsKICAgICBDb21waWxhdGlvblVuaXRFbGVtZW50IHVuaXRFbGVtZW50ID0gZ2V0VW5pdEVsZW1lbnQoZWxlbWVudCk7CiAgICAgaW50IGxpYnJhcnlVcmlJZCA9IGdldFVyaUlkKHVuaXRFbGVtZW50LmxpYnJhcnkuc291cmNlLnVyaSk7CkBAIC04NjAsMTAgKzgwNCw4IEBACiAgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgcmVzdWx0cyB3aGVyZSBhIGNsYXNzIG1lbWJlcnMgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdIGlzCi0gICAqIHJlZmVyZW5jZWQgd2l0aCBhIHF1YWxpZmllciwgYnV0IGlzIG5vdCByZXNvbHZlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IG9mIHJlc3VsdHMgd2hlcmUgYSBjbGFzcyBtZW1iZXJzIHdpdGggdGhlIGdpdmVuIFtuYW1lXSBpcworICAvLy8gcmVmZXJlbmNlZCB3aXRoIGEgcXVhbGlmaWVyLCBidXQgaXMgbm90IHJlc29sdmVkLgogICBGdXR1cmU8TGlzdDxTZWFyY2hSZXN1bHQ+PiBnZXRVbnJlc29sdmVkTWVtYmVyUmVmZXJlbmNlcygKICAgICAgIFN0cmluZyBuYW1lLAogICAgICAgTWFwPEluZGV4UmVsYXRpb25LaW5kLCBTZWFyY2hSZXN1bHRLaW5kPiByZWxhdGlvblRvUmVzdWx0S2luZCwKQEAgLTkwMSwxOSArODQzLDE1IEBACiAgICAgcmV0dXJuIHJlc3VsdHM7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBbdXJpXSBpbiB0aGUgW2luZGV4XSBvciBgLTFgIGlmIHRoZSBbdXJpXSBpcwotICAgKiBub3QgdXNlZCBpbiB0aGUgW2luZGV4XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgdGhlIFt1cmldIGluIHRoZSBbaW5kZXhdIG9yIGAtMWAgaWYgdGhlIFt1cmldIGlzCisgIC8vLyBub3QgdXNlZCBpbiB0aGUgW2luZGV4XS4KICAgaW50IGdldFVyaUlkKFVyaSB1cmkpIHsKICAgICBTdHJpbmcgc3RyID0gdXJpLnRvU3RyaW5nKCk7CiAgICAgcmV0dXJuIGdldFN0cmluZ0lkKHN0cik7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgW3ZhbHVlXSBpbiB0aGUgW3NvcnRlZExpc3RdLAotICAgKiBvciBgLTFgIGlmIHRoZSBbdmFsdWVdIGlzIG5vdCBpbiB0aGUgbGlzdC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBbdmFsdWVdIGluIHRoZQorICAvLy8gW3NvcnRlZExpc3RdLCBvciBgLTFgIGlmIHRoZSBbdmFsdWVdIGlzIG5vdCBpbiB0aGUgbGlzdC4KICAgaW50IF9maW5kRmlyc3RPY2N1cnJlbmNlKExpc3Q8aW50PiBzb3J0ZWRMaXN0LCBpbnQgdmFsdWUpIHsKICAgICAvLyBGaW5kIGFuIG9jY3VycmVuY2UuCiAgICAgaW50IGkgPSBiaW5hcnlTZWFyY2goc29ydGVkTGlzdCwgdmFsdWUpOwpAQCAtOTI4LDEyICs4NjYsMTAgQEAKICAgfQogfQogCi0vKioKLSAqIFZpc2l0b3IgdGhhdCBhZGRzIFtTZWFyY2hSZXN1bHRdcyBmb3IgbG9jYWwgZWxlbWVudHMgb2YgYSBibG9jaywgbWV0aG9kLAotICogY2xhc3Mgb3IgYSBsaWJyYXJ5IC0gbGFiZWxzLCBsb2NhbCBmdW5jdGlvbnMsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycywKLSAqIHR5cGUgcGFyYW1ldGVycywgaW1wb3J0IHByZWZpeGVzLgotICovCi1jbGFzcyBfTG9jYWxSZWZlcmVuY2VzVmlzaXRvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3IgeworLy8vIFZpc2l0b3IgdGhhdCBhZGRzIFtTZWFyY2hSZXN1bHRdcyBmb3IgbG9jYWwgZWxlbWVudHMgb2YgYSBibG9jaywgbWV0aG9kLAorLy8vIGNsYXNzIG9yIGEgbGlicmFyeSAtIGxhYmVscywgbG9jYWwgZnVuY3Rpb25zLCBsb2NhbCB2YXJpYWJsZXMgYW5kCisvLy8gcGFyYW1ldGVycywgdHlwZSBwYXJhbWV0ZXJzLCBpbXBvcnQgcHJlZml4ZXMuCitjbGFzcyBfTG9jYWxSZWZlcmVuY2VzVmlzaXRvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3I8dm9pZD4gewogICBmaW5hbCBMaXN0PFNlYXJjaFJlc3VsdD4gcmVzdWx0cyA9IDxTZWFyY2hSZXN1bHQ+W107CiAKICAgZmluYWwgRWxlbWVudCBlbGVtZW50OwpAQCAtOTQyLDcgKzg3OCw3IEBACiAgIF9Mb2NhbFJlZmVyZW5jZXNWaXNpdG9yKHRoaXMuZWxlbWVudCwgdGhpcy5lbmNsb3NpbmdVbml0RWxlbWVudCk7CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgaWYgKG5vZGUuaW5EZWNsYXJhdGlvbkNvbnRleHQoKSkgewogICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvc2Vzc2lvbi5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQKaW5kZXggN2MxZGM1Yy4uMDU1ZjcxNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQKQEAgLTE3LDggKzE3LDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2NsYXNzX2hpZXJhcmNoeS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnIHNob3cgQW5hbHlzaXNPcHRpb25zSW1wbDsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3N0YXR1cy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy9zdGF0dXMuZGFydAppbmRleCBjNmZkN2E3Li5hZjZjNmI4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FuYWx5c2lzL3N0YXR1cy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvc3RhdHVzLmRhcnQKQEAgLTQsOSArNCw3IEBACiAKIGltcG9ydCAnZGFydDphc3luYyc7CiAKLS8qKgotICogVGhlIHN0YXR1cyBvZiBhbmFseXNpcy4KLSAqLworLy8vIFRoZSBzdGF0dXMgb2YgYW5hbHlzaXMuCiBjbGFzcyBBbmFseXNpc1N0YXR1cyB7CiAgIHN0YXRpYyBjb25zdCBJRExFID0gQW5hbHlzaXNTdGF0dXMuXyhmYWxzZSk7CiAgIHN0YXRpYyBjb25zdCBBTkFMWVpJTkcgPSBBbmFseXNpc1N0YXR1cy5fKHRydWUpOwpAQCAtMTUsNDIgKzEzLDMyIEBACiAKICAgY29uc3QgQW5hbHlzaXNTdGF0dXMuXyh0aGlzLl9hbmFseXppbmcpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBzY2hlZHVsZXIgaXMgYW5hbHl6aW5nLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNjaGVkdWxlciBpcyBhbmFseXppbmcuCiAgIGJvb2wgZ2V0IGlzQW5hbHl6aW5nID0+IF9hbmFseXppbmc7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNjaGVkdWxlciBpcyBpZGxlLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNjaGVkdWxlciBpcyBpZGxlLgogICBib29sIGdldCBpc0lkbGUgPT4gIV9hbmFseXppbmc7CiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpID0+IF9hbmFseXppbmcgPyAnYW5hbHl6aW5nJyA6ICdpZGxlJzsKIH0KIAotLyoqCi0gKiBbTW9uaXRvcl0gY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgYSBzaWduYWwuCi0gKgotICogU2lnbmFscyBhcmUgbm90IHF1ZXVlZCwgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgZXhhY3RseSBvbmUgc2lnbmFsCi0gKiByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgW25vdGlmeV0gaW52b2NhdGlvbnMuIFRoZSBbc2lnbmFsXSBpcyByZXNldAotICogYWZ0ZXIgY29tcGxldGlvbiBhbmQgd2lsbCBub3QgY29tcGxldGUgdW50aWwgW25vdGlmeV0gaXMgY2FsbGVkIG5leHQgdGltZS4KLSAqLworLy8vIFtNb25pdG9yXSBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciBhIHNpZ25hbC4KKy8vLworLy8vIFNpZ25hbHMgYXJlIG5vdCBxdWV1ZWQsIHRoZSBjbGllbnQgd2lsbCByZWNlaXZlIGV4YWN0bHkgb25lIHNpZ25hbAorLy8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBbbm90aWZ5XSBpbnZvY2F0aW9ucy4gVGhlIFtzaWduYWxdIGlzIHJlc2V0CisvLy8gYWZ0ZXIgY29tcGxldGlvbiBhbmQgd2lsbCBub3QgY29tcGxldGUgdW50aWwgW25vdGlmeV0gaXMgY2FsbGVkIG5leHQgdGltZS4KIGNsYXNzIE1vbml0b3IgewogICBDb21wbGV0ZXI8dm9pZD4gX2NvbXBsZXRlciA9IENvbXBsZXRlcjx2b2lkPigpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyB3aGVuIFtub3RpZnldIGlzIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KKyAgLy8vIFJldHVybiBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIHdoZW4gW25vdGlmeV0gaXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCiAgIEZ1dHVyZTx2b2lkPiBnZXQgc2lnbmFsIGFzeW5jIHsKICAgICBhd2FpdCBfY29tcGxldGVyLmZ1dHVyZTsKICAgICBfY29tcGxldGVyID0gQ29tcGxldGVyPHZvaWQ+KCk7CiAgIH0KIAotICAvKioKLSAgICogQ29tcGxldGUgdGhlIFtzaWduYWxdIGZ1dHVyZSBpZiBpdCBpcyBub3QgY29tcGxldGVkIHlldC4gSXQgaXMgc2FmZSB0bwotICAgKiBjYWxsIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLCBidXQgdGhlIFtzaWduYWxdIHdpbGwgY29tcGxldGUgb25seSBvbmNlLgotICAgKi8KKyAgLy8vIENvbXBsZXRlIHRoZSBbc2lnbmFsXSBmdXR1cmUgaWYgaXQgaXMgbm90IGNvbXBsZXRlZCB5ZXQuIEl0IGlzIHNhZmUgdG8KKyAgLy8vIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMsIGJ1dCB0aGUgW3NpZ25hbF0gd2lsbCBjb21wbGV0ZSBvbmx5IG9uY2UuCiAgIHZvaWQgbm90aWZ5KCkgewogICAgIGlmICghX2NvbXBsZXRlci5pc0NvbXBsZXRlZCkgewogICAgICAgX2NvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKQEAgLTU4LDUwICs0NiwzNSBAQAogICB9CiB9CiAKLS8qKgotICogSGVscGVyIGZvciBtYW5hZ2luZyB0cmFuc2l0aW9uaW5nIFtBbmFseXNpc1N0YXR1c10uCi0gKi8KKy8vLyBIZWxwZXIgZm9yIG1hbmFnaW5nIHRyYW5zaXRpb25pbmcgW0FuYWx5c2lzU3RhdHVzXS4KIGNsYXNzIFN0YXR1c1N1cHBvcnQgewotICAvKioKLSAgICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBbc3RyZWFtXS4KLSAgICovCisgIC8vLyBUaGUgY29udHJvbGxlciBmb3IgdGhlIFtzdHJlYW1dLgogICBmaW5hbCBfc3RhdHVzQ29udHJvbGxlciA9IFN0cmVhbUNvbnRyb2xsZXI8QW5hbHlzaXNTdGF0dXM+KCk7CiAKLSAgLyoqCi0gICAqIFRoZSBsYXN0IHN0YXR1cyBzZW50IHRvIHRoZSBbc3RyZWFtXS4KLSAgICovCisgIC8vLyBUaGUgbGFzdCBzdGF0dXMgc2VudCB0byB0aGUgW3N0cmVhbV0uCiAgIEFuYWx5c2lzU3RhdHVzIF9jdXJyZW50U3RhdHVzID0gQW5hbHlzaXNTdGF0dXMuSURMRTsKIAotICAvKioKLSAgICogSWYgbm9uLW51bGwsIGEgY29tcGxldGVyIHdoaWNoIHNob3VsZCBiZSBjb21wbGV0ZWQgb24gdGhlIG5leHQgdHJhbnNpdGlvbgotICAgKiB0byBpZGxlLgotICAgKi8KKyAgLy8vIElmIG5vbi1udWxsLCBhIGNvbXBsZXRlciB3aGljaCBzaG91bGQgYmUgY29tcGxldGVkIG9uIHRoZSBuZXh0IHRyYW5zaXRpb24KKyAgLy8vIHRvIGlkbGUuCiAgIENvbXBsZXRlcjx2b2lkPiBfaWRsZUNvbXBsZXRlcjsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBzZW50IHRvIHRoZSBbc3RyZWFtXS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxhc3Qgc3RhdHVzIHNlbnQgdG8gdGhlIFtzdHJlYW1dLgogICBBbmFseXNpc1N0YXR1cyBnZXQgY3VycmVudFN0YXR1cyA9PiBfY3VycmVudFN0YXR1czsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdHJlYW0gdGhhdCBwcm9kdWNlcyBbQW5hbHlzaXNTdGF0dXNdIGV2ZW50cy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHN0cmVhbSB0aGF0IHByb2R1Y2VzIFtBbmFseXNpc1N0YXR1c10gZXZlbnRzLgogICBTdHJlYW08QW5hbHlzaXNTdGF0dXM+IGdldCBzdHJlYW0gPT4gX3N0YXR1c0NvbnRyb2xsZXIuc3RyZWFtOwogCi0gIC8qKgotICAgKiBQcmVwYXJlIGZvciB0aGUgc2NoZWR1bGVyIHRvIHN0YXJ0IGFuYWx5emluZywgYnV0IGRvIG5vdCBub3RpZnkgdGhlCi0gICAqIFtzdHJlYW1dIHlldC4KLSAgICoKLSAgICogQSBjYWxsIHRvIFtwcmVUcmFuc2l0aW9uVG9BbmFseXppbmddIGhhcyB0aGUgc2FtZSBlZmZlY3Qgb24gW3dhaXRGb3JJZGxlXQotICAgKiBhcyBhIGNhbGwgdG8gW3RyYW5zaXRpb25Ub0FuYWx5emluZ10sIGJ1dCBpdCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBbc3RyZWFtXS4KLSAgICovCisgIC8vLyBQcmVwYXJlIGZvciB0aGUgc2NoZWR1bGVyIHRvIHN0YXJ0IGFuYWx5emluZywgYnV0IGRvIG5vdCBub3RpZnkgdGhlCisgIC8vLyBbc3RyZWFtXSB5ZXQuCisgIC8vLworICAvLy8gQSBjYWxsIHRvIFtwcmVUcmFuc2l0aW9uVG9BbmFseXppbmddIGhhcyB0aGUgc2FtZSBlZmZlY3Qgb24gW3dhaXRGb3JJZGxlXQorICAvLy8gYXMgYSBjYWxsIHRvIFt0cmFuc2l0aW9uVG9BbmFseXppbmddLCBidXQgaXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUKKyAgLy8vIFtzdHJlYW1dLgogICB2b2lkIHByZVRyYW5zaXRpb25Ub0FuYWx5emluZygpIHsKICAgICBfaWRsZUNvbXBsZXRlciA/Pz0gQ29tcGxldGVyPHZvaWQ+KCk7CiAgIH0KIAotICAvKioKLSAgICogU2VuZCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgW3N0cmVhbV0gdGhhdCB0aGUgc2NoZWR1bGVyIHN0YXJ0ZWQgYW5hbHl6aW5nLgotICAgKi8KKyAgLy8vIFNlbmQgYSBub3RpZmljYXRpb24gdG8gdGhlIFtzdHJlYW1dIHRoYXQgdGhlIHNjaGVkdWxlciBzdGFydGVkIGFuYWx5emluZy4KICAgdm9pZCB0cmFuc2l0aW9uVG9BbmFseXppbmcoKSB7CiAgICAgaWYgKF9jdXJyZW50U3RhdHVzICE9IEFuYWx5c2lzU3RhdHVzLkFOQUxZWklORykgewogICAgICAgcHJlVHJhbnNpdGlvblRvQW5hbHl6aW5nKCk7CkBAIC0xMTAsOSArODMsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBTZW5kIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBbc3RyZWFtXSBzdHJlYW0gdGhhdCB0aGUgc2NoZWR1bGVyIGlzIGlkbGUuCi0gICAqLworICAvLy8gU2VuZCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgW3N0cmVhbV0gc3RyZWFtIHRoYXQgdGhlIHNjaGVkdWxlciBpcyBpZGxlLgogICB2b2lkIHRyYW5zaXRpb25Ub0lkbGUoKSB7CiAgICAgaWYgKF9jdXJyZW50U3RhdHVzICE9IEFuYWx5c2lzU3RhdHVzLklETEUpIHsKICAgICAgIF9jdXJyZW50U3RhdHVzID0gQW5hbHlzaXNTdGF0dXMuSURMRTsKQEAgLTEyMiwxMiArOTMsMTAgQEAKICAgICBfaWRsZUNvbXBsZXRlciA9IG51bGw7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgZnV0dXJlIHRoYXQgd2lsbCBiZSBjb21wbGV0ZWQgdGhlIG5leHQgdGltZSB0aGUgc3RhdHVzIGlzIGlkbGUuCi0gICAqCi0gICAqIElmIHRoZSBzdGF0dXMgaXMgY3VycmVudGx5IGlkbGUsIHRoZSByZXR1cm5lZCBmdXR1cmUgd2lsbCBiZSBzaWduYWxlZAotICAgKiBpbW1lZGlhdGVseS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBmdXR1cmUgdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCB0aGUgbmV4dCB0aW1lIHRoZSBzdGF0dXMgaXMgaWRsZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3RhdHVzIGlzIGN1cnJlbnRseSBpZGxlLCB0aGUgcmV0dXJuZWQgZnV0dXJlIHdpbGwgYmUgc2lnbmFsZWQKKyAgLy8vIGltbWVkaWF0ZWx5LgogICBGdXR1cmU8dm9pZD4gd2FpdEZvcklkbGUoKSB7CiAgICAgcmV0dXJuIF9pZGxlQ29tcGxldGVyPy5mdXR1cmUgPz8gRnV0dXJlPHZvaWQ+LnZhbHVlKCk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYW5hbHlzaXMvdXJpX2NvbnZlcnRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy91cmlfY29udmVydGVyLmRhcnQKaW5kZXggMDRlMjAwYi4uZGE1ZjdlNCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy91cmlfY29udmVydGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hbmFseXNpcy91cmlfY29udmVydGVyLmRhcnQKQEAgLTgsMTkgKzgsMTMgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpwYXRoL3NyYy9jb250ZXh0LmRhcnQnOwogCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgVVJJIGNvbnZlcnRlciBiYXNlZCBvbiBhbiBhbmFseXNpcyBkcml2ZXIuCi0gKi8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFVSSSBjb252ZXJ0ZXIgYmFzZWQgb24gYW4gYW5hbHlzaXMgZHJpdmVyLgogY2xhc3MgRHJpdmVyQmFzZWRVcmlDb252ZXJ0ZXIgaW1wbGVtZW50cyBVcmlDb252ZXJ0ZXIgewotICAvKioKLSAgICogVGhlIGRyaXZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbnZlcnNpb24gd2lsbCBvY2N1ci4KLSAgICovCisgIC8vLyBUaGUgZHJpdmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgY29udmVyc2lvbiB3aWxsIG9jY3VyLgogICBmaW5hbCBBbmFseXNpc0RyaXZlciBkcml2ZXI7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIFVSSSBjb252ZXJ0ZXIgdG8gdXNlIHRoZSBnaXZlbiBbZHJpdmVyXSB0byA9Ci0gICAqIHBlcmZvcm0gdGhlIGNvbnZlcnNpb25zLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIFVSSSBjb252ZXJ0ZXIgdG8gdXNlIHRoZSBnaXZlbiBbZHJpdmVyXSB0byA9CisgIC8vLyBwZXJmb3JtIHRoZSBjb252ZXJzaW9ucy4KICAgRHJpdmVyQmFzZWRVcmlDb252ZXJ0ZXIodGhpcy5kcml2ZXIpOwogCiAgIEBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvYXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC9hc3QuZGFydAppbmRleCBhYjRjZDllLi44OWExZDNmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC9hc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC9hc3QuZGFydApAQCAtNzU1NCw3ICs3NTU0LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICBhY2NlcHQoQXN0VmlzaXRvciB2aXNpdG9yKSB7CisgIHZvaWQgYWNjZXB0KEFzdFZpc2l0b3IgdmlzaXRvcikgewogICAgIGludCBsZW5ndGggPSBfZWxlbWVudHMubGVuZ3RoOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgIF9lbGVtZW50c1tpXS5hY2NlcHQodmlzaXRvcik7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC9hc3RfZmFjdG9yeS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvYXN0X2ZhY3RvcnkuZGFydAppbmRleCA5MGVlNGVjLi5mNjA2NzZjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC9hc3RfZmFjdG9yeS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYXN0L2FzdF9mYWN0b3J5LmRhcnQKQEAgLTEwLDEwICsxMCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKLS8qKgotICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0FzdEZhY3RvcnldIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBBU1QKLSAqIGltcGxlbWVudGF0aW9uLgotICovCisvLy8gQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgW0FzdEZhY3RvcnldIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBBU1QKKy8vLyBpbXBsZW1lbnRhdGlvbi4KIGNsYXNzIEFzdEZhY3RvcnlJbXBsIGV4dGVuZHMgQXN0RmFjdG9yeSB7CiAgIEBvdmVycmlkZQogICBBZGphY2VudFN0cmluZ3MgYWRqYWNlbnRTdHJpbmdzKExpc3Q8U3RyaW5nTGl0ZXJhbD4gc3RyaW5ncykgPT4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYXN0L2NvbnN0YW50X2V2YWx1YXRvci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQKaW5kZXggODk3ZDc5NS4uYjFkYTVkZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvY29uc3RhbnRfZXZhbHVhdG9yLmRhcnQKQEAgLTksOTUgKzksOTIgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC92aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgW0NvbnN0YW50RXZhbHVhdG9yXSBldmFsdWF0ZSBjb25zdGFudCBleHByZXNzaW9ucyB0bwotICogcHJvZHVjZSB0aGVpciBjb21waWxlLXRpbWUgdmFsdWUuCi0gKgotICogQWNjb3JkaW5nIHRvIHRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb246Ci0gKgotICogPiBBIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiA+Ci0gKiA+ICogQSBsaXRlcmFsIG51bWJlci4KLSAqID4gKiBBIGxpdGVyYWwgYm9vbGVhbi4KLSAqID4gKiBBIGxpdGVyYWwgc3RyaW5nIHdoZXJlIGFueSBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbiBpcyBhIGNvbXBpbGUtdGltZQotICogPiAgIGNvbnN0YW50IHRoYXQgZXZhbHVhdGVzIHRvIGEgbnVtZXJpYywgc3RyaW5nIG9yIGJvb2xlYW4gdmFsdWUgb3IgdG8KLSAqID4gICAqKm51bGwqKi4KLSAqID4gKiBBIGxpdGVyYWwgc3ltYm9sLgotICogPiAqICoqbnVsbCoqLgotICogPiAqIEEgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBjb25zdGFudCB2YXJpYWJsZS4KLSAqID4gKiBBbiBpZGVudGlmaWVyIGV4cHJlc3Npb24gdGhhdCBkZW5vdGVzIGEgY29uc3RhbnQgdmFyaWFibGUsIGNsYXNzIG9yIHR5cGUKLSAqID4gICBhbGlhcy4KLSAqID4gKiBBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24uCi0gKiA+ICogQSBjb25zdGFudCBsaXN0IGxpdGVyYWwuCi0gKiA+ICogQSBjb25zdGFudCBtYXAgbGl0ZXJhbC4KLSAqID4gKiBBIHNpbXBsZSBvciBxdWFsaWZpZWQgaWRlbnRpZmllciBkZW5vdGluZyBhIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBhCi0gKiA+ICAgc3RhdGljIG1ldGhvZC4KLSAqID4gKiBBIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBfKGUpXyB3aGVyZSBfZV8gaXMgYSBjb25zdGFudCBleHByZXNzaW9uLgotICogPiAqIDxzcGFuPgotICogPiAgIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gPGk+aWRlbnRpY2FsKGU8c3ViPjE8L3N1Yj4sIGU8c3ViPjI8L3N1Yj4pPC9pPgotICogPiAgIHdoZXJlIDxpPmU8c3ViPjE8L3N1Yj48L2k+IGFuZCA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQKLSAqID4gICBleHByZXNzaW9ucyBhbmQgPGk+aWRlbnRpY2FsKCk8L2k+IGlzIHN0YXRpY2FsbHkgYm91bmQgdG8gdGhlIHByZWRlZmluZWQKLSAqID4gICBkYXJ0IGZ1bmN0aW9uIDxpPmlkZW50aWNhbCgpPC9pPiBkaXNjdXNzZWQgYWJvdmUuCi0gKiA+ICAgPC9zcGFuPgotICogPiAqIDxzcGFuPgotICogPiAgIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyA8aT5lPHN1Yj4xPC9zdWI+ID09IGU8c3ViPjI8L3N1Yj48L2k+Ci0gKiA+ICAgb3IgPGk+ZTxzdWI+MTwvc3ViPiAhPSBlPHN1Yj4yPC9zdWI+PC9pPiB3aGVyZSA8aT5lPHN1Yj4xPC9zdWI+PC9pPiBhbmQKLSAqID4gICA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhCi0gKiA+ICAgbnVtZXJpYywgc3RyaW5nIG9yIGJvb2xlYW4gdmFsdWUuCi0gKiA+ICAgPC9zcGFuPgotICogPiAqIDxzcGFuPgotICogPiAgIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyA8aT4hZTwvaT4sIDxpPmU8c3ViPjE8L3N1Yj4gJmFtcDsmYW1wOwotICogPiAgIGU8c3ViPjI8L3N1Yj48L2k+IG9yIDxpPmU8c3ViPjE8L3N1Yj4gfHwgZTxzdWI+Mjwvc3ViPjwvaT4sIHdoZXJlCi0gKiA+ICAgPGk+ZTwvaT4sIDxpPmU8c3ViPjE8L3N1Yj48L2k+IGFuZCA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQKLSAqID4gICBleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIGEgYm9vbGVhbiB2YWx1ZS4KLSAqID4gICA8L3NwYW4+Ci0gKiA+ICogPHNwYW4+Ci0gKiA+ICAgQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPn5lPC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiBeCi0gKiA+ICAgZTxzdWI+Mjwvc3ViPjwvaT4sIDxpPmU8c3ViPjE8L3N1Yj4gJmFtcDsgZTxzdWI+Mjwvc3ViPjwvaT4sCi0gKiA+ICAgPGk+ZTxzdWI+MTwvc3ViPiB8IGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZndDsmZ3Q7Ci0gKiA+ICAgZTxzdWI+Mjwvc3ViPjwvaT4gb3IgPGk+ZTxzdWI+MTwvc3ViPiAmbHQ7Jmx0OyBlPHN1Yj4yPC9zdWI+PC9pPiwgd2hlcmUKLSAqID4gICA8aT5lPC9pPiwgPGk+ZTxzdWI+MTwvc3ViPjwvaT4gYW5kIDxpPmU8c3ViPjI8L3N1Yj48L2k+IGFyZSBjb25zdGFudAotICogPiAgIGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYW4gaW50ZWdlciB2YWx1ZSBvciB0byA8Yj5udWxsPC9iPi4KLSAqID4gICA8L3NwYW4+Ci0gKiA+ICogPHNwYW4+Ci0gKiA+ICAgQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPi1lPC9pPiwgPGk+ZTxzdWI+MTwvc3ViPgotICogPiAgIC1lPHN1Yj4yPC9zdWI+PC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiAqIGU8c3ViPjI8L3N1Yj48L2k+LAotICogPiAgIDxpPmU8c3ViPjE8L3N1Yj4gLyBlPHN1Yj4yPC9zdWI+PC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiB+LwotICogPiAgIGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZndDsgZTxzdWI+Mjwvc3ViPjwvaT4sCi0gKiA+ICAgPGk+ZTxzdWI+MTwvc3ViPiAmbHQ7IGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZndDs9Ci0gKiA+ICAgZTxzdWI+Mjwvc3ViPjwvaT4sIDxpPmU8c3ViPjE8L3N1Yj4gJmx0Oz0gZTxzdWI+Mjwvc3ViPjwvaT4gb3IKLSAqID4gICA8aT5lPHN1Yj4xPC9zdWI+ICUgZTxzdWI+Mjwvc3ViPjwvaT4sIHdoZXJlIDxpPmU8L2k+LAotICogPiAgIDxpPmU8c3ViPjE8L3N1Yj48L2k+IGFuZCA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMKLSAqID4gICB0aGF0IGV2YWx1YXRlIHRvIGEgbnVtZXJpYyB2YWx1ZSBvciB0byA8Yj5udWxsPC9iPi4KLSAqID4gICA8L3NwYW4+Ci0gKiA+ICogPHNwYW4+Ci0gKiA+ICAgQW4gZXhwcmVzc2lvbiBvZiBvbmUgdGhlIGZvcm0gPGk+ZTxzdWI+MTwvc3ViPiArIGU8c3ViPjI8L3N1Yj48L2k+LAotICogPiAgIDxpPmU8c3ViPjE8L3N1Yj4gLWU8c3ViPjI8L3N1Yj48L2k+IHdoZXJlIDxpPmU8c3ViPjE8L3N1Yj4gYW5kCi0gKiA+ICAgZTxzdWI+Mjwvc3ViPjwvaT4gYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYSBudW1lcmljIG9yCi0gKiA+ICAgc3RyaW5nIHZhbHVlIG9yIHRvIDxiPm51bGw8L2I+LgotICogPiAgIDwvc3Bhbj4KLSAqID4gKiA8c3Bhbj4KLSAqID4gICBBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIDxpPmU8c3ViPjE8L3N1Yj4gPyBlPHN1Yj4yPC9zdWI+IDoKLSAqID4gICBlPHN1Yj4zPC9zdWI+PC9pPiB3aGVyZSA8aT5lPHN1Yj4xPC9zdWI+PC9pPiwgPGk+ZTxzdWI+Mjwvc3ViPjwvaT4gYW5kCi0gKiA+ICAgPGk+ZTxzdWI+Mzwvc3ViPjwvaT4gYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zLCBhbmQgPGk+ZTxzdWI+MTwvc3ViPjwvaT4KLSAqID4gICBldmFsdWF0ZXMgdG8gYSBib29sZWFuIHZhbHVlLgotICogPiAgIDwvc3Bhbj4KLSAqCi0gKiBIb3dldmVyLCB0aGlzIGNvbW1lbnQgaXMgbm93IGF0IGxlYXN0IGEgbGl0dGxlIGJpdCBvdXQgb2Ygc3luYyB3aXRoIHRoZSBzcGVjLgotICoKLSAqIFRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHRoZXJlZm9yZSBgbnVsbGAgYW5kCi0gKiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYEJvb2xlYW5gLCBgQmlnSW50ZWdlcmAsIGBEb3VibGVgLCBgU3RyaW5nYCwgYW5kCi0gKiBgRGFydE9iamVjdGAuCi0gKgotICogSW4gYWRkaXRpb24sIHRoaXMgY2xhc3MgZGVmaW5lcyBzZXZlcmFsIHZhbHVlcyB0aGF0IGNhbiBiZSByZXR1cm5lZCB0bwotICogaW5kaWNhdGUgdmFyaW91cyBjb25kaXRpb25zIGVuY291bnRlcmVkIGR1cmluZyBldmFsdWF0aW9uLiBUaGVzZSBhcmUKLSAqIGRvY3VtZW50ZWQgd2l0aCB0aGUgc3RhdGljIGZpZWxkcyB0aGF0IGRlZmluZSB0aG9zZSB2YWx1ZXMuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFtDb25zdGFudEV2YWx1YXRvcl0gZXZhbHVhdGUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdG8KKy8vLyBwcm9kdWNlIHRoZWlyIGNvbXBpbGUtdGltZSB2YWx1ZS4KKy8vLworLy8vIEFjY29yZGluZyB0byB0aGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uOgorLy8vCisvLy8gPiBBIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisvLy8gPgorLy8vID4gKiBBIGxpdGVyYWwgbnVtYmVyLgorLy8vID4gKiBBIGxpdGVyYWwgYm9vbGVhbi4KKy8vLyA+ICogQSBsaXRlcmFsIHN0cmluZyB3aGVyZSBhbnkgaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24gaXMgYSBjb21waWxlLXRpbWUKKy8vLyA+ICAgY29uc3RhbnQgdGhhdCBldmFsdWF0ZXMgdG8gYSBudW1lcmljLCBzdHJpbmcgb3IgYm9vbGVhbiB2YWx1ZSBvciB0bworLy8vID4gICAqKm51bGwqKi4KKy8vLyA+ICogQSBsaXRlcmFsIHN5bWJvbC4KKy8vLyA+ICogKipudWxsKiouCisvLy8gPiAqIEEgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhIHN0YXRpYyBjb25zdGFudCB2YXJpYWJsZS4KKy8vLyA+ICogQW4gaWRlbnRpZmllciBleHByZXNzaW9uIHRoYXQgZGVub3RlcyBhIGNvbnN0YW50IHZhcmlhYmxlLCBjbGFzcyBvciB0eXBlCisvLy8gPiAgIGFsaWFzLgorLy8vID4gKiBBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24uCisvLy8gPiAqIEEgY29uc3RhbnQgbGlzdCBsaXRlcmFsLgorLy8vID4gKiBBIGNvbnN0YW50IG1hcCBsaXRlcmFsLgorLy8vID4gKiBBIHNpbXBsZSBvciBxdWFsaWZpZWQgaWRlbnRpZmllciBkZW5vdGluZyBhIHRvcC1sZXZlbCBmdW5jdGlvbiBvciBhCisvLy8gPiAgIHN0YXRpYyBtZXRob2QuCisvLy8gPiAqIEEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIF8oZSlfIHdoZXJlIF9lXyBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisvLy8gPiAqIDxzcGFuPgorLy8vID4gICBBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIDxpPmlkZW50aWNhbChlPHN1Yj4xPC9zdWI+LCBlPHN1Yj4yPC9zdWI+KTwvaT4KKy8vLyA+ICAgd2hlcmUgPGk+ZTxzdWI+MTwvc3ViPjwvaT4gYW5kIDxpPmU8c3ViPjI8L3N1Yj48L2k+IGFyZSBjb25zdGFudAorLy8vID4gICBleHByZXNzaW9ucyBhbmQgPGk+aWRlbnRpY2FsKCk8L2k+IGlzIHN0YXRpY2FsbHkgYm91bmQgdG8gdGhlIHByZWRlZmluZWQKKy8vLyA+ICAgZGFydCBmdW5jdGlvbiA8aT5pZGVudGljYWwoKTwvaT4gZGlzY3Vzc2VkIGFib3ZlLgorLy8vID4gICA8L3NwYW4+CisvLy8gPiAqIDxzcGFuPgorLy8vID4gICBBbiBleHByZXNzaW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgPGk+ZTxzdWI+MTwvc3ViPiA9PSBlPHN1Yj4yPC9zdWI+PC9pPgorLy8vID4gICBvciA8aT5lPHN1Yj4xPC9zdWI+ICE9IGU8c3ViPjI8L3N1Yj48L2k+IHdoZXJlIDxpPmU8c3ViPjE8L3N1Yj48L2k+IGFuZAorLy8vID4gICA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhCisvLy8gPiAgIG51bWVyaWMsIHN0cmluZyBvciBib29sZWFuIHZhbHVlLgorLy8vID4gICA8L3NwYW4+CisvLy8gPiAqIDxzcGFuPgorLy8vID4gICBBbiBleHByZXNzaW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgPGk+IWU8L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZhbXA7JmFtcDsKKy8vLyA+ICAgZTxzdWI+Mjwvc3ViPjwvaT4gb3IgPGk+ZTxzdWI+MTwvc3ViPiB8fCBlPHN1Yj4yPC9zdWI+PC9pPiwgd2hlcmUKKy8vLyA+ICAgPGk+ZTwvaT4sIDxpPmU8c3ViPjE8L3N1Yj48L2k+IGFuZCA8aT5lPHN1Yj4yPC9zdWI+PC9pPiBhcmUgY29uc3RhbnQKKy8vLyA+ICAgZXhwcmVzc2lvbnMgdGhhdCBldmFsdWF0ZSB0byBhIGJvb2xlYW4gdmFsdWUuCisvLy8gPiAgIDwvc3Bhbj4KKy8vLyA+ICogPHNwYW4+CisvLy8gPiAgIEFuIGV4cHJlc3Npb24gb2Ygb25lIG9mIHRoZSBmb3JtcyA8aT5+ZTwvaT4sIDxpPmU8c3ViPjE8L3N1Yj4gXgorLy8vID4gICBlPHN1Yj4yPC9zdWI+PC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiAmYW1wOyBlPHN1Yj4yPC9zdWI+PC9pPiwKKy8vLyA+ICAgPGk+ZTxzdWI+MTwvc3ViPiB8IGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZndDsmZ3Q7CisvLy8gPiAgIGU8c3ViPjI8L3N1Yj48L2k+IG9yIDxpPmU8c3ViPjE8L3N1Yj4gJmx0OyZsdDsgZTxzdWI+Mjwvc3ViPjwvaT4sIHdoZXJlCisvLy8gPiAgIDxpPmU8L2k+LCA8aT5lPHN1Yj4xPC9zdWI+PC9pPiBhbmQgPGk+ZTxzdWI+Mjwvc3ViPjwvaT4gYXJlIGNvbnN0YW50CisvLy8gPiAgIGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYW4gaW50ZWdlciB2YWx1ZSBvciB0byA8Yj5udWxsPC9iPi4KKy8vLyA+ICAgPC9zcGFuPgorLy8vID4gKiA8c3Bhbj4KKy8vLyA+ICAgQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPi1lPC9pPiwgPGk+ZTxzdWI+MTwvc3ViPgorLy8vID4gICAtZTxzdWI+Mjwvc3ViPjwvaT4sIDxpPmU8c3ViPjE8L3N1Yj4gKiBlPHN1Yj4yPC9zdWI+PC9pPiwKKy8vLyA+ICAgPGk+ZTxzdWI+MTwvc3ViPiAvIGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+IH4vCisvLy8gPiAgIGU8c3ViPjI8L3N1Yj48L2k+LCA8aT5lPHN1Yj4xPC9zdWI+ICZndDsgZTxzdWI+Mjwvc3ViPjwvaT4sCisvLy8gPiAgIDxpPmU8c3ViPjE8L3N1Yj4gJmx0OyBlPHN1Yj4yPC9zdWI+PC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiAmZ3Q7PQorLy8vID4gICBlPHN1Yj4yPC9zdWI+PC9pPiwgPGk+ZTxzdWI+MTwvc3ViPiAmbHQ7PSBlPHN1Yj4yPC9zdWI+PC9pPiBvcgorLy8vID4gICA8aT5lPHN1Yj4xPC9zdWI+ICUgZTxzdWI+Mjwvc3ViPjwvaT4sIHdoZXJlIDxpPmU8L2k+LAorLy8vID4gICA8aT5lPHN1Yj4xPC9zdWI+PC9pPiBhbmQgPGk+ZTxzdWI+Mjwvc3ViPjwvaT4gYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zCisvLy8gPiAgIHRoYXQgZXZhbHVhdGUgdG8gYSBudW1lcmljIHZhbHVlIG9yIHRvIDxiPm51bGw8L2I+LgorLy8vID4gICA8L3NwYW4+CisvLy8gPiAqIDxzcGFuPgorLy8vID4gICBBbiBleHByZXNzaW9uIG9mIG9uZSB0aGUgZm9ybSA8aT5lPHN1Yj4xPC9zdWI+ICsgZTxzdWI+Mjwvc3ViPjwvaT4sCisvLy8gPiAgIDxpPmU8c3ViPjE8L3N1Yj4gLWU8c3ViPjI8L3N1Yj48L2k+IHdoZXJlIDxpPmU8c3ViPjE8L3N1Yj4gYW5kCisvLy8gPiAgIGU8c3ViPjI8L3N1Yj48L2k+IGFyZSBjb25zdGFudCBleHByZXNzaW9ucyB0aGF0IGV2YWx1YXRlIHRvIGEgbnVtZXJpYyBvcgorLy8vID4gICBzdHJpbmcgdmFsdWUgb3IgdG8gPGI+bnVsbDwvYj4uCisvLy8gPiAgIDwvc3Bhbj4KKy8vLyA+ICogPHNwYW4+CisvLy8gPiAgIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gPGk+ZTxzdWI+MTwvc3ViPiA/IGU8c3ViPjI8L3N1Yj4gOgorLy8vID4gICBlPHN1Yj4zPC9zdWI+PC9pPiB3aGVyZSA8aT5lPHN1Yj4xPC9zdWI+PC9pPiwgPGk+ZTxzdWI+Mjwvc3ViPjwvaT4gYW5kCisvLy8gPiAgIDxpPmU8c3ViPjM8L3N1Yj48L2k+IGFyZSBjb25zdGFudCBleHByZXNzaW9ucywgYW5kIDxpPmU8c3ViPjE8L3N1Yj48L2k+CisvLy8gPiAgIGV2YWx1YXRlcyB0byBhIGJvb2xlYW4gdmFsdWUuCisvLy8gPiAgIDwvc3Bhbj4KKy8vLworLy8vIEhvd2V2ZXIsIHRoaXMgY29tbWVudCBpcyBub3cgYXQgbGVhc3QgYSBsaXR0bGUgYml0IG91dCBvZiBzeW5jIHdpdGggdGhlCisvLy8gc3BlYy4KKy8vLworLy8vIFRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHRoZXJlZm9yZSBgbnVsbGAgYW5kCisvLy8gaW5zdGFuY2VzIG9mIHRoZSBjbGFzc2VzIGBCb29sZWFuYCwgYEJpZ0ludGVnZXJgLCBgRG91YmxlYCwgYFN0cmluZ2AsIGFuZAorLy8vIGBEYXJ0T2JqZWN0YC4KKy8vLworLy8vIEluIGFkZGl0aW9uLCB0aGlzIGNsYXNzIGRlZmluZXMgc2V2ZXJhbCB2YWx1ZXMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG8KKy8vLyBpbmRpY2F0ZSB2YXJpb3VzIGNvbmRpdGlvbnMgZW5jb3VudGVyZWQgZHVyaW5nIGV2YWx1YXRpb24uIFRoZXNlIGFyZQorLy8vIGRvY3VtZW50ZWQgd2l0aCB0aGUgc3RhdGljIGZpZWxkcyB0aGF0IGRlZmluZSB0aG9zZSB2YWx1ZXMuCiBjbGFzcyBDb25zdGFudEV2YWx1YXRvciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3I8T2JqZWN0PiB7Ci0gIC8qKgotICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGV4cHJlc3Npb25zIChvciBub24tZXhwcmVzc2lvbiBub2RlcykgdGhhdCBhcmUgbm90Ci0gICAqIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9ucy4KLSAgICovCisgIC8vLyBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGV4cHJlc3Npb25zIChvciBub24tZXhwcmVzc2lvbiBub2RlcykgdGhhdCBhcmUgbm90CisgIC8vLyBjb21waWxlLXRpbWUgY29uc3RhbnQgZXhwcmVzc2lvbnMuCiAgIHN0YXRpYyBPYmplY3QgTk9UX0FfQ09OU1RBTlQgPSBPYmplY3QoKTsKIAogICBAb3ZlcnJpZGUKQEAgLTM4MywxMCArMzgwLDggQEAKICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBvZiB0aGUgc3RhdGljIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgotICAgKiBbZWxlbWVudF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBvZiB0aGUgc3RhdGljIGNvbnN0YW50IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorICAvLy8gW2VsZW1lbnRdLgogICBPYmplY3QgX2dldENvbnN0YW50VmFsdWUoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgSW1wbGVtZW50IHRoaXMKIC8vICAgIGlmIChlbGVtZW50IGlzIEZpZWxkRWxlbWVudCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvdG9fc291cmNlX3Zpc2l0b3IuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYXN0L3RvX3NvdXJjZV92aXNpdG9yLmRhcnQKaW5kZXggODExODhhZS4uYWRmOGQyYiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvdG9fc291cmNlX3Zpc2l0b3IuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC90b19zb3VyY2VfdmlzaXRvci5kYXJ0CkBAIC03LDI3ICs3LDE5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKLS8qKgotICogQSB2aXNpdG9yIHVzZWQgdG8gd3JpdGUgYSBzb3VyY2UgcmVwcmVzZW50YXRpb24gb2YgYSB2aXNpdGVkIEFTVCBub2RlIChhbmQKLSAqIGFsbCBvZiBpdCdzIGNoaWxkcmVuKSB0byBhIHNpbmsuCi0gKi8KKy8vLyBBIHZpc2l0b3IgdXNlZCB0byB3cml0ZSBhIHNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiBhIHZpc2l0ZWQgQVNUIG5vZGUgKGFuZAorLy8vIGFsbCBvZiBpdCdzIGNoaWxkcmVuKSB0byBhIHNpbmsuCiBjbGFzcyBUb1NvdXJjZVZpc2l0b3IgaW1wbGVtZW50cyBBc3RWaXNpdG9yPHZvaWQ+IHsKLSAgLyoqCi0gICAqIFRoZSBzaW5rIHRvIHdoaWNoIHRoZSBzb3VyY2UgaXMgdG8gYmUgd3JpdHRlbi4KLSAgICovCisgIC8vLyBUaGUgc2luayB0byB3aGljaCB0aGUgc291cmNlIGlzIHRvIGJlIHdyaXR0ZW4uCiAgIEBwcm90ZWN0ZWQKICAgZmluYWwgU3RyaW5nU2luayBzaW5rOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB2aXNpdG9yIHRvIHdyaXRlIHNvdXJjZSBjb2RlIHJlcHJlc2VudGluZyB0aGUKLSAgICogdmlzaXRlZCBub2RlcyB0byB0aGUgZ2l2ZW4gW3NpbmtdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHZpc2l0b3IgdG8gd3JpdGUgc291cmNlIGNvZGUgcmVwcmVzZW50aW5nIHRoZQorICAvLy8gdmlzaXRlZCBub2RlcyB0byB0aGUgZ2l2ZW4gW3NpbmtdLgogICBUb1NvdXJjZVZpc2l0b3IodGhpcy5zaW5rKTsKIAotICAvKioKLSAgICogVmlzaXQgdGhlIGdpdmVuIGZ1bmN0aW9uIFtib2R5XSwgcHJpbnRpbmcgdGhlIFtwcmVmaXhdIGJlZm9yZSBpZiB0aGUgYm9keQotICAgKiBpcyBub3QgZW1wdHkuCi0gICAqLworICAvLy8gVmlzaXQgdGhlIGdpdmVuIGZ1bmN0aW9uIFtib2R5XSwgcHJpbnRpbmcgdGhlIFtwcmVmaXhdIGJlZm9yZSBpZiB0aGUgYm9keQorICAvLy8gaXMgbm90IGVtcHR5LgogICBAcHJvdGVjdGVkCiAgIHZvaWQgc2FmZWx5VmlzaXRGdW5jdGlvbldpdGhQcmVmaXgoU3RyaW5nIHByZWZpeCwgRnVuY3Rpb25Cb2R5IGJvZHkpIHsKICAgICBpZiAoYm9keSBpcyEgRW1wdHlGdW5jdGlvbkJvZHkpIHsKQEAgLTM2LDkgKzI4LDcgQEAKICAgICBzYWZlbHlWaXNpdE5vZGUoYm9keSk7CiAgIH0KIAotICAvKioKLSAgICogU2FmZWx5IHZpc2l0IHRoZSBnaXZlbiBbbm9kZV0uCi0gICAqLworICAvLy8gU2FmZWx5IHZpc2l0IHRoZSBnaXZlbiBbbm9kZV0uCiAgIEBwcm90ZWN0ZWQKICAgdm9pZCBzYWZlbHlWaXNpdE5vZGUoQXN0Tm9kZSBub2RlKSB7CiAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewpAQCAtNDYsMTcgKzM2LDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFByaW50IGEgbGlzdCBvZiBbbm9kZXNdIHdpdGhvdXQgYW55IHNlcGFyYXRpb24uCi0gICAqLworICAvLy8gUHJpbnQgYSBsaXN0IG9mIFtub2Rlc10gd2l0aG91dCBhbnkgc2VwYXJhdGlvbi4KICAgQHByb3RlY3RlZAogICB2b2lkIHNhZmVseVZpc2l0Tm9kZUxpc3QoTm9kZUxpc3Q8QXN0Tm9kZT4gbm9kZXMpIHsKICAgICBzYWZlbHlWaXNpdE5vZGVMaXN0V2l0aFNlcGFyYXRvcihub2RlcywgIiIpOwogICB9CiAKLSAgLyoqCi0gICAqIFByaW50IGEgbGlzdCBvZiBbbm9kZXNdLCBzZXBhcmF0ZWQgYnkgdGhlIGdpdmVuIFtzZXBhcmF0b3JdLgotICAgKi8KKyAgLy8vIFByaW50IGEgbGlzdCBvZiBbbm9kZXNdLCBzZXBhcmF0ZWQgYnkgdGhlIGdpdmVuIFtzZXBhcmF0b3JdLgogICBAcHJvdGVjdGVkCiAgIHZvaWQgc2FmZWx5VmlzaXROb2RlTGlzdFdpdGhTZXBhcmF0b3IoCiAgICAgICBOb2RlTGlzdDxBc3ROb2RlPiBub2RlcywgU3RyaW5nIHNlcGFyYXRvcikgewpAQCAtNzYsMTAgKzYyLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUHJpbnQgYSBsaXN0IG9mIFtub2Rlc10sIHByZWZpeGVkIGJ5IHRoZSBnaXZlbiBbcHJlZml4XSBpZiB0aGUgbGlzdCBpcyBub3QKLSAgICogZW1wdHksIGFuZCBzZXBhcmF0ZWQgYnkgdGhlIGdpdmVuIFtzZXBhcmF0b3JdLgotICAgKi8KKyAgLy8vIFByaW50IGEgbGlzdCBvZiBbbm9kZXNdLCBwcmVmaXhlZCBieSB0aGUgZ2l2ZW4gW3ByZWZpeF0gaWYgdGhlIGxpc3QgaXMgbm90CisgIC8vLyBlbXB0eSwgYW5kIHNlcGFyYXRlZCBieSB0aGUgZ2l2ZW4gW3NlcGFyYXRvcl0uCiAgIEBwcm90ZWN0ZWQKICAgdm9pZCBzYWZlbHlWaXNpdE5vZGVMaXN0V2l0aFNlcGFyYXRvckFuZFByZWZpeCgKICAgICAgIFN0cmluZyBwcmVmaXgsIE5vZGVMaXN0PEFzdE5vZGU+IG5vZGVzLCBTdHJpbmcgc2VwYXJhdG9yKSB7CkBAIC05NywxMCArODEsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBQcmludCBhIGxpc3Qgb2YgW25vZGVzXSwgc2VwYXJhdGVkIGJ5IHRoZSBnaXZlbiBbc2VwYXJhdG9yXSwgZm9sbG93ZWQgYnkKLSAgICogdGhlIGdpdmVuIFtzdWZmaXhdIGlmIHRoZSBsaXN0IGlzIG5vdCBlbXB0eS4KLSAgICovCisgIC8vLyBQcmludCBhIGxpc3Qgb2YgW25vZGVzXSwgc2VwYXJhdGVkIGJ5IHRoZSBnaXZlbiBbc2VwYXJhdG9yXSwgZm9sbG93ZWQgYnkKKyAgLy8vIHRoZSBnaXZlbiBbc3VmZml4XSBpZiB0aGUgbGlzdCBpcyBub3QgZW1wdHkuCiAgIEBwcm90ZWN0ZWQKICAgdm9pZCBzYWZlbHlWaXNpdE5vZGVMaXN0V2l0aFNlcGFyYXRvckFuZFN1ZmZpeCgKICAgICAgIE5vZGVMaXN0PEFzdE5vZGU+IG5vZGVzLCBTdHJpbmcgc2VwYXJhdG9yLCBTdHJpbmcgc3VmZml4KSB7CkBAIC0xMTgsMTAgKzEwMCw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFNhZmVseSB2aXNpdCB0aGUgZ2l2ZW4gW25vZGVdLCBwcmludGluZyB0aGUgW3ByZWZpeF0gYmVmb3JlIHRoZSBub2RlIGlmIGl0Ci0gICAqIGlzIG5vbi1gbnVsbGAuCi0gICAqLworICAvLy8gU2FmZWx5IHZpc2l0IHRoZSBnaXZlbiBbbm9kZV0sIHByaW50aW5nIHRoZSBbcHJlZml4XSBiZWZvcmUgdGhlIG5vZGUgaWYgaXQKKyAgLy8vIGlzIG5vbi1gbnVsbGAuCiAgIEBwcm90ZWN0ZWQKICAgdm9pZCBzYWZlbHlWaXNpdE5vZGVXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgsIEFzdE5vZGUgbm9kZSkgewogICAgIGlmIChub2RlICE9IG51bGwpIHsKQEAgLTEzMCwxMCArMTEwLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogU2FmZWx5IHZpc2l0IHRoZSBnaXZlbiBbbm9kZV0sIHByaW50aW5nIHRoZSBbc3VmZml4XSBhZnRlciB0aGUgbm9kZSBpZiBpdAotICAgKiBpcyBub24tYG51bGxgLgotICAgKi8KKyAgLy8vIFNhZmVseSB2aXNpdCB0aGUgZ2l2ZW4gW25vZGVdLCBwcmludGluZyB0aGUgW3N1ZmZpeF0gYWZ0ZXIgdGhlIG5vZGUgaWYgaXQKKyAgLy8vIGlzIG5vbi1gbnVsbGAuCiAgIEBwcm90ZWN0ZWQKICAgdm9pZCBzYWZlbHlWaXNpdE5vZGVXaXRoU3VmZml4KEFzdE5vZGUgbm9kZSwgU3RyaW5nIHN1ZmZpeCkgewogICAgIGlmIChub2RlICE9IG51bGwpIHsKQEAgLTE0Miw5ICsxMjAsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBTYWZlbHkgdmlzaXQgdGhlIGdpdmVuIFt0b2tlbl0uCi0gICAqLworICAvLy8gU2FmZWx5IHZpc2l0IHRoZSBnaXZlbiBbdG9rZW5dLgogICBAcHJvdGVjdGVkCiAgIHZvaWQgc2FmZWx5VmlzaXRUb2tlbihUb2tlbiB0b2tlbikgewogICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CkBAIC0xNTIsMTAgKzEyOCw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFNhZmVseSB2aXNpdCB0aGUgZ2l2ZW4gW3Rva2VuXSwgcHJpbnRpbmcgdGhlIFtzdWZmaXhdIGFmdGVyIHRoZSB0b2tlbiBpZiBpdAotICAgKiBpcyBub24tYG51bGxgLgotICAgKi8KKyAgLy8vIFNhZmVseSB2aXNpdCB0aGUgZ2l2ZW4gW3Rva2VuXSwgcHJpbnRpbmcgdGhlIFtzdWZmaXhdIGFmdGVyIHRoZSB0b2tlbiBpZgorICAvLy8gaXQgaXMgbm9uLWBudWxsYC4KICAgQHByb3RlY3RlZAogICB2b2lkIHNhZmVseVZpc2l0VG9rZW5XaXRoU3VmZml4KFRva2VuIHRva2VuLCBTdHJpbmcgc3VmZml4KSB7CiAgICAgaWYgKHRva2VuICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYXN0L3Rva2VuLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC90b2tlbi5kYXJ0CmluZGV4IDA4MzNlYjUuLmQxNzUzMzk4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC90b2tlbi5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvYXN0L3Rva2VuLmRhcnQKQEAgLTE4LDExICsxOCw5IEBACiAgICAgICAgIFN5bnRoZXRpY1Rva2VuLAogICAgICAgICBUb2tlbkNsYXNzOwogCi0vKioKLSAqIFJldHVybiB0aGUgYmluYXJ5IG9wZXJhdG9yIHRoYXQgaXMgaW52b2tlZCBieSB0aGUgZ2l2ZW4gY29tcG91bmQgYXNzaWdubWVudAotICogW29wZXJhdG9yXS4gVGhyb3cgW1N0YXRlRXJyb3JdIGlmIHRoZSBhc3NpZ25tZW50IFtvcGVyYXRvcl0gZG9lcyBub3QKLSAqIGNvcnJlc3BvbmQgdG8gYSBiaW5hcnkgb3BlcmF0b3IuCi0gKi8KKy8vLyBSZXR1cm4gdGhlIGJpbmFyeSBvcGVyYXRvciB0aGF0IGlzIGludm9rZWQgYnkgdGhlIGdpdmVuIGNvbXBvdW5kIGFzc2lnbm1lbnQKKy8vLyBbb3BlcmF0b3JdLiBUaHJvdyBbU3RhdGVFcnJvcl0gaWYgdGhlIGFzc2lnbm1lbnQgW29wZXJhdG9yXSBkb2VzIG5vdAorLy8vIGNvcnJlc3BvbmQgdG8gYSBiaW5hcnkgb3BlcmF0b3IuCiBUb2tlblR5cGUgb3BlcmF0b3JGcm9tQ29tcG91bmRBc3NpZ25tZW50KFRva2VuVHlwZSBvcGVyYXRvcikgewogICBpZiAob3BlcmF0b3IgPT0gVG9rZW5UeXBlLkFNUEVSU0FORF9FUSkgewogICAgIHJldHVybiBUb2tlblR5cGUuQU1QRVJTQU5EOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9hc3QvdXRpbGl0aWVzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC91dGlsaXRpZXMuZGFydAppbmRleCAyN2I4M2MxLi4yNTBjMzhlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC91dGlsaXRpZXMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2FzdC91dGlsaXRpZXMuZGFydApAQCAtMjIsNDkgKzIyLDMzIEBACiB0eXBlZGVmIEV4Y2VwdGlvbkluRGVsZWdhdGVIYW5kbGVyID0gdm9pZCBGdW5jdGlvbigKICAgICBBc3ROb2RlIG5vZGUsIEFzdFZpc2l0b3IgdmlzaXRvciwgZHluYW1pYyBleGNlcHRpb24sIFN0YWNrVHJhY2Ugc3RhY2tUcmFjZSk7CiAKLS8qKgotICogQW4gQVNUIHZpc2l0b3IgdGhhdCB3aWxsIGNsb25lIGFueSBBU1Qgc3RydWN0dXJlIHRoYXQgaXQgdmlzaXRzLiBUaGUgY2xvbmVyCi0gKiB3aWxsIG9ubHkgY2xvbmUgdGhlIHN0cnVjdHVyZSwgaXQgd2lsbCBub3QgcHJlc2VydmUgYW55IHJlc29sdXRpb24gcmVzdWx0cyBvcgotICogcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGVzLgotICovCisvLy8gQW4gQVNUIHZpc2l0b3IgdGhhdCB3aWxsIGNsb25lIGFueSBBU1Qgc3RydWN0dXJlIHRoYXQgaXQgdmlzaXRzLiBUaGUgY2xvbmVyCisvLy8gd2lsbCBvbmx5IGNsb25lIHRoZSBzdHJ1Y3R1cmUsIGl0IHdpbGwgbm90IHByZXNlcnZlIGFueSByZXNvbHV0aW9uIHJlc3VsdHMKKy8vLyBvciBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMuCiBjbGFzcyBBc3RDbG9uZXIgaW1wbGVtZW50cyBBc3RWaXNpdG9yPEFzdE5vZGU+IHsKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG9rZW5zIHNob3VsZCBiZSBjbG9uZWQgd2hpbGUgY2xvbmluZyBhbiBBU1QKLSAgICogc3RydWN0dXJlLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG9rZW5zIHNob3VsZCBiZSBjbG9uZWQgd2hpbGUgY2xvbmluZyBhbiBBU1QKKyAgLy8vIHN0cnVjdHVyZS4KICAgZmluYWwgYm9vbCBjbG9uZVRva2VuczsKIAotICAvKioKLSAgICogTWFwcGluZyBmcm9tIG9yaWdpbmFsIHRva2VzIHRvIGNsb25lZC4KLSAgICovCisgIC8vLyBNYXBwaW5nIGZyb20gb3JpZ2luYWwgdG9rZXMgdG8gY2xvbmVkLgogICBmaW5hbCBNYXA8VG9rZW4sIFRva2VuPiBfY2xvbmVkVG9rZW5zID0gTWFwPFRva2VuLCBUb2tlbj4uaWRlbnRpdHkoKTsKIAotICAvKioKLSAgICogVGhlIG5leHQgb3JpZ2luYWwgdG9rZW4gdG8gY2xvbmUuCi0gICAqLworICAvLy8gVGhlIG5leHQgb3JpZ2luYWwgdG9rZW4gdG8gY2xvbmUuCiAgIFRva2VuIF9uZXh0VG9DbG9uZTsKIAotICAvKioKLSAgICogVGhlIGxhc3QgY2xvbmVkIHRva2VuLgotICAgKi8KKyAgLy8vIFRoZSBsYXN0IGNsb25lZCB0b2tlbi4KICAgVG9rZW4gX2xhc3RDbG9uZWQ7CiAKLSAgLyoqCi0gICAqIFRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgY2xvbmVkIHRva2VuLgotICAgKi8KKyAgLy8vIFRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgY2xvbmVkIHRva2VuLgogICBpbnQgX2xhc3RDbG9uZWRPZmZzZXQgPSAtMTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgQVNUIGNsb25lciB0byBvcHRpb25hbGx5IGNsb25lIHRva2VucyB3aGlsZQotICAgKiBjbG9uaW5nIEFTVCBub2RlcyBpZiBbY2xvbmVUb2tlbnNdIGlzIGB0cnVlYC4KLSAgICoKLSAgICogVE9ETyhicmlhbndpbGtlcnNvbikgQ2hhbmdlIHRoaXMgdG8gYmUgYSBuYW1lZCBwYXJhbWV0ZXIuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgQVNUIGNsb25lciB0byBvcHRpb25hbGx5IGNsb25lIHRva2VucyB3aGlsZQorICAvLy8gY2xvbmluZyBBU1Qgbm9kZXMgaWYgW2Nsb25lVG9rZW5zXSBpcyBgdHJ1ZWAuCisgIC8vLworICAvLy8gVE9ETyhicmlhbndpbGtlcnNvbikgQ2hhbmdlIHRoaXMgdG8gYmUgYSBuYW1lZCBwYXJhbWV0ZXIuCiAgIEFzdENsb25lcihbdGhpcy5jbG9uZVRva2VucyA9IGZhbHNlXSk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGNsb25lIG9mIHRoZSBnaXZlbiBbbm9kZV0uCi0gICAqLworICAvLy8gUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGdpdmVuIFtub2RlXS4KICAgRSBjbG9uZU5vZGU8RSBleHRlbmRzIEFzdE5vZGU+KEUgbm9kZSkgewogICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsOwpAQCAtNzIsMTAgKzU2LDggQEAKICAgICByZXR1cm4gbm9kZS5hY2NlcHQodGhpcykgYXMgRTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgY2xvbmVkIHZlcnNpb25zIG9mIHRoZSBub2RlcyBpbiB0aGUgZ2l2ZW4gbGlzdCBvZgotICAgKiBbbm9kZXNdLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBjbG9uZWQgdmVyc2lvbnMgb2YgdGhlIG5vZGVzIGluIHRoZSBnaXZlbiBsaXN0IG9mCisgIC8vLyBbbm9kZXNdLgogICBMaXN0PEU+IGNsb25lTm9kZUxpc3Q8RSBleHRlbmRzIEFzdE5vZGU+KExpc3Q8RT4gbm9kZXMpIHsKICAgICBpbnQgY291bnQgPSBub2Rlcy5sZW5ndGg7CiAgICAgTGlzdDxFPiBjbG9uZWROb2RlcyA9IDxFPltdOwpAQCAtODUsOSArNjcsNyBAQAogICAgIHJldHVybiBjbG9uZWROb2RlczsKICAgfQogCi0gIC8qKgotICAgKiBDbG9uZSB0aGUgZ2l2ZW4gW3Rva2VuXSBpZiB0b2tlbnMgYXJlIHN1cHBvc2VkIHRvIGJlIGNsb25lZC4KLSAgICovCisgIC8vLyBDbG9uZSB0aGUgZ2l2ZW4gW3Rva2VuXSBpZiB0b2tlbnMgYXJlIHN1cHBvc2VkIHRvIGJlIGNsb25lZC4KICAgVG9rZW4gY2xvbmVUb2tlbihUb2tlbiB0b2tlbikgewogICAgIGlmIChjbG9uZVRva2VucykgewogICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKQEAgLTEwNCw5ICs4NCw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIENsb25lIHRoZSBnaXZlbiBbdG9rZW5zXSBpZiB0b2tlbnMgYXJlIHN1cHBvc2VkIHRvIGJlIGNsb25lZC4KLSAgICovCisgIC8vLyBDbG9uZSB0aGUgZ2l2ZW4gW3Rva2Vuc10gaWYgdG9rZW5zIGFyZSBzdXBwb3NlZCB0byBiZSBjbG9uZWQuCiAgIExpc3Q8VG9rZW4+IGNsb25lVG9rZW5MaXN0KExpc3Q8VG9rZW4+IHRva2VucykgewogICAgIGlmIChjbG9uZVRva2VucykgewogICAgICAgcmV0dXJuIHRva2Vucy5tYXAoY2xvbmVUb2tlbikudG9MaXN0KCk7CkBAIC0xMDc2LDE1ICsxMDU0LDEzIEBACiAgICAgICAgICAgY2xvbmVOb2RlKG5vZGUuZXhwcmVzc2lvbiksCiAgICAgICAgICAgY2xvbmVUb2tlbihub2RlLnNlbWljb2xvbikpOwogCi0gIC8qKgotICAgKiBDbG9uZSBhbGwgdG9rZW4gc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gW3Rva2VuXSB1cCB0byBhIHRva2VuIHRoYXQgaGFzCi0gICAqIG9mZnNldCBncmVhdGVyIHRoZW4gW3N0b3BBZnRlcl0sIGFuZCBwdXQgbWFwcGluZyBmcm9tIG9yaWdpbmFscyB0byBjbG9uZXMKLSAgICogaW50byBbX2Nsb25lZFRva2Vuc10uCi0gICAqCi0gICAqIFdlIGNhbm5vdCBjbG9uZSB0b2tlbnMgYXMgd2UgdmlzaXQgbm9kZXMgYmVjYXVzZSBub3QgZXZlcnkgdG9rZW4gaXMgYSBwYXJ0Ci0gICAqIG9mIGEgbm9kZSwgRS5nLiBjb21tYXMgaW4gYXJndW1lbnQgbGlzdHMgYXJlIG5vdCByZXByZXNlbnRlZCBpbiBBU1QuIEJ1dAotICAgKiB3ZSBuZWVkIHRvIHRoZSBzZXF1ZW5jZSBvZiB0b2tlbnMgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIG9uZS4KLSAgICovCisgIC8vLyBDbG9uZSBhbGwgdG9rZW4gc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gW3Rva2VuXSB1cCB0byBhIHRva2VuIHRoYXQgaGFzCisgIC8vLyBvZmZzZXQgZ3JlYXRlciB0aGVuIFtzdG9wQWZ0ZXJdLCBhbmQgcHV0IG1hcHBpbmcgZnJvbSBvcmlnaW5hbHMgdG8gY2xvbmVzCisgIC8vLyBpbnRvIFtfY2xvbmVkVG9rZW5zXS4KKyAgLy8vCisgIC8vLyBXZSBjYW5ub3QgY2xvbmUgdG9rZW5zIGFzIHdlIHZpc2l0IG5vZGVzIGJlY2F1c2Ugbm90IGV2ZXJ5IHRva2VuIGlzIGEgcGFydAorICAvLy8gb2YgYSBub2RlLCBFLmcuIGNvbW1hcyBpbiBhcmd1bWVudCBsaXN0cyBhcmUgbm90IHJlcHJlc2VudGVkIGluIEFTVC4gQnV0CisgIC8vLyB3ZSBuZWVkIHRvIHRoZSBzZXF1ZW5jZSBvZiB0b2tlbnMgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIG9uZS4KICAgdm9pZCBfY2xvbmVUb2tlbnMoVG9rZW4gdG9rZW4sIGludCBzdG9wQWZ0ZXIpIHsKICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewogICAgICAgcmV0dXJuOwpAQCAtMTEyMSw3MyArMTA5Nyw1NSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGUgZ2l2ZW4gW25vZGVdLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGNsb25lIG9mIHRoZSBnaXZlbiBbbm9kZV0uCiAgIHN0YXRpYyBBc3ROb2RlIGNsb25lKEFzdE5vZGUgbm9kZSkgewogICAgIHJldHVybiBub2RlLmFjY2VwdChBc3RDbG9uZXIoKSk7CiAgIH0KIH0KIAotLyoqCi0gKiBBbiBBc3RWaXNpdG9yIHRoYXQgY29tcGFyZXMgdGhlIHN0cnVjdHVyZSBvZiB0d28gQXN0Tm9kZXMgdG8gc2VlIHdoZXRoZXIgdGhleQotICogYXJlIGVxdWFsLgotICovCisvLy8gQW4gQXN0VmlzaXRvciB0aGF0IGNvbXBhcmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdHdvIEFzdE5vZGVzIHRvIHNlZSB3aGV0aGVyCisvLy8gdGhleSBhcmUgZXF1YWwuCiBjbGFzcyBBc3RDb21wYXJhdG9yIGltcGxlbWVudHMgQXN0VmlzaXRvcjxib29sPiB7Ci0gIC8qKgotICAgKiBUaGUgQVNUIG5vZGUgd2l0aCB3aGljaCB0aGUgbm9kZSBiZWluZyB2aXNpdGVkIGlzIHRvIGJlIGNvbXBhcmVkLiBUaGlzIGlzCi0gICAqIG9ubHkgdmFsaWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHZpc2l0IG1ldGhvZCAodW50aWwgW2lzRXF1YWxOb2Rlc10gaXMKLSAgICogaW52b2tlZCkuCi0gICAqLworICAvLy8gVGhlIEFTVCBub2RlIHdpdGggd2hpY2ggdGhlIG5vZGUgYmVpbmcgdmlzaXRlZCBpcyB0byBiZSBjb21wYXJlZC4gVGhpcyBpcworICAvLy8gb25seSB2YWxpZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggdmlzaXQgbWV0aG9kICh1bnRpbCBbaXNFcXVhbE5vZGVzXSBpcworICAvLy8gaW52b2tlZCkuCiAgIEFzdE5vZGUgX290aGVyOwogCi0gIC8qKgotICAgKiBOb3RpZnkgdGhhdCBbZmlyc3RdIGFuZCBzZWNvbmQgaGF2ZSBkaWZmZXJlbnQgbGVuZ3RoLgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYGZhbHNlYC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIHRocm93LgotICAgKi8KKyAgLy8vIE5vdGlmeSB0aGF0IFtmaXJzdF0gYW5kIHNlY29uZCBoYXZlIGRpZmZlcmVudCBsZW5ndGguCisgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYGZhbHNlYC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIHRocm93LgogICBib29sIGZhaWxEaWZmZXJlbnRMZW5ndGgoTGlzdCBmaXJzdCwgTGlzdCBzZWNvbmQpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciB0aGUgdmFsdWVzIG9mIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBub2RlcyBhcmUgW2VxdWFsXS4KLSAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gdGhyb3cuCi0gICAqLworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgdmFsdWVzIG9mIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBub2RlcyBhcmUgW2VxdWFsXS4KKyAgLy8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIHRocm93LgogICBib29sIGZhaWxJZk5vdEVxdWFsKAogICAgICAgQXN0Tm9kZSBmaXJzdCwgT2JqZWN0IGZpcnN0VmFsdWUsIEFzdE5vZGUgc2Vjb25kLCBPYmplY3Qgc2Vjb25kVmFsdWUpIHsKICAgICByZXR1cm4gZmlyc3RWYWx1ZSA9PSBzZWNvbmRWYWx1ZTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIFtzZWNvbmRdIGlzIG51bGwuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIHRocm93LgotICAgKi8KKyAgLy8vIENoZWNrIHdoZXRoZXIgW3NlY29uZF0gaXMgbnVsbC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gdGhyb3cuCiAgIGJvb2wgZmFpbElmTm90TnVsbChPYmplY3QgZmlyc3QsIE9iamVjdCBzZWNvbmQpIHsKICAgICByZXR1cm4gc2Vjb25kID09IG51bGw7CiAgIH0KIAotICAvKioKLSAgICogTm90aWZ5IHRoYXQgW2ZpcnN0XSBpcyBub3QgYG51bGxgIHdoaWxlIFtzZWNvbmRdIG9uZSBpcyBgbnVsbGAuCi0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgZmFsc2VgLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgdGhyb3cuCi0gICAqLworICAvLy8gTm90aWZ5IHRoYXQgW2ZpcnN0XSBpcyBub3QgYG51bGxgIHdoaWxlIFtzZWNvbmRdIG9uZSBpcyBgbnVsbGAuCisgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYGZhbHNlYC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIHRocm93LgogICBib29sIGZhaWxJc051bGwoT2JqZWN0IGZpcnN0LCBPYmplY3Qgc2Vjb25kKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIE5vdGlmeSB0aGF0IFtmaXJzdF0gYW5kIFtzZWNvbmRdIGhhdmUgZGlmZmVyZW50IHR5cGVzLgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYGZhbHNlYC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIHRocm93LgotICAgKi8KKyAgLy8vIE5vdGlmeSB0aGF0IFtmaXJzdF0gYW5kIFtzZWNvbmRdIGhhdmUgZGlmZmVyZW50IHR5cGVzLgorICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGBmYWxzZWAuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCB0aHJvdy4KICAgYm9vbCBmYWlsUnVudGltZVR5cGUoT2JqZWN0IGZpcnN0LCBPYmplY3Qgc2Vjb25kKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gbm9kZSBhbmQgdGhlIFtzZWNvbmRdIG5vZGUgaGF2ZSB0aGUgc2FtZQotICAgKiBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqICpOb3RlOiogVGhpcyBtZXRob2QgaXMgb25seSB2aXNpYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCBzaG91bGQgbm90IGJlCi0gICAqIHVzZWQgYnkgY2xpZW50cy4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIG5vZGUgYW5kIHRoZSBbc2Vjb25kXSBub2RlIGhhdmUgdGhlIHNhbWUKKyAgLy8vIHN0cnVjdHVyZS4KKyAgLy8vCisgIC8vLyAqTm90ZToqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdmlzaWJsZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgc2hvdWxkIG5vdCBiZQorICAvLy8gdXNlZCBieSBjbGllbnRzLgogICBib29sIGlzRXF1YWxOb2RlcyhBc3ROb2RlIGZpcnN0LCBBc3ROb2RlIHNlY29uZCkgewogICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gZmFpbElmTm90TnVsbChmaXJzdCwgc2Vjb25kKTsKQEAgLTEyMDAsMTMgKzExNTgsMTEgQEAKICAgICByZXR1cm4gZmlyc3QuYWNjZXB0KHRoaXMpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gdG9rZW4gYW5kIHRoZSBbc2Vjb25kXSB0b2tlbiBoYXZlIHRoZSBzYW1lCi0gICAqIHN0cnVjdHVyZS4KLSAgICoKLSAgICogKk5vdGU6KiBUaGlzIG1ldGhvZCBpcyBvbmx5IHZpc2libGUgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUKLSAgICogdXNlZCBieSBjbGllbnRzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gdG9rZW4gYW5kIHRoZSBbc2Vjb25kXSB0b2tlbiBoYXZlIHRoZSBzYW1lCisgIC8vLyBzdHJ1Y3R1cmUuCisgIC8vLworICAvLy8gKk5vdGU6KiBUaGlzIG1ldGhvZCBpcyBvbmx5IHZpc2libGUgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUKKyAgLy8vIHVzZWQgYnkgY2xpZW50cy4KICAgYm9vbCBpc0VxdWFsVG9rZW5zKFRva2VuIGZpcnN0LCBUb2tlbiBzZWNvbmQpIHsKICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIGZhaWxJZk5vdE51bGwoZmlyc3QsIHNlY29uZCk7CkBAIC0xMjE4LDEwICsxMTc0LDggQEAKICAgICByZXR1cm4gaXNFcXVhbFRva2Vuc05vdE51bGwoZmlyc3QsIHNlY29uZCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2ZpcnN0XSB0b2tlbiBhbmQgdGhlIFtzZWNvbmRdIHRva2VuIGhhdmUgdGhlIHNhbWUKLSAgICogc3RydWN0dXJlLiAgQm90aCBbZmlyc3RdIGFuZCBbc2Vjb25kXSBhcmUgbm90IGBudWxsYC4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIHRva2VuIGFuZCB0aGUgW3NlY29uZF0gdG9rZW4gaGF2ZSB0aGUgc2FtZQorICAvLy8gc3RydWN0dXJlLiAgQm90aCBbZmlyc3RdIGFuZCBbc2Vjb25kXSBhcmUgbm90IGBudWxsYC4KICAgYm9vbCBpc0VxdWFsVG9rZW5zTm90TnVsbChUb2tlbiBmaXJzdCwgVG9rZW4gc2Vjb25kKSA9PgogICAgICAgZmlyc3Qub2Zmc2V0ID09IHNlY29uZC5vZmZzZXQgJiYKICAgICAgIGZpcnN0Lmxlbmd0aCA9PSBzZWNvbmQubGVuZ3RoICYmCkBAIC0yMzQ0LDEwICsyMjk4LDggQEAKICAgICAgICAgaXNFcXVhbFRva2Vucyhub2RlLnNlbWljb2xvbiwgb3RoZXIuc2VtaWNvbG9uKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBsaXN0cyBvZiBBU1Qgbm9kZXMgaGF2ZSB0aGUgc2FtZQotICAgKiBzaXplIGFuZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGFyZSBlcXVhbC4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBsaXN0cyBvZiBBU1Qgbm9kZXMgaGF2ZSB0aGUgc2FtZQorICAvLy8gc2l6ZSBhbmQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBhcmUgZXF1YWwuCiAgIGJvb2wgX2lzRXF1YWxOb2RlTGlzdHMoTm9kZUxpc3QgZmlyc3QsIE5vZGVMaXN0IHNlY29uZCkgewogICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gZmFpbElmTm90TnVsbChmaXJzdCwgc2Vjb25kKTsKQEAgLTIzNjYsMTAgKzIzMTgsOCBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIGxpc3RzIG9mIHRva2VucyBoYXZlIHRoZSBzYW1lCi0gICAqIGxlbmd0aCBhbmQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBhcmUgZXF1YWwuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2ZpcnN0XSBhbmQgW3NlY29uZF0gbGlzdHMgb2YgdG9rZW5zIGhhdmUgdGhlIHNhbWUKKyAgLy8vIGxlbmd0aCBhbmQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBhcmUgZXF1YWwuCiAgIGJvb2wgX2lzRXF1YWxUb2tlbkxpc3RzKExpc3Q8VG9rZW4+IGZpcnN0LCBMaXN0PFRva2VuPiBzZWNvbmQpIHsKICAgICBpbnQgbGVuZ3RoID0gZmlyc3QubGVuZ3RoOwogICAgIGlmIChzZWNvbmQubGVuZ3RoICE9IGxlbmd0aCkgewpAQCAtMjM4MywzMyArMjMzMywyNSBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIG5vZGVzIGFyZSBlcXVhbC4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBub2RlcyBhcmUgZXF1YWwuCiAgIHN0YXRpYyBib29sIGVxdWFsTm9kZXMoQXN0Tm9kZSBmaXJzdCwgQXN0Tm9kZSBzZWNvbmQpIHsKICAgICBBc3RDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBBc3RDb21wYXJhdG9yKCk7CiAgICAgcmV0dXJuIGNvbXBhcmF0b3IuaXNFcXVhbE5vZGVzKGZpcnN0LCBzZWNvbmQpOwogICB9CiB9CiAKLS8qKgotICogQSByZWN1cnNpdmUgQVNUIHZpc2l0b3IgdGhhdCBpcyB1c2VkIHRvIHJ1biBvdmVyIFtFeHByZXNzaW9uXXMgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIGNvbXBvc2VkIGJ5IGF0IGxlYXN0IG9uZSBkZWZlcnJlZAotICogW1ByZWZpeGVkSWRlbnRpZmllcl0uCi0gKgotICogU2VlIFtQcmVmaXhlZElkZW50aWZpZXIuaXNEZWZlcnJlZF0uCi0gKi8KKy8vLyBBIHJlY3Vyc2l2ZSBBU1QgdmlzaXRvciB0aGF0IGlzIHVzZWQgdG8gcnVuIG92ZXIgW0V4cHJlc3Npb25dcyB0byBkZXRlcm1pbmUKKy8vLyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIGNvbXBvc2VkIGJ5IGF0IGxlYXN0IG9uZSBkZWZlcnJlZAorLy8vIFtQcmVmaXhlZElkZW50aWZpZXJdLgorLy8vCisvLy8gU2VlIFtQcmVmaXhlZElkZW50aWZpZXIuaXNEZWZlcnJlZF0uCiBjbGFzcyBEZWZlcnJlZExpYnJhcnlSZWZlcmVuY2VEZXRlY3RvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3I8dm9pZD4gewotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhbiBpZGVudGlmaWVyIGZyb20gYSBkZWZlcnJlZCBsaWJyYXJ5IGhhcyBiZWVuCi0gICAqIGZvdW5kLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gaWRlbnRpZmllciBmcm9tIGEgZGVmZXJyZWQgbGlicmFyeSBoYXMgYmVlbgorICAvLy8gZm91bmQuCiAgIGJvb2wgX3Jlc3VsdCA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSB2aXNpdG9yIGZvdW5kIGEgW1ByZWZpeGVkSWRlbnRpZmllcl0gdGhhdCByZXR1cm5lZAotICAgKiBgdHJ1ZWAgdG8gdGhlIFtQcmVmaXhlZElkZW50aWZpZXIuaXNEZWZlcnJlZF0gcXVlcnkuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgdmlzaXRvciBmb3VuZCBhIFtQcmVmaXhlZElkZW50aWZpZXJdIHRoYXQgcmV0dXJuZWQKKyAgLy8vIGB0cnVlYCB0byB0aGUgW1ByZWZpeGVkSWRlbnRpZmllci5pc0RlZmVycmVkXSBxdWVyeS4KICAgYm9vbCBnZXQgcmVzdWx0ID0+IF9yZXN1bHQ7CiAKICAgQG92ZXJyaWRlCkBAIC0yNDIyLDI0ICsyMzY0LDE4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIFtEZWxlZ2F0aW5nQXN0VmlzaXRvcl0gdGhhdCB3aWxsIGFkZGl0aW9uYWxseSBjYXRjaCBhbGwgZXhjZXB0aW9ucyBmcm9tIHRoZQotICogZGVsZWdhdGVzIHdpdGhvdXQgc3RvcHBpbmcgdGhlIHZpc2l0aW5nLiBBIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdGhhdAotICogd2lsbCBiZSBpbnZva2VkIGZvciBlYWNoIHN1Y2ggZXhjZXB0aW9uLgotICoKLSAqIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KLSAqLworLy8vIEEgW0RlbGVnYXRpbmdBc3RWaXNpdG9yXSB0aGF0IHdpbGwgYWRkaXRpb25hbGx5IGNhdGNoIGFsbCBleGNlcHRpb25zIGZyb20KKy8vLyB0aGUgZGVsZWdhdGVzIHdpdGhvdXQgc3RvcHBpbmcgdGhlIHZpc2l0aW5nLiBBIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQKKy8vLyB0aGF0IHdpbGwgYmUgaW52b2tlZCBmb3IgZWFjaCBzdWNoIGV4Y2VwdGlvbi4KKy8vLworLy8vIENsaWVudHMgbWF5IG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXgtaW4gdGhpcyBjbGFzcy4KIGNsYXNzIEV4Y2VwdGlvbkhhbmRsaW5nRGVsZWdhdGluZ0FzdFZpc2l0b3I8VD4gZXh0ZW5kcyBEZWxlZ2F0aW5nQXN0VmlzaXRvcjxUPiB7Ci0gIC8qKgotICAgKiBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBieSBvbmUKLSAgICogb2YgdGhlIHZpc2l0IG1ldGhvZHMgb24gdGhlIGRlbGVnYXRlLgotICAgKi8KKyAgLy8vIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGVhY2ggZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGJ5CisgIC8vLyBvbmUgb2YgdGhlIHZpc2l0IG1ldGhvZHMgb24gdGhlIGRlbGVnYXRlLgogICBmaW5hbCBFeGNlcHRpb25JbkRlbGVnYXRlSGFuZGxlciBoYW5kbGVyOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB2aXNpdG9yIHRvIHVzZSBlYWNoIG9mIHRoZSBnaXZlbiBkZWxlZ2F0ZQotICAgKiB2aXNpdG9ycyB0byB2aXNpdCB0aGUgbm9kZXMgb2YgYW4gQVNUIHN0cnVjdHVyZS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB2aXNpdG9yIHRvIHVzZSBlYWNoIG9mIHRoZSBnaXZlbiBkZWxlZ2F0ZQorICAvLy8gdmlzaXRvcnMgdG8gdmlzaXQgdGhlIG5vZGVzIG9mIGFuIEFTVCBzdHJ1Y3R1cmUuCiAgIEV4Y2VwdGlvbkhhbmRsaW5nRGVsZWdhdGluZ0FzdFZpc2l0b3IoCiAgICAgICBJdGVyYWJsZTxBc3RWaXNpdG9yPFQ+PiBkZWxlZ2F0ZXMsIHRoaXMuaGFuZGxlcikKICAgICAgIDogc3VwZXIoZGVsZWdhdGVzKSB7CkBAIC0yNDYxLDEwICsyMzk3LDggQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBsb2cgYW5kIHRoZW4KLSAgICogaWdub3JlIGFueSBleGNlcHRpb25zIHRoYXQgYXJlIHRocm93biBieSBhbnkgb2YgdGhlIGRlbGVnYXRlcy4KLSAgICovCisgIC8vLyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBsb2cgYW5kIHRoZW4KKyAgLy8vIGlnbm9yZSBhbnkgZXhjZXB0aW9ucyB0aGF0IGFyZSB0aHJvd24gYnkgYW55IG9mIHRoZSBkZWxlZ2F0ZXMuCiAgIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbigKICAgICAgIEFzdE5vZGUgbm9kZSwgT2JqZWN0IHZpc2l0b3IsIGR5bmFtaWMgZXhjZXB0aW9uLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gU3RyaW5nQnVmZmVyKCk7CkBAIC0yNDg2LDQ5ICsyNDIwLDM1IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBbiBvYmplY3QgdXNlZCB0byBsb2NhdGUgdGhlIFtBc3ROb2RlXSBhc3NvY2lhdGVkIHdpdGggYSBzb3VyY2UgcmFuZ2UsIGdpdmVuCi0gKiB0aGUgQVNUIHN0cnVjdHVyZSBidWlsdCBmcm9tIHRoZSBzb3VyY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGV5IHdpbGwgcmV0dXJuCi0gKiB0aGUgW0FzdE5vZGVdIHdpdGggdGhlIHNob3J0ZXN0IGxlbmd0aCB3aG9zZSBzb3VyY2UgcmFuZ2UgY29tcGxldGVseQotICogZW5jb21wYXNzZXMgdGhlIHNwZWNpZmllZCByYW5nZS4KLSAqLworLy8vIEFuIG9iamVjdCB1c2VkIHRvIGxvY2F0ZSB0aGUgW0FzdE5vZGVdIGFzc29jaWF0ZWQgd2l0aCBhIHNvdXJjZSByYW5nZSwgZ2l2ZW4KKy8vLyB0aGUgQVNUIHN0cnVjdHVyZSBidWlsdCBmcm9tIHRoZSBzb3VyY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGV5IHdpbGwgcmV0dXJuCisvLy8gdGhlIFtBc3ROb2RlXSB3aXRoIHRoZSBzaG9ydGVzdCBsZW5ndGggd2hvc2Ugc291cmNlIHJhbmdlIGNvbXBsZXRlbHkKKy8vLyBlbmNvbXBhc3NlcyB0aGUgc3BlY2lmaWVkIHJhbmdlLgogY2xhc3MgTm9kZUxvY2F0b3IgZXh0ZW5kcyBVbmlmeWluZ0FzdFZpc2l0b3I8dm9pZD4gewotICAvKioKLSAgICogVGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZS4KLSAgICovCisgIC8vLyBUaGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBub2RlLgogICBmaW5hbCBpbnQgX3N0YXJ0T2Zmc2V0OwogCi0gIC8qKgotICAgKiBUaGUgZW5kIG9mZnNldCBvZiB0aGUgcmFuZ2UgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZS4KLSAgICovCisgIC8vLyBUaGUgZW5kIG9mZnNldCBvZiB0aGUgcmFuZ2UgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZS4KICAgZmluYWwgaW50IF9lbmRPZmZzZXQ7CiAKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHRoYXQgd2FzIGZvdW5kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHNvdXJjZSByYW5nZSwgb3IKLSAgICogYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudC4KLSAgICovCisgIC8vLyBUaGUgZWxlbWVudCB0aGF0IHdhcyBmb3VuZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBzb3VyY2UgcmFuZ2UsIG9yCisgIC8vLyBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50LgogICBBc3ROb2RlIF9mb3VuZE5vZGU7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGxvY2F0b3IgdG8gbG9jYXRlIGFuIFtBc3ROb2RlXSBieSBsb2NhdGluZyB0aGUKLSAgICogbm9kZSB3aXRoaW4gYW4gQVNUIHN0cnVjdHVyZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiByYW5nZSBvZgotICAgKiBjaGFyYWN0ZXJzIChiZXR3ZWVuIHRoZSBbc3RhcnRPZmZzZXRdIGFuZCBbZW5kT2Zmc2V0XSBpbiB0aGUgc291cmNlLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGxvY2F0b3IgdG8gbG9jYXRlIGFuIFtBc3ROb2RlXSBieSBsb2NhdGluZyB0aGUKKyAgLy8vIG5vZGUgd2l0aGluIGFuIEFTVCBzdHJ1Y3R1cmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gcmFuZ2Ugb2YKKyAgLy8vIGNoYXJhY3RlcnMgKGJldHdlZW4gdGhlIFtzdGFydE9mZnNldF0gYW5kIFtlbmRPZmZzZXRdIGluIHRoZSBzb3VyY2UuCiAgIE5vZGVMb2NhdG9yKGludCBzdGFydE9mZnNldCwgW2ludCBlbmRPZmZzZXRdKQogICAgICAgOiB0aGlzLl9zdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0LAogICAgICAgICB0aGlzLl9lbmRPZmZzZXQgPSBlbmRPZmZzZXQgPz8gc3RhcnRPZmZzZXQ7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbm9kZSB0aGF0IHdhcyBmb3VuZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBzb3VyY2UgcmFuZ2UKLSAgICogb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIG5vZGUgdGhhdCB3YXMgZm91bmQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gc291cmNlIHJhbmdlCisgIC8vLyBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLgogICBBc3ROb2RlIGdldCBmb3VuZE5vZGUgPT4gX2ZvdW5kTm9kZTsKIAotICAvKioKLSAgICogU2VhcmNoIHdpdGhpbiB0aGUgZ2l2ZW4gQVNUIFtub2RlXSBmb3IgYW4gaWRlbnRpZmllciByZXByZXNlbnRpbmcgYW4KLSAgICogZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSByYW5nZS4gUmV0dXJuIHRoZSBlbGVtZW50IHRoYXQgd2FzIGZvdW5kLAotICAgKiBvciBgbnVsbGAgaWYgbm8gZWxlbWVudCB3YXMgZm91bmQuCi0gICAqLworICAvLy8gU2VhcmNoIHdpdGhpbiB0aGUgZ2l2ZW4gQVNUIFtub2RlXSBmb3IgYW4gaWRlbnRpZmllciByZXByZXNlbnRpbmcgYW4KKyAgLy8vIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBzb3VyY2UgcmFuZ2UuIFJldHVybiB0aGUgZWxlbWVudCB0aGF0IHdhcyBmb3VuZCwKKyAgLy8vIG9yIGBudWxsYCBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KICAgQXN0Tm9kZSBzZWFyY2hXaXRoaW4oQXN0Tm9kZSBub2RlKSB7CiAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC0yNTkzLDExICsyNTEzLDkgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIG9iamVjdCB1c2VkIHRvIGxvY2F0ZSB0aGUgW0FzdE5vZGVdIGFzc29jaWF0ZWQgd2l0aCBhIHNvdXJjZSByYW5nZS4KLSAqIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGV5IHdpbGwgcmV0dXJuIHRoZSBkZWVwZXN0IFtBc3ROb2RlXSB3aGljaCBjb21wbGV0ZWx5Ci0gKiBlbmNvbXBhc3NlcyB0aGUgc3BlY2lmaWVkIHJhbmdlLgotICovCisvLy8gQW4gb2JqZWN0IHVzZWQgdG8gbG9jYXRlIHRoZSBbQXN0Tm9kZV0gYXNzb2NpYXRlZCB3aXRoIGEgc291cmNlIHJhbmdlLgorLy8vIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGV5IHdpbGwgcmV0dXJuIHRoZSBkZWVwZXN0IFtBc3ROb2RlXSB3aGljaCBjb21wbGV0ZWx5CisvLy8gZW5jb21wYXNzZXMgdGhlIHNwZWNpZmllZCByYW5nZS4KIGNsYXNzIE5vZGVMb2NhdG9yMiBleHRlbmRzIFVuaWZ5aW5nQXN0VmlzaXRvcjx2b2lkPiB7CiAgIC8vLyBUaGUgaW5jbHVzaXZlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmFuZ2UgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZS4KICAgZmluYWwgaW50IF9zdGFydE9mZnNldDsKQEAgLTI2MDUsMjYgKzI1MjMsMjAgQEAKICAgLy8vIFRoZSBpbmNsdXNpdmUgZW5kIG9mZnNldCBvZiB0aGUgcmFuZ2UgdXNlZCB0byBpZGVudGlmeSB0aGUgbm9kZS4KICAgZmluYWwgaW50IF9lbmRPZmZzZXQ7CiAKLSAgLyoqCi0gICAqIFRoZSBmb3VuZCBub2RlIG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUuCi0gICAqLworICAvLy8gVGhlIGZvdW5kIG5vZGUgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZS4KICAgQXN0Tm9kZSBfZm91bmROb2RlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBsb2NhdG9yIHRvIGxvY2F0ZSB0aGUgZGVlcGVzdCBbQXN0Tm9kZV0gZm9yCi0gICAqIHdoaWNoIGBub2RlLm9mZnNldCA8PSBbc3RhcnRPZmZzZXRdYCBhbmQgYFtlbmRPZmZzZXRdIDwgbm9kZS5lbmRgLgotICAgKgotICAgKiBJZiBbZW5kT2Zmc2V0XSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyB0aGUKLSAgICogZ2l2ZW4gW3N0YXJ0T2Zmc2V0XS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBsb2NhdG9yIHRvIGxvY2F0ZSB0aGUgZGVlcGVzdCBbQXN0Tm9kZV0gZm9yCisgIC8vLyB3aGljaCBgbm9kZS5vZmZzZXQgPD0gW3N0YXJ0T2Zmc2V0XWAgYW5kIGBbZW5kT2Zmc2V0XSA8IG5vZGUuZW5kYC4KKyAgLy8vCisgIC8vLyBJZiBbZW5kT2Zmc2V0XSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyB0aGUKKyAgLy8vIGdpdmVuIFtzdGFydE9mZnNldF0uCiAgIE5vZGVMb2NhdG9yMihpbnQgc3RhcnRPZmZzZXQsIFtpbnQgZW5kT2Zmc2V0XSkKICAgICAgIDogdGhpcy5fc3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldCwKICAgICAgICAgdGhpcy5fZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0ID8/IHN0YXJ0T2Zmc2V0OwogCi0gIC8qKgotICAgKiBTZWFyY2ggd2l0aGluIHRoZSBnaXZlbiBBU1QgW25vZGVdIGFuZCByZXR1cm4gdGhlIG5vZGUgdGhhdCB3YXMgZm91bmQsCi0gICAqIG9yIGBudWxsYCBpZiBubyBub2RlIHdhcyBmb3VuZC4KLSAgICovCisgIC8vLyBTZWFyY2ggd2l0aGluIHRoZSBnaXZlbiBBU1QgW25vZGVdIGFuZCByZXR1cm4gdGhlIG5vZGUgdGhhdCB3YXMgZm91bmQsCisgIC8vLyBvciBgbnVsbGAgaWYgbm8gbm9kZSB3YXMgZm91bmQuCiAgIEFzdE5vZGUgc2VhcmNoV2l0aGluKEFzdE5vZGUgbm9kZSkgewogICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsOwpAQCAtMjYzMyw5ICsyNTQ1LDEwIEBACiAgICAgICBub2RlLmFjY2VwdCh0aGlzKTsKICAgICB9IGNhdGNoIChleGNlcHRpb24sIHN0YWNrVHJhY2UpIHsKICAgICAgIC8vIFRPRE8oMzkyODQpOiBzaG91bGQgdGhpcyBleGNlcHRpb24gYmUgc2lsZW50PwotICAgICAgQW5hbHlzaXNFbmdpbmUuaW5zdGFuY2UuaW5zdHJ1bWVudGF0aW9uU2VydmljZS5sb2dFeGNlcHRpb24oCi0gICAgICAgICAgU2lsZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvY2F0ZSBlbGVtZW50IGF0IG9mZnNldCAoJF9zdGFydE9mZnNldCAtICRfZW5kT2Zmc2V0KSIsCisgICAgICBBbmFseXNpc0VuZ2luZS5pbnN0YW5jZS5pbnN0cnVtZW50YXRpb25TZXJ2aWNlCisgICAgICAgICAgLmxvZ0V4Y2VwdGlvbihTaWxlbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICdVbmFibGUgdG8gbG9jYXRlIGVsZW1lbnQgYXQgb2Zmc2V0ICcKKyAgICAgICAgICAgICAgJygkX3N0YXJ0T2Zmc2V0IC0gJF9lbmRPZmZzZXQpJywKICAgICAgICAgICAgICAgZXhjZXB0aW9uLAogICAgICAgICAgICAgICBzdGFja1RyYWNlKSk7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI2ODksMjQgKzI2MDIsMTYgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIG9iamVjdCB0aGF0IHdpbGwgcmVwbGFjZSBvbmUgY2hpbGQgbm9kZSBpbiBhbiBBU1Qgbm9kZSB3aXRoIGFub3RoZXIgbm9kZS4KLSAqLworLy8vIEFuIG9iamVjdCB0aGF0IHdpbGwgcmVwbGFjZSBvbmUgY2hpbGQgbm9kZSBpbiBhbiBBU1Qgbm9kZSB3aXRoIGFub3RoZXIgbm9kZS4KIGNsYXNzIE5vZGVSZXBsYWNlciBpbXBsZW1lbnRzIEFzdFZpc2l0b3I8Ym9vbD4gewotICAvKioKLSAgICogVGhlIG5vZGUgYmVpbmcgcmVwbGFjZWQuCi0gICAqLworICAvLy8gVGhlIG5vZGUgYmVpbmcgcmVwbGFjZWQuCiAgIGZpbmFsIEFzdE5vZGUgX29sZE5vZGU7CiAKLSAgLyoqCi0gICAqIFRoZSBub2RlIHRoYXQgaXMgcmVwbGFjaW5nIHRoZSBvbGQgbm9kZS4KLSAgICovCisgIC8vLyBUaGUgbm9kZSB0aGF0IGlzIHJlcGxhY2luZyB0aGUgb2xkIG5vZGUuCiAgIGZpbmFsIEFzdE5vZGUgX25ld05vZGU7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIG5vZGUgbG9jYXRvciB0byByZXBsYWNlIHRoZSBbX29sZE5vZGVdIHdpdGggdGhlCi0gICAqIFtfbmV3Tm9kZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgbm9kZSBsb2NhdG9yIHRvIHJlcGxhY2UgdGhlIFtfb2xkTm9kZV0gd2l0aCB0aGUKKyAgLy8vIFtfbmV3Tm9kZV0uCiAgIE5vZGVSZXBsYWNlcih0aGlzLl9vbGROb2RlLCB0aGlzLl9uZXdOb2RlKTsKIAogICBAb3ZlcnJpZGUKQEAgLTQwNDQsMTMgKzM5NDksMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogUmVwbGFjZSB0aGUgW29sZE5vZGVdIHdpdGggdGhlIFtuZXdOb2RlXSBpbiB0aGUgQVNUIHN0cnVjdHVyZSBjb250YWluaW5nCi0gICAqIHRoZSBvbGQgbm9kZS4gUmV0dXJuIGB0cnVlYCBpZiB0aGUgcmVwbGFjZW1lbnQgd2FzIHN1Y2Nlc3NmdWwuCi0gICAqCi0gICAqIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWYgZWl0aGVyIG5vZGUgaXMgYG51bGxgLCBpZiB0aGUgb2xkIG5vZGUgZG9lcwotICAgKiBub3QgaGF2ZSBhIHBhcmVudCBub2RlLCBvciBpZiB0aGUgQVNUIHN0cnVjdHVyZSBoYXMgYmVlbiBjb3JydXB0ZWQuCi0gICAqLworICAvLy8gUmVwbGFjZSB0aGUgW29sZE5vZGVdIHdpdGggdGhlIFtuZXdOb2RlXSBpbiB0aGUgQVNUIHN0cnVjdHVyZSBjb250YWluaW5nCisgIC8vLyB0aGUgb2xkIG5vZGUuIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHJlcGxhY2VtZW50IHdhcyBzdWNjZXNzZnVsLgorICAvLy8KKyAgLy8vIFRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0gaWYgZWl0aGVyIG5vZGUgaXMgYG51bGxgLCBpZiB0aGUgb2xkIG5vZGUgZG9lcworICAvLy8gbm90IGhhdmUgYSBwYXJlbnQgbm9kZSwgb3IgaWYgdGhlIEFTVCBzdHJ1Y3R1cmUgaGFzIGJlZW4gY29ycnVwdGVkLgogICBzdGF0aWMgYm9vbCByZXBsYWNlKEFzdE5vZGUgb2xkTm9kZSwgQXN0Tm9kZSBuZXdOb2RlKSB7CiAgICAgaWYgKG9sZE5vZGUgPT0gbnVsbCB8fCBuZXdOb2RlID09IG51bGwpIHsKICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIlRoZSBvbGQgYW5kIG5ldyBub2RlcyBtdXN0IGJlIG5vbi1udWxsIik7CkBAIC00MDY2LDE3ICszOTY5LDEzIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBbiBvYmplY3QgdGhhdCBjb3BpZXMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBmcm9tIG9uZSBBU1Qgc3RydWN0dXJlIHRvCi0gKiBhbm90aGVyIGFzIGxvbmcgYXMgdGhlIHN0cnVjdHVyZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hpbGRyZW4gb2YgYSBwYWlyIG9mCi0gKiBub2RlcyBhcmUgdGhlIHNhbWUuCi0gKi8KKy8vLyBBbiBvYmplY3QgdGhhdCBjb3BpZXMgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBmcm9tIG9uZSBBU1Qgc3RydWN0dXJlIHRvCisvLy8gYW5vdGhlciBhcyBsb25nIGFzIHRoZSBzdHJ1Y3R1cmVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoaWxkcmVuIG9mIGEgcGFpciBvZgorLy8vIG5vZGVzIGFyZSB0aGUgc2FtZS4KIGNsYXNzIFJlc29sdXRpb25Db3BpZXIgaW1wbGVtZW50cyBBc3RWaXNpdG9yPGJvb2w+IHsKLSAgLyoqCi0gICAqIFRoZSBBU1Qgbm9kZSB3aXRoIHdoaWNoIHRoZSBub2RlIGJlaW5nIHZpc2l0ZWQgaXMgdG8gYmUgY29tcGFyZWQuIFRoaXMgaXMKLSAgICogb25seSB2YWxpZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggdmlzaXQgbWV0aG9kICh1bnRpbCBbaXNFcXVhbE5vZGVzXSBpcwotICAgKiBpbnZva2VkKS4KLSAgICovCisgIC8vLyBUaGUgQVNUIG5vZGUgd2l0aCB3aGljaCB0aGUgbm9kZSBiZWluZyB2aXNpdGVkIGlzIHRvIGJlIGNvbXBhcmVkLiBUaGlzIGlzCisgIC8vLyBvbmx5IHZhbGlkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCB2aXNpdCBtZXRob2QgKHVudGlsIFtpc0VxdWFsTm9kZXNdIGlzCisgIC8vLyBpbnZva2VkKS4KICAgQXN0Tm9kZSBfdG9Ob2RlOwogCiAgIEBvdmVycmlkZQpAQCAtNTQ4OCw5ICs1Mzg3LDcgQEAKICAgICAgICAgX2lzRXF1YWxUb2tlbnMobm9kZS5zZW1pY29sb24sIHRvTm9kZS5zZW1pY29sb24pKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgYHRydWVgLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBgdHJ1ZWAuCiAgIGJvb2wgX2FuZChib29sIGIxLCBib29sIGIyLAogICAgICAgW2Jvb2wgYjMgPSB0cnVlLAogICAgICAgYm9vbCBiNCA9IHRydWUsCkBAIC01NTE5LDEwICs1NDE2LDggQEAKICAgICAgICAgYjEzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIGxpc3RzIG9mIEFTVCBub2RlcyBoYXZlIHRoZSBzYW1lCi0gICAqIHNpemUgYW5kIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgYXJlIGVxdWFsLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIGxpc3RzIG9mIEFTVCBub2RlcyBoYXZlIHRoZSBzYW1lCisgIC8vLyBzaXplIGFuZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGFyZSBlcXVhbC4KICAgYm9vbCBfaXNFcXVhbE5vZGVMaXN0cyhOb2RlTGlzdCBmaXJzdCwgTm9kZUxpc3Qgc2Vjb25kKSB7CiAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKICAgICAgIHJldHVybiBzZWNvbmQgPT0gbnVsbDsKQEAgLTU1NDIsMTEgKzU0MzcsOSBAQAogICAgIHJldHVybiBlcXVhbDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZnJvbU5vZGVdIGFuZCBbdG9Ob2RlXSBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZS4gQXMgYQotICAgKiBzaWRlLWVmZmVjdCwgaWYgdGhlIG5vZGVzIGRvIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBhbnkgcmVzb2x1dGlvbiBkYXRhCi0gICAqIGZyb20gdGhlIGZpcnN0IG5vZGUgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHNlY29uZCBub2RlLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtmcm9tTm9kZV0gYW5kIFt0b05vZGVdIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLiBBcyBhCisgIC8vLyBzaWRlLWVmZmVjdCwgaWYgdGhlIG5vZGVzIGRvIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBhbnkgcmVzb2x1dGlvbiBkYXRhCisgIC8vLyBmcm9tIHRoZSBmaXJzdCBub2RlIHdpbGwgYmUgY29waWVkIHRvIHRoZSBzZWNvbmQgbm9kZS4KICAgYm9vbCBfaXNFcXVhbE5vZGVzKEFzdE5vZGUgZnJvbU5vZGUsIEFzdE5vZGUgdG9Ob2RlKSB7CiAgICAgaWYgKGZyb21Ob2RlID09IG51bGwpIHsKICAgICAgIHJldHVybiB0b05vZGUgPT0gbnVsbDsKQEAgLTU1NzUsMTAgKzU0NjgsOCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBhcnJheXMgb2YgdG9rZW5zIGhhdmUgdGhlIHNhbWUKLSAgICogbGVuZ3RoIGFuZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGFyZSBlcXVhbC4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSBhcnJheXMgb2YgdG9rZW5zIGhhdmUgdGhlIHNhbWUKKyAgLy8vIGxlbmd0aCBhbmQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBhcmUgZXF1YWwuCiAgIGJvb2wgX2lzRXF1YWxUb2tlbkxpc3RzKExpc3Q8VG9rZW4+IGZpcnN0LCBMaXN0PFRva2VuPiBzZWNvbmQpIHsKICAgICBpbnQgbGVuZ3RoID0gZmlyc3QubGVuZ3RoOwogICAgIGlmIChzZWNvbmQubGVuZ3RoICE9IGxlbmd0aCkgewpAQCAtNTU5Miw5ICs1NDgzLDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZmlyc3RdIGFuZCBbc2Vjb25kXSB0b2tlbnMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2ZpcnN0XSBhbmQgW3NlY29uZF0gdG9rZW5zIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLgogICBib29sIF9pc0VxdWFsVG9rZW5zKFRva2VuIGZpcnN0LCBUb2tlbiBzZWNvbmQpIHsKICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIHNlY29uZCA9PSBudWxsOwpAQCAtNTYwNCwyNCArNTQ5MywyMCBAQAogICAgIHJldHVybiBmaXJzdC5sZXhlbWUgPT0gc2Vjb25kLmxleGVtZTsKICAgfQogCi0gIC8qKgotICAgKiBDb3B5IHJlc29sdXRpb24gZGF0YSBmcm9tIHRoZSBbZnJvbU5vZGVdIHRvIHRoZSBbdG9Ob2RlXS4KLSAgICovCisgIC8vLyBDb3B5IHJlc29sdXRpb24gZGF0YSBmcm9tIHRoZSBbZnJvbU5vZGVdIHRvIHRoZSBbdG9Ob2RlXS4KICAgc3RhdGljIHZvaWQgY29weVJlc29sdXRpb25EYXRhKEFzdE5vZGUgZnJvbU5vZGUsIEFzdE5vZGUgdG9Ob2RlKSB7CiAgICAgUmVzb2x1dGlvbkNvcGllciBjb3BpZXIgPSBSZXNvbHV0aW9uQ29waWVyKCk7CiAgICAgY29waWVyLl9pc0VxdWFsTm9kZXMoZnJvbU5vZGUsIHRvTm9kZSk7CiAgIH0KIH0KIAotLyoqCi0gKiBUcmF2ZXJzZSB0aGUgQVNUIGZyb20gaW5pdGlhbCBjaGlsZCBub2RlIHRvIHN1Y2Nlc3NpdmUgcGFyZW50cywgYnVpbGRpbmcgYQotICogY29sbGVjdGlvbiBvZiBsb2NhbCB2YXJpYWJsZSBhbmQgcGFyYW1ldGVyIG5hbWVzIHZpc2libGUgdG8gdGhlIGluaXRpYWwgY2hpbGQKLSAqIG5vZGUuIEluIGNhc2Ugb2YgbmFtZSBzaGFkb3dpbmcsIHRoZSBmaXJzdCBuYW1lIHNlZW4gaXMgdGhlIG1vc3Qgc3BlY2lmaWMgb25lCi0gKiBzbyBuYW1lcyBhcmUgbm90IHJlZGVmaW5lZC4KLSAqCi0gKiBDb21wbGV0aW9uIHRlc3QgY29kZSBjb3ZlcmFnZSBpcyA5NSUuIFRoZSB0d28gYmFzaWMgYmxvY2tzIHRoYXQgYXJlIG5vdAotICogZXhlY3V0ZWQgY2Fubm90IGJlIGV4ZWN1dGVkLiBUaGV5IGFyZSBpbmNsdWRlZCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLSAqLworLy8vIFRyYXZlcnNlIHRoZSBBU1QgZnJvbSBpbml0aWFsIGNoaWxkIG5vZGUgdG8gc3VjY2Vzc2l2ZSBwYXJlbnRzLCBidWlsZGluZyBhCisvLy8gY29sbGVjdGlvbiBvZiBsb2NhbCB2YXJpYWJsZSBhbmQgcGFyYW1ldGVyIG5hbWVzIHZpc2libGUgdG8gdGhlIGluaXRpYWwKKy8vLyBjaGlsZCBub2RlLiBJbiBjYXNlIG9mIG5hbWUgc2hhZG93aW5nLCB0aGUgZmlyc3QgbmFtZSBzZWVuIGlzIHRoZSBtb3N0CisvLy8gc3BlY2lmaWMgb25lIHNvIG5hbWVzIGFyZSBub3QgcmVkZWZpbmVkLgorLy8vCisvLy8gQ29tcGxldGlvbiB0ZXN0IGNvZGUgY292ZXJhZ2UgaXMgOTUlLiBUaGUgdHdvIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBub3QKKy8vLyBleGVjdXRlZCBjYW5ub3QgYmUgZXhlY3V0ZWQuIFRoZXkgYXJlIGluY2x1ZGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlLgogY2xhc3MgU2NvcGVkTmFtZUZpbmRlciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3I8dm9pZD4gewogICBEZWNsYXJhdGlvbiBfZGVjbGFyYXRpb25Ob2RlOwogCkBAIC01NzU3LDEwICs1NjQyLDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdGhlIGdpdmVuIGxpc3Qgb2YgW3N0YXRlbWVudHNdIGZvciBhbnkgdGhhdCBjb21lIGJlZm9yZSB0aGUgaW1tZWRpYXRlCi0gICAqIGNoaWxkIGFuZCB0aGF0IGRlZmluZSBhIG5hbWUgdGhhdCB3b3VsZCBiZSB2aXNpYmxlIHRvIHRoZSBpbW1lZGlhdGUgY2hpbGQuCi0gICAqLworICAvLy8gQ2hlY2sgdGhlIGdpdmVuIGxpc3Qgb2YgW3N0YXRlbWVudHNdIGZvciBhbnkgdGhhdCBjb21lIGJlZm9yZSB0aGUKKyAgLy8vIGltbWVkaWF0ZSBjaGlsZCBhbmQgdGhhdCBkZWZpbmUgYSBuYW1lIHRoYXQgd291bGQgYmUgdmlzaWJsZSB0byB0aGUKKyAgLy8vIGltbWVkaWF0ZSBjaGlsZC4KICAgdm9pZCBfY2hlY2tTdGF0ZW1lbnRzKExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CiAgICAgZm9yIChTdGF0ZW1lbnQgc3RhdGVtZW50IGluIHN0YXRlbWVudHMpIHsKICAgICAgIGlmIChpZGVudGljYWwoc3RhdGVtZW50LCBfaW1tZWRpYXRlQ2hpbGQpKSB7CkBAIC01Nzg1LDEwICs1NjY5LDggQEAKICAgfQogfQogCi0vKioKLSAqIEEgdmlzaXRvciB1c2VkIHRvIHdyaXRlIGEgc291cmNlIHJlcHJlc2VudGF0aW9uIG9mIGEgdmlzaXRlZCBBU1Qgbm9kZSAoYW5kCi0gKiBhbGwgb2YgaXQncyBjaGlsZHJlbikgdG8gYSBzaW5rLgotICovCisvLy8gQSB2aXNpdG9yIHVzZWQgdG8gd3JpdGUgYSBzb3VyY2UgcmVwcmVzZW50YXRpb24gb2YgYSB2aXNpdGVkIEFTVCBub2RlIChhbmQKKy8vLyBhbGwgb2YgaXQncyBjaGlsZHJlbikgdG8gYSBzaW5rLgogQERlcHJlY2F0ZWQoJ1VzZSBUb1NvdXJjZVZpc2l0b3InKQogY2xhc3MgVG9Tb3VyY2VWaXNpdG9yMiBleHRlbmRzIFRvU291cmNlVmlzaXRvciB7CiAgIFRvU291cmNlVmlzaXRvcjIoU3RyaW5nU2luayBzaW5rKSA6IHN1cGVyKHNpbmspOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9jb21wdXRlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2NvbXB1dGUuZGFydAppbmRleCAwNzIwMTRhLi44MWRmMTZjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2NvbXB1dGUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2NvbXB1dGUuZGFydApAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50cy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC9ldmFsdWF0aW9uLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9saW5rLmRhcnQnIGFzIGdyYXBoCiAgICAgc2hvdyBEZXBlbmRlbmN5V2Fsa2VyLCBOb2RlOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2NvbnN0YW50X3ZlcmlmaWVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2NvbnN0YW50X3ZlcmlmaWVyLmRhcnQKaW5kZXggMzI1YzcxYS4uODgxZTUyMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9jb25zdGFudF92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvY29uc3RhbnRfdmVyaWZpZXIuZGFydApAQCAtMTgsMTAgKzE4LDEwIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvcG90ZW50aWFsbHlfY29uc3RhbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RpYWdub3N0aWMvZGlhZ25vc3RpY19mYWN0b3J5LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogCiAvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgQ29uc3RhbnRWZXJpZmllcmAgdHJhdmVyc2UgYW4gQVNUIHN0cnVjdHVyZSBsb29raW5nCiAvLy8gZm9yIGFkZGl0aW9uYWwgZXJyb3JzIGFuZCB3YXJuaW5ncyBub3QgY292ZXJlZCBieSB0aGUgcGFyc2VyIGFuZCByZXNvbHZlci4KQEAgLTUyNywxMCArNTI3LDEwIEBACiAgICAgICAgICAgICBEYXJ0T2JqZWN0SW1wbCByZXN1bHQgPSBpbml0aWFsaXplcgogICAgICAgICAgICAgICAgIC5hY2NlcHQoQ29uc3RhbnRWaXNpdG9yKF9ldmFsdWF0aW9uRW5naW5lLCBzdWJFcnJvclJlcG9ydGVyKSk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKAorICAgICAgICAgICAgICBfZXJyb3JSZXBvcnRlci5yZXBvcnRFcnJvckZvclRva2VuKAogICAgICAgICAgICAgICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUKICAgICAgICAgICAgICAgICAgICAgICAuQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9GSUVMRF9JTklUSUFMSVpFRF9CWV9OT05fQ09OU1QsCi0gICAgICAgICAgICAgICAgICBlcnJvclNpdGUsCisgICAgICAgICAgICAgICAgICBlcnJvclNpdGUuY29uc3RLZXl3b3JkLAogICAgICAgICAgICAgICAgICAgW3ZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZS5uYW1lXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9ldmFsdWF0aW9uLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2V2YWx1YXRpb24uZGFydAppbmRleCA5Y2Q3MjkyLi40MGRhMmFjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2V2YWx1YXRpb24uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2V2YWx1YXRpb24uZGFydApAQCAtMjYsMTIgKzI2LDEyIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JwogICAgIHNob3cgQW5hbHlzaXNFbmdpbmUsIFJlY29yZGluZ0Vycm9yTGlzdGVuZXI7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JyBzaG93IFR5cGVTeXN0ZW1JbXBsOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL2FwaS9tb2RlbC5kYXJ0JzsKIAogLy8vIEhlbHBlciBjbGFzcyBlbmNhcHN1bGF0aW5nIHRoZSBtZXRob2RzIGZvciBldmFsdWF0aW5nIGNvbnN0YW50cyBhbmQKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvZnJvbV9lbnZpcm9ubWVudF9ldmFsdWF0b3IuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvZnJvbV9lbnZpcm9ubWVudF9ldmFsdWF0b3IuZGFydAppbmRleCBhMTZhMjYwLi45ZWUwYTcwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9mcm9tX2Vudmlyb25tZW50X2V2YWx1YXRvci5kYXJ0CkBAIC02LDcgKzYsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogCiBjbGFzcyBGcm9tRW52aXJvbm1lbnRFdmFsdWF0b3IgewogICAvLy8gUGFyYW1ldGVyIHRvICJmcm9tRW52aXJvbm1lbnQiIG1ldGhvZHMgdGhhdCBkZW5vdGVzIHRoZSBkZWZhdWx0IHZhbHVlLgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9wb3RlbnRpYWxseV9jb25zdGFudC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC9wb3RlbnRpYWxseV9jb25zdGFudC5kYXJ0CmluZGV4IDk1ZmI4NmUuLjMwNjBjOGYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvcG90ZW50aWFsbHlfY29uc3RhbnQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L3BvdGVudGlhbGx5X2NvbnN0YW50LmRhcnQKQEAgLTUsNiArNSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L3Rva2VuLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydAppbmRleCA0NGU4OTRjLi5lMTUyOWZjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2NvbnN0YW50L3ZhbHVlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9jb25zdGFudC92YWx1ZS5kYXJ0CkBAIC0xMSw4ICsxMSw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvZXJyb3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvaGFzX3R5cGVfcGFyYW1ldGVyX3JlZmVyZW5jZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2dlbmVyYWwuZGFydCc7CiAKIC8vLyBUaGUgc3RhdGUgb2YgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJvb2xlYW4gdmFsdWUuCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvY2xhc3NfaGllcmFyY2h5LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvY2xhc3NfaGllcmFyY2h5LmRhcnQKaW5kZXggZjE0ZjgzNS4uZDViNjkzMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2NsYXNzX2hpZXJhcmNoeS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9jbGFzc19oaWVyYXJjaHkuZGFydApAQCAtNiw3ICs2LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogY2xhc3MgQ2xhc3NIaWVyYXJjaHkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQKaW5kZXggYzg0MGIzNS4uNTBkODkyYSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0CkBAIC0yMywxMyArMjMsMTQgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvdmFyaWFuY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JyBzaG93IEV2YWx1YXRpb25SZXN1bHRJbXBsOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnCiAgICAgc2hvdyBBbmFseXNpc0NvbnRleHQsIEFuYWx5c2lzT3B0aW9uc0ltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9qYXZhX2VuZ2luZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc2RrLmRhcnQnIHNob3cgRGFydFNkazsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19jb2xsZWN0aW9uLmRhcnQnOwpAQCAtMzk5MSw3ICszOTkyLDE0IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgRGFydFR5cGUgZ2V0IGV4dGVuZGVkVHlwZSB7CisgIERhcnRUeXBlIGdldCBleHRlbmRlZFR5cGUgPT4KKyAgICAgIEVsZW1lbnRUeXBlUHJvdmlkZXIuY3VycmVudC5nZXRFeHRlbmRlZFR5cGUodGhpcyk7CisKKyAgc2V0IGV4dGVuZGVkVHlwZShEYXJ0VHlwZSBleHRlbmRlZFR5cGUpIHsKKyAgICBfZXh0ZW5kZWRUeXBlID0gZXh0ZW5kZWRUeXBlOworICB9CisKKyAgRGFydFR5cGUgZ2V0IGV4dGVuZGVkVHlwZUludGVybmFsIHsKICAgICBpZiAoX2V4dGVuZGVkVHlwZSAhPSBudWxsKSByZXR1cm4gX2V4dGVuZGVkVHlwZTsKIAogICAgIGlmIChsaW5rZWROb2RlICE9IG51bGwpIHsKQEAgLTQwMDEsMTAgKzQwMDksNiBAQAogICAgIHJldHVybiBfZXh0ZW5kZWRUeXBlOwogICB9CiAKLSAgc2V0IGV4dGVuZGVkVHlwZShEYXJ0VHlwZSBleHRlbmRlZFR5cGUpIHsKLSAgICBfZXh0ZW5kZWRUeXBlID0gZXh0ZW5kZWRUeXBlOwotICB9Ci0KICAgQG92ZXJyaWRlCiAgIExpc3Q8RmllbGRFbGVtZW50PiBnZXQgZmllbGRzIHsKICAgICBpZiAoX2ZpZWxkcyAhPSBudWxsKSB7CkBAIC01NDE0LDkgKzU0MTgsMTIgQEAKICAgICAgIH0pOwogICAgICAgaWYgKCFoYXNDb3JlKSB7CiAgICAgICAgIHZhciBlbGVtZW50cyA9IGxpbmtlZENvbnRleHQuYnVuZGxlQ29udGV4dC5lbGVtZW50RmFjdG9yeTsKLSAgICAgICAgX2ltcG9ydHMuYWRkKEltcG9ydEVsZW1lbnRJbXBsKC0xKQotICAgICAgICAgIC4uaW1wb3J0ZWRMaWJyYXJ5ID0gZWxlbWVudHMubGlicmFyeU9mVXJpKCdkYXJ0OmNvcmUnKQotICAgICAgICAgIC4uaXNTeW50aGV0aWMgPSB0cnVlKTsKKyAgICAgICAgX2ltcG9ydHMuYWRkKAorICAgICAgICAgIEltcG9ydEVsZW1lbnRJbXBsKC0xKQorICAgICAgICAgICAgLi5pbXBvcnRlZExpYnJhcnkgPSBlbGVtZW50cy5saWJyYXJ5T2ZVcmkoJ2RhcnQ6Y29yZScpCisgICAgICAgICAgICAuLmlzU3ludGhldGljID0gdHJ1ZQorICAgICAgICAgICAgLi51cmkgPSAnZGFydDpjb3JlJywKKyAgICAgICAgKTsKICAgICAgIH0KICAgICAgIHJldHVybiBfaW1wb3J0czsKICAgICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvZ2VuZXJpY19pbmZlcnJlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2dlbmVyaWNfaW5mZXJyZXIuZGFydAppbmRleCAxOTY0NjgyLi45MDhkODdjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvZ2VuZXJpY19pbmZlcnJlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9nZW5lcmljX2luZmVycmVyLmRhcnQKQEAgLTE2LDggKzE2LDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JyBzaG93IEhpbnRDb2RlLCBTdHJvbmdNb2RlQ29kZTsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogLy8vIFRyYWNrcyB1cHBlciBhbmQgbG93ZXIgdHlwZSBib3VuZHMgZm9yIGEgc2V0IG9mIHR5cGUgcGFyYW1ldGVycy4KQEAgLTU1OCw3ICs1NTgsNyBAQAogICAgICAgOiBzdXBlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0OiBpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKIAogICBAb3ZlcnJpZGUKLSAgZm9ybWF0RXJyb3IoKSB7CisgIExpc3Q8U3RyaW5nPiBmb3JtYXRFcnJvcigpIHsKICAgICAvLyBUT0RPKGptZXNzZXJseSk6IHdlIHNob3VsZCBoaWdobGlnaHQgdGhlIHNwYW4uIFRoYXQgd291bGQgYmUgbW9yZSB1c2VmdWwuCiAgICAgLy8gSG93ZXZlciBpbiBzdW1tYXJ5IGNvZGUgaXQgZG9lc24ndCBsb29rIGxpa2UgdGhlIEFTVCBub2RlIHdpdGggc3BhbiBpcwogICAgIC8vIGF2YWlsYWJsZS4KQEAgLTU5Miw3ICs1OTIsNyBAQAogICAgICAgOiBzdXBlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0OiBpc05vbk51bGxhYmxlQnlEZWZhdWx0KTsKIAogICBAb3ZlcnJpZGUKLSAgZm9ybWF0RXJyb3IoKSB7CisgIExpc3Q8U3RyaW5nPiBmb3JtYXRFcnJvcigpIHsKICAgICByZXR1cm4gWwogICAgICAgIlR5cGUgcGFyYW1ldGVyICcke3R5cGVQYXJhbS5uYW1lfSciLAogICAgICAgImRlY2xhcmVkIHRvIGV4dGVuZCAnJHtfdHlwZVN0cihleHRlbmRzVHlwZSl9Jy4iCkBAIC02MDksNyArNjA5LDcgQEAKICAgICAgIDogc3VwZXIoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdDogaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCk7CiAKICAgQG92ZXJyaWRlCi0gIGZvcm1hdEVycm9yKCkgeworICBMaXN0PFN0cmluZz4gZm9ybWF0RXJyb3IoKSB7CiAgICAgcmV0dXJuIFsKICAgICAgICJGdW5jdGlvbiB0eXBlIiwKICAgICAgICJkZWNsYXJlZCBhcyAnJHtfdHlwZVN0cihmdW5jdGlvblR5cGUpfSciLApAQCAtNjI3LDcgKzYyNyw3IEBACiAgICAgICA6IHN1cGVyKGlzTm9uTnVsbGFibGVCeURlZmF1bHQ6IGlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogCiAgIEBvdmVycmlkZQotICBmb3JtYXRFcnJvcigpIHsKKyAgTGlzdDxTdHJpbmc+IGZvcm1hdEVycm9yKCkgewogICAgIHJldHVybiBbCiAgICAgICAiUmV0dXJuIHR5cGUiLAogICAgICAgImRlY2xhcmVkIGFzICcke190eXBlU3RyKGRlY2xhcmVkVHlwZSl9JyIsCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvZ3JlYXRlc3RfbG93ZXJfYm91bmQuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ncmVhdGVzdF9sb3dlcl9ib3VuZC5kYXJ0CmluZGV4IDk2ZGFiNmIuLjY5OThhODIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ncmVhdGVzdF9sb3dlcl9ib3VuZC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ncmVhdGVzdF9sb3dlcl9ib3VuZC5kYXJ0CkBAIC05LDcgKzksNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIAogY2xhc3MgR3JlYXRlc3RMb3dlckJvdW5kSGVscGVyIHsKQEAgLTI1NywxMiArMjU3LDEwIEBACiAgICAgcmV0dXJuIE5ldmVyVHlwZUltcGwuaW5zdGFuY2U7CiAgIH0KIAotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgb2YgZnVuY3Rpb24gdHlwZXMgW2ZdIGFuZCBbZ10uCi0gICAqCi0gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UKLSAgICogU2VlIGByZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kYAotICAgKi8KKyAgLy8vIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIG9mIGZ1bmN0aW9uIHR5cGVzIFtmXSBhbmQgW2ddLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UKKyAgLy8vIFNlZSBgcmVzb3VyY2VzL3R5cGUtc3lzdGVtL3VwcGVyLWxvd2VyLWJvdW5kcy5tZGAKICAgRGFydFR5cGUgX2Z1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgZiwgRnVuY3Rpb25UeXBlIGcpIHsKICAgICB2YXIgZlR5cGVGb3JtYWxzID0gZi50eXBlRm9ybWFsczsKICAgICB2YXIgZ1R5cGVGb3JtYWxzID0gZy50eXBlRm9ybWFsczsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQKaW5kZXggMDcxZmExYi4uMTZjYjg1MSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQKQEAgLTcsOCArNyw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvcnJlY3Rfb3ZlcnJpZGUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JyBzaG93IFR5cGVTeXN0ZW1JbXBsOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2dlbmVyYWwuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvbGVhc3RfdXBwZXJfYm91bmQuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9sZWFzdF91cHBlcl9ib3VuZC5kYXJ0CmluZGV4IDE3M2M4YzQuLmMzNzIwZTkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9sZWFzdF91cHBlcl9ib3VuZC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9sZWFzdF91cHBlcl9ib3VuZC5kYXJ0CkBAIC0xMCw4ICsxMCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci92YXJpYW5jZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2RhcnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCkBAIC0yNTQsMTAgKzI1NCw4IEBACiAgICAgcmV0dXJuIF9jb21wdXRlVHlwZUF0TWF4VW5pcXVlRGVwdGgocyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgaW5oZXJpdGFuY2UgcGF0aCBmcm9tIHRoZSBbZWxlbWVudF0gdG8KLSAgICogT2JqZWN0LgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGluaGVyaXRhbmNlIHBhdGggZnJvbSB0aGUgW2VsZW1lbnRdIHRvCisgIC8vLyBPYmplY3QuCiAgIEB2aXNpYmxlRm9yVGVzdGluZwogICBzdGF0aWMgaW50IGNvbXB1dGVMb25nZXN0SW5oZXJpdGFuY2VQYXRoVG9PYmplY3QoQ2xhc3NFbGVtZW50IGVsZW1lbnQpIHsKICAgICByZXR1cm4gX2NvbXB1dGVMb25nZXN0SW5oZXJpdGFuY2VQYXRoVG9PYmplY3QoCkBAIC00MDcsMTAgKzQwNSw4IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIHNldHMgb2YgdHlwZXMsIHdoZXJlCi0gICAqIGludGVyc2VjdGlvbiBpcyBiYXNlZCBvbiB0aGUgZXF1YWxpdHkgb2YgdGhlIHR5cGVzIHRoZW1zZWx2ZXMuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIHNldHMgb2YgdHlwZXMsIHdoZXJlCisgIC8vLyBpbnRlcnNlY3Rpb24gaXMgYmFzZWQgb24gdGhlIGVxdWFsaXR5IG9mIHRoZSB0eXBlcyB0aGVtc2VsdmVzLgogICBzdGF0aWMgTGlzdDxJbnN0YW50aWF0ZWRDbGFzcz4gX2ludGVyc2VjdGlvbigKICAgICBTZXQ8SW5zdGFudGlhdGVkQ2xhc3M+IGZpcnN0LAogICAgIFNldDxJbnN0YW50aWF0ZWRDbGFzcz4gc2Vjb25kLApAQCAtNDM1LDEyICs0MzEsMTAgQEAKIAogICBJbnRlcmZhY2VUeXBlIGdldCBfb2JqZWN0VHlwZSA9PiBfdHlwZVN5c3RlbS50eXBlUHJvdmlkZXIub2JqZWN0VHlwZTsKIAotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIHR5cGVzLgotICAgKgotICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCi0gICAqIFNlZSBgcmVzb3VyY2VzL3R5cGUtc3lzdGVtL3VwcGVyLWxvd2VyLWJvdW5kcy5tZGAKLSAgICovCisgIC8vLyBDb21wdXRlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0d28gdHlwZXMuCisgIC8vLworICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZQorICAvLy8gU2VlIGByZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kYAogICBEYXJ0VHlwZSBnZXRMZWFzdFVwcGVyQm91bmQoRGFydFR5cGUgVDEsIERhcnRUeXBlIFQyKSB7CiAgICAgLy8gVVAoVCwgVCkgPSBUCiAgICAgaWYgKGlkZW50aWNhbChUMSwgVDIpKSB7CkBAIC02NzgsMTIgKzY3MiwxMCBAQAogICAgIHJldHVybiBoZWxwZXIuY29tcHV0ZShUMSwgVDIpOwogICB9CiAKLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIGZ1bmN0aW9uIHR5cGVzIFtmXSBhbmQgW2ddLgotICAgKgotICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCi0gICAqIFNlZSBgcmVzb3VyY2VzL3R5cGUtc3lzdGVtL3VwcGVyLWxvd2VyLWJvdW5kcy5tZGAKLSAgICovCisgIC8vLyBDb21wdXRlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiBmdW5jdGlvbiB0eXBlcyBbZl0gYW5kIFtnXS4KKyAgLy8vCisgIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCisgIC8vLyBTZWUgYHJlc291cmNlcy90eXBlLXN5c3RlbS91cHBlci1sb3dlci1ib3VuZHMubWRgCiAgIERhcnRUeXBlIF9mdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIGYsIEZ1bmN0aW9uVHlwZSBnKSB7CiAgICAgdmFyIGZUeXBlRm9ybWFscyA9IGYudHlwZUZvcm1hbHM7CiAgICAgdmFyIGdUeXBlRm9ybWFscyA9IGcudHlwZUZvcm1hbHM7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQKaW5kZXggYzRjZWVhMi4uN2ZjY2FjMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L21lbWJlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9tZW1iZXIuZGFydApAQCAtMTcsMTUgKzE3LDExIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKLS8qKgotICogQSBjb25zdHJ1Y3RvciBlbGVtZW50IGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2hlcmUgdGhlIHZhbHVlcyBvZiB0aGUKLSAqIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCi0gKi8KKy8vLyBBIGNvbnN0cnVjdG9yIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mCisvLy8gdGhlIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCiBjbGFzcyBDb25zdHJ1Y3Rvck1lbWJlciBleHRlbmRzIEV4ZWN1dGFibGVNZW1iZXIgaW1wbGVtZW50cyBDb25zdHJ1Y3RvckVsZW1lbnQgewotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZWxlbWVudCB0byByZXByZXNlbnQgYSBjb25zdHJ1Y3RvciwgYmFzZWQgb24KLSAgICogdGhlIFtkZWNsYXJhdGlvbl0sIGFuZCBhcHBsaWVkIFtzdWJzdGl0dXRpb25dLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgY29uc3RydWN0b3IsIGJhc2VkIG9uCisgIC8vLyB0aGUgW2RlY2xhcmF0aW9uXSwgYW5kIGFwcGxpZWQgW3N1YnN0aXR1dGlvbl0uCiAgIENvbnN0cnVjdG9yTWVtYmVyKAogICAgIENvbnN0cnVjdG9yRWxlbWVudCBkZWNsYXJhdGlvbiwKICAgICBNYXBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uLApAQCAtOTYsMTMgKzkyLDExIEBACiAgICAgYnVpbGRlci53cml0ZUNvbnN0cnVjdG9yRWxlbWVudCh0aGlzKTsKICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2NvbnN0cnVjdG9yXSdzIHR5cGUgaXMgZGlmZmVyZW50IHdoZW4gYW55IHR5cGUgcGFyYW1ldGVycwotICAgKiBmcm9tIHRoZSBkZWZpbmluZyB0eXBlJ3MgZGVjbGFyYXRpb24gYXJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCB0eXBlCi0gICAqIGFyZ3VtZW50cyBmcm9tIHRoZSBbZGVmaW5pbmdUeXBlXSwgY3JlYXRlIGEgY29uc3RydWN0b3IgbWVtYmVyIHJlcHJlc2VudGluZwotICAgKiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IuIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIHRoZSBvcmlnaW5hbAotICAgKiBjb25zdHJ1Y3RvciBpZiBubyBtZW1iZXIgd2FzIGNyZWF0ZWQuCi0gICAqLworICAvLy8gSWYgdGhlIGdpdmVuIFtjb25zdHJ1Y3Rvcl0ncyB0eXBlIGlzIGRpZmZlcmVudCB3aGVuIGFueSB0eXBlIHBhcmFtZXRlcnMKKyAgLy8vIGZyb20gdGhlIGRlZmluaW5nIHR5cGUncyBkZWNsYXJhdGlvbiBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIHR5cGUKKyAgLy8vIGFyZ3VtZW50cyBmcm9tIHRoZSBbZGVmaW5pbmdUeXBlXSwgY3JlYXRlIGEgY29uc3RydWN0b3IgbWVtYmVyCisgIC8vLyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHdhcyBjcmVhdGVkLCBvcgorICAvLy8gdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIGlmIG5vIG1lbWJlciB3YXMgY3JlYXRlZC4KICAgc3RhdGljIENvbnN0cnVjdG9yRWxlbWVudCBmcm9tKAogICAgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yLCBJbnRlcmZhY2VUeXBlIGRlZmluaW5nVHlwZSkgewogICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsIHx8IGRlZmluaW5nVHlwZS50eXBlQXJndW1lbnRzLmlzRW1wdHkpIHsKQEAgLTEyOSwyNSArMTIzLDIxIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBbiBleGVjdXRhYmxlIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQotICogdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KLSAqLworLy8vIEFuIGV4ZWN1dGFibGUgZWxlbWVudCBkZWZpbmVkIGluIGEgcGFyYW1ldGVyaXplZCB0eXBlIHdoZXJlIHRoZSB2YWx1ZXMgb2YKKy8vLyB0aGUgdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KIGFic3RyYWN0IGNsYXNzIEV4ZWN1dGFibGVNZW1iZXIgZXh0ZW5kcyBNZW1iZXIgaW1wbGVtZW50cyBFeGVjdXRhYmxlRWxlbWVudCB7CiAgIEBvdmVycmlkZQogICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiB0eXBlUGFyYW1ldGVyczsKIAogICBGdW5jdGlvblR5cGUgX3R5cGU7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgY2FsbGFibGUgZWxlbWVudCAobGlrZSBhCi0gICAqIG1ldGhvZCBvciBmdW5jdGlvbiBvciBwcm9wZXJ0eSksIGJhc2VkIG9uIHRoZSBbZGVjbGFyYXRpb25dLCBhbmQgYXBwbGllZAotICAgKiBbc3Vic3RpdHV0aW9uXS4KLSAgICoKLSAgICogVGhlIFt0eXBlUGFyYW1ldGVyc10gYXJlIGZyZXNoLCBhbmQgW3N1YnN0aXR1dGlvbl0gaXMgYWxyZWFkeSBhcHBsaWVkIHRvCi0gICAqIHRoZWlyIGJvdW5kcy4gIFRoZSBbc3Vic3RpdHV0aW9uXSBpbmNsdWRlcyByZXBsYWNpbmcgW2RlY2xhcmF0aW9uXSB0eXBlCi0gICAqIHBhcmFtZXRlcnMgd2l0aCB0aGUgcHJvdmlkZWQgZnJlc2ggW3R5cGVQYXJhbWV0ZXJzXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBlbGVtZW50IHRvIHJlcHJlc2VudCBhIGNhbGxhYmxlIGVsZW1lbnQgKGxpa2UgYQorICAvLy8gbWV0aG9kIG9yIGZ1bmN0aW9uIG9yIHByb3BlcnR5KSwgYmFzZWQgb24gdGhlIFtkZWNsYXJhdGlvbl0sIGFuZCBhcHBsaWVkCisgIC8vLyBbc3Vic3RpdHV0aW9uXS4KKyAgLy8vCisgIC8vLyBUaGUgW3R5cGVQYXJhbWV0ZXJzXSBhcmUgZnJlc2gsIGFuZCBbc3Vic3RpdHV0aW9uXSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8KKyAgLy8vIHRoZWlyIGJvdW5kcy4gIFRoZSBbc3Vic3RpdHV0aW9uXSBpbmNsdWRlcyByZXBsYWNpbmcgW2RlY2xhcmF0aW9uXSB0eXBlCisgIC8vLyBwYXJhbWV0ZXJzIHdpdGggdGhlIHByb3ZpZGVkIGZyZXNoIFt0eXBlUGFyYW1ldGVyc10uCiAgIEV4ZWN1dGFibGVNZW1iZXIoCiAgICAgRXhlY3V0YWJsZUVsZW1lbnQgZGVjbGFyYXRpb24sCiAgICAgTWFwU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiwKQEAgLTI2NCwxMCArMjU0LDggQEAKICAgfQogfQogCi0vKioKLSAqIEEgcGFyYW1ldGVyIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQotICogdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KLSAqLworLy8vIEEgcGFyYW1ldGVyIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQorLy8vIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCiBjbGFzcyBGaWVsZEZvcm1hbFBhcmFtZXRlck1lbWJlciBleHRlbmRzIFBhcmFtZXRlck1lbWJlcgogICAgIGltcGxlbWVudHMgRmllbGRGb3JtYWxQYXJhbWV0ZXJFbGVtZW50IHsKICAgZmFjdG9yeSBGaWVsZEZvcm1hbFBhcmFtZXRlck1lbWJlcigKQEAgLTMxMiwxNSArMzAwLDExIEBACiAgICAgICB2aXNpdG9yLnZpc2l0RmllbGRGb3JtYWxQYXJhbWV0ZXJFbGVtZW50KHRoaXMpOwogfQogCi0vKioKLSAqIEEgZmllbGQgZWxlbWVudCBkZWZpbmVkIGluIGEgcGFyYW1ldGVyaXplZCB0eXBlIHdoZXJlIHRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUKLSAqIHBhcmFtZXRlcnMgYXJlIGtub3duLgotICovCisvLy8gQSBmaWVsZCBlbGVtZW50IGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2hlcmUgdGhlIHZhbHVlcyBvZiB0aGUgdHlwZQorLy8vIHBhcmFtZXRlcnMgYXJlIGtub3duLgogY2xhc3MgRmllbGRNZW1iZXIgZXh0ZW5kcyBWYXJpYWJsZU1lbWJlciBpbXBsZW1lbnRzIEZpZWxkRWxlbWVudCB7Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBlbGVtZW50IHRvIHJlcHJlc2VudCBhIGZpZWxkLCBiYXNlZCBvbiB0aGUKLSAgICogW2RlY2xhcmF0aW9uXSwgd2l0aCBhcHBsaWVkIFtzdWJzdGl0dXRpb25dLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgZmllbGQsIGJhc2VkIG9uIHRoZQorICAvLy8gW2RlY2xhcmF0aW9uXSwgd2l0aCBhcHBsaWVkIFtzdWJzdGl0dXRpb25dLgogICBGaWVsZE1lbWJlcigKICAgICBGaWVsZEVsZW1lbnQgZGVjbGFyYXRpb24sCiAgICAgTWFwU3Vic3RpdHV0aW9uIHN1YnN0aXR1dGlvbiwKQEAgLTM2NCwxMyArMzQ4LDExIEBACiAgIEBvdmVycmlkZQogICBUIGFjY2VwdDxUPihFbGVtZW50VmlzaXRvcjxUPiB2aXNpdG9yKSA9PiB2aXNpdG9yLnZpc2l0RmllbGRFbGVtZW50KHRoaXMpOwogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2ZpZWxkXSdzIHR5cGUgaXMgZGlmZmVyZW50IHdoZW4gYW55IHR5cGUgcGFyYW1ldGVycyBmcm9tIHRoZQotICAgKiBkZWZpbmluZyB0eXBlJ3MgZGVjbGFyYXRpb24gYXJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50cwotICAgKiBmcm9tIHRoZSBbZGVmaW5pbmdUeXBlXSwgY3JlYXRlIGEgZmllbGQgbWVtYmVyIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4KLSAgICogZmllbGQuIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIHRoZSBiYXNlIGZpZWxkIGlmIG5vIG1lbWJlcgotICAgKiB3YXMgY3JlYXRlZC4KLSAgICovCisgIC8vLyBJZiB0aGUgZ2l2ZW4gW2ZpZWxkXSdzIHR5cGUgaXMgZGlmZmVyZW50IHdoZW4gYW55IHR5cGUgcGFyYW1ldGVycyBmcm9tIHRoZQorICAvLy8gZGVmaW5pbmcgdHlwZSdzIGRlY2xhcmF0aW9uIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMKKyAgLy8vIGZyb20gdGhlIFtkZWZpbmluZ1R5cGVdLCBjcmVhdGUgYSBmaWVsZCBtZW1iZXIgcmVwcmVzZW50aW5nIHRoZSBnaXZlbgorICAvLy8gZmllbGQuIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIHRoZSBiYXNlIGZpZWxkIGlmIG5vIG1lbWJlcgorICAvLy8gd2FzIGNyZWF0ZWQuCiAgIHN0YXRpYyBGaWVsZEVsZW1lbnQgZnJvbShGaWVsZEVsZW1lbnQgZmllbGQsIEludGVyZmFjZVR5cGUgZGVmaW5pbmdUeXBlKSB7CiAgICAgaWYgKGZpZWxkID09IG51bGwgfHwgZGVmaW5pbmdUeXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICAgcmV0dXJuIGZpZWxkOwpAQCAtNDE0LDM5ICszOTYsMjcgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZSB0eXBlCi0gKiBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KLSAqLworLy8vIEFuIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZSB0eXBlCisvLy8gcGFyYW1ldGVycyBhcmUga25vd24uCiBhYnN0cmFjdCBjbGFzcyBNZW1iZXIgaW1wbGVtZW50cyBFbGVtZW50IHsKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IG9uIHdoaWNoIHRoZSBwYXJhbWV0ZXJpemVkIGVsZW1lbnQgd2FzIGNyZWF0ZWQuCi0gICAqLworICAvLy8gVGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIHBhcmFtZXRlcml6ZWQgZWxlbWVudCB3YXMgY3JlYXRlZC4KICAgZmluYWwgRWxlbWVudCBfZGVjbGFyYXRpb247CiAKLSAgLyoqCi0gICAqIFRoZSBzdWJzdGl0dXRpb24gZm9yIHR5cGUgcGFyYW1ldGVycyByZWZlcmVuY2VkIGluIHRoZSBiYXNlIGVsZW1lbnQuCi0gICAqLworICAvLy8gVGhlIHN1YnN0aXR1dGlvbiBmb3IgdHlwZSBwYXJhbWV0ZXJzIHJlZmVyZW5jZWQgaW4gdGhlIGJhc2UgZWxlbWVudC4KICAgZmluYWwgTWFwU3Vic3RpdHV0aW9uIF9zdWJzdGl0dXRpb247CiAKLSAgLyoqCi0gICAqIElmIGB0cnVlYCwgdGhlbiB0aGlzIGlzIGEgbGVnYWN5IHZpZXcgb24gYSBOTkJEIGVsZW1lbnQuCi0gICAqLworICAvLy8gSWYgYHRydWVgLCB0aGVuIHRoaXMgaXMgYSBsZWdhY3kgdmlldyBvbiBhIE5OQkQgZWxlbWVudC4KICAgZmluYWwgYm9vbCBpc0xlZ2FjeTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZWxlbWVudCB0byByZXByZXNlbnQgYSBtZW1iZXIsIGJhc2VkIG9uIHRoZQotICAgKiBbZGVjbGFyYXRpb25dLCBhbmQgYXBwbGllZCBbX3N1YnN0aXR1dGlvbl0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZWxlbWVudCB0byByZXByZXNlbnQgYSBtZW1iZXIsIGJhc2VkIG9uIHRoZQorICAvLy8gW2RlY2xhcmF0aW9uXSwgYW5kIGFwcGxpZWQgW19zdWJzdGl0dXRpb25dLgogICBNZW1iZXIodGhpcy5fZGVjbGFyYXRpb24sIHRoaXMuX3N1YnN0aXR1dGlvbiwgdGhpcy5pc0xlZ2FjeSkgewogICAgIGlmIChfZGVjbGFyYXRpb24gaXMgTWVtYmVyKSB7CiAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCdNZW1iZXJzIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgZGVjbGFyYXRpb25zLicpOwogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIHBhcmFtZXRlcml6ZWQgZWxlbWVudCB3YXMgY3JlYXRlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIHBhcmFtZXRlcml6ZWQgZWxlbWVudCB3YXMgY3JlYXRlZC4KICAgQERlcHJlY2F0ZWQoJ1VzZSBFbGVtZW50LmRlY2xhcmF0aW9uIGluc3RlYWQnKQogICBFbGVtZW50IGdldCBiYXNlRWxlbWVudCA9PiBfZGVjbGFyYXRpb247CiAKQEAgLTU1NSw5ICs1MjUsNyBAQAogICBAb3ZlcnJpZGUKICAgU291cmNlIGdldCBzb3VyY2UgPT4gX2RlY2xhcmF0aW9uLnNvdXJjZTsKIAotICAvKioKLSAgICogVGhlIHN1YnN0aXR1dGlvbiBmb3IgdHlwZSBwYXJhbWV0ZXJzIHJlZmVyZW5jZWQgaW4gdGhlIGJhc2UgZWxlbWVudC4KLSAgICovCisgIC8vLyBUaGUgc3Vic3RpdHV0aW9uIGZvciB0eXBlIHBhcmFtZXRlcnMgcmVmZXJlbmNlZCBpbiB0aGUgYmFzZSBlbGVtZW50LgogICBNYXBTdWJzdGl0dXRpb24gZ2V0IHN1YnN0aXR1dGlvbiA9PiBfc3Vic3RpdHV0aW9uOwogCiAgIC8vLyBBcHBlbmQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZWxlbWVudCB0byB0aGUgZ2l2ZW4gW2J1aWxkZXJdLgpAQCAtNTg2LDkgKzU1NCw3IEBACiAgIGJvb2wgaXNBY2Nlc3NpYmxlSW4oTGlicmFyeUVsZW1lbnQgbGlicmFyeSkgPT4KICAgICAgIF9kZWNsYXJhdGlvbi5pc0FjY2Vzc2libGVJbihsaWJyYXJ5KTsKIAotICAvKioKLSAgICogVXNlIHRoZSBnaXZlbiBbdmlzaXRvcl0gdG8gdmlzaXQgYWxsIG9mIHRoZSBbY2hpbGRyZW5dLgotICAgKi8KKyAgLy8vIFVzZSB0aGUgZ2l2ZW4gW3Zpc2l0b3JdIHRvIHZpc2l0IGFsbCBvZiB0aGUgW2NoaWxkcmVuXS4KICAgdm9pZCBzYWZlbHlWaXNpdENoaWxkcmVuKExpc3Q8RWxlbWVudD4gY2hpbGRyZW4sIEVsZW1lbnRWaXNpdG9yIHZpc2l0b3IpIHsKICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBNYWtlIHRoaXMgcHJpdmF0ZQogICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CkBAIC02ODMsMTAgKzY0OSw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIG1ldGhvZCBlbGVtZW50IGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2hlcmUgdGhlIHZhbHVlcyBvZiB0aGUgdHlwZQotICogcGFyYW1ldGVycyBhcmUga25vd24uCi0gKi8KKy8vLyBBIG1ldGhvZCBlbGVtZW50IGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2hlcmUgdGhlIHZhbHVlcyBvZiB0aGUKKy8vLyB0eXBlIHBhcmFtZXRlcnMgYXJlIGtub3duLgogY2xhc3MgTWV0aG9kTWVtYmVyIGV4dGVuZHMgRXhlY3V0YWJsZU1lbWJlciBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgewogICBmYWN0b3J5IE1ldGhvZE1lbWJlcigKICAgICBNZXRob2RFbGVtZW50IGRlY2xhcmF0aW9uLApAQCAtNzI1LDEzICs2ODksMTEgQEAKICAgQG92ZXJyaWRlCiAgIFQgYWNjZXB0PFQ+KEVsZW1lbnRWaXNpdG9yPFQ+IHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRNZXRob2RFbGVtZW50KHRoaXMpOwogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW21ldGhvZF0ncyB0eXBlIGlzIGRpZmZlcmVudCB3aGVuIGFueSB0eXBlIHBhcmFtZXRlcnMgZnJvbSB0aGUKLSAgICogZGVmaW5pbmcgdHlwZSdzIGRlY2xhcmF0aW9uIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMKLSAgICogZnJvbSB0aGUgW2RlZmluaW5nVHlwZV0sIGNyZWF0ZSBhIG1ldGhvZCBtZW1iZXIgcmVwcmVzZW50aW5nIHRoZSBnaXZlbgotICAgKiBtZXRob2QuIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIHRoZSBiYXNlIG1ldGhvZCBpZiBubyBtZW1iZXIKLSAgICogd2FzIGNyZWF0ZWQuCi0gICAqLworICAvLy8gSWYgdGhlIGdpdmVuIFttZXRob2RdJ3MgdHlwZSBpcyBkaWZmZXJlbnQgd2hlbiBhbnkgdHlwZSBwYXJhbWV0ZXJzIGZyb20KKyAgLy8vIHRoZSBkZWZpbmluZyB0eXBlJ3MgZGVjbGFyYXRpb24gYXJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCB0eXBlCisgIC8vLyBhcmd1bWVudHMgZnJvbSB0aGUgW2RlZmluaW5nVHlwZV0sIGNyZWF0ZSBhIG1ldGhvZCBtZW1iZXIgcmVwcmVzZW50aW5nIHRoZQorICAvLy8gZ2l2ZW4gbWV0aG9kLiBSZXR1cm4gdGhlIG1lbWJlciB0aGF0IHdhcyBjcmVhdGVkLCBvciB0aGUgYmFzZSBtZXRob2QgaWYgbm8KKyAgLy8vIG1lbWJlciB3YXMgY3JlYXRlZC4KICAgc3RhdGljIE1ldGhvZEVsZW1lbnQgZnJvbShNZXRob2RFbGVtZW50IG1ldGhvZCwgSW50ZXJmYWNlVHlwZSBkZWZpbmluZ1R5cGUpIHsKICAgICBpZiAobWV0aG9kID09IG51bGwgfHwgZGVmaW5pbmdUeXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewogICAgICAgcmV0dXJuIG1ldGhvZDsKQEAgLTc1NSwxMCArNzE3LDggQEAKICAgfQogfQogCi0vKioKLSAqIEEgcGFyYW1ldGVyIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQotICogdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KLSAqLworLy8vIEEgcGFyYW1ldGVyIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQorLy8vIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCiBjbGFzcyBQYXJhbWV0ZXJNZW1iZXIgZXh0ZW5kcyBWYXJpYWJsZU1lbWJlcgogICAgIHdpdGggUGFyYW1ldGVyRWxlbWVudE1peGluCiAgICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJFbGVtZW50IHsKQEAgLTc4MiwxMCArNzQyLDggQEAKICAgICApOwogICB9CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgcGFyYW1ldGVyLCBiYXNlZCBvbiB0aGUKLSAgICogW2RlY2xhcmF0aW9uXSwgd2l0aCBhcHBsaWVkIFtzdWJzdGl0dXRpb25dLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgcGFyYW1ldGVyLCBiYXNlZCBvbiB0aGUKKyAgLy8vIFtkZWNsYXJhdGlvbl0sIHdpdGggYXBwbGllZCBbc3Vic3RpdHV0aW9uXS4KICAgUGFyYW1ldGVyTWVtYmVyLl8oCiAgICAgUGFyYW1ldGVyRWxlbWVudCBkZWNsYXJhdGlvbiwKICAgICBNYXBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uLApAQCAtODYxLDEwICs4MTksOCBAQAogICB9CiB9CiAKLS8qKgotICogQSBwcm9wZXJ0eSBhY2Nlc3NvciBlbGVtZW50IGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJpemVkIHR5cGUgd2hlcmUgdGhlIHZhbHVlcwotICogb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCi0gKi8KKy8vLyBBIHByb3BlcnR5IGFjY2Vzc29yIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzCisvLy8gb2YgdGhlIHR5cGUgcGFyYW1ldGVycyBhcmUga25vd24uCiBjbGFzcyBQcm9wZXJ0eUFjY2Vzc29yTWVtYmVyIGV4dGVuZHMgRXhlY3V0YWJsZU1lbWJlcgogICAgIGltcGxlbWVudHMgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgewogICBmYWN0b3J5IFByb3BlcnR5QWNjZXNzb3JNZW1iZXIoCkBAIC05NTAsMTMgKzkwNiwxMSBAQAogICAgICk7CiAgIH0KIAotICAvKioKLSAgICogSWYgdGhlIGdpdmVuIFthY2Nlc3Nvcl0ncyB0eXBlIGlzIGRpZmZlcmVudCB3aGVuIGFueSB0eXBlIHBhcmFtZXRlcnMgZnJvbQotICAgKiB0aGUgZGVmaW5pbmcgdHlwZSdzIGRlY2xhcmF0aW9uIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgdHlwZQotICAgKiBhcmd1bWVudHMgZnJvbSB0aGUgW2RlZmluaW5nVHlwZV0sIGNyZWF0ZSBhbiBhY2Nlc3NvciBtZW1iZXIgcmVwcmVzZW50aW5nCi0gICAqIHRoZSBnaXZlbiBhY2Nlc3Nvci4gUmV0dXJuIHRoZSBtZW1iZXIgdGhhdCB3YXMgY3JlYXRlZCwgb3IgdGhlIGJhc2UKLSAgICogYWNjZXNzb3IgaWYgbm8gbWVtYmVyIHdhcyBjcmVhdGVkLgotICAgKi8KKyAgLy8vIElmIHRoZSBnaXZlbiBbYWNjZXNzb3JdJ3MgdHlwZSBpcyBkaWZmZXJlbnQgd2hlbiBhbnkgdHlwZSBwYXJhbWV0ZXJzIGZyb20KKyAgLy8vIHRoZSBkZWZpbmluZyB0eXBlJ3MgZGVjbGFyYXRpb24gYXJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCB0eXBlCisgIC8vLyBhcmd1bWVudHMgZnJvbSB0aGUgW2RlZmluaW5nVHlwZV0sIGNyZWF0ZSBhbiBhY2Nlc3NvciBtZW1iZXIgcmVwcmVzZW50aW5nCisgIC8vLyB0aGUgZ2l2ZW4gYWNjZXNzb3IuIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIHRoZSBiYXNlCisgIC8vLyBhY2Nlc3NvciBpZiBubyBtZW1iZXIgd2FzIGNyZWF0ZWQuCiAgIHN0YXRpYyBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBmcm9tKAogICAgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgYWNjZXNzb3IsIEludGVyZmFjZVR5cGUgZGVmaW5pbmdUeXBlKSB7CiAgICAgaWYgKGFjY2Vzc29yID09IG51bGwgfHwgZGVmaW5pbmdUeXBlLnR5cGVBcmd1bWVudHMuaXNFbXB0eSkgewpAQCAtMTAwNiwxNyArOTYwLDEzIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIHZhcmlhYmxlIGVsZW1lbnQgZGVmaW5lZCBpbiBhIHBhcmFtZXRlcml6ZWQgdHlwZSB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZQotICogdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KLSAqLworLy8vIEEgdmFyaWFibGUgZWxlbWVudCBkZWZpbmVkIGluIGEgcGFyYW1ldGVyaXplZCB0eXBlIHdoZXJlIHRoZSB2YWx1ZXMgb2YgdGhlCisvLy8gdHlwZSBwYXJhbWV0ZXJzIGFyZSBrbm93bi4KIGFic3RyYWN0IGNsYXNzIFZhcmlhYmxlTWVtYmVyIGV4dGVuZHMgTWVtYmVyIGltcGxlbWVudHMgVmFyaWFibGVFbGVtZW50IHsKICAgRGFydFR5cGUgX3R5cGU7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVsZW1lbnQgdG8gcmVwcmVzZW50IGEgdmFyaWFibGUsIGJhc2VkIG9uIHRoZQotICAgKiBbZGVjbGFyYXRpb25dLCB3aXRoIGFwcGxpZWQgW3N1YnN0aXR1dGlvbl0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZWxlbWVudCB0byByZXByZXNlbnQgYSB2YXJpYWJsZSwgYmFzZWQgb24gdGhlCisgIC8vLyBbZGVjbGFyYXRpb25dLCB3aXRoIGFwcGxpZWQgW3N1YnN0aXR1dGlvbl0uCiAgIFZhcmlhYmxlTWVtYmVyKAogICAgIFZhcmlhYmxlRWxlbWVudCBkZWNsYXJhdGlvbiwKICAgICBNYXBTdWJzdGl0dXRpb24gc3Vic3RpdHV0aW9uLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L25vcm1hbGl6ZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L25vcm1hbGl6ZS5kYXJ0CmluZGV4IDk3MDg2ZDAuLjRmMDBiM2YgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ub3JtYWxpemUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvbm9ybWFsaXplLmRhcnQKQEAgLTEwLDcgKzEwLDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIAogLy8vIEhlbHBlciBmb3IgY29tcHV0aW5nIGNhbm9uaWNhbCBwcmVzZW50YXRpb24gb2YgdHlwZXMuCiAvLy8KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ydW50aW1lX3R5cGVfZXF1YWxpdHkuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9ydW50aW1lX3R5cGVfZXF1YWxpdHkuZGFydAppbmRleCBlNDliY2M1Li4zZjU0Yjg5IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvcnVudGltZV90eXBlX2VxdWFsaXR5LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3J1bnRpbWVfdHlwZV9lcXVhbGl0eS5kYXJ0CkBAIC04LDggKzgsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfdmlzaXRvci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogCiBjbGFzcyBSdW50aW1lVHlwZUVxdWFsaXR5SGVscGVyIHsKICAgZmluYWwgVHlwZVN5c3RlbUltcGwgX3R5cGVTeXN0ZW07CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvc3VidHlwZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3N1YnR5cGUuZGFydAppbmRleCA3NjYzNDk2Li44MGIwYzgwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvc3VidHlwZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC9zdWJ0eXBlLmRhcnQKQEAgLTExLDggKzExLDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3ZhcmlhbmNlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIAogLy8vIEhlbHBlciBmb3IgY2hlY2tpbmcgdGhlIHN1YnR5cGUgcmVsYXRpb24uCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdG9wX21lcmdlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdG9wX21lcmdlLmRhcnQKaW5kZXggZTg5ZmZiMS4uNzg3MTRlYSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3RvcF9tZXJnZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90b3BfbWVyZ2UuZGFydApAQCAtOSw3ICs5LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2V4dGVuc2lvbnMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQnOwogCiBjbGFzcyBUb3BNZXJnZUhlbHBlciB7CkBAIC0xNywxNCArMTcsMTIgQEAKIAogICBUb3BNZXJnZUhlbHBlcih0aGlzLnR5cGVTeXN0ZW0pOwogCi0gIC8qKgotICAgKiBNZXJnZXMgdHdvIHR5cGVzIGludG8gYSBzaW5nbGUgdHlwZS4KLSAgICogQ29tcHV0ZSB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIFtUXS4KLSAgICoKLSAgICogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS8KLSAgICogU2VlIGBhY2NlcHRlZC9mdXR1cmUtcmVsZWFzZXMvbm5iZC9mZWF0dXJlLXNwZWNpZmljYXRpb24ubWRgCi0gICAqIFNlZSBgI2NsYXNzZXMtZGVmaW5lZC1pbi1vcHRlZC1pbi1saWJyYXJpZXNgCi0gICAqLworICAvLy8gTWVyZ2VzIHR3byB0eXBlcyBpbnRvIGEgc2luZ2xlIHR5cGUuCisgIC8vLyBDb21wdXRlIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgW1RdLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvCisgIC8vLyBTZWUgYGFjY2VwdGVkL2Z1dHVyZS1yZWxlYXNlcy9ubmJkL2ZlYXR1cmUtc3BlY2lmaWNhdGlvbi5tZGAKKyAgLy8vIFNlZSBgI2NsYXNzZXMtZGVmaW5lZC1pbi1vcHRlZC1pbi1saWJyYXJpZXNgCiAgIERhcnRUeXBlIHRvcE1lcmdlKERhcnRUeXBlIFQsIERhcnRUeXBlIFMpIHsKICAgICB2YXIgVF9udWxsYWJpbGl0eSA9IFQubnVsbGFiaWxpdHlTdWZmaXg7CiAgICAgdmFyIFNfbnVsbGFiaWxpdHkgPSBTLm51bGxhYmlsaXR5U3VmZml4OwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQKaW5kZXggMDRkODM1OS4uOGZkMGNmNCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0CkBAIC0xNyw5ICsxNyw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L21lbWJlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnIHNob3cgQW5hbHlzaXNFbmdpbmU7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIApAQCAtNDQsMTggKzQ0LDEyIEBACiAgIHJldHVybiBsaXN0OwogfQogCi0vKioKLSAqIFRoZSBbVHlwZV0gcmVwcmVzZW50aW5nIHRoZSB0eXBlIGBkeW5hbWljYC4KLSAqLwotY2xhc3MgRHluYW1pY1R5cGVJbXBsIGV4dGVuZHMgVHlwZUltcGwgewotICAvKioKLSAgICogVGhlIHVuaXF1ZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKi8KKy8vLyBUaGUgW1R5cGVdIHJlcHJlc2VudGluZyB0aGUgdHlwZSBgZHluYW1pY2AuCitjbGFzcyBEeW5hbWljVHlwZUltcGwgZXh0ZW5kcyBUeXBlSW1wbCBpbXBsZW1lbnRzIER5bmFtaWNUeXBlIHsKKyAgLy8vIFRoZSB1bmlxdWUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgc3RhdGljIGZpbmFsIER5bmFtaWNUeXBlSW1wbCBpbnN0YW5jZSA9IER5bmFtaWNUeXBlSW1wbC5fKCk7CiAKLSAgLyoqCi0gICAqIFByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgKi8KKyAgLy8vIFByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogICBEeW5hbWljVHlwZUltcGwuXygpIDogc3VwZXIoRHluYW1pY0VsZW1lbnRJbXBsKCkpOwogCiAgIEBvdmVycmlkZQpAQCAtMTA5LDkgKzEwMyw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uLCBtZXRob2QsIGNvbnN0cnVjdG9yLCBnZXR0ZXIsIG9yIHNldHRlci4KLSAqLworLy8vIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24sIG1ldGhvZCwgY29uc3RydWN0b3IsIGdldHRlciwgb3Igc2V0dGVyLgogY2xhc3MgRnVuY3Rpb25UeXBlSW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgRnVuY3Rpb25UeXBlIHsKICAgQG92ZXJyaWRlCiAgIGZpbmFsIERhcnRUeXBlIHJldHVyblR5cGU7CkBAIC0zNzgsMjEgKzM3MCwxOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDb21wYXJlcyB0d28gZnVuY3Rpb24gdHlwZXMgW3RdIGFuZCBbc10gdG8gc2VlIGlmIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAgICogcGFyYW1ldGVyIHR5cGVzIG1hdGNoIFtwYXJhbWV0ZXJSZWxhdGlvbl0sIHJldHVybiB0eXBlcyBtYXRjaAotICAgKiBbcmV0dXJuUmVsYXRpb25dLCBhbmQgdHlwZSBwYXJhbWV0ZXIgYm91bmRzIG1hdGNoIFtib3VuZHNSZWxhdGlvbl0uCi0gICAqCi0gICAqIFVzZWQgZm9yIHRoZSB2YXJpb3VzIHJlbGF0aW9ucyBvbiBmdW5jdGlvbiB0eXBlcyB3aGljaCBoYXZlIHRoZSBzYW1lCi0gICAqIHN0cnVjdHVyYWwgcnVsZXMgZm9yIGhhbmRsaW5nIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kIGFyaXR5LCBidXQgdXNlIHRoZWlyCi0gICAqIG93biByZWxhdGlvbiBmb3IgY29tcGFyaW5nIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycyBvciByZXR1cm4gdHlwZXMuCi0gICAqCi0gICAqIElmIFtwYXJhbWV0ZXJSZWxhdGlvbl0gaXMgb21pdHRlZCwgdXNlcyBbcmV0dXJuUmVsYXRpb25dIGZvciBib3RoLiBUaGlzCi0gICAqIGlzIGNvbnZlbmllbnQgZm9yIERhcnQgMSB0eXBlIHN5c3RlbSBtZXRob2RzLgotICAgKgotICAgKiBJZiBbYm91bmRzUmVsYXRpb25dIGlzIG9taXR0ZWQsIHVzZXMgW3JldHVyblJlbGF0aW9uXS4gVGhpcyBpcyBmb3IKLSAgICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFuZCBjb252ZW5pZW5jZSBmb3IgRGFydCAxIHR5cGUgc3lzdGVtIG1ldGhvZHMuCi0gICAqLworICAvLy8gQ29tcGFyZXMgdHdvIGZ1bmN0aW9uIHR5cGVzIFt0XSBhbmQgW3NdIHRvIHNlZSBpZiB0aGVpciBjb3JyZXNwb25kaW5nCisgIC8vLyBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2ggW3BhcmFtZXRlclJlbGF0aW9uXSwgcmV0dXJuIHR5cGVzIG1hdGNoCisgIC8vLyBbcmV0dXJuUmVsYXRpb25dLCBhbmQgdHlwZSBwYXJhbWV0ZXIgYm91bmRzIG1hdGNoIFtib3VuZHNSZWxhdGlvbl0uCisgIC8vLworICAvLy8gVXNlZCBmb3IgdGhlIHZhcmlvdXMgcmVsYXRpb25zIG9uIGZ1bmN0aW9uIHR5cGVzIHdoaWNoIGhhdmUgdGhlIHNhbWUKKyAgLy8vIHN0cnVjdHVyYWwgcnVsZXMgZm9yIGhhbmRsaW5nIG9wdGlvbmFsIHBhcmFtZXRlcnMgYW5kIGFyaXR5LCBidXQgdXNlIHRoZWlyCisgIC8vLyBvd24gcmVsYXRpb24gZm9yIGNvbXBhcmluZyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMgb3IgcmV0dXJuIHR5cGVzLgorICAvLy8KKyAgLy8vIElmIFtwYXJhbWV0ZXJSZWxhdGlvbl0gaXMgb21pdHRlZCwgdXNlcyBbcmV0dXJuUmVsYXRpb25dIGZvciBib3RoLiBUaGlzCisgIC8vLyBpcyBjb252ZW5pZW50IGZvciBEYXJ0IDEgdHlwZSBzeXN0ZW0gbWV0aG9kcy4KKyAgLy8vCisgIC8vLyBJZiBbYm91bmRzUmVsYXRpb25dIGlzIG9taXR0ZWQsIHVzZXMgW3JldHVyblJlbGF0aW9uXS4gVGhpcyBpcyBmb3IKKyAgLy8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29udmVuaWVuY2UgZm9yIERhcnQgMSB0eXBlIHN5c3RlbSBtZXRob2RzLgogICBzdGF0aWMgYm9vbCByZWxhdGUoRnVuY3Rpb25UeXBlIHQsIERhcnRUeXBlIG90aGVyLAogICAgICAgYm9vbCBGdW5jdGlvbihEYXJ0VHlwZSB0LCBEYXJ0VHlwZSBzKSByZXR1cm5SZWxhdGlvbiwKICAgICAgIHtib29sIEZ1bmN0aW9uKFBhcmFtZXRlckVsZW1lbnQgdCwgUGFyYW1ldGVyRWxlbWVudCBzKSBwYXJhbWV0ZXJSZWxhdGlvbiwKQEAgLTU0MiwxNyArNTMyLDE1IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKioKLSAgICogR2l2ZW4gdHdvIGZ1bmN0aW9ucyBbZjFdIGFuZCBbZjJdIHdoZXJlIGYxIGFuZCBmMiBhcmUga25vd24gdG8gYmUKLSAgICogZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyAoYm90aCBoYXZlIHR5cGUgZm9ybWFscyksIHRoaXMgY2hlY2tzIHRoYXQgdGhleQotICAgKiBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBmb3JtYWxzLCBhbmQgdGhhdCB0aG9zZSBmb3JtYWxzIGhhdmUgYm91bmRzCi0gICAqIChlLmcuIGA8VCBleHRlbmRzIExvd2VyQm91bmQ+YCkgdGhhdCBzYXRpc2Z5IFtyZWxhdGlvbl0uCi0gICAqCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIG5ldyBsaXN0IG9mIGZyZXNoIHR5cGUgdmFyaWFibGVzLCB0aGF0IGNhbiBiZQotICAgKiB1c2VkIHRvIGluc3RhbnRpYXRlIGJvdGggZnVuY3Rpb24gdHlwZXMsIGFsbG93aW5nIGZ1cnRoZXIgY29tcGFyaXNvbi4KLSAgICogRm9yIGV4YW1wbGUsIGdpdmVuIGA8VD5UIC0+IFRgIGFuZCBgPFU+VSAtPiBVYCB3ZSBjYW4gaW5zdGFudGlhdGUgdGhlbSB3aXRoCi0gICAqIGBGYCB0byBnZXQgYEYgLT4gRmAgYW5kIGBGIC0+IEZgLCB3aGljaCB3ZSBjYW4gc2VlIGFyZSBlcXVhbC4KLSAgICovCisgIC8vLyBHaXZlbiB0d28gZnVuY3Rpb25zIFtmMV0gYW5kIFtmMl0gd2hlcmUgZjEgYW5kIGYyIGFyZSBrbm93biB0byBiZQorICAvLy8gZ2VuZXJpYyBmdW5jdGlvbiB0eXBlcyAoYm90aCBoYXZlIHR5cGUgZm9ybWFscyksIHRoaXMgY2hlY2tzIHRoYXQgdGhleQorICAvLy8gaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZm9ybWFscywgYW5kIHRoYXQgdGhvc2UgZm9ybWFscyBoYXZlIGJvdW5kcworICAvLy8gKGUuZy4gYDxUIGV4dGVuZHMgTG93ZXJCb3VuZD5gKSB0aGF0IHNhdGlzZnkgW3JlbGF0aW9uXS4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYSBuZXcgbGlzdCBvZiBmcmVzaCB0eXBlIHZhcmlhYmxlcywgdGhhdCBjYW4gYmUKKyAgLy8vIHVzZWQgdG8gaW5zdGFudGlhdGUgYm90aCBmdW5jdGlvbiB0eXBlcywgYWxsb3dpbmcgZnVydGhlciBjb21wYXJpc29uLgorICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGA8VD5UIC0+IFRgIGFuZCBgPFU+VSAtPiBVYCB3ZSBjYW4gaW5zdGFudGlhdGUgdGhlbQorICAvLy8gd2l0aCBgRmAgdG8gZ2V0IGBGIC0+IEZgIGFuZCBgRiAtPiBGYCwgd2hpY2ggd2UgY2FuIHNlZSBhcmUgZXF1YWwuCiAgIHN0YXRpYyBMaXN0PERhcnRUeXBlPiByZWxhdGVUeXBlRm9ybWFscygKICAgICAgIEZ1bmN0aW9uVHlwZSBmMSwKICAgICAgIEZ1bmN0aW9uVHlwZSBmMiwKQEAgLTY4MCw5ICs2NjgsNyBAQAogICB9CiB9CiAKLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBbSW50ZXJmYWNlVHlwZV0uCi0gKi8KKy8vLyBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGFuIFtJbnRlcmZhY2VUeXBlXS4KIGNsYXNzIEludGVyZmFjZVR5cGVJbXBsIGV4dGVuZHMgVHlwZUltcGwgaW1wbGVtZW50cyBJbnRlcmZhY2VUeXBlIHsKICAgQG92ZXJyaWRlCiAgIGZpbmFsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHM7CkBAIC02OTAsMTkgKzY3NiwxMyBAQAogICBAb3ZlcnJpZGUKICAgZmluYWwgTnVsbGFiaWxpdHlTdWZmaXggbnVsbGFiaWxpdHlTdWZmaXg7CiAKLSAgLyoqCi0gICAqIENhY2hlZCBbQ29uc3RydWN0b3JFbGVtZW50XXMgLSBtZW1iZXJzIG9yIHJhdyBlbGVtZW50cy4KLSAgICovCisgIC8vLyBDYWNoZWQgW0NvbnN0cnVjdG9yRWxlbWVudF1zIC0gbWVtYmVycyBvciByYXcgZWxlbWVudHMuCiAgIExpc3Q8Q29uc3RydWN0b3JFbGVtZW50PiBfY29uc3RydWN0b3JzOwogCi0gIC8qKgotICAgKiBDYWNoZWQgW1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50XXMgLSBtZW1iZXJzIG9yIHJhdyBlbGVtZW50cy4KLSAgICovCisgIC8vLyBDYWNoZWQgW1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50XXMgLSBtZW1iZXJzIG9yIHJhdyBlbGVtZW50cy4KICAgTGlzdDxQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudD4gX2FjY2Vzc29yczsKIAotICAvKioKLSAgICogQ2FjaGVkIFtNZXRob2RFbGVtZW50XXMgLSBtZW1iZXJzIG9yIHJhdyBlbGVtZW50cy4KLSAgICovCisgIC8vLyBDYWNoZWQgW01ldGhvZEVsZW1lbnRdcyAtIG1lbWJlcnMgb3IgcmF3IGVsZW1lbnRzLgogICBMaXN0PE1ldGhvZEVsZW1lbnQ+IF9tZXRob2RzOwogCiAgIEludGVyZmFjZVR5cGVJbXBsKHsKQEAgLTg5OCwyMiArODc4LDIwIEBACiAgICAgYnVpbGRlci53cml0ZUludGVyZmFjZVR5cGUodGhpcyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGVpdGhlciB0aGlzIHR5cGUgb3IgYSBzdXBlcnR5cGUgb2YgdGhpcyB0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUKLSAgICogW3RhcmdldEVsZW1lbnRdLCBvciBgbnVsbGAgaWYgc3VjaCBhIHR5cGUgZG9lcyBub3QgZXhpc3QuIElmIHRoaXMgdHlwZQotICAgKiBpbmhlcml0cyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudCBhbG9uZyBtdWx0aXBsZSBwYXRocywgdGhlbiB0aGUgcmV0dXJuZWQgdHlwZQotICAgKiBpcyBhcmJpdHJhcnkuCi0gICAqCi0gICAqIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zCi0gICAqIGBgYAotICAgKiBjbGFzcyBBPEU+IHt9Ci0gICAqIGNsYXNzIEI8RT4gaW1wbGVtZW50cyBBPEU+IHt9Ci0gICAqIGNsYXNzIEMgaW1wbGVtZW50cyBBPFN0cmluZz4ge30KLSAgICogYGBgCi0gICAqIEFza2luZyB0aGUgdHlwZSBgQjxpbnQ+YCBmb3IgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGBBYCB3aWxsIHJldHVybiB0aGUKLSAgICogdHlwZSBgQTxpbnQ+YC4gQXNraW5nIHRoZSB0eXBlIGBDYCBmb3IgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGBBYCB3aWxsCi0gICAqIHJldHVybiB0aGUgdHlwZSBgQTxTdHJpbmc+YC4KLSAgICovCisgIC8vLyBSZXR1cm4gZWl0aGVyIHRoaXMgdHlwZSBvciBhIHN1cGVydHlwZSBvZiB0aGlzIHR5cGUgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gW3RhcmdldEVsZW1lbnRdLCBvciBgbnVsbGAgaWYgc3VjaCBhIHR5cGUgZG9lcyBub3QgZXhpc3QuIElmIHRoaXMgdHlwZQorICAvLy8gaW5oZXJpdHMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQgYWxvbmcgbXVsdGlwbGUgcGF0aHMsIHRoZW4gdGhlIHJldHVybmVkCisgIC8vLyB0eXBlIGlzIGFyYml0cmFyeS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucworICAvLy8gYGBgCisgIC8vLyBjbGFzcyBBPEU+IHt9CisgIC8vLyBjbGFzcyBCPEU+IGltcGxlbWVudHMgQTxFPiB7fQorICAvLy8gY2xhc3MgQyBpbXBsZW1lbnRzIEE8U3RyaW5nPiB7fQorICAvLy8gYGBgCisgIC8vLyBBc2tpbmcgdGhlIHR5cGUgYEI8aW50PmAgZm9yIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBgQWAgd2lsbCByZXR1cm4gdGhlCisgIC8vLyB0eXBlIGBBPGludD5gLiBBc2tpbmcgdGhlIHR5cGUgYENgIGZvciB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYEFgIHdpbGwKKyAgLy8vIHJldHVybiB0aGUgdHlwZSBgQTxTdHJpbmc+YC4KICAgSW50ZXJmYWNlVHlwZSBhc0luc3RhbmNlT2YoQ2xhc3NFbGVtZW50IHRhcmdldEVsZW1lbnQpIHsKICAgICBpZiAoZWxlbWVudCA9PSB0YXJnZXRFbGVtZW50KSB7CiAgICAgICByZXR1cm4gdGhpczsKQEAgLTE0NjIsMTAgKzE0NDAsOCBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICAvKioKLSAgICogSWYgdGhlcmUgaXMgYSBzaW5nbGUgdHlwZSB3aGljaCBpcyBhdCBsZWFzdCBhcyBzcGVjaWZpYyBhcyBhbGwgb2YgdGhlCi0gICAqIHR5cGVzIGluIFt0eXBlc10sIHJldHVybiBpdC4gIE90aGVyd2lzZSByZXR1cm4gYG51bGxgLgotICAgKi8KKyAgLy8vIElmIHRoZXJlIGlzIGEgc2luZ2xlIHR5cGUgd2hpY2ggaXMgYXQgbGVhc3QgYXMgc3BlY2lmaWMgYXMgYWxsIG9mIHRoZQorICAvLy8gdHlwZXMgaW4gW3R5cGVzXSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlIHJldHVybiBgbnVsbGAuCiAgIHN0YXRpYyBEYXJ0VHlwZSBmaW5kTW9zdFNwZWNpZmljVHlwZSgKICAgICAgIExpc3Q8RGFydFR5cGU+IHR5cGVzLCBUeXBlU3lzdGVtSW1wbCB0eXBlU3lzdGVtKSB7CiAgICAgLy8gVGhlIDw8IHJlbGF0aW9uICgibW9yZSBzcGVjaWZpYyB0aGFuIikgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIG9uIHR5cGVzLApAQCAtMTUxOCwxNCArMTQ5NCwxMiBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgYSAic21hcnQiIHZlcnNpb24gb2YgdGhlICJsZWFzdCB1cHBlciBib3VuZCIgb2YgdGhlIGdpdmVuIHR5cGVzLgotICAgKgotICAgKiBJZiB0aGVzZSB0eXBlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGRpZmZlciBvbmx5IGluIHRlcm1zIG9mIHRoZSB0eXBlCi0gICAqIGFyZ3VtZW50cywgYXR0ZW1wdHMgdG8gZmluZCBhIGNvbXBhdGlibGUgc2V0IG9mIHR5cGUgYXJndW1lbnRzLgotICAgKgotICAgKiBPdGhlcndpc2UsIGNhbGxzIFtEYXJ0VHlwZS5nZXRMZWFzdFVwcGVyQm91bmRdLgotICAgKi8KKyAgLy8vIFJldHVybnMgYSAic21hcnQiIHZlcnNpb24gb2YgdGhlICJsZWFzdCB1cHBlciBib3VuZCIgb2YgdGhlIGdpdmVuIHR5cGVzLgorICAvLy8KKyAgLy8vIElmIHRoZXNlIHR5cGVzIGhhdmUgdGhlIHNhbWUgZWxlbWVudCBhbmQgZGlmZmVyIG9ubHkgaW4gdGVybXMgb2YgdGhlIHR5cGUKKyAgLy8vIGFyZ3VtZW50cywgYXR0ZW1wdHMgdG8gZmluZCBhIGNvbXBhdGlibGUgc2V0IG9mIHR5cGUgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgY2FsbHMgW0RhcnRUeXBlLmdldExlYXN0VXBwZXJCb3VuZF0uCiAgIHN0YXRpYyBJbnRlcmZhY2VUeXBlIGdldFNtYXJ0TGVhc3RVcHBlckJvdW5kKAogICAgICAgSW50ZXJmYWNlVHlwZSBmaXJzdCwgSW50ZXJmYWNlVHlwZSBzZWNvbmQpIHsKICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IHRoaXMgbmVlZHMgdG8gYmUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCBhIG1ldGhvZApAQCAtMTUzOCwxNSArMTUxMiwxMyBAQAogICAgIHJldHVybiB0eXBlU3lzdGVtLmdldExlYXN0VXBwZXJCb3VuZChmaXJzdCwgc2Vjb25kKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlICJsZWFzdCB1cHBlciBib3VuZCIgb2YgdGhlIGdpdmVuIHR5cGVzIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQKLSAgICogdGhlIHR5cGVzIGhhdmUgdGhlIHNhbWUgZWxlbWVudCBhbmQgZGlmZmVyIG9ubHkgaW4gdGVybXMgb2YgdGhlIHR5cGUKLSAgICogYXJndW1lbnRzLgotICAgKgotICAgKiBUaGUgcmVzdWx0aW5nIHR5cGUgaXMgY29tcG9zZWQgYnkgY29tcGFyaW5nIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUKLSAgICogYXJndW1lbnRzLCBrZWVwaW5nIHRob3NlIHRoYXQgYXJlIHRoZSBzYW1lLCBhbmQgdXNpbmcgJ2R5bmFtaWMnIGZvciB0aG9zZQotICAgKiB0aGF0IGFyZSBkaWZmZXJlbnQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSAibGVhc3QgdXBwZXIgYm91bmQiIG9mIHRoZSBnaXZlbiB0eXBlcyB1bmRlciB0aGUgYXNzdW1wdGlvbgorICAvLy8gdGhhdCB0aGUgdHlwZXMgaGF2ZSB0aGUgc2FtZSBlbGVtZW50IGFuZCBkaWZmZXIgb25seSBpbiB0ZXJtcyBvZiB0aGUgdHlwZQorICAvLy8gYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRpbmcgdHlwZSBpcyBjb21wb3NlZCBieSBjb21wYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZQorICAvLy8gYXJndW1lbnRzLCBrZWVwaW5nIHRob3NlIHRoYXQgYXJlIHRoZSBzYW1lLCBhbmQgdXNpbmcgJ2R5bmFtaWMnIGZvciB0aG9zZQorICAvLy8gdGhhdCBhcmUgZGlmZmVyZW50LgogICBzdGF0aWMgSW50ZXJmYWNlVHlwZSBfbGVhc3RVcHBlckJvdW5kKAogICAgICAgSW50ZXJmYWNlVHlwZSBmaXJzdFR5cGUsIEludGVyZmFjZVR5cGUgc2Vjb25kVHlwZSkgewogICAgIENsYXNzRWxlbWVudCBmaXJzdEVsZW1lbnQgPSBmaXJzdFR5cGUuZWxlbWVudDsKQEAgLTE2NTYsNDUgKzE2MjgsMzUgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSB0eXBlIGBOZXZlcmAgcmVwcmVzZW50cyB0aGUgdW5pbmhhYml0ZWQgYm90dG9tIHR5cGUuCi0gKi8KLWNsYXNzIE5ldmVyVHlwZUltcGwgZXh0ZW5kcyBUeXBlSW1wbCB7Ci0gIC8qKgotICAgKiBUaGUgdW5pcXVlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIG51bGxhYmxlLgotICAgKgotICAgKiBUaGlzIGJlaGF2ZXMgZXF1aXZhbGVudGx5IHRvIHRoZSBgTnVsbGAgdHlwZSwgYnV0IHdlIGRpc3Rpbmd1aXNoIGl0IGZvciB0d28KLSAgICogcmVhc29uczogKDEpIHRoZXJlIGFyZSBjaXJjdW1zdGFuY2VzIHdoZXJlIHdlIG5lZWQgYWNjZXNzIHRvIHRoaXMgdHlwZSwgYnV0Ci0gICAqIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSB0eXBlIHByb3ZpZGVyLCBzbyB1c2luZyBgTmV2ZXI/YCBpcyBhCi0gICAqIGNvbnZlbmllbnQgc29sdXRpb24uICAoMikgd2UgbWF5IGRlY2lkZSB0aGF0IHRoZSBkaXN0aW5jdGlvbiBpcyBjb252ZW5pZW50Ci0gICAqIGluIGRpYWdub3N0aWMgbWVzc2FnZXMgKHRoaXMgaXMgVEJEKS4KLSAgICovCisvLy8gVGhlIHR5cGUgYE5ldmVyYCByZXByZXNlbnRzIHRoZSB1bmluaGFiaXRlZCBib3R0b20gdHlwZS4KK2NsYXNzIE5ldmVyVHlwZUltcGwgZXh0ZW5kcyBUeXBlSW1wbCBpbXBsZW1lbnRzIE5ldmVyVHlwZSB7CisgIC8vLyBUaGUgdW5pcXVlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIG51bGxhYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgYmVoYXZlcyBlcXVpdmFsZW50bHkgdG8gdGhlIGBOdWxsYCB0eXBlLCBidXQgd2UgZGlzdGluZ3Vpc2ggaXQgZm9yCisgIC8vLyB0d28gcmVhc29uczogKDEpIHRoZXJlIGFyZSBjaXJjdW1zdGFuY2VzIHdoZXJlIHdlIG5lZWQgYWNjZXNzIHRvIHRoaXMKKyAgLy8vIHR5cGUsIGJ1dCB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgdHlwZSBwcm92aWRlciwgc28gdXNpbmcgYE5ldmVyP2AgaXMKKyAgLy8vIGEgY29udmVuaWVudCBzb2x1dGlvbi4gICgyKSB3ZSBtYXkgZGVjaWRlIHRoYXQgdGhlIGRpc3RpbmN0aW9uIGlzCisgIC8vLyBjb252ZW5pZW50IGluIGRpYWdub3N0aWMgbWVzc2FnZXMgKHRoaXMgaXMgVEJEKS4KICAgc3RhdGljIGZpbmFsIE5ldmVyVHlwZUltcGwgaW5zdGFuY2VOdWxsYWJsZSA9CiAgICAgICBOZXZlclR5cGVJbXBsLl8oTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pOwogCi0gIC8qKgotICAgKiBUaGUgdW5pcXVlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHN0YXJyZWQuCi0gICAqCi0gICAqIFRoaXMgYmVoYXZlcyBsaWtlIGEgdmVyc2lvbiBvZiB0aGUgTnVsbCogdHlwZSB0aGF0IGNvdWxkIGJlIGNvbmNlaXZhYmx5Ci0gICAqIG1pZ3JhdGVkIHRvIGJlIG9mIHR5cGUgTmV2ZXIuIFRoZXJlZm9yZSwgaXQncyB0aGUgYm90dG9tIG9mIGFsbCBsZWdhY3kKLSAgICogdHlwZXMsIGFuZCBhbHNvIGFzc2lnbmFibGUgdG8gdGhlIHRydWUgYm90dG9tLiBOb3RlIHRoYXQgTmV2ZXI/IGFuZCBOZXZlcioKLSAgICogYXJlIG5vdCB0aGUgc2FtZSB0eXBlLCBhcyBOZXZlciogaXMgYSBzdWJ0eXBlIG9mIE5ldmVyLCB3aGlsZSBOZXZlcj8gaXMKLSAgICogbm90LgotICAgKi8KKyAgLy8vIFRoZSB1bmlxdWUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgc3RhcnJlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGJlaGF2ZXMgbGlrZSBhIHZlcnNpb24gb2YgdGhlIE51bGwqIHR5cGUgdGhhdCBjb3VsZCBiZSBjb25jZWl2YWJseQorICAvLy8gbWlncmF0ZWQgdG8gYmUgb2YgdHlwZSBOZXZlci4gVGhlcmVmb3JlLCBpdCdzIHRoZSBib3R0b20gb2YgYWxsIGxlZ2FjeQorICAvLy8gdHlwZXMsIGFuZCBhbHNvIGFzc2lnbmFibGUgdG8gdGhlIHRydWUgYm90dG9tLiBOb3RlIHRoYXQgTmV2ZXI/IGFuZCBOZXZlcioKKyAgLy8vIGFyZSBub3QgdGhlIHNhbWUgdHlwZSwgYXMgTmV2ZXIqIGlzIGEgc3VidHlwZSBvZiBOZXZlciwgd2hpbGUgTmV2ZXI/IGlzCisgIC8vLyBub3QuCiAgIHN0YXRpYyBmaW5hbCBOZXZlclR5cGVJbXBsIGluc3RhbmNlTGVnYWN5ID0KICAgICAgIE5ldmVyVHlwZUltcGwuXyhOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKTsKIAotICAvKioKLSAgICogVGhlIHVuaXF1ZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBub24tbnVsbGFibGUuCi0gICAqLworICAvLy8gVGhlIHVuaXF1ZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBub24tbnVsbGFibGUuCiAgIHN0YXRpYyBmaW5hbCBOZXZlclR5cGVJbXBsIGluc3RhbmNlID0gTmV2ZXJUeXBlSW1wbC5fKE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwogCiAgIEBvdmVycmlkZQogICBmaW5hbCBOdWxsYWJpbGl0eVN1ZmZpeCBudWxsYWJpbGl0eVN1ZmZpeDsKIAotICAvKioKLSAgICogUHJldmVudCB0aGUgY3JlYXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAqLworICAvLy8gUHJldmVudCB0aGUgY3JlYXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCiAgIE5ldmVyVHlwZUltcGwuXyh0aGlzLm51bGxhYmlsaXR5U3VmZml4KSA6IHN1cGVyKE5ldmVyRWxlbWVudEltcGwoKSk7CiAKICAgQG92ZXJyaWRlCkBAIC0xNzU5LDIwICsxNzIxLDE0IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgYFR5cGVJbXBsYCBpbXBsZW1lbnRzIHRoZSBiZWhhdmlvciBjb21tb24gdG8gb2JqZWN0cwotICogcmVwcmVzZW50aW5nIHRoZSBkZWNsYXJlZCB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50IG1vZGVsLgotICovCisvLy8gVGhlIGFic3RyYWN0IGNsYXNzIGBUeXBlSW1wbGAgaW1wbGVtZW50cyB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIG9iamVjdHMKKy8vLyByZXByZXNlbnRpbmcgdGhlIGRlY2xhcmVkIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgbW9kZWwuCiBhYnN0cmFjdCBjbGFzcyBUeXBlSW1wbCBpbXBsZW1lbnRzIERhcnRUeXBlIHsKLSAgLyoqCi0gICAqIFRoZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgZGVjbGFyYXRpb24gb2YgdGhpcyB0eXBlLCBvciBgbnVsbGAgaWYgdGhlCi0gICAqIHR5cGUgaGFzIG5vdCwgb3IgY2Fubm90LCBiZSBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudC4KLSAgICovCisgIC8vLyBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoaXMgdHlwZSwgb3IgYG51bGxgIGlmIHRoZQorICAvLy8gdHlwZSBoYXMgbm90LCBvciBjYW5ub3QsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LgogICBmaW5hbCBFbGVtZW50IF9lbGVtZW50OwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0eXBlIHRvIGJlIGRlY2xhcmVkIGJ5IHRoZSBnaXZlbiBbZWxlbWVudF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdHlwZSB0byBiZSBkZWNsYXJlZCBieSB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgogICBUeXBlSW1wbCh0aGlzLl9lbGVtZW50KTsKIAogICBAZGVwcmVjYXRlZApAQCAtMTg0OCw5ICsxODA0LDcgQEAKICAgQG92ZXJyaWRlCiAgIE51bGxhYmlsaXR5U3VmZml4IGdldCBudWxsYWJpbGl0eVN1ZmZpeDsKIAotICAvKioKLSAgICogQXBwZW5kIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR5cGUgdG8gdGhlIGdpdmVuIFtidWlsZGVyXS4KLSAgICovCisgIC8vLyBBcHBlbmQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHlwZSB0byB0aGUgZ2l2ZW4gW2J1aWxkZXJdLgogICB2b2lkIGFwcGVuZFRvKEVsZW1lbnREaXNwbGF5U3RyaW5nQnVpbGRlciBidWlsZGVyKTsKIAogICBAb3ZlcnJpZGUKQEAgLTE4NzcsMTAgKzE4MzEsOCBAQAogICBAb3ZlcnJpZGUKICAgRGFydFR5cGUgcmVzb2x2ZVRvQm91bmQoRGFydFR5cGUgb2JqZWN0VHlwZSkgPT4gdGhpczsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB0eXBlIHJlc3VsdGluZyBmcm9tIHN1YnN0aXR1dGluZyB0aGUgZ2l2ZW4gW2FyZ3VtZW50VHlwZXNdIGZvcgotICAgKiB0aGUgZ2l2ZW4gW3BhcmFtZXRlclR5cGVzXSBpbiB0aGlzIHR5cGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB0eXBlIHJlc3VsdGluZyBmcm9tIHN1YnN0aXR1dGluZyB0aGUgZ2l2ZW4gW2FyZ3VtZW50VHlwZXNdIGZvcgorICAvLy8gdGhlIGdpdmVuIFtwYXJhbWV0ZXJUeXBlc10gaW4gdGhpcyB0eXBlLgogICBAb3ZlcnJpZGUKICAgQGRlcHJlY2F0ZWQKICAgRGFydFR5cGUgc3Vic3RpdHV0ZTIoCkBAIC0xODkxLDI0ICsxODQzLDIwIEBACiAgICAgcmV0dXJuIGdldERpc3BsYXlTdHJpbmcod2l0aE51bGxhYmlsaXR5OiBmYWxzZSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzYW1lIHR5cGUsIGJ1dCB3aXRoIHRoZSBnaXZlbiBbbnVsbGFiaWxpdHlTdWZmaXhdLgotICAgKgotICAgKiBJZiB0aGUgbnVsbGFiaWxpdHkgb2YgYHRoaXNgIGFscmVhZHkgbWF0Y2hlcyBbbnVsbGFiaWxpdHlTdWZmaXhdLCBgdGhpc2AKLSAgICogaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqIE5vdGU6IHRoaXMgbWV0aG9kIGp1c3QgZG9lcyBsb3ctbGV2ZWwgbWFuaXB1bGF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyB0eXBlLAotICAgKiBzbyBpdCBpcyB3aGF0IHlvdSB3YW50IGlmIHlvdSBhcmUgY29uc3RydWN0aW5nIGEgZnJlc2ggdHlwZSBhbmQgd2FudCBpdCB0bwotICAgKiBoYXZlIHRoZSBjb3JyZWN0IG51bGxhYmlsaXR5IHN1ZmZpeCwgYnV0IGl0IGlzIGdlbmVyYWxseSAqbm90KiB3aGF0IHlvdQotICAgKiB3YW50IGlmIHlvdSdyZSBtYW5pcHVsYXRpbmcgZXhpc3RpbmcgdHlwZXMuICBGb3IgbWFuaXB1bGF0aW5nIGV4aXN0aW5nCi0gICAqIHR5cGVzLCBwbGVhc2UgdXNlIHRoZSBtZXRob2RzIGluIFtUeXBlU3lzdGVtSW1wbF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzYW1lIHR5cGUsIGJ1dCB3aXRoIHRoZSBnaXZlbiBbbnVsbGFiaWxpdHlTdWZmaXhdLgorICAvLy8KKyAgLy8vIElmIHRoZSBudWxsYWJpbGl0eSBvZiBgdGhpc2AgYWxyZWFkeSBtYXRjaGVzIFtudWxsYWJpbGl0eVN1ZmZpeF0sIGB0aGlzYAorICAvLy8gaXMgcmV0dXJuZWQuCisgIC8vLworICAvLy8gTm90ZTogdGhpcyBtZXRob2QganVzdCBkb2VzIGxvdy1sZXZlbCBtYW5pcHVsYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nCisgIC8vLyB0eXBlLCBzbyBpdCBpcyB3aGF0IHlvdSB3YW50IGlmIHlvdSBhcmUgY29uc3RydWN0aW5nIGEgZnJlc2ggdHlwZSBhbmQgd2FudAorICAvLy8gaXQgdG8gaGF2ZSB0aGUgY29ycmVjdCBudWxsYWJpbGl0eSBzdWZmaXgsIGJ1dCBpdCBpcyBnZW5lcmFsbHkgKm5vdCogd2hhdAorICAvLy8geW91IHdhbnQgaWYgeW91J3JlIG1hbmlwdWxhdGluZyBleGlzdGluZyB0eXBlcy4gIEZvciBtYW5pcHVsYXRpbmcgZXhpc3RpbmcKKyAgLy8vIHR5cGVzLCBwbGVhc2UgdXNlIHRoZSBtZXRob2RzIGluIFtUeXBlU3lzdGVtSW1wbF0uCiAgIFR5cGVJbXBsIHdpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeCBudWxsYWJpbGl0eVN1ZmZpeCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiB0aGUgW2ZpcnN0XSBhbmQgW3NlY29uZF0gbGlzdHMKLSAgICogb2YgdHlwZSBhcmd1bWVudHMgYXJlIGFsbCBlcXVhbC4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlIFtmaXJzdF0gYW5kIFtzZWNvbmRdIGxpc3RzCisgIC8vLyBvZiB0eXBlIGFyZ3VtZW50cyBhcmUgYWxsIGVxdWFsLgogICBzdGF0aWMgYm9vbCBlcXVhbEFycmF5cyhMaXN0PERhcnRUeXBlPiBmaXJzdCwgTGlzdDxEYXJ0VHlwZT4gc2Vjb25kKSB7CiAgICAgaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xOTMwLDEwICsxODc4LDkgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgdXNpbmcgdGhlIGdpdmVuIFthcmd1bWVudFR5cGVzXSBhbmQKLSAgICogW3BhcmFtZXRlclR5cGVzXSB0byBwZXJmb3JtIGEgc3Vic3RpdHV0aW9uIG9uIGFsbCBvZiB0aGUgZ2l2ZW4gW3R5cGVzXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgdXNpbmcgdGhlIGdpdmVuIFthcmd1bWVudFR5cGVzXQorICAvLy8gYW5kIFtwYXJhbWV0ZXJUeXBlc10gdG8gcGVyZm9ybSBhIHN1YnN0aXR1dGlvbiBvbiBhbGwgb2YgdGhlIGdpdmVuCisgIC8vLyBbdHlwZXNdLgogICBAZGVwcmVjYXRlZAogICBzdGF0aWMgTGlzdDxEYXJ0VHlwZT4gc3Vic3RpdHV0ZShMaXN0PERhcnRUeXBlPiB0eXBlcywKICAgICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50VHlwZXMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlclR5cGVzKSB7CkBAIC0xOTQ5LDkgKzE4OTYsNyBAQAogICB9CiB9CiAKLS8qKgotICogQSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIFtUeXBlUGFyYW1ldGVyVHlwZV0uCi0gKi8KKy8vLyBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEgW1R5cGVQYXJhbWV0ZXJUeXBlXS4KIGNsYXNzIFR5cGVQYXJhbWV0ZXJUeXBlSW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgVHlwZVBhcmFtZXRlclR5cGUgewogICBAb3ZlcnJpZGUKICAgZmluYWwgTnVsbGFiaWxpdHlTdWZmaXggbnVsbGFiaWxpdHlTdWZmaXg7CkBAIC0xOTYyLDEwICsxOTA3LDggQEAKICAgLy8vIGlzIHRoZXJlZm9yZSB0aGUgc2FtZSBhcyB0aGUgYm91bmQgb2YgW2VsZW1lbnRdLgogICBmaW5hbCBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB0eXBlIHBhcmFtZXRlciB0eXBlIHRvIGJlIGRlY2xhcmVkIGJ5IHRoZSBnaXZlbgotICAgKiBbZWxlbWVudF0gYW5kIHRvIGhhdmUgdGhlIGdpdmVuIG5hbWUuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdHlwZSBwYXJhbWV0ZXIgdHlwZSB0byBiZSBkZWNsYXJlZCBieSB0aGUgZ2l2ZW4KKyAgLy8vIFtlbGVtZW50XSBhbmQgdG8gaGF2ZSB0aGUgZ2l2ZW4gbmFtZS4KICAgVHlwZVBhcmFtZXRlclR5cGVJbXBsKHsKICAgICBAcmVxdWlyZWQgVHlwZVBhcmFtZXRlckVsZW1lbnQgZWxlbWVudCwKICAgICBAcmVxdWlyZWQgdGhpcy5udWxsYWJpbGl0eVN1ZmZpeCwKQEAgLTIwNTMsNyArMTk5Niw4IEBACiAgICAgICBpZiAocGFyYW1ldGVyVHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZUltcGwgJiYgcGFyYW1ldGVyVHlwZSA9PSB0aGlzKSB7CiAgICAgICAgIFR5cGVJbXBsIGFyZ3VtZW50VHlwZSA9IGFyZ3VtZW50VHlwZXNbaV07CiAKLSAgICAgICAgLy8gVE9ETyhzY2hlZ2xvdikgSXQgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBzb21ldGltZXMgYXJndW1lbnRzIGFyZSBudWxsLgorICAgICAgICAvLyBUT0RPKHNjaGVnbG92KSBJdCBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHNvbWV0aW1lcyBhcmd1bWVudHMgYXJlCisgICAgICAgIC8vICBudWxsLgogICAgICAgICBpZiAoYXJndW1lbnRUeXBlID09IG51bGwpIHsKICAgICAgICAgICByZXR1cm4gYXJndW1lbnRUeXBlOwogICAgICAgICB9CkBAIC0yMTAxLDEwICsyMDQ1LDggQEAKICAgICApOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgdHlwZSBwYXJhbWV0ZXIgdHlwZXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4KLSAgICogYXJyYXkgb2YgdHlwZSBwYXJhbWV0ZXIgZWxlbWVudHMgKFt0eXBlUGFyYW1ldGVyc10pLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgdHlwZSBwYXJhbWV0ZXIgdHlwZXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4KKyAgLy8vIGFycmF5IG9mIHR5cGUgcGFyYW1ldGVyIGVsZW1lbnRzIChbdHlwZVBhcmFtZXRlcnNdKS4KICAgQGRlcHJlY2F0ZWQKICAgc3RhdGljIExpc3Q8VHlwZVBhcmFtZXRlclR5cGU+IGdldFR5cGVzKAogICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZVBhcmFtZXRlcnMpIHsKQEAgLTIxMjAsMjggKzIwNjIsMTIgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSB0eXBlIGB2b2lkYC4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVm9pZFR5cGUgaW1wbGVtZW50cyBEYXJ0VHlwZSB7Ci0gIEBvdmVycmlkZQotICBAZGVwcmVjYXRlZAotICBWb2lkVHlwZSBzdWJzdGl0dXRlMigKLSAgICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50VHlwZXMsIExpc3Q8RGFydFR5cGU+IHBhcmFtZXRlclR5cGVzKTsKLX0KLQotLyoqCi0gKiBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEgW1ZvaWRUeXBlXS4KLSAqLworLy8vIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYSBbVm9pZFR5cGVdLgogY2xhc3MgVm9pZFR5cGVJbXBsIGV4dGVuZHMgVHlwZUltcGwgaW1wbGVtZW50cyBWb2lkVHlwZSB7Ci0gIC8qKgotICAgKiBUaGUgdW5pcXVlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHdpdGggaW5kZXRlcm1pbmF0ZSBudWxsYWJpbGl0eS4KLSAgICovCisgIC8vLyBUaGUgdW5pcXVlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHdpdGggaW5kZXRlcm1pbmF0ZSBudWxsYWJpbGl0eS4KICAgc3RhdGljIGZpbmFsIFZvaWRUeXBlSW1wbCBpbnN0YW5jZSA9IFZvaWRUeXBlSW1wbC5fKCk7CiAKLSAgLyoqCi0gICAqIFByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgKi8KKyAgLy8vIFByZXZlbnQgdGhlIGNyZWF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogICBWb2lkVHlwZUltcGwuXygpIDogc3VwZXIobnVsbCk7CiAKICAgQG92ZXJyaWRlCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9jb25zdHJhaW50X2dhdGhlcmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9jb25zdHJhaW50X2dhdGhlcmVyLmRhcnQKaW5kZXggZjRkNmE1NC4uMjFjZGQ5YyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfY29uc3RyYWludF9nYXRoZXJlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2NvbnN0cmFpbnRfZ2F0aGVyZXIuZGFydApAQCAtOSw3ICs5LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiAvLy8gQSBjb25zdHJhaW50IG9uIHRoZSB0eXBlIFtwYXJhbWV0ZXJdIHRoYXQgd2UncmUgaW5mZXJyaW5nLgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2RlbW90aW9uLmRhcnQKaW5kZXggM2VjODA5Ny4uNDFhOWUxNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9kZW1vdGlvbi5kYXJ0CkBAIC03LDggKzcsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvcmVwbGFjZW1lbnRfdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfdmlzaXRvci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogCiAvLy8gUmV0dXJucyBbdHlwZV0gaW4gd2hpY2ggYWxsIHByb21vdGVkIHR5cGUgdmFyaWFibGVzIGhhdmUgYmVlbiByZXBsYWNlIHdpdGgKIC8vLyB0aGVpciB1bnByb21vdGVkIGVxdWl2YWxlbnRzLCBhbmQsIGlmIFtsaWJyYXJ5XSBpcyBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0CmluZGV4IDBmNjc5NTguLjcyNGU2M2IgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydApAQCAtOCw3ICs4LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC92YWx1ZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogLy8vIFByb3ZpZGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgc2hhcmVkIGJ5IHRoZSB2YXJpb3VzIFR5cGVQcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JlZjAzCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQKQEAgLTAsMCArMSwxNTA3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKKworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L2FzdC5kYXJ0JyBzaG93IEFzdE5vZGU7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdG9rZW4uZGFydCcgc2hvdyBUb2tlblR5cGU7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L251bGxfc2FmZXR5X3VuZGVyc3RhbmRpbmdfZmxhZy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvbnVsbGFiaWxpdHlfc3VmZml4LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JyBhcyBwdWJsaWM7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCcgc2hvdyBFcnJvclJlcG9ydGVyOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2dlbmVyaWNfaW5mZXJyZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9ncmVhdGVzdF9sb3dlcl9ib3VuZC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2xlYXN0X3VwcGVyX2JvdW5kLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbm9ybWFsaXplLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbnVsbGFiaWxpdHlfZWxpbWluYXRvci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3J1bnRpbWVfdHlwZV9lcXVhbGl0eS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3N1YnR5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90b3BfbWVyZ2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYV9lbGltaW5hdGlvbi5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CisKKy8vLyBUaGUgaW50ZXJmYWNlIGBUeXBlU3lzdGVtYCBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiBhbiBvYmplY3QgcmVwcmVzZW50aW5nCisvLy8gdGhlIHR5cGUgc3lzdGVtLiAgVGhpcyBwcm92aWRlcyBhIGNvbW1vbiBsb2NhdGlvbiB0byBwdXQgbWV0aG9kcyB0aGF0IGFjdCBvbgorLy8vIHR5cGVzIGJ1dCBtYXkgbmVlZCBhY2Nlc3MgdG8gbW9yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzLCBhbmQgaXQgcGF2ZXMgdGhlCisvLy8gd2F5IGZvciBhIHBvc3NpYmxlIGZ1dHVyZSB3aGVyZSB3ZSBtYXkgd2lzaCB0byBtYWtlIHRoZSB0eXBlIHN5c3RlbQorLy8vIHBsdWdnYWJsZS4KKy8vIFRPRE8oYnJpYW53aWxrZXJzb24pIFJlbmFtZSB0aGlzIGNsYXNzIHRvIFR5cGVTeXN0ZW1JbXBsLgorYWJzdHJhY3QgY2xhc3MgVHlwZVN5c3RlbSBpbXBsZW1lbnRzIHB1YmxpYy5UeXBlU3lzdGVtIHsKKyAgLy8vIElmIGB0cnVlYCwgdGhlbiBOTkJEIHR5cGUgcnVsZXMgc2hvdWxkIGJlIHVzZWQuCisgIC8vLyBJZiBgZmFsc2VgLCB0aGVuIGxlZ2FjeSB0eXBlIHJ1bGVzIHNob3VsZCBiZSB1c2VkLgorICBmaW5hbCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CisKKyAgVHlwZVN5c3RlbSh7QHJlcXVpcmVkIHRoaXMuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdH0pOworCisgIC8vLyBUaGUgcHJvdmlkZXIgb2YgdHlwZXMgZm9yIHRoZSBzeXN0ZW0KKyAgVHlwZVByb3ZpZGVyIGdldCB0eXBlUHJvdmlkZXI7CisKKyAgQG92ZXJyaWRlCisgIFR5cGVJbXBsIGZsYXR0ZW4oRGFydFR5cGUgdHlwZSkgeworICAgIGlmIChpZGVudGljYWwodHlwZSwgVW5rbm93bkluZmVycmVkVHlwZS5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8vIGlmIFQgaXMgUz8gdGhlbiBmbGF0dGVuKFQpID0gZmxhdHRlbihTKT8KKyAgICAvLyBpZiBUIGlzIFMqIHRoZW4gZmxhdHRlbihUKSA9IGZsYXR0ZW4oUykqCisgICAgTnVsbGFiaWxpdHlTdWZmaXggbnVsbGFiaWxpdHlTdWZmaXggPSB0eXBlLm51bGxhYmlsaXR5U3VmZml4OworICAgIGlmIChudWxsYWJpbGl0eVN1ZmZpeCAhPSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKSB7CisgICAgICB2YXIgUyA9ICh0eXBlIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICByZXR1cm4gZmxhdHRlbihTKS53aXRoTnVsbGFiaWxpdHkobnVsbGFiaWxpdHlTdWZmaXgpOworICAgIH0KKworICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKKyAgICAgIC8vIEltcGxlbWVudCB0aGUgY2FzZXM6CisgICAgICAvLyAgLSAiSWYgVCA9IEZ1dHVyZU9yPFM+IHRoZW4gZmxhdHRlbihUKSA9IFMuIgorICAgICAgLy8gIC0gIklmIFQgPSBGdXR1cmU8Uz4gdGhlbiBmbGF0dGVuKFQpID0gUy4iCisgICAgICBpZiAodHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yIHx8IHR5cGUuaXNEYXJ0QXN5bmNGdXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUudHlwZUFyZ3VtZW50cy5pc05vdEVtcHR5CisgICAgICAgICAgICA/IHR5cGUudHlwZUFyZ3VtZW50c1swXQorICAgICAgICAgICAgOiBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2U7CisgICAgICB9CisgICAgICAvLyBJbXBsZW1lbnQgdGhlIGNhc2U6ICJPdGhlcndpc2UgaWYgVCA8OiBGdXR1cmUgdGhlbiBsZXQgUyBiZSBhIHR5cGUKKyAgICAgIC8vIHN1Y2ggdGhhdCBUIDw8IEZ1dHVyZTxTPiBhbmQgZm9yIGFsbCBSLCBpZiBUIDw8IEZ1dHVyZTxSPiB0aGVuIFMgPDwgUi4KKyAgICAgIC8vIFRoZW4gZmxhdHRlbihUKSA9IFMuIgorICAgICAgLy8KKyAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBnaXZlbiB0aGUgc2V0IG9mIGFsbCB0eXBlcyBSIHN1Y2ggdGhhdCBUIDw8IEZ1dHVyZTxSPiwKKyAgICAgIC8vIGxldCBTIGJlIHRoZSBtb3N0IHNwZWNpZmljIG9mIHRob3NlIHR5cGVzLCBpZiBhbnkgc3VjaCBTIGV4aXN0cy4KKyAgICAgIC8vCisgICAgICAvLyBTaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZSwgaXQgaXMgc3VmZmljaWVudCB0bworICAgICAgLy8gbG9vayBhdCB0aGUgdHlwZXMgYXBwZWFyaW5nIGFzIGEgcGFyYW1ldGVyIHRvIEZ1dHVyZSBpbiB0aGUgdHlwZQorICAgICAgLy8gaGllcmFyY2h5IG9mIFQuICBXZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBzdXBlcnR5cGVzIG9mIHRob3NlCisgICAgICAvLyB0eXBlcywgc2luY2UgdGhleSBhcmUgYnkgZGVmaW5pdGlvbiBsZXNzIHNwZWNpZmljLgorICAgICAgTGlzdDxEYXJ0VHlwZT4gY2FuZGlkYXRlVHlwZXMgPQorICAgICAgICAgIF9zZWFyY2hUeXBlSGllcmFyY2h5Rm9yRnV0dXJlVHlwZVBhcmFtZXRlcnModHlwZSk7CisgICAgICBEYXJ0VHlwZSBmbGF0dGVuUmVzdWx0ID0KKyAgICAgICAgICBJbnRlcmZhY2VUeXBlSW1wbC5maW5kTW9zdFNwZWNpZmljVHlwZShjYW5kaWRhdGVUeXBlcywgdGhpcyk7CisgICAgICBpZiAoZmxhdHRlblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmbGF0dGVuUmVzdWx0OworICAgICAgfQorICAgIH0KKyAgICAvLyBJbXBsZW1lbnQgdGhlIGNhc2U6ICJJbiBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlLCBmbGF0dGVuKFQpID0gVC4iCisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICBMaXN0PEludGVyZmFjZVR5cGU+IGdhdGhlck1peGluU3VwZXJ0eXBlQ29uc3RyYWludHNGb3JJbmZlcmVuY2UoCisgICAgICBDbGFzc0VsZW1lbnQgbWl4aW5FbGVtZW50KSB7CisgICAgTGlzdDxJbnRlcmZhY2VUeXBlPiBjYW5kaWRhdGVzOworICAgIGlmIChtaXhpbkVsZW1lbnQuaXNNaXhpbikgeworICAgICAgY2FuZGlkYXRlcyA9IG1peGluRWxlbWVudC5zdXBlcmNsYXNzQ29uc3RyYWludHM7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhbmRpZGF0ZXMgPSBbbWl4aW5FbGVtZW50LnN1cGVydHlwZV07CisgICAgICBjYW5kaWRhdGVzLmFkZEFsbChtaXhpbkVsZW1lbnQubWl4aW5zKTsKKyAgICAgIGlmIChtaXhpbkVsZW1lbnQuaXNNaXhpbkFwcGxpY2F0aW9uKSB7CisgICAgICAgIGNhbmRpZGF0ZXMucmVtb3ZlTGFzdCgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2FuZGlkYXRlcworICAgICAgICAud2hlcmUoKHR5cGUpID0+IHR5cGUuZWxlbWVudC50eXBlUGFyYW1ldGVycy5pc05vdEVtcHR5KQorICAgICAgICAudG9MaXN0KCk7CisgIH0KKworICAvLy8gQ29tcHV0ZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIHR5cGVzLgorICBEYXJ0VHlwZSBnZXRMZWFzdFVwcGVyQm91bmQoRGFydFR5cGUgdHlwZTEsIERhcnRUeXBlIHR5cGUyKTsKKworICAvLy8gR2l2ZW4gYSBbRGFydFR5cGVdIFt0eXBlXSwgaW5zdGFudGlhdGUgaXQgd2l0aCBpdHMgYm91bmRzLgorICAvLy8KKyAgLy8vIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uIHRoZSB0eXBlIHN5c3RlbSwgZm9yIGV4YW1wbGUsIGluCisgIC8vLyBjbGFzc2ljIERhcnQgYGR5bmFtaWNgIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHR5cGUgYXJndW1lbnRzLCB3aGVyZWFzCisgIC8vLyBzdHJvbmcgbW9kZSBwcmVmZXJzIHRoZSBhY3R1YWwgYm91bmQgdHlwZSBpZiBpdCB3YXMgc3BlY2lmaWVkLgorICBEYXJ0VHlwZSBpbnN0YW50aWF0ZVRvQm91bmRzKERhcnRUeXBlIHR5cGUsIHtMaXN0PGJvb2w+IGhhc0Vycm9yfSk7CisKKyAgLy8vIEdpdmVuIGEgW0RhcnRUeXBlXSBbdHlwZV0gYW5kIGEgbGlzdCBvZiB0eXBlcworICAvLy8gW3R5cGVBcmd1bWVudHNdLCBpbnN0YW50aWF0ZSB0aGUgdHlwZSBmb3JtYWxzIHdpdGggdGhlCisgIC8vLyBwcm92aWRlZCBhY3R1YWxzLiAgSWYgW3R5cGVdIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwKKyAgLy8vIG5vIGluc3RhbnRpYXRpb24gaXMgZG9uZS4KKyAgRGFydFR5cGUgaW5zdGFudGlhdGVUeXBlKERhcnRUeXBlIHR5cGUsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKKyAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKKyAgICAgIHJldHVybiB0eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlSW1wbCkgeworICAgICAgLy8gVE9ETyhzY2hlZ2xvdikgVXNlIGBDbGFzc0VsZW1lbnQuaW5zdGFudGlhdGUoKWAsIGRvbid0IHVzZSByYXcgdHlwZXMuCisgICAgICByZXR1cm4gdHlwZS5lbGVtZW50Lmluc3RhbnRpYXRlKAorICAgICAgICB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzLAorICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogdHlwZS5udWxsYWJpbGl0eVN1ZmZpeCwKKyAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgfQorCisgIC8vLyBHaXZlbiB1bmluc3RhbnRpYXRlZCBbdHlwZUZvcm1hbHNdLCBpbnN0YW50aWF0ZSB0aGVtIHRvIHRoZWlyIGJvdW5kcy4KKyAgTGlzdDxEYXJ0VHlwZT4gaW5zdGFudGlhdGVUeXBlRm9ybWFsc1RvQm91bmRzKAorICAgICAgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZUZvcm1hbHMsCisgICAgICB7TGlzdDxib29sPiBoYXNFcnJvcn0pOworCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbbGVmdFR5cGVdIGlzIGFzc2lnbmFibGUgdG8gdGhlIFtyaWdodFR5cGVdICh0aGF0IGlzLAorICAvLy8gaWYgbGVmdFR5cGUgPD09PiByaWdodFR5cGUpLgorICBAb3ZlcnJpZGUKKyAgYm9vbCBpc0Fzc2lnbmFibGVUbyhEYXJ0VHlwZSBsZWZ0VHlwZSwgRGFydFR5cGUgcmlnaHRUeXBlKTsKKworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2xlZnRUeXBlXSBpcyBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIFtyaWdodFR5cGVdCisgIC8vLyAodGhhdCBpcywgaWYgbGVmdFR5cGUgPDwgcmlnaHRUeXBlKSwgYXMgZGVmaW5lZCBpbiB0aGUgRGFydCBsYW5ndWFnZSBzcGVjLgorICAvLy8KKyAgLy8vIEluIHN0cm9uZyBtb2RlLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gW2lzU3VidHlwZU9mXS4KKyAgQERlcHJlY2F0ZWQoJ1VzZSBpc1N1YnR5cGVPZigpIGluc3RlYWQuJykKKyAgYm9vbCBpc01vcmVTcGVjaWZpY1RoYW4oRGFydFR5cGUgbGVmdFR5cGUsIERhcnRUeXBlIHJpZ2h0VHlwZSk7CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgaXNOb25OdWxsYWJsZShEYXJ0VHlwZSB0eXBlKSB7CisgICAgaWYgKHR5cGUuaXNEeW5hbWljIHx8IHR5cGUuaXNWb2lkIHx8IHR5cGUuaXNEYXJ0Q29yZU51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHR5cGUubnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHR5cGUuaXNEYXJ0QXN5bmNGdXR1cmVPcikgeworICAgICAgcmV0dXJuIGlzTm9uTnVsbGFibGUoKHR5cGUgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXSk7CisgICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CisgICAgICByZXR1cm4gaXNOb25OdWxsYWJsZSh0eXBlLmJvdW5kKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgYm9vbCBpc051bGxhYmxlKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZS5pc0R5bmFtaWMgfHwgdHlwZS5pc1ZvaWQgfHwgdHlwZS5pc0RhcnRDb3JlTnVsbCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICh0eXBlLm51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHR5cGUuaXNEYXJ0QXN5bmNGdXR1cmVPcikgeworICAgICAgcmV0dXJuIGlzTnVsbGFibGUoKHR5cGUgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGlzUG90ZW50aWFsbHlOb25OdWxsYWJsZShEYXJ0VHlwZSB0eXBlKSA9PiAhaXNOdWxsYWJsZSh0eXBlKTsKKworICBAb3ZlcnJpZGUKKyAgYm9vbCBpc1BvdGVudGlhbGx5TnVsbGFibGUoRGFydFR5cGUgdHlwZSkgPT4gIWlzTm9uTnVsbGFibGUodHlwZSk7CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgaXNTdHJpY3RseU5vbk51bGxhYmxlKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZS5pc0R5bmFtaWMgfHwgdHlwZS5pc1ZvaWQgfHwgdHlwZS5pc0RhcnRDb3JlTnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAodHlwZS5udWxsYWJpbGl0eVN1ZmZpeCAhPSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7CisgICAgICByZXR1cm4gaXNTdHJpY3RseU5vbk51bGxhYmxlKHR5cGUudHlwZUFyZ3VtZW50c1swXSk7CisgICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CisgICAgICByZXR1cm4gaXNTdHJpY3RseU5vbk51bGxhYmxlKHR5cGUuYm91bmQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBbbGVmdFR5cGVdIGlzIGEgc3VidHlwZSBvZiB0aGUgW3JpZ2h0VHlwZV0gKHRoYXQgaXMsCisgIC8vLyBpZiBsZWZ0VHlwZSA8OiByaWdodFR5cGUpLgorICBAb3ZlcnJpZGUKKyAgYm9vbCBpc1N1YnR5cGVPZihEYXJ0VHlwZSBsZWZ0VHlwZSwgRGFydFR5cGUgcmlnaHRUeXBlKTsKKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgbGVhc3RVcHBlckJvdW5kKERhcnRUeXBlIGxlZnRUeXBlLCBEYXJ0VHlwZSByaWdodFR5cGUpIHsKKyAgICBpZiAoIU51bGxTYWZldHlVbmRlcnN0YW5kaW5nRmxhZy5pc0VuYWJsZWQpIHsKKyAgICAgIGxlZnRUeXBlID0gTnVsbGFiaWxpdHlFbGltaW5hdG9yLnBlcmZvcm0odHlwZVByb3ZpZGVyLCBsZWZ0VHlwZSk7CisgICAgICByaWdodFR5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIHJpZ2h0VHlwZSk7CisgICAgfQorICAgIHJldHVybiBnZXRMZWFzdFVwcGVyQm91bmQobGVmdFR5cGUsIHJpZ2h0VHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIG51bGxhYmxlIHZlcnNpb24gb2YgW3R5cGVdLiAgVGhlIHJlc3VsdCB3b3VsZCBiZSBlcXVpdmFsZW50IHRvCisgIC8vLyB0aGUgdW5pb24gYHR5cGUgfCBOdWxsYCAoaWYgd2Ugc3VwcG9ydGVkIHVuaW9uIHR5cGVzKS4KKyAgRGFydFR5cGUgbWFrZU51bGxhYmxlKFR5cGVJbXBsIHR5cGUpIHsKKyAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGhhbmRsZSB0eXBlIHBhcmFtZXRlciB0eXBlcworICAgIHJldHVybiB0eXBlLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbik7CisgIH0KKworICAvLy8gQXR0ZW1wdHMgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgc3Vic3RpdHV0aW9uIGZvciB0aGUgW21peGluRWxlbWVudF0KKyAgLy8vIHR5cGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIFtzcmNUeXBlc10gdG8gbWFrZSBpdCBlcXVhbCB0bworICAvLy8gW2Rlc3RUeXBlc10uICBJZiBubyBzdWNoIHN1YnN0aXR1dGlvbiBjYW4gYmUgZm91bmQsIGBudWxsYCBpcyByZXR1cm5lZC4KKyAgTGlzdDxEYXJ0VHlwZT4gbWF0Y2hTdXBlcnR5cGVDb25zdHJhaW50cygKKyAgICBDbGFzc0VsZW1lbnQgbWl4aW5FbGVtZW50LAorICAgIExpc3Q8RGFydFR5cGU+IHNyY1R5cGVzLAorICAgIExpc3Q8RGFydFR5cGU+IGRlc3RUeXBlcywKKyAgKSB7CisgICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gbWl4aW5FbGVtZW50LnR5cGVQYXJhbWV0ZXJzOworICAgIHZhciBpbmZlcnJlciA9IEdlbmVyaWNJbmZlcnJlcih0aGlzLCB0eXBlUGFyYW1ldGVycyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgaW5mZXJyZXIuY29uc3RyYWluUmV0dXJuVHlwZShzcmNUeXBlc1tpXSwgZGVzdFR5cGVzW2ldKTsKKyAgICAgIGluZmVycmVyLmNvbnN0cmFpblJldHVyblR5cGUoZGVzdFR5cGVzW2ldLCBzcmNUeXBlc1tpXSk7CisgICAgfQorCisgICAgdmFyIGluZmVycmVkVHlwZXMgPSBpbmZlcnJlci5pbmZlcigKKyAgICAgIHR5cGVQYXJhbWV0ZXJzLAorICAgICAgY29uc2lkZXJFeHRlbmRzQ2xhdXNlOiBmYWxzZSwKKyAgICApOworICAgIHZhciBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKHR5cGVQYXJhbWV0ZXJzLCBpbmZlcnJlZFR5cGVzKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChzdWJzdGl0dXRpb24uc3Vic3RpdHV0ZVR5cGUoc3JjVHlwZXNbaV0pICE9IGRlc3RUeXBlc1tpXSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBzdWJzdGl0dXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluZmVycmVkVHlwZXM7CisgIH0KKworICAvLy8gU2VhcmNoZXMgdGhlIHN1cGVyaW50ZXJmYWNlcyBvZiBbdHlwZV0gZm9yIGltcGxlbWVudGF0aW9ucyBvZgorICAvLy8gW2dlbmVyaWNUeXBlXSBhbmQgcmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyB0eXBlIGFyZ3VtZW50IHVzZWQgZm9yIHRoYXQKKyAgLy8vIGdlbmVyaWMgdHlwZS4KKyAgLy8vCisgIC8vLyBGb3IgYSBtb3JlIGdlbmVyYWwvcm9idXN0IHNvbHV0aW9uLCB1c2UgW0ludGVyZmFjZVR5cGVJbXBsLmFzSW5zdGFuY2VPZl0uCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIFt0eXBlXSBgTGlzdDxpbnQ+YCBhbmQgW2dlbmVyaWNUeXBlXSBgSXRlcmFibGU8VD5gLAorICAvLy8gcmV0dXJucyBbaW50XS4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGBudWxsYCBpZiBbdHlwZV0gZG9lcyBub3QgaW1wbGVtZW50IFtnZW5lcmljVHlwZV0uCisgIERhcnRUeXBlIG1vc3RTcGVjaWZpY1R5cGVBcmd1bWVudChEYXJ0VHlwZSB0eXBlLCBEYXJ0VHlwZSBnZW5lcmljVHlwZSkgeworICAgIGlmICh0eXBlIGlzISBJbnRlcmZhY2VUeXBlKSByZXR1cm4gbnVsbDsKKyAgICBpZiAoZ2VuZXJpY1R5cGUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBudWxsOworCisgICAgdmFyIGFzSW5zdGFuY2VPZiA9ICh0eXBlIGFzIEludGVyZmFjZVR5cGVJbXBsKQorICAgICAgICAuYXNJbnN0YW5jZU9mKChnZW5lcmljVHlwZSBhcyBJbnRlcmZhY2VUeXBlKS5lbGVtZW50KTsKKworICAgIGlmIChhc0luc3RhbmNlT2YgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGFzSW5zdGFuY2VPZi50eXBlQXJndW1lbnRzWzBdOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLy8vIFJldHVybnMgYSBub24tbnVsbGFibGUgdmVyc2lvbiBvZiBbdHlwZV0uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgIC8vLyBvcGVyYXRpb24gYE5vbk51bGxgIGRlZmluZWQgaW4gdGhlIHNwZWMuCisgIEBvdmVycmlkZQorICBEYXJ0VHlwZSBwcm9tb3RlVG9Ob25OdWxsKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZS5pc0RhcnRDb3JlTnVsbCkgcmV0dXJuIE5ldmVyVHlwZUltcGwuaW5zdGFuY2U7CisKKyAgICBpZiAodHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZUltcGwpIHsKKyAgICAgIHZhciBlbGVtZW50ID0gdHlwZS5lbGVtZW50OworCisgICAgICAvLyBOb25OdWxsKFggJiBUKSA9IFggJiBOb25OdWxsKFQpCisgICAgICBpZiAodHlwZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKKyAgICAgICAgdmFyIHByb21vdGVkQm91bmQgPSBwcm9tb3RlVG9Ob25OdWxsKHR5cGUucHJvbW90ZWRCb3VuZCk7CisgICAgICAgIHJldHVybiBUeXBlUGFyYW1ldGVyVHlwZUltcGwoCisgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKKyAgICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogTnVsbGFiaWxpdHlTdWZmaXgubm9uZSwKKyAgICAgICAgICBwcm9tb3RlZEJvdW5kOiBwcm9tb3RlZEJvdW5kLAorICAgICAgICApOworICAgICAgfQorCisgICAgICAvLyBOb25OdWxsKFgpID0gWCAmIE5vbk51bGwoQiksIHdoZXJlIEIgaXMgdGhlIGJvdW5kIG9mIFgKKyAgICAgIHZhciBwcm9tb3RlZEJvdW5kID0gZWxlbWVudC5ib3VuZCAhPSBudWxsCisgICAgICAgICAgPyBwcm9tb3RlVG9Ob25OdWxsKGVsZW1lbnQuYm91bmQpCisgICAgICAgICAgOiB0eXBlUHJvdmlkZXIub2JqZWN0VHlwZTsKKyAgICAgIGlmIChpZGVudGljYWwocHJvbW90ZWRCb3VuZCwgZWxlbWVudC5ib3VuZCkpIHsKKyAgICAgICAgcHJvbW90ZWRCb3VuZCA9IG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gVHlwZVBhcmFtZXRlclR5cGVJbXBsKAorICAgICAgICBlbGVtZW50OiBlbGVtZW50LAorICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogTnVsbGFiaWxpdHlTdWZmaXgubm9uZSwKKyAgICAgICAgcHJvbW90ZWRCb3VuZDogcHJvbW90ZWRCb3VuZCwKKyAgICAgICk7CisgICAgfQorCisgICAgcmV0dXJuICh0eXBlIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgYmluYXJ5IGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gW29wZXJhdG9yXSB3aG9zZQorICAvLy8gbGVmdCBvcGVyYW5kIGhhcyB0aGUgdHlwZSBbbGVmdFR5cGVdIGFuZCB3aG9zZSByaWdodCBvcGVyYW5kIGhhcyB0aGUgdHlwZQorICAvLy8gW3JpZ2h0VHlwZV0sIGdpdmVuIHRoYXQgcmVzb2x1dGlvbiBoYXMgc28gZmFyIHByb2R1Y2VkIHRoZSBbY3VycmVudFR5cGVdLgorICBEYXJ0VHlwZSByZWZpbmVCaW5hcnlFeHByZXNzaW9uVHlwZShEYXJ0VHlwZSBsZWZ0VHlwZSwgVG9rZW5UeXBlIG9wZXJhdG9yLAorICAgICAgRGFydFR5cGUgcmlnaHRUeXBlLCBEYXJ0VHlwZSBjdXJyZW50VHlwZSk7CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHJlc29sdmVUb0JvdW5kKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZUltcGwpIHsKKyAgICAgIHZhciBlbGVtZW50ID0gdHlwZS5lbGVtZW50OworCisgICAgICB2YXIgYm91bmQgPSBlbGVtZW50LmJvdW5kOworICAgICAgaWYgKGJvdW5kID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQcm92aWRlci5vYmplY3RUeXBlOworICAgICAgfQorCisgICAgICBOdWxsYWJpbGl0eVN1ZmZpeCBudWxsYWJpbGl0eVN1ZmZpeCA9IHR5cGUubnVsbGFiaWxpdHlTdWZmaXg7CisgICAgICBOdWxsYWJpbGl0eVN1ZmZpeCBuZXdOdWxsYWJpbGl0eVN1ZmZpeDsKKyAgICAgIGlmIChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbiB8fAorICAgICAgICAgIGJvdW5kLm51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uKSB7CisgICAgICAgIG5ld051bGxhYmlsaXR5U3VmZml4ID0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb247CisgICAgICB9IGVsc2UgaWYgKG51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIgfHwKKyAgICAgICAgICBib3VuZC5udWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7CisgICAgICAgIG5ld051bGxhYmlsaXR5U3VmZml4ID0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld051bGxhYmlsaXR5U3VmZml4ID0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZTsKKyAgICAgIH0KKworICAgICAgdmFyIHJlc29sdmVkID0gcmVzb2x2ZVRvQm91bmQoYm91bmQpIGFzIFR5cGVJbXBsOworICAgICAgcmV0dXJuIHJlc29sdmVkLndpdGhOdWxsYWJpbGl0eShuZXdOdWxsYWJpbGl0eVN1ZmZpeCk7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICAvLy8gVHJpZXMgdG8gcHJvbW90ZSBmcm9tIHRoZSBmaXJzdCB0eXBlIGZyb20gdGhlIHNlY29uZCB0eXBlLCBhbmQgcmV0dXJucyB0aGUKKyAgLy8vIHByb21vdGVkIHR5cGUgaWYgaXQgc3VjY2VlZHMsIG90aGVyd2lzZSBudWxsLgorICBEYXJ0VHlwZSB0cnlQcm9tb3RlVG9UeXBlKERhcnRUeXBlIHRvLCBEYXJ0VHlwZSBmcm9tKTsKKworICAvLy8gR2l2ZW4gYSBbRGFydFR5cGVdIHR5cGUsIHJldHVybiB0aGUgW1R5cGVQYXJhbWV0ZXJFbGVtZW50XXMgY29ycmVzcG9uZGluZworICAvLy8gdG8gaXRzIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkuCisgIC8vLworICAvLy8gQHBhcmFtIHR5cGUgdGhlIHR5cGUgd2hvc2UgdHlwZSBhcmd1bWVudHMgYXJlIHRvIGJlIHJldHVybmVkCisgIC8vLyBAcmV0dXJuIHRoZSB0eXBlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHR5cGUKKyAgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZUZvcm1hbHNBc0VsZW1lbnRzKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKKyAgICAgIHJldHVybiB0eXBlLnR5cGVGb3JtYWxzOworICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CisgICAgICByZXR1cm4gdHlwZS5lbGVtZW50LnR5cGVQYXJhbWV0ZXJzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY29uc3QgPFR5cGVQYXJhbWV0ZXJFbGVtZW50PltdOworICAgIH0KKyAgfQorCisgIC8vLyBTdGFydGluZyBmcm9tIHRoZSBnaXZlbiBbdHlwZV0sIHNlYXJjaCBpdHMgY2xhc3MgaGllcmFyY2h5IGZvciB0eXBlcyBvZgorICAvLy8gdGhlIGZvcm0gRnV0dXJlPFI+LCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGUgcmVzdWx0aW5nIFIncy4KKyAgTGlzdDxEYXJ0VHlwZT4gX3NlYXJjaFR5cGVIaWVyYXJjaHlGb3JGdXR1cmVUeXBlUGFyYW1ldGVycyhEYXJ0VHlwZSB0eXBlKSB7CisgICAgTGlzdDxEYXJ0VHlwZT4gcmVzdWx0ID0gPERhcnRUeXBlPltdOworICAgIEhhc2hTZXQ8Q2xhc3NFbGVtZW50PiB2aXNpdGVkQ2xhc3NlcyA9IEhhc2hTZXQ8Q2xhc3NFbGVtZW50PigpOworICAgIHZvaWQgcmVjdXJzZShJbnRlcmZhY2VUeXBlSW1wbCB0eXBlKSB7CisgICAgICBpZiAodHlwZS5pc0RhcnRBc3luY0Z1dHVyZSAmJiB0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eSkgeworICAgICAgICByZXN1bHQuYWRkKHR5cGUudHlwZUFyZ3VtZW50c1swXSk7CisgICAgICB9CisgICAgICBpZiAodmlzaXRlZENsYXNzZXMuYWRkKHR5cGUuZWxlbWVudCkpIHsKKyAgICAgICAgaWYgKHR5cGUuc3VwZXJjbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgcmVjdXJzZSh0eXBlLnN1cGVyY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2UgaW4gdHlwZS5pbnRlcmZhY2VzKSB7CisgICAgICAgICAgcmVjdXJzZShpbnRlcmZhY2UpOworICAgICAgICB9CisgICAgICAgIHZpc2l0ZWRDbGFzc2VzLnJlbW92ZSh0eXBlLmVsZW1lbnQpOworICAgICAgfQorICAgIH0KKworICAgIHJlY3Vyc2UodHlwZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gVGhlIFtwdWJsaWMuVHlwZVN5c3RlbV0gaW1wbGVtZW50YXRpb24uCitjbGFzcyBUeXBlU3lzdGVtSW1wbCBleHRlbmRzIFR5cGVTeXN0ZW0geworICAvLy8gRmFsc2UgaWYgaW1wbGljaXQgY2FzdHMgc2hvdWxkIGFsd2F5cyBiZSBkaXNhbGxvd2VkLgorICAvLy8KKyAgLy8vIFRoaXMgYWZmZWN0cyB0aGUgYmVoYXZpb3Igb2YgW2lzQXNzaWduYWJsZVRvXS4KKyAgYm9vbCBpbXBsaWNpdENhc3RzOworCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGluZmVyZW5jZSBmYWlsdXJlcyBhcmUgYWxsb3dlZCwgb2ZmIGJ5IGRlZmF1bHQuCisgIC8vLworICAvLy8gVGhpcyBvcHRpb24gaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgYm9vbCBzdHJpY3RJbmZlcmVuY2U7CisKKyAgQG92ZXJyaWRlCisgIGZpbmFsIFR5cGVQcm92aWRlciB0eXBlUHJvdmlkZXI7CisKKyAgLy8vIFRoZSBjYWNoZWQgaW5zdGFuY2Ugb2YgYE9iamVjdD9gLgorICBJbnRlcmZhY2VUeXBlSW1wbCBfb2JqZWN0UXVlc3Rpb247CisKKyAgLy8vIFRoZSBjYWNoZWQgaW5zdGFuY2Ugb2YgYE9iamVjdCpgLgorICBJbnRlcmZhY2VUeXBlSW1wbCBfb2JqZWN0U3RhcjsKKworICAvLy8gVGhlIGNhY2hlZCBpbnN0YW5jZSBvZiBgT2JqZWN0IWAuCisgIEludGVyZmFjZVR5cGVJbXBsIF9vYmplY3ROb25lOworCisgIC8vLyBUaGUgY2FjaGVkIGluc3RhbmNlIG9mIGBOdWxsIWAuCisgIEludGVyZmFjZVR5cGVJbXBsIF9udWxsTm9uZTsKKworICBHcmVhdGVzdExvd2VyQm91bmRIZWxwZXIgX2dyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlcjsKKyAgTGVhc3RVcHBlckJvdW5kSGVscGVyIF9sZWFzdFVwcGVyQm91bmRIZWxwZXI7CisKKyAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3VidHlwaW5nIHJlbGF0aW9uLgorICBTdWJ0eXBlSGVscGVyIF9zdWJ0eXBlSGVscGVyOworCisgIFR5cGVTeXN0ZW1JbXBsKHsKKyAgICBAcmVxdWlyZWQgdGhpcy5pbXBsaWNpdENhc3RzLAorICAgIEByZXF1aXJlZCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQsCisgICAgQHJlcXVpcmVkIHRoaXMuc3RyaWN0SW5mZXJlbmNlLAorICAgIEByZXF1aXJlZCB0aGlzLnR5cGVQcm92aWRlciwKKyAgfSkgOiBzdXBlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0OiBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgX2dyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlciA9IEdyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlcih0aGlzKTsKKyAgICBfbGVhc3RVcHBlckJvdW5kSGVscGVyID0gTGVhc3RVcHBlckJvdW5kSGVscGVyKHRoaXMpOworICAgIF9zdWJ0eXBlSGVscGVyID0gU3VidHlwZUhlbHBlcih0aGlzKTsKKyAgfQorCisgIEludGVyZmFjZVR5cGVJbXBsIGdldCBudWxsTm9uZSA9PgorICAgICAgX251bGxOb25lID8/PSAodHlwZVByb3ZpZGVyLm51bGxUeXBlIGFzIFR5cGVJbXBsKQorICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisKKyAgSW50ZXJmYWNlVHlwZUltcGwgZ2V0IG9iamVjdE5vbmUgPT4KKyAgICAgIF9vYmplY3ROb25lID8/PSAodHlwZVByb3ZpZGVyLm9iamVjdFR5cGUgYXMgVHlwZUltcGwpCisgICAgICAgICAgLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKworICBJbnRlcmZhY2VUeXBlSW1wbCBnZXQgb2JqZWN0UXVlc3Rpb24gPT4KKyAgICAgIF9vYmplY3RRdWVzdGlvbiA/Pz0gKHR5cGVQcm92aWRlci5vYmplY3RUeXBlIGFzIFR5cGVJbXBsKQorICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pOworCisgIEludGVyZmFjZVR5cGVJbXBsIGdldCBvYmplY3RTdGFyID0+CisgICAgICBfb2JqZWN0U3RhciA/Pz0gKHR5cGVQcm92aWRlci5vYmplY3RUeXBlIGFzIFR5cGVJbXBsKQorICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXguc3Rhcik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHR5cGUgW3RdIGFjY2VwdHMgZnVuY3Rpb24gdHlwZXMsIGFuZCByZXF1aXJlcyBhbgorICAvLy8gaW1wbGljaXQgY29lcmNpb24gaWYgaW50ZXJmYWNlIHR5cGVzIHdpdGggYSBgY2FsbGAgbWV0aG9kIGFyZSBwYXNzZWQgaW4uCisgIC8vLworICAvLy8gVGhpcyBpcyB0cnVlIGZvcjoKKyAgLy8vIC0gYWxsIGZ1bmN0aW9uIHR5cGVzCisgIC8vLyAtIHRoZSBzcGVjaWFsIHR5cGUgYEZ1bmN0aW9uYCB0aGF0IGlzIGEgc3VwZXJ0eXBlIG9mIGFsbCBmdW5jdGlvbiB0eXBlcworICAvLy8gLSBgRnV0dXJlT3I8VD5gIHdoZXJlIFQgaXMgb25lIG9mIHRoZSB0d28gY2FzZXMgYWJvdmUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyBmYWxzZSBpZiBbdF0gaXMgYSB0b3AgdHlwZSBzdWNoIGFzIE9iamVjdC4KKyAgYm9vbCBhY2NlcHRzRnVuY3Rpb25UeXBlKERhcnRUeXBlIHQpIHsKKyAgICBpZiAodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKHQuaXNEYXJ0QXN5bmNGdXR1cmVPcikgeworICAgICAgcmV0dXJuIGFjY2VwdHNGdW5jdGlvblR5cGUoKHQgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXSk7CisgICAgfQorICAgIHJldHVybiB0IGlzIEZ1bmN0aW9uVHlwZSB8fCB0LmlzRGFydENvcmVGdW5jdGlvbjsKKyAgfQorCisgIGJvb2wgYW55UGFyYW1ldGVyVHlwZShGdW5jdGlvblR5cGUgZnQsIGJvb2wgRnVuY3Rpb24oRGFydFR5cGUgdCkgcHJlZGljYXRlKSB7CisgICAgcmV0dXJuIGZ0LnBhcmFtZXRlcnMuYW55KChwKSA9PiBwcmVkaWNhdGUocC50eXBlKSk7CisgIH0KKworICAvLy8gRWxpbWluYXRlcyB0eXBlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb250ZXh0IFt0eXBlXSwgcmVwbGFjaW5nIHRoZW0gd2l0aAorICAvLy8gYE51bGxgIG9yIGBPYmplY3RgIGFzIGFwcHJvcHJpYXRlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlIGluIGBMaXN0PFQ+IGxpc3QgPSBjb25zdCBbXWAsIHRoZSBjb250ZXh0IHR5cGUgZm9yIGluZmVycmluZworICAvLy8gdGhlIGxpc3Qgc2hvdWxkIGJlIGNoYW5nZWQgZnJvbSBgTGlzdDxUPmAgdG8gYExpc3Q8TnVsbD5gIHNvIHRoZSBjb25zdGFudAorICAvLy8gZG9lc24ndCBkZXBlbmQgb24gdGhlIHR5cGUgdmFyaWFibGVzIGBUYCAoYmVjYXVzZSBpdCBjYW4ndCBiZQorICAvLy8gY2Fub25pY2FsaXplZCBhdCBjb21waWxlIHRpbWUsIGFzIGBUYCBpcyB1bmtub3duKS4KKyAgLy8vCisgIC8vLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIHRoZSAibGVhc3QgY2xvc3VyZSIsIGV4Y2VwdCBpbnN0ZWFkIG9mCisgIC8vLyBlbGltaW5hdGluZyBgX2AgKFtVbmtub3duSW5mZXJyZWRUeXBlXSkgaXQgZWxpbWluYXRlcyBhbGwgdHlwZSB2YXJpYWJsZXMKKyAgLy8vIChbVHlwZVBhcmFtZXRlclR5cGVdKS4KKyAgLy8vCisgIC8vLyBUaGUgZXF1aXZhbGVudCBDRkUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIGBUeXBlVmFyaWFibGVFbGltaW5hdG9yYAorICAvLy8gY2xhc3MuCisgIERhcnRUeXBlIGVsaW1pbmF0ZVR5cGVWYXJpYWJsZXMoRGFydFR5cGUgdHlwZSkgeworICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICByZXR1cm4gX1R5cGVWYXJpYWJsZUVsaW1pbmF0b3IoCisgICAgICAgIG9iamVjdFF1ZXN0aW9uLAorICAgICAgICBOZXZlclR5cGVJbXBsLmluc3RhbmNlLAorICAgICAgKS5zdWJzdGl0dXRlVHlwZSh0eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIF9UeXBlVmFyaWFibGVFbGltaW5hdG9yKAorICAgICAgICBvYmplY3ROb25lLAorICAgICAgICB0eXBlUHJvdmlkZXIubnVsbFR5cGUsCisgICAgICApLnN1YnN0aXR1dGVUeXBlKHR5cGUpOworICAgIH0KKyAgfQorCisgIC8vLyBEZWZpbmVzIHRoZSAicmVtYWluZGVyIiBvZiBgVGAgd2hlbiBgU2AgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCisgIC8vLyBjb25zaWRlcmF0aW9uIGJ5IGFuIGluc3RhbmNlIGNoZWNrLiAgVGhpcyBvcGVyYXRpb24gaXMgdXNlZCBmb3IgdHlwZQorICAvLy8gcHJvbW90aW9uIGR1cmluZyBmbG93IGFuYWx5c2lzLgorICBEYXJ0VHlwZSBmYWN0b3IoRGFydFR5cGUgVCwgRGFydFR5cGUgUykgeworICAgIC8vICogSWYgVCA8OiBTIHRoZW4gTmV2ZXIKKyAgICBpZiAoaXNTdWJ0eXBlT2YyKFQsIFMpKSB7CisgICAgICByZXR1cm4gTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZTsKKyAgICB9CisKKyAgICB2YXIgVF9udWxsYWJpbGl0eSA9IFQubnVsbGFiaWxpdHlTdWZmaXg7CisKKyAgICAvLyAqIEVsc2UgaWYgVCBpcyBSPyBhbmQgTnVsbCA8OiBTIHRoZW4gZmFjdG9yKFIsIFMpCisgICAgLy8gKiBFbHNlIGlmIFQgaXMgUj8gdGhlbiBmYWN0b3IoUiwgUyk/CisgICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHZhciBSID0gKFQgYXMgVHlwZUltcGwpLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIHZhciBmYWN0b3JfUlMgPSBmYWN0b3IoUiwgUykgYXMgVHlwZUltcGw7CisgICAgICBpZiAoaXNTdWJ0eXBlT2YyKG51bGxOb25lLCBTKSkgeworICAgICAgICByZXR1cm4gZmFjdG9yX1JTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcl9SUy53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pOworICAgICAgfQorICAgIH0KKworICAgIC8vICogRWxzZSBpZiBUIGlzIFIqIGFuZCBOdWxsIDw6IFMgdGhlbiBmYWN0b3IoUiwgUykKKyAgICAvLyAqIEVsc2UgaWYgVCBpcyBSKiB0aGVuIGZhY3RvcihSLCBTKSoKKyAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7CisgICAgICB2YXIgUiA9IChUIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICB2YXIgZmFjdG9yX1JTID0gZmFjdG9yKFIsIFMpIGFzIFR5cGVJbXBsOworICAgICAgaWYgKGlzU3VidHlwZU9mMihudWxsTm9uZSwgUykpIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcl9SUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWN0b3JfUlMud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4LnN0YXIpOworICAgICAgfQorICAgIH0KKworICAgIC8vICogRWxzZSBpZiBUIGlzIEZ1dHVyZU9yPFI+IGFuZCBGdXR1cmU8Uj4gPDogUyB0aGVuIGZhY3RvcihSLCBTKQorICAgIC8vICogRWxzZSBpZiBUIGlzIEZ1dHVyZU9yPFI+IGFuZCBSIDw6IFMgdGhlbiBmYWN0b3IoRnV0dXJlPFI+LCBTKQorICAgIGlmIChUIGlzIEludGVyZmFjZVR5cGUgJiYgVC5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7CisgICAgICB2YXIgUiA9IFQudHlwZUFyZ3VtZW50c1swXTsKKyAgICAgIHZhciBmdXR1cmVfUiA9IHR5cGVQcm92aWRlci5mdXR1cmVUeXBlMihSKTsKKyAgICAgIGlmIChpc1N1YnR5cGVPZjIoZnV0dXJlX1IsIFMpKSB7CisgICAgICAgIHJldHVybiBmYWN0b3IoUiwgUyk7CisgICAgICB9CisgICAgICBpZiAoaXNTdWJ0eXBlT2YyKFIsIFMpKSB7CisgICAgICAgIHJldHVybiBmYWN0b3IoZnV0dXJlX1IsIFMpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUOworICB9CisKKyAgLy8vIENvbXB1dGUgImZ1dHVyZSB2YWx1ZSB0eXBlIiBvZiBbVF0uCisgIC8vLworICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS8KKyAgLy8vIFNlZSBgbm5iZC9mZWF0dXJlLXNwZWNpZmljYXRpb24ubWRgCisgIC8vLyBTZWUgYCN0aGUtZnV0dXJlLXZhbHVlLXR5cGUtb2YtYW4tYXN5bmNocm9ub3VzLW5vbi1nZW5lcmF0b3ItZnVuY3Rpb25gCisgIERhcnRUeXBlIGZ1dHVyZVZhbHVlVHlwZShEYXJ0VHlwZSBUKSB7CisgICAgLy8gZnV0dXJlVmFsdWVUeXBlKGBTP2ApID0gZnV0dXJlVmFsdWVUeXBlKGBTYCksIGZvciBhbGwgYFNgLgorICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShgUypgKSA9IGZ1dHVyZVZhbHVlVHlwZShgU2ApLCBmb3IgYWxsIGBTYC4KKyAgICBpZiAoVC5udWxsYWJpbGl0eVN1ZmZpeCAhPSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKSB7CisgICAgICB2YXIgUyA9IChUIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICByZXR1cm4gZnV0dXJlVmFsdWVUeXBlKFMpOworICAgIH0KKworICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShGdXR1cmU8YFNgPikgPSBgU2AsIGZvciBhbGwgYFNgLgorICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShGdXR1cmVPcjxgU2A+KSA9IGBTYCwgZm9yIGFsbCBgU2AuCisgICAgaWYgKFQgaXMgSW50ZXJmYWNlVHlwZSkgeworICAgICAgaWYgKFQuaXNEYXJ0QXN5bmNGdXR1cmUgfHwgVC5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7CisgICAgICAgIHJldHVybiBULnR5cGVBcmd1bWVudHNbMF07CisgICAgICB9CisgICAgfQorCisgICAgLy8gZnV0dXJlVmFsdWVUeXBlKGBkeW5hbWljYCkgPSBgZHluYW1pY2AuCisgICAgaWYgKGlkZW50aWNhbChULCBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UpKSB7CisgICAgICByZXR1cm4gVDsKKyAgICB9CisKKyAgICAvLyBmdXR1cmVWYWx1ZVR5cGUoYHZvaWRgKSA9IGB2b2lkYC4KKyAgICBpZiAoaWRlbnRpY2FsKFQsIFZvaWRUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiBUOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBgU2AsIGZ1dHVyZVZhbHVlVHlwZShgU2ApID0gYE9iamVjdD9gLgorICAgIHJldHVybiBvYmplY3RRdWVzdGlvbjsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHR5cGUgdCwgaWYgdCBpcyBhbiBpbnRlcmZhY2UgdHlwZSB3aXRoIGEgY2FsbCBtZXRob2QgZGVmaW5lZCwKKyAgLy8vIHJldHVybiB0aGUgZnVuY3Rpb24gdHlwZSBmb3IgdGhlIGNhbGwgbWV0aG9kLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIEZ1bmN0aW9uVHlwZSBnZXRDYWxsTWV0aG9kVHlwZShEYXJ0VHlwZSB0KSB7CisgICAgaWYgKHQgaXMgSW50ZXJmYWNlVHlwZSkgeworICAgICAgcmV0dXJuIHQubG9va1VwTWV0aG9kMignY2FsbCcsIHQuZWxlbWVudC5saWJyYXJ5KT8udHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvLy8gQ29tcHV0ZXMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIG9mIFtUMV0gYW5kIFtUMl0uCisgIERhcnRUeXBlIGdldEdyZWF0ZXN0TG93ZXJCb3VuZChEYXJ0VHlwZSBUMSwgRGFydFR5cGUgVDIpIHsKKyAgICByZXR1cm4gX2dyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlci5nZXRHcmVhdGVzdExvd2VyQm91bmQoVDEsIFQyKTsKKyAgfQorCisgIC8vLyBDb21wdXRlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0d28gdHlwZXMuCisgIC8vLworICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZQorICAvLy8gU2VlIGByZXNvdXJjZXMvdHlwZS1zeXN0ZW0vdXBwZXItbG93ZXItYm91bmRzLm1kYAorICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgZ2V0TGVhc3RVcHBlckJvdW5kKERhcnRUeXBlIFQxLCBEYXJ0VHlwZSBUMikgeworICAgIHJldHVybiBfbGVhc3RVcHBlckJvdW5kSGVscGVyLmdldExlYXN0VXBwZXJCb3VuZChUMSwgVDIpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YgdGhlIGdpdmVuIHR5cGUgW3NjaGVtYV0gd2l0aCByZXNwZWN0IHRvCisgIC8vLyBgX2AuCisgIC8vLworICAvLy8gVGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBgUGAgd2l0aCByZXNwZWN0IHRvIGBfYCBpcyBkZWZpbmVkCisgIC8vLyBhcyBgUGAgd2l0aCBldmVyeSBjb3ZhcmlhbnQgb2NjdXJyZW5jZSBvZiBgX2AgcmVwbGFjZWQgd2l0aCBgTnVsbGAsIGFuZAorICAvLy8gZXZlcnkgY29udHJhdmFyaWFudCBvY2N1cnJlbmNlIG9mIGBfYCByZXBsYWNlZCB3aXRoIGBPYmplY3RgLgorICAvLy8KKyAgLy8vIElmIHRoZSBzY2hlbWEgY29udGFpbnMgbm8gaW5zdGFuY2VzIG9mIGBfYCwgdGhlIG9yaWdpbmFsIHNjaGVtYSBvYmplY3QgaXMKKyAgLy8vIHJldHVybmVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYSBwcm9wZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGdyZWF0ZXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhbHdheXMgYSBzdXBlcnR5cGUgb2YKKyAgLy8vIGFueSB0eXBlIHdoaWNoIG1hdGNoZXMgdGhlIHNjaGVtYS4KKyAgRGFydFR5cGUgZ3JlYXRlc3RDbG9zdXJlKERhcnRUeXBlIHNjaGVtYSkgeworICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICByZXR1cm4gVHlwZVNjaGVtYUVsaW1pbmF0aW9uVmlzaXRvci5ydW4oCisgICAgICAgIHRvcFR5cGU6IG9iamVjdFF1ZXN0aW9uLAorICAgICAgICBib3R0b21UeXBlOiBOZXZlclR5cGVJbXBsLmluc3RhbmNlLAorICAgICAgICBpc0xlYXN0Q2xvc3VyZTogZmFsc2UsCisgICAgICAgIHNjaGVtYTogc2NoZW1hLAorICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAorICAgICAgICB0b3BUeXBlOiBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UsCisgICAgICAgIGJvdHRvbVR5cGU6IHR5cGVQcm92aWRlci5udWxsVHlwZSwKKyAgICAgICAgaXNMZWFzdENsb3N1cmU6IGZhbHNlLAorICAgICAgICBzY2hlbWE6IHNjaGVtYSwKKyAgICAgICk7CisgICAgfQorICB9CisKKyAgLy8vIEdpdmVuIGEgZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGBGPFQwLCBUMSwgLi4uIFRuPmAgYW5kIGEgY29udGV4dCB0eXBlIEMsCisgIC8vLyBpbmZlciBhbiBpbnN0YW50aWF0aW9uIG9mIEYsIHN1Y2ggdGhhdCBgRjxTMCwgUzEsIC4uLiwgU24+YCA8OiBDLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgc2ltaWxhciB0byBbaW5mZXJHZW5lcmljRnVuY3Rpb25PclR5cGVdLCBidXQgdGhlIHJldHVybiB0eXBlIGlzCisgIC8vLyBhbHNvIGNvbnNpZGVyZWQgYXMgcGFydCBvZiB0aGUgc29sdXRpb24uCisgIC8vLworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhIFtjb250ZXh0VHlwZV0gdGhhdCBpcyBhbHNvCisgIC8vLyB1bmluc3RhbnRpYXRlZCwgb3IgYSBbZm5UeXBlXSB0aGF0IGlzIGFscmVhZHkgaW5zdGFudGlhdGVkLCBpdCB3aWxsIGhhdmUKKyAgLy8vIG5vIGVmZmVjdCBhbmQgcmV0dXJuIGBudWxsYC4KKyAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJGdW5jdGlvblR5cGVJbnN0YW50aWF0aW9uKAorICAgICAgRnVuY3Rpb25UeXBlIGNvbnRleHRUeXBlLCBGdW5jdGlvblR5cGUgZm5UeXBlLAorICAgICAge0Vycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwgQXN0Tm9kZSBlcnJvck5vZGV9KSB7CisgICAgaWYgKGNvbnRleHRUeXBlLnR5cGVGb3JtYWxzLmlzTm90RW1wdHkgfHwgZm5UeXBlLnR5cGVGb3JtYWxzLmlzRW1wdHkpIHsKKyAgICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgVHlwZVN5c3RlbSB0aGF0IHdpbGwgYWxsb3cgY2VydGFpbiB0eXBlIHBhcmFtZXRlcnMgdG8gYmUKKyAgICAvLyBpbmZlcnJlZC4gSXQgd2lsbCBvcHRpbWlzdGljYWxseSBhc3N1bWUgdGhlc2UgdHlwZSBwYXJhbWV0ZXJzIGNhbiBiZQorICAgIC8vIHN1YnR5cGVzIChvciBzdXBlcnR5cGVzKSBhcyBuZWNlc3NhcnksIGFuZCB0cmFjayB0aGUgY29uc3RyYWludHMgdGhhdAorICAgIC8vIGFyZSBpbXBsaWVkIGJ5IHRoaXMuCisgICAgdmFyIGluZmVycmVyID0gR2VuZXJpY0luZmVycmVyKHRoaXMsIGZuVHlwZS50eXBlRm9ybWFscyk7CisgICAgaW5mZXJyZXIuY29uc3RyYWluR2VuZXJpY0Z1bmN0aW9uSW5Db250ZXh0KGZuVHlwZSwgY29udGV4dFR5cGUpOworCisgICAgLy8gSW5mZXIgYW5kIGluc3RhbnRpYXRlIHRoZSByZXN1bHRpbmcgdHlwZS4KKyAgICByZXR1cm4gaW5mZXJyZXIuaW5mZXIoCisgICAgICBmblR5cGUudHlwZUZvcm1hbHMsCisgICAgICBlcnJvclJlcG9ydGVyOiBlcnJvclJlcG9ydGVyLAorICAgICAgZXJyb3JOb2RlOiBlcnJvck5vZGUsCisgICAgKTsKKyAgfQorCisgIC8vLyBJbmZlcnMgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyB0eXBlLCBmdW5jdGlvbiwgbWV0aG9kLCBvcgorICAvLy8gbGlzdC9tYXAgbGl0ZXJhbCwgdXNpbmcgdGhlIGRvd253YXJkIGNvbnRleHQgdHlwZSBhcyB3ZWxsIGFzIHRoZQorICAvLy8gYXJndW1lbnQgdHlwZXMgaWYgYXZhaWxhYmxlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhIGZ1bmN0aW9uIHR5cGUgd2l0aCBnZW5lcmljIHR5cGUgcGFyYW1ldGVycywgdGhpcworICAvLy8gaW5mZXJzIHRoZSB0eXBlIHBhcmFtZXRlcnMgZnJvbSB0aGUgYWN0dWFsIGFyZ3VtZW50IHR5cGVzLCBhbmQgcmV0dXJucyB0aGUKKyAgLy8vIGluc3RhbnRpYXRlZCBmdW5jdGlvbiB0eXBlLgorICAvLy8KKyAgLy8vIENvbmNyZXRlbHksIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSB3aXRoIHBhcmFtZXRlciB0eXBlcyBQMCwgUDEsIC4uLiBQbiwKKyAgLy8vIHJlc3VsdCB0eXBlIFIsIGFuZCBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyBUMCwgVDEsIC4uLiBUbSwgdXNlIHRoZQorICAvLy8gYXJndW1lbnQgdHlwZXMgQTAsIEExLCAuLi4gQW4gdG8gc29sdmUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gRm9yIGVhY2ggcGFyYW1ldGVyIFBpLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IEFpIDw6IFBpLiBXZSBjYW4gZG8gdGhpcyBieQorICAvLy8gcnVubmluZyB0aGUgc3VidHlwZSBhbGdvcml0aG0sIGFuZCB3aGVuIHdlIHJlYWNoIGEgdHlwZSBwYXJhbWV0ZXIgVGosCisgIC8vLyByZWNvcmRpbmcgdGhlIGxvd2VyIG9yIHVwcGVyIGJvdW5kIGl0IG11c3Qgc2F0aXNmeS4gQXQgdGhlIGVuZCwgYWxsCisgIC8vLyBjb25zdHJhaW50cyBjYW4gYmUgY29tYmluZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlLgorICAvLy8KKyAgLy8vIEFsbCBjb25zdHJhaW50cyBvbiBlYWNoIHR5cGUgcGFyYW1ldGVyIFRqIGFyZSB0cmFja2VkLCBhcyB3ZWxsIGFzIHdoZXJlCisgIC8vLyB0aGV5IG9yaWdpbmF0ZWQsIHNvIHdlIGNhbiBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIHRyYWNpbmcgYmFjayB0byB0aGUKKyAgLy8vIGFyZ3VtZW50IHZhbHVlcywgdHlwZSBwYXJhbWV0ZXIgImV4dGVuZHMiIGNsYXVzZSwgb3IgdGhlIHJldHVybiB0eXBlCisgIC8vLyBjb250ZXh0LgorICBMaXN0PERhcnRUeXBlPiBpbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSh7CisgICAgQ2xhc3NFbGVtZW50IGdlbmVyaWNDbGFzcywKKyAgICBAcmVxdWlyZWQgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZVBhcmFtZXRlcnMsCisgICAgQHJlcXVpcmVkIExpc3Q8UGFyYW1ldGVyRWxlbWVudD4gcGFyYW1ldGVycywKKyAgICBAcmVxdWlyZWQgRGFydFR5cGUgZGVjbGFyZWRSZXR1cm5UeXBlLAorICAgIEByZXF1aXJlZCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudFR5cGVzLAorICAgIEByZXF1aXJlZCBEYXJ0VHlwZSBjb250ZXh0UmV0dXJuVHlwZSwKKyAgICBFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIsCisgICAgQXN0Tm9kZSBlcnJvck5vZGUsCisgICAgYm9vbCBkb3dud2FyZHMgPSBmYWxzZSwKKyAgICBib29sIGlzQ29uc3QgPSBmYWxzZSwKKyAgfSkgeworICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBUeXBlU3lzdGVtIHRoYXQgd2lsbCBhbGxvdyBjZXJ0YWluIHR5cGUgcGFyYW1ldGVycyB0byBiZQorICAgIC8vIGluZmVycmVkLiBJdCB3aWxsIG9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGVzZSB0eXBlIHBhcmFtZXRlcnMgY2FuIGJlCisgICAgLy8gc3VidHlwZXMgKG9yIHN1cGVydHlwZXMpIGFzIG5lY2Vzc2FyeSwgYW5kIHRyYWNrIHRoZSBjb25zdHJhaW50cyB0aGF0CisgICAgLy8gYXJlIGltcGxpZWQgYnkgdGhpcy4KKyAgICB2YXIgaW5mZXJyZXIgPSBHZW5lcmljSW5mZXJyZXIodGhpcywgdHlwZVBhcmFtZXRlcnMpOworCisgICAgaWYgKGNvbnRleHRSZXR1cm5UeXBlICE9IG51bGwpIHsKKyAgICAgIGlmIChpc0NvbnN0KSB7CisgICAgICAgIGNvbnRleHRSZXR1cm5UeXBlID0gZWxpbWluYXRlVHlwZVZhcmlhYmxlcyhjb250ZXh0UmV0dXJuVHlwZSk7CisgICAgICB9CisgICAgICBpbmZlcnJlci5jb25zdHJhaW5SZXR1cm5UeXBlKGRlY2xhcmVkUmV0dXJuVHlwZSwgY29udGV4dFJldHVyblR5cGUpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgLy8gVHJ5IHRvIHBhc3MgZWFjaCBhcmd1bWVudCB0byBlYWNoIHBhcmFtZXRlciwgcmVjb3JkaW5nIGFueSB0eXBlCisgICAgICAvLyBwYXJhbWV0ZXIgYm91bmRzIHRoYXQgd2VyZSBpbXBsaWVkIGJ5IHRoaXMgYXNzaWdubWVudC4KKyAgICAgIGluZmVycmVyLmNvbnN0cmFpbkFyZ3VtZW50KAorICAgICAgICBhcmd1bWVudFR5cGVzW2ldLAorICAgICAgICBwYXJhbWV0ZXJzW2ldLnR5cGUsCisgICAgICAgIHBhcmFtZXRlcnNbaV0ubmFtZSwKKyAgICAgICAgZ2VuZXJpY0NsYXNzOiBnZW5lcmljQ2xhc3MsCisgICAgICApOworICAgIH0KKworICAgIHJldHVybiBpbmZlcnJlci5pbmZlcigKKyAgICAgIHR5cGVQYXJhbWV0ZXJzLAorICAgICAgZXJyb3JSZXBvcnRlcjogZXJyb3JSZXBvcnRlciwKKyAgICAgIGVycm9yTm9kZTogZXJyb3JOb2RlLAorICAgICAgZG93bndhcmRzSW5mZXJQaGFzZTogZG93bndhcmRzLAorICAgICk7CisgIH0KKworICAvLy8gR2l2ZW4gYSBbRGFydFR5cGVdIFt0eXBlXSwgaWYgW3R5cGVdIGlzIGFuIHVuaW5zdGFudGlhdGVkCisgIC8vLyBwYXJhbWV0ZXJpemVkIHR5cGUgdGhlbiBpbnN0YW50aWF0ZSB0aGUgcGFyYW1ldGVycyB0byB0aGVpcgorICAvLy8gYm91bmRzLiBTZWUgdGhlIGlzc3VlIGZvciB0aGUgYWxnb3JpdGhtIGRlc2NyaXB0aW9uLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yNzUyNiNpc3N1ZWNvbW1lbnQtMjYwMDIxMzk3CisgIC8vIFRPRE8oc2NoZWdsb3YpIE1vdmUgdGhpcyBtZXRob2QgdG8gZWxlbWVudHMgZm9yIGNsYXNzZXMsIHR5cGVkZWZzLAorICAvLyAgYW5kIGdlbmVyaWMgZnVuY3Rpb25zOyBjb21wdXRlIGxhemlseSBhbmQgY2FjaGUuCisgIEBvdmVycmlkZQorICBEYXJ0VHlwZSBpbnN0YW50aWF0ZVRvQm91bmRzKERhcnRUeXBlIHR5cGUsCisgICAgICB7TGlzdDxib29sPiBoYXNFcnJvciwgTWFwPFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBEYXJ0VHlwZT4ga25vd25UeXBlc30pIHsKKyAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiB0eXBlRm9ybWFscyA9IHR5cGVGb3JtYWxzQXNFbGVtZW50cyh0eXBlKTsKKyAgICBMaXN0PERhcnRUeXBlPiBhcmd1bWVudHMgPSBpbnN0YW50aWF0ZVR5cGVGb3JtYWxzVG9Cb3VuZHModHlwZUZvcm1hbHMsCisgICAgICAgIGhhc0Vycm9yOiBoYXNFcnJvciwga25vd25UeXBlczoga25vd25UeXBlcyk7CisgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICByZXR1cm4gaW5zdGFudGlhdGVUeXBlKHR5cGUsIGFyZ3VtZW50cyk7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgaW5zdGFudGlhdGVUb0JvdW5kczIoeworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnQsCisgICAgRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50IGZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCwKKyAgICBAcmVxdWlyZWQgTnVsbGFiaWxpdHlTdWZmaXggbnVsbGFiaWxpdHlTdWZmaXgsCisgIH0pIHsKKyAgICBpZiAoY2xhc3NFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IGNsYXNzRWxlbWVudC50eXBlUGFyYW1ldGVyczsKKyAgICAgIHZhciB0eXBlQXJndW1lbnRzID0gX2RlZmF1bHRUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgIHZhciB0eXBlID0gY2xhc3NFbGVtZW50Lmluc3RhbnRpYXRlKAorICAgICAgICB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzLAorICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogbnVsbGFiaWxpdHlTdWZmaXgsCisgICAgICApOworICAgICAgdHlwZSA9IHRvTGVnYWN5VHlwZSh0eXBlKTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0gZWxzZSBpZiAoZnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgIHZhciB0eXBlUGFyYW1ldGVycyA9IGZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudC50eXBlUGFyYW1ldGVyczsKKyAgICAgIHZhciB0eXBlQXJndW1lbnRzID0gX2RlZmF1bHRUeXBlQXJndW1lbnRzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgIHZhciB0eXBlID0gZnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50Lmluc3RhbnRpYXRlKAorICAgICAgICB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzLAorICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogbnVsbGFiaWxpdHlTdWZmaXgsCisgICAgICApOworICAgICAgdHlwZSA9IHRvTGVnYWN5VHlwZSh0eXBlKTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCdNaXNzaW5nIGVsZW1lbnQnKTsKKyAgICB9CisgIH0KKworICAvLy8gR2l2ZW4gdW5pbnN0YW50aWF0ZWQgW3R5cGVGb3JtYWxzXSwgaW5zdGFudGlhdGUgdGhlbSB0byB0aGVpciBib3VuZHMuCisgIC8vLyBTZWUgdGhlIGlzc3VlIGZvciB0aGUgYWxnb3JpdGhtIGRlc2NyaXB0aW9uLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yNzUyNiNpc3N1ZWNvbW1lbnQtMjYwMDIxMzk3CisgIEBvdmVycmlkZQorICBMaXN0PERhcnRUeXBlPiBpbnN0YW50aWF0ZVR5cGVGb3JtYWxzVG9Cb3VuZHMoCisgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiB0eXBlRm9ybWFscywKKyAgICAgIHtMaXN0PGJvb2w+IGhhc0Vycm9yLAorICAgICAgTWFwPFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBEYXJ0VHlwZT4ga25vd25UeXBlc30pIHsKKyAgICBpbnQgY291bnQgPSB0eXBlRm9ybWFscy5sZW5ndGg7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107CisgICAgfQorCisgICAgU2V0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBhbGwgPSA8VHlwZVBhcmFtZXRlckVsZW1lbnQ+e307CisgICAgLy8gYWxsIGdyb3VuZAorICAgIE1hcDxUeXBlUGFyYW1ldGVyRWxlbWVudCwgRGFydFR5cGU+IGRlZmF1bHRzID0ga25vd25UeXBlcyA/PyB7fTsKKyAgICAvLyBub3QgZ3JvdW5kCisgICAgTWFwPFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBEYXJ0VHlwZT4gcGFydGlhbHMgPSB7fTsKKworICAgIGZvciAoVHlwZVBhcmFtZXRlckVsZW1lbnQgdHlwZVBhcmFtZXRlciBpbiB0eXBlRm9ybWFscykgeworICAgICAgYWxsLmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgIGlmICghZGVmYXVsdHMuY29udGFpbnNLZXkodHlwZVBhcmFtZXRlcikpIHsKKyAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXIuYm91bmQgPT0gbnVsbCkgeworICAgICAgICAgIGRlZmF1bHRzW3R5cGVQYXJhbWV0ZXJdID0gRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcnRpYWxzW3R5cGVQYXJhbWV0ZXJdID0gdHlwZVBhcmFtZXRlci5ib3VuZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IGdldEZyZWVQYXJhbWV0ZXJzKERhcnRUeXBlIHJvb3RUeXBlKSB7CisgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBwYXJhbWV0ZXJzOworICAgICAgU2V0PERhcnRUeXBlPiB2aXNpdGVkVHlwZXMgPSBIYXNoU2V0PERhcnRUeXBlPigpOworCisgICAgICB2b2lkIGFwcGVuZFBhcmFtZXRlcnMoRGFydFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2aXNpdGVkVHlwZXMuY29udGFpbnModHlwZSkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmlzaXRlZFR5cGVzLmFkZCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKKyAgICAgICAgICB2YXIgZWxlbWVudCA9IHR5cGUuZWxlbWVudDsKKyAgICAgICAgICBpZiAoYWxsLmNvbnRhaW5zKGVsZW1lbnQpKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzID8/PSA8VHlwZVBhcmFtZXRlckVsZW1lbnQ+W107CisgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChlbGVtZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7CisgICAgICAgICAgICBhcHBlbmRQYXJhbWV0ZXJzKHR5cGUucmV0dXJuVHlwZSk7CisgICAgICAgICAgICB0eXBlLnBhcmFtZXRlcnMubWFwKChwKSA9PiBwLnR5cGUpLmZvckVhY2goYXBwZW5kUGFyYW1ldGVycyk7CisgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKKyAgICAgICAgICAgIHR5cGUudHlwZUFyZ3VtZW50cy5mb3JFYWNoKGFwcGVuZFBhcmFtZXRlcnMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhcHBlbmRQYXJhbWV0ZXJzKHJvb3RUeXBlKTsKKyAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIGJvb2wgaGFzUHJvZ3Jlc3MgPSB0cnVlOworICAgIHdoaWxlIChoYXNQcm9ncmVzcykgeworICAgICAgaGFzUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICAgIGZvciAoVHlwZVBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyIGluIHBhcnRpYWxzLmtleXMpIHsKKyAgICAgICAgRGFydFR5cGUgdmFsdWUgPSBwYXJ0aWFsc1twYXJhbWV0ZXJdOworICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBmcmVlUGFyYW1ldGVycyA9IGdldEZyZWVQYXJhbWV0ZXJzKHZhbHVlKTsKKyAgICAgICAgaWYgKGZyZWVQYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICBkZWZhdWx0c1twYXJhbWV0ZXJdID0gdmFsdWU7CisgICAgICAgICAgcGFydGlhbHMucmVtb3ZlKHBhcmFtZXRlcik7CisgICAgICAgICAgaGFzUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGZyZWVQYXJhbWV0ZXJzLmV2ZXJ5KGRlZmF1bHRzLmNvbnRhaW5zS2V5KSkgeworICAgICAgICAgIGRlZmF1bHRzW3BhcmFtZXRlcl0gPQorICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcChkZWZhdWx0cykuc3Vic3RpdHV0ZVR5cGUodmFsdWUpOworICAgICAgICAgIHBhcnRpYWxzLnJlbW92ZShwYXJhbWV0ZXIpOworICAgICAgICAgIGhhc1Byb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIHN0b3BwZWQgbWFraW5nIHByb2dyZXNzLCBhbmQgbm90IGFsbCB0eXBlcyBhcmUgZ3JvdW5kLAorICAgIC8vIHRoZW4gdGhlIHdob2xlIHR5cGUgaXMgbWFsYm91bmRlZCBhbmQgYW4gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgLy8gaWYgZXJyb3JzIGFyZSByZXF1ZXN0ZWQsIGFuZCBhIHBhcnRpYWxseSBjb21wbGV0ZWQgdHlwZSBzaG91bGQKKyAgICAvLyBiZSByZXR1cm5lZC4KKyAgICBpZiAocGFydGlhbHMuaXNOb3RFbXB0eSkgeworICAgICAgaWYgKGhhc0Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgaGFzRXJyb3JbMF0gPSB0cnVlOworICAgICAgfQorICAgICAgdmFyIGRvbWFpbiA9IGRlZmF1bHRzLmtleXMudG9MaXN0KCk7CisgICAgICB2YXIgcmFuZ2UgPSBkZWZhdWx0cy52YWx1ZXMudG9MaXN0KCk7CisgICAgICAvLyBCdWlsZCBhIHN1YnN0aXR1dGlvbiBQaGkgbWFwcGluZyBlYWNoIHVuY29tcGxldGVkIHR5cGUgdmFyaWFibGUgdG8KKyAgICAgIC8vIGR5bmFtaWMsIGFuZCBlYWNoIGNvbXBsZXRlZCB0eXBlIHZhcmlhYmxlIHRvIGl0cyBkZWZhdWx0LgorICAgICAgZm9yIChUeXBlUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIgaW4gcGFydGlhbHMua2V5cykgeworICAgICAgICBkb21haW4uYWRkKHBhcmFtZXRlcik7CisgICAgICAgIHJhbmdlLmFkZChEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UpOworICAgICAgfQorICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGZvciBhbiB1bmNvbXBsZXRlZCB0eXBlIHZhcmlhYmxlIChUIGV4dGVuZHMgQikKKyAgICAgIC8vIHRvIGJlIFBoaShCKQorICAgICAgZm9yIChUeXBlUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIgaW4gcGFydGlhbHMua2V5cykgeworICAgICAgICBkZWZhdWx0c1twYXJhbWV0ZXJdID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycyhkb21haW4sIHJhbmdlKQorICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHBhcnRpYWxzW3BhcmFtZXRlcl0pOworICAgICAgfQorICAgIH0KKworICAgIExpc3Q8RGFydFR5cGU+IG9yZGVyZWRBcmd1bWVudHMgPQorICAgICAgICB0eXBlRm9ybWFscy5tYXAoKHApID0+IGRlZmF1bHRzW3BdKS50b0xpc3QoKTsKKyAgICByZXR1cm4gb3JkZXJlZEFyZ3VtZW50czsKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGlzQXNzaWduYWJsZVRvKERhcnRUeXBlIGZyb21UeXBlLCBEYXJ0VHlwZSB0b1R5cGUpIHsKKyAgICBpZiAoIU51bGxTYWZldHlVbmRlcnN0YW5kaW5nRmxhZy5pc0VuYWJsZWQpIHsKKyAgICAgIGZyb21UeXBlID0gTnVsbGFiaWxpdHlFbGltaW5hdG9yLnBlcmZvcm0odHlwZVByb3ZpZGVyLCBmcm9tVHlwZSk7CisgICAgICB0b1R5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIHRvVHlwZSk7CisgICAgfQorICAgIHJldHVybiBpc0Fzc2lnbmFibGVUbzIoZnJvbVR5cGUsIHRvVHlwZSk7CisgIH0KKworICBib29sIGlzQXNzaWduYWJsZVRvMihEYXJ0VHlwZSBmcm9tVHlwZSwgRGFydFR5cGUgdG9UeXBlKSB7CisgICAgLy8gQW4gYWN0dWFsIHN1YnR5cGUKKyAgICBpZiAoaXNTdWJ0eXBlT2YyKGZyb21UeXBlLCB0b1R5cGUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBIGNhbGwgbWV0aG9kIHRlYXJvZmYKKyAgICBpZiAoZnJvbVR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgorICAgICAgICAhaXNOdWxsYWJsZShmcm9tVHlwZSkgJiYKKyAgICAgICAgYWNjZXB0c0Z1bmN0aW9uVHlwZSh0b1R5cGUpKSB7CisgICAgICB2YXIgY2FsbE1ldGhvZFR5cGUgPSBnZXRDYWxsTWV0aG9kVHlwZShmcm9tVHlwZSk7CisgICAgICBpZiAoY2FsbE1ldGhvZFR5cGUgIT0gbnVsbCAmJiBpc0Fzc2lnbmFibGVUbzIoY2FsbE1ldGhvZFR5cGUsIHRvVHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIC0tbm8taW1wbGljaXQtY2FzdHMgZGlzYWJsZXMgYWxsIGRvd25jYXN0cywgaW5jbHVkaW5nCisgICAgLy8gZHluYW1pYyBjYXN0cy4KKyAgICBpZiAoIWltcGxpY2l0Q2FzdHMpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgaGFuZGxlIE5OQkQgZGVmYXVsdCBiZWhhdmlvciwgd2hlcmUgd2UgZGlzYWJsZSBub24tZHluYW1pYyBkb3duY2FzdHMuCisgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKKyAgICAgIHJldHVybiBmcm9tVHlwZS5pc0R5bmFtaWM7CisgICAgfQorCisgICAgLy8gRG9uJ3QgYWxsb3cgaW1wbGljaXQgZG93bmNhc3RzIGJldHdlZW4gZnVuY3Rpb24gdHlwZXMKKyAgICAvLyBhbmQgY2FsbCBtZXRob2Qgb2JqZWN0cywgYXMgdGhlc2Ugd2lsbCBhbG1vc3QgYWx3YXlzIGZhaWwuCisgICAgaWYgKGZyb21UeXBlIGlzIEZ1bmN0aW9uVHlwZSAmJiBnZXRDYWxsTWV0aG9kVHlwZSh0b1R5cGUpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBhbGxvdyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHdoZXJlIGEgZ2VuZXJpYyBvbmUgaXMgZXhwZWN0ZWQuIFRoZQorICAgIC8vIGZvcm1lciB3b3VsZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZSBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvIGl0LgorICAgIC8vIFRPRE8ocm55c3Ryb20pOiBUaGlzIHNhbWUgY2hlY2sgYWxzbyBleGlzdHMgaW4gRnVuY3Rpb25UeXBlSW1wbC5yZWxhdGUoKQorICAgIC8vIGJ1dCB3ZSBkb24ndCBhbHdheXMgcmVsaWFibHkgZ28gdGhyb3VnaCB0aGF0IGNvZGUgcGF0aC4gVGhpcyBzaG91bGQgYmUKKyAgICAvLyBjbGVhbmVkIHVwIHRvIGF2b2lkIHRoZSByZWR1bmRhbmN5LgorICAgIGlmIChmcm9tVHlwZSBpcyBGdW5jdGlvblR5cGUgJiYKKyAgICAgICAgdG9UeXBlIGlzIEZ1bmN0aW9uVHlwZSAmJgorICAgICAgICBmcm9tVHlwZS50eXBlRm9ybWFscy5pc0VtcHR5ICYmCisgICAgICAgIHRvVHlwZS50eXBlRm9ybWFscy5pc05vdEVtcHR5KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHN1YnR5cGUgcmVsYXRpb24gZ29lcyB0aGUgb3RoZXIgd2F5LCBhbGxvdyB0aGUgaW1wbGljaXQgZG93bmNhc3QuCisgICAgaWYgKGlzU3VidHlwZU9mMih0b1R5cGUsIGZyb21UeXBlKSkgeworICAgICAgLy8gVE9ETyhsZWFmcCxqbWVzc2VybHkpOiB3ZSBlbWl0IHdhcm5pbmdzL2hpbnRzIGZvciB0aGVzZSBpbgorICAgICAgLy8gc3JjL3Rhc2svc3Ryb25nL2NoZWNrZXIuZGFydCwgd2hpY2ggaXMgYSBiaXQgaW5jb25zaXN0ZW50LiBUaGF0CisgICAgICAvLyBjb2RlIHNob3VsZCBiZSBoYW5kbGVkIGludG8gcGxhY2VzIHRoYXQgdXNlIGlzQXNzaWduYWJsZVRvLCBzdWNoIGFzCisgICAgICAvLyBFcnJvclZlcmlmaWVyLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiBgdHJ1ZWAgIGZvciB0aGluZ3MgaW4gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG9mIGBOZXZlcmAuCisgIGJvb2wgaXNCb3R0b20oRGFydFR5cGUgdHlwZSkgeworICAgIC8vIEJPVFRPTShOZXZlcikgaXMgdHJ1ZQorICAgIGlmIChpZGVudGljYWwodHlwZSwgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEJPVFRPTShYJlQpIGlzIHRydWUgaWZmIEJPVFRPTShUKQorICAgIC8vIEJPVFRPTShYIGV4dGVuZHMgVCkgaXMgdHJ1ZSBpZmYgQk9UVE9NKFQpCisgICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGVJbXBsKSB7CisgICAgICB2YXIgVCA9IHR5cGUucHJvbW90ZWRCb3VuZDsKKyAgICAgIGlmIChUICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGlzQm90dG9tKFQpOworICAgICAgfQorCisgICAgICBUID0gdHlwZS5lbGVtZW50LmJvdW5kOworICAgICAgaWYgKFQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gaXNCb3R0b20oVCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQk9UVE9NKFQpIGlzIGZhbHNlIG90aGVyd2lzZQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBEZWZpbmVzIGFuIChhbG1vc3QpIHRvdGFsIG9yZGVyIG9uIGJvdHRvbSBhbmQgYE51bGxgIHR5cGVzLiBUaGlzIGRvZXMgbm90CisgIC8vLyBjdXJyZW50bHkgY29uc2lzdGVudGx5IG9yZGVyIHR3byBkaWZmZXJlbnQgdHlwZSB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZQorICAvLy8gYm91bmQuCisgIGJvb2wgaXNNb3JlQm90dG9tKERhcnRUeXBlIFQsIERhcnRUeXBlIFMpIHsKKyAgICB2YXIgVF9pbXBsID0gVCBhcyBUeXBlSW1wbDsKKyAgICB2YXIgU19pbXBsID0gUyBhcyBUeXBlSW1wbDsKKworICAgIHZhciBUX251bGxhYmlsaXR5ID0gVF9pbXBsLm51bGxhYmlsaXR5U3VmZml4OworICAgIHZhciBTX251bGxhYmlsaXR5ID0gU19pbXBsLm51bGxhYmlsaXR5U3VmZml4OworCisgICAgLy8gTU9SRUJPVFRPTShOZXZlciwgVCkgPSB0cnVlCisgICAgaWYgKGlkZW50aWNhbChULCBOZXZlclR5cGVJbXBsLmluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTU9SRUJPVFRPTShULCBOZXZlcikgPSBmYWxzZQorICAgIGlmIChpZGVudGljYWwoUywgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNT1JFQk9UVE9NKE51bGwsIFQpID0gdHJ1ZQorICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUgJiYgVC5pc0RhcnRDb3JlTnVsbCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTU9SRUJPVFRPTShULCBOdWxsKSA9IGZhbHNlCisgICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSAmJiBTLmlzRGFydENvcmVOdWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTU9SRUJPVFRPTShUPywgUz8pID0gTU9SRUJPVFRPTShULCBTKQorICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uICYmCisgICAgICAgIFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHZhciBUMiA9IFRfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICB2YXIgUzIgPSBTX2ltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOworICAgICAgcmV0dXJuIGlzTW9yZUJvdHRvbShUMiwgUzIpOworICAgIH0KKworICAgIC8vIE1PUkVCT1RUT00oVCwgUz8pID0gdHJ1ZQorICAgIGlmIChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBNT1JFQk9UVE9NKFQ/LCBTKSA9IGZhbHNlCisgICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNT1JFQk9UVE9NKFQqLCBTKikgPSBNT1JFQk9UVE9NKFQsIFMpCisgICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhciAmJgorICAgICAgICBTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKKyAgICAgIHZhciBUMiA9IFRfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICB2YXIgUzIgPSBTX2ltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOworICAgICAgcmV0dXJuIGlzTW9yZUJvdHRvbShUMiwgUzIpOworICAgIH0KKworICAgIC8vIE1PUkVCT1RUT00oVCwgUyopID0gdHJ1ZQorICAgIGlmIChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE1PUkVCT1RUT00oVCosIFMpID0gZmFsc2UKKyAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVHlwZSBwYXJhbWV0ZXJzLgorICAgIGlmIChUIGlzIFR5cGVQYXJhbWV0ZXJUeXBlSW1wbCAmJiBTIGlzIFR5cGVQYXJhbWV0ZXJUeXBlSW1wbCkgeworICAgICAgLy8gV2UgaGF2ZSBlbGltaW5hdGVkIHRoZSBwb3NzaWJpbGl0eSB0aGF0IFRfbnVsbGFiaWxpdHkgb3IgU19udWxsYWJpbGl0eQorICAgICAgLy8gaXMgYW55dGhpbmcgZXhjZXB0IG5vbmUgYnkgdGhpcyBwb2ludC4KKyAgICAgIGFzc2VydChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOworICAgICAgYXNzZXJ0KFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICB2YXIgVF9lbGVtZW50ID0gVC5lbGVtZW50OworICAgICAgdmFyIFNfZWxlbWVudCA9IFMuZWxlbWVudDsKKworICAgICAgLy8gTU9SRUJPVFRPTShYJlQsIFkmUykgPSBNT1JFQk9UVE9NKFQsIFMpCisgICAgICB2YXIgVF9wcm9tb3RlZEJvdW5kID0gVC5wcm9tb3RlZEJvdW5kOworICAgICAgdmFyIFNfcHJvbW90ZWRCb3VuZCA9IFMucHJvbW90ZWRCb3VuZDsKKyAgICAgIGlmIChUX3Byb21vdGVkQm91bmQgIT0gbnVsbCAmJiBTX3Byb21vdGVkQm91bmQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gaXNNb3JlQm90dG9tKFRfcHJvbW90ZWRCb3VuZCwgU19wcm9tb3RlZEJvdW5kKTsKKyAgICAgIH0KKworICAgICAgLy8gTU9SRUJPVFRPTShYJlQsIFMpID0gdHJ1ZQorICAgICAgaWYgKFRfcHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvLyBNT1JFQk9UVE9NKFQsIFkmUykgPSBmYWxzZQorICAgICAgaWYgKFNfcHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gTU9SRUJPVFRPTShYIGV4dGVuZHMgVCwgWSBleHRlbmRzIFMpID0gTU9SRUJPVFRPTShULCBTKQorICAgICAgdmFyIFRfYm91bmQgPSBUX2VsZW1lbnQuYm91bmQ7CisgICAgICB2YXIgU19ib3VuZCA9IFNfZWxlbWVudC5ib3VuZDsKKyAgICAgIC8vIFRoZSBpbnZhcmlhbnQgb2YgdGhlIGxhcmdlciBhbGdvcml0aG0gdGhhdCB0aGlzIGlzIG9ubHkgY2FsbGVkIHdpdGgKKyAgICAgIC8vIHR5cGVzIHRoYXQgc2F0aXNmeSBgQk9UVE9NKFQpYCBvciBgTlVMTChUKWAsIGFuZCBhbGwgc3VjaCB0eXBlcywgaWYKKyAgICAgIC8vIHRoZXkgYXJlIHR5cGUgdmFyaWFibGVzLCBoYXZlIGJvdW5kcyB3aGljaCB0aGVtc2VsdmVzIGFyZQorICAgICAgLy8gYEJPVFRPTWAgb3IgYE5VTExgIHR5cGVzLgorICAgICAgYXNzZXJ0KFRfYm91bmQgIT0gbnVsbCk7CisgICAgICBhc3NlcnQoU19ib3VuZCAhPSBudWxsKTsKKyAgICAgIHJldHVybiBpc01vcmVCb3R0b20oVF9ib3VuZCwgU19ib3VuZCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgaXNNb3JlU3BlY2lmaWNUaGFuKERhcnRUeXBlIHQxLCBEYXJ0VHlwZSB0MikgPT4gaXNTdWJ0eXBlT2YyKHQxLCB0Mik7CisKKyAgLy8vIERlZmluZXMgYSB0b3RhbCBvcmRlciBvbiB0b3AgYW5kIE9iamVjdCB0eXBlcy4KKyAgYm9vbCBpc01vcmVUb3AoRGFydFR5cGUgVCwgRGFydFR5cGUgUykgeworICAgIHZhciBUX2ltcGwgPSBUIGFzIFR5cGVJbXBsOworICAgIHZhciBTX2ltcGwgPSBTIGFzIFR5cGVJbXBsOworCisgICAgdmFyIFRfbnVsbGFiaWxpdHkgPSBUX2ltcGwubnVsbGFiaWxpdHlTdWZmaXg7CisgICAgdmFyIFNfbnVsbGFiaWxpdHkgPSBTX2ltcGwubnVsbGFiaWxpdHlTdWZmaXg7CisKKyAgICAvLyBNT1JFVE9QKHZvaWQsIFMpID0gdHJ1ZQorICAgIGlmIChpZGVudGljYWwoVCwgVm9pZFR5cGVJbXBsLmluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChULCB2b2lkKSA9IGZhbHNlCisgICAgaWYgKGlkZW50aWNhbChTLCBWb2lkVHlwZUltcGwuaW5zdGFuY2UpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChkeW5hbWljLCBTKSA9IHRydWUKKyAgICBpZiAoaWRlbnRpY2FsKFQsIER5bmFtaWNUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE1PUkVUT1AoVCwgZHluYW1pYykgPSBmYWxzZQorICAgIGlmIChpZGVudGljYWwoUywgRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1PUkVUT1AoT2JqZWN0LCBTKSA9IHRydWUKKyAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lICYmIFQuaXNEYXJ0Q29yZU9iamVjdCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChULCBPYmplY3QpID0gZmFsc2UKKyAgICBpZiAoU19udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lICYmIFMuaXNEYXJ0Q29yZU9iamVjdCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1PUkVUT1AoVCosIFMqKSA9IE1PUkVUT1AoVCwgUykKKyAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyICYmCisgICAgICAgIFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcikgeworICAgICAgdmFyIFQyID0gVF9pbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIHZhciBTMiA9IFNfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICByZXR1cm4gaXNNb3JlVG9wKFQyLCBTMik7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChULCBTKikgPSB0cnVlCisgICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChUKiwgUykgPSBmYWxzZQorICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNT1JFVE9QKFQ/LCBTPykgPSBNT1JFVE9QKFQsIFMpCisgICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24gJiYKKyAgICAgICAgU19udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgeworICAgICAgdmFyIFQyID0gVF9pbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIHZhciBTMiA9IFNfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7CisgICAgICByZXR1cm4gaXNNb3JlVG9wKFQyLCBTMik7CisgICAgfQorCisgICAgLy8gTU9SRVRPUChULCBTPykgPSB0cnVlCisgICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE1PUkVUT1AoVD8sIFMpID0gZmFsc2UKKyAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1PUkVUT1AoRnV0dXJlT3I8VD4sIEZ1dHVyZU9yPFM+KSA9IE1PUkVUT1AoVCwgUykKKyAgICBpZiAoVCBpcyBJbnRlcmZhY2VUeXBlICYmCisgICAgICAgIFQuaXNEYXJ0QXN5bmNGdXR1cmVPciAmJgorICAgICAgICBTIGlzIEludGVyZmFjZVR5cGUgJiYKKyAgICAgICAgUy5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7CisgICAgICBhc3NlcnQoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIGFzc2VydChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOworICAgICAgdmFyIFQyID0gVC50eXBlQXJndW1lbnRzWzBdOworICAgICAgdmFyIFMyID0gUy50eXBlQXJndW1lbnRzWzBdOworICAgICAgcmV0dXJuIGlzTW9yZVRvcChUMiwgUzIpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYHRydWVgIGZvciB0aGluZ3MgaW4gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG9mIGBOdWxsYC4KKyAgYm9vbCBpc051bGwoRGFydFR5cGUgdHlwZSkgeworICAgIHZhciB0eXBlSW1wbCA9IHR5cGUgYXMgVHlwZUltcGw7CisgICAgdmFyIG51bGxhYmlsaXR5U3VmZml4ID0gdHlwZUltcGwubnVsbGFiaWxpdHlTdWZmaXg7CisKKyAgICAvLyBOVUxMKE51bGwpIGlzIHRydWUKKyAgICAvLyBBbHNvIGluY2x1ZGVzIGBOdWxsP2AgYW5kIGBOdWxsKmAgZnJvbSB0aGUgcnVsZXMgYmVsb3cuCisgICAgaWYgKHR5cGUuaXNEYXJ0Q29yZU51bGwpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE5VTEwoVD8pIGlzIHRydWUgaWZmIE5VTEwoVCkgb3IgQk9UVE9NKFQpCisgICAgLy8gTlVMTChUKikgaXMgdHJ1ZSBpZmYgTlVMTChUKSBvciBCT1RUT00oVCkKKyAgICAvLyBDYXNlcyBmb3IgYE51bGw/YCBhbmQgYE51bGwqYCBhcmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlLgorICAgIGlmIChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbiB8fAorICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7CisgICAgICB2YXIgVCA9IHR5cGVJbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIHJldHVybiBpc0JvdHRvbShUKTsKKyAgICB9CisKKyAgICAvLyBOVUxMKFQpIGlzIGZhbHNlIG90aGVyd2lzZQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYHRydWVgIGZvciBhbnkgdHlwZSB3aGljaCBpcyBpbiB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YgYE9iamVjdGAuCisgIGJvb2wgaXNPYmplY3QoRGFydFR5cGUgdHlwZSkgeworICAgIFR5cGVJbXBsIHR5cGVJbXBsID0gdHlwZTsKKyAgICBpZiAodHlwZUltcGwubnVsbGFiaWxpdHlTdWZmaXggIT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE9CSkVDVChPYmplY3QpIGlzIHRydWUKKyAgICBpZiAodHlwZS5pc0RhcnRDb3JlT2JqZWN0KSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPQkpFQ1QoRnV0dXJlT3I8VD4pIGlzIE9CSkVDVChUKQorICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7CisgICAgICB2YXIgVCA9IHR5cGUudHlwZUFyZ3VtZW50c1swXTsKKyAgICAgIHJldHVybiBpc09iamVjdChUKTsKKyAgICB9CisKKyAgICAvLyBPQkpFQ1QoVCkgaXMgZmFsc2Ugb3RoZXJ3aXNlCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIENoZWNrIGlmIFtsZWZ0VHlwZV0gaXMgYSBzdWJ0eXBlIG9mIFtyaWdodFR5cGVdLgorICAvLy8KKyAgLy8vIEltcGxlbWVudHM6CisgIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCisgIC8vLyBTZWUgYHJlc291cmNlcy90eXBlLXN5c3RlbS9zdWJ0eXBpbmcubWRgCisgIEBvdmVycmlkZQorICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIGxlZnRUeXBlLCBEYXJ0VHlwZSByaWdodFR5cGUpIHsKKyAgICBpZiAoIU51bGxTYWZldHlVbmRlcnN0YW5kaW5nRmxhZy5pc0VuYWJsZWQpIHsKKyAgICAgIGxlZnRUeXBlID0gTnVsbGFiaWxpdHlFbGltaW5hdG9yLnBlcmZvcm0odHlwZVByb3ZpZGVyLCBsZWZ0VHlwZSk7CisgICAgICByaWdodFR5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIHJpZ2h0VHlwZSk7CisgICAgfQorICAgIHJldHVybiBpc1N1YnR5cGVPZjIobGVmdFR5cGUsIHJpZ2h0VHlwZSk7CisgIH0KKworICBib29sIGlzU3VidHlwZU9mMihEYXJ0VHlwZSBsZWZ0VHlwZSwgRGFydFR5cGUgcmlnaHRUeXBlKSB7CisgICAgcmV0dXJuIF9zdWJ0eXBlSGVscGVyLmlzU3VidHlwZU9mKGxlZnRUeXBlLCByaWdodFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiBgdHJ1ZWAgZm9yIGFueSB0eXBlIHdoaWNoIGlzIGluIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBvZiB0b3AgdHlwZXMuCisgIGJvb2wgaXNUb3AoRGFydFR5cGUgdHlwZSkgeworICAgIC8vIFRPUCg/KSBpcyB0cnVlCisgICAgaWYgKGlkZW50aWNhbCh0eXBlLCBVbmtub3duSW5mZXJyZWRUeXBlLmluc3RhbmNlKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVE9QKGR5bmFtaWMpIGlzIHRydWUKKyAgICBpZiAoaWRlbnRpY2FsKHR5cGUsIER5bmFtaWNUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRPUCh2b2lkKSBpcyB0cnVlCisgICAgaWYgKGlkZW50aWNhbCh0eXBlLCBWb2lkVHlwZUltcGwuaW5zdGFuY2UpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIgdHlwZUltcGwgPSB0eXBlIGFzIFR5cGVJbXBsOworICAgIHZhciBudWxsYWJpbGl0eVN1ZmZpeCA9IHR5cGVJbXBsLm51bGxhYmlsaXR5U3VmZml4OworCisgICAgLy8gVE9QKFQ/KSBpcyB0cnVlIGlmZiBUT1AoVCkgb3IgT0JKRUNUKFQpCisgICAgLy8gVE9QKFQqKSBpcyB0cnVlIGlmZiBUT1AoVCkgb3IgT0JKRUNUKFQpCisgICAgaWYgKG51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uIHx8CisgICAgICAgIG51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKKyAgICAgIHZhciBUID0gdHlwZUltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOworICAgICAgcmV0dXJuIGlzVG9wKFQpIHx8IGlzT2JqZWN0KFQpOworICAgIH0KKworICAgIC8vIFRPUChGdXR1cmVPcjxUPikgaXMgVE9QKFQpCisgICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmlzRGFydEFzeW5jRnV0dXJlT3IpIHsKKyAgICAgIGFzc2VydChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKKyAgICAgIHZhciBUID0gdHlwZS50eXBlQXJndW1lbnRzWzBdOworICAgICAgcmV0dXJuIGlzVG9wKFQpOworICAgIH0KKworICAgIC8vIFRPUChUKSBpcyBmYWxzZSBvdGhlcndpc2UKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYF9gLgorICAvLy8KKyAgLy8vIFRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgX2AgaXMgZGVmaW5lZCBhcworICAvLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYF9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAsIGFuCisgIC8vLyBldmVyeSBjb250cmF2YXJpYW50IG9jY3VycmVuY2Ugb2YgYF9gIHJlcGxhY2VkIHdpdGggYE51bGxgLgorICAvLy8KKyAgLy8vIElmIHRoZSBzY2hlbWEgY29udGFpbnMgbm8gaW5zdGFuY2VzIG9mIGBfYCwgdGhlIG9yaWdpbmFsIHNjaGVtYSBvYmplY3QgaXMKKyAgLy8vIHJldHVybmVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZSBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYSBwcm9wZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGxlYXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhbHdheXMgYSBzdWJ0eXBlIG9mIGFueQorICAvLy8gdHlwZSB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWEuCisgIERhcnRUeXBlIGxlYXN0Q2xvc3VyZShEYXJ0VHlwZSBzY2hlbWEpIHsKKyAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgeworICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAorICAgICAgICB0b3BUeXBlOiBvYmplY3RRdWVzdGlvbiwKKyAgICAgICAgYm90dG9tVHlwZTogTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSwKKyAgICAgICAgaXNMZWFzdENsb3N1cmU6IHRydWUsCisgICAgICAgIHNjaGVtYTogc2NoZW1hLAorICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAorICAgICAgICB0b3BUeXBlOiBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UsCisgICAgICAgIGJvdHRvbVR5cGU6IHR5cGVQcm92aWRlci5udWxsVHlwZSwKKyAgICAgICAgaXNMZWFzdENsb3N1cmU6IHRydWUsCisgICAgICAgIHNjaGVtYTogc2NoZW1hLAorICAgICAgKTsKKyAgICB9CisgIH0KKworICAvLy8gQ29tcHV0ZSB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIFtUXS4KKyAgLy8vCisgIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCisgIC8vLyBTZWUgYHJlc291cmNlcy90eXBlLXN5c3RlbS9ub3JtYWxpemF0aW9uLm1kYAorICBEYXJ0VHlwZSBub3JtYWxpemUoRGFydFR5cGUgVCkgeworICAgIHJldHVybiBOb3JtYWxpemVIZWxwZXIodGhpcykubm9ybWFsaXplKFQpOworICB9CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHJlZmluZUJpbmFyeUV4cHJlc3Npb25UeXBlKERhcnRUeXBlIGxlZnRUeXBlLCBUb2tlblR5cGUgb3BlcmF0b3IsCisgICAgICBEYXJ0VHlwZSByaWdodFR5cGUsIERhcnRUeXBlIGN1cnJlbnRUeXBlKSB7CisgICAgaWYgKGxlZnRUeXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlICYmIGxlZnRUeXBlLmJvdW5kLmlzRGFydENvcmVOdW0pIHsKKyAgICAgIGlmIChyaWdodFR5cGUgPT0gbGVmdFR5cGUgfHwgcmlnaHRUeXBlLmlzRGFydENvcmVJbnQpIHsKKyAgICAgICAgaWYgKG9wZXJhdG9yID09IFRva2VuVHlwZS5QTFVTIHx8CisgICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuTUlOVVMgfHwKKyAgICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSIHx8CisgICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVU19FUSB8fAorICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTX0VRIHx8CisgICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUl9FUSB8fAorICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVNfUExVUyB8fAorICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTX01JTlVTKSB7CisgICAgICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9tb3RlVG9Ob25OdWxsKGxlZnRUeXBlIGFzIFR5cGVJbXBsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGxlZnRUeXBlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocmlnaHRUeXBlLmlzRGFydENvcmVEb3VibGUpIHsKKyAgICAgICAgaWYgKG9wZXJhdG9yID09IFRva2VuVHlwZS5QTFVTIHx8CisgICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuTUlOVVMgfHwKKyAgICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSIHx8CisgICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU0xBU0gpIHsKKyAgICAgICAgICBJbnRlcmZhY2VUeXBlSW1wbCBkb3VibGVUeXBlID0gdHlwZVByb3ZpZGVyLmRvdWJsZVR5cGU7CisgICAgICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9tb3RlVG9Ob25OdWxsKGRvdWJsZVR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZG91YmxlVHlwZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGN1cnJlbnRUeXBlOworICAgIH0KKyAgICAvLyBib29sCisgICAgaWYgKG9wZXJhdG9yID09IFRva2VuVHlwZS5BTVBFUlNBTkRfQU1QRVJTQU5EIHx8CisgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5CQVJfQkFSIHx8CisgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5FUV9FUSB8fAorICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuQkFOR19FUSkgeworICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKKyAgICAgICAgcmV0dXJuIHByb21vdGVUb05vbk51bGwodHlwZVByb3ZpZGVyLmJvb2xUeXBlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0eXBlUHJvdmlkZXIuYm9vbFR5cGU7CisgICAgfQorICAgIGlmIChsZWZ0VHlwZS5pc0RhcnRDb3JlSW50KSB7CisgICAgICAvLyBpbnQgb3AgZG91YmxlCisgICAgICBpZiAob3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBFUkNFTlQgfHwKKyAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVUyB8fAorICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTX0VRIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBFUkNFTlRfRVEgfHwKKyAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVU19FUSB8fAorICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSX0VRKSB7CisgICAgICAgIGlmIChyaWdodFR5cGUuaXNEYXJ0Q29yZURvdWJsZSkgeworICAgICAgICAgIEludGVyZmFjZVR5cGVJbXBsIGRvdWJsZVR5cGUgPSB0eXBlUHJvdmlkZXIuZG91YmxlVHlwZTsKKyAgICAgICAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgeworICAgICAgICAgICAgcmV0dXJuIHByb21vdGVUb05vbk51bGwoZG91YmxlVHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBkb3VibGVUeXBlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBpbnQgb3AgaW50CisgICAgICBpZiAob3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBFUkNFTlQgfHwKKyAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVUyB8fAorICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlRJTERFX1NMQVNIIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTX0VRIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBFUkNFTlRfRVEgfHwKKyAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVU19FUSB8fAorICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5TVEFSX0VRIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlRJTERFX1NMQVNIX0VRIHx8CisgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVNfUExVUyB8fAorICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VU19NSU5VUykgeworICAgICAgICBpZiAocmlnaHRUeXBlLmlzRGFydENvcmVJbnQpIHsKKyAgICAgICAgICBJbnRlcmZhY2VUeXBlSW1wbCBpbnRUeXBlID0gdHlwZVByb3ZpZGVyLmludFR5cGU7CisgICAgICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9tb3RlVG9Ob25OdWxsKGludFR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gaW50VHlwZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBkZWZhdWx0CisgICAgcmV0dXJuIGN1cnJlbnRUeXBlOworICB9CisKKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgcnVudGltZSB0eXBlcyBbVDFdIGFuZCBbVDJdIGFyZSBlcXVhbC4KKyAgLy8vCisgIC8vLyBubmJkL2ZlYXR1cmUtc3BlY2lmaWNhdGlvbi5tZCNydW50aW1lLXR5cGUtZXF1YWxpdHktb3BlcmF0b3IKKyAgYm9vbCBydW50aW1lVHlwZXNFcXVhbChEYXJ0VHlwZSBUMSwgRGFydFR5cGUgVDIpIHsKKyAgICByZXR1cm4gUnVudGltZVR5cGVFcXVhbGl0eUhlbHBlcih0aGlzKS5lcXVhbChUMSwgVDIpOworICB9CisKKyAgRGFydFR5cGUgdG9MZWdhY3lUeXBlKERhcnRUeXBlIHR5cGUpIHsKKyAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgcmV0dXJuIHR5cGU7CisgICAgcmV0dXJuIE51bGxhYmlsaXR5RWxpbWluYXRvci5wZXJmb3JtKHR5cGVQcm92aWRlciwgdHlwZSk7CisgIH0KKworICAvLy8gTWVyZ2VzIHR3byB0eXBlcyBpbnRvIGEgc2luZ2xlIHR5cGUuCisgIC8vLyBDb21wdXRlIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgW1RdLgorICAvLy8KKyAgLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvCisgIC8vLyBTZWUgYGFjY2VwdGVkL2Z1dHVyZS1yZWxlYXNlcy9ubmJkL2ZlYXR1cmUtc3BlY2lmaWNhdGlvbi5tZGAKKyAgLy8vIFNlZSBgI2NsYXNzZXMtZGVmaW5lZC1pbi1vcHRlZC1pbi1saWJyYXJpZXNgCisgIERhcnRUeXBlIHRvcE1lcmdlKERhcnRUeXBlIFQsIERhcnRUeXBlIFMpIHsKKyAgICByZXR1cm4gVG9wTWVyZ2VIZWxwZXIodGhpcykudG9wTWVyZ2UoVCwgUyk7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgdHJ5UHJvbW90ZVRvVHlwZShEYXJ0VHlwZSB0bywgRGFydFR5cGUgZnJvbSkgeworICAgIC8vIEFsbG93IHByb21vdGluZyB0byBhIHN1YnR5cGUsIGZvciBleGFtcGxlOgorICAgIC8vCisgICAgLy8gICAgIGYoQmFzZSBiKSB7CisgICAgLy8gICAgICAgaWYgKGIgaXMgU3ViVHlwZU9mQmFzZSkgeworICAgIC8vICAgICAgICAgLy8gcHJvbW90ZSBgYmAgdG8gU3ViVHlwZU9mQmFzZSBmb3IgdGhpcyBibG9jaworICAgIC8vICAgICAgIH0KKyAgICAvLyAgICAgfQorICAgIC8vCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHZhcmlhYmxlIHRvIGJlIHVzZWQgd2hlcmV2ZXIgdGhlIHN1cGVydHlwZSAoaGVyZSBgQmFzZWApCisgICAgLy8gaXMgZXhwZWN0ZWQsIHdoaWxlIGdhaW5pbmcgYSBtb3JlIHByZWNpc2UgdHlwZS4KKyAgICBpZiAoaXNTdWJ0eXBlT2YyKHRvLCBmcm9tKSkgeworICAgICAgcmV0dXJuIHRvOworICAgIH0KKyAgICAvLyBGb3IgYSB0eXBlIHBhcmFtZXRlciBgVCBleHRlbmRzIFVgLCBhbGxvdyBwcm9tb3RpbmcgdGhlIHVwcGVyIGJvdW5kCisgICAgLy8gYFVgIHRvIGBTYCB3aGVyZSBgUyA8OiBVYCwgeWllbGRpbmcgYSB0eXBlIHBhcmFtZXRlciBgVCBleHRlbmRzIFNgLgorICAgIGlmIChmcm9tIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CisgICAgICBpZiAoaXNTdWJ0eXBlT2YyKHRvLCBmcm9tLmJvdW5kID8/IER5bmFtaWNUeXBlSW1wbC5pbnN0YW5jZSkpIHsKKyAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gZnJvbS5lbGVtZW50LmRlY2xhcmF0aW9uOworICAgICAgICByZXR1cm4gVHlwZVBhcmFtZXRlclR5cGVJbXBsKAorICAgICAgICAgIGVsZW1lbnQ6IGRlY2xhcmF0aW9uLAorICAgICAgICAgIG51bGxhYmlsaXR5U3VmZml4OiBmcm9tLm51bGxhYmlsaXR5U3VmZml4LAorICAgICAgICAgIHByb21vdGVkQm91bmQ6IHRvLAorICAgICAgICApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgdm9pZCB1cGRhdGVPcHRpb25zKHsKKyAgICBAcmVxdWlyZWQgYm9vbCBpbXBsaWNpdENhc3RzLAorICAgIEByZXF1aXJlZCBib29sIHN0cmljdEluZmVyZW5jZSwKKyAgfSkgeworICAgIHRoaXMuaW1wbGljaXRDYXN0cyA9IGltcGxpY2l0Q2FzdHM7CisgICAgdGhpcy5zdHJpY3RJbmZlcmVuY2UgPSBzdHJpY3RJbmZlcmVuY2U7CisgIH0KKworICBMaXN0PERhcnRUeXBlPiBfZGVmYXVsdFR5cGVBcmd1bWVudHMoCisgICAgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZVBhcmFtZXRlcnMsCisgICkgeworICAgIHJldHVybiB0eXBlUGFyYW1ldGVycy5tYXAoKHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgIHZhciB0eXBlUGFyYW1ldGVySW1wbCA9IHR5cGVQYXJhbWV0ZXIgYXMgVHlwZVBhcmFtZXRlckVsZW1lbnRJbXBsOworICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJJbXBsLmRlZmF1bHRUeXBlOworICAgIH0pLnRvTGlzdCgpOworICB9Cit9CisKK2NsYXNzIF9UeXBlVmFyaWFibGVFbGltaW5hdG9yIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHsKKyAgZmluYWwgRGFydFR5cGUgX3RvcFR5cGU7CisgIGZpbmFsIERhcnRUeXBlIF9ib3R0b21UeXBlOworCisgIF9UeXBlVmFyaWFibGVFbGltaW5hdG9yKAorICAgIHRoaXMuX3RvcFR5cGUsCisgICAgdGhpcy5fYm90dG9tVHlwZSwKKyAgKTsKKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgZ2V0U3Vic3RpdHV0ZShUeXBlUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIsIGJvb2wgdXBwZXJCb3VuZCkgeworICAgIHJldHVybiB1cHBlckJvdW5kID8gX2JvdHRvbVR5cGUgOiBfdG9wVHlwZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9mZmlfY29kZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9mZmlfY29kZS5kYXJ0CmluZGV4IDYwMjBlZDUuLmYyNzExZDkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZXJyb3IvZmZpX2NvZGUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2Vycm9yL2ZmaV9jb2RlLmRhcnQKQEAgLTYsNiArNiwxMCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9hbmFseXplcl9lcnJvcl9jb2RlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAorLy8gSXQgaXMgaGFyZCB0byB2aXN1YWxseSBzZXBhcmF0ZSBlYWNoIGNvZGUncyBfZG9jIGNvbW1lbnRfIGZyb20gaXRzIHB1Ymxpc2hlZAorLy8gX2RvY3VtZW50YXRpb24gY29tbWVudF8gd2hlbiBlYWNoIGlzIHdyaXR0ZW4gYXMgYW4gZW5kLW9mLWxpbmUgY29tbWVudC4KKy8vIGlnbm9yZV9mb3JfZmlsZTogc2xhc2hfZm9yX2RvY19jb21tZW50cworCiAvLy8gVGhlIGRpYWdub3N0aWMgY29kZXMgYXNzb2NpYXRlZCB3aXRoIGBkYXJ0OmZmaWAuCiBjbGFzcyBGZmlDb2RlIGV4dGVuZHMgQW5hbHl6ZXJFcnJvckNvZGUgewogICAvKioKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZXJyb3IvaGludF9jb2Rlcy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9oaW50X2NvZGVzLmRhcnQKaW5kZXggNTg2YTBhMS4uZTk2YjY2ZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9oaW50X2NvZGVzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9oaW50X2NvZGVzLmRhcnQKQEAgLTUsNiArNSwxMCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2Vycm9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9hbmFseXplcl9lcnJvcl9jb2RlLmRhcnQnOwogCisvLyBJdCBpcyBoYXJkIHRvIHZpc3VhbGx5IHNlcGFyYXRlIGVhY2ggY29kZSdzIF9kb2MgY29tbWVudF8gZnJvbSBpdHMgcHVibGlzaGVkCisvLyBfZG9jdW1lbnRhdGlvbiBjb21tZW50XyB3aGVuIGVhY2ggaXMgd3JpdHRlbiBhcyBhbiBlbmQtb2YtbGluZSBjb21tZW50LgorLy8gaWdub3JlX2Zvcl9maWxlOiBzbGFzaF9mb3JfZG9jX2NvbW1lbnRzCisKIC8qKgogICogVGhlIGhpbnRzIGFuZCBjb2RpbmcgcmVjb21tZW5kYXRpb25zIGZvciBiZXN0IHByYWN0aWNlcyB3aGljaCBhcmUgbm90CiAgKiBtZW50aW9uZWQgaW4gdGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbi4KQEAgLTg1LDExICs4OSwxMSBAQAogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBjYXRjaCBjbGF1c2UgaXMgZm91bmQgdGhhdAotICAvLyBjYW4ndCBiZSBleGVjdXRlZCBiZWNhdXNlIGl04oCZcyBhZnRlciBhIGNhdGNoIGNsYXVzZSBvZiB0aGUgZm9ybSBgY2F0Y2ggKGUpYAotICAvLyBvciBgb24gT2JqZWN0IGNhdGNoIChlKWAuIFRoZSBmaXJzdCBjYXRjaCBjbGF1c2UgdGhhdCBtYXRjaGVzIHRoZSB0aHJvd24KLSAgLy8gb2JqZWN0IGlzIHNlbGVjdGVkLCBhbmQgYm90aCBvZiB0aG9zZSBmb3JtcyB3aWxsIG1hdGNoIGFueSBvYmplY3QsIHNvIG5vCi0gIC8vIGNhdGNoIGNsYXVzZXMgdGhhdCBmb2xsb3cgdGhlbSB3aWxsIGJlIHNlbGVjdGVkLgorICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBgY2F0Y2hgIGNsYXVzZSBpcyBmb3VuZCB0aGF0CisgIC8vIGNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgaXTigJlzIGFmdGVyIGEgYGNhdGNoYCBjbGF1c2Ugb2YgdGhlIGZvcm0KKyAgLy8gYGNhdGNoIChlKWAgb3IgYG9uIE9iamVjdCBjYXRjaCAoZSlgLiBUaGUgZmlyc3QgYGNhdGNoYCBjbGF1c2UgdGhhdCBtYXRjaGVzCisgIC8vIHRoZSB0aHJvd24gb2JqZWN0IGlzIHNlbGVjdGVkLCBhbmQgYm90aCBvZiB0aG9zZSBmb3JtcyB3aWxsIG1hdGNoIGFueQorICAvLyBvYmplY3QsIHNvIG5vIGBjYXRjaGAgY2xhdXNlcyB0aGF0IGZvbGxvdyB0aGVtIHdpbGwgYmUgc2VsZWN0ZWQuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KQEAgLTE0NywxMCArMTUxLDEwIEBACiAgICAqLwogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCi0gIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGNhdGNoIGNsYXVzZSBpcyBmb3VuZCB0aGF0Ci0gIC8vIGNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgaXQgaXMgYWZ0ZXIgYSBjYXRjaCBjbGF1c2UgdGhhdCBjYXRjaGVzIGVpdGhlcgotICAvLyB0aGUgc2FtZSB0eXBlIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSBjbGF1c2UncyB0eXBlLiBUaGUgZmlyc3QgY2F0Y2ggY2xhdXNlCi0gIC8vIHRoYXQgbWF0Y2hlcyB0aGUgdGhyb3duIG9iamVjdCBpcyBzZWxlY3RlZCwgYW5kIHRoZSBlYXJsaWVyIGNsYXVzZSBsIGFsd2F5cworICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBgY2F0Y2hgIGNsYXVzZSBpcyBmb3VuZCB0aGF0CisgIC8vIGNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgaXQgaXMgYWZ0ZXIgYSBgY2F0Y2hgIGNsYXVzZSB0aGF0IGNhdGNoZXMgZWl0aGVyCisgIC8vIHRoZSBzYW1lIHR5cGUgb3IgYSBzdXBlcnR5cGUgb2YgdGhlIGNsYXVzZSdzIHR5cGUuIFRoZSBmaXJzdCBgY2F0Y2hgIGNsYXVzZQorICAvLyB0aGF0IG1hdGNoZXMgdGhlIHRocm93biBvYmplY3QgaXMgc2VsZWN0ZWQsIGFuZCB0aGUgZWFybGllciBjbGF1c2UgYWx3YXlzCiAgIC8vIG1hdGNoZXMgYW55dGhpbmcgbWF0Y2hhYmxlIGJ5IHRoZSBoaWdobGlnaHRlZCBjbGF1c2UsIHNvIHRoZSBoaWdobGlnaHRlZAogICAvLyBjbGF1c2Ugd2lsbCBuZXZlciBiZSBzZWxlY3RlZC4KICAgLy8KQEAgLTM3Nyw3ICszODEsNyBAQAogICAvLwogICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gZWxlbWVudCBpbiBhIG5vbi1jb25zdGFudCBzZXQKICAgLy8gaXMgdGhlIHNhbWUgYXMgYSBwcmV2aW91cyBlbGVtZW50IGluIHRoZSBzYW1lIHNldC4gSWYgdHdvIGVsZW1lbnRzIGFyZSB0aGUKLSAgLy8gc2FtZSwgdGhlbiB0aGUgc2Vjb25kIHZhbHVlIGlzICBpZ25vcmVkLCB3aGljaCBtYWtlcyBoYXZpbmcgYm90aCBlbGVtZW50cworICAvLyBzYW1lLCB0aGVuIHRoZSBzZWNvbmQgdmFsdWUgaXMgaWdub3JlZCwgd2hpY2ggbWFrZXMgaGF2aW5nIGJvdGggZWxlbWVudHMKICAgLy8gcG9pbnRsZXNzIGFuZCBsaWtlbHkgc2lnbmFscyBhIGJ1Zy4KICAgLy8KICAgLy8gIyMjIyBFeGFtcGxlCkBAIC00MTYsNyArNDIwLDggQEAKICAgc3RhdGljIGNvbnN0IEhpbnRDb2RlIEVRVUFMX0VMRU1FTlRTX0lOX1NFVCA9IEhpbnRDb2RlKAogICAgICAgJ0VRVUFMX0VMRU1FTlRTX0lOX1NFVCcsCiAgICAgICAiVHdvIGVsZW1lbnRzIGluIGEgc2V0IGxpdGVyYWwgc2hvdWxkbid0IGJlIGVxdWFsLiIsCi0gICAgICBjb3JyZWN0aW9uOiAiQ2hhbmdlIG9yIHJlbW92ZSB0aGUgZHVwbGljYXRlIGVsZW1lbnQuIik7CisgICAgICBjb3JyZWN0aW9uOiAiQ2hhbmdlIG9yIHJlbW92ZSB0aGUgZHVwbGljYXRlIGVsZW1lbnQuIiwKKyAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgpAQCAtNDYyLDcgKzQ2Nyw4IEBACiAgIC8vIHZhbHVlcyBhcmUgcmV0dXJuZWQgYnkgYW4gaXRlcmF0b3IuCiAgIHN0YXRpYyBjb25zdCBIaW50Q29kZSBFUVVBTF9LRVlTX0lOX01BUCA9IEhpbnRDb2RlKAogICAgICAgJ0VRVUFMX0tFWVNfSU5fTUFQJywgIlR3byBrZXlzIGluIGEgbWFwIGxpdGVyYWwgc2hvdWxkbid0IGJlIGVxdWFsLiIsCi0gICAgICBjb3JyZWN0aW9uOiAiQ2hhbmdlIG9yIHJlbW92ZSB0aGUgZHVwbGljYXRlIGtleS4iKTsKKyAgICAgIGNvcnJlY3Rpb246ICJDaGFuZ2Ugb3IgcmVtb3ZlIHRoZSBkdXBsaWNhdGUga2V5LiIsCisgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogSXQgaXMgYSBiYWQgcHJhY3RpY2UgZm9yIGEgc291cmNlIGZpbGUgaW4gYSBwYWNrYWdlICJsaWIiIGRpcmVjdG9yeQpAQCAtNTk5LDcgKzYwNSw3IEBACiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QKKyAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpc24ndAogICAvLyBhIGBjb25zdGAgY29uc3RydWN0b3I6CiAgIC8vCiAgIC8vIGBgYGRhcnQKQEAgLTExMjMsOCArMTEyOSw4IEBACiAgIC8vCiAgIC8vICMjIyMgQ29tbW9uIGZpeGVzCiAgIC8vCi0gIC8vIEFkZCBhIHJldHVybiBzdGF0ZW1lbnQgdGhhdCBtYWtlcyB0aGUgcmV0dXJuIHZhbHVlIGV4cGxpY2l0LCBldmVuIGlmIGBudWxsYAotICAvLyBpcyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCisgIC8vIEFkZCBhIGByZXR1cm5gIHN0YXRlbWVudCB0aGF0IG1ha2VzIHRoZSByZXR1cm4gdmFsdWUgZXhwbGljaXQsIGV2ZW4gaWYKKyAgLy8gYG51bGxgIGlzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4KICAgc3RhdGljIGNvbnN0IEhpbnRDb2RlIE1JU1NJTkdfUkVUVVJOID0gSGludENvZGUoCiAgICAgICAnTUlTU0lOR19SRVRVUk4nLAogICAgICAgIlRoaXMgZnVuY3Rpb24gaGFzIGEgcmV0dXJuIHR5cGUgb2YgJ3swfScsIGJ1dCBkb2Vzbid0IGVuZCB3aXRoIGEgIgpAQCAtMTM5OSw5ICsxNDA1LDkgQEAKICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwogICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIHR5cGUgZm9sbG93aW5nIGBvbmAgaW4gYQotICAvLyBjYXRjaCBjbGF1c2UgaXMgYSBudWxsYWJsZSB0eXBlLiBJdCBpc24ndCB2YWxpZCB0byBzcGVjaWZ5IGEgbnVsbGFibGUgdHlwZQotICAvLyBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIGNhdGNoIGBudWxsYCAoYmVjYXVzZSBpdCdzIGEgcnVudGltZSBlcnJvciB0bwotICAvLyB0aHJvdyBgbnVsbGApLgorICAvLyBgY2F0Y2hgIGNsYXVzZSBpcyBhIG51bGxhYmxlIHR5cGUuIEl0IGlzbid0IHZhbGlkIHRvIHNwZWNpZnkgYSBudWxsYWJsZQorICAvLyB0eXBlIGJlY2F1c2UgaXQgaXNuJ3QgcG9zc2libGUgdG8gY2F0Y2ggYG51bGxgIChiZWNhdXNlIGl0J3MgYSBydW50aW1lCisgIC8vIGVycm9yIHRvIHRocm93IGBudWxsYCkuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZQogICAvLwpAQCAtMTQzNSw3ICsxNDQxLDggQEAKICAgICAgICdOVUxMQUJMRV9UWVBFX0lOX0NBVENIX0NMQVVTRScsCiAgICAgICAiQSBwb3RlbnRpYWxseSBudWxsYWJsZSB0eXBlIGNhbid0IGJlIHVzZWQgaW4gYW4gJ29uJyBjbGF1c2UgYmVjYXVzZSBpdCAiCiAgICAgICAgICAgImlzbid0IHZhbGlkIHRvIHRocm93IGEgbnVsbGFibGUgZXhwcmVzc2lvbi4iLAotICAgICAgY29ycmVjdGlvbjogIlRyeSB1c2luZyBhIG5vbi1udWxsYWJsZSB0eXBlLiIpOworICAgICAgY29ycmVjdGlvbjogIlRyeSB1c2luZyBhIG5vbi1udWxsYWJsZSB0eXBlLiIsCisgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogSGludCBmb3IgY2xhc3NlcyB0aGF0IG92ZXJyaWRlIGVxdWFscywgYnV0IG5vdCBoYXNoQ29kZS4KQEAgLTE2MzEsMTAgKzE2MzgsMTAgQEAKICAgICovCiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KLSAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGFzIGV4cHJlc3Npb24gaW5zaWRlIGEKKyAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnNpZGUgYQogICAvLyBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpIGlzIGZvdW5kIGluIGNvZGUgdGhhdCBoYXMgYW4gU0RLCi0gIC8vIGNvbnN0cmFpbnQgd2hvc2UgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIDIuMy4yLiBVc2luZyBhbiBhcyBleHByZXNzaW9uIGluCi0gIC8vIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSB3YXNuJ3Qgc3VwcG9ydGVkIGluIGVhcmxpZXIKKyAgLy8gY29uc3RyYWludCB3aG9zZSBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gMi4zLjIuIFVzaW5nIGFuIGBhc2AgZXhwcmVzc2lvbgorICAvLyBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkgd2Fzbid0IHN1cHBvcnRlZCBpbiBlYXJsaWVyCiAgIC8vIHZlcnNpb25zLCBzbyB0aGlzIGNvZGUgd29uJ3QgYmUgYWJsZSB0byBydW4gYWdhaW5zdCBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZQogICAvLyBTREsuCiAgIC8vCkBAIC0xNjY4LDggKzE2NzUsOCBAQAogICAvLyBgYGAKICAgLy8KICAgLy8gSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgU0RLLCB0aGVuIGVpdGhlciByZXdyaXRlIHRoZQotICAvLyBjb2RlIHRvIG5vdCB1c2UgYW4gYXMgZXhwcmVzc2lvbiwgb3IgY2hhbmdlIHRoZSBjb2RlIHNvIHRoYXQgdGhlIGFzCi0gIC8vIGV4cHJlc3Npb24gaXMgbm90IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KS46CisgIC8vIGNvZGUgdG8gbm90IHVzZSBhbiBgYXNgIGV4cHJlc3Npb24sIG9yIGNoYW5nZSB0aGUgY29kZSBzbyB0aGF0IHRoZSBgYXNgCisgIC8vIGV4cHJlc3Npb24gaXNuJ3QgaW4gYSBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vIG51bSB4ID0gMzsKQEAgLTE2ODgsNyArMTY5NSw3IEBACiAgICAqLwogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCi0gIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbnkgdXNlIG9mIHRoZSBgJmAsIGB8YCBvciBgXmAKKyAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFueSB1c2Ugb2YgdGhlIGAmYCwgYHxgLCBvciBgXmAKICAgLy8gb3BlcmF0b3JzIG9uIHRoZSBjbGFzcyBgYm9vbGAgaW5zaWRlIGEKICAgLy8gW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSBpcyBmb3VuZCBpbiBjb2RlIHRoYXQgaGFzIGFuIFNESwogICAvLyBjb25zdHJhaW50IHdob3NlIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiAyLjMuMi4gVXNpbmcgdGhlc2Ugb3BlcmF0b3JzIGluIGEKQEAgLTE3MjcsNyArMTczNCw3IEBACiAgIC8vCiAgIC8vIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiBlaXRoZXIgcmV3cml0ZSB0aGUKICAgLy8gY29kZSB0byBub3QgdXNlIHRoZXNlIG9wZXJhdG9ycywgb3IgY2hhbmdlIHRoZSBjb2RlIHNvIHRoYXQgdGhlIGV4cHJlc3Npb24KLSAgLy8gaXMgbm90IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KS46CisgIC8vIGlzbid0IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KToKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyBjb25zdCBib29sIGEgPSB0cnVlOwpAQCAtMTc4Nyw3ICsxNzk0LDcgQEAKICAgLy8KICAgLy8gSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgU0RLLCB0aGVuIGVpdGhlciByZXdyaXRlIHRoZQogICAvLyBjb2RlIHRvIG5vdCB1c2UgdGhlIGA9PWAgb3BlcmF0b3IsIG9yIGNoYW5nZSB0aGUgY29kZSBzbyB0aGF0IHRoZQotICAvLyBleHByZXNzaW9uIGlzIG5vdCBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkuOgorICAvLyBleHByZXNzaW9uIGlzbid0IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KToKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyBjbGFzcyBDIHt9CkBAIC0xOTI2LDEwICsxOTMzLDEwIEBACiAgICAqLwogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCi0gIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBpcyBleHByZXNzaW9uIGluc2lkZSBhCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBgaXNgIGV4cHJlc3Npb24gaW5zaWRlIGEKICAgLy8gW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSBpcyBmb3VuZCBpbiBjb2RlIHRoYXQgaGFzIGFuIFNESwotICAvLyBjb25zdHJhaW50IHdob3NlIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiAyLjMuMi4gVXNpbmcgYW4gaXMgZXhwcmVzc2lvbiBpbgotICAvLyBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkgd2Fzbid0IHN1cHBvcnRlZCBpbiBlYXJsaWVyCisgIC8vIGNvbnN0cmFpbnQgd2hvc2UgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIDIuMy4yLiBVc2luZyBhbiBgaXNgIGV4cHJlc3Npb24KKyAgLy8gaW4gYSBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpIHdhc24ndCBzdXBwb3J0ZWQgaW4gZWFybGllcgogICAvLyB2ZXJzaW9ucywgc28gdGhpcyBjb2RlIHdvbid0IGJlIGFibGUgdG8gcnVuIGFnYWluc3QgZWFybGllciB2ZXJzaW9ucyBvZiB0aGUKICAgLy8gU0RLLgogICAvLwpAQCAtMTk2Myw5ICsxOTcwLDkgQEAKICAgLy8gYGBgCiAgIC8vCiAgIC8vIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiBlaXRoZXIgcmV3cml0ZSB0aGUKLSAgLy8gY29kZSB0byBub3QgdXNlIHRoZSBpcyBvcGVyYXRvciwgb3IsIGlmIHRoYXQncyBub3QgcG9zc2libGUsIGNoYW5nZSB0aGUKLSAgLy8gY29kZSBzbyB0aGF0IHRoZSBpcyBleHByZXNzaW9uIGlzIG5vdCBpbiBhCi0gIC8vIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkuOgorICAvLyBjb2RlIHRvIG5vdCB1c2UgdGhlIGBpc2Agb3BlcmF0b3IsIG9yLCBpZiB0aGF0IGlzbid0IHBvc3NpYmxlLCBjaGFuZ2UgdGhlCisgIC8vIGNvZGUgc28gdGhhdCB0aGUgYGlzYCBleHByZXNzaW9uIGlzbid0IGluIGEKKyAgLy8gW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KToKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyBjb25zdCB4ID0gNDsKQEAgLTIwODAsNyArMjA4Nyw3IEBACiAgICAgICAvLyAgICBUaGUgdHlwZSAnTmV2ZXInIHdhc24ndCBzdXBwb3J0ZWQgdW50aWwgdmVyc2lvbiAyLlguMCwgYnV0IHRoaXMgY29kZQogICAgICAgLy8gICAgaXMgcmVxdWlyZWQgdG8gYmUgYWJsZSB0byBydW4gb24gZWFybGllciB2ZXJzaW9ucy4KICAgICAgICdTREtfVkVSU0lPTl9ORVZFUicsCi0gICAgICAiVGhlIHR5cGUgTmV2ZXIgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7CisgICAgICAiVGhlIHR5cGUgTmV2ZXIgaXNuJ3QgeWV0IHN1cHBvcnRlZC4iKTsKIAogICAvKioKICAgICogTm8gcGFyYW1ldGVycy4KQEAgLTIxOTEsOCArMjE5OCw4IEBACiAgIC8vIGNvbnN0IGIgPSBbMSwgMl07CiAgIC8vIGBgYAogICAvLwotICAvLyBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlLCBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgaW4gYQotICAvLyBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpLjoKKyAgLy8gSWYgdGhhdCBpc24ndCBwb3NzaWJsZSwgY2hhbmdlIHRoZSBjb2RlIHNvIHRoYXQgdGhlIGVsZW1lbnQgaXNuJ3QgaW4gYQorICAvLyBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vIGNvbnN0IGEgPSBbMSwgMl07CkBAIC0yNDIxLDcgKzI0MjgsOCBAQAogICAgICAgICAgICdVTk5FQ0VTU0FSWV9OVUxMX0NPTVBBUklTT05fRkFMU0UnLAogICAgICAgICAgICJUaGUgb3BlcmFuZCBjYW4ndCBiZSBudWxsLCBzbyB0aGUgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZS4iLAogICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIGNvbmRpdGlvbiwgYW4gZW5jbG9zaW5nIGNvbmRpdGlvbiwgIgotICAgICAgICAgICAgICAib3IgdGhlIHdob2xlIGNvbmRpdGlvbmFsIHN0YXRlbWVudC4iKTsKKyAgICAgICAgICAgICAgIm9yIHRoZSB3aG9sZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogTm8gcGFyYW1ldGVycy4KQEAgLTI0MzEsNyArMjQzOSw4IEBACiAgICAgICAgICAgJ1VOTkVDRVNTQVJZX05VTExfQ09NUEFSSVNPTicsCiAgICAgICAgICAgJ1VOTkVDRVNTQVJZX05VTExfQ09NUEFSSVNPTl9UUlVFJywKICAgICAgICAgICAiVGhlIG9wZXJhbmQgY2FuJ3QgYmUgbnVsbCwgc28gdGhlIGNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZS4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJSZW1vdmUgdGhlIGNvbmRpdGlvbi4iKTsKKyAgICAgICAgICBjb3JyZWN0aW9uOiAiUmVtb3ZlIHRoZSBjb25kaXRpb24uIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogVW5uZWNlc3NhcnkgdHlwZSBjaGVja3MsIHRoZSByZXN1bHQgaXMgYWx3YXlzIGZhbHNlLgpAQCAtMjQ2MSw5ICsyNDcwLDkgQEAKICAgICovCiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KLSAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgY2F0Y2ggY2xhdXNlIGlzIGZvdW5kLCBhbmQKKyAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgYGNhdGNoYCBjbGF1c2UgaXMgZm91bmQsIGFuZAogICAvLyBuZWl0aGVyIHRoZSBleGNlcHRpb24gcGFyYW1ldGVyIG5vciB0aGUgb3B0aW9uYWwgc3RhY2sgdHJhY2UgcGFyYW1ldGVyIGFyZQotICAvLyB1c2VkIGluIHRoZSBjYXRjaCBibG9jay4KKyAgLy8gdXNlZCBpbiB0aGUgYGNhdGNoYCBibG9jay4KICAgLy8KICAgLy8gIyMjIyBFeGFtcGxlcwogICAvLwpAQCAtMjQ4MSw3ICsyNDkwLDcgQEAKICAgLy8KICAgLy8gIyMjIyBDb21tb24gZml4ZXMKICAgLy8KLSAgLy8gUmVtb3ZlIHRoZSB1bnVzZWQgY2F0Y2ggY2xhdXNlOgorICAvLyBSZW1vdmUgdGhlIHVudXNlZCBgY2F0Y2hgIGNsYXVzZToKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyB2b2lkIGYoKSB7CkBAIC0yNTA5LDcgKzI1MTgsNyBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgc3RhY2sgdHJhY2UgcGFyYW1ldGVyIGluIGEKLSAgLy8gY2F0Y2ggY2xhdXNlIGlzbid0IHJlZmVyZW5jZWQgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBjYXRjaCBibG9jay4KKyAgLy8gYGNhdGNoYCBjbGF1c2UgaXNuJ3QgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGBjYXRjaGAgYmxvY2suCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvZXJyb3Ivc3ludGFjdGljX2Vycm9ycy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9zeW50YWN0aWNfZXJyb3JzLmRhcnQKaW5kZXggNTBmNGRkNS4uOGQwM2M5NCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9zeW50YWN0aWNfZXJyb3JzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci9zeW50YWN0aWNfZXJyb3JzLmRhcnQKQEAgLTIsNiArMiwxMCBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKy8vIEl0IGlzIGhhcmQgdG8gdmlzdWFsbHkgc2VwYXJhdGUgZWFjaCBjb2RlJ3MgX2RvYyBjb21tZW50XyBmcm9tIGl0cyBwdWJsaXNoZWQKKy8vIF9kb2N1bWVudGF0aW9uIGNvbW1lbnRfIHdoZW4gZWFjaCBpcyB3cml0dGVuIGFzIGFuIGVuZC1vZi1saW5lIGNvbW1lbnQuCisvLyBpZ25vcmVfZm9yX2ZpbGU6IHNsYXNoX2Zvcl9kb2NfY29tbWVudHMKKwogLyoqCiAgKiBUaGUgZXJyb3JzIHByb2R1Y2VkIGR1cmluZyBzeW50YWN0aWMgYW5hbHlzaXMgKHNjYW5uaW5nIGFuZCBwYXJzaW5nKS4KICAqLwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9lcnJvci90b2RvX2NvZGVzLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2Vycm9yL3RvZG9fY29kZXMuZGFydAppbmRleCAyMjYxM2RkLi5mZTZlZDk3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2Vycm9yL3RvZG9fY29kZXMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L2Vycm9yL3RvZG9fY29kZXMuZGFydApAQCAtNCw2ICs0LDEwIEBACiAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKIAorLy8gSXQgaXMgaGFyZCB0byB2aXN1YWxseSBzZXBhcmF0ZSBlYWNoIGNvZGUncyBfZG9jIGNvbW1lbnRfIGZyb20gaXRzIHB1Ymxpc2hlZAorLy8gX2RvY3VtZW50YXRpb24gY29tbWVudF8gd2hlbiBlYWNoIGlzIHdyaXR0ZW4gYXMgYW4gZW5kLW9mLWxpbmUgY29tbWVudC4KKy8vIGlnbm9yZV9mb3JfZmlsZTogc2xhc2hfZm9yX2RvY19jb21tZW50cworCiAvKioKICAqIFRoZSBlcnJvciBjb2RlIGluZGljYXRpbmcgYSBtYXJrZXIgaW4gY29kZSBmb3Igd29yayB0aGF0IG5lZWRzIHRvIGJlIGZpbmlzaGVkCiAgKiBvciByZXZpc2l0ZWQuCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL2FuYWx5c2lzX2NvbnRleHQuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vYW5hbHlzaXNfY29udGV4dC5kYXJ0CmluZGV4IDYwZGU3NTYuLjJkM2VlNzYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vYW5hbHlzaXNfY29udGV4dC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vYW5hbHlzaXNfY29udGV4dC5kYXJ0CkBAIC0xMjgsNyArMTI4LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogCiAgIFdvcmtzcGFjZSBfYnVpbGRXb3Jrc3BhY2UoKSB7CiAgICAgU3RyaW5nIHBhdGggPSBjb250ZXh0Um9vdC5yb290LnBhdGg7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQogCiBjbGFzcyBfVXJpQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIFVyaUNvbnZlcnRlciB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL2NpZGVyX2J5dGVfc3RvcmUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vY2lkZXJfYnl0ZV9zdG9yZS5kYXJ0CmluZGV4IGFmNmIzYWYuLjYwZThkMGYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vY2lkZXJfYnl0ZV9zdG9yZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vY2lkZXJfYnl0ZV9zdG9yZS5kYXJ0CkBAIC00LDI2ICs0LDIyIEBACiAKIGltcG9ydCAncGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydCc7CiAKLS8qKgotICogU3RvcmUgb2YgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIHN0cmluZyBrZXlzIGFuZCBhIGhhc2guCi0gKgotICogRWFjaCBrZXkgbXVzdCBiZSBub3QgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGNvbnNpc3Qgb2Ygb25seSBgW2Etel1gLAotICogYFswLTldYCwgYC5gIGFuZCBgX2AgY2hhcmFjdGVycy4gVGhlIGtleSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nLCB0aGUKLSAqIGxpdGVyYWwgYC5gLCBvciBjb250YWluIHRoZSBzZXF1ZW5jZSBgLi5gLgotICoKLSAqIE5vdGUgdGhhdCBhc3NvY2lhdGlvbnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHBlcnNpc3RlbnQuIFRoZSB2YWx1ZQotICogYXNzb2NpYXRlZCB3aXRoIGEga2V5IGNhbiBjaGFuZ2Ugb3IgYmVjb21lIGBudWxsYCBhdCBhbnkgcG9pbnQgaW4gdGltZS4KLSAqLworLy8vIFN0b3JlIG9mIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCBzdHJpbmcga2V5cyBhbmQgYSBoYXNoLgorLy8vCisvLy8gRWFjaCBrZXkgbXVzdCBiZSBub3QgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGNvbnNpc3Qgb2Ygb25seSBgW2Etel1gLAorLy8vIGBbMC05XWAsIGAuYCBhbmQgYF9gIGNoYXJhY3RlcnMuIFRoZSBrZXkgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZywgdGhlCisvLy8gbGl0ZXJhbCBgLmAsIG9yIGNvbnRhaW4gdGhlIHNlcXVlbmNlIGAuLmAuCisvLy8KKy8vLyBOb3RlIHRoYXQgYXNzb2NpYXRpb25zIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBwZXJzaXN0ZW50LiBUaGUgdmFsdWUKKy8vLyBhc3NvY2lhdGVkIHdpdGggYSBrZXkgY2FuIGNoYW5nZSBvciBiZWNvbWUgYG51bGxgIGF0IGFueSBwb2ludCBpbiB0aW1lLgogYWJzdHJhY3QgY2xhc3MgQ2lkZXJCeXRlU3RvcmUgewotICAvKioKLSAgICogUmV0dXJuIHRoZSBieXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9ycyBmb3IgZ2l2ZW4gW2tleV0gYW5kIFtzaWduYXR1cmVdLgotICAgKiBSZXR1cm4gYG51bGxgIGlmIHRoZSBhc3NvY2lhdGlvbiBkb2VzIG5vdCBleGlzdC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3JzIGZvciBnaXZlbiBba2V5XSBhbmQKKyAgLy8vIFtzaWduYXR1cmVdLgorICAvLy8KKyAgLy8vIFJldHVybiBgbnVsbGAgaWYgdGhlIGFzc29jaWF0aW9uIGRvZXMgbm90IGV4aXN0LgogICBMaXN0PGludD4gZ2V0KFN0cmluZyBrZXksIExpc3Q8aW50PiBzaWduYXR1cmUpOwogCi0gIC8qKgotICAgKiBBc3NvY2lhdGUgdGhlIGdpdmVuIFtieXRlc10gd2l0aCB0aGUgW2tleV0gYW5kIFtkaWdlc3RdLgotICAgKi8KKyAgLy8vIEFzc29jaWF0ZSB0aGUgZ2l2ZW4gW2J5dGVzXSB3aXRoIHRoZSBba2V5XSBhbmQgW2RpZ2VzdF0uCiAgIHZvaWQgcHV0KFN0cmluZyBrZXksIExpc3Q8aW50PiBzaWduYXR1cmUsIExpc3Q8aW50PiBieXRlcyk7CiB9CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9hbmFseXplci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9taWNyby9saWJyYXJ5X2FuYWx5emVyLmRhcnQKaW5kZXggM2VjY2RiOS4uNDRiYzY2NWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9hbmFseXplci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9hbmFseXplci5kYXJ0CkBAIC0xOSwxMSArMTksMTIgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9saWJyYXJ5X2dyYXBoLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L21pY3JvL3BlcmZvcm1hbmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9sZWdhY3lfdHlwZV9hc3NlcnRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Zpc2l0b3IuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2Jlc3RfcHJhY3RpY2VzX3ZlcmlmaWVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvZGFydDJqc192ZXJpZmllci5kYXJ0JzsKQEAgLTQ1LDEzICs0NiwxMiBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zZXJ2aWNlcy9saW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5rZWRfZWxlbWVudF9mYWN0b3J5LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvd29ya3NwYWNlL3dvcmtzcGFjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6cHViX3NlbXZlci9wdWJfc2VtdmVyLmRhcnQnOwogCi0vKioKLSAqIEFuYWx5emVyIG9mIGEgc2luZ2xlIGxpYnJhcnkuCi0gKi8KKy8vLyBBbmFseXplciBvZiBhIHNpbmdsZSBsaWJyYXJ5LgogY2xhc3MgTGlicmFyeUFuYWx5emVyIHsKICAgLy8vIEEgbWFya2VyIG9iamVjdCB1c2VkIHRvIHByZXZlbnQgdGhlIGluaXRpYWxpemF0aW9uIG9mCiAgIC8vLyBbX3ZlcnNpb25Db25zdHJhaW50RnJvbVB1YnNwZWNdIHdoZW4gdGhlIHByZXZpb3VzIGluaXRpYWxpemF0aW9uIGF0dGVtcHQKQEAgLTc5LDExICs3OSw5IEBACiAgIGZpbmFsIExpc3Q8VXNlZEltcG9ydGVkRWxlbWVudHM+IF91c2VkSW1wb3J0ZWRFbGVtZW50c0xpc3QgPSBbXTsKICAgZmluYWwgTGlzdDxVc2VkTG9jYWxFbGVtZW50cz4gX3VzZWRMb2NhbEVsZW1lbnRzTGlzdCA9IFtdOwogCi0gIC8qKgotICAgKiBDb25zdGFudHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLSAgICoKLSAgICogVE9ETyhzY2hlZ2xvdikgUmVtb3ZlIGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zMTkyNQotICAgKi8KKyAgLy8vIENvbnN0YW50cyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgorICAvLy8KKyAgLy8vIFRPRE8oc2NoZWdsb3YpIFJlbW92ZSBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzE5MjUKICAgZmluYWwgU2V0PENvbnN0YW50RXZhbHVhdGlvblRhcmdldD4gX2xpYnJhcnlDb25zdGFudHMgPSB7fTsKIAogICBmaW5hbCBTZXQ8Q29uc3RhbnRFdmFsdWF0aW9uVGFyZ2V0PiBfY29uc3RhbnRzID0ge307CkBAIC0xMDcsMTMgKzEwNSwxMSBAQAogCiAgIFR5cGVTeXN0ZW1JbXBsIGdldCBfdHlwZVN5c3RlbSA9PiBfbGlicmFyeUVsZW1lbnQudHlwZVN5c3RlbTsKIAotICAvKioKLSAgICogQ29tcHV0ZSBhbmFseXNpcyByZXN1bHRzIGZvciBhbGwgdW5pdHMgb2YgdGhlIGxpYnJhcnkuCi0gICAqLworICAvLy8gQ29tcHV0ZSBhbmFseXNpcyByZXN1bHRzIGZvciBhbGwgdW5pdHMgb2YgdGhlIGxpYnJhcnkuCiAgIE1hcDxGaWxlU3RhdGUsIFVuaXRBbmFseXNpc1Jlc3VsdD4gYW5hbHl6ZVN5bmMoewogICAgIEByZXF1aXJlZCBTdHJpbmcgY29tcGxldGlvblBhdGgsCiAgICAgQHJlcXVpcmVkIGludCBjb21wbGV0aW9uT2Zmc2V0LAotICAgIEByZXF1aXJlZCBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICBAcmVxdWlyZWQgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIHBlcmZvcm1hbmNlLAogICB9KSB7CiAgICAgdmFyIGZvckNvbXBsZXRpb24gPSBjb21wbGV0aW9uUGF0aCAhPSBudWxsOwogICAgIHZhciB1bml0cyA9IDxGaWxlU3RhdGUsIENvbXBpbGF0aW9uVW5pdD57fTsKQEAgLTE3NSwxNSArMTcxLDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdHM7CiAgIH0KIAotICAvKioKLSAgICogQ2xlYXIgZXZhbHVhdGlvbiByZXN1bHRzIGZvciBhbGwgY29uc3RhbnRzIGJlZm9yZSBjb21wdXRpbmcgdGhlbSBhZ2Fpbi4KLSAgICogVGhlIHJlYXNvbiBpcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzM1OTQwCi0gICAqCi0gICAqIE90aGVyd2lzZSwgd2UgcmV1c2UgcmVzdWx0cywgaW5jbHVkaW5nIGVycm9ycyBhcmUgcmVjb3JkZWQgb25seSB3aGVuCi0gICAqIHdlIGV2YWx1YXRlIGNvbnN0YW50cyByZXN5bnRoZXNpemVkIGZyb20gc3VtbWFyaWVzLgotICAgKgotICAgKiBUT0RPKHNjaGVnbG92KSBSZW1vdmUgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMxOTI1Ci0gICAqLworICAvLy8gQ2xlYXIgZXZhbHVhdGlvbiByZXN1bHRzIGZvciBhbGwgY29uc3RhbnRzIGJlZm9yZSBjb21wdXRpbmcgdGhlbSBhZ2Fpbi4KKyAgLy8vIFRoZSByZWFzb24gaXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTk0MAorICAvLy8KKyAgLy8vIE90aGVyd2lzZSwgd2UgcmV1c2UgcmVzdWx0cywgaW5jbHVkaW5nIGVycm9ycyBhcmUgcmVjb3JkZWQgb25seSB3aGVuCisgIC8vLyB3ZSBldmFsdWF0ZSBjb25zdGFudHMgcmVzeW50aGVzaXplZCBmcm9tIHN1bW1hcmllcy4KKyAgLy8vCisgIC8vLyBUT0RPKHNjaGVnbG92KSBSZW1vdmUgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMxOTI1CiAgIHZvaWQgX2NsZWFyQ29uc3RhbnRFdmFsdWF0aW9uUmVzdWx0cygpIHsKICAgICBmb3IgKHZhciBjb25zdGFudCBpbiBfbGlicmFyeUNvbnN0YW50cykgewogICAgICAgaWYgKGNvbnN0YW50IGlzIENvbnN0RmllbGRFbGVtZW50SW1wbF9vZkVudW0pIGNvbnRpbnVlOwpAQCAtMjAxLDE2ICsxOTUsMTQgQEAKICAgICB1bml0LmFjY2VwdChjb25zdGFudFZlcmlmaWVyKTsKICAgfQogCi0gIC8qKgotICAgKiBDb21wdXRlIFtfY29uc3RhbnRzXSBpbiBhbGwgdW5pdHMuCi0gICAqLworICAvLy8gQ29tcHV0ZSBbX2NvbnN0YW50c10gaW4gYWxsIHVuaXRzLgogICB2b2lkIF9jb21wdXRlQ29uc3RhbnRzKCkgewogICAgIGNvbXB1dGVDb25zdGFudHMoX3R5cGVQcm92aWRlciwgX3R5cGVTeXN0ZW0sIF9kZWNsYXJlZFZhcmlhYmxlcywKICAgICAgICAgX2NvbnN0YW50cy50b0xpc3QoKSwgX2FuYWx5c2lzT3B0aW9ucy5leHBlcmltZW50U3RhdHVzKTsKICAgfQogCiAgIHZvaWQgX2NvbXB1dGVEaWFnbm9zdGljcyh7Ci0gICAgQHJlcXVpcmVkIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIHBlcmZvcm1hbmNlLAorICAgIEByZXF1aXJlZCBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCiAgICAgQHJlcXVpcmVkIE1hcDxGaWxlU3RhdGUsIENvbXBpbGF0aW9uVW5pdD4gdW5pdHMsCiAgIH0pIHsKICAgICBwZXJmb3JtYW5jZS5ydW4oJ2NvbXB1dGVWZXJpZnlFcnJvcnMnLCAocGVyZm9ybWFuY2UpIHsKQEAgLTQxMiwxMCArNDA0LDggQEAKICAgICB1bml0LmFjY2VwdChlcnJvclZlcmlmaWVyKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGdpdmVuIFtlcnJvcnNdIHRoYXQgYXJlIG5vdCBtYXJrZWQgYXMgaWdub3JlZCBpbgotICAgKiB0aGUgW2ZpbGVdLgotICAgKi8KKyAgLy8vIFJldHVybiBhIHN1YnNldCBvZiB0aGUgZ2l2ZW4gW2Vycm9yc10gdGhhdCBhcmUgbm90IG1hcmtlZCBhcyBpZ25vcmVkIGluCisgIC8vLyB0aGUgW2ZpbGVdLgogICBMaXN0PEFuYWx5c2lzRXJyb3I+IF9maWx0ZXJJZ25vcmVkRXJyb3JzKAogICAgICAgRmlsZVN0YXRlIGZpbGUsIExpc3Q8QW5hbHlzaXNFcnJvcj4gZXJyb3JzKSB7CiAgICAgaWYgKGVycm9ycy5pc0VtcHR5KSB7CkBAIC00NjAsOSArNDUwLDcgQEAKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBDYXRjaCBhbGwgZXhjZXB0aW9ucyBmcm9tIHRoZSBgZ2V0RmlsZUNvbnRlbnRgIGZ1bmN0aW9uLgotICAgKi8KKyAgLy8vIENhdGNoIGFsbCBleGNlcHRpb25zIGZyb20gdGhlIGBnZXRGaWxlQ29udGVudGAgZnVuY3Rpb24uCiAgIFN0cmluZyBfZ2V0RmlsZUNvbnRlbnQoU3RyaW5nIHBhdGgpIHsKICAgICB0cnkgewogICAgICAgcmV0dXJuIGdldEZpbGVDb250ZW50KHBhdGgpOwpAQCAtNDg4LDEwICs0NzYsOCBAQAogICAgIHJldHVybiB3b3Jrc3BhY2U/LmZpbmRQYWNrYWdlRm9yKGxpYnJhcnlQYXRoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgdGhhdCB0aGUgZ2l2ZW4gcGFydCBpcyBkZWNsYXJlZCB0byBiZSBhCi0gICAqIHBhcnQgb2YsIG9yIGBudWxsYCBpZiB0aGUgcGFydCBkb2VzIG5vdCBjb250YWluIGEgcGFydC1vZiBkaXJlY3RpdmUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHRoYXQgdGhlIGdpdmVuIHBhcnQgaXMgZGVjbGFyZWQgdG8gYmUgYQorICAvLy8gcGFydCBvZiwgb3IgYG51bGxgIGlmIHRoZSBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gYSBwYXJ0LW9mIGRpcmVjdGl2ZS4KICAgX05hbWVPclNvdXJjZSBfZ2V0UGFydExpYnJhcnlOYW1lT3JVcmkoU291cmNlIHBhcnRTb3VyY2UsCiAgICAgICBDb21waWxhdGlvblVuaXQgcGFydFVuaXQsIExpc3Q8RGlyZWN0aXZlPiBkaXJlY3RpdmVzVG9SZXNvbHZlKSB7CiAgICAgZm9yIChEaXJlY3RpdmUgZGlyZWN0aXZlIGluIHBhcnRVbml0LmRpcmVjdGl2ZXMpIHsKQEAgLTUyMiwxNiArNTA4LDEyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtzb3VyY2VdIGlzIGEgbGlicmFyeS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbc291cmNlXSBpcyBhIGxpYnJhcnkuCiAgIGJvb2wgX2lzTGlicmFyeVNvdXJjZShTb3VyY2Ugc291cmNlKSB7CiAgICAgcmV0dXJuIF9pc0xpYnJhcnlVcmkoc291cmNlLnVyaSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgIHBhcnNlZCB1bnJlc29sdmVkIFtDb21waWxhdGlvblVuaXRdLgotICAgKi8KKyAgLy8vIFJldHVybiBhICBwYXJzZWQgdW5yZXNvbHZlZCBbQ29tcGlsYXRpb25Vbml0XS4KICAgQ29tcGlsYXRpb25Vbml0IF9wYXJzZShGaWxlU3RhdGUgZmlsZSkgewogICAgIEFuYWx5c2lzRXJyb3JMaXN0ZW5lciBlcnJvckxpc3RlbmVyID0gX2dldEVycm9yTGlzdGVuZXIoZmlsZSk7CiAgICAgU3RyaW5nIGNvbnRlbnQgPSBfZ2V0RmlsZUNvbnRlbnQoZmlsZS5wYXRoKTsKQEAgLTcyOCwxMCArNzEwLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVzb2x2ZSB0aGUgZ2l2ZW4gW3VyaUNvbnRlbnRdLCByZXBvcnRpbmcgZXJyb3JzCi0gICAqIGFnYWluc3QgdGhlIFt1cmlMaXRlcmFsXS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiByZXNvbHZlIHRoZSBnaXZlbiBbdXJpQ29udGVudF0sIHJlcG9ydGluZyBlcnJvcnMKKyAgLy8vIGFnYWluc3QgdGhlIFt1cmlMaXRlcmFsXS4KICAgU291cmNlIF9yZXNvbHZlVXJpKEZpbGVTdGF0ZSBmaWxlLCBib29sIGlzSW1wb3J0LCBTdHJpbmdMaXRlcmFsIHVyaUxpdGVyYWwsCiAgICAgICBTdHJpbmcgdXJpQ29udGVudCkgewogICAgIFVyaVZhbGlkYXRpb25Db2RlIGNvZGUgPQpAQCAtNzc5LDEwICs3NTksOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGUgZ2l2ZW4gW2RpcmVjdGl2ZV0gdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIHNvdXJjZSBleGlzdHMgYW5kCi0gICAqIHJlcG9ydCBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdC4KLSAgICovCisgIC8vLyBDaGVjayB0aGUgZ2l2ZW4gW2RpcmVjdGl2ZV0gdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIHNvdXJjZSBleGlzdHMgYW5kCisgIC8vLyByZXBvcnQgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QuCiAgIHZvaWQgX3ZhbGlkYXRlVXJpQmFzZWREaXJlY3RpdmUoCiAgICAgICBGaWxlU3RhdGUgZmlsZSwgVXJpQmFzZWREaXJlY3RpdmVJbXBsIGRpcmVjdGl2ZSkgewogICAgIFNvdXJjZSBzb3VyY2UgPSBkaXJlY3RpdmUudXJpU291cmNlOwpAQCAtODA2LDEwICs3ODQsOCBAQAogICAgICAgICAucmVwb3J0RXJyb3JGb3JOb2RlKGVycm9yQ29kZSwgdXJpTGl0ZXJhbCwgW2RpcmVjdGl2ZS51cmlDb250ZW50XSk7CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgZWFjaCBkaXJlY3RpdmUgaW4gdGhlIGdpdmVuIFt1bml0XSB0byBzZWUgaWYgdGhlIHJlZmVyZW5jZWQgc291cmNlCi0gICAqIGV4aXN0cyBhbmQgcmVwb3J0IGFuIGVycm9yIGlmIGl0IGRvZXMgbm90LgotICAgKi8KKyAgLy8vIENoZWNrIGVhY2ggZGlyZWN0aXZlIGluIHRoZSBnaXZlbiBbdW5pdF0gdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIHNvdXJjZQorICAvLy8gZXhpc3RzIGFuZCByZXBvcnQgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QuCiAgIHZvaWQgX3ZhbGlkYXRlVXJpQmFzZWREaXJlY3RpdmVzKEZpbGVTdGF0ZSBmaWxlLCBDb21waWxhdGlvblVuaXQgdW5pdCkgewogICAgIGZvciAoRGlyZWN0aXZlIGRpcmVjdGl2ZSBpbiB1bml0LmRpcmVjdGl2ZXMpIHsKICAgICAgIGlmIChkaXJlY3RpdmUgaXMgVXJpQmFzZWREaXJlY3RpdmUpIHsKQEAgLTgxOCwxMCArNzk0LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3NvdXJjZV0gcmVmZXJzIHRvIGEgZmlsZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUKLSAgICogZ2VuZXJhdGVkLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtzb3VyY2VdIHJlZmVycyB0byBhIGZpbGUgdGhhdCBpcyBhc3N1bWVkIHRvIGJlCisgIC8vLyBnZW5lcmF0ZWQuCiAgIHN0YXRpYyBib29sIF9pc0dlbmVyYXRlZChTb3VyY2Ugc291cmNlKSB7CiAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC04NDUsOSArODE5LDcgQEAKICAgfQogfQogCi0vKioKLSAqIEFuYWx5c2lzIHJlc3VsdCBmb3Igc2luZ2xlIGZpbGUuCi0gKi8KKy8vLyBBbmFseXNpcyByZXN1bHQgZm9yIHNpbmdsZSBmaWxlLgogY2xhc3MgVW5pdEFuYWx5c2lzUmVzdWx0IHsKICAgZmluYWwgRmlsZVN0YXRlIGZpbGU7CiAgIGZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0OwpAQCAtODU2LDkgKzgyOCw3IEBACiAgIFVuaXRBbmFseXNpc1Jlc3VsdCh0aGlzLmZpbGUsIHRoaXMudW5pdCwgdGhpcy5lcnJvcnMpOwogfQogCi0vKioKLSAqIEVpdGhlciB0aGUgbmFtZSBvciB0aGUgc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnQtb2YgZGlyZWN0aXZlLgotICovCisvLy8gRWl0aGVyIHRoZSBuYW1lIG9yIHRoZSBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgcGFydC1vZiBkaXJlY3RpdmUuCiBjbGFzcyBfTmFtZU9yU291cmNlIHsKICAgZmluYWwgU3RyaW5nIG5hbWU7CiAgIGZpbmFsIFNvdXJjZSBzb3VyY2U7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL2xpYnJhcnlfZ3JhcGguZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9ncmFwaC5kYXJ0CmluZGV4IDA1OTUxNWMuLjFiODE4ZWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9ncmFwaC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9ncmFwaC5kYXJ0CkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvZmVhdHVyZV9zZXRfcHJvdmlkZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvcGVyZm9ybWFuY2VfbG9nZ2VyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3VubGlua2VkX2FwaV9zaWduYXR1cmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9jaWRlcl9ieXRlX3N0b3JlLmRhcnQnOwpAQCAtMzAsNyArMjksOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2xpbmsuZGFydCcgYXMgZ3JhcGgKICAgICBzaG93IERlcGVuZGVuY3lXYWxrZXIsIE5vZGU7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2luZm9ybWF0aXZlX2RhdGEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwvcGVyZm9ybWFuY2Uvb3BlcmF0aW9uX3BlcmZvcm1hbmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmNvbnZlcnQvY29udmVydC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIC8vLyBFbnN1cmUgdGhhdCB0aGUgW0ZpbGVTdGF0ZS5saWJyYXJ5Q3ljbGVdIGZvciB0aGUgW2ZpbGVdIGFuZCBhbnl0aGluZyBpdAogLy8vIGRlcGVuZHMgb24gaXMgY29tcHV0ZWQuCkBAIC00MiwxOSArNDMsMTMgQEAKIGNsYXNzIEZpbGVTdGF0ZSB7CiAgIGZpbmFsIEZpbGVTeXN0ZW1TdGF0ZSBfZnNTdGF0ZTsKIAotICAvKioKLSAgICogVGhlIHBhdGggb2YgdGhlIGZpbGUuCi0gICAqLworICAvLy8gVGhlIHBhdGggb2YgdGhlIGZpbGUuCiAgIGZpbmFsIFN0cmluZyBwYXRoOwogCi0gIC8qKgotICAgKiBUaGUgVVJJIG9mIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIFRoZSBVUkkgb2YgdGhlIGZpbGUuCiAgIGZpbmFsIFVyaSB1cmk7CiAKLSAgLyoqCi0gICAqIFRoZSBbU291cmNlXSBvZiB0aGUgZmlsZSB3aXRoIHRoZSBbdXJpXS4KLSAgICovCisgIC8vLyBUaGUgW1NvdXJjZV0gb2YgdGhlIGZpbGUgd2l0aCB0aGUgW3VyaV0uCiAgIGZpbmFsIFNvdXJjZSBzb3VyY2U7CiAKICAgLy8vIEZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoaXMgZmlsZS4KQEAgLTE2NywxMCArMTYyLDEyIEBACiAgICAgcmV0dXJuIHVuaXQ7CiAgIH0KIAotICB2b2lkIHJlZnJlc2goKSB7CisgIHZvaWQgcmVmcmVzaCh7CisgICAgQHJlcXVpcmVkIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgfSkgewogICAgIF9mc1N0YXRlLnRlc3RWaWV3LnJlZnJlc2hlZEZpbGVzLmFkZChwYXRoKTsKIAotICAgIF9mc1N0YXRlLnRpbWVycy5kaWdlc3QucnVuKCgpIHsKKyAgICBwZXJmb3JtYW5jZS5ydW4oJ2RpZ2VzdCcsIChfKSB7CiAgICAgICBfZGlnZXN0ID0gdXRmOC5lbmNvZGUoX2ZzU3RhdGUuZ2V0RmlsZURpZ2VzdChwYXRoKSk7CiAgICAgICBfZXhpc3RzID0gX2RpZ2VzdC5pc05vdEVtcHR5OwogICAgIH0pOwpAQCAtMTgzLDE5ICsxODAsMjEgQEAKICAgICAgIGJ5dGVzID0gX2ZzU3RhdGUuX2J5dGVTdG9yZS5nZXQodW5saW5rZWRLZXksIF9kaWdlc3QpOwogCiAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCB8fCBieXRlcy5pc0VtcHR5KSB7Ci0gICAgICAgIHZhciBjb250ZW50ID0gX2ZzU3RhdGUudGltZXJzLnJlYWQucnVuKCgpIHsKKyAgICAgICAgdmFyIGNvbnRlbnQgPSBwZXJmb3JtYW5jZS5ydW4oJ2NvbnRlbnQnLCAoXykgewogICAgICAgICAgIHJldHVybiBnZXRDb250ZW50KCk7CiAgICAgICAgIH0pOwotICAgICAgICB2YXIgdW5pdCA9IF9mc1N0YXRlLnRpbWVycy5wYXJzZS5ydW4oKCkgeworCisgICAgICAgIHZhciB1bml0ID0gcGVyZm9ybWFuY2UucnVuKCdwYXJzZScsIChfKSB7CiAgICAgICAgICAgcmV0dXJuIHBhcnNlKEFuYWx5c2lzRXJyb3JMaXN0ZW5lci5OVUxMX0xJU1RFTkVSLCBjb250ZW50KTsKICAgICAgICAgfSk7Ci0gICAgICAgIF9mc1N0YXRlLnRpbWVycy51bmxpbmtlZC5ydW4oKCkgeworCisgICAgICAgIHBlcmZvcm1hbmNlLnJ1bigndW5saW5rZWQnLCAoXykgewogICAgICAgICAgIHZhciB1bmxpbmtlZEJ1aWxkZXIgPSBzZXJpYWxpemVBc3RDaWRlclVubGlua2VkKF9kaWdlc3QsIHVuaXQpOwogICAgICAgICAgIGJ5dGVzID0gdW5saW5rZWRCdWlsZGVyLnRvQnVmZmVyKCk7CiAgICAgICAgICAgX2ZzU3RhdGUuX2J5dGVTdG9yZS5wdXQodW5saW5rZWRLZXksIF9kaWdlc3QsIGJ5dGVzKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgX2ZzU3RhdGUudGltZXJzLnByZWZldGNoLnJ1bigoKSB7CisgICAgICAgIHBlcmZvcm1hbmNlLnJ1bigncHJlZmV0Y2gnLCAoXykgewogICAgICAgICAgIHVubGlua2VkMiA9IENpZGVyVW5saW5rZWRVbml0LmZyb21CdWZmZXIoYnl0ZXMpLnVubGlua2VkVW5pdDsKICAgICAgICAgICBfcHJlZmV0Y2hEaXJlY3RSZWZlcmVuY2VzKHVubGlua2VkMik7CiAgICAgICAgIH0pOwpAQCAtMjA4LDE5ICsyMDcsMjggQEAKIAogICAgIC8vIEJ1aWxkIHRoZSBncmFwaC4KICAgICBmb3IgKHZhciBkaXJlY3RpdmUgaW4gdW5saW5rZWQyLmltcG9ydHMpIHsKLSAgICAgIHZhciBmaWxlID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaShkaXJlY3RpdmUudXJpKTsKKyAgICAgIHZhciBmaWxlID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaSgKKyAgICAgICAgcmVsYXRpdmVVcmk6IGRpcmVjdGl2ZS51cmksCisgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICk7CiAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CiAgICAgICAgIGltcG9ydGVkRmlsZXMuYWRkKGZpbGUpOwogICAgICAgfQogICAgIH0KICAgICBmb3IgKHZhciBkaXJlY3RpdmUgaW4gdW5saW5rZWQyLmV4cG9ydHMpIHsKLSAgICAgIHZhciBmaWxlID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaShkaXJlY3RpdmUudXJpKTsKKyAgICAgIHZhciBmaWxlID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaSgKKyAgICAgICAgcmVsYXRpdmVVcmk6IGRpcmVjdGl2ZS51cmksCisgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICk7CiAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CiAgICAgICAgIGV4cG9ydGVkRmlsZXMuYWRkKGZpbGUpOwogICAgICAgfQogICAgIH0KICAgICBmb3IgKHZhciB1cmkgaW4gdW5saW5rZWQyLnBhcnRzKSB7Ci0gICAgICB2YXIgZmlsZSA9IF9maWxlRm9yUmVsYXRpdmVVcmkodXJpKTsKKyAgICAgIHZhciBmaWxlID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaSgKKyAgICAgICAgcmVsYXRpdmVVcmk6IHVyaSwKKyAgICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlLAorICAgICAgKTsKICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKICAgICAgICAgcGFydGVkRmlsZXMuYWRkKGZpbGUpOwogICAgICAgfQpAQCAtMjI4LDcgKzIzNiwxMCBAQAogICAgIGlmICh1bmxpbmtlZDIuaGFzUGFydE9mRGlyZWN0aXZlKSB7CiAgICAgICB2YXIgdXJpID0gdW5saW5rZWQyLnBhcnRPZlVyaTsKICAgICAgIGlmICh1cmkuaXNOb3RFbXB0eSkgewotICAgICAgICBwYXJ0T2ZMaWJyYXJ5ID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaSh1cmkpOworICAgICAgICBwYXJ0T2ZMaWJyYXJ5ID0gX2ZpbGVGb3JSZWxhdGl2ZVVyaSgKKyAgICAgICAgICByZWxhdGl2ZVVyaTogdXJpLAorICAgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICAgKTsKICAgICAgICAgaWYgKHBhcnRPZkxpYnJhcnkgIT0gbnVsbCkgewogICAgICAgICAgIGRpcmVjdFJlZmVyZW5jZWRGaWxlcy5hZGQocGFydE9mTGlicmFyeSk7CiAgICAgICAgIH0KQEAgLTI1MCw3ICsyNjEsMTAgQEAKICAgICByZXR1cm4gcGF0aDsKICAgfQogCi0gIEZpbGVTdGF0ZSBfZmlsZUZvclJlbGF0aXZlVXJpKFN0cmluZyByZWxhdGl2ZVVyaSkgeworICBGaWxlU3RhdGUgX2ZpbGVGb3JSZWxhdGl2ZVVyaSh7CisgICAgQHJlcXVpcmVkIFN0cmluZyByZWxhdGl2ZVVyaSwKKyAgICBAcmVxdWlyZWQgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIHBlcmZvcm1hbmNlLAorICB9KSB7CiAgICAgaWYgKHJlbGF0aXZlVXJpLmlzRW1wdHkpIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI2Miw3ICsyNzYsMTAgQEAKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHZhciBmaWxlID0gX2ZzU3RhdGUuZ2V0RmlsZUZvclVyaShhYnNvbHV0ZVVyaSk7CisgICAgdmFyIGZpbGUgPSBfZnNTdGF0ZS5nZXRGaWxlRm9yVXJpKAorICAgICAgdXJpOiBhYnNvbHV0ZVVyaSwKKyAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICApOwogICAgIGlmIChmaWxlID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTM3OCwxOCArMzk1LDE1IEBACiB9CiAKIGNsYXNzIEZpbGVTeXN0ZW1TdGF0ZSB7Ci0gIGZpbmFsIFBlcmZvcm1hbmNlTG9nIF9sb2dnZXI7CiAgIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgX3Jlc291cmNlUHJvdmlkZXI7CiAgIGZpbmFsIENpZGVyQnl0ZVN0b3JlIF9ieXRlU3RvcmU7CiAgIGZpbmFsIFNvdXJjZUZhY3RvcnkgX3NvdXJjZUZhY3Rvcnk7CiAgIGZpbmFsIEFuYWx5c2lzT3B0aW9ucyBfYW5hbHlzaXNPcHRpb25zOwogICBmaW5hbCBVaW50MzJMaXN0IF9saW5rZWRTYWx0OwogCi0gIC8qKgotICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZGlnZXN0IGZvciBhIGZpbGUgYXMgYSBTdHJpbmcuIFRoZSBmdW5jdGlvbgotICAgKiByZXR1cm5zIGEgbm9uIG51bGwgdmFsdWUsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIGZpbGUgZG9lcwotICAgKiBub3QgZXhpc3QvaGFzIG5vIGNvbnRlbnRzLgotICAgKi8KKyAgLy8vIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkaWdlc3QgZm9yIGEgZmlsZSBhcyBhIFN0cmluZy4gVGhlIGZ1bmN0aW9uCisgIC8vLyByZXR1cm5zIGEgbm9uIG51bGwgdmFsdWUsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIGZpbGUgZG9lcworICAvLy8gbm90IGV4aXN0L2hhcyBubyBjb250ZW50cy4KICAgZmluYWwgU3RyaW5nIEZ1bmN0aW9uKFN0cmluZyBwYXRoKSBnZXRGaWxlRGlnZXN0OwogCiAgIGZpbmFsIE1hcDxTdHJpbmcsIEZpbGVTdGF0ZT4gX3BhdGhUb0ZpbGUgPSB7fTsKQEAgLTM5NywxOCArNDExLDE1IEBACiAKICAgZmluYWwgRmVhdHVyZVNldFByb3ZpZGVyIGZlYXR1cmVTZXRQcm92aWRlcjsKIAotICAvKioKLSAgICogQSBmdW5jdGlvbiB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQKLSAgICogdG8gYmF0Y2ggZmlsZSByZWFkcyBpbiBzeXN0ZW1zIHdoZXJlIGZpbGUgZmV0Y2hlcyBhcmUgZXhwZW5zaXZlLgotICAgKi8KKyAgLy8vIEEgZnVuY3Rpb24gdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIGZpbGVzLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCisgIC8vLyB0byBiYXRjaCBmaWxlIHJlYWRzIGluIHN5c3RlbXMgd2hlcmUgZmlsZSBmZXRjaGVzIGFyZSBleHBlbnNpdmUuCiAgIGZpbmFsIHZvaWQgRnVuY3Rpb24oTGlzdDxTdHJpbmc+IHBhdGhzKSBwcmVmZXRjaEZpbGVzOwogCi0gIGZpbmFsIEZpbGVTeXN0ZW1TdGF0ZVRpbWVycyB0aW1lcnMgPSBGaWxlU3lzdGVtU3RhdGVUaW1lcnMoKTsKKyAgZmluYWwgRmlsZVN5c3RlbVN0YXRlVGltZXJzIHRpbWVyczIgPSBGaWxlU3lzdGVtU3RhdGVUaW1lcnMoKTsKIAogICBmaW5hbCBGaWxlU3lzdGVtU3RhdGVUZXN0VmlldyB0ZXN0VmlldyA9IEZpbGVTeXN0ZW1TdGF0ZVRlc3RWaWV3KCk7CiAKICAgRmlsZVN5c3RlbVN0YXRlKAotICAgIHRoaXMuX2xvZ2dlciwKICAgICB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLAogICAgIHRoaXMuX2J5dGVTdG9yZSwKICAgICB0aGlzLl9zb3VyY2VGYWN0b3J5LApAQCAtNDQyLDcgKzQ1MywxMCBAQAogICAgIH0KICAgfQogCi0gIEZpbGVTdGF0ZSBnZXRGaWxlRm9yUGF0aChTdHJpbmcgcGF0aCkgeworICBGaWxlU3RhdGUgZ2V0RmlsZUZvclBhdGgoeworICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKKyAgICBAcmVxdWlyZWQgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIHBlcmZvcm1hbmNlLAorICB9KSB7CiAgICAgdmFyIGZpbGUgPSBfcGF0aFRvRmlsZVtwYXRoXTsKICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CiAgICAgICB2YXIgZmlsZVVyaSA9IF9yZXNvdXJjZVByb3ZpZGVyLnBhdGhDb250ZXh0LnRvVXJpKHBhdGgpOwpAQCAtNDU2LDEyICs0NzAsMTkgQEAKICAgICAgIF9wYXRoVG9GaWxlW3BhdGhdID0gZmlsZTsKICAgICAgIF91cmlUb0ZpbGVbdXJpXSA9IGZpbGU7CiAKLSAgICAgIGZpbGUucmVmcmVzaCgpOworICAgICAgcGVyZm9ybWFuY2UucnVuKCdyZWZyZXNoJywgKHBlcmZvcm1hbmNlKSB7CisgICAgICAgIGZpbGUucmVmcmVzaCgKKyAgICAgICAgICBwZXJmb3JtYW5jZTogcGVyZm9ybWFuY2UsCisgICAgICAgICk7CisgICAgICB9KTsKICAgICB9CiAgICAgcmV0dXJuIGZpbGU7CiAgIH0KIAotICBGaWxlU3RhdGUgZ2V0RmlsZUZvclVyaShVcmkgdXJpKSB7CisgIEZpbGVTdGF0ZSBnZXRGaWxlRm9yVXJpKHsKKyAgICBAcmVxdWlyZWQgVXJpIHVyaSwKKyAgICBAcmVxdWlyZWQgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsIHBlcmZvcm1hbmNlLAorICB9KSB7CiAgICAgRmlsZVN0YXRlIGZpbGUgPSBfdXJpVG9GaWxlW3VyaV07CiAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewogICAgICAgdmFyIHNvdXJjZSA9IF9zb3VyY2VGYWN0b3J5LmZvclVyaTIodXJpKTsKQEAgLTQ3NCw3ICs0OTUsOSBAQAogICAgICAgX3BhdGhUb0ZpbGVbcGF0aF0gPSBmaWxlOwogICAgICAgX3VyaVRvRmlsZVt1cmldID0gZmlsZTsKIAotICAgICAgZmlsZS5yZWZyZXNoKCk7CisgICAgICBmaWxlLnJlZnJlc2goCisgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICk7CiAgICAgfQogICAgIHJldHVybiBmaWxlOwogICB9CkBAIC00ODYsMTggKzUwOSw2IEBACiAgICAgfQogICAgIHJldHVybiBzb3VyY2UuZnVsbE5hbWU7CiAgIH0KLQotICB2b2lkIGxvZ1N0YXRpc3RpY3MoKSB7Ci0gICAgX2xvZ2dlci53cml0ZWxuKAotICAgICAgJ1tmaWxlczogJHtfcGF0aFRvRmlsZS5sZW5ndGh9XScKLSAgICAgICdbZGlnZXN0OiAke3RpbWVycy5kaWdlc3QudGltZXIuZWxhcHNlZE1pbGxpc2Vjb25kc30gbXNdJwotICAgICAgJ1tyZWFkOiAke3RpbWVycy5yZWFkLnRpbWVyLmVsYXBzZWRNaWxsaXNlY29uZHN9IG1zXScKLSAgICAgICdbcGFyc2U6ICR7dGltZXJzLnBhcnNlLnRpbWVyLmVsYXBzZWRNaWxsaXNlY29uZHN9IG1zXScKLSAgICAgICdbdW5saW5rZWQ6ICR7dGltZXJzLnVubGlua2VkLnRpbWVyLmVsYXBzZWRNaWxsaXNlY29uZHN9IG1zXScKLSAgICAgICdbcHJlZmV0Y2g6ICR7dGltZXJzLnByZWZldGNoLnRpbWVyLmVsYXBzZWRNaWxsaXNlY29uZHN9IG1zXScsCi0gICAgKTsKLSAgICB0aW1lcnMucmVzZXQoKTsKLSAgfQogfQogCiBjbGFzcyBGaWxlU3lzdGVtU3RhdGVUZXN0VmlldyB7CkBAIC01ODMsNyArNTk0LDcgQEAKICAgX0Zha2VTb3VyY2UodGhpcy5mdWxsTmFtZSwgdGhpcy51cmkpOwogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQogCiAvLy8gTm9kZSBpbiBbX0xpYnJhcnlXYWxrZXJdLgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9taWNyby9wZXJmb3JtYW5jZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9taWNyby9wZXJmb3JtYW5jZS5kYXJ0CmluZGV4IDVhMzk4ZjIuLmNmNTkxZmYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vcGVyZm9ybWFuY2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL3BlcmZvcm1hbmNlLmRhcnQKQEAgLTIsMTU1ICsyLDggQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi1pbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0JzsKIAogLy8vIFRoZSBwZXJmb3JtYW5jZSBvZiBhbiBvcGVyYXRpb24uCi1hYnN0cmFjdCBjbGFzcyBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlIHsKLSAgLy8vIFRoZSBjaGlsZHJlbiBvcGVyYXRpb24sIG1pZ2h0IGJlIGVtcHR5LgotICBMaXN0PENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2U+IGdldCBjaGlsZHJlbjsKLQotICAvLy8gVGhlIGR1cmF0aW9uIG9mIHRoZSBvcGVyYXRpb24gaXRzZWxmIGFuZCBpdHMgY2hpbGRyZW4uCi0gIER1cmF0aW9uIGdldCBlbGFwc2VkOwotCi0gIC8vLyBUaGUgZHVyYXRpb24gb2YgdGhlIG9wZXJhdGlvbiBpdHNlbGYuCi0gIER1cmF0aW9uIGdldCBlbGFwc2VkU2VsZjsKLQotICAvLy8gVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi4KLSAgU3RyaW5nIGdldCBuYW1lOwotCi0gIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2UgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpOwotCi0gIC8vLyBXcml0ZSB0aGlzIG9wZXJhdGlvbiBhbmQgaXRzIGNoaWxkcmVuIGludG8gdGhlIFtidWZmZXJdLgotICB2b2lkIHdyaXRlKHsKLSAgICBAcmVxdWlyZWQgU3RyaW5nQnVmZmVyIGJ1ZmZlciwKLSAgICBTdHJpbmcgaW5kZW50ID0gJycsCi0gIH0pOwotfQotCi1jbGFzcyBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlRml4ZWQgaW1wbGVtZW50cyBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlIHsKLSAgQG92ZXJyaWRlCi0gIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gIEBvdmVycmlkZQotICBmaW5hbCBEdXJhdGlvbiBlbGFwc2VkU2VsZjsKLQotICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlRml4ZWQodGhpcy5uYW1lLCB0aGlzLmVsYXBzZWRTZWxmKTsKLQotICBAb3ZlcnJpZGUKLSAgTGlzdDxDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlPiBnZXQgY2hpbGRyZW4gPT4gY29uc3QgW107Ci0KLSAgQG92ZXJyaWRlCi0gIER1cmF0aW9uIGdldCBlbGFwc2VkID0+IGVsYXBzZWRTZWxmOwotCi0gIEBvdmVycmlkZQotICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlIGdldENoaWxkKFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBAb3ZlcnJpZGUKLSAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiAnKG5hbWU6ICRuYW1lLCBlbGFwc2VkOiAkZWxhcHNlZCknOwotICB9Ci0KLSAgQG92ZXJyaWRlCi0gIHZvaWQgd3JpdGUoe1N0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBpbmRlbnQgPSAnJ30pIHsKLSAgICBidWZmZXIud3JpdGVsbignJGluZGVudCR7dG9TdHJpbmcoKX0nKTsKLSAgfQotfQotCi1jbGFzcyBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBpbXBsZW1lbnRzIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2UgewotICBAb3ZlcnJpZGUKLSAgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgZmluYWwgU3RvcHdhdGNoIF90aW1lciA9IFN0b3B3YXRjaCgpOwotICBmaW5hbCBMaXN0PENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2U+IF9jaGlsZHJlbiA9IFtdOwotCi0gIENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKHRoaXMubmFtZSk7Ci0KLSAgQG92ZXJyaWRlCi0gIExpc3Q8Q2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZT4gZ2V0IGNoaWxkcmVuIHsKLSAgICByZXR1cm4gX2NoaWxkcmVuOwotICB9Ci0KLSAgQG92ZXJyaWRlCi0gIER1cmF0aW9uIGdldCBlbGFwc2VkIHsKLSAgICByZXR1cm4gX3RpbWVyLmVsYXBzZWQ7Ci0gIH0KLQotICBAb3ZlcnJpZGUKLSAgRHVyYXRpb24gZ2V0IGVsYXBzZWRTZWxmIHsKLSAgICByZXR1cm4gZWxhcHNlZCAtIF9lbGFwc2VkQ2hpbGRyZW47Ci0gIH0KLQotICBEdXJhdGlvbiBnZXQgX2VsYXBzZWRDaGlsZHJlbiB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuLmZvbGQ8RHVyYXRpb24+KAotICAgICAgRHVyYXRpb24uemVybywKLSAgICAgIChzdW0sIGNoaWxkKSA9PiBzdW0gKyBjaGlsZC5lbGFwc2VkLAotICAgICk7Ci0gIH0KLQotICAvLy8gQWRkIGEgbmV3IGNoaWxkIHdpdGggdGhlIGtub3duIGVsYXBzZWQgdGltZS4KLSAgLy8vCi0gIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gd2UgYWxyZWFkeSBtZWFzdXJlIHBlcmZvcm1hbmNlIHVzaW5nIHNvbWUgb3RoZXIKLSAgLy8vIG1lY2hhbmlzbSwgYnV0IHdhbnQgdG8gYWRkIGl0IHRvIHRoaXMgcGVyZm9ybWFuY2UgaGllcmFyY2h5LgotICB2b2lkIGFkZENoaWxkRml4ZWQoU3RyaW5nIG5hbWUsIER1cmF0aW9uIGVsYXBzZWQpIHsKLSAgICBfY2hpbGRyZW4uYWRkKAotICAgICAgQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZUZpeGVkKG5hbWUsIGVsYXBzZWQpLAotICAgICk7Ci0gIH0KLQotICBAb3ZlcnJpZGUKLSAgQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZSBnZXRDaGlsZChTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBjaGlsZHJlbi5maXJzdFdoZXJlKAotICAgICAgKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09IG5hbWUsCi0gICAgICBvckVsc2U6ICgpID0+IG51bGwsCi0gICAgKTsKLSAgfQotCi0gIC8vLyBSdW4gdGhlIFtvcGVyYXRpb25dIGFzIGEgbmV3IGNoaWxkLgotICBUIHJ1bjxUPigKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBUIEZ1bmN0aW9uKENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKSBvcGVyYXRpb24sCi0gICkgewotICAgIHZhciBjaGlsZCA9IENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKG5hbWUpOwotICAgIF9jaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIGNoaWxkLl90aW1lci5zdGFydCgpOwotCi0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBvcGVyYXRpb24oY2hpbGQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBjaGlsZC5fdGltZXIuc3RvcCgpOwotICAgIH0KLSAgfQotCi0gIC8vLyBSdW4gdGhlIFtvcGVyYXRpb25dIGFzIGEgbmV3IGNoaWxkLgotICBGdXR1cmU8VD4gcnVuQXN5bmM8VD4oCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgRnV0dXJlPFQ+IEZ1bmN0aW9uKENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKSBvcGVyYXRpb24sCi0gICkgYXN5bmMgewotICAgIHZhciBjaGlsZCA9IENpZGVyT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKG5hbWUpOwotICAgIF9jaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIGNoaWxkLl90aW1lci5zdGFydCgpOwotCi0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBhd2FpdCBvcGVyYXRpb24oY2hpbGQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBjaGlsZC5fdGltZXIuc3RvcCgpOwotICAgIH0KLSAgfQotCi0gIEBvdmVycmlkZQotICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICcobmFtZTogJG5hbWUsIGVsYXBzZWQ6ICRlbGFwc2VkLCBlbGFwc2VkU2VsZjogJGVsYXBzZWRTZWxmKSc7Ci0gIH0KLQotICBAb3ZlcnJpZGUKLSAgdm9pZCB3cml0ZSh7U3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGluZGVudCA9ICcnfSkgewotICAgIGJ1ZmZlci53cml0ZWxuKCckaW5kZW50JHt0b1N0cmluZygpfScpOwotCi0gICAgdmFyIGNoaWxkSW5kZW50ID0gJyRpbmRlbnQgICc7Ci0gICAgZm9yICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pIHsKLSAgICAgIGNoaWxkLndyaXRlKGJ1ZmZlcjogYnVmZmVyLCBpbmRlbnQ6IGNoaWxkSW5kZW50KTsKLSAgICB9Ci0gIH0KLX0KK0BEZXByZWNhdGVkKCdVc2UgT3BlcmF0aW9uUGVyZm9ybWFuY2UnKQorYWJzdHJhY3QgY2xhc3MgQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZSBpbXBsZW1lbnRzIE9wZXJhdGlvblBlcmZvcm1hbmNlIHt9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL3Jlc29sdmVfZmlsZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9taWNyby9yZXNvbHZlX2ZpbGUuZGFydAppbmRleCA4ZTM0MTQwLi5jNDk2MTI4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L21pY3JvL3Jlc29sdmVfZmlsZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvbWljcm8vcmVzb2x2ZV9maWxlLmRhcnQKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9jaWRlcl9ieXRlX3N0b3JlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L21pY3JvL2xpYnJhcnlfYW5hbHl6ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvbWljcm8vbGlicmFyeV9ncmFwaC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9taWNyby9wZXJmb3JtYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JwogICAgIHNob3cgQW5hbHlzaXNFbmdpbmUsIEFuYWx5c2lzT3B0aW9uc0ltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CkBAIC0zNCw2ICszMyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2xpbmtlZF9lbGVtZW50X2ZhY3RvcnkuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL3JlZmVyZW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGFzay9vcHRpb25zLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvd29ya3NwYWNlL3dvcmtzcGFjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6eWFtbC95YW1sLmRhcnQnOwpAQCAtNTgsMTAgKzU4LDggQEAKICAgICovCiAgIGZpbmFsIFN0cmluZyBGdW5jdGlvbihTdHJpbmcgcGF0aCkgZ2V0RmlsZURpZ2VzdDsKIAotICAvKioKLSAgICogQSBmdW5jdGlvbiB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgZmlsZXMuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQKLSAgICogdG8gYmF0Y2ggZmlsZSByZWFkcyBpbiBzeXN0ZW1zIHdoZXJlIGZpbGUgZmV0Y2hlcyBhcmUgZXhwZW5zaXZlLgotICAgKi8KKyAgLy8vIEEgZnVuY3Rpb24gdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIGZpbGVzLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCisgIC8vLyB0byBiYXRjaCBmaWxlIHJlYWRzIGluIHN5c3RlbXMgd2hlcmUgZmlsZSBmZXRjaGVzIGFyZSBleHBlbnNpdmUuCiAgIGZpbmFsIHZvaWQgRnVuY3Rpb24oTGlzdDxTdHJpbmc+IHBhdGhzKSBwcmVmZXRjaEZpbGVzOwogCiAgIGZpbmFsIFdvcmtzcGFjZSB3b3Jrc3BhY2U7CkBAIC0xNDksMTEgKzE0NywxMSBAQAogCiAgIEVycm9yc1Jlc3VsdCBnZXRFcnJvcnMoewogICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKLSAgICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCiAgIH0pIHsKICAgICBfdGhyb3dJZk5vdEFic29sdXRlTm9ybWFsaXplZFBhdGgocGF0aCk7CiAKLSAgICBwZXJmb3JtYW5jZSA/Pz0gQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwoJzxkZWZhdWx0PicpOworICAgIHBlcmZvcm1hbmNlID8/PSBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwoJzxkZWZhdWx0PicpOwogCiAgICAgcmV0dXJuIF93aXRoTGlicmFyeUNvbnRleHRSZXNldCgoKSB7CiAgICAgICByZXR1cm4gbG9nZ2VyLnJ1bignR2V0IGVycm9ycyBmb3IgJHBhdGgnLCAoKSB7CkBAIC0yMDcsNyArMjA1LDcgQEAKICAgQGRlcHJlY2F0ZWQKICAgRXJyb3JzUmVzdWx0IGdldEVycm9yczIoewogICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKLSAgICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCiAgIH0pIHsKICAgICByZXR1cm4gZ2V0RXJyb3JzKAogICAgICAgcGF0aDogcGF0aCwKQEAgLTIxNywzMiArMjE1LDUwIEBACiAKICAgRmlsZUNvbnRleHQgZ2V0RmlsZUNvbnRleHQoewogICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKLSAgICBAcmVxdWlyZWQgQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCisgICAgQHJlcXVpcmVkIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKICAgfSkgewogICAgIHJldHVybiBwZXJmb3JtYW5jZS5ydW4oJ2ZpbGVDb250ZXh0JywgKHBlcmZvcm1hbmNlKSB7Ci0gICAgICB2YXIgYW5hbHlzaXNPcHRpb25zID0gX2dldEFuYWx5c2lzT3B0aW9ucyhwYXRoKTsKLSAgICAgIF9jcmVhdGVDb250ZXh0KHBhdGgsIGFuYWx5c2lzT3B0aW9ucyk7CisgICAgICB2YXIgYW5hbHlzaXNPcHRpb25zID0gcGVyZm9ybWFuY2UucnVuKCdhbmFseXNpc09wdGlvbnMnLCAoXykgeworICAgICAgICByZXR1cm4gX2dldEFuYWx5c2lzT3B0aW9ucyhwYXRoKTsKKyAgICAgIH0pOwogCi0gICAgICB2YXIgZmlsZSA9IGZzU3RhdGUuZ2V0RmlsZUZvclBhdGgocGF0aCk7CisgICAgICBwZXJmb3JtYW5jZS5ydW4oJ2NyZWF0ZUNvbnRleHQnLCAoXykgeworICAgICAgICBfY3JlYXRlQ29udGV4dChwYXRoLCBhbmFseXNpc09wdGlvbnMpOworICAgICAgfSk7CisKKyAgICAgIHZhciBmaWxlID0gcGVyZm9ybWFuY2UucnVuKCdmaWxlRm9yUGF0aCcsIChwZXJmb3JtYW5jZSkgeworICAgICAgICByZXR1cm4gZnNTdGF0ZS5nZXRGaWxlRm9yUGF0aCgKKyAgICAgICAgICBwYXRoOiBwYXRoLAorICAgICAgICAgIHBlcmZvcm1hbmNlOiBwZXJmb3JtYW5jZSwKKyAgICAgICAgKTsKKyAgICAgIH0pOworCiAgICAgICByZXR1cm4gRmlsZUNvbnRleHQoYW5hbHlzaXNPcHRpb25zLCBmaWxlKTsKICAgICB9KTsKICAgfQogCi0gIFN0cmluZyBnZXRMaWJyYXJ5TGlua2VkU2lnbmF0dXJlKFN0cmluZyBwYXRoKSB7CisgIFN0cmluZyBnZXRMaWJyYXJ5TGlua2VkU2lnbmF0dXJlKHsKKyAgICBAcmVxdWlyZWQgU3RyaW5nIHBhdGgsCisgICAgQHJlcXVpcmVkIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgfSkgewogICAgIF90aHJvd0lmTm90QWJzb2x1dGVOb3JtYWxpemVkUGF0aChwYXRoKTsKIAotICAgIHZhciBmaWxlID0gZnNTdGF0ZS5nZXRGaWxlRm9yUGF0aChwYXRoKTsKKyAgICB2YXIgZmlsZSA9IGZzU3RhdGUuZ2V0RmlsZUZvclBhdGgoCisgICAgICBwYXRoOiBwYXRoLAorICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlLAorICAgICk7CisKICAgICByZXR1cm4gZmlsZS5saWJyYXJ5Q3ljbGUuc2lnbmF0dXJlU3RyOwogICB9CiAKICAgUmVzb2x2ZWRVbml0UmVzdWx0IHJlc29sdmUoewogICAgIGludCBjb21wbGV0aW9uT2Zmc2V0LAogICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKLSAgICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCiAgIH0pIHsKICAgICBfdGhyb3dJZk5vdEFic29sdXRlTm9ybWFsaXplZFBhdGgocGF0aCk7CiAKLSAgICBwZXJmb3JtYW5jZSA/Pz0gQ2lkZXJPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwoJzxkZWZhdWx0PicpOworICAgIHBlcmZvcm1hbmNlID8/PSBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwoJzxkZWZhdWx0PicpOwogCiAgICAgcmV0dXJuIF93aXRoTGlicmFyeUNvbnRleHRSZXNldCgoKSB7CiAgICAgICByZXR1cm4gbG9nZ2VyLnJ1bignUmVzb2x2ZSAkcGF0aCcsICgpIHsKQEAgLTMwOCw3ICszMjQsNyBAQAogICBSZXNvbHZlZFVuaXRSZXN1bHQgcmVzb2x2ZTIoewogICAgIGludCBjb21wbGV0aW9uT2Zmc2V0LAogICAgIEByZXF1aXJlZCBTdHJpbmcgcGF0aCwKLSAgICBDaWRlck9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBwZXJmb3JtYW5jZSwKKyAgICBPcGVyYXRpb25QZXJmb3JtYW5jZUltcGwgcGVyZm9ybWFuY2UsCiAgIH0pIHsKICAgICByZXR1cm4gcmVzb2x2ZSgKICAgICAgIGNvbXBsZXRpb25PZmZzZXQ6IGNvbXBsZXRpb25PZmZzZXQsCkBAIC0zNDgsNyArMzY0LDYgQEAKICAgICAgICk7CiAKICAgICAgIGZzU3RhdGUgPSBGaWxlU3lzdGVtU3RhdGUoCi0gICAgICAgIGxvZ2dlciwKICAgICAgICAgcmVzb3VyY2VQcm92aWRlciwKICAgICAgICAgYnl0ZVN0b3JlLAogICAgICAgICBzb3VyY2VGYWN0b3J5LApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9hc3NpZ25tZW50X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvYXNzaWdubWVudF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKaW5kZXggMTVmNTNjNy4uNWFlMzdjZCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9hc3NpZ25tZW50X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2Fzc2lnbm1lbnRfZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0CkBAIC0xMSw2ICsxMSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvdG9rZW4uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2ludm9jYXRpb25faW5mZXJlbmNlX2hlbHBlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Jlc3VsdC5kYXJ0JzsKQEAgLTE4LDcgKzE5LDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL251bGxhYmxlX2RlcmVmZXJlbmNlX3ZlcmlmaWVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGFzay9zdHJvbmcvY2hlY2tlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKQEAgLTg0LDEyICs4NCwxMCBAQAogICAgICAgICAgICAgOiBub2RlLnN0YXRpY1R5cGUpOwogICB9CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgc3RhdGljIHR5cGUgb2YgW25vZGVdIHRvIGJlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgc3RhdGljCi0gICAqIHR5cGVzIG9mIHN1YmV4cHJlc3Npb25zIFtleHByMV0gYW5kIFtleHByMl0uCi0gICAqCi0gICAqIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCi0gICAqLworICAvLy8gU2V0IHRoZSBzdGF0aWMgdHlwZSBvZiBbbm9kZV0gdG8gYmUgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIHRoZSBzdGF0aWMKKyAgLy8vIHR5cGVzIG9mIHN1YmV4cHJlc3Npb25zIFtleHByMV0gYW5kIFtleHByMl0uCisgIC8vLworICAvLy8gVE9ETyhzY2hlZ2xvdikgdGhpcyBpcyBkdXBsaWNhdGUKICAgdm9pZCBfYW5hbHl6ZUxlYXN0VXBwZXJCb3VuZCgKICAgICAgIEV4cHJlc3Npb24gbm9kZSwgRXhwcmVzc2lvbiBleHByMSwgRXhwcmVzc2lvbiBleHByMiwKICAgICAgIHtib29sIHJlYWQgPSBmYWxzZX0pIHsKQEAgLTk5LDEyICs5NywxMCBAQAogICAgIF9hbmFseXplTGVhc3RVcHBlckJvdW5kVHlwZXMobm9kZSwgc3RhdGljVHlwZTEsIHN0YXRpY1R5cGUyKTsKICAgfQogCi0gIC8qKgotICAgKiBTZXQgdGhlIHN0YXRpYyB0eXBlIG9mIFtub2RlXSB0byBiZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHN0YXRpYwotICAgKiB0eXBlcyBbc3RhdGljVHlwZTFdIGFuZCBbc3RhdGljVHlwZTJdLgotICAgKgotICAgKiBUT0RPKHNjaGVnbG92KSB0aGlzIGlzIGR1cGxpY2F0ZQotICAgKi8KKyAgLy8vIFNldCB0aGUgc3RhdGljIHR5cGUgb2YgW25vZGVdIHRvIGJlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgc3RhdGljCisgIC8vLyB0eXBlcyBbc3RhdGljVHlwZTFdIGFuZCBbc3RhdGljVHlwZTJdLgorICAvLy8KKyAgLy8vIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCiAgIHZvaWQgX2FuYWx5emVMZWFzdFVwcGVyQm91bmRUeXBlcygKICAgICAgIEV4cHJlc3Npb24gbm9kZSwgRGFydFR5cGUgc3RhdGljVHlwZTEsIERhcnRUeXBlIHN0YXRpY1R5cGUyKSB7CiAgICAgLy8gVE9ETyhicmlhbndpbGtlcnNvbikgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjYW4gc3RpbGwgaGFwcGVuLgpAQCAtMTIyLDI1ICsxMTgsMjEgQEAKICAgICBfaW5mZXJlbmNlSGVscGVyLnJlY29yZFN0YXRpY1R5cGUobm9kZSwgc3RhdGljVHlwZSk7CiAgIH0KIAotICAvKioKLSAgICogR2V0cyB0aGUgZGVmaW5pdGUgdHlwZSBvZiBleHByZXNzaW9uLCB3aGljaCBjYW4gYmUgdXNlZCBpbiBjYXNlcyB3aGVyZQotICAgKiB0aGUgbW9zdCBwcmVjaXNlIHR5cGUgaXMgZGVzaXJlZCwgZm9yIGV4YW1wbGUgY29tcHV0aW5nIHRoZSBsZWFzdCB1cHBlcgotICAgKiBib3VuZC4KLSAgICoKLSAgICogU2VlIFtnZXRFeHByZXNzaW9uVHlwZV0gZm9yIG1vcmUgaW5mb3JtYXRpb24uIFdpdGhvdXQgc3Ryb25nIG1vZGUsIHRoaXMgaXMKLSAgICogZXF1aXZhbGVudCB0byBbX2dldFN0YXRpY1R5cGVdLgotICAgKgotICAgKiBUT0RPKHNjaGVnbG92KSB0aGlzIGlzIGR1cGxpY2F0ZQotICAgKi8KKyAgLy8vIEdldHMgdGhlIGRlZmluaXRlIHR5cGUgb2YgZXhwcmVzc2lvbiwgd2hpY2ggY2FuIGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUKKyAgLy8vIHRoZSBtb3N0IHByZWNpc2UgdHlwZSBpcyBkZXNpcmVkLCBmb3IgZXhhbXBsZSBjb21wdXRpbmcgdGhlIGxlYXN0IHVwcGVyCisgIC8vLyBib3VuZC4KKyAgLy8vCisgIC8vLyBTZWUgW2dldEV4cHJlc3Npb25UeXBlXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gV2l0aG91dCBzdHJvbmcgbW9kZSwgdGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBbX2dldFN0YXRpY1R5cGVdLgorICAvLy8KKyAgLy8vIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCiAgIERhcnRUeXBlIF9nZXRFeHByZXNzaW9uVHlwZShFeHByZXNzaW9uIGV4cHIsIHtib29sIHJlYWQgPSBmYWxzZX0pID0+CiAgICAgICBnZXRFeHByZXNzaW9uVHlwZShleHByLCBfdHlwZVN5c3RlbSwgX3R5cGVQcm92aWRlciwgcmVhZDogcmVhZCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIFtleHByZXNzaW9uXSB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yCi0gICAqIHR5cGUgYW5hbHlzaXMuCi0gICAqCi0gICAqIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IKKyAgLy8vIHR5cGUgYW5hbHlzaXMuCisgIC8vLworICAvLy8gVE9ETyhzY2hlZ2xvdikgdGhpcyBpcyBkdXBsaWNhdGUKICAgRGFydFR5cGUgX2dldFN0YXRpY1R5cGUxKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwge2Jvb2wgcmVhZCA9IGZhbHNlfSkgewogICAgIGlmIChleHByZXNzaW9uIGlzIE51bGxMaXRlcmFsKSB7CiAgICAgICByZXR1cm4gX3R5cGVQcm92aWRlci5udWxsVHlwZTsKQEAgLTE0OSwxMSArMTQxLDkgQEAKICAgICByZXR1cm4gX3Jlc29sdmVUeXBlUGFyYW1ldGVyKHR5cGUpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIFtleHByZXNzaW9uXS4KLSAgICoKLSAgICogVE9ETyhzY2hlZ2xvdikgdGhpcyBpcyBkdXBsaWNhdGUKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0uCisgIC8vLworICAvLy8gVE9ETyhzY2hlZ2xvdikgdGhpcyBpcyBkdXBsaWNhdGUKICAgRGFydFR5cGUgX2dldFN0YXRpY1R5cGUyKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwge2Jvb2wgcmVhZCA9IGZhbHNlfSkgewogICAgIERhcnRUeXBlIHR5cGU7CiAgICAgaWYgKHJlYWQpIHsKQEAgLTE3OSwxMCArMTY5LDEwIEBACiAgICAgcmV0dXJuIHR5cGU7CiAgIH0KIAotICAvLy8gUmV0dXJuIHRoZSBub24tbnVsbGFibGUgdmFyaWFudCBvZiB0aGUgW3R5cGVdIGlmIE5OQkQgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlCi0gIC8vLyByZXR1cm4gdGhlIHR5cGUgaXRzZWxmLgorICAvLy8gUmV0dXJuIHRoZSBub24tbnVsbGFibGUgdmFyaWFudCBvZiB0aGUgW3R5cGVdIGlmIG51bGwgc2FmZXR5IGlzIGVuYWJsZWQsCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIHRoZSB0eXBlIGl0c2VsZi4KICAgLy8vCi0gIC8vLyBUT0RPKHNjaGVnbG92KSB0aGlzIGlzIGR1cGxpY2F0ZQorICAvLyBUT0RPKHNjaGVnbG92KSB0aGlzIGlzIGR1cGxpY2F0ZQogICBEYXJ0VHlwZSBfbm9uTnVsbGFibGUoRGFydFR5cGUgdHlwZSkgewogICAgIGlmIChfaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgcmV0dXJuIF90eXBlU3lzdGVtLnByb21vdGVUb05vbk51bGwodHlwZSk7CkBAIC0zMDAsMjEgKzI5MCwxNiBAQAogICAgIF9yZXNvbHZlci5udWxsU2hvcnRpbmdUZXJtaW5hdGlvbihub2RlKTsKICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW3R5cGVdIGlzIGEgdHlwZSBwYXJhbWV0ZXIsIHJlc29sdmUgaXQgdG8gdGhlIHR5cGUgdGhhdCBzaG91bGQKLSAgICogYmUgdXNlZCB3aGVuIGxvb2tpbmcgdXAgbWVtYmVycy4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIG9yaWdpbmFsIHR5cGUuCi0gICAqCi0gICAqIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCi0gICAqLworICAvLy8gSWYgdGhlIGdpdmVuIFt0eXBlXSBpcyBhIHR5cGUgcGFyYW1ldGVyLCByZXNvbHZlIGl0IHRvIHRoZSB0eXBlIHRoYXQKKyAgLy8vIHNob3VsZCBiZSB1c2VkIHdoZW4gbG9va2luZyB1cCBtZW1iZXJzLiBPdGhlcndpc2UsIHJldHVybiB0aGUgb3JpZ2luYWwKKyAgLy8vIHR5cGUuCisgIC8vIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCiAgIERhcnRUeXBlIF9yZXNvbHZlVHlwZVBhcmFtZXRlcihEYXJ0VHlwZSB0eXBlKSA9PgogICAgICAgdHlwZT8ucmVzb2x2ZVRvQm91bmQoX3R5cGVQcm92aWRlci5vYmplY3RUeXBlKTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB3ZSBzaG91bGQgcmVwb3J0IGFuIGVycm9yIGZvciB0aGUgbG9va3VwIFtyZXN1bHRdIG9uCi0gICAqIHRoZSBbdHlwZV0uCi0gICAqCi0gICAqIFRPRE8oc2NoZWdsb3YpIHRoaXMgaXMgZHVwbGljYXRlCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBzaG91bGQgcmVwb3J0IGFuIGVycm9yIGZvciB0aGUgbG9va3VwIFtyZXN1bHRdIG9uCisgIC8vLyB0aGUgW3R5cGVdLgorICAvLyBUT0RPKHNjaGVnbG92KSB0aGlzIGlzIGR1cGxpY2F0ZQogICBib29sIF9zaG91bGRSZXBvcnRJbnZhbGlkTWVtYmVyKERhcnRUeXBlIHR5cGUsIFJlc29sdXRpb25SZXN1bHQgcmVzdWx0KSB7CiAgICAgaWYgKHJlc3VsdC5pc05vbmUgJiYgdHlwZSAhPSBudWxsICYmICF0eXBlLmlzRHluYW1pYykgewogICAgICAgaWYgKF90eXBlU3lzdGVtLmlzTm9uTnVsbGFibGVCeURlZmF1bHQgJiYKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvYXN0X3Jld3JpdGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvYXN0X3Jld3JpdGUuZGFydAppbmRleCA2YTQyMzk0Li5hMjcwOWZmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2FzdF9yZXdyaXRlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9hc3RfcmV3cml0ZS5kYXJ0CkBAIC05LDcgKzksNiBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FzdC91dGlsaXRpZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiAKIC8vLyBIZWxwZXIgZm9yIFtNZXRob2RJbnZvY2F0aW9uXXMgaW50byBbSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25dIHRvIHN1cHBvcnQKIC8vLyB0aGUgb3B0aW9uYWwgYG5ld2AgYW5kIGBjb25zdGAgZmVhdHVyZSwgb3IgW0V4dGVuc2lvbk92ZXJyaWRlXS4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvYmluYXJ5X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvYmluYXJ5X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydAppbmRleCAwYzcwZWRjLi44MThlNGM1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2JpbmFyeV9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9iaW5hcnlfZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0CkBAIC0xMCw2ICsxMCw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9mbG93X2FuYWx5c2lzX3Zpc2l0b3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvaW52b2NhdGlvbl9pbmZlcmVuY2VfaGVscGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Jlc29sdXRpb25fcmVzdWx0LmRhcnQnOwpAQCAtMTcsNyArMTgsNiBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9wcm9tb3Rpb25fbWFuYWdlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9ib2R5X2luZmVyZW5jZV9jb250ZXh0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2JvZHlfaW5mZXJlbmNlX2NvbnRleHQuZGFydAppbmRleCAzYWY5ZTEyLi42ODI0MzEyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2JvZHlfaW5mZXJlbmNlX2NvbnRleHQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2JvZHlfaW5mZXJlbmNlX2NvbnRleHQuZGFydApAQCAtOCw4ICs4LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2RlbW90aW9uLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogY2xhc3MgQm9keUluZmVyZW5jZUNvbnRleHQgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9leHRlbnNpb25fbWVtYmVyX3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2V4dGVuc2lvbl9tZW1iZXJfcmVzb2x2ZXIuZGFydAppbmRleCBlN2EwMmU1Li5jMjljZWY5IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2V4dGVuc2lvbl9tZW1iZXJfcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2V4dGVuc2lvbl9tZW1iZXJfcmVzb2x2ZXIuZGFydApAQCAtMTMsMTEgKzEzLDExIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Jlc3VsdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogCiBjbGFzcyBFeHRlbnNpb25NZW1iZXJSZXNvbHZlciB7CiAgIGZpbmFsIFJlc29sdmVyVmlzaXRvciBfcmVzb2x2ZXI7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9mbG93X2FuYWx5c2lzX3Zpc2l0b3IuZGFydAppbmRleCA1Njg4NjVkLi41YTYyNWExIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQKQEAgLTEwLDggKzEwLDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL21pZ3JhdGlvbi5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC92YXJpYWJsZV90eXBlX3Byb3ZpZGVyLmRhcnQnOwogCiAvLy8gRGF0YSBnYXRoZXJlZCBieSBmbG93IGFuYWx5c2lzLCByZXRhaW5lZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvZnVuY3Rpb25fZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9mdW5jdGlvbl9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKaW5kZXggYjVlYjY0My4uZjQ5NmExMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9mdW5jdGlvbl9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9mdW5jdGlvbl9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKQEAgLTgsNiArOCw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9ib2R5X2luZmVyZW5jZV9jb250ZXh0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9pbnZvY2F0aW9uX2luZmVyZW5jZV9oZWxwZXIuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2ludm9jYXRpb25faW5mZXJlbmNlX2hlbHBlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9pbnZvY2F0aW9uX2luZmVyZW5jZV9oZWxwZXIuZGFydAppbmRleCA0YmM3M2RjLi5kYTJlNTdjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2ludm9jYXRpb25faW5mZXJlbmNlX2hlbHBlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvaW52b2NhdGlvbl9pbmZlcmVuY2VfaGVscGVyLmRhcnQKQEAgLTEwLDYgKzEwLDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL21pZ3JhdGlvbi5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvbGVnYWN5X3R5cGVfYXNzZXJ0ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvbGVnYWN5X3R5cGVfYXNzZXJ0ZXIuZGFydAppbmRleCA0MDYzMzljLi5iNWRjZDU4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL2xlZ2FjeV90eXBlX2Fzc2VydGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9sZWdhY3lfdHlwZV9hc3NlcnRlci5kYXJ0CkBAIC0yMCw3ICsyMCw3IEBACiAvLy8gQ2hlY2tzIHRoYXQgdGhlIHN0YXRpYyB0eXBlIG9mIGV2ZXJ5IG5vZGUsIGFzIHdlbGwgYXMgdGhlIGVsZW1lbnRzIG9mIG1hbnkKIC8vLyBub2RlcywgaGF2ZSBsZWdhY3kgdHlwZXMsIGFuZCBhc3NlcnRzIHRoYXQgdGhlIGxlZ2FjeSB0eXBlcyBhcmUgZGVlcCBsZWdhY3kKIC8vLyB0eXBlcy4KLWNsYXNzIExlZ2FjeVR5cGVBc3NlcnRlciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3IgeworY2xhc3MgTGVnYWN5VHlwZUFzc2VydGVyIGV4dGVuZHMgR2VuZXJhbGl6aW5nQXN0VmlzaXRvcjx2b2lkPiB7CiAgIGZpbmFsIFNldDxEYXJ0VHlwZT4gX3Zpc2l0ZWRUeXBlcyA9IHt9OwogCiAgIExlZ2FjeVR5cGVBc3NlcnRlcih7Ym9vbCByZXF1aXJlSXNEZWJ1ZyA9IHRydWV9KSB7CkBAIC00MCw3ICs0MCw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRDbGFzc01lbWJlcihDbGFzc01lbWJlciBub2RlKSB7CisgIHZvaWQgdmlzaXRDbGFzc01lbWJlcihDbGFzc01lbWJlciBub2RlKSB7CiAgICAgZmluYWwgZWxlbWVudCA9IG5vZGUuZGVjbGFyZWRFbGVtZW50OwogICAgIGlmIChlbGVtZW50IGlzIEV4ZWN1dGFibGVFbGVtZW50KSB7CiAgICAgICBfYXNzZXJ0TGVnYWN5VHlwZShlbGVtZW50Py50eXBlKTsKQEAgLTQ5LDU4ICs0OSw1OCBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q29tcGlsYXRpb25Vbml0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7CisgIHZvaWQgdmlzaXRDb21waWxhdGlvblVuaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKICAgICBpZiAoIW5vZGUuZmVhdHVyZVNldC5pc0VuYWJsZWQoRmVhdHVyZS5ub25fbnVsbGFibGUpKSB7CiAgICAgICBzdXBlci52aXNpdENvbXBpbGF0aW9uVW5pdChub2RlKTsKICAgICB9CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXREZWNsYXJlZElkZW50aWZpZXIoRGVjbGFyZWRJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdERlY2xhcmVkSWRlbnRpZmllcihEZWNsYXJlZElkZW50aWZpZXIgbm9kZSkgewogICAgIF9hc3NlcnRMZWdhY3lUeXBlKG5vZGUuZGVjbGFyZWRFbGVtZW50Py50eXBlKTsKICAgICBzdXBlci52aXNpdERlY2xhcmVkSWRlbnRpZmllcihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRFeHByZXNzaW9uKEV4cHJlc3Npb24gbm9kZSkgewogICAgIF9hc3NlcnRMZWdhY3lUeXBlKG5vZGUuc3RhdGljVHlwZSk7CiAgICAgX2Fzc2VydExlZ2FjeVR5cGUobm9kZS5zdGF0aWNQYXJhbWV0ZXJFbGVtZW50Py50eXBlKTsKICAgICBzdXBlci52aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGb3JtYWxQYXJhbWV0ZXIoRm9ybWFsUGFyYW1ldGVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEZvcm1hbFBhcmFtZXRlcihGb3JtYWxQYXJhbWV0ZXIgbm9kZSkgewogICAgIF9hc3NlcnRMZWdhY3lUeXBlKG5vZGUuZGVjbGFyZWRFbGVtZW50Py50eXBlKTsKICAgICBzdXBlci52aXNpdEZvcm1hbFBhcmFtZXRlcihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24oRnVuY3Rpb25EZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9hc3NlcnRMZWdhY3lUeXBlKG5vZGUuZGVjbGFyZWRFbGVtZW50Py50eXBlKTsKICAgICBzdXBlci52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRJbnZvY2F0aW9uRXhwcmVzc2lvbihJbnZvY2F0aW9uRXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRJbnZvY2F0aW9uRXhwcmVzc2lvbihJbnZvY2F0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgX2Fzc2VydExlZ2FjeVR5cGUobm9kZS5zdGF0aWNJbnZva2VUeXBlKTsKICAgICBub2RlLnR5cGVBcmd1bWVudFR5cGVzPy5mb3JFYWNoKF9hc3NlcnRMZWdhY3lUeXBlKTsKICAgICByZXR1cm4gc3VwZXIudmlzaXRJbnZvY2F0aW9uRXhwcmVzc2lvbihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdFR5cGVBbm5vdGF0aW9uKFR5cGVBbm5vdGF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFR5cGVBbm5vdGF0aW9uKFR5cGVBbm5vdGF0aW9uIG5vZGUpIHsKICAgICBfYXNzZXJ0TGVnYWN5VHlwZShub2RlLnR5cGUpOwogICAgIHN1cGVyLnZpc2l0VHlwZUFubm90YXRpb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRUeXBlTmFtZShUeXBlTmFtZSBub2RlKSB7CisgIHZvaWQgdmlzaXRUeXBlTmFtZShUeXBlTmFtZSBub2RlKSB7CiAgICAgX2Fzc2VydExlZ2FjeVR5cGUobm9kZS50eXBlKTsKICAgICBzdXBlci52aXNpdFR5cGVOYW1lKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgX2Fzc2VydExlZ2FjeVR5cGUobm9kZS5kZWNsYXJlZEVsZW1lbnQ/LnR5cGUpOwogICAgIHN1cGVyLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9tZXRob2RfaW52b2NhdGlvbl9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9tZXRob2RfaW52b2NhdGlvbl9yZXNvbHZlci5kYXJ0CmluZGV4IDA3ZDk2YTIuLjBhZDU4MTIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvbWV0aG9kX2ludm9jYXRpb25fcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL21ldGhvZF9pbnZvY2F0aW9uX3Jlc29sdmVyLmRhcnQKQEAgLTEwLDYgKzEwLDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvdXRpbGl0aWVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvaW5oZXJpdGFuY2VfbWFuYWdlcjMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZXh0ZW5zaW9uX21lbWJlcl9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9pbnZvY2F0aW9uX2luZmVyZW5jZV9oZWxwZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3Bvc3RmaXhfZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9wb3N0Zml4X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydAppbmRleCA1OTE3ZWJjLi40M2IyMGU3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3Bvc3RmaXhfZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvcG9zdGZpeF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKQEAgLTksNiArOSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9hc3NpZ25tZW50X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2ludm9jYXRpb25faW5mZXJlbmNlX2hlbHBlci5kYXJ0JzsKQEAgLTE2LDcgKzE3LDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci90eXBlX3Byb3BlcnR5X3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3Rhc2svc3Ryb25nL2NoZWNrZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3ByZWZpeF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3ByZWZpeF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQKaW5kZXggMjRlYWFlMy4uYmVlYjE5YSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9wcmVmaXhfZXhwcmVzc2lvbl9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvcHJlZml4X2V4cHJlc3Npb25fcmVzb2x2ZXIuZGFydApAQCAtMTAsNiArMTAsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2xpc3RlbmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FzdC9hc3QuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvYXNzaWdubWVudF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2Zsb3dfYW5hbHlzaXNfdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9pbnZvY2F0aW9uX2luZmVyZW5jZV9oZWxwZXIuZGFydCc7CkBAIC0xNyw3ICsxOCw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9wcm9wZXJ0eV9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Zpc2l0b3IuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvcmVzb2x1dGlvbl92aXNpdG9yLmRhcnQKaW5kZXggNzQ0ODI0Mi4uZDAwNjIwNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Zpc2l0b3IuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3Jlc29sdXRpb25fdmlzaXRvci5kYXJ0CkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9uYW1lX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2RlY2xhcmF0aW9uX3Jlc29sdmVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKQEAgLTExMTIsMTAgKzExMTEsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBGb3IgZWFjaCBbQW5ub3RhdGlvbl0gZm91bmQgaW4gW2Fubm90YXRpb25zXSwgY3JlYXRlIGEgbmV3Ci0gICAqIFtFbGVtZW50QW5ub3RhdGlvbl0gb2JqZWN0IGFuZCBzZXQgdGhlIFtBbm5vdGF0aW9uXSB0byBwb2ludCB0byBpdC4KLSAgICovCisgIC8vLyBGb3IgZWFjaCBbQW5ub3RhdGlvbl0gZm91bmQgaW4gW2Fubm90YXRpb25zXSwgY3JlYXRlIGEgbmV3CisgIC8vLyBbRWxlbWVudEFubm90YXRpb25dIG9iamVjdCBhbmQgc2V0IHRoZSBbQW5ub3RhdGlvbl0gdG8gcG9pbnQgdG8gaXQuCiAgIExpc3Q8RWxlbWVudEFubm90YXRpb24+IF9jcmVhdGVFbGVtZW50QW5ub3RhdGlvbnMoCiAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zKSB7CiAgICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydAppbmRleCA3MjBiZTA1Li4zNGUzNGI1MSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydApAQCAtMTAsMTQgKzEwLDEwIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwogCi0vKioKLSAqIFRoZSBzY29wZSBkZWZpbmVkIGJ5IGEgYmxvY2suCi0gKi8KKy8vLyBUaGUgc2NvcGUgZGVmaW5lZCBieSBhIGJsb2NrLgogY2xhc3MgQmxvY2tTY29wZSBleHRlbmRzIEVuY2xvc2VkU2NvcGUgewotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXSwKLSAgICogYmFzZWQgb24gdGhlIGdpdmVuIFtibG9ja10uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXSwKKyAgLy8vIGJhc2VkIG9uIHRoZSBnaXZlbiBbYmxvY2tdLgogICBCbG9ja1Njb3BlKFNjb3BlIGVuY2xvc2luZ1Njb3BlLCBCbG9jayBibG9jaykgOiBzdXBlcihlbmNsb3NpbmdTY29wZSkgewogICAgIGlmIChibG9jayA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBBcmd1bWVudEVycm9yKCJibG9jayBjYW5ub3QgYmUgbnVsbCIpOwpAQCAtMzEsMTAgKzI3LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGUgZ2l2ZW4gW2Jsb2NrXS4gVGhpcwotICAgKiBkb2VzIG5vdCBpbmNsdWRlIGVsZW1lbnRzIGRlY2xhcmVkIGluIG5lc3RlZCBibG9ja3MuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGUgZ2l2ZW4gW2Jsb2NrXS4gVGhpcworICAvLy8gZG9lcyBub3QgaW5jbHVkZSBlbGVtZW50cyBkZWNsYXJlZCBpbiBuZXN0ZWQgYmxvY2tzLgogICBzdGF0aWMgSXRlcmFibGU8RWxlbWVudD4gZWxlbWVudHNJbkJsb2NrKEJsb2NrIGJsb2NrKSBzeW5jKiB7CiAgICAgTm9kZUxpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50czsKICAgICBpbnQgc3RhdGVtZW50Q291bnQgPSBzdGF0ZW1lbnRzLmxlbmd0aDsKQEAgLTUzLDE0ICs0NywxMCBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIHNjb3BlIGRlZmluZWQgYnkgYSBjbGFzcy4KLSAqLworLy8vIFRoZSBzY29wZSBkZWZpbmVkIGJ5IGEgY2xhc3MuCiBjbGFzcyBDbGFzc1Njb3BlIGV4dGVuZHMgRW5jbG9zZWRTY29wZSB7Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbZW5jbG9zaW5nU2NvcGVdLAotICAgKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gW2NsYXNzRWxlbWVudF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXSwKKyAgLy8vIGJhc2VkIG9uIHRoZSBnaXZlbiBbY2xhc3NFbGVtZW50XS4KICAgQ2xhc3NTY29wZShTY29wZSBlbmNsb3NpbmdTY29wZSwgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudCkKICAgICAgIDogc3VwZXIoZW5jbG9zaW5nU2NvcGUpIHsKICAgICBpZiAoY2xhc3NFbGVtZW50ID09IG51bGwpIHsKQEAgLTY5LDkgKzU5LDcgQEAKICAgICBfZGVmaW5lTWVtYmVycyhjbGFzc0VsZW1lbnQpOwogICB9CiAKLSAgLyoqCi0gICAqIERlZmluZSB0aGUgaW5zdGFuY2UgbWVtYmVycyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBbY2xhc3NFbGVtZW50XS4KLSAgICovCisgIC8vLyBEZWZpbmUgdGhlIGluc3RhbmNlIG1lbWJlcnMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gW2NsYXNzRWxlbWVudF0uCiAgIHZvaWQgX2RlZmluZU1lbWJlcnMoQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudCkgewogICAgIExpc3Q8UHJvcGVydHlBY2Nlc3NvckVsZW1lbnQ+IGFjY2Vzc29ycyA9IGNsYXNzRWxlbWVudC5hY2Nlc3NvcnM7CiAgICAgaW50IGFjY2Vzc29yTGVuZ3RoID0gYWNjZXNzb3JzLmxlbmd0aDsKQEAgLTg2LDIxICs3NCwxNSBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIHNjb3BlIGRlZmluZWQgZm9yIHRoZSBpbml0aWFsaXplcnMgaW4gYSBjb25zdHJ1Y3Rvci4KLSAqLworLy8vIFRoZSBzY29wZSBkZWZpbmVkIGZvciB0aGUgaW5pdGlhbGl6ZXJzIGluIGEgY29uc3RydWN0b3IuCiBjbGFzcyBDb25zdHJ1Y3RvckluaXRpYWxpemVyU2NvcGUgZXh0ZW5kcyBFbmNsb3NlZFNjb3BlIHsKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNjb3BlLCBlbmNsb3NlZCB3aXRoaW4gdGhlIFtlbmNsb3NpbmdTY29wZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXS4KICAgQ29uc3RydWN0b3JJbml0aWFsaXplclNjb3BlKFNjb3BlIGVuY2xvc2luZ1Njb3BlLCBDb25zdHJ1Y3RvckVsZW1lbnQgZWxlbWVudCkKICAgICAgIDogc3VwZXIoZW5jbG9zaW5nU2NvcGUpIHsKICAgICBfaW5pdGlhbGl6ZUZpZWxkRm9ybWFsUGFyYW1ldGVycyhlbGVtZW50KTsKICAgfQogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIHRoZSBsb2NhbCBzY29wZSB3aXRoIGFsbCBvZiB0aGUgZmllbGQgZm9ybWFsIHBhcmFtZXRlcnMuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSB0aGUgbG9jYWwgc2NvcGUgd2l0aCBhbGwgb2YgdGhlIGZpZWxkIGZvcm1hbCBwYXJhbWV0ZXJzLgogICB2b2lkIF9pbml0aWFsaXplRmllbGRGb3JtYWxQYXJhbWV0ZXJzKENvbnN0cnVjdG9yRWxlbWVudCBlbGVtZW50KSB7CiAgICAgZm9yIChQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlciBpbiBlbGVtZW50LnBhcmFtZXRlcnMpIHsKICAgICAgIGlmIChwYXJhbWV0ZXIgaXMgRmllbGRGb3JtYWxQYXJhbWV0ZXJFbGVtZW50KSB7CkBAIC0xMTAsMTkgKzkyLDEzIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIHNjb3BlIHRoYXQgaXMgbGV4aWNhbGx5IGVuY2xvc2VkIGluIGFub3RoZXIgc2NvcGUuCi0gKi8KKy8vLyBBIHNjb3BlIHRoYXQgaXMgbGV4aWNhbGx5IGVuY2xvc2VkIGluIGFub3RoZXIgc2NvcGUuCiBjbGFzcyBFbmNsb3NlZFNjb3BlIGV4dGVuZHMgU2NvcGUgewotICAvKioKLSAgICogVGhlIHNjb3BlIGluIHdoaWNoIHRoaXMgc2NvcGUgaXMgbGV4aWNhbGx5IGVuY2xvc2VkLgotICAgKi8KKyAgLy8vIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIHNjb3BlIGlzIGxleGljYWxseSBlbmNsb3NlZC4KICAgQG92ZXJyaWRlCiAgIGZpbmFsIFNjb3BlIGVuY2xvc2luZ1Njb3BlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbZW5jbG9zaW5nU2NvcGVdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNjb3BlLCBlbmNsb3NlZCB3aXRoaW4gdGhlIFtlbmNsb3NpbmdTY29wZV0uCiAgIEVuY2xvc2VkU2NvcGUodGhpcy5lbmNsb3NpbmdTY29wZSk7CiAKICAgQG92ZXJyaWRlCkBAIC0xNjcsMjUgKzE0MywxNyBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIHNjb3BlIGRlZmluZWQgYnkgYSBmdW5jdGlvbi4KLSAqLworLy8vIFRoZSBzY29wZSBkZWZpbmVkIGJ5IGEgZnVuY3Rpb24uCiBjbGFzcyBGdW5jdGlvblNjb3BlIGV4dGVuZHMgRW5jbG9zZWRTY29wZSB7Ci0gIC8qKgotICAgKiBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGlzIHNjb3BlLgotICAgKi8KKyAgLy8vIFRoZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoaXMgc2NvcGUuCiAgIGZpbmFsIEZ1bmN0aW9uVHlwZWRFbGVtZW50IF9mdW5jdGlvbkVsZW1lbnQ7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcmFtZXRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgdXNlZCB0bwotICAgKiBwcmV2ZW50IHRoZSBwYXJhbWV0ZXJzIGZyb20gYmVpbmcgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcy4KLSAgICovCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQsIHVzZWQKKyAgLy8vIHRvIHByZXZlbnQgdGhlIHBhcmFtZXRlcnMgZnJvbSBiZWluZyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzLgogICBib29sIF9wYXJhbWV0ZXJzRGVmaW5lZCA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbZW5jbG9zaW5nU2NvcGVdLAotICAgKiB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIFtfZnVuY3Rpb25FbGVtZW50XS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbZW5jbG9zaW5nU2NvcGVdLAorICAvLy8gdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBbX2Z1bmN0aW9uRWxlbWVudF0uCiAgIEZ1bmN0aW9uU2NvcGUoU2NvcGUgZW5jbG9zaW5nU2NvcGUsIHRoaXMuX2Z1bmN0aW9uRWxlbWVudCkKICAgICAgIDogc3VwZXIoRW5jbG9zZWRTY29wZShFbmNsb3NlZFNjb3BlKGVuY2xvc2luZ1Njb3BlKSkpIHsKICAgICBpZiAoX2Z1bmN0aW9uRWxlbWVudCA9PSBudWxsKSB7CkBAIC0xOTQsMTAgKzE2Miw4IEBACiAgICAgX2RlZmluZVR5cGVQYXJhbWV0ZXJzKCk7CiAgIH0KIAotICAvKioKLSAgICogRGVmaW5lIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIHNjb3BlIHRoYXQgZW5jbG9zZXMKLSAgICogdGhpcyBmdW5jdGlvbi4KLSAgICovCisgIC8vLyBEZWZpbmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUgc2NvcGUgdGhhdCBlbmNsb3NlcworICAvLy8gdGhpcyBmdW5jdGlvbi4KICAgdm9pZCBkZWZpbmVQYXJhbWV0ZXJzKCkgewogICAgIGlmIChfcGFyYW1ldGVyc0RlZmluZWQpIHsKICAgICAgIHJldHVybjsKQEAgLTIxNCw5ICsxODAsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBEZWZpbmUgdGhlIHR5cGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLgotICAgKi8KKyAgLy8vIERlZmluZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uCiAgIHZvaWQgX2RlZmluZVR5cGVQYXJhbWV0ZXJzKCkgewogICAgIFNjb3BlIHR5cGVQYXJhbWV0ZXJTY29wZSA9IGVuY2xvc2luZ1Njb3BlLmVuY2xvc2luZ1Njb3BlOwogICAgIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IHR5cGVQYXJhbWV0ZXJzID0gX2Z1bmN0aW9uRWxlbWVudC50eXBlUGFyYW1ldGVyczsKQEAgLTIyOCwyNiArMTkyLDIwIEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgc2NvcGUgZGVmaW5lZCBieSBhIGZ1bmN0aW9uIHR5cGUgYWxpYXMuCi0gKi8KKy8vLyBUaGUgc2NvcGUgZGVmaW5lZCBieSBhIGZ1bmN0aW9uIHR5cGUgYWxpYXMuCiBjbGFzcyBGdW5jdGlvblR5cGVTY29wZSBleHRlbmRzIEVuY2xvc2VkU2NvcGUgewogICBmaW5hbCBGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgX3R5cGVFbGVtZW50OwogCiAgIGJvb2wgX3BhcmFtZXRlcnNEZWZpbmVkID0gZmFsc2U7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNjb3BlLCBlbmNsb3NlZCB3aXRoaW4gdGhlIFtlbmNsb3NpbmdTY29wZV0sCi0gICAqIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gW190eXBlRWxlbWVudF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXSwKKyAgLy8vIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gW190eXBlRWxlbWVudF0uCiAgIEZ1bmN0aW9uVHlwZVNjb3BlKFNjb3BlIGVuY2xvc2luZ1Njb3BlLCB0aGlzLl90eXBlRWxlbWVudCkKICAgICAgIDogc3VwZXIoRW5jbG9zZWRTY29wZShlbmNsb3NpbmdTY29wZSkpIHsKICAgICBfZGVmaW5lVHlwZVBhcmFtZXRlcnMoKTsKICAgfQogCi0gIC8qKgotICAgKiBEZWZpbmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0eXBlIGFsaWFzLgotICAgKi8KKyAgLy8vIERlZmluZSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uIHR5cGUgYWxpYXMuCiAgIHZvaWQgZGVmaW5lUGFyYW1ldGVycygpIHsKICAgICBpZiAoX3BhcmFtZXRlcnNEZWZpbmVkKSB7CiAgICAgICByZXR1cm47CkBAIC0yNTgsOSArMjE2LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogRGVmaW5lIHRoZSB0eXBlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0eXBlIGFsaWFzLgotICAgKi8KKyAgLy8vIERlZmluZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24gdHlwZSBhbGlhcy4KICAgdm9pZCBfZGVmaW5lVHlwZVBhcmFtZXRlcnMoKSB7CiAgICAgU2NvcGUgdHlwZVBhcmFtZXRlclNjb3BlID0gZW5jbG9zaW5nU2NvcGU7CiAgICAgZm9yIChUeXBlUGFyYW1ldGVyRWxlbWVudCB0eXBlUGFyYW1ldGVyIGluIF90eXBlRWxlbWVudC50eXBlUGFyYW1ldGVycykgewpAQCAtMjY5LDM3ICsyMjUsMjUgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBzY29wZSBzdGF0ZW1lbnRzIHRoYXQgY2FuIGJlIHRoZSB0YXJnZXQgb2YgdW5sYWJlbGVkIGBicmVha2AgYW5kCi0gKiBgY29udGludWVgIHN0YXRlbWVudHMuCi0gKi8KKy8vLyBUaGUgc2NvcGUgc3RhdGVtZW50cyB0aGF0IGNhbiBiZSB0aGUgdGFyZ2V0IG9mIHVubGFiZWxlZCBgYnJlYWtgIGFuZAorLy8vIGBjb250aW51ZWAgc3RhdGVtZW50cy4KIGNsYXNzIEltcGxpY2l0TGFiZWxTY29wZSB7Ci0gIC8qKgotICAgKiBUaGUgaW1wbGljaXQgbGFiZWwgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b3AgbGV2ZWwgb2YgYSBmdW5jdGlvbi4KLSAgICovCisgIC8vLyBUaGUgaW1wbGljaXQgbGFiZWwgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b3AgbGV2ZWwgb2YgYSBmdW5jdGlvbi4KICAgc3RhdGljIGNvbnN0IEltcGxpY2l0TGFiZWxTY29wZSBST09UID0gSW1wbGljaXRMYWJlbFNjb3BlLl8obnVsbCwgbnVsbCk7CiAKLSAgLyoqCi0gICAqIFRoZSBpbXBsaWNpdCBsYWJlbCBzY29wZSBlbmNsb3NpbmcgdGhpcyBpbXBsaWNpdCBsYWJlbCBzY29wZS4KLSAgICovCisgIC8vLyBUaGUgaW1wbGljaXQgbGFiZWwgc2NvcGUgZW5jbG9zaW5nIHRoaXMgaW1wbGljaXQgbGFiZWwgc2NvcGUuCiAgIGZpbmFsIEltcGxpY2l0TGFiZWxTY29wZSBvdXRlclNjb3BlOwogCi0gIC8qKgotICAgKiBUaGUgc3RhdGVtZW50IHRoYXQgYWN0cyBhcyBhIHRhcmdldCBmb3IgYnJlYWsgYW5kL29yIGNvbnRpbnVlIHN0YXRlbWVudHMKLSAgICogYXQgdGhpcyBzY29waW5nIGxldmVsLgotICAgKi8KKyAgLy8vIFRoZSBzdGF0ZW1lbnQgdGhhdCBhY3RzIGFzIGEgdGFyZ2V0IGZvciBicmVhayBhbmQvb3IgY29udGludWUgc3RhdGVtZW50cworICAvLy8gYXQgdGhpcyBzY29waW5nIGxldmVsLgogICBmaW5hbCBTdGF0ZW1lbnQgc3RhdGVtZW50OwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbb3V0ZXJTY29wZV0sCi0gICAqIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gW3N0YXRlbWVudF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW291dGVyU2NvcGVdLAorICAvLy8gcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBbc3RhdGVtZW50XS4KICAgY29uc3QgSW1wbGljaXRMYWJlbFNjb3BlLl8odGhpcy5vdXRlclNjb3BlLCB0aGlzLnN0YXRlbWVudCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3RhdGVtZW50IHdoaWNoIHNob3VsZCBiZSB0aGUgdGFyZ2V0IG9mIGFuIHVubGFiZWxlZCBgYnJlYWtgIG9yCi0gICAqIGBjb250aW51ZWAgc3RhdGVtZW50LCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgdGFyZ2V0LgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc3RhdGVtZW50IHdoaWNoIHNob3VsZCBiZSB0aGUgdGFyZ2V0IG9mIGFuIHVubGFiZWxlZCBgYnJlYWtgIG9yCisgIC8vLyBgY29udGludWVgIHN0YXRlbWVudCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIHRhcmdldC4KICAgU3RhdGVtZW50IGdldFRhcmdldChib29sIGlzQ29udGludWUpIHsKICAgICBpZiAob3V0ZXJTY29wZSA9PSBudWxsKSB7CiAgICAgICAvLyBUaGlzIHNjb3BlIHJlcHJlc2VudHMgdGhlIHRvcGxldmVsIG9mIGEgZnVuY3Rpb24gYm9keSwgc28gaXQgZG9lc24ndApAQCAtMzEyLDUwICsyNTYsMzQgQEAKICAgICByZXR1cm4gc3RhdGVtZW50OwogICB9CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNjb3BlIHRvIHJlcHJlc2VudCBhIHN3aXRjaCBzdGF0ZW1lbnQgb3IgbG9vcAotICAgKiBuZXN0ZWQgd2l0aGluIHRoZSBjdXJyZW50IHNjb3BlLiAgW3N0YXRlbWVudF0gaXMgdGhlIHN0YXRlbWVudCBhc3NvY2lhdGVkCi0gICAqIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgc2NvcGUuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUgdG8gcmVwcmVzZW50IGEgc3dpdGNoIHN0YXRlbWVudCBvciBsb29wCisgIC8vLyBuZXN0ZWQgd2l0aGluIHRoZSBjdXJyZW50IHNjb3BlLiAgW3N0YXRlbWVudF0gaXMgdGhlIHN0YXRlbWVudCBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIHNjb3BlLgogICBJbXBsaWNpdExhYmVsU2NvcGUgbmVzdChTdGF0ZW1lbnQgc3RhdGVtZW50KSA9PgogICAgICAgSW1wbGljaXRMYWJlbFNjb3BlLl8odGhpcywgc3RhdGVtZW50KTsKIH0KIAotLyoqCi0gKiBBIHNjb3BlIGluIHdoaWNoIGEgc2luZ2xlIGxhYmVsIGlzIGRlZmluZWQuCi0gKi8KKy8vLyBBIHNjb3BlIGluIHdoaWNoIGEgc2luZ2xlIGxhYmVsIGlzIGRlZmluZWQuCiBjbGFzcyBMYWJlbFNjb3BlIHsKLSAgLyoqCi0gICAqIFRoZSBsYWJlbCBzY29wZSBlbmNsb3NpbmcgdGhpcyBsYWJlbCBzY29wZS4KLSAgICovCisgIC8vLyBUaGUgbGFiZWwgc2NvcGUgZW5jbG9zaW5nIHRoaXMgbGFiZWwgc2NvcGUuCiAgIGZpbmFsIExhYmVsU2NvcGUgX291dGVyU2NvcGU7CiAKLSAgLyoqCi0gICAqIFRoZSBsYWJlbCBkZWZpbmVkIGluIHRoaXMgc2NvcGUuCi0gICAqLworICAvLy8gVGhlIGxhYmVsIGRlZmluZWQgaW4gdGhpcyBzY29wZS4KICAgZmluYWwgU3RyaW5nIF9sYWJlbDsKIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGxhYmVsIHJlc29sdmVzLgotICAgKi8KKyAgLy8vIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBsYWJlbCByZXNvbHZlcy4KICAgZmluYWwgTGFiZWxFbGVtZW50IGVsZW1lbnQ7CiAKLSAgLyoqCi0gICAqIFRoZSBBU1Qgbm9kZSB0byB3aGljaCB0aGUgbGFiZWwgcmVzb2x2ZXMuCi0gICAqLworICAvLy8gVGhlIEFTVCBub2RlIHRvIHdoaWNoIHRoZSBsYWJlbCByZXNvbHZlcy4KICAgZmluYWwgQXN0Tm9kZSBub2RlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbX291dGVyU2NvcGVdLAotICAgKiByZXByZXNlbnRpbmcgdGhlIGxhYmVsIFtfbGFiZWxdLiBUaGUgW25vZGVdIGlzIHRoZSBBU1Qgbm9kZSB0aGUgbGFiZWwKLSAgICogcmVzb2x2ZXMgdG8uIFRoZSBbZWxlbWVudF0gaXMgdGhlIGVsZW1lbnQgdGhlIGxhYmVsIHJlc29sdmVzIHRvLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNjb3BlLCBlbmNsb3NlZCB3aXRoaW4gdGhlIFtfb3V0ZXJTY29wZV0sCisgIC8vLyByZXByZXNlbnRpbmcgdGhlIGxhYmVsIFtfbGFiZWxdLiBUaGUgW25vZGVdIGlzIHRoZSBBU1Qgbm9kZSB0aGUgbGFiZWwKKyAgLy8vIHJlc29sdmVzIHRvLiBUaGUgW2VsZW1lbnRdIGlzIHRoZSBlbGVtZW50IHRoZSBsYWJlbCByZXNvbHZlcyB0by4KICAgTGFiZWxTY29wZSh0aGlzLl9vdXRlclNjb3BlLCB0aGlzLl9sYWJlbCwgdGhpcy5ub2RlLCB0aGlzLmVsZW1lbnQpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIExhYmVsU2NvcGUgd2hpY2ggZGVmaW5lcyBbdGFyZ2V0TGFiZWxdLCBvciBgbnVsbGAgaWYgaXQgaXMgbm90Ci0gICAqIGRlZmluZWQgaW4gdGhpcyBzY29wZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIExhYmVsU2NvcGUgd2hpY2ggZGVmaW5lcyBbdGFyZ2V0TGFiZWxdLCBvciBgbnVsbGAgaWYgaXQgaXMgbm90CisgIC8vLyBkZWZpbmVkIGluIHRoaXMgc2NvcGUuCiAgIExhYmVsU2NvcGUgbG9va3VwKFN0cmluZyB0YXJnZXRMYWJlbCkgewogICAgIGlmIChfbGFiZWwgPT0gdGFyZ2V0TGFiZWwpIHsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtMzY0LDM2ICsyOTIsMjUgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBzY29wZSBjb250YWluaW5nIGFsbCBvZiB0aGUgbmFtZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZWQgbGlicmFyaWVzLgotICovCisvLy8gVGhlIHNjb3BlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBuYW1lcyBhdmFpbGFibGUgZnJvbSBpbXBvcnRlZCBsaWJyYXJpZXMuCiBjbGFzcyBMaWJyYXJ5SW1wb3J0U2NvcGUgZXh0ZW5kcyBTY29wZSB7Ci0gIC8qKgotICAgKiBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkgaW4gd2hpY2ggdGhpcyBzY29wZSBpcyBlbmNsb3NlZC4KLSAgICovCisgIC8vLyBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkgaW4gd2hpY2ggdGhpcyBzY29wZSBpcyBlbmNsb3NlZC4KICAgZmluYWwgTGlicmFyeUVsZW1lbnQgX2RlZmluaW5nTGlicmFyeTsKIAotICAvKioKLSAgICogQSBsaXN0IG9mIHRoZSBuYW1lc3BhY2VzIHJlcHJlc2VudGluZyB0aGUgbmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoaXMgc2NvcGUgZnJvbSBpbXBvcnRlZAotICAgKiBsaWJyYXJpZXMuCi0gICAqLworICAvLy8gQSBsaXN0IG9mIHRoZSBuYW1lc3BhY2VzIHJlcHJlc2VudGluZyB0aGUgbmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoaXMKKyAgLy8vIHNjb3BlIGZyb20gaW1wb3J0ZWQgbGlicmFyaWVzLgogICBMaXN0PE5hbWVzcGFjZT4gX2ltcG9ydGVkTmFtZXNwYWNlczsKIAotICAvKioKLSAgICogQSB0YWJsZSBtYXBwaW5nIHByZWZpeGVzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQgdG8gYSBtYXAgZnJvbSB0aGUgbmFtZXMKLSAgICogdGhhdCBoYXZlIGJlZW4gcmVmZXJlbmNlZCB0byB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWZpeGVkIG5hbWUuCi0gICAqLworICAvLy8gQSB0YWJsZSBtYXBwaW5nIHByZWZpeGVzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQgdG8gYSBtYXAgZnJvbSB0aGUgbmFtZXMKKyAgLy8vIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQgdG8gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVmaXhlZAorICAvLy8gbmFtZS4KICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRWxlbWVudD4+IF9kZWZpbmVkUHJlZml4ZWROYW1lczsKIAotICAvKioKLSAgICogQ2FjaGUgb2YgcHVibGljIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGlzIGxpYnJhcnkncyBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKi8KKyAgLy8vIENhY2hlIG9mIHB1YmxpYyBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhpcyBsaWJyYXJ5J3MgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KICAgTGlzdDxFeHRlbnNpb25FbGVtZW50PiBfZXh0ZW5zaW9uczsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUgcmVwcmVzZW50aW5nIHRoZSBuYW1lcyBpbXBvcnRlZCBpbnRvIHRoZQotICAgKiBbX2RlZmluaW5nTGlicmFyeV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUgcmVwcmVzZW50aW5nIHRoZSBuYW1lcyBpbXBvcnRlZCBpbnRvIHRoZQorICAvLy8gW19kZWZpbmluZ0xpYnJhcnldLgogICBMaWJyYXJ5SW1wb3J0U2NvcGUodGhpcy5fZGVmaW5pbmdMaWJyYXJ5KSB7CiAgICAgX2NyZWF0ZUltcG9ydGVkTmFtZXNwYWNlcygpOwogICB9CkBAIC00OTIsMTEgKzQwOSw5IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbGwgb2YgdGhlIG5hbWVzcGFjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaWJyYXJpZXMgaW1wb3J0ZWQgaW50bwotICAgKiB0aGlzIGxpYnJhcnkuIFRoZSBuYW1lcyBhcmUgbm90IGFkZGVkIHRvIHRoaXMgc2NvcGUsIGJ1dCBhcmUgc3RvcmVkIGZvcgotICAgKiBsYXRlciByZWZlcmVuY2UuCi0gICAqLworICAvLy8gQ3JlYXRlIGFsbCBvZiB0aGUgbmFtZXNwYWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpYnJhcmllcyBpbXBvcnRlZCBpbnRvCisgIC8vLyB0aGlzIGxpYnJhcnkuIFRoZSBuYW1lcyBhcmUgbm90IGFkZGVkIHRvIHRoaXMgc2NvcGUsIGJ1dCBhcmUgc3RvcmVkIGZvcgorICAvLy8gbGF0ZXIgcmVmZXJlbmNlLgogICB2b2lkIF9jcmVhdGVJbXBvcnRlZE5hbWVzcGFjZXMoKSB7CiAgICAgTGlzdDxJbXBvcnRFbGVtZW50PiBpbXBvcnRzID0gX2RlZmluaW5nTGlicmFyeS5pbXBvcnRzOwogICAgIGludCBjb3VudCA9IGltcG9ydHMubGVuZ3RoOwpAQCAtNTA2LDEwICs0MjEsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBZGQgdGhlIGdpdmVuIFtlbGVtZW50XSB0byB0aGlzIHNjb3BlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0aW9uIG9yCi0gICAqIGhpZGluZy4KLSAgICovCisgIC8vLyBBZGQgdGhlIGdpdmVuIFtlbGVtZW50XSB0byB0aGlzIHNjb3BlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0aW9uIG9yCisgIC8vLyBoaWRpbmcuCiAgIHZvaWQgX2RlZmluZVByZWZpeGVkTmFtZVdpdGhvdXRDaGVja2luZygKICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQpIHsKICAgICBfZGVmaW5lZFByZWZpeGVkTmFtZXMgPz89IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBFbGVtZW50Pj4oKTsKQEAgLTUzMiwxMCArNDQ1LDggQEAKICAgICByZXR1cm4gZWxlbWVudDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgd2l0aCB3aGljaCB0aGUgZ2l2ZW4gW3ByZWZpeF0gYW5kIFtuYW1lXSBhcmUgYXNzb2NpYXRlZCwKLSAgICogb3IgYG51bGxgIGlmIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZWxlbWVudCB3aXRoIHdoaWNoIHRoZSBnaXZlbiBbcHJlZml4XSBhbmQgW25hbWVdIGFyZQorICAvLy8gYXNzb2NpYXRlZCwgb3IgYG51bGxgIGlmIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLgogICBFbGVtZW50IF9sb2NhbFByZWZpeGVkTG9va3VwKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7CiAgICAgaWYgKF9kZWZpbmVkUHJlZml4ZWROYW1lcyAhPSBudWxsKSB7CiAgICAgICBNYXA8U3RyaW5nLCBFbGVtZW50PiB1bnByZWZpeGVkTmFtZXMgPSBfZGVmaW5lZFByZWZpeGVkTmFtZXNbcHJlZml4XTsKQEAgLTU5NywxNiArNTA4LDEyIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIHNjb3BlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBuYW1lcyBkZWZpbmVkIGluIGEgZ2l2ZW4gbGlicmFyeS4KLSAqLworLy8vIEEgc2NvcGUgY29udGFpbmluZyBhbGwgb2YgdGhlIG5hbWVzIGRlZmluZWQgaW4gYSBnaXZlbiBsaWJyYXJ5LgogY2xhc3MgTGlicmFyeVNjb3BlIGV4dGVuZHMgRW5jbG9zZWRTY29wZSB7CiAgIGZpbmFsIExpc3Q8RXh0ZW5zaW9uRWxlbWVudD4gX2V4dGVuc2lvbnMgPSA8RXh0ZW5zaW9uRWxlbWVudD5bXTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUgcmVwcmVzZW50aW5nIHRoZSBuYW1lcyBkZWZpbmVkIGluIHRoZQotICAgKiBbZGVmaW5pbmdMaWJyYXJ5XS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSByZXByZXNlbnRpbmcgdGhlIG5hbWVzIGRlZmluZWQgaW4gdGhlCisgIC8vLyBbZGVmaW5pbmdMaWJyYXJ5XS4KICAgTGlicmFyeVNjb3BlKExpYnJhcnlFbGVtZW50IGRlZmluaW5nTGlicmFyeSkKICAgICAgIDogc3VwZXIoTGlicmFyeUltcG9ydFNjb3BlKGRlZmluaW5nTGlicmFyeSkpIHsKICAgICBfZGVmaW5lVG9wTGV2ZWxOYW1lcyhkZWZpbmluZ0xpYnJhcnkpOwpAQCAtNjI0LDEwICs1MzEsOCBAQAogICBMaXN0PEV4dGVuc2lvbkVsZW1lbnQ+IGdldCBleHRlbnNpb25zID0+CiAgICAgICBlbmNsb3NpbmdTY29wZS5leHRlbnNpb25zLnRvTGlzdCgpLi5hZGRBbGwoX2V4dGVuc2lvbnMpOwogCi0gIC8qKgotICAgKiBBZGQgdG8gdGhpcyBzY29wZSBhbGwgb2YgdGhlIHB1YmxpYyB0b3AtbGV2ZWwgbmFtZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUKLSAgICogZ2l2ZW4gW2NvbXBpbGF0aW9uVW5pdF0uCi0gICAqLworICAvLy8gQWRkIHRvIHRoaXMgc2NvcGUgYWxsIG9mIHRoZSBwdWJsaWMgdG9wLWxldmVsIG5hbWVzIHRoYXQgYXJlIGRlZmluZWQgaW4KKyAgLy8vIHRoZSBnaXZlbiBbY29tcGlsYXRpb25Vbml0XS4KICAgdm9pZCBfZGVmaW5lTG9jYWxOYW1lcyhDb21waWxhdGlvblVuaXRFbGVtZW50IGNvbXBpbGF0aW9uVW5pdCkgewogICAgIGZvciAoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCBpbiBjb21waWxhdGlvblVuaXQuYWNjZXNzb3JzKSB7CiAgICAgICBkZWZpbmUoZWxlbWVudCk7CkBAIC02NTQsMTAgKzU1OSw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0byB0aGlzIHNjb3BlIGFsbCBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZQotICAgKiBbZGVmaW5pbmdMaWJyYXJ5XS4KLSAgICovCisgIC8vLyBBZGQgdG8gdGhpcyBzY29wZSBhbGwgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZCBpbiB0aGUKKyAgLy8vIFtkZWZpbmluZ0xpYnJhcnldLgogICB2b2lkIF9kZWZpbmVUb3BMZXZlbE5hbWVzKExpYnJhcnlFbGVtZW50IGRlZmluaW5nTGlicmFyeSkgewogICAgIGZvciAoUHJlZml4RWxlbWVudCBwcmVmaXggaW4gZGVmaW5pbmdMaWJyYXJ5LnByZWZpeGVzKSB7CiAgICAgICBkZWZpbmUocHJlZml4KTsKQEAgLTY2OSw1NSArNTcyLDM4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIG1hcHBpbmcgb2YgaWRlbnRpZmllcnMgdG8gdGhlIGVsZW1lbnRzIHJlcHJlc2VudGVkIGJ5IHRob3NlIGlkZW50aWZpZXJzLgotICogTmFtZXNwYWNlcyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBmb3Igc2NvcGVzLgotICovCisvLy8gQSBtYXBwaW5nIG9mIGlkZW50aWZpZXJzIHRvIHRoZSBlbGVtZW50cyByZXByZXNlbnRlZCBieSB0aG9zZSBpZGVudGlmaWVycy4KKy8vLyBOYW1lc3BhY2VzIGFyZSB0aGUgYnVpbGRpbmcgYmxvY2tzIGZvciBzY29wZXMuCiBjbGFzcyBOYW1lc3BhY2UgewotICAvKioKLSAgICogQW4gZW1wdHkgbmFtZXNwYWNlLgotICAgKi8KKyAgLy8vIEFuIGVtcHR5IG5hbWVzcGFjZS4KICAgc3RhdGljIE5hbWVzcGFjZSBFTVBUWSA9IE5hbWVzcGFjZShIYXNoTWFwPFN0cmluZywgRWxlbWVudD4oKSk7CiAKLSAgLyoqCi0gICAqIEEgdGFibGUgbWFwcGluZyBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIHRvIHRoZSBlbGVtZW50Ci0gICAqIHJlcHJlc2VudGluZyB0aGUgdGhpbmcgZGVjbGFyZWQgd2l0aCB0aGF0IG5hbWUuCi0gICAqLworICAvLy8gQSB0YWJsZSBtYXBwaW5nIG5hbWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgdG8gdGhlIGVsZW1lbnQKKyAgLy8vIHJlcHJlc2VudGluZyB0aGUgdGhpbmcgZGVjbGFyZWQgd2l0aCB0aGF0IG5hbWUuCiAgIGZpbmFsIE1hcDxTdHJpbmcsIEVsZW1lbnQ+IF9kZWZpbmVkTmFtZXM7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIG5hbWVzcGFjZSB0byBoYXZlIHRoZSBbX2RlZmluZWROYW1lc10uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgbmFtZXNwYWNlIHRvIGhhdmUgdGhlIFtfZGVmaW5lZE5hbWVzXS4KICAgTmFtZXNwYWNlKHRoaXMuX2RlZmluZWROYW1lcyk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhvc2UgZGVmaW5lZCBieSB0aGlzCi0gICAqIG5hbWVzcGFjZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSB0YWJsZSBjb250YWluaW5nIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRob3NlIGRlZmluZWQgYnkgdGhpcworICAvLy8gbmFtZXNwYWNlLgogICBNYXA8U3RyaW5nLCBFbGVtZW50PiBnZXQgZGVmaW5lZE5hbWVzID0+IF9kZWZpbmVkTmFtZXM7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCBpbiB0aGlzIG5hbWVzcGFjZSB0aGF0IGlzIGF2YWlsYWJsZSB0byB0aGUgY29udGFpbmluZwotICAgKiBzY29wZSB1c2luZyB0aGUgZ2l2ZW4gbmFtZSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgaW4gdGhpcyBuYW1lc3BhY2UgdGhhdCBpcyBhdmFpbGFibGUgdG8gdGhlIGNvbnRhaW5pbmcKKyAgLy8vIHNjb3BlIHVzaW5nIHRoZSBnaXZlbiBuYW1lLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50LgogICBFbGVtZW50IGdldChTdHJpbmcgbmFtZSkgPT4gX2RlZmluZWROYW1lc1tuYW1lXTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IGluIHRoaXMgbmFtZXNwYWNlIHdob3NlIG5hbWUgaXMgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcKLSAgICogdGhlIFtwcmVmaXhdIGFuZCB0aGUgW25hbWVdLCBzZXBhcmF0ZWQgYnkgYSBwZXJpb2QsIG9yIGBudWxsYCBpZiB0aGVyZSBpcwotICAgKiBubyBzdWNoIGVsZW1lbnQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IGluIHRoaXMgbmFtZXNwYWNlIHdob3NlIG5hbWUgaXMgdGhlIHJlc3VsdCBvZiBjb21iaW5pbmcKKyAgLy8vIHRoZSBbcHJlZml4XSBhbmQgdGhlIFtuYW1lXSwgc2VwYXJhdGVkIGJ5IGEgcGVyaW9kLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMKKyAgLy8vIG5vIHN1Y2ggZWxlbWVudC4KICAgRWxlbWVudCBnZXRQcmVmaXhlZChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgPT4gbnVsbDsKIH0KIAotLyoqCi0gKiBUaGUgYnVpbGRlciB1c2VkIHRvIGJ1aWxkIGEgbmFtZXNwYWNlLiBOYW1lc3BhY2UgYnVpbGRlcnMgYXJlIHRocmVhZC1zYWZlIGFuZAotICogcmUtdXNhYmxlLgotICovCisvLy8gVGhlIGJ1aWxkZXIgdXNlZCB0byBidWlsZCBhIG5hbWVzcGFjZS4gTmFtZXNwYWNlIGJ1aWxkZXJzIGFyZSB0aHJlYWQtc2FmZQorLy8vIGFuZCByZS11c2FibGUuCiBjbGFzcyBOYW1lc3BhY2VCdWlsZGVyIHsKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5hbWVzcGFjZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuIFtlbGVtZW50XS4KLSAgICovCisgIC8vLyBDcmVhdGUgYSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBleHBvcnQgbmFtZXNwYWNlIG9mIHRoZSBnaXZlbgorICAvLy8gW2VsZW1lbnRdLgogICBOYW1lc3BhY2UgY3JlYXRlRXhwb3J0TmFtZXNwYWNlRm9yRGlyZWN0aXZlKEV4cG9ydEVsZW1lbnQgZWxlbWVudCkgewogICAgIExpYnJhcnlFbGVtZW50IGV4cG9ydGVkTGlicmFyeSA9IGVsZW1lbnQuZXhwb3J0ZWRMaWJyYXJ5OwogICAgIGlmIChleHBvcnRlZExpYnJhcnkgPT0gbnVsbCkgewpAQCAtNzMyLDE3ICs2MTgsMTUgQEAKICAgICByZXR1cm4gTmFtZXNwYWNlKGV4cG9ydGVkTmFtZXMpOwogICB9CiAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5hbWVzcGFjZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuIFtsaWJyYXJ5XS4KLSAgICovCisgIC8vLyBDcmVhdGUgYSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBleHBvcnQgbmFtZXNwYWNlIG9mIHRoZSBnaXZlbgorICAvLy8gW2xpYnJhcnldLgogICBOYW1lc3BhY2UgY3JlYXRlRXhwb3J0TmFtZXNwYWNlRm9yTGlicmFyeShMaWJyYXJ5RWxlbWVudCBsaWJyYXJ5KSB7CiAgICAgTWFwPFN0cmluZywgRWxlbWVudD4gZXhwb3J0ZWROYW1lcyA9IF9nZXRFeHBvcnRNYXBwaW5nKGxpYnJhcnkpOwogICAgIHJldHVybiBOYW1lc3BhY2UoZXhwb3J0ZWROYW1lcyk7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIGEgbmFtZXNwYWNlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0IG5hbWVzcGFjZSBvZiB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIG5hbWVzcGFjZSByZXByZXNlbnRpbmcgdGhlIGltcG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuCisgIC8vLyBbZWxlbWVudF0uCiAgIE5hbWVzcGFjZSBjcmVhdGVJbXBvcnROYW1lc3BhY2VGb3JEaXJlY3RpdmUoSW1wb3J0RWxlbWVudCBlbGVtZW50KSB7CiAgICAgTGlicmFyeUVsZW1lbnQgaW1wb3J0ZWRMaWJyYXJ5ID0gZWxlbWVudC5pbXBvcnRlZExpYnJhcnk7CiAgICAgaWYgKGltcG9ydGVkTGlicmFyeSA9PSBudWxsKSB7CkBAIC03NjEsMTAgKzY0NSw4IEBACiAgICAgcmV0dXJuIE5hbWVzcGFjZShleHBvcnRlZE5hbWVzKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMgbmFtZXNwYWNlIG9mIHRoZSBnaXZlbgotICAgKiBbbGlicmFyeV0uCi0gICAqLworICAvLy8gQ3JlYXRlIGEgbmFtZXNwYWNlIHJlcHJlc2VudGluZyB0aGUgcHVibGljIG5hbWVzcGFjZSBvZiB0aGUgZ2l2ZW4KKyAgLy8vIFtsaWJyYXJ5XS4KICAgTmFtZXNwYWNlIGNyZWF0ZVB1YmxpY05hbWVzcGFjZUZvckxpYnJhcnkoTGlicmFyeUVsZW1lbnQgbGlicmFyeSkgewogICAgIE1hcDxTdHJpbmcsIEVsZW1lbnQ+IGRlZmluZWROYW1lcyA9IEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50PigpOwogICAgIF9hZGRQdWJsaWNOYW1lcyhkZWZpbmVkTmFtZXMsIGxpYnJhcnkuZGVmaW5pbmdDb21waWxhdGlvblVuaXQpOwpAQCAtNzg0LDEwICs2NjYsOCBAQAogICAgIHJldHVybiBOYW1lc3BhY2UoZGVmaW5lZE5hbWVzKTsKICAgfQogCi0gIC8qKgotICAgKiBBZGQgYWxsIG9mIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gW25hbWVzcGFjZV0gdG8gdGhlIHRhYmxlIG9mCi0gICAqIFtkZWZpbmVkTmFtZXNdLgotICAgKi8KKyAgLy8vIEFkZCBhbGwgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBbbmFtZXNwYWNlXSB0byB0aGUgdGFibGUgb2YKKyAgLy8vIFtkZWZpbmVkTmFtZXNdLgogICB2b2lkIF9hZGRBbGxGcm9tTmFtZXNwYWNlKAogICAgICAgTWFwPFN0cmluZywgRWxlbWVudD4gZGVmaW5lZE5hbWVzLCBOYW1lc3BhY2UgbmFtZXNwYWNlKSB7CiAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7CkBAIC03OTUsMTAgKzY3NSw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gW2VsZW1lbnRdIHRvIHRoZSB0YWJsZSBvZiBbZGVmaW5lZE5hbWVzXSBpZiBpdCBoYXMgYQotICAgKiBwdWJsaWNseSB2aXNpYmxlIG5hbWUuCi0gICAqLworICAvLy8gQWRkIHRoZSBnaXZlbiBbZWxlbWVudF0gdG8gdGhlIHRhYmxlIG9mIFtkZWZpbmVkTmFtZXNdIGlmIGl0IGhhcyBhCisgIC8vLyBwdWJsaWNseSB2aXNpYmxlIG5hbWUuCiAgIHZvaWQgX2FkZElmUHVibGljKE1hcDxTdHJpbmcsIEVsZW1lbnQ+IGRlZmluZWROYW1lcywgRWxlbWVudCBlbGVtZW50KSB7CiAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50Lm5hbWU7CiAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmlzTm90RW1wdHkgJiYgIVNjb3BlLmlzUHJpdmF0ZU5hbWUobmFtZSkpIHsKQEAgLTgwNiwxMSArNjg0LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRvIHRoZSB0YWJsZSBvZiBbZGVmaW5lZE5hbWVzXSBhbGwgb2YgdGhlIHB1YmxpYyB0b3AtbGV2ZWwgbmFtZXMgdGhhdAotICAgKiBhcmUgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gW2NvbXBpbGF0aW9uVW5pdF0uCi0gICAqICAgICAgICAgIG5hbWVzcGFjZQotICAgKi8KKyAgLy8vIEFkZCB0byB0aGUgdGFibGUgb2YgW2RlZmluZWROYW1lc10gYWxsIG9mIHRoZSBwdWJsaWMgdG9wLWxldmVsIG5hbWVzIHRoYXQKKyAgLy8vIGFyZSBkZWZpbmVkIGluIHRoZSBnaXZlbiBbY29tcGlsYXRpb25Vbml0XS4KKyAgLy8vICAgICAgICAgIG5hbWVzcGFjZQogICB2b2lkIF9hZGRQdWJsaWNOYW1lcyhNYXA8U3RyaW5nLCBFbGVtZW50PiBkZWZpbmVkTmFtZXMsCiAgICAgICBDb21waWxhdGlvblVuaXRFbGVtZW50IGNvbXBpbGF0aW9uVW5pdCkgewogICAgIGZvciAoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCBpbiBjb21waWxhdGlvblVuaXQuYWNjZXNzb3JzKSB7CkBAIC04MzcsMTAgKzcxMyw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFwcGx5IHRoZSBnaXZlbiBbY29tYmluYXRvcnNdIHRvIGFsbCBvZiB0aGUgbmFtZXMgaW4gdGhlIGdpdmVuIHRhYmxlIG9mCi0gICAqIFtkZWZpbmVkTmFtZXNdLgotICAgKi8KKyAgLy8vIEFwcGx5IHRoZSBnaXZlbiBbY29tYmluYXRvcnNdIHRvIGFsbCBvZiB0aGUgbmFtZXMgaW4gdGhlIGdpdmVuIHRhYmxlIG9mCisgIC8vLyBbZGVmaW5lZE5hbWVzXS4KICAgTWFwPFN0cmluZywgRWxlbWVudD4gX2FwcGx5Q29tYmluYXRvcnMoTWFwPFN0cmluZywgRWxlbWVudD4gZGVmaW5lZE5hbWVzLAogICAgICAgTGlzdDxOYW1lc3BhY2VDb21iaW5hdG9yPiBjb21iaW5hdG9ycykgewogICAgIGZvciAoTmFtZXNwYWNlQ29tYmluYXRvciBjb21iaW5hdG9yIGluIGNvbWJpbmF0b3JzKSB7CkBAIC04NTcsMTMgKzczMSwxMSBAQAogICAgIHJldHVybiBkZWZpbmVkTmFtZXM7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIGEgbWFwcGluZyB0YWJsZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuCi0gICAqIFtsaWJyYXJ5XS4gVGhlIHNldCBvZiBbdmlzaXRlZEVsZW1lbnRzXSBjb250YWlucyB0aGUgbGlicmFyaWVzIHRoYXQgZG8gbm90Ci0gICAqIG5lZWQgdG8gYmUgdmlzaXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhlIGV4cG9ydCBkaXJlY3RpdmVzIG9mIHRoZSBnaXZlbgotICAgKiBsaWJyYXJ5IGJlY2F1c2UgYWxsIG9mIHRoZSBuYW1lcyBkZWZpbmVkIGJ5IHRoZW0gd2lsbCBiZSBhZGRlZCBieSBhbm90aGVyCi0gICAqIGxpYnJhcnkuCi0gICAqLworICAvLy8gQ3JlYXRlIGEgbWFwcGluZyB0YWJsZSByZXByZXNlbnRpbmcgdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuCisgIC8vLyBbbGlicmFyeV0uIFRoZSBzZXQgb2YgW3Zpc2l0ZWRFbGVtZW50c10gY29udGFpbnMgdGhlIGxpYnJhcmllcyB0aGF0IGRvIG5vdAorICAvLy8gbmVlZCB0byBiZSB2aXNpdGVkIHdoZW4gcHJvY2Vzc2luZyB0aGUgZXhwb3J0IGRpcmVjdGl2ZXMgb2YgdGhlIGdpdmVuCisgIC8vLyBsaWJyYXJ5IGJlY2F1c2UgYWxsIG9mIHRoZSBuYW1lcyBkZWZpbmVkIGJ5IHRoZW0gd2lsbCBiZSBhZGRlZCBieSBhbm90aGVyCisgIC8vLyBsaWJyYXJ5LgogICBNYXA8U3RyaW5nLCBFbGVtZW50PiBfY29tcHV0ZUV4cG9ydE1hcHBpbmcoCiAgICAgICBMaWJyYXJ5RWxlbWVudCBsaWJyYXJ5LCBIYXNoU2V0PExpYnJhcnlFbGVtZW50PiB2aXNpdGVkRWxlbWVudHMpIHsKICAgICB2aXNpdGVkRWxlbWVudHMuYWRkKGxpYnJhcnkpOwpAQCAtOTA2LDEwICs3NzgsOCBAQAogICAgIHJldHVybiBfY29tcHV0ZUV4cG9ydE1hcHBpbmcobGlicmFyeSwgSGFzaFNldDxMaWJyYXJ5RWxlbWVudD4oKSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgbmV3IG1hcCBvZiBuYW1lcyB3aGljaCBoYXMgYWxsIHRoZSBuYW1lcyBmcm9tIFtkZWZpbmVkTmFtZXNdCi0gICAqIHdpdGggZXhjZXB0aW9uIG9mIFtoaWRkZW5OYW1lc10uCi0gICAqLworICAvLy8gUmV0dXJuIGEgbmV3IG1hcCBvZiBuYW1lcyB3aGljaCBoYXMgYWxsIHRoZSBuYW1lcyBmcm9tIFtkZWZpbmVkTmFtZXNdCisgIC8vLyB3aXRoIGV4Y2VwdGlvbiBvZiBbaGlkZGVuTmFtZXNdLgogICBNYXA8U3RyaW5nLCBFbGVtZW50PiBfaGlkZSgKICAgICAgIE1hcDxTdHJpbmcsIEVsZW1lbnQ+IGRlZmluZWROYW1lcywgTGlzdDxTdHJpbmc+IGhpZGRlbk5hbWVzKSB7CiAgICAgTWFwPFN0cmluZywgRWxlbWVudD4gbmV3TmFtZXMgPSBIYXNoTWFwPFN0cmluZywgRWxlbWVudD4uZnJvbShkZWZpbmVkTmFtZXMpOwpAQCAtOTIwLDkgKzc5MCw3IEBACiAgICAgcmV0dXJuIG5ld05hbWVzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIG5ldyBtYXAgb2YgbmFtZXMgd2hpY2ggaGFzIG9ubHkgW3Nob3duTmFtZXNdIGZyb20gW2RlZmluZWROYW1lc10uCi0gICAqLworICAvLy8gUmV0dXJuIGEgbmV3IG1hcCBvZiBuYW1lcyB3aGljaCBoYXMgb25seSBbc2hvd25OYW1lc10gZnJvbSBbZGVmaW5lZE5hbWVzXS4KICAgTWFwPFN0cmluZywgRWxlbWVudD4gX3Nob3coCiAgICAgICBNYXA8U3RyaW5nLCBFbGVtZW50PiBkZWZpbmVkTmFtZXMsIExpc3Q8U3RyaW5nPiBzaG93bk5hbWVzKSB7CiAgICAgTWFwPFN0cmluZywgRWxlbWVudD4gbmV3TmFtZXMgPSBIYXNoTWFwPFN0cmluZywgRWxlbWVudD4oKTsKQEAgLTk0MSwzMyArODA5LDIzIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIG1hcHBpbmcgb2YgaWRlbnRpZmllcnMgdG8gdGhlIGVsZW1lbnRzIHJlcHJlc2VudGVkIGJ5IHRob3NlIGlkZW50aWZpZXJzLgotICogTmFtZXNwYWNlcyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBmb3Igc2NvcGVzLgotICovCisvLy8gQSBtYXBwaW5nIG9mIGlkZW50aWZpZXJzIHRvIHRoZSBlbGVtZW50cyByZXByZXNlbnRlZCBieSB0aG9zZSBpZGVudGlmaWVycy4KKy8vLyBOYW1lc3BhY2VzIGFyZSB0aGUgYnVpbGRpbmcgYmxvY2tzIGZvciBzY29wZXMuCiBjbGFzcyBQcmVmaXhlZE5hbWVzcGFjZSBpbXBsZW1lbnRzIE5hbWVzcGFjZSB7Ci0gIC8qKgotICAgKiBUaGUgcHJlZml4IHRoYXQgaXMgcHJlcGVuZGVkIHRvIGVhY2ggb2YgdGhlIGRlZmluZWQgbmFtZXMuCi0gICAqLworICAvLy8gVGhlIHByZWZpeCB0aGF0IGlzIHByZXBlbmRlZCB0byBlYWNoIG9mIHRoZSBkZWZpbmVkIG5hbWVzLgogICBmaW5hbCBTdHJpbmcgX3ByZWZpeDsKIAotICAvKioKLSAgICogVGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4LgotICAgKi8KKyAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIHByZWZpeC4KICAgZmluYWwgaW50IF9sZW5ndGg7CiAKLSAgLyoqCi0gICAqIEEgdGFibGUgbWFwcGluZyBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIHRvIHRoZSBlbGVtZW50Ci0gICAqIHJlcHJlc2VudGluZyB0aGUgdGhpbmcgZGVjbGFyZWQgd2l0aCB0aGF0IG5hbWUuCi0gICAqLworICAvLy8gQSB0YWJsZSBtYXBwaW5nIG5hbWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgdG8gdGhlIGVsZW1lbnQKKyAgLy8vIHJlcHJlc2VudGluZyB0aGUgdGhpbmcgZGVjbGFyZWQgd2l0aCB0aGF0IG5hbWUuCiAgIEBvdmVycmlkZQogICBmaW5hbCBNYXA8U3RyaW5nLCBFbGVtZW50PiBfZGVmaW5lZE5hbWVzOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBuYW1lc3BhY2UgdG8gaGF2ZSB0aGUgbmFtZXMgcmVzdWx0aW5nIGZyb20KLSAgICogcHJlZml4aW5nIGVhY2ggb2YgdGhlIFtfZGVmaW5lZE5hbWVzXSB3aXRoIHRoZSBnaXZlbiBbX3ByZWZpeF0gKGFuZCBhCi0gICAqIHBlcmlvZCkuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgbmFtZXNwYWNlIHRvIGhhdmUgdGhlIG5hbWVzIHJlc3VsdGluZyBmcm9tCisgIC8vLyBwcmVmaXhpbmcgZWFjaCBvZiB0aGUgW19kZWZpbmVkTmFtZXNdIHdpdGggdGhlIGdpdmVuIFtfcHJlZml4XSAoYW5kIGEKKyAgLy8vIHBlcmlvZCkuCiAgIFByZWZpeGVkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIHRoaXMuX2RlZmluZWROYW1lcykKICAgICAgIDogX3ByZWZpeCA9IHByZWZpeCwKICAgICAgICAgX2xlbmd0aCA9IHByZWZpeC5sZW5ndGg7CkBAIC0xMDAwLDUxICs4NTgsMzUgQEAKICAgfQogfQogCi0vKioKLSAqIEEgbmFtZSBzY29wZSB1c2VkIGJ5IHRoZSByZXNvbHZlciB0byBkZXRlcm1pbmUgd2hpY2ggbmFtZXMgYXJlIHZpc2libGUgYXQgYW55Ci0gKiBnaXZlbiBwb2ludCBpbiB0aGUgY29kZS4KLSAqLworLy8vIEEgbmFtZSBzY29wZSB1c2VkIGJ5IHRoZSByZXNvbHZlciB0byBkZXRlcm1pbmUgd2hpY2ggbmFtZXMgYXJlIHZpc2libGUgYXQKKy8vLyBhbnkgZ2l2ZW4gcG9pbnQgaW4gdGhlIGNvZGUuCiBhYnN0cmFjdCBjbGFzcyBTY29wZSB7Ci0gIC8qKgotICAgKiBUaGUgcHJlZml4IHVzZWQgdG8gbWFyayBhbiBpZGVudGlmaWVyIGFzIGJlaW5nIHByaXZhdGUgdG8gaXRzIGxpYnJhcnkuCi0gICAqLworICAvLy8gVGhlIHByZWZpeCB1c2VkIHRvIG1hcmsgYW4gaWRlbnRpZmllciBhcyBiZWluZyBwcml2YXRlIHRvIGl0cyBsaWJyYXJ5LgogICBzdGF0aWMgaW50IFBSSVZBVEVfTkFNRV9QUkVGSVggPSAweDVGOwogCi0gIC8qKgotICAgKiBUaGUgc3VmZml4IGFkZGVkIHRvIHRoZSBkZWNsYXJlZCBuYW1lIG9mIGEgc2V0dGVyIHdoZW4gbG9va2luZyB1cCB0aGUKLSAgICogc2V0dGVyLiBVc2VkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGEgZ2V0dGVyIGFuZCBhIHNldHRlciB0aGF0IGhhdmUgdGhlCi0gICAqIHNhbWUgbmFtZS4KLSAgICovCisgIC8vLyBUaGUgc3VmZml4IGFkZGVkIHRvIHRoZSBkZWNsYXJlZCBuYW1lIG9mIGEgc2V0dGVyIHdoZW4gbG9va2luZyB1cCB0aGUKKyAgLy8vIHNldHRlci4gVXNlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBhIGdldHRlciBhbmQgYSBzZXR0ZXIgdGhhdCBoYXZlIHRoZQorICAvLy8gc2FtZSBuYW1lLgogICBzdGF0aWMgU3RyaW5nIFNFVFRFUl9TVUZGSVggPSAiPSI7CiAKLSAgLyoqCi0gICAqIFRoZSBuYW1lIHVzZWQgdG8gbG9vayB1cCB0aGUgbWV0aG9kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBtaW51cwotICAgKiBvcGVyYXRvci4gVXNlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiB0aGUgdW5hcnkgYW5kIGJpbmFyeSBvcGVyYXRvcnMuCi0gICAqLworICAvLy8gVGhlIG5hbWUgdXNlZCB0byBsb29rIHVwIHRoZSBtZXRob2QgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IG1pbnVzCisgIC8vLyBvcGVyYXRvci4gVXNlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiB0aGUgdW5hcnkgYW5kIGJpbmFyeSBvcGVyYXRvcnMuCiAgIHN0YXRpYyBTdHJpbmcgVU5BUllfTUlOVVMgPSAidW5hcnktIjsKIAotICAvKioKLSAgICogQSB0YWJsZSBtYXBwaW5nIG5hbWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyBzY29wZSB0byB0aGUgZWxlbWVudAotICAgKiByZXByZXNlbnRpbmcgdGhlIHRoaW5nIGRlY2xhcmVkIHdpdGggdGhhdCBuYW1lLgotICAgKi8KKyAgLy8vIEEgdGFibGUgbWFwcGluZyBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgc2NvcGUgdG8gdGhlIGVsZW1lbnQKKyAgLy8vIHJlcHJlc2VudGluZyB0aGUgdGhpbmcgZGVjbGFyZWQgd2l0aCB0aGF0IG5hbWUuCiAgIE1hcDxTdHJpbmcsIEVsZW1lbnQ+IF9kZWZpbmVkTmFtZXM7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhpcyBzY29wZSBpcyBsZXhpY2FsbHkgZW5jbG9zZWQuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzY29wZSBpbiB3aGljaCB0aGlzIHNjb3BlIGlzIGxleGljYWxseSBlbmNsb3NlZC4KICAgU2NvcGUgZ2V0IGVuY2xvc2luZ1Njb3BlID0+IG51bGw7CiAKLSAgLyoqCi0gICAqIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGlzIHNjb3BlLgotICAgKi8KKyAgLy8vIFRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGlzIHNjb3BlLgogICBMaXN0PEV4dGVuc2lvbkVsZW1lbnQ+IGdldCBleHRlbnNpb25zID0+CiAgICAgICBlbmNsb3NpbmdTY29wZSA9PSBudWxsID8gPEV4dGVuc2lvbkVsZW1lbnQ+W10gOiBlbmNsb3NpbmdTY29wZS5leHRlbnNpb25zOwogCi0gIC8qKgotICAgKiBBZGQgdGhlIGdpdmVuIFtlbGVtZW50XSB0byB0aGlzIHNjb3BlLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVsZW1lbnQgd2l0aAotICAgKiB0aGUgZ2l2ZW4gbmFtZSBkZWZpbmVkIGluIHRoaXMgc2NvcGUsIHRoZW4gdGhlIG9yaWdpbmFsIGVsZW1lbnQgd2lsbAotICAgKiBjb250aW51ZSB0byBiZSBtYXBwZWQgdG8gdGhlIG5hbWUuCi0gICAqLworICAvLy8gQWRkIHRoZSBnaXZlbiBbZWxlbWVudF0gdG8gdGhpcyBzY29wZS4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBlbGVtZW50IHdpdGgKKyAgLy8vIHRoZSBnaXZlbiBuYW1lIGRlZmluZWQgaW4gdGhpcyBzY29wZSwgdGhlbiB0aGUgb3JpZ2luYWwgZWxlbWVudCB3aWxsCisgIC8vLyBjb250aW51ZSB0byBiZSBtYXBwZWQgdG8gdGhlIG5hbWUuCiAgIHZvaWQgZGVmaW5lKEVsZW1lbnQgZWxlbWVudCkgewogICAgIFN0cmluZyBuYW1lID0gX2dldE5hbWUoZWxlbWVudCk7CiAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmlzTm90RW1wdHkpIHsKQEAgLTEwNTMsMzYgKzg5NSwyOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBZGQgdGhlIGdpdmVuIFtlbGVtZW50XSB0byB0aGlzIHNjb3BlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0aW9uIG9yCi0gICAqIGhpZGluZy4KLSAgICovCisgIC8vLyBBZGQgdGhlIGdpdmVuIFtlbGVtZW50XSB0byB0aGlzIHNjb3BlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0aW9uIG9yCisgIC8vLyBoaWRpbmcuCiAgIHZvaWQgZGVmaW5lTmFtZVdpdGhvdXRDaGVja2luZyhTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50KSB7CiAgICAgX2RlZmluZWROYW1lcyA/Pz0gSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+KCk7CiAgICAgX2RlZmluZWROYW1lc1tuYW1lXSA9IGVsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRoZSBnaXZlbiBbZWxlbWVudF0gdG8gdGhpcyBzY29wZSB3aXRob3V0IGNoZWNraW5nIGZvciBkdXBsaWNhdGlvbiBvcgotICAgKiBoaWRpbmcuCi0gICAqLworICAvLy8gQWRkIHRoZSBnaXZlbiBbZWxlbWVudF0gdG8gdGhpcyBzY29wZSB3aXRob3V0IGNoZWNraW5nIGZvciBkdXBsaWNhdGlvbiBvcgorICAvLy8gaGlkaW5nLgogICB2b2lkIGRlZmluZVdpdGhvdXRDaGVja2luZyhFbGVtZW50IGVsZW1lbnQpIHsKICAgICBfZGVmaW5lZE5hbWVzID8/PSBIYXNoTWFwPFN0cmluZywgRWxlbWVudD4oKTsKICAgICBfZGVmaW5lZE5hbWVzW19nZXROYW1lKGVsZW1lbnQpXSA9IGVsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtuYW1lXSBpcyBhc3NvY2lhdGVkLCBvciBgbnVsbGAgaWYKLSAgICogdGhlIG5hbWUgaXMgbm90IGRlZmluZWQgd2l0aGluIHRoaXMgc2NvcGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtuYW1lXSBpcyBhc3NvY2lhdGVkLCBvciBgbnVsbGAgaWYKKyAgLy8vIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLgogICBFbGVtZW50IGludGVybmFsTG9va3VwKFN0cmluZyBuYW1lKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtuYW1lXSBpcyBhc3NvY2lhdGVkLCBvciBgbnVsbGAgaWYKLSAgICogdGhlIG5hbWUgaXMgbm90IGRlZmluZWQgd2l0aGluIHRoaXMgc2NvcGUuIFRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucwotICAgKiBlbGVtZW50cyB0aGF0IGFyZSBkaXJlY3RseSBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLCBub3QgZWxlbWVudHMgdGhhdCBhcmUKLSAgICogZGVmaW5lZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtuYW1lXSBpcyBhc3NvY2lhdGVkLCBvciBgbnVsbGAgaWYKKyAgLy8vIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLiBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMKKyAgLy8vIGVsZW1lbnRzIHRoYXQgYXJlIGRpcmVjdGx5IGRlZmluZWQgd2l0aGluIHRoaXMgc2NvcGUsIG5vdCBlbGVtZW50cyB0aGF0CisgIC8vLyBhcmUgZGVmaW5lZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUuCiAgIEVsZW1lbnQgbG9jYWxMb29rdXAoU3RyaW5nIG5hbWUpIHsKICAgICBpZiAoX2RlZmluZWROYW1lcyAhPSBudWxsKSB7CiAgICAgICByZXR1cm4gX2RlZmluZWROYW1lc1tuYW1lXTsKQEAgLTEwOTAsMTIgKzkyNCwxMCBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCB3aXRoIHdoaWNoIHRoZSBnaXZlbiBbaWRlbnRpZmllcl0gaXMgYXNzb2NpYXRlZCwgb3IKLSAgICogYG51bGxgIGlmIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLiBUaGUKLSAgICogW3JlZmVyZW5jaW5nTGlicmFyeV0gaXMgdGhlIGxpYnJhcnkgdGhhdCBjb250YWlucyB0aGUgcmVmZXJlbmNlIHRvIHRoZQotICAgKiBuYW1lLCB1c2VkIHRvIGltcGxlbWVudCBsaWJyYXJ5LWxldmVsIHByaXZhY3kuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtpZGVudGlmaWVyXSBpcyBhc3NvY2lhdGVkLCBvcgorICAvLy8gYG51bGxgIGlmIHRoZSBuYW1lIGlzIG5vdCBkZWZpbmVkIHdpdGhpbiB0aGlzIHNjb3BlLiBUaGUKKyAgLy8vIFtyZWZlcmVuY2luZ0xpYnJhcnldIGlzIHRoZSBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdGhlIHJlZmVyZW5jZSB0byB0aGUKKyAgLy8vIG5hbWUsIHVzZWQgdG8gaW1wbGVtZW50IGxpYnJhcnktbGV2ZWwgcHJpdmFjeS4KICAgRWxlbWVudCBsb29rdXAoSWRlbnRpZmllciBpZGVudGlmaWVyLCBMaWJyYXJ5RWxlbWVudCByZWZlcmVuY2luZ0xpYnJhcnkpIHsKICAgICBpZiAoaWRlbnRpZmllciBpcyBQcmVmaXhlZElkZW50aWZpZXIpIHsKICAgICAgIHJldHVybiBfaW50ZXJuYWxMb29rdXBQcmVmaXhlZCgKQEAgLTExMDQsMTMgKzkzNiwxMSBAQAogICAgIHJldHVybiBpbnRlcm5hbExvb2t1cChpZGVudGlmaWVyLm5hbWUpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGZhY3QgdGhhdCB0aGUgZ2l2ZW4gW25vZGVdIGlzIG5vdCBkZWZpbmVkIHNob3VsZCBiZQotICAgKiBpZ25vcmVkIChmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBlcnJvciByZXBvcnRpbmcpLiBUaGlzIHdpbGwgYmUgdGhlIGNhc2UgaWYKLSAgICogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGltcG9ydCB0aGF0IGRlZmluZXMgdGhlIG5vZGUncyBwcmVmaXgsIGFuZCBpZiB0aGF0Ci0gICAqIGltcG9ydCBlaXRoZXIgaGFzIG5vIHNob3cgY29tYmluYXRvcnMgb3IgaGFzIGEgc2hvdyBjb21iaW5hdG9yIHRoYXQKLSAgICogZXhwbGljaXRseSBsaXN0cyB0aGUgbm9kZSdzIG5hbWUuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBbbm9kZV0gaXMgbm90IGRlZmluZWQgc2hvdWxkIGJlCisgIC8vLyBpZ25vcmVkIChmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBlcnJvciByZXBvcnRpbmcpLiBUaGlzIHdpbGwgYmUgdGhlIGNhc2UKKyAgLy8vIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbXBvcnQgdGhhdCBkZWZpbmVzIHRoZSBub2RlJ3MgcHJlZml4LCBhbmQgaWYKKyAgLy8vIHRoYXQgaW1wb3J0IGVpdGhlciBoYXMgbm8gc2hvdyBjb21iaW5hdG9ycyBvciBoYXMgYSBzaG93IGNvbWJpbmF0b3IgdGhhdAorICAvLy8gZXhwbGljaXRseSBsaXN0cyB0aGUgbm9kZSdzIG5hbWUuCiAgIGJvb2wgc2hvdWxkSWdub3JlVW5kZWZpbmVkKElkZW50aWZpZXIgbm9kZSkgewogICAgIGlmIChlbmNsb3NpbmdTY29wZSAhPSBudWxsKSB7CiAgICAgICByZXR1cm4gZW5jbG9zaW5nU2NvcGUuc2hvdWxkSWdub3JlVW5kZWZpbmVkKG5vZGUpOwpAQCAtMTExOCw5ICs5NDgsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9vayB1cCB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBnaXZlbiBbZWxlbWVudF0uCiAgIFN0cmluZyBfZ2V0TmFtZShFbGVtZW50IGVsZW1lbnQpIHsKICAgICBpZiAoZWxlbWVudCBpcyBNZXRob2RFbGVtZW50KSB7CiAgICAgICBNZXRob2RFbGVtZW50IG1ldGhvZCA9IGVsZW1lbnQ7CkBAIC0xMTMxLDI4ICs5NTksMjAgQEAKICAgICByZXR1cm4gZWxlbWVudC5uYW1lOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCB3aXRoIHdoaWNoIHRoZSBnaXZlbiBbcHJlZml4XSBhbmQgW25hbWVdIGFyZSBhc3NvY2lhdGVkLAotICAgKiBvciBgbnVsbGAgaWYgdGhlIG5hbWUgaXMgbm90IGRlZmluZWQgd2l0aGluIHRoaXMgc2NvcGUuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IHdpdGggd2hpY2ggdGhlIGdpdmVuIFtwcmVmaXhdIGFuZCBbbmFtZV0gYXJlCisgIC8vLyBhc3NvY2lhdGVkLCBvciBgbnVsbGAgaWYgdGhlIG5hbWUgaXMgbm90IGRlZmluZWQgd2l0aGluIHRoaXMgc2NvcGUuCiAgIEVsZW1lbnQgX2ludGVybmFsTG9va3VwUHJlZml4ZWQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbbmFtZV0gaXMgYSBsaWJyYXJ5LXByaXZhdGUgbmFtZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbbmFtZV0gaXMgYSBsaWJyYXJ5LXByaXZhdGUgbmFtZS4KICAgc3RhdGljIGJvb2wgaXNQcml2YXRlTmFtZShTdHJpbmcgbmFtZSkgPT4KICAgICAgIG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoJ18nKTsKIH0KIAotLyoqCi0gKiBUaGUgc2NvcGUgZGVmaW5lZCBieSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIGFuIGVsZW1lbnQgdGhhdCBkZWZpbmVzIHR5cGUKLSAqIHBhcmFtZXRlcnMuCi0gKi8KKy8vLyBUaGUgc2NvcGUgZGVmaW5lZCBieSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIGFuIGVsZW1lbnQgdGhhdCBkZWZpbmVzIHR5cGUKKy8vLyBwYXJhbWV0ZXJzLgogY2xhc3MgVHlwZVBhcmFtZXRlclNjb3BlIGV4dGVuZHMgRW5jbG9zZWRTY29wZSB7Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY29wZSwgZW5jbG9zZWQgd2l0aGluIHRoZSBbZW5jbG9zaW5nU2NvcGVdLAotICAgKiB0aGF0IGRlZmluZXMgdGhlIHR5cGUgcGFyYW1ldGVycyBmcm9tIHRoZSBnaXZlbiBbZWxlbWVudF0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2NvcGUsIGVuY2xvc2VkIHdpdGhpbiB0aGUgW2VuY2xvc2luZ1Njb3BlXSwKKyAgLy8vIHRoYXQgZGVmaW5lcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGdpdmVuIFtlbGVtZW50XS4KICAgVHlwZVBhcmFtZXRlclNjb3BlKFNjb3BlIGVuY2xvc2luZ1Njb3BlLCBUeXBlUGFyYW1ldGVyaXplZEVsZW1lbnQgZWxlbWVudCkKICAgICAgIDogc3VwZXIoZW5jbG9zaW5nU2NvcGUpIHsKICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7CkBAIC0xMTYxLDkgKzk4MSw3IEBACiAgICAgX2RlZmluZVR5cGVQYXJhbWV0ZXJzKGVsZW1lbnQpOwogICB9CiAKLSAgLyoqCi0gICAqIERlZmluZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGRlY2xhcmVkIGJ5IHRoZSBbZWxlbWVudF0uCi0gICAqLworICAvLy8gRGVmaW5lIHRoZSB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgYnkgdGhlIFtlbGVtZW50XS4KICAgdm9pZCBfZGVmaW5lVHlwZVBhcmFtZXRlcnMoVHlwZVBhcmFtZXRlcml6ZWRFbGVtZW50IGVsZW1lbnQpIHsKICAgICBmb3IgKFR5cGVQYXJhbWV0ZXJFbGVtZW50IHR5cGVQYXJhbWV0ZXIgaW4gZWxlbWVudC50eXBlUGFyYW1ldGVycykgewogICAgICAgZGVmaW5lKHR5cGVQYXJhbWV0ZXIpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci90eXBlX25hbWVfcmVzb2x2ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9uYW1lX3Jlc29sdmVyLmRhcnQKaW5kZXggOTI4NTA0Zi4uMTgzY2Y1MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci90eXBlX25hbWVfcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3R5cGVfbmFtZV9yZXNvbHZlci5kYXJ0CkBAIC02LDE1ICs2LDE1IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L251bGxhYmlsaXR5X3N1ZmZpeC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9saXN0ZW5lci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGlhZ25vc3RpYy9kaWFnbm9zdGljX2ZhY3RvcnkuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIAogLy8vIEhlbHBlciBmb3IgcmVzb2x2aW5nIHR5cGVzLgogLy8vCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3R5cGVfcHJvcGVydHlfcmVzb2x2ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9wcm9wZXJ0eV9yZXNvbHZlci5kYXJ0CmluZGV4IGI0YjFiYTkuLmVkYzAzNzQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9wcm9wZXJ0eV9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZV9wcm9wZXJ0eV9yZXNvbHZlci5kYXJ0CkBAIC04LDYgKzgsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2V4dGVuc2lvbl9tZW1iZXJfcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvcmVzb2x1dGlvbl9yZXN1bHQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIvdHlwZWRfbGl0ZXJhbF9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci90eXBlZF9saXRlcmFsX3Jlc29sdmVyLmRhcnQKaW5kZXggMjFmNzRlYS4uN2UzYTBmNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci90eXBlZF9saXRlcmFsX3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci90eXBlZF9saXRlcmFsX3Jlc29sdmVyLmRhcnQKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9taWdyYXRhYmxlX2FzdF9pbmZvX3Byb3ZpZGVyLmRhcnQnOwpAQCAtNTc0LDE0ICs1NzUsMTIgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmVjb3JkIHRoYXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBub2RlIGlzIHRoZSBnaXZlbiB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbm9kZSB3aG9zZSB0eXBlIGlzIHRvIGJlIHJlY29yZGVkCi0gICAqIEBwYXJhbSB0eXBlIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgbm9kZQotICAgKgotICAgKiBUT0RPKHNjaGVnbG92KSBJbmxpbmUgdGhpcy4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhhdCB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIG5vZGUgaXMgdGhlIGdpdmVuIHR5cGUuCisgIC8vLworICAvLy8gQHBhcmFtIGV4cHJlc3Npb24gdGhlIG5vZGUgd2hvc2UgdHlwZSBpcyB0byBiZSByZWNvcmRlZAorICAvLy8gQHBhcmFtIHR5cGUgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBub2RlCisgIC8vLworICAvLy8gVE9ETyhzY2hlZ2xvdikgSW5saW5lIHRoaXMuCiAgIHZvaWQgX3JlY29yZFN0YXRpY1R5cGUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBEYXJ0VHlwZSB0eXBlKSB7CiAgICAgZXhwcmVzc2lvbi5zdGF0aWNUeXBlID0gdHlwZTsKIC8vICAgIGlmICh0eXBlID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIveWllbGRfc3RhdGVtZW50X3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3Jlc29sdmVyL3lpZWxkX3N0YXRlbWVudF9yZXNvbHZlci5kYXJ0CmluZGV4IDQ3YjU1ZGYuLjAwYWVhOTggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvcmVzb2x2ZXIveWllbGRfc3RhdGVtZW50X3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9yZXNvbHZlci95aWVsZF9zdGF0ZW1lbnRfcmVzb2x2ZXIuZGFydApAQCAtOCw5ICs4LDkgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9saXN0ZW5lci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogLy8vIEhlbHBlciBmb3IgcmVzb2x2aW5nIFtZaWVsZFN0YXRlbWVudF1zLgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zY2FubmVyL3JlYWRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zY2FubmVyL3JlYWRlci5kYXJ0CmluZGV4IDFmMWQyNjYuLjkzMWQ0MzggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvc2Nhbm5lci9yZWFkZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3NjYW5uZXIvcmVhZGVyLmRhcnQKQEAgLTcsMzAgKzcsMjAgQEAKIGV4cG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3JlYWRlci5kYXJ0JwogICAgIHNob3cgQ2hhcmFjdGVyUmVhZGVyLCBDaGFyU2VxdWVuY2VSZWFkZXIsIFN1YlNlcXVlbmNlUmVhZGVyOwogCi0vKioKLSAqIEEgW0NoYXJhY3RlclJlYWRlcl0gdGhhdCByZWFkcyBhIHJhbmdlIG9mIGNoYXJhY3RlcnMgZnJvbSBhbm90aGVyIGNoYXJhY3RlcgotICogcmVhZGVyLgotICovCisvLy8gQSBbQ2hhcmFjdGVyUmVhZGVyXSB0aGF0IHJlYWRzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBmcm9tIGFub3RoZXIgY2hhcmFjdGVyCisvLy8gcmVhZGVyLgogY2xhc3MgQ2hhcmFjdGVyUmFuZ2VSZWFkZXIgZXh0ZW5kcyBDaGFyYWN0ZXJSZWFkZXIgewotICAvKioKLSAgICogVGhlIHJlYWRlciBmcm9tIHdoaWNoIHRoZSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSBiZWluZyByZWFkLgotICAgKi8KKyAgLy8vIFRoZSByZWFkZXIgZnJvbSB3aGljaCB0aGUgY2hhcmFjdGVycyBhcmUgYWN0dWFsbHkgYmVpbmcgcmVhZC4KICAgZmluYWwgQ2hhcmFjdGVyUmVhZGVyIGJhc2VSZWFkZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgcmVhZC4KLSAgICovCisgIC8vLyBUaGUgZmlyc3QgY2hhcmFjdGVyIHRvIGJlIHJlYWQuCiAgIGZpbmFsIGludCBzdGFydEluZGV4OwogCi0gIC8qKgotICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXIgdG8gYmUgcmVhZC4KLSAgICovCisgIC8vLyBUaGUgbGFzdCBjaGFyYWN0ZXIgdG8gYmUgcmVhZC4KICAgZmluYWwgaW50IGVuZEluZGV4OwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZWFkZXIgdG8gcmVhZCB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBnaXZlbgotICAgKiBbYmFzZVJlYWRlcl0gYmV0d2VlbiB0aGUgW3N0YXJ0SW5kZXhdIGluY2x1c2l2ZSB0byBbZW5kSW5kZXhdIGV4Y2x1c2l2ZS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZWFkZXIgdG8gcmVhZCB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBnaXZlbgorICAvLy8gW2Jhc2VSZWFkZXJdIGJldHdlZW4gdGhlIFtzdGFydEluZGV4XSBpbmNsdXNpdmUgdG8gW2VuZEluZGV4XSBleGNsdXNpdmUuCiAgIENoYXJhY3RlclJhbmdlUmVhZGVyKHRoaXMuYmFzZVJlYWRlciwgdGhpcy5zdGFydEluZGV4LCB0aGlzLmVuZEluZGV4KSB7CiAgICAgYmFzZVJlYWRlci5vZmZzZXQgPSBzdGFydEluZGV4IC0gMTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zY2FubmVyL3NjYW5uZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvc2Nhbm5lci9zY2FubmVyLmRhcnQKaW5kZXggNTAwMzQwMi4uYzJjZTJlOCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zY2FubmVyL3NjYW5uZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9kYXJ0L3NjYW5uZXIvc2Nhbm5lci5kYXJ0CkBAIC0xOCw3NyArMTgsNTkgQEAKIAogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2Vycm9yL3N5bnRhY3RpY19lcnJvcnMuZGFydCc7CiAKLS8qKgotICogVGhlIGNsYXNzIGBTY2FubmVyYCBpbXBsZW1lbnRzIGEgc2Nhbm5lciBmb3IgRGFydCBjb2RlLgotICoKLSAqIFRoZSBsZXhpY2FsIHN0cnVjdHVyZSBvZiBEYXJ0IGlzIGFtYmlndW91cyB3aXRob3V0IGtub3dsZWRnZSBvZiB0aGUgY29udGV4dAotICogaW4gd2hpY2ggYSB0b2tlbiBpcyBiZWluZyBzY2FubmVkLiBGb3IgZXhhbXBsZSwgd2l0aG91dCBjb250ZXh0IHdlIGNhbm5vdAotICogZGV0ZXJtaW5lIHdoZXRoZXIgc291cmNlIG9mIHRoZSBmb3JtICI8PCIgc2hvdWxkIGJlIHNjYW5uZWQgYXMgYSBzaW5nbGUKLSAqIGxlZnQtc2hpZnQgb3BlcmF0b3Igb3IgYXMgdHdvIGxlZnQgYW5nbGUgYnJhY2tldHMuIFRoaXMgc2Nhbm5lciBkb2VzIG5vdCBoYXZlCi0gKiBhbnkgY29udGV4dCwgc28gaXQgYWx3YXlzIHJlc29sdmVzIHN1Y2ggY29uZmxpY3RzIGJ5IHNjYW5uaW5nIHRoZSBsb25nZXN0Ci0gKiBwb3NzaWJsZSB0b2tlbi4KLSAqLworLy8vIFRoZSBjbGFzcyBgU2Nhbm5lcmAgaW1wbGVtZW50cyBhIHNjYW5uZXIgZm9yIERhcnQgY29kZS4KKy8vLworLy8vIFRoZSBsZXhpY2FsIHN0cnVjdHVyZSBvZiBEYXJ0IGlzIGFtYmlndW91cyB3aXRob3V0IGtub3dsZWRnZSBvZiB0aGUgY29udGV4dAorLy8vIGluIHdoaWNoIGEgdG9rZW4gaXMgYmVpbmcgc2Nhbm5lZC4gRm9yIGV4YW1wbGUsIHdpdGhvdXQgY29udGV4dCB3ZSBjYW5ub3QKKy8vLyBkZXRlcm1pbmUgd2hldGhlciBzb3VyY2Ugb2YgdGhlIGZvcm0gIjw8IiBzaG91bGQgYmUgc2Nhbm5lZCBhcyBhIHNpbmdsZQorLy8vIGxlZnQtc2hpZnQgb3BlcmF0b3Igb3IgYXMgdHdvIGxlZnQgYW5nbGUgYnJhY2tldHMuIFRoaXMgc2Nhbm5lciBkb2VzIG5vdAorLy8vIGhhdmUgYW55IGNvbnRleHQsIHNvIGl0IGFsd2F5cyByZXNvbHZlcyBzdWNoIGNvbmZsaWN0cyBieSBzY2FubmluZyB0aGUKKy8vLyBsb25nZXN0IHBvc3NpYmxlIHRva2VuLgogY2xhc3MgU2Nhbm5lciB7CiAgIGZpbmFsIFNvdXJjZSBzb3VyY2U7CiAKLSAgLyoqCi0gICAqIFRoZSB0ZXh0IHRvIGJlIHNjYW5uZWQuCi0gICAqLworICAvLy8gVGhlIHRleHQgdG8gYmUgc2Nhbm5lZC4KICAgZmluYWwgU3RyaW5nIF9jb250ZW50czsKIAotICAvKioKLSAgICogVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20gdGhlIHJlYWRlci4KLSAgICovCisgIC8vLyBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVhZGVyLgogICBmaW5hbCBpbnQgX3JlYWRlck9mZnNldDsKIAotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbmZvcm1lZCBvZiBhbnkgZXJyb3JzIHRoYXQgYXJlIGZvdW5kCi0gICAqIGR1cmluZyB0aGUgc2Nhbi4KLSAgICovCisgIC8vLyBUaGUgZXJyb3IgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGluZm9ybWVkIG9mIGFueSBlcnJvcnMgdGhhdCBhcmUgZm91bmQKKyAgLy8vIGR1cmluZyB0aGUgc2Nhbi4KICAgZmluYWwgQW5hbHlzaXNFcnJvckxpc3RlbmVyIF9lcnJvckxpc3RlbmVyOwogCi0gIC8qKgotICAgKiBJZiB0aGUgZmlsZSBoYXMgW2Zhc3RhLkxhbmd1YWdlVmVyc2lvblRva2VuXSwgaXQgaXMgYWxsb3dlZCB0byB1c2UgdGhlCi0gICAqIGxhbmd1YWdlIHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBwYWNrYWdlIGNvbmZpZy4KLSAgICogU28sIHdlIG5lZWQgdG8ga25vdyB0aGUgZnVsbCBmZWF0dXJlIHNldCBmb3IgdGhlIGNvbnRleHQuCi0gICAqLworICAvLy8gSWYgdGhlIGZpbGUgaGFzIFtmYXN0YS5MYW5ndWFnZVZlcnNpb25Ub2tlbl0sIGl0IGlzIGFsbG93ZWQgdG8gdXNlIHRoZQorICAvLy8gbGFuZ3VhZ2UgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIHBhY2thZ2UgY29uZmlnLgorICAvLy8gU28sIHdlIG5lZWQgdG8ga25vdyB0aGUgZnVsbCBmZWF0dXJlIHNldCBmb3IgdGhlIGNvbnRleHQuCiAgIEZlYXR1cmVTZXQgX2ZlYXR1cmVTZXRGb3JPdmVycmlkaW5nOwogCi0gIC8qKgotICAgKiBUaGUgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgZG9jdW1lbnRhdGlvbiBjb21tZW50cyBzaG91bGQgYmUgcGFyc2VkLgotICAgKi8KKyAgLy8vIFRoZSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIHNob3VsZCBiZSBwYXJzZWQuCiAgIGJvb2wgX3ByZXNlcnZlQ29tbWVudHMgPSB0cnVlOwogCiAgIGZpbmFsIExpc3Q8aW50PiBsaW5lU3RhcnRzID0gPGludD5bXTsKIAogICBUb2tlbiBmaXJzdFRva2VuOwogCi0gIC8qKgotICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzY2FubmVyIHNob3VsZCByZWNvZ25pemUgdGhlIGA+Pj5gIG9wZXJhdG9yCi0gICAqIGFuZCB0aGUgYD4+Pj1gIG9wZXJhdG9yLgotICAgKgotICAgKiBVc2UgW2NvbmZpZ3VyZUZlYXR1cmVzXSByYXRoZXIgdGhhbiB0aGlzIGZpZWxkLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNjYW5uZXIgc2hvdWxkIHJlY29nbml6ZSB0aGUgYD4+PmAgb3BlcmF0b3IKKyAgLy8vIGFuZCB0aGUgYD4+Pj1gIG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFVzZSBbY29uZmlndXJlRmVhdHVyZXNdIHJhdGhlciB0aGFuIHRoaXMgZmllbGQuCiAgIGJvb2wgZW5hYmxlR3RHdEd0ID0gZmFsc2U7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNjYW5uZXIgc2hvdWxkIHJlY29nbml6ZSB0aGUgYGxhdGVgIGFuZAotICAgKiBgcmVxdWlyZWRgIGtleXdvcmRzLgotICAgKgotICAgKiBVc2UgW2NvbmZpZ3VyZUZlYXR1cmVzXSByYXRoZXIgdGhhbiB0aGlzIGZpZWxkLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNjYW5uZXIgc2hvdWxkIHJlY29nbml6ZSB0aGUgYGxhdGVgIGFuZAorICAvLy8gYHJlcXVpcmVkYCBrZXl3b3Jkcy4KKyAgLy8vCisgIC8vLyBVc2UgW2NvbmZpZ3VyZUZlYXR1cmVzXSByYXRoZXIgdGhhbiB0aGlzIGZpZWxkLgogICBib29sIGVuYWJsZU5vbk51bGxhYmxlID0gZmFsc2U7CiAKICAgZmFzdGEuTGFuZ3VhZ2VWZXJzaW9uVG9rZW4gX2xhbmd1YWdlVmVyc2lvbjsKIAogICBGZWF0dXJlU2V0IF9mZWF0dXJlU2V0OwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzY2FubmVyIHRvIHNjYW4gY2hhcmFjdGVycyBmcm9tIHRoZSBnaXZlbgotICAgKiBbc291cmNlXS4gVGhlIGdpdmVuIGNoYXJhY3RlciBbcmVhZGVyXSB3aWxsIGJlIHVzZWQgdG8gcmVhZCB0aGUgY2hhcmFjdGVycwotICAgKiBpbiB0aGUgc291cmNlLiBUaGUgZ2l2ZW4gW19lcnJvckxpc3RlbmVyXSB3aWxsIGJlIGluZm9ybWVkIG9mIGFueSBlcnJvcnMKLSAgICogdGhhdCBhcmUgZm91bmQuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2Nhbm5lciB0byBzY2FuIGNoYXJhY3RlcnMgZnJvbSB0aGUgZ2l2ZW4KKyAgLy8vIFtzb3VyY2VdLiBUaGUgZ2l2ZW4gY2hhcmFjdGVyIFtyZWFkZXJdIHdpbGwgYmUgdXNlZCB0byByZWFkIHRoZSBjaGFyYWN0ZXJzCisgIC8vLyBpbiB0aGUgc291cmNlLiBUaGUgZ2l2ZW4gW19lcnJvckxpc3RlbmVyXSB3aWxsIGJlIGluZm9ybWVkIG9mIGFueSBlcnJvcnMKKyAgLy8vIHRoYXQgYXJlIGZvdW5kLgogICBmYWN0b3J5IFNjYW5uZXIoU291cmNlIHNvdXJjZSwgQ2hhcmFjdGVyUmVhZGVyIHJlYWRlciwKICAgICAgICAgICBBbmFseXNpc0Vycm9yTGlzdGVuZXIgZXJyb3JMaXN0ZW5lcikgPT4KICAgICAgIFNjYW5uZXIuZmFzdGEoc291cmNlLCBlcnJvckxpc3RlbmVyLApAQCAtMTA1LDIyICs4NywxOCBAQAogICAgIGxpbmVTdGFydHMuYWRkKDApOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzY2FubmVyLgotICAgKgotICAgKiBJZiBhIGxhbmd1YWdlIHZlcnNpb24gY29tbWVudCAoZS5nLiAnLy8gQGRhcnQgPSAyLjMnKSBpcyBkZXRlY3RlZAotICAgKiB3aGVuIGNhbGxpbmcgW3Rva2VuaXplXSBhbmQgdGhpcyBmaWVsZCBpcyBub24tbnVsbCwgdGhlbiB0aGlzIGZpZWxkCi0gICAqIHdpbGwgYmUgdXBkYXRlZCB0byBjb250YWluIGEgZG93bmdyYWRlZCBmZWF0dXJlIHNldCBiYXNlZCB1cG9uIHRoZQotICAgKiBsYW5ndWFnZSB2ZXJzaW9uIHNwZWNpZmllZC4KLSAgICoKLSAgICogVXNlIFtjb25maWd1cmVGZWF0dXJlc10gdG8gc2V0IHRoZSBmZWF0dXJlcy4KLSAgICovCisgIC8vLyBUaGUgZmVhdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Nhbm5lci4KKyAgLy8vCisgIC8vLyBJZiBhIGxhbmd1YWdlIHZlcnNpb24gY29tbWVudCAoZS5nLiAnLy8gQGRhcnQgPSAyLjMnKSBpcyBkZXRlY3RlZAorICAvLy8gd2hlbiBjYWxsaW5nIFt0b2tlbml6ZV0gYW5kIHRoaXMgZmllbGQgaXMgbm9uLW51bGwsIHRoZW4gdGhpcyBmaWVsZAorICAvLy8gd2lsbCBiZSB1cGRhdGVkIHRvIGNvbnRhaW4gYSBkb3duZ3JhZGVkIGZlYXR1cmUgc2V0IGJhc2VkIHVwb24gdGhlCisgIC8vLyBsYW5ndWFnZSB2ZXJzaW9uIHNwZWNpZmllZC4KKyAgLy8vCisgIC8vLyBVc2UgW2NvbmZpZ3VyZUZlYXR1cmVzXSB0byBzZXQgdGhlIGZlYXR1cmVzLgogICBGZWF0dXJlU2V0IGdldCBmZWF0dXJlU2V0ID0+IF9mZWF0dXJlU2V0OwogCi0gIC8qKgotICAgKiBUaGUgbGFuZ3VhZ2UgdmVyc2lvbiBvdmVycmlkZSBzcGVjaWZpZWQgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCB1c2luZyBhCi0gICAqIHRva2VuIGxpa2UgJy8vIEBkYXJ0ID0gMi43Jywgb3IgYG51bGxgIGlmIG5vIG92ZXJyaWRlIGlzIHNwZWNpZmllZC4KLSAgICovCisgIC8vLyBUaGUgbGFuZ3VhZ2UgdmVyc2lvbiBvdmVycmlkZSBzcGVjaWZpZWQgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCB1c2luZyBhCisgIC8vLyB0b2tlbiBsaWtlICcvLyBAZGFydCA9IDIuNycsIG9yIGBudWxsYCBpZiBubyBvdmVycmlkZSBpcyBzcGVjaWZpZWQuCiAgIGZhc3RhLkxhbmd1YWdlVmVyc2lvblRva2VuIGdldCBsYW5ndWFnZVZlcnNpb24gPT4gX2xhbmd1YWdlVmVyc2lvbjsKIAogICBzZXQgcHJlc2VydmVDb21tZW50cyhib29sIHByZXNlcnZlQ29tbWVudHMpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2RhcnQvc2RrL3Nkay5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zZGsvc2RrLmRhcnQKaW5kZXggMjgyNmFjMy4uZjhlMzA3NCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zZGsvc2RrLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZGFydC9zZGsvc2RrLmRhcnQKQEAgLTE4LDUyICsxOCwzMCBAQAogaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRob3M7CiBpbXBvcnQgJ3BhY2thZ2U6eWFtbC95YW1sLmRhcnQnOwogCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgRGFydCBTREsgaW4gd2hpY2ggdGhlIGF2YWlsYWJsZSBsaWJyYXJpZXMgYXJlCi0gKiBzdG9yZWQgaW4gYSBsaWJyYXJ5IG1hcC4gU3ViY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIHBvcHVsYXRpbmcgdGhlCi0gKiBsaWJyYXJ5IG1hcC4KLSAqLworLy8vIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgRGFydCBTREsgaW4gd2hpY2ggdGhlIGF2YWlsYWJsZSBsaWJyYXJpZXMKKy8vLyBhcmUgc3RvcmVkIGluIGEgbGlicmFyeSBtYXAuIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoZQorLy8vIGxpYnJhcnkgbWFwLgogYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXJ0U2RrIGltcGxlbWVudHMgRGFydFNkayB7Ci0gIC8qKgotICAgKiBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLgotICAgKi8KKyAgLy8vIFRoZSByZXNvdXJjZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0uCiAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcjsKIAotICAvKioKLSAgICogQSBtYXBwaW5nIGZyb20gRGFydCBsaWJyYXJ5IFVSSSdzIHRvIHRoZSBsaWJyYXJ5IHJlcHJlc2VudGVkIGJ5IHRoYXQgVVJJLgotICAgKi8KKyAgLy8vIEEgbWFwcGluZyBmcm9tIERhcnQgbGlicmFyeSBVUkkncyB0byB0aGUgbGlicmFyeSByZXByZXNlbnRlZCBieSB0aGF0IFVSSS4KICAgTGlicmFyeU1hcCBsaWJyYXJ5TWFwID0gTGlicmFyeU1hcCgpOwogCi0gIC8qKgotICAgKiBUaGUgW0FuYWx5c2lzT3B0aW9uc10gdG8gdXNlIHRvIGNyZWF0ZSB0aGUgW2NvbnRleHRdLgotICAgKi8KKyAgLy8vIFRoZSBbQW5hbHlzaXNPcHRpb25zXSB0byB1c2UgdG8gY3JlYXRlIHRoZSBbY29udGV4dF0uCiAgIEFuYWx5c2lzT3B0aW9ucyBfYW5hbHlzaXNPcHRpb25zOwogCi0gIC8qKgotICAgKiBUaGUgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIGFuIFNESyBzdW1tYXJ5IHNob3VsZCBiZSB1c2VkLiBUaGlzIGlzIGEKLSAgICogdGVtcG9yYXJ5IGZsYWcgdW50aWwgc3VtbWFyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAqLwotICBib29sIF91c2VTdW1tYXJ5ID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBbQW5hbHlzaXNDb250ZXh0XSB3aGljaCBpcyB1c2VkIGZvciBhbGwgb2YgdGhlIHNvdXJjZXMgaW4gdGhpcyBTREsuCi0gICAqLworICAvLy8gVGhlIFtBbmFseXNpc0NvbnRleHRdIHdoaWNoIGlzIHVzZWQgZm9yIGFsbCBvZiB0aGUgc291cmNlcyBpbiB0aGlzIFNESy4KICAgU2RrQW5hbHlzaXNDb250ZXh0IF9hbmFseXNpc0NvbnRleHQ7CiAKLSAgLyoqCi0gICAqIFRoZSBtYXBwaW5nIGZyb20gRGFydCBVUkkncyB0byB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2VzLgotICAgKi8KKyAgLy8vIFRoZSBtYXBwaW5nIGZyb20gRGFydCBVUkkncyB0byB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2VzLgogICBmaW5hbCBNYXA8U3RyaW5nLCBTb3VyY2U+IF91cmlUb1NvdXJjZU1hcCA9IEhhc2hNYXA8U3RyaW5nLCBTb3VyY2U+KCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYW5hbHlzaXMgb3B0aW9ucyBmb3IgdGhpcyBTREsgYW5hbHlzaXMgY29udGV4dC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGFuYWx5c2lzIG9wdGlvbnMgZm9yIHRoaXMgU0RLIGFuYWx5c2lzIGNvbnRleHQuCiAgIEFuYWx5c2lzT3B0aW9ucyBnZXQgYW5hbHlzaXNPcHRpb25zID0+IF9hbmFseXNpc09wdGlvbnM7CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgW29wdGlvbnNdIGZvciB0aGlzIFNESyBhbmFseXNpcyBjb250ZXh0LiAgVGhyb3cgW1N0YXRlRXJyb3JdIGlmIHRoZQotICAgKiBjb250ZXh0IGhhcyBiZWVuIGFscmVhZHkgY3JlYXRlZC4KLSAgICovCisgIC8vLyBTZXQgdGhlIFtvcHRpb25zXSBmb3IgdGhpcyBTREsgYW5hbHlzaXMgY29udGV4dC4gIFRocm93IFtTdGF0ZUVycm9yXSBpZgorICAvLy8gdGhlIGNvbnRleHQgaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkLgogICBzZXQgYW5hbHlzaXNPcHRpb25zKEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zKSB7CiAgICAgaWYgKF9hbmFseXNpc0NvbnRleHQgIT0gbnVsbCkgewogICAgICAgdGhyb3cgU3RhdGVFcnJvcigKQEAgLTg0LDM1ICs2MiwxNSBAQAogICBAb3ZlcnJpZGUKICAgTGlzdDxTZGtMaWJyYXJ5PiBnZXQgc2RrTGlicmFyaWVzID0+IGxpYnJhcnlNYXAuc2RrTGlicmFyaWVzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHBhdGggc2VwYXJhdG9yIHVzZWQgYnkgdGhlIHJlc291cmNlIHByb3ZpZGVyLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgcGF0aCBzZXBhcmF0b3IgdXNlZCBieSB0aGUgcmVzb3VyY2UgcHJvdmlkZXIuCiAgIFN0cmluZyBnZXQgc2VwYXJhdG9yID0+IHJlc291cmNlUHJvdmlkZXIucGF0aENvbnRleHQuc2VwYXJhdG9yOwogCiAgIEBvdmVycmlkZQogICBMaXN0PFN0cmluZz4gZ2V0IHVyaXMgPT4gbGlicmFyeU1hcC51cmlzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBTREsgc3VtbWFyeSB3aWxsIGJlIHVzZWQgd2hlbiBhdmFpbGFibGUuCi0gICAqLwotICBib29sIGdldCB1c2VTdW1tYXJ5ID0+IF91c2VTdW1tYXJ5OwotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHdoZXRoZXIgU0RLIHN1bW1hcnkgc2hvdWxkIGJlIHVzZWQuCi0gICAqLwotICBzZXQgdXNlU3VtbWFyeShib29sIHVzZSkgewotICAgIGlmIChfYW5hbHlzaXNDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgIHRocm93IFN0YXRlRXJyb3IoCi0gICAgICAgICAgJ1RoZSAidXNlU3VtbWFyeSIgZmxhZyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjb250ZXh0IGNyZWF0aW9uLicpOwotICAgIH0KLSAgICBfdXNlU3VtbWFyeSA9IHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdGhlIGV4dGVuc2lvbnMgZnJvbSBvbmUgb3IgbW9yZSBzZGsgZXh0ZW5zaW9uIGZpbGVzIHRvIHRoaXMgc2RrLiBUaGUKLSAgICogW2V4dGVuc2lvbnNdIHNob3VsZCBiZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG5hbWVzIG9mIGV4dGVuc2lvbnMgdG8gdGhlIHBhdGhzCi0gICAqIHdoZXJlIHRob3NlIGV4dGVuc2lvbnMgY2FuIGJlIGZvdW5kLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgZXh0ZW5zaW9ucyBmcm9tIG9uZSBvciBtb3JlIHNkayBleHRlbnNpb24gZmlsZXMgdG8gdGhpcyBzZGsuIFRoZQorICAvLy8gW2V4dGVuc2lvbnNdIHNob3VsZCBiZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG5hbWVzIG9mIGV4dGVuc2lvbnMgdG8gdGhlCisgIC8vLyBwYXRocyB3aGVyZSB0aG9zZSBleHRlbnNpb25zIGNhbiBiZSBmb3VuZC4KICAgdm9pZCBhZGRFeHRlbnNpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0ZW5zaW9ucykgewogICAgIGV4dGVuc2lvbnMuZm9yRWFjaCgoU3RyaW5nIHVyaSwgU3RyaW5nIHBhdGgpIHsKICAgICAgIFNka0xpYnJhcnlJbXBsIGxpYnJhcnkgPSBTZGtMaWJyYXJ5SW1wbCh1cmkpOwpAQCAtMTIxLDkgKzc5LDcgQEAKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gaW5mbyBmb3IgZGVidWdnaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTIyNi4KLSAgICovCisgIC8vLyBSZXR1cm4gaW5mbyBmb3IgZGVidWdnaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNTIyNi4KICAgTWFwPFN0cmluZywgT2JqZWN0PiBkZWJ1Z0luZm8oKSB7CiAgICAgcmV0dXJuIDxTdHJpbmcsIE9iamVjdD57CiAgICAgICAncnVudGltZVR5cGUnOiAnJHJ1bnRpbWVUeXBlJywKQEAgLTIzOCw5ICsxOTQsNyBAQAogICB9CiB9CiAKLS8qKgotICogQW4gU0RLIGJhY2tlZCBieSBVUkkgbWFwcGluZ3MgZGVyaXZlZCBmcm9tIGFuIGBfZW1iZWRkZXIueWFtbGAgZmlsZS4KLSAqLworLy8vIEFuIFNESyBiYWNrZWQgYnkgVVJJIG1hcHBpbmdzIGRlcml2ZWQgZnJvbSBhbiBgX2VtYmVkZGVyLnlhbWxgIGZpbGUuCiBjbGFzcyBFbWJlZGRlclNkayBleHRlbmRzIEFic3RyYWN0RGFydFNkayB7CiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgX0RBUlRfQ09MT05fUFJFRklYID0gJ2RhcnQ6JzsKIApAQCAtMjczLDkgKzIyNyw3IEBACiAgIC8vIFRPRE8oZGFucnViZWwpIERldGVybWluZSBTREsgdmVyc2lvbgogICBTdHJpbmcgZ2V0IHNka1ZlcnNpb24gPT4gJzAnOwogCi0gIC8qKgotICAgKiBUaGUgdXJsIG1hcHBpbmdzIGZvciB0aGlzIFNESy4KLSAgICovCisgIC8vLyBUaGUgdXJsIG1hcHBpbmdzIGZvciB0aGlzIFNESy4KICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgdXJsTWFwcGluZ3MgPT4gX3VybE1hcHBpbmdzOwogCiAgIEBvdmVycmlkZQpAQCAtMzIxLDkgKzI3Myw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEluc3RhbGwgdGhlIG1hcHBpbmcgZnJvbSBbbmFtZV0gdG8gW2xpYkRpcl0vW2ZpbGVdLgotICAgKi8KKyAgLy8vIEluc3RhbGwgdGhlIG1hcHBpbmcgZnJvbSBbbmFtZV0gdG8gW2xpYkRpcl0vW2ZpbGVdLgogICB2b2lkIF9wcm9jZXNzRW1iZWRkZWRMaWJzKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsZSwgRm9sZGVyIGxpYkRpcikgewogICAgIGlmICghbmFtZS5zdGFydHNXaXRoKF9EQVJUX0NPTE9OX1BSRUZJWCkpIHsKICAgICAgIC8vIFNESyBsaWJyYXJpZXMgbXVzdCBiZWdpbiB3aXRoICdkYXJ0OicuCkBAIC0zMzYsMTggKzI4NiwxNiBAQAogICAgIGxpYnJhcnlNYXAuc2V0TGlicmFyeShuYW1lLCBsaWJyYXJ5KTsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiB0aGUgJ2VtYmVkZGVyWWFtbHMnIGZyb20gW0VtYmVkZGVyWWFtbExvY2F0b3JdIGNoZWNrIGVhY2ggb25lIGZvciB0aGUKLSAgICogdG9wIGxldmVsIGtleSAnZW1iZWRkZWRfbGlicycuIFVuZGVyIHRoZSAnZW1iZWRkZWRfbGlicycga2V5IGFyZSBrZXkgdmFsdWUKLSAgICogcGFpcnMuIEVhY2gga2V5IGlzIGEgJ2RhcnQ6JyBsaWJyYXJ5IHVyaSBhbmQgZWFjaCB2YWx1ZSBpcyBhIHBhdGgKLSAgICogKHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBgX2VtYmVkZGVyLnlhbWxgKSB0byBhIGRhcnQgc2NyaXB0Ci0gICAqIGZvciB0aGUgZ2l2ZW4gbGlicmFyeS4gRm9yIGV4YW1wbGU6Ci0gICAqCi0gICAqIGVtYmVkZGVkX2xpYnM6Ci0gICAqICAgJ2RhcnQ6aW8nOiAnLi4vLi4vc2RrL2lvL2lvLmRhcnQnCi0gICAqCi0gICAqIElmIGEga2V5IGRvZXNuJ3QgYmVnaW4gd2l0aCBgZGFydDpgIGl0IGlzIGlnbm9yZWQuCi0gICAqLworICAvLy8gR2l2ZW4gdGhlICdlbWJlZGRlcllhbWxzJyBmcm9tIFtFbWJlZGRlcllhbWxMb2NhdG9yXSBjaGVjayBlYWNoIG9uZSBmb3IKKyAgLy8vIHRoZSB0b3AgbGV2ZWwga2V5ICdlbWJlZGRlZF9saWJzJy4gVW5kZXIgdGhlICdlbWJlZGRlZF9saWJzJyBrZXkgYXJlIGtleQorICAvLy8gdmFsdWUgcGFpcnMuIEVhY2gga2V5IGlzIGEgJ2RhcnQ6JyBsaWJyYXJ5IHVyaSBhbmQgZWFjaCB2YWx1ZSBpcyBhIHBhdGgKKyAgLy8vIChyZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYF9lbWJlZGRlci55YW1sYCkgdG8gYSBkYXJ0IHNjcmlwdAorICAvLy8gZm9yIHRoZSBnaXZlbiBsaWJyYXJ5LiBGb3IgZXhhbXBsZToKKyAgLy8vCisgIC8vLyBlbWJlZGRlZF9saWJzOgorICAvLy8gICAnZGFydDppbyc6ICcuLi8uLi9zZGsvaW8vaW8uZGFydCcKKyAgLy8vCisgIC8vLyBJZiBhIGtleSBkb2Vzbid0IGJlZ2luIHdpdGggYGRhcnQ6YCBpdCBpcyBpZ25vcmVkLgogICB2b2lkIF9wcm9jZXNzRW1iZWRkZXJZYW1sKEZvbGRlciBsaWJEaXIsIFlhbWxNYXAgbWFwKSB7CiAgICAgWWFtbE5vZGUgZW1iZWRkZWRfbGlicyA9IG1hcFtfRU1CRURERURfTElCX01BUF9LRVldOwogICAgIGlmIChlbWJlZGRlZF9saWJzIGlzIFlhbWxNYXApIHsKQEAgLTM1NiwyMiArMzA0LDIwIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIERhcnQgU0RLIGluc3RhbGxlZCBpbiBhIHNwZWNpZmllZCBkaXJlY3RvcnkuIFR5cGljYWwgRGFydCBTREsgbGF5b3V0IGlzCi0gKiBzb21ldGhpbmcgbGlrZS4uLgotICoKLSAqICAgICBkYXJ0LXNkay8KLSAqICAgICAgICBiaW4vCi0gKiAgICAgICAgICAgZGFydFsuZXhlXSAgPC0tIFZNCi0gKiAgICAgICAgbGliLwotICogICAgICAgICAgIGNvcmUvCi0gKiAgICAgICAgICAgICAgY29yZS5kYXJ0Ci0gKiAgICAgICAgICAgICAgLi4uIG90aGVyIGNvcmUgbGlicmFyeSBmaWxlcyAuLi4KLSAqICAgICAgICAgICAuLi4gb3RoZXIgbGlicmFyaWVzIC4uLgotICogICAgICAgIHV0aWwvCi0gKiAgICAgICAgICAgLi4uIERhcnQgdXRpbGl0aWVzIC4uLgotICogICAgIENocm9taXVtLyAgIDwtLSBEYXJ0aXVtIHR5cGljYWxseSBleGlzdHMgaW4gYSBzaWJsaW5nIGRpcmVjdG9yeQotICovCisvLy8gQSBEYXJ0IFNESyBpbnN0YWxsZWQgaW4gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBUeXBpY2FsIERhcnQgU0RLIGxheW91dCBpcworLy8vIHNvbWV0aGluZyBsaWtlLi4uCisvLy8KKy8vLyAgICAgZGFydC1zZGsvCisvLy8gICAgICAgIGJpbi8KKy8vLyAgICAgICAgICAgZGFydFsuZXhlXSAgPC0tIFZNCisvLy8gICAgICAgIGxpYi8KKy8vLyAgICAgICAgICAgY29yZS8KKy8vLyAgICAgICAgICAgICAgY29yZS5kYXJ0CisvLy8gICAgICAgICAgICAgIC4uLiBvdGhlciBjb3JlIGxpYnJhcnkgZmlsZXMgLi4uCisvLy8gICAgICAgICAgIC4uLiBvdGhlciBsaWJyYXJpZXMgLi4uCisvLy8gICAgICAgIHV0aWwvCisvLy8gICAgICAgICAgIC4uLiBEYXJ0IHV0aWxpdGllcyAuLi4KKy8vLyAgICAgQ2hyb21pdW0vICAgPC0tIERhcnRpdW0gdHlwaWNhbGx5IGV4aXN0cyBpbiBhIHNpYmxpbmcgZGlyZWN0b3J5CiBjbGFzcyBGb2xkZXJCYXNlZERhcnRTZGsgZXh0ZW5kcyBBYnN0cmFjdERhcnRTZGsgewogICAvLy8gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFNESyBkaXJlY3RvcnkgdGhhdCBjb250YWlucwogICAvLy8gZXhlY3V0YWJsZXMuCkBAIC00MTYsMjEgKzM2MiwxNSBAQAogICAvLy8gVGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFNESyBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgbGlicmFyaWVzLgogICBGb2xkZXIgX2xpYnJhcnlEaXJlY3Rvcnk7CiAKLSAgLyoqCi0gICAqIFRoZSByZXZpc2lvbiBudW1iZXIgb2YgdGhpcyBTREssIG9yIGAiMCJgIGlmIHRoZSByZXZpc2lvbiBudW1iZXIgY2Fubm90IGJlCi0gICAqIGRpc2NvdmVyZWQuCi0gICAqLworICAvLy8gVGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGlzIFNESywgb3IgYCIwImAgaWYgdGhlIHJldmlzaW9uIG51bWJlciBjYW5ub3QgYmUKKyAgLy8vIGRpc2NvdmVyZWQuCiAgIFN0cmluZyBfc2RrVmVyc2lvbjsKIAotICAvKioKLSAgICogVGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHViIGV4ZWN1dGFibGUuCi0gICAqLworICAvLy8gVGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHViIGV4ZWN1dGFibGUuCiAgIEZpbGUgX3B1YkV4ZWN1dGFibGU7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIFNESyB0byByZXByZXNlbnQgdGhlIERhcnQgU0RLIGluc3RhbGxlZCBpbiB0aGUKLSAgICogW3Nka0RpcmVjdG9yeV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgU0RLIHRvIHJlcHJlc2VudCB0aGUgRGFydCBTREsgaW5zdGFsbGVkIGluIHRoZQorICAvLy8gW3Nka0RpcmVjdG9yeV0uCiAgIEZvbGRlckJhc2VkRGFydFNkayhSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXIsIEZvbGRlciBzZGtEaXJlY3RvcnkpCiAgICAgICA6IF9zZGtEaXJlY3RvcnkgPSBzZGtEaXJlY3RvcnkgewogICAgIHRoaXMucmVzb3VyY2VQcm92aWRlciA9IHJlc291cmNlUHJvdmlkZXI7CkBAIC00NTAsMjggKzM5MCwyMSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBTREsuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgU0RLLgogICBGb2xkZXIgZ2V0IGRpcmVjdG9yeSA9PiBfc2RrRGlyZWN0b3J5OwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBTREsuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgU0RLLgogICBGb2xkZXIgZ2V0IGRvY0RpcmVjdG9yeSA9PgogICAgICAgX3Nka0RpcmVjdG9yeS5nZXRDaGlsZEFzc3VtaW5nRm9sZGVyKF9ET0NTX0RJUkVDVE9SWV9OQU1FKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBTREsgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGxpYnJhcmllcy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFNESyBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgbGlicmFyaWVzLgogICBGb2xkZXIgZ2V0IGxpYnJhcnlEaXJlY3RvcnkgewogICAgIHJldHVybiBfbGlicmFyeURpcmVjdG9yeSA/Pz0KICAgICAgICAgX3Nka0RpcmVjdG9yeS5nZXRDaGlsZEFzc3VtaW5nRm9sZGVyKF9MSUJfRElSRUNUT1JZX05BTUUpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBQdWIgZXhlY3V0YWJsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBQdWIgZXhlY3V0YWJsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXMgbm90CisgIC8vLyBleGlzdC4KICAgRmlsZSBnZXQgcHViRXhlY3V0YWJsZSB7CiAgICAgcmV0dXJuIF9wdWJFeGVjdXRhYmxlID8/PSBfc2RrRGlyZWN0b3J5CiAgICAgICAgIC5nZXRDaGlsZEFzc3VtaW5nRm9sZGVyKF9CSU5fRElSRUNUT1JZX05BTUUpCkBAIC00ODAsMTAgKzQxMyw4IEBACiAgICAgICAgICAgICA6IF9QVUJfRVhFQ1VUQUJMRV9OQU1FKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGlzIFNESywgb3IgYCIwImAgaWYgdGhlIHJldmlzaW9uIG51bWJlcgotICAgKiBjYW5ub3QgYmUgZGlzY292ZXJlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGlzIFNESywgb3IgYCIwImAgaWYgdGhlIHJldmlzaW9uIG51bWJlcgorICAvLy8gY2Fubm90IGJlIGRpc2NvdmVyZWQuCiAgIEBvdmVycmlkZQogICBTdHJpbmcgZ2V0IHNka1ZlcnNpb24gewogICAgIGlmIChfc2RrVmVyc2lvbiA9PSBudWxsKSB7CkBAIC01MDIsOSArNDMzLDcgQEAKICAgICByZXR1cm4gX3Nka1ZlcnNpb247CiAgIH0KIAotICAvKioKLSAgICogRGV0ZXJtaW5lIHRoZSBzZWFyY2ggb3JkZXIgZm9yIHRyeWluZyB0byBsb2NhdGUgdGhlIFtfTElCUkFSSUVTX0ZJTEVdLgotICAgKi8KKyAgLy8vIERldGVybWluZSB0aGUgc2VhcmNoIG9yZGVyIGZvciB0cnlpbmcgdG8gbG9jYXRlIHRoZSBbX0xJQlJBUklFU19GSUxFXS4KICAgSXRlcmFibGU8RmlsZT4gZ2V0IF9saWJyYXJ5TWFwTG9jYXRpb25zIHN5bmMqIHsKICAgICB5aWVsZCBsaWJyYXJ5RGlyZWN0b3J5CiAgICAgICAgIC5nZXRDaGlsZEFzc3VtaW5nRm9sZGVyKF9JTlRFUk5BTF9ESVIpCkBAIC01MTYsOSArNDQ1LDcgQEAKICAgICAgICAgLmdldENoaWxkQXNzdW1pbmdGaWxlKF9MSUJSQVJJRVNfRklMRSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGluZm8gZm9yIGRlYnVnZ2luZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzUyMjYuCi0gICAqLworICAvLy8gUmV0dXJuIGluZm8gZm9yIGRlYnVnZ2luZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzUyMjYuCiAgIEBvdmVycmlkZQogICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlYnVnSW5mbygpIHsKICAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZGVidWdJbmZvKCk7CkBAIC01MzYsMTAgKzQ2Myw4IEBACiAgICAgcmV0dXJuIGZpbGVQYXRoLnN1YnN0cmluZyhsaWJQYXRoLmxlbmd0aCArIDEpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlYWQgYWxsIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRvIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgbWFwcy4KLSAgICogUmV0dXJuIHRoZSBpbml0aWFsaXplZCBsaWJyYXJ5IG1hcC4KLSAgICovCisgIC8vLyBSZWFkIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB0byBpbml0aWFsaXplIHRoZSBsaWJyYXJ5IG1hcHMuCisgIC8vLyBSZXR1cm4gdGhlIGluaXRpYWxpemVkIGxpYnJhcnkgbWFwLgogICBMaWJyYXJ5TWFwIGluaXRpYWxMaWJyYXJ5TWFwKCkgewogICAgIExpc3Q8U3RyaW5nPiBzZWFyY2hlZFBhdGhzID0gPFN0cmluZz5bXTsKICAgICBTdGFja1RyYWNlIGxhc3RTdGFja1RyYWNlOwpAQCAtNTk4LDExICs1MjMsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGUgRGFydCBTREssIG9yIGBudWxsYCBpZiB0aGUgZGlyZWN0b3J5Ci0gICAqIGNhbm5vdCBiZSBkZXRlcm1pbmVkIChvciBkb2VzIG5vdCBleGlzdCkuIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcyBwcm92aWRlZAotICAgKiBieSBhIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBgY29tLmdvb2dsZS5kYXJ0LnNka2AuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgdGhlIERhcnQgU0RLLCBvciBgbnVsbGAgaWYgdGhlIGRpcmVjdG9yeQorICAvLy8gY2Fubm90IGJlIGRldGVybWluZWQgKG9yIGRvZXMgbm90IGV4aXN0KS4gVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzCisgIC8vLyBwcm92aWRlZCBieSBhIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBgY29tLmdvb2dsZS5kYXJ0LnNka2AuCiAgIHN0YXRpYyBGb2xkZXIgZGVmYXVsdFNka0RpcmVjdG9yeShSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXIpIHsKICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGJlaW5nIHVzZWQgaW4gdGhlIGFuYWx5c2lzCiAgICAgLy8gc2VydmVyJ3MgRHJpdmVyIGNsYXNzIHRvIGZpbmQgdGhlIGRlZmF1bHQgU0RLLiBUaGUgY29tbWFuZC1saW5lIGFuYWx5emVyCkBAIC02NTMsNDEgKzU3NiwzNSBAQAogICB9CiB9CiAKLS8qKgotICogQW4gb2JqZWN0IHVzZWQgdG8gcmVhZCBhbmQgcGFyc2UgdGhlIGxpYnJhcmllcyBmaWxlCi0gKiAoZGFydC1zZGsvbGliL19pbnRlcm5hbC9zZGtfbGlicmFyeV9tZXRhZGF0YS9saWIvbGlicmFyaWVzLmRhcnQpIGZvciBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIGxpYnJhcmllcyBpbiBhbiBTREsuIFRoZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGEKLSAqIERhcnQgZmlsZSBjb250YWluaW5nIGEgc2luZ2xlIHRvcC1sZXZlbCB2YXJpYWJsZSB3aG9zZSB2YWx1ZSBpcyBhIGNvbnN0IG1hcC4KLSAqIFRoZSBrZXlzIG9mIHRoZSBtYXAgYXJlIHRoZSBuYW1lcyBvZiBsaWJyYXJpZXMgZGVmaW5lZCBpbiB0aGUgU0RLIGFuZCB0aGUKLSAqIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSBpbmZvIG9iamVjdHMgZGVmaW5pbmcgdGhlIGxpYnJhcnkuIEZvciBleGFtcGxlLCBhCi0gKiBzdWJzZXQgb2YgYSB0eXBpY2FsIFNESyBtaWdodCBoYXZlIGEgbGlicmFyaWVzIGZpbGUgdGhhdCBsb29rcyBsaWtlIHRoZQotICogZm9sbG93aW5nOgotICoKLSAqICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaWJyYXJ5SW5mbz4gTElCUkFSSUVTID0gY29uc3QgPExpYnJhcnlJbmZvPiB7Ci0gKiAgICAgICAvLyBVc2VkIGJ5IFZNIGFwcGxpY2F0aW9ucwotICogICAgICAgImJ1aWx0aW4iIDogY29uc3QgTGlicmFyeUluZm8oCi0gKiAgICAgICAgICJidWlsdGluL2J1aWx0aW5fcnVudGltZS5kYXJ0IiwKLSAqICAgICAgICAgY2F0ZWdvcnk6ICJTZXJ2ZXIiLAotICogICAgICAgICBwbGF0Zm9ybXM6IFZNX1BMQVRGT1JNKSwKLSAqCi0gKiAgICAgICAiY29tcGlsZXIiIDogY29uc3QgTGlicmFyeUluZm8oCi0gKiAgICAgICAgICJjb21waWxlci9jb21waWxlci5kYXJ0IiwKLSAqICAgICAgICAgY2F0ZWdvcnk6ICJUb29scyIsCi0gKiAgICAgICAgIHBsYXRmb3JtczogMCksCi0gKiAgICAgfTsKLSAqLworLy8vIEFuIG9iamVjdCB1c2VkIHRvIHJlYWQgYW5kIHBhcnNlIHRoZSBsaWJyYXJpZXMgZmlsZQorLy8vIChkYXJ0LXNkay9saWIvX2ludGVybmFsL3Nka19saWJyYXJ5X21ldGFkYXRhL2xpYi9saWJyYXJpZXMuZGFydCkgZm9yCisvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpYnJhcmllcyBpbiBhbiBTREsuIFRoZSBsaWJyYXJ5IGluZm9ybWF0aW9uIGlzCisvLy8gcmVwcmVzZW50ZWQgYXMgYSBEYXJ0IGZpbGUgY29udGFpbmluZyBhIHNpbmdsZSB0b3AtbGV2ZWwgdmFyaWFibGUgd2hvc2UKKy8vLyB2YWx1ZSBpcyBhIGNvbnN0IG1hcC4gVGhlIGtleXMgb2YgdGhlIG1hcCBhcmUgdGhlIG5hbWVzIG9mIGxpYnJhcmllcyBkZWZpbmVkCisvLy8gaW4gdGhlIFNESyBhbmQgdGhlIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSBpbmZvIG9iamVjdHMgZGVmaW5pbmcgdGhlIGxpYnJhcnkuCisvLy8gRm9yIGV4YW1wbGUsIGEgc3Vic2V0IG9mIGEgdHlwaWNhbCBTREsgbWlnaHQgaGF2ZSBhIGxpYnJhcmllcyBmaWxlIHRoYXQKKy8vLyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisvLy8KKy8vLyAgICAgZmluYWwgTWFwPFN0cmluZywgTGlicmFyeUluZm8+IExJQlJBUklFUyA9IGNvbnN0IDxMaWJyYXJ5SW5mbz4geworLy8vICAgICAgIC8vIFVzZWQgYnkgVk0gYXBwbGljYXRpb25zCisvLy8gICAgICAgImJ1aWx0aW4iIDogY29uc3QgTGlicmFyeUluZm8oCisvLy8gICAgICAgICAiYnVpbHRpbi9idWlsdGluX3J1bnRpbWUuZGFydCIsCisvLy8gICAgICAgICBjYXRlZ29yeTogIlNlcnZlciIsCisvLy8gICAgICAgICBwbGF0Zm9ybXM6IFZNX1BMQVRGT1JNKSwKKy8vLworLy8vICAgICAgICJjb21waWxlciIgOiBjb25zdCBMaWJyYXJ5SW5mbygKKy8vLyAgICAgICAgICJjb21waWxlci9jb21waWxlci5kYXJ0IiwKKy8vLyAgICAgICAgIGNhdGVnb3J5OiAiVG9vbHMiLAorLy8vICAgICAgICAgcGxhdGZvcm1zOiAwKSwKKy8vLyAgICAgfTsKIGNsYXNzIFNka0xpYnJhcmllc1JlYWRlciB7Ci0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpYnJhcnkgbWFwIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gW2ZpbGVdLCBnaXZlbiB0aGF0IHRoZSBjb250ZW50Ci0gICAqIG9mIHRoZSBmaWxlIGlzIGFscmVhZHkga25vd24gdG8gYmUgW2xpYnJhcnlGaWxlQ29udGVudHNdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbGlicmFyeSBtYXAgcmVhZCBmcm9tIHRoZSBnaXZlbiBbZmlsZV0sIGdpdmVuIHRoYXQgdGhlIGNvbnRlbnQKKyAgLy8vIG9mIHRoZSBmaWxlIGlzIGFscmVhZHkga25vd24gdG8gYmUgW2xpYnJhcnlGaWxlQ29udGVudHNdLgogICBMaWJyYXJ5TWFwIHJlYWRGcm9tRmlsZShGaWxlIGZpbGUsIFN0cmluZyBsaWJyYXJ5RmlsZUNvbnRlbnRzKSA9PgogICAgICAgcmVhZEZyb21Tb3VyY2UoZmlsZS5jcmVhdGVTb3VyY2UoKSwgbGlicmFyeUZpbGVDb250ZW50cyk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbGlicmFyeSBtYXAgcmVhZCBmcm9tIHRoZSBnaXZlbiBbc291cmNlXSwgZ2l2ZW4gdGhhdCB0aGUgY29udGVudAotICAgKiBvZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIFtsaWJyYXJ5RmlsZUNvbnRlbnRzXS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxpYnJhcnkgbWFwIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gW3NvdXJjZV0sIGdpdmVuIHRoYXQgdGhlCisgIC8vLyBjb250ZW50IG9mIHRoZSBmaWxlIGlzIGFscmVhZHkga25vd24gdG8gYmUgW2xpYnJhcnlGaWxlQ29udGVudHNdLgogICBMaWJyYXJ5TWFwIHJlYWRGcm9tU291cmNlKFNvdXJjZSBzb3VyY2UsIFN0cmluZyBsaWJyYXJ5RmlsZUNvbnRlbnRzKSB7CiAgICAgLy8gVE9ETyhwYXVsYmVycnkpOiBpbml0aWFsaXplIHRoZSBmZWF0dXJlIHNldCBhcHByb3ByaWF0ZWx5IGJhc2VkIG9uIHRoZQogICAgIC8vIHZlcnNpb24gb2YgdGhlIFNESyB3ZSBhcmUgcmVhZGluZywgYW5kIGVuYWJsZSBmbGFncy4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2Jlc3RfcHJhY3RpY2VzX3ZlcmlmaWVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9iZXN0X3ByYWN0aWNlc192ZXJpZmllci5kYXJ0CmluZGV4IDA5Njg5OTMuLmJhM2NhOWUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2Jlc3RfcHJhY3RpY2VzX3ZlcmlmaWVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvYmVzdF9wcmFjdGljZXNfdmVyaWZpZXIuZGFydApAQCAtMTgsMTMgKzE4LDEzIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvaW5oZXJpdGFuY2VfbWFuYWdlcjMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvYm9keV9pbmZlcmVuY2VfY29udGV4dC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9leGl0X2RldGVjdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvbGludC9saW50ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3dvcmtzcGFjZS93b3Jrc3BhY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgfSBlbHNlIGlmIChlbGVtZW50Py5pc1Zpc2libGVGb3JUZW1wbGF0ZSA9PSB0cnVlIHx8CiAgICAgICAgIGVsZW1lbnQ/LmlzVmlzaWJsZUZvclRlc3RpbmcgPT0gdHJ1ZSkgewogICAgICAgaWYgKHBhcmVudCBpcyBEZWNsYXJhdGlvbikgewotICAgICAgICByZXBvcnRJbnZhbGlkQW5ub3RhdGlvbihFbGVtZW50IGRlY2xhcmVkRWxlbWVudCkgeworICAgICAgICB2b2lkIHJlcG9ydEludmFsaWRBbm5vdGF0aW9uKEVsZW1lbnQgZGVjbGFyZWRFbGVtZW50KSB7CiAgICAgICAgICAgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKAogICAgICAgICAgICAgICBIaW50Q29kZS5JTlZBTElEX1ZJU0lCSUxJVFlfQU5OT1RBVElPTiwKICAgICAgICAgICAgICAgbm9kZSwKQEAgLTE0MDMsNiArMTQwMywxMiBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIENhc3RpbmcgZnJvbSBgVCpgIHRvIGBUP2AgaXMgYSB3YXkgdG8gZm9yY2UgYFQ/YC4KKyAgICBpZiAobGVmdFR5cGUubnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhciAmJgorICAgICAgICByaWdodFR5cGUubnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICAvLyBGb3IgYGNvbmRpdGlvbiA/IHRoZW4gOiBlbHNlYCB0aGUgcmVzdWx0IHR5cGUgaXMgYExVQmAuCiAgICAgLy8gQ2FzdHMgbWlnaHQgYmUgdXNlZCB0byBjb25zaWRlciBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgaW5oZXJpdGFuY2UgdHJlZS4KICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9ib29sX2V4cHJlc3Npb25fdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2Jvb2xfZXhwcmVzc2lvbl92ZXJpZmllci5kYXJ0CmluZGV4IDBhY2MzNTcuLjM3NjllMDcgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2Jvb2xfZXhwcmVzc2lvbl92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2Jvb2xfZXhwcmVzc2lvbl92ZXJpZmllci5kYXJ0CkBAIC04LDkgKzgsOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2Vycm9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2xpc3RlbmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvbnVsbGFibGVfZGVyZWZlcmVuY2VfdmVyaWZpZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIC8vLyBIZWxwZXIgZm9yIHZlcmlmeWluZyBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGJlIG9mIHR5cGUgYm9vbC4KQEAgLTY2LDEzICs2NiwxMCBAQAogICAgICk7CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCBvciBmdW5jdGlvbiBpcyB1c2VkLCB3aGVuCi0gICAqIGl0IHJldHVybnMgJ3ZvaWQnLiBPciwgaW4gcmFyZSBjYXNlcywgd2hlbiBvdGhlciB0eXBlcyBvZiBleHByZXNzaW9ucyBhcmUKLSAgICogdm9pZCwgc3VjaCBhcyBpZGVudGlmaWVycy4KLSAgICoKLSAgICogVE9ETyhzY2hlZ2xvdikgTW92ZSB0aGlzIGluIGEgc2VwYXJhdGUgdmVyaWZpZXIuCi0gICAqLworICAvLy8gQ2hlY2sgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCBvciBmdW5jdGlvbiBpcyB1c2VkLAorICAvLy8gd2hlbiBpdCByZXR1cm5zICd2b2lkJy4gT3IsIGluIHJhcmUgY2FzZXMsIHdoZW4gb3RoZXIgdHlwZXMgb2YgZXhwcmVzc2lvbnMKKyAgLy8vIGFyZSB2b2lkLCBzdWNoIGFzIGlkZW50aWZpZXJzLgorICAvLyBUT0RPKHNjaGVnbG92KSBNb3ZlIHRoaXMgaW4gYSBzZXBhcmF0ZSB2ZXJpZmllci4KICAgYm9vbCBfY2hlY2tGb3JVc2VPZlZvaWRSZXN1bHQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCB8fAogICAgICAgICAhaWRlbnRpY2FsKGV4cHJlc3Npb24uc3RhdGljVHlwZSwgVm9pZFR5cGVJbXBsLmluc3RhbmNlKSkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvY29kZXMuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvZGVzLmRhcnQKaW5kZXggMGQ3YmIxNDliLi42MDcxZDU2IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9jb2Rlcy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvZGVzLmRhcnQKQEAgLTkzLDcgKzkzLDggQEAKICAgICAgIENPTlNUX0NPTlNUUlVDVE9SX1BBUkFNX1RZUEVfTUlTTUFUQ0ggPSBDaGVja2VkTW9kZUNvbXBpbGVUaW1lRXJyb3JDb2RlKAogICAgICAgICAgICdDT05TVF9DT05TVFJVQ1RPUl9QQVJBTV9UWVBFX01JU01BVENIJywKICAgICAgICAgICAiQSB2YWx1ZSBvZiB0eXBlICd7MH0nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgcGFyYW1ldGVyIG9mIHR5cGUgIgotICAgICAgICAgICAgICAiJ3sxfScuIik7CisgICAgICAgICAgICAgICInezF9Jy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiA3LjYuMSBHZW5lcmF0aXZlIENvbnN0cnVjdG9yczogSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvcgpAQCAtNTcwLDcgKzU3MSw3IEBACiAgIC8vCiAgIC8vICMjIyMgQ29tbW9uIGZpeGVzCiAgIC8vCi0gIC8vIElmIHRoZXJlJ3MgYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkLCB0aGVuIGFkZCBhIHJldHVybgorICAvLyBJZiB0aGVyZSdzIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGNhbiBiZSByZXR1cm5lZCwgdGhlbiBhZGQgYSBgcmV0dXJuYAogICAvLyBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kOgogICAvLwogICAvLyBgYGBkYXJ0CkBAIC01ODMsOCArNTg0LDggQEAKICAgLy8gfQogICAvLyBgYGAKICAgLy8KLSAgLy8gSWYgdGhlIG1ldGhvZCB3b24ndCByZWFjaCB0aGUgaW1wbGljaXQgcmV0dXJuLCB0aGVuIGFkZCBhIHRocm93IGF0IHRoZSBlbmQKLSAgLy8gb2YgdGhlIG1ldGhvZDoKKyAgLy8gSWYgdGhlIG1ldGhvZCB3b24ndCByZWFjaCB0aGUgaW1wbGljaXQgcmV0dXJuLCB0aGVuIGFkZCBhIGB0aHJvd2AgYXQgdGhlCisgIC8vIGVuZCBvZiB0aGUgbWV0aG9kOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vICVleHBlcmltZW50cz1ub24tbnVsbGFibGUKQEAgLTYxMyw3ICs2MTQsOCBAQAogICAgICAgICAgICJUaGUgYm9keSBtaWdodCBjb21wbGV0ZSBub3JtYWxseSwgY2F1c2luZyAnbnVsbCcgdG8gYmUgcmV0dXJuZWQsICIKICAgICAgICAgICAgICAgImJ1dCB0aGUgcmV0dXJuIHR5cGUgaXMgYSBwb3RlbnRpYWxseSBub24tbnVsbGFibGUgdHlwZS4iLAogICAgICAgICAgIGNvcnJlY3Rpb246Ci0gICAgICAgICAgICAgICJUcnkgYWRkaW5nIGVpdGhlciBhIHJldHVybiBvciBhIHRocm93IHN0YXRlbWVudCBhdCB0aGUgZW5kLiIpOworICAgICAgICAgICAgICAiVHJ5IGFkZGluZyBlaXRoZXIgYSByZXR1cm4gb3IgYSB0aHJvdyBzdGF0ZW1lbnQgYXQgdGhlIGVuZC4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBCUkVBS19MQUJFTF9PTl9TV0lUQ0hfTUVNQkVSID0KICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlKCdCUkVBS19MQUJFTF9PTl9TV0lUQ0hfTUVNQkVSJywKQEAgLTc1Miw4ICs3NTQsOCBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgYGNhc2VgCi0gIC8vIGluIGEgc3dpdGNoIHN0YXRlbWVudCBoYXMgYSBzdGF0aWMgdHlwZSB0aGF0IGlzbid0IGEgc3VidHlwZSBvZiB0aGUgc3RhdGljCi0gIC8vIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZm9sbG93aW5nIGBzd2l0Y2hgLgorICAvLyBpbiBhIGBzd2l0Y2hgIHN0YXRlbWVudCBoYXMgYSBzdGF0aWMgdHlwZSB0aGF0IGlzbid0IGEgc3VidHlwZSBvZiB0aGUKKyAgLy8gc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZm9sbG93aW5nIGBzd2l0Y2hgLgogICAvLwogICAvLyAjIyMjIEV4YW1wbGUKICAgLy8KQEAgLTc3Miw3ICs3NzQsNyBAQAogICAvLwogICAvLyAjIyMjIENvbW1vbiBmaXhlcwogICAvLwotICAvLyBJZiB0aGUgdmFsdWUgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpcyB3cm9uZywgdGhlbiBjaGFuZ2UgdGhlIGNhc2UKKyAgLy8gSWYgdGhlIHZhbHVlIG9mIHRoZSBgY2FzZWAgZXhwcmVzc2lvbiBpcyB3cm9uZywgdGhlbiBjaGFuZ2UgdGhlIGBjYXNlYAogICAvLyBleHByZXNzaW9uIHNvIHRoYXQgaXQgaGFzIHRoZSByZXF1aXJlZCB0eXBlOgogICAvLwogICAvLyBgYGBkYXJ0CkBAIC03ODUsNyArNzg3LDcgQEAKICAgLy8gfQogICAvLyBgYGAKICAgLy8KLSAgLy8gSWYgdGhlIHZhbHVlIG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlIHN3aXRjaAorICAvLyBJZiB0aGUgdmFsdWUgb2YgdGhlIGBjYXNlYCBleHByZXNzaW9uIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSBgc3dpdGNoYAogICAvLyBleHByZXNzaW9uIHRvIGhhdmUgdGhlIHJlcXVpcmVkIHR5cGU6CiAgIC8vCiAgIC8vIGBgYGRhcnQKQEAgLTgwMiw3ICs4MDQsOCBAQAogICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUoCiAgICAgICAgICAgJ0NBU0VfRVhQUkVTU0lPTl9UWVBFX0lTX05PVF9TV0lUQ0hfRVhQUkVTU0lPTl9TVUJUWVBFJywKICAgICAgICAgICAiVGhlIHN3aXRjaCBjYXNlIGV4cHJlc3Npb24gdHlwZSAnezB9JyBtdXN0IGJlIGEgc3VidHlwZSBvZiB0aGUgIgotICAgICAgICAgICAgICAic3dpdGNoIGV4cHJlc3Npb24gdHlwZSAnezF9Jy4iKTsKKyAgICAgICAgICAgICAgInN3aXRjaCBleHByZXNzaW9uIHR5cGUgJ3sxfScuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogMTAuMTEgQ2xhc3MgTWVtYmVyIENvbmZsaWN0czogTGV0IGBDYCBiZSBhIGNsYXNzLiBJdCBpcyBhIGNvbXBpbGUtdGltZQpAQCAtMTUzMCwxMCArMTUzMywxMSBAQAogICAgKiBQYXJhbWV0ZXJzOgogICAgKiAwOiB0aGUgbmFtZSBvZiB0aGUgbm9uLXR5cGUgZWxlbWVudAogICAgKi8KLSAgc3RhdGljIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlIENPTlNUX1dJVEhfTk9OX1RZUEUgPSBDb21waWxlVGltZUVycm9yQ29kZSgKLSAgICAgICdDT05TVF9XSVRIX05PTl9UWVBFJywgIlRoZSBuYW1lICd7MH0nIGlzbid0IGEgY2xhc3MuIiwKLSAgICAgIGNvcnJlY3Rpb246ICJUcnkgY29ycmVjdGluZyB0aGUgbmFtZSB0byBtYXRjaCBhbiBleGlzdGluZyBjbGFzcy4iLAotICAgICAgaXNVbnJlc29sdmVkSWRlbnRpZmllcjogdHJ1ZSk7CisgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBDT05TVF9XSVRIX05PTl9UWVBFID0KKyAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlV2l0aFVuaXF1ZU5hbWUoJ0NSRUFUSU9OX1dJVEhfTk9OX1RZUEUnLAorICAgICAgICAgICdDT05TVF9XSVRIX05PTl9UWVBFJywgIlRoZSBuYW1lICd7MH0nIGlzbid0IGEgY2xhc3MuIiwKKyAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgY2xhc3MuIiwKKyAgICAgICAgICBpc1VucmVzb2x2ZWRJZGVudGlmaWVyOiB0cnVlKTsKIAogICAvKioKICAgICogMTYuMTIuMiBDb25zdDogSWYgPGk+VDwvaT4gaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIGl0IGlzIGEgY29tcGlsZS10aW1lCkBAIC0xNjIwLDEwICsxNjI0LDExIEBACiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBERUZBVUxUX0xJU1RfQ09OU1RSVUNUT1IgPQogICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUoCiAgICAgICAgICAgJ0RFRkFVTFRfTElTVF9DT05TVFJVQ1RPUicsCi0gICAgICAgICAgIlRoZSBkZWZhdWx0ICdMaXN0JyBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlIHdoZW4gbnVsbCBzYWZldHkgaXMgIgorICAgICAgICAgICJUaGUgZGVmYXVsdCAnTGlzdCcgY29uc3RydWN0b3IgaXNuJ3QgYXZhaWxhYmxlIHdoZW4gbnVsbCBzYWZldHkgaXMgIgogICAgICAgICAgICAgICAiZW5hYmxlZC4iLAogICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgdXNpbmcgYSBsaXN0IGxpdGVyYWwsICdMaXN0LmZpbGxlZCcgb3IgIgotICAgICAgICAgICAgICAiJ0xpc3QuZ2VuZXJhdGUnLiIpOworICAgICAgICAgICAgICAiJ0xpc3QuZ2VuZXJhdGUnLiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDYuMi4xIFJlcXVpcmVkIEZvcm1hbHM6IEJ5IG1lYW5zIG9mIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgbmFtZXMgdGhlCkBAIC0xNzA5LDcgKzE3MTQsNyBAQAogICAvLwogICAvLyAjIyMjIEV4YW1wbGUKICAgLy8KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCB3YXMgbm90IGFzc2lnbmVkIGEKKyAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCB3YXNuJ3QgYXNzaWduZWQgYQogICAvLyB2YWx1ZSBiZWZvcmUgYmVpbmcgcmVhZDoKICAgLy8KICAgLy8gYGBgZGFydApAQCAtMTczOCw3ICsxNzQzLDggQEAKICAgICAgICAgICAiVGhlIGxhdGUgbG9jYWwgdmFyaWFibGUgJ3swfScgaXMgZGVmaW5pdGVseSB1bmFzc2lnbmVkIGF0IHRoaXMgIgogICAgICAgICAgICAgICAicG9pbnQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOgotICAgICAgICAgICAgICAiRW5zdXJlIHRoYXQgaXQgaXMgYXNzaWduZWQgb24gbmVjZXNzYXJ5IGV4ZWN1dGlvbiBwYXRocy4iKTsKKyAgICAgICAgICAgICAgIkVuc3VyZSB0aGF0IGl0IGlzIGFzc2lnbmVkIG9uIG5lY2Vzc2FyeSBleGVjdXRpb24gcGF0aHMuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogTm8gcGFyYW1ldGVycy4KQEAgLTE4MTksNyArMTgyNSw4IEBACiAgICAgICAgICAgJ0RVUExJQ0FURV9DT05TVFJVQ1RPUicsCiAgICAgICAgICAgJ0RVUExJQ0FURV9DT05TVFJVQ1RPUl9ERUZBVUxUJywKICAgICAgICAgICAiVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgYWxyZWFkeSBkZWZpbmVkLiIsCi0gICAgICAgICAgY29ycmVjdGlvbjogIlRyeSBnaXZpbmcgb25lIG9mIHRoZSBjb25zdHJ1Y3RvcnMgYSBuYW1lLiIpOworICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgZ2l2aW5nIG9uZSBvZiB0aGUgY29uc3RydWN0b3JzIGEgbmFtZS4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtMTgzMCw3ICsxODM3LDggQEAKICAgICAgICAgICAnRFVQTElDQVRFX0NPTlNUUlVDVE9SJywKICAgICAgICAgICAnRFVQTElDQVRFX0NPTlNUUlVDVE9SX05BTUUnLAogICAgICAgICAgICJUaGUgY29uc3RydWN0b3Igd2l0aCBuYW1lICd7MH0nIGlzIGFscmVhZHkgZGVmaW5lZC4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVuYW1pbmcgb25lIG9mIHRoZSBjb25zdHJ1Y3RvcnMuIik7CisgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW5hbWluZyBvbmUgb2YgdGhlIGNvbnN0cnVjdG9ycy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtMjA4Myw3ICsyMDkxLDggQEAKICAgICAgICdFWFBPUlRfTEVHQUNZX1NZTUJPTCcsCiAgICAgICAiVGhlIHN5bWJvbCAnezB9JyBpcyBkZWZpbmVkIGluIGEgbGVnYWN5IGxpYnJhcnksIGFuZCBjYW4ndCBiZSAiCiAgICAgICAgICAgInJlLWV4cG9ydGVkIGZyb20gYSBub24tbnVsbGFibGUgYnkgZGVmYXVsdCBsaWJyYXJ5LiIsCi0gICAgICBjb3JyZWN0aW9uOiAiVHJ5IHJlbW92aW5nIHRoZSBleHBvcnQgb3IgbWlncmF0aW5nIHRoZSBsZWdhY3kgbGlicmFyeS4iKTsKKyAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIGV4cG9ydCBvciBtaWdyYXRpbmcgdGhlIGxlZ2FjeSBsaWJyYXJ5LiIsCisgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogMTQuMiBFeHBvcnRzOiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3VuZCBhdApAQCAtMjE2MSw3ICsyMTcwLDcgQEAKICAgICovCiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KLSAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGV4dGVuZHMgY2xhdXNlIGNvbnRhaW5zIGEKKyAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGBleHRlbmRzYCBjbGF1c2UgY29udGFpbnMgYQogICAvLyBuYW1lIHRoYXQgaXMgZGVjbGFyZWQgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBjbGFzcy4KICAgLy8KICAgLy8gIyMjIyBFeGFtcGxlcwpAQCAtMjE3OCw3ICsyMTg3LDcgQEAKICAgLy8gIyMjIyBDb21tb24gZml4ZXMKICAgLy8KICAgLy8gSWYgeW91IHdhbnQgdGhlIGNsYXNzIHRvIGV4dGVuZCBhIGNsYXNzIG90aGVyIHRoYW4gYE9iamVjdGAsIHRoZW4gcmVwbGFjZQotICAvLyB0aGUgbmFtZSBpbiB0aGUgZXh0ZW5kcyBjbGF1c2Ugd2l0aCB0aGUgbmFtZSBvZiB0aGF0IGNsYXNzOgorICAvLyB0aGUgbmFtZSBpbiB0aGUgYGV4dGVuZHNgIGNsYXVzZSB3aXRoIHRoZSBuYW1lIG9mIHRoYXQgY2xhc3M6CiAgIC8vCiAgIC8vIGBgYGRhcnQKICAgLy8gdm9pZCBmKCkge30KQEAgLTIxODgsNyArMjE5Nyw3IEBACiAgIC8vIGNsYXNzIEIge30KICAgLy8gYGBgCiAgIC8vCi0gIC8vIElmIHlvdSB3YW50IHRoZSBjbGFzcyB0byBleHRlbmQgYE9iamVjdGAsIHRoZW4gcmVtb3ZlIHRoZSBleHRlbmRzIGNsYXVzZToKKyAgLy8gSWYgeW91IHdhbnQgdGhlIGNsYXNzIHRvIGV4dGVuZCBgT2JqZWN0YCwgdGhlbiByZW1vdmUgdGhlIGBleHRlbmRzYCBjbGF1c2U6CiAgIC8vCiAgIC8vIGBgYGRhcnQKICAgLy8gdm9pZCBmKCkge30KQEAgLTI0MzAsNyArMjQzOSw3IEBACiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBleHRlbnNpb24gb3ZlcnJpZGUgaXMgdXNlZCBhcwogICAvLyB0aGUgdGFyZ2V0IG9mIGEgY2FzY2FkZSBleHByZXNzaW9uLiBUaGUgdmFsdWUgb2YgYSBjYXNjYWRlIGV4cHJlc3Npb24KLSAgLy8gYGUuLm1gIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGBlYCwgYnV0IGV4dGVuc2lvbiBvdmVycmlkZXMgYXJlIG5vdAorICAvLyBgZS4ubWAgaXMgdGhlIHZhbHVlIG9mIHRoZSB0YXJnZXQgYGVgLCBidXQgZXh0ZW5zaW9uIG92ZXJyaWRlcyBhcmVuJ3QKICAgLy8gZXhwcmVzc2lvbnMgYW5kIGRvbid0IGhhdmUgYSB2YWx1ZS4KICAgLy8KICAgLy8gIyMjIyBFeGFtcGxlcwpAQCAtMjc1Nyw3ICsyNzY2LDcgQEAKICAgICovCiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KLSAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgbmFtZSB1c2VkIGluIHRoZSBpbXBsZW1lbnRzCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIG5hbWUgdXNlZCBpbiB0aGUgYGltcGxlbWVudHNgCiAgIC8vIGNsYXVzZSBvZiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uIGlzIGRlZmluZWQgdG8gYmUgc29tZXRoaW5nIG90aGVyCiAgIC8vIHRoYW4gYSBjbGFzcyBvciBtaXhpbi4KICAgLy8KQEAgLTI3ODEsOCArMjc5MCw4IEBACiAgIC8vIGltcG9ydGVkLCB0aGVuIGFkZCBhbiBpbXBvcnQsIHdpdGggYSBwcmVmaXgsIGZvciB0aGUgbGlicmFyeSBpbiB3aGljaCBpdOKAmXMKICAgLy8gZGVjbGFyZWQuCiAgIC8vCi0gIC8vIE90aGVyd2lzZSwgZWl0aGVyIHJlcGxhY2UgdGhlIG5hbWUgaW4gdGhlIGltcGxlbWVudHMgY2xhdXNlIHdpdGggdGhlIG5hbWUKLSAgLy8gb2YgYW4gZXhpc3RpbmcgY2xhc3Mgb3IgbWl4aW4sIG9yIHJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBpbXBsZW1lbnRzCisgIC8vIE90aGVyd2lzZSwgZWl0aGVyIHJlcGxhY2UgdGhlIG5hbWUgaW4gdGhlIGBpbXBsZW1lbnRzYCBjbGF1c2Ugd2l0aCB0aGUgbmFtZQorICAvLyBvZiBhbiBleGlzdGluZyBjbGFzcyBvciBtaXhpbiwgb3IgcmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIGBpbXBsZW1lbnRzYAogICAvLyBjbGF1c2UuCiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBJTVBMRU1FTlRTX05PTl9DTEFTUyA9IENvbXBpbGVUaW1lRXJyb3JDb2RlKAogICAgICAgJ0lNUExFTUVOVFNfTk9OX0NMQVNTJywKQEAgLTI3OTksNyArMjgwOCw3IEBACiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KICAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgc2luZ2xlIGNsYXNzIGlzIHNwZWNpZmllZCBtb3JlCi0gIC8vIHRoYW4gb25jZSBpbiBhbiBpbXBsZW1lbnRzIGNsYXVzZS4KKyAgLy8gdGhhbiBvbmNlIGluIGFuIGBpbXBsZW1lbnRzYCBjbGF1c2UuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KQEAgLTI5MTgsNyArMjkyNyw4IEBACiAgIC8vIFJlbW92ZSB0aGUgaW1wb3J0IGRpcmVjdGl2ZS4KICAgc3RhdGljIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlIElNUE9SVF9JTlRFUk5BTF9MSUJSQVJZID0KICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlKCdJTVBPUlRfSU5URVJOQUxfTElCUkFSWScsCi0gICAgICAgICAgIlRoZSBsaWJyYXJ5ICd7MH0nIGlzIGludGVybmFsIGFuZCBjYW4ndCBiZSBpbXBvcnRlZC4iKTsKKyAgICAgICAgICAiVGhlIGxpYnJhcnkgJ3swfScgaXMgaW50ZXJuYWwgYW5kIGNhbid0IGJlIGltcG9ydGVkLiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDE0LjEgSW1wb3J0czogSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIHNwZWNpZmllZCBVUkkgb2YgYW4KQEAgLTI5OTgsNyArMzAwOCw4IEBACiAgICAgICAgICAgIlN1cGVyaW50ZXJmYWNlcyBkb24ndCBoYXZlIGEgdmFsaWQgb3ZlcnJpZGUgZm9yICd7MH0nOiB7MX0uIiwKICAgICAgICAgICBjb3JyZWN0aW9uOgogICAgICAgICAgICAgICAiVHJ5IGFkZGluZyBhbiBleHBsaWNpdCBvdmVycmlkZSB0aGF0IGlzIGNvbnNpc3RlbnQgd2l0aCBhbGwgIgotICAgICAgICAgICAgICAib2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzLiIpOworICAgICAgICAgICAgICAib2YgdGhlIGluaGVyaXRlZCBtZW1iZXJzLiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDExLjEuMSBJbmhlcml0YW5jZSBhbmQgT3ZlcnJpZGluZy4gTGV0IGBJYCBiZSB0aGUgaW1wbGljaXQgaW50ZXJmYWNlIG9mIGEKQEAgLTM5NjQsNyArMzk3NSw4IEBACiAgICAgICAgICAgIlRoZSBwYXJhbWV0ZXIgJ3swfScgY2FuJ3QgaGF2ZSBhIHZhbHVlIG9mICdudWxsJyBiZWNhdXNlIG9mIGl0cyAiCiAgICAgICAgICAgICAgICJ0eXBlLCBhbmQgbm8gbm9uLW51bGwgZGVmYXVsdCB2YWx1ZSBpcyBwcm92aWRlZC4iLAogICAgICAgICAgIGNvcnJlY3Rpb246Ci0gICAgICAgICAgICAgICJUcnkgYWRkaW5nIGVpdGhlciBhIGRlZmF1bHQgdmFsdWUgb3IgdGhlICdyZXF1aXJlZCcgbW9kaWZpZXIuIik7CisgICAgICAgICAgICAgICJUcnkgYWRkaW5nIGVpdGhlciBhIGRlZmF1bHQgdmFsdWUgb3IgdGhlICdyZXF1aXJlZCcgbW9kaWZpZXIuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogUGFyYW1ldGVyczoKQEAgLTQwMDQsNyArNDAxNiw4IEBACiAgICAgICAgICAgJ01JU1NJTkdfUkVRVUlSRURfQVJHVU1FTlQnLAogICAgICAgICAgICJUaGUgbmFtZWQgcGFyYW1ldGVyICd7MH0nIGlzIHJlcXVpcmVkLCBidXQgdGhlcmUncyBubyBjb3JyZXNwb25kaW5nICIKICAgICAgICAgICAgICAgImFyZ3VtZW50LiIsCi0gICAgICAgICAgY29ycmVjdGlvbjogIlRyeSBhZGRpbmcgdGhlIHJlcXVpcmVkIGFyZ3VtZW50LiIpOworICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgYWRkaW5nIHRoZSByZXF1aXJlZCBhcmd1bWVudC4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBJdCdzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGFwcGx5IGEgbWl4aW4gY29udGFpbmluZyBzdXBlci1pbnZvY2F0aW9ucyB0bwpAQCAtNDEzOCwxNCArNDE1MSwxNiBAQAogICAgKi8KICAgc3RhdGljIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlIE1JWElOX09GX0RJU0FMTE9XRURfQ0xBU1MgPQogICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGVXaXRoVW5pcXVlTmFtZSgnU1VCVFlQRV9PRl9ESVNBTExPV0VEX1RZUEUnLAotICAgICAgICAgICdNSVhJTl9PRl9ESVNBTExPV0VEX0NMQVNTJywgIkNsYXNzZXMgY2FuJ3QgbWl4aW4gJ3swfScuIik7CisgICAgICAgICAgJ01JWElOX09GX0RJU0FMTE9XRURfQ0xBU1MnLCAiQ2xhc3NlcyBjYW4ndCBtaXhpbiAnezB9Jy4iLAorICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgc3BlY2lmeWluZyBhIGRpZmZlcmVudCBjbGFzcyBvciBtaXhpbiwgb3IgIgorICAgICAgICAgICAgICAicmVtb3ZlIHRoZSBjbGFzcyBvciBtaXhpbiBmcm9tIHRoZSBsaXN0LiIpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBuYW1lIGluIGEgbWl4aW4gY2xhdXNlIGlzCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIG5hbWUgaW4gYSBgd2l0aGAgY2xhdXNlIGlzCiAgIC8vIGRlZmluZWQgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBtaXhpbiBvciBhIGNsYXNzLgogICAvLwogICAvLyAjIyMjIEV4YW1wbGVzCkBAIC00MTYxLDcgKzQxNzYsOCBAQAogICAvLwogICAvLyAjIyMjIENvbW1vbiBmaXhlcwogICAvLwotICAvLyBSZW1vdmUgdGhlIGludmFsaWQgbmFtZSBmcm9tIHRoZSBsaXN0LCBwb3NzaWJseSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgaW50ZW5kZWQgbWl4aW4gb3IgY2xhc3M6CisgIC8vIFJlbW92ZSB0aGUgaW52YWxpZCBuYW1lIGZyb20gdGhlIGxpc3QsIHBvc3NpYmx5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lCisgIC8vIG9mIHRoZSBpbnRlbmRlZCBtaXhpbiBvciBjbGFzczoKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyB0eXBlZGVmIEYgPSBpbnQgRnVuY3Rpb24oU3RyaW5nKTsKQEAgLTQxOTAsNyArNDIwNiw5IEBACiAgICAgICBDb21waWxlVGltZUVycm9yQ29kZVdpdGhVbmlxdWVOYW1lKAogICAgICAgICAgICdTVUJUWVBFX09GX0RJU0FMTE9XRURfVFlQRScsCiAgICAgICAgICAgJ01JWElOX1NVUEVSX0NMQVNTX0NPTlNUUkFJTlRfRElTQUxMT1dFRF9DTEFTUycsCi0gICAgICAgICAgIid7MH0nIGNhbid0IGJlIHVzZWQgYXMgYSBzdXBlci1jbGFzcyBjb25zdHJhaW50LiIpOworICAgICAgICAgICInezB9JyBjYW4ndCBiZSB1c2VkIGFzIGEgc3VwZXItY2xhc3MgY29uc3RyYWludC4iLAorICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgc3BlY2lmeWluZyBhIGRpZmZlcmVudCBzdXBlci1jbGFzcyBjb25zdHJhaW50LCBvciAiCisgICAgICAgICAgICAgICJyZW1vdmUgdGhlICdvbicgY2xhdXNlLiIpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgpAQCAtNDIxNiw3ICs0MjM0LDcgQEAKICAgLy8gSWYgdGhlIHR5cGUgd2FzIGludGVuZGVkIHRvIGJlIGEgY2xhc3MgYnV0IHdhcyBtaXN0eXBlZCwgdGhlbiByZXBsYWNlIHRoZQogICAvLyBuYW1lLgogICAvLwotICAvLyBPdGhlcndpc2UsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSBvbiBjbGF1c2UuCisgIC8vIE90aGVyd2lzZSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIGBvbmAgY2xhdXNlLgogICBzdGF0aWMgY29uc3QgQ29tcGlsZVRpbWVFcnJvckNvZGUgTUlYSU5fU1VQRVJfQ0xBU1NfQ09OU1RSQUlOVF9OT05fSU5URVJGQUNFID0KICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlKCdNSVhJTl9TVVBFUl9DTEFTU19DT05TVFJBSU5UX05PTl9JTlRFUkZBQ0UnLAogICAgICAgICAgICJPbmx5IGNsYXNzZXMgYW5kIG1peGlucyBjYW4gYmUgdXNlZCBhcyBzdXBlcmNsYXNzIGNvbnN0cmFpbnRzLiIsCkBAIC00MzU3LDggKzQzNzUsOCBAQAogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIGV4cHJlc3Npb24gaW4gYSBjYXNlIGNsYXVzZQotICAvLyBpc24ndCBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgZXhwcmVzc2lvbiBpbiBhIGBjYXNlYAorICAvLyBjbGF1c2UgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLgogICAvLwogICAvLyAjIyMjIEV4YW1wbGVzCiAgIC8vCkBAIC00Mzc2LDggKzQzOTQsOCBAQAogICAvLwogICAvLyAjIyMjIENvbW1vbiBmaXhlcwogICAvLwotICAvLyBFaXRoZXIgbWFrZSB0aGUgZXhwcmVzc2lvbiBhIGNvbnN0YW50IGV4cHJlc3Npb24sIG9yIHJld3JpdGUgdGhlIHN3aXRjaAotICAvLyBzdGF0ZW1lbnQgYXMgYSBzZXF1ZW5jZSBvZiBpZiBzdGF0ZW1lbnRzOgorICAvLyBFaXRoZXIgbWFrZSB0aGUgZXhwcmVzc2lvbiBhIGNvbnN0YW50IGV4cHJlc3Npb24sIG9yIHJld3JpdGUgdGhlIGBzd2l0Y2hgCisgIC8vIHN0YXRlbWVudCBhcyBhIHNlcXVlbmNlIG9mIGBpZmAgc3RhdGVtZW50czoKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyB2b2lkIGYoaW50IGksIGludCBqKSB7CkBAIC00NjMyLDEyICs0NjUwLDEyIEBACiAgICAqLwogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCi0gIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBpZiBlbGVtZW50IG9yIGEgc3ByZWFkCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBgaWZgIGVsZW1lbnQgb3IgYSBzcHJlYWQKICAgLy8gZWxlbWVudCBpbiBhIGNvbnN0YW50IG1hcCBpc24ndCBhIGNvbnN0YW50IGVsZW1lbnQuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGl0IGlzIGF0dGVtcHRpbmcgdG8KKyAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGl0J3MgYXR0ZW1wdGluZyB0bwogICAvLyBzcHJlYWQgYSBub24tY29uc3RhbnQgbWFwOgogICAvLwogICAvLyBgYGBkYXJ0CkBAIC00NjQ2LDcgKzQ2NjQsNyBAQAogICAvLyBgYGAKICAgLy8KICAgLy8gU2ltaWxhcmx5LCB0aGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlCi0gIC8vIGNvbmRpdGlvbiBpbiB0aGUgaWYgZWxlbWVudCBpc24ndCBhIGNvbnN0YW50IGV4cHJlc3Npb246CisgIC8vIGNvbmRpdGlvbiBpbiB0aGUgYGlmYCBlbGVtZW50IGlzbid0IGEgY29uc3RhbnQgZXhwcmVzc2lvbjoKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyBib29sIG5vdENvbnN0ID0gdHJ1ZTsKQEAgLTQ2NTUsNyArNDY3Myw3IEBACiAgIC8vCiAgIC8vICMjIyMgQ29tbW9uIGZpeGVzCiAgIC8vCi0gIC8vIElmIHRoZSBtYXAgbmVlZHMgdG8gYmUgYSBjb25zdGFudCBtYXAsIHRoZW4gbWFrZSB0aGUgZWxlbWVudHMgIGNvbnN0YW50cy4KKyAgLy8gSWYgdGhlIG1hcCBuZWVkcyB0byBiZSBhIGNvbnN0YW50IG1hcCwgdGhlbiBtYWtlIHRoZSBlbGVtZW50cyBjb25zdGFudHMuCiAgIC8vIEluIHRoZSBzcHJlYWQgZXhhbXBsZSwgeW91IG1pZ2h0IGRvIHRoYXQgYnkgbWFraW5nIHRoZSBjb2xsZWN0aW9uIGJlaW5nCiAgIC8vIHNwcmVhZCBhIGNvbnN0YW50OgogICAvLwpAQCAtNDczNCw3ICs0NzUyLDggQEAKICAgLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIG9yIHVzZSBhIGRpZmZlcmVudCBjbGFzcyBmb3IgdGhlIGFubm90YXRpb24uCiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBOT05fQ09OU1RBTlRfQU5OT1RBVElPTl9DT05TVFJVQ1RPUiA9CiAgICAgICBDb21waWxlVGltZUVycm9yQ29kZSgnTk9OX0NPTlNUQU5UX0FOTk9UQVRJT05fQ09OU1RSVUNUT1InLAotICAgICAgICAgICJBbm5vdGF0aW9uIGNyZWF0aW9uIGNhbiBvbmx5IGNhbGwgYSBjb25zdCBjb25zdHJ1Y3Rvci4iKTsKKyAgICAgICAgICAiQW5ub3RhdGlvbiBjcmVhdGlvbiBjYW4gb25seSBjYWxsIGEgY29uc3QgY29uc3RydWN0b3IuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogTm8gcGFyYW1ldGVycy4KQEAgLTQ5MzUsNyArNDk1NCw4IEBACiAgICAgICAgICAgIlRoZSBub24tbnVsbGFibGUgbG9jYWwgdmFyaWFibGUgJ3swfScgbXVzdCBiZSBhc3NpZ25lZCBiZWZvcmUgaXQgIgogICAgICAgICAgICAgICAiY2FuIGJlIHVzZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGdpdmluZyBpdCBhbiBpbml0aWFsaXplciBleHByZXNzaW9uLCBvciBlbnN1cmUgdGhhdCAiCi0gICAgICAgICAgICAgICJpdCdzIGFzc2lnbmVkIG9uIGV2ZXJ5IGV4ZWN1dGlvbiBwYXRoLiIpOworICAgICAgICAgICAgICAiaXQncyBhc3NpZ25lZCBvbiBldmVyeSBleGVjdXRpb24gcGF0aC4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtNTA2Myw3ICs1MDgzLDggQEAKICAgICAgICAgICAiTm9uLW51bGxhYmxlIGluc3RhbmNlIGZpZWxkICd7MH0nIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciBleHByZXNzaW9uLCAiCiAgICAgICAgICAgICAgICJvciBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyBpdCwgIgotICAgICAgICAgICAgICAib3IgbWFyayBpdCAnbGF0ZScuIik7CisgICAgICAgICAgICAgICJvciBtYXJrIGl0ICdsYXRlJy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtNTA3Nyw3ICs1MDk4LDggQEAKICAgICAgICAgICAiTm9uLW51bGxhYmxlIGluc3RhbmNlIGZpZWxkICd7MH0nIG11c3QgYmUgaW5pdGlhbGl6ZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciBleHByZXNzaW9uLCAiCiAgICAgICAgICAgICAgICJvciBhZGQgYSBmaWVsZCBpbml0aWFsaXplciBpbiB0aGlzIGNvbnN0cnVjdG9yLCAiCi0gICAgICAgICAgICAgICJvciBtYXJrIGl0ICdsYXRlJy4iKTsKKyAgICAgICAgICAgICAgIm9yIG1hcmsgaXQgJ2xhdGUnLiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIFBhcmFtZXRlcnM6CkBAIC01MTQzLDcgKzUxNjUsOCBAQAogICBzdGF0aWMgY29uc3QgQ29tcGlsZVRpbWVFcnJvckNvZGUgTk9UX0lOSVRJQUxJWkVEX05PTl9OVUxMQUJMRV9WQVJJQUJMRSA9CiAgICAgICBDb21waWxlVGltZUVycm9yQ29kZSgnTk9UX0lOSVRJQUxJWkVEX05PTl9OVUxMQUJMRV9WQVJJQUJMRScsCiAgICAgICAgICAgIlRoZSBub24tbnVsbGFibGUgdmFyaWFibGUgJ3swfScgbXVzdCBiZSBpbml0aWFsaXplZC4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgYWRkaW5nIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24uIik7CisgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSBhZGRpbmcgYW4gaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgpAQCAtNTIyMywxMiArNTI0NiwxMiBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGNsYXNzIGRlY2xhcmF0aW9uIHVzZXMgYW4KLSAgLy8gZXh0ZW5kcyBjbGF1c2UgdG8gc3BlY2lmeSBhIHN1cGVyY2xhc3MsIGFuZCB0aGUgc3VwZXJjbGFzcyBpcyBmb2xsb3dlZCBieSBhCi0gIC8vIGA/YC4KKyAgLy8gYGV4dGVuZHNgIGNsYXVzZSB0byBzcGVjaWZ5IGEgc3VwZXJjbGFzcywgYW5kIHRoZSBzdXBlcmNsYXNzIGlzIGZvbGxvd2VkIGJ5CisgIC8vIGEgYD9gLgogICAvLwogICAvLyBJdCBpc24ndCB2YWxpZCB0byBzcGVjaWZ5IGEgbnVsbGFibGUgc3VwZXJjbGFzcyBiZWNhdXNlIGRvaW5nIHNvIHdvdWxkIGhhdmUKICAgLy8gbm8gbWVhbmluZzsgaXQgd291bGRuJ3QgY2hhbmdlIGVpdGhlciB0aGUgaW50ZXJmYWNlIG9yIGltcGxlbWVudGF0aW9uIGJlaW5nCi0gIC8vIGluaGVyaXRlZCBieSB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UuCisgIC8vIGluaGVyaXRlZCBieSB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgYGV4dGVuZHNgIGNsYXVzZS4KICAgLy8KICAgLy8gTm90ZSwgaG93ZXZlciwgdGhhdCBpdCBfaXNfIHZhbGlkIHRvIHVzZSBhIG51bGxhYmxlIHR5cGUgYXMgYSB0eXBlIGFyZ3VtZW50CiAgIC8vIHRvIHRoZSBzdXBlcmNsYXNzLCBzdWNoIGFzIGBjbGFzcyBBIGV4dGVuZHMgQjxDPz4ge31gLgpAQCAtNTIzNiw3ICs1MjU5LDcgQEAKICAgLy8gIyMjIyBFeGFtcGxlCiAgIC8vCiAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQT9gIGlzIGEgbnVsbGFibGUKLSAgLy8gdHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gZXh0ZW5kcyBjbGF1c2U6CisgIC8vIHR5cGUsIGFuZCBudWxsYWJsZSB0eXBlcyBjYW4ndCBiZSB1c2VkIGluIGFuIGBleHRlbmRzYCBjbGF1c2U6CiAgIC8vCiAgIC8vIGBgYGRhcnQKICAgLy8gJWV4cGVyaW1lbnRzPW5vbi1udWxsYWJsZQpAQCAtNTI1Niw3ICs1Mjc5LDggQEAKICAgc3RhdGljIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlIE5VTExBQkxFX1RZUEVfSU5fRVhURU5EU19DTEFVU0UgPQogICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUoJ05VTExBQkxFX1RZUEVfSU5fRVhURU5EU19DTEFVU0UnLAogICAgICAgICAgICJBIGNsYXNzIGNhbid0IGV4dGVuZCBhIG51bGxhYmxlIHR5cGUuIiwKLSAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IHJlbW92aW5nIHRoZSBxdWVzdGlvbiBtYXJrLiIpOworICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIHF1ZXN0aW9uIG1hcmsuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogTm8gcGFyYW1ldGVycy4KQEAgLTUyNjQsMTEgKzUyODgsMTEgQEAKICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwogICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbiBoYXMKLSAgLy8gYW4gaW1wbGVtZW50cyBjbGF1c2UsIGFuZCBhbiBpbnRlcmZhY2UgaXMgZm9sbG93ZWQgYnkgYSBgP2AuCisgIC8vIGFuIGBpbXBsZW1lbnRzYCBjbGF1c2UsIGFuZCBhbiBpbnRlcmZhY2UgaXMgZm9sbG93ZWQgYnkgYSBgP2AuCiAgIC8vCiAgIC8vIEl0IGlzbid0IHZhbGlkIHRvIHNwZWNpZnkgYSBudWxsYWJsZSBpbnRlcmZhY2UgYmVjYXVzZSBkb2luZyBzbyB3b3VsZCBoYXZlCiAgIC8vIG5vIG1lYW5pbmc7IGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgaW50ZXJmYWNlIGJlaW5nIGluaGVyaXRlZCBieSB0aGUgY2xhc3MKLSAgLy8gY29udGFpbmluZyB0aGUgaW1wbGVtZW50cyBjbGF1c2UuCisgIC8vIGNvbnRhaW5pbmcgdGhlIGBpbXBsZW1lbnRzYCBjbGF1c2UuCiAgIC8vCiAgIC8vIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQgX2lzXyB2YWxpZCB0byB1c2UgYSBudWxsYWJsZSB0eXBlIGFzIGEgdHlwZSBhcmd1bWVudAogICAvLyB0byB0aGUgaW50ZXJmYWNlLCBzdWNoIGFzIGBjbGFzcyBBIGltcGxlbWVudHMgQjxDPz4ge31gLgpAQCAtNTI3Nyw3ICs1MzAxLDcgQEAKICAgLy8gIyMjIyBFeGFtcGxlCiAgIC8vCiAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQT9gIGlzIGEgbnVsbGFibGUKLSAgLy8gdHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gaW1wbGVtZW50cyBjbGF1c2U6CisgIC8vIHR5cGUsIGFuZCBudWxsYWJsZSB0eXBlcyBjYW4ndCBiZSB1c2VkIGluIGFuIGBpbXBsZW1lbnRzYCBjbGF1c2U6CiAgIC8vCiAgIC8vIGBgYGRhcnQKICAgLy8gJWV4cGVyaW1lbnRzPW5vbi1udWxsYWJsZQpAQCAtNTI5NywyMCArNTMyMSwyMSBAQAogICBzdGF0aWMgY29uc3QgQ29tcGlsZVRpbWVFcnJvckNvZGUgTlVMTEFCTEVfVFlQRV9JTl9JTVBMRU1FTlRTX0NMQVVTRSA9CiAgICAgICBDb21waWxlVGltZUVycm9yQ29kZSgnTlVMTEFCTEVfVFlQRV9JTl9JTVBMRU1FTlRTX0NMQVVTRScsCiAgICAgICAgICAgIkEgY2xhc3Mgb3IgbWl4aW4gY2FuJ3QgaW1wbGVtZW50IGEgbnVsbGFibGUgdHlwZS4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIHF1ZXN0aW9uIG1hcmsuIik7CisgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyB0aGUgcXVlc3Rpb24gbWFyay4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBtaXhpbiBkZWNsYXJhdGlvbiB1c2VzIGFuIG9uCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIG1peGluIGRlY2xhcmF0aW9uIHVzZXMgYW4gYG9uYAogICAvLyBjbGF1c2UgdG8gc3BlY2lmeSBhIHN1cGVyY2xhc3MgY29uc3RyYWludCwgYW5kIHRoZSBjbGFzcyB0aGF0J3Mgc3BlY2lmaWVkCiAgIC8vIGlzIGZvbGxvd2VkIGJ5IGEgYD9gLgogICAvLwogICAvLyBJdCBpc24ndCB2YWxpZCB0byBzcGVjaWZ5IGEgbnVsbGFibGUgc3VwZXJjbGFzcyBjb25zdHJhaW50IGJlY2F1c2UgZG9pbmcgc28KICAgLy8gd291bGQgaGF2ZSBubyBtZWFuaW5nOyBpdCB3b3VsZG4ndCBjaGFuZ2UgdGhlIGludGVyZmFjZSBiZWluZyBkZXBlbmRlZCBvbgotICAvLyBieSB0aGUgbWl4aW4gY29udGFpbmluZyB0aGUgb24gY2xhdXNlLgorICAvLyBieSB0aGUgbWl4aW4gY29udGFpbmluZyB0aGUgYG9uYCBjbGF1c2UuCiAgIC8vCiAgIC8vIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQgX2lzXyB2YWxpZCB0byB1c2UgYSBudWxsYWJsZSB0eXBlIGFzIGEgdHlwZSBhcmd1bWVudAogICAvLyB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJhaW50LCBzdWNoIGFzIGBtaXhpbiBBIG9uIEI8Qz8+IHt9YC4KQEAgLTUzMTksNyArNTM0NCw3IEBACiAgIC8vICMjIyMgRXhhbXBsZQogICAvLwogICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYEE/YCBpcyBhIG51bGxhYmxlIHR5cGUKLSAgLy8gYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gb24gY2xhdXNlOgorICAvLyBhbmQgbnVsbGFibGUgdHlwZXMgY2FuJ3QgYmUgdXNlZCBpbiBhbiBgb25gIGNsYXVzZToKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyAlZXhwZXJpbWVudHM9bm9uLW51bGxhYmxlCkBAIC01MzM5LDcgKzUzNjQsOCBAQAogICBzdGF0aWMgY29uc3QgQ29tcGlsZVRpbWVFcnJvckNvZGUgTlVMTEFCTEVfVFlQRV9JTl9PTl9DTEFVU0UgPQogICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUoJ05VTExBQkxFX1RZUEVfSU5fT05fQ0xBVVNFJywKICAgICAgICAgICAiQSBtaXhpbiBjYW4ndCBoYXZlIGEgbnVsbGFibGUgdHlwZSBhcyBhIHN1cGVyY2xhc3MgY29uc3RyYWludC4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIHF1ZXN0aW9uIG1hcmsuIik7CisgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyB0aGUgcXVlc3Rpb24gbWFyay4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBObyBwYXJhbWV0ZXJzLgpAQCAtNTM0NywxMSArNTM3MywxMSBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGNsYXNzIG9yIG1peGluIGRlY2xhcmF0aW9uIGhhcwotICAvLyBhIHdpdGggY2xhdXNlLCBhbmQgYSBtaXhpbiBpcyBmb2xsb3dlZCBieSBhIGA/YC4KKyAgLy8gYSBgd2l0aGAgY2xhdXNlLCBhbmQgYSBtaXhpbiBpcyBmb2xsb3dlZCBieSBhIGA/YC4KICAgLy8KICAgLy8gSXQgaXNuJ3QgdmFsaWQgdG8gc3BlY2lmeSBhIG51bGxhYmxlIG1peGluIGJlY2F1c2UgZG9pbmcgc28gd291bGQgaGF2ZSBubwogICAvLyBtZWFuaW5nOyBpdCB3b3VsZG4ndCBjaGFuZ2UgZWl0aGVyIHRoZSBpbnRlcmZhY2Ugb3IgaW1wbGVtZW50YXRpb24gYmVpbmcKLSAgLy8gaW5oZXJpdGVkIGJ5IHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSB3aXRoIGNsYXVzZS4KKyAgLy8gaW5oZXJpdGVkIGJ5IHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBgd2l0aGAgY2xhdXNlLgogICAvLwogICAvLyBOb3RlLCBob3dldmVyLCB0aGF0IGl0IF9pc18gdmFsaWQgdG8gdXNlIGEgbnVsbGFibGUgdHlwZSBhcyBhIHR5cGUgYXJndW1lbnQKICAgLy8gdG8gdGhlIG1peGluLCBzdWNoIGFzIGBjbGFzcyBBIHdpdGggQjxDPz4ge31gLgpAQCAtNTM1OSw3ICs1Mzg1LDcgQEAKICAgLy8gIyMjIyBFeGFtcGxlCiAgIC8vCiAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQT9gIGlzIGEgbnVsbGFibGUKLSAgLy8gdHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYSB3aXRoIGNsYXVzZToKKyAgLy8gdHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYSBgd2l0aGAgY2xhdXNlOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vICVleHBlcmltZW50cz1ub24tbnVsbGFibGUKQEAgLTUzNzksNyArNTQwNSw4IEBACiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBOVUxMQUJMRV9UWVBFX0lOX1dJVEhfQ0xBVVNFID0KICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlKCdOVUxMQUJMRV9UWVBFX0lOX1dJVEhfQ0xBVVNFJywKICAgICAgICAgICAiQSBjbGFzcyBvciBtaXhpbiBjYW4ndCBtaXggaW4gYSBudWxsYWJsZSB0eXBlLiIsCi0gICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyB0aGUgcXVlc3Rpb24gbWFyay4iKTsKKyAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IHJlbW92aW5nIHRoZSBxdWVzdGlvbiBtYXJrLiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDcuOSBTdXBlcmNsYXNzZXM6IEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIHNwZWNpZnkgYW4gZXh0ZW5kcyBjbGF1c2UKQEAgLTU1MzMsNyArNTU2MCw4IEBACiAgICAgICAgICAgICAgICJieSAnLicuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOgogICAgICAgICAgICAgICAiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gcmVmZXIgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYSAiCi0gICAgICAgICAgICAgICJwcmVmaXgsIG9yIHJlbmFtaW5nIHRoZSBwcmVmaXguIik7CisgICAgICAgICAgICAgICJwcmVmaXgsIG9yIHJlbmFtaW5nIHRoZSBwcmVmaXguIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogSXQgaXMgYW4gZXJyb3IgZm9yIGEgbWl4aW4gdG8gYWRkIGEgcHJpdmF0ZSBuYW1lIHRoYXQgY29uZmxpY3RzIHdpdGggYQpAQCAtNTgzOCwxMyArNTg2NiwxMyBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGdlbmVyYXRpdmUgY29uc3RydWN0b3IKLSAgLy8gY29udGFpbnMgYSByZXR1cm4gc3RhdGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisgIC8vIGNvbnRhaW5zIGEgYHJldHVybmAgc3RhdGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCiAgIC8vIEdlbmVyYXRpdmUgY29uc3RydWN0b3JzIGFsd2F5cyByZXR1cm4gdGhlIG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLCBhbmQKICAgLy8gdGhlcmVmb3JlIGNhbid0IHJldHVybiBhIGRpZmZlcmVudCBvYmplY3QuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZQogICAvLwotICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHJldHVybiBzdGF0ZW1lbnQKKyAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBgcmV0dXJuYCBzdGF0ZW1lbnQKICAgLy8gaGFzIGFuIGV4cHJlc3Npb246CiAgIC8vCiAgIC8vIGBgYGRhcnQKQEAgLTU4NTgsNyArNTg4Niw3IEBACiAgIC8vICMjIyMgQ29tbW9uIGZpeGVzCiAgIC8vCiAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciBzaG91bGQgY3JlYXRlIGEgbmV3IGluc3RhbmNlLCB0aGVuIHJlbW92ZSBlaXRoZXIgdGhlCi0gIC8vIHJldHVybiBzdGF0ZW1lbnQgb3IgdGhlIGV4cHJlc3Npb246CisgIC8vIGByZXR1cm5gIHN0YXRlbWVudCBvciB0aGUgZXhwcmVzc2lvbjoKICAgLy8KICAgLy8gYGBgZGFydAogICAvLyBjbGFzcyBDIHsKQEAgLTU4ODQsNyArNTkxMiw4IEBACiAgICAgICBDb21waWxlVGltZUVycm9yQ29kZSgnUkVUVVJOX0lOX0dFTkVSQVRJVkVfQ09OU1RSVUNUT1InLAogICAgICAgICAgICJDb25zdHJ1Y3RvcnMgY2FuJ3QgcmV0dXJuIHZhbHVlcy4iLAogICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIHJldHVybiBzdGF0ZW1lbnQgb3IgdXNpbmcgYSBmYWN0b3J5ICIKLSAgICAgICAgICAgICAgImNvbnN0cnVjdG9yLiIpOworICAgICAgICAgICAgICAiY29uc3RydWN0b3IuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogMTMuMTIgUmV0dXJuOiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHJldHVybiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0KQEAgLTYwMjAsNyArNjA0OSw3IEBACiAgIC8vICMjIyMgRGVzY3JpcHRpb24KICAgLy8KICAgLy8gVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGluIGEKLSAgLy8gdGhyb3cgZXhwcmVzc2lvbiBpcyBub3QgYXNzaWduYWJsZSB0byBgT2JqZWN0YC4gSXTigJlzIG5vdCB2YWxpZCB0byB0aHJvdworICAvLyB0aHJvdyBleHByZXNzaW9uIGlzbid0IGFzc2lnbmFibGUgdG8gYE9iamVjdGAuIEl0IGlzbid0IHZhbGlkIHRvIHRocm93CiAgIC8vIGBudWxsYCwgc28gaXQgaXNuJ3QgdmFsaWQgdG8gdXNlIGFuIGV4cHJlc3Npb24gdGhhdCBtaWdodCBldmFsdWF0ZSB0bwogICAvLyBgbnVsbGAuCiAgIC8vCkBAIC02MDQ3LDcgKzYwNzYsOCBAQAogICAvLyBgYGAKICAgc3RhdGljIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlIFRIUk9XX09GX0lOVkFMSURfVFlQRSA9IENvbXBpbGVUaW1lRXJyb3JDb2RlKAogICAgICAgJ1RIUk9XX09GX0lOVkFMSURfVFlQRScsCi0gICAgICAiVGhlIHR5cGUgJ3swfScgb2YgdGhlIHRocm93biBleHByZXNzaW9uIG11c3QgYmUgYXNzaWduYWJsZSB0byAnT2JqZWN0Jy4iKTsKKyAgICAgICJUaGUgdHlwZSAnezB9JyBvZiB0aGUgdGhyb3duIGV4cHJlc3Npb24gbXVzdCBiZSBhc3NpZ25hYmxlIHRvICdPYmplY3QnLiIsCisgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogUGFyYW1ldGVyczoKQEAgLTcwMjcsOSArNzA1NywxMyBAQAogCiAgIGNvbnN0IENvbXBpbGVUaW1lRXJyb3JDb2RlV2l0aFVuaXF1ZU5hbWUoCiAgICAgICBTdHJpbmcgbmFtZSwgdGhpcy51bmlxdWVOYW1lLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIHtTdHJpbmcgY29ycmVjdGlvbiwgYm9vbCBoYXNQdWJsaXNoZWREb2NzfSkKKyAgICAgIHtTdHJpbmcgY29ycmVjdGlvbiwKKyAgICAgIGJvb2wgaGFzUHVibGlzaGVkRG9jcywKKyAgICAgIGJvb2wgaXNVbnJlc29sdmVkSWRlbnRpZmllciA9IGZhbHNlfSkKICAgICAgIDogc3VwZXIobmFtZSwgbWVzc2FnZSwKLSAgICAgICAgICAgIGNvcnJlY3Rpb246IGNvcnJlY3Rpb24sIGhhc1B1Ymxpc2hlZERvY3M6IGhhc1B1Ymxpc2hlZERvY3MpOworICAgICAgICAgICAgY29ycmVjdGlvbjogY29ycmVjdGlvbiwKKyAgICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IGhhc1B1Ymxpc2hlZERvY3MsCisgICAgICAgICAgICBpc1VucmVzb2x2ZWRJZGVudGlmaWVyOiBpc1VucmVzb2x2ZWRJZGVudGlmaWVyKTsKIH0KIAogLyoqCkBAIC03MTM1LDcgKzcxNjksOCBAQAogICAgICAgICAgICJGdW5jdGlvbnMgbWFya2VkICdhc3luYycgbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUgYXNzaWduYWJsZSB0byAiCiAgICAgICAgICAgICAgICInRnV0dXJlJy4iLAogICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgZml4aW5nIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24sIG9yICIKLSAgICAgICAgICAgICAgInJlbW92aW5nIHRoZSBtb2RpZmllciAnYXN5bmMnIGZyb20gdGhlIGZ1bmN0aW9uIGJvZHkuIik7CisgICAgICAgICAgICAgICJyZW1vdmluZyB0aGUgbW9kaWZpZXIgJ2FzeW5jJyBmcm9tIHRoZSBmdW5jdGlvbiBib2R5LiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDkgRnVuY3Rpb25zOiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiBhCkBAIC03NjgyLDcgKzc3MTcsOCBAQAogICAgICAgICAgICJUaGVyZSdzIG5vIGNvbnN0YW50IG5hbWVkICd7MH0nIGluICd7MX0nLiIsCiAgICAgICAgICAgY29ycmVjdGlvbjoKICAgICAgICAgICAgICAgIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGNvbnN0YW50LCBvciAiCi0gICAgICAgICAgICAgICJkZWZpbmluZyBhIGNvbnN0YW50IG5hbWVkICd7MH0nLiIpOworICAgICAgICAgICAgICAiZGVmaW5pbmcgYSBjb25zdGFudCBuYW1lZCAnezB9Jy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtODU5NiwxMyArODYzMiwxMyBAQAogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIGxhc3Qgc3RhdGVtZW50IGluIGEgY2FzZQorICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIGxhc3Qgc3RhdGVtZW50IGluIGEgYGNhc2VgCiAgIC8vIGJsb2NrIGlzbid0IG9uZSBvZiB0aGUgcmVxdWlyZWQgdGVybWluYXRvcnM6IGBicmVha2AsIGBjb250aW51ZWAsCiAgIC8vIGByZXRocm93YCwgYHJldHVybmAsIG9yIGB0aHJvd2AuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKICAgLy8KLSAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjYXNlIGJsb2NrIGVuZHMKKyAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBgY2FzZWAgYmxvY2sgZW5kcwogICAvLyB3aXRoIGFuIGFzc2lnbm1lbnQ6CiAgIC8vCiAgIC8vIGBgYGRhcnQKQEAgLTg4MDcsNyArODg0Myw4IEBACiAgICAgICAnREVBRF9OVUxMX0FXQVJFX0VYUFJFU1NJT04nLAogICAgICAgIlRoZSBsZWZ0IG9wZXJhbmQgY2FuJ3QgYmUgbnVsbCwgc28gdGhlIHJpZ2h0IG9wZXJhbmQgaXMgbmV2ZXIgZXhlY3V0ZWQuIiwKICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3ZpbmcgdGhlIG9wZXJhdG9yIGFuZCB0aGUgcmlnaHQgb3BlcmFuZC4iLAotICAgICAgZXJyb3JTZXZlcml0eTogRXJyb3JTZXZlcml0eS5XQVJOSU5HKTsKKyAgICAgIGVycm9yU2V2ZXJpdHk6IEVycm9yU2V2ZXJpdHkuV0FSTklORywKKyAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiAxNC4yIEV4cG9ydHM6IEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgdG8gZXhwb3J0IHR3byBkaWZmZXJlbnQgbGlicmFyaWVzIHdpdGgKQEAgLTg4ODQsNyArODkyMSw4IEBACiAgICAgICAgICAgJ0ZJRUxEX0lOSVRJQUxJWkVEX0lOX0lOSVRJQUxJWkVSX0FORF9ERUNMQVJBVElPTicsCiAgICAgICAgICAgIkZpZWxkcyBjYW4ndCBiZSBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IgaWYgdGhleSBhcmUgZmluYWwgIgogICAgICAgICAgICAgICAiYW5kIHdlcmUgYWxyZWFkeSBpbml0aWFsaXplZCBhdCB0aGVpciBkZWNsYXJhdGlvbi4iLAotICAgICAgICAgIGNvcnJlY3Rpb246ICJUcnkgcmVtb3Zpbmcgb25lIG9mIHRoZSBpbml0aWFsaXphdGlvbnMuIik7CisgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGluaXRpYWxpemF0aW9ucy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiA1LiBWYXJpYWJsZXM6IEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgYSBmaW5hbCBpbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGhhcwpAQCAtODk1Miw3ICs4OTkwLDggQEAKICAgICAgIFN0YXRpY1dhcm5pbmdDb2RlKAogICAgICAgICAgICdGSUVMRF9JTklUSUFMSVpFUl9OT1RfQVNTSUdOQUJMRScsCiAgICAgICAgICAgIlRoZSBpbml0aWFsaXplciB0eXBlICd7MH0nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBmaWVsZCB0eXBlICIKLSAgICAgICAgICAgICAgIid7MX0nLiIpOworICAgICAgICAgICAgICAiJ3sxfScuIiwKKyAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIAogICAvKioKICAgICogNy42LjEgR2VuZXJhdGl2ZSBDb25zdHJ1Y3RvcnM6IEFuIGluaXRpYWxpemluZyBmb3JtYWwgaGFzIHRoZSBmb3JtCkBAIC05MTEyLDcgKzkxNTEsNyBAQAogICAgICAgU3RhdGljV2FybmluZ0NvZGVXaXRoVW5pcXVlTmFtZSgKICAgICAgICAgICAnRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SJywKICAgICAgICAgICAnU3RhdGljV2FybmluZ0NvZGUuRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SXzEnLAotICAgICAgICAgICJBbGwgZmluYWwgdmFyaWFibGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIGJ1dCAnezB9JyBpcyBub3QuIiwKKyAgICAgICAgICAiQWxsIGZpbmFsIHZhcmlhYmxlcyBtdXN0IGJlIGluaXRpYWxpemVkLCBidXQgJ3swfScgaXNuJ3QuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGFkZGluZyBhbiBpbml0aWFsaXplciBmb3IgdGhlIGZpZWxkLiIsCiAgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKQEAgLTkxMjUsOCArOTE2NCw4IEBACiAgICAgICBTdGF0aWNXYXJuaW5nQ29kZVdpdGhVbmlxdWVOYW1lKAogICAgICAgICAgICdGSU5BTF9OT1RfSU5JVElBTElaRURfQ09OU1RSVUNUT1InLAogICAgICAgICAgICdTdGF0aWNXYXJuaW5nQ29kZS5GSU5BTF9OT1RfSU5JVElBTElaRURfQ09OU1RSVUNUT1JfMicsCi0gICAgICAgICAgIkFsbCBmaW5hbCB2YXJpYWJsZXMgbXVzdCBiZSBpbml0aWFsaXplZCwgYnV0ICd7MH0nIGFuZCAnezF9JyBhcmUgIgotICAgICAgICAgICAgICAibm90LiIsCisgICAgICAgICAgIkFsbCBmaW5hbCB2YXJpYWJsZXMgbXVzdCBiZSBpbml0aWFsaXplZCwgYnV0ICd7MH0nIGFuZCAnezF9JyAiCisgICAgICAgICAgICAgICJhcmVuJ3QuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGFkZGluZyBpbml0aWFsaXplcnMgZm9yIHRoZSBmaWVsZHMuIiwKICAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIApAQCAtOTE0MSw3ICs5MTgwLDcgQEAKICAgICAgICAgICAnRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SJywKICAgICAgICAgICAnU3RhdGljV2FybmluZ0NvZGUuRklOQUxfTk9UX0lOSVRJQUxJWkVEX0NPTlNUUlVDVE9SXzMnLAogICAgICAgICAgICJBbGwgZmluYWwgdmFyaWFibGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIGJ1dCAnezB9JywgJ3sxfScsIGFuZCB7Mn0gIgotICAgICAgICAgICAgICAib3RoZXJzIGFyZSBub3QuIiwKKyAgICAgICAgICAgICAgIm90aGVycyBhcmVuJ3QuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGFkZGluZyBpbml0aWFsaXplcnMgZm9yIHRoZSBmaWVsZHMuIiwKICAgICAgICAgICBoYXNQdWJsaXNoZWREb2NzOiB0cnVlKTsKIApAQCAtOTI2Niw4ICs5MzA1LDggQEAKICAgLy8KICAgLy8gIyMjIyBDb21tb24gZml4ZXMKICAgLy8KLSAgLy8gUmVwbGFjZSB0aGUgbnVsbC1hd2FyZSBvcGVyYXRvciB3aXRoIGEgbm9uLW51bGwtYXdhcmUgZXF1aXZhbGVudCwgc3VjaCBhcwotICAvLyByZXBsYWNpbmcgJz8uJyB3aXRoICAnLic6CisgIC8vIFJlcGxhY2UgdGhlIG51bGwtYXdhcmUgb3BlcmF0b3Igd2l0aCBhIG5vbi1udWxsLWF3YXJlIGVxdWl2YWxlbnQ7IGZvcgorICAvLyBleGFtcGxlLCBjaGFuZ2UgYD8uYCB0byAgYC5gOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vICVleHBlcmltZW50cz1ub24tbnVsbGFibGUKQEAgLTkyODQsNyArOTMyMyw4IEBACiAgICAgICAgICAgIlRoZSB0YXJnZXQgZXhwcmVzc2lvbiBjYW4ndCBiZSBudWxsLCBzbyB0aGUgbnVsbC1hd2FyZSBvcGVyYXRvciAiCiAgICAgICAgICAgICAgICInezB9JyBjYW4ndCBiZSB1c2VkLiIsCiAgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZXBsYWNlIHRoZSBvcGVyYXRvciAnezB9JyB3aXRoICd7MX0nLiIsCi0gICAgICAgICAgZXJyb3JTZXZlcml0eTogRXJyb3JTZXZlcml0eS5XQVJOSU5HKTsKKyAgICAgICAgICBlcnJvclNldmVyaXR5OiBFcnJvclNldmVyaXR5LldBUk5JTkcsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIDcuMSBJbnN0YW5jZSBNZXRob2RzOiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIGFuIGluc3RhbmNlIG1ldGhvZApAQCAtOTM1MSw3ICs5MzkxLDggQEAKICAgc3RhdGljIGNvbnN0IFN0YXRpY1dhcm5pbmdDb2RlIElOVkFMSURfVVNFX09GX05VTExfVkFMVUUgPSBTdGF0aWNXYXJuaW5nQ29kZSgKICAgICAgICdJTlZBTElEX1VTRV9PRl9OVUxMX1ZBTFVFJywKICAgICAgICJBbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGFsd2F5cyAnbnVsbCcgY2FuJ3QgYmUgZGVyZWZlcmVuY2VkLiIsCi0gICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNoYW5naW5nIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uLiIpOworICAgICAgY29ycmVjdGlvbjogIlRyeSBjaGFuZ2luZyB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4iLAorICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIFBhcmFtZXRlcnM6CkBAIC05NDg1LDcgKzk1MjYsNyBAQAogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBzd2l0Y2ggc3RhdGVtZW50IGZvciBhbiBlbnVtCisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGBzd2l0Y2hgIHN0YXRlbWVudCBmb3IgYW4gZW51bQogICAvLyBkb2Vzbid0IGluY2x1ZGUgYW4gb3B0aW9uIGZvciBvbmUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZW51bWVyYXRpb24uCiAgIC8vCiAgIC8vIE5vdGUgdGhhdCBgbnVsbGAgaXMgYWx3YXlzIGEgcG9zc2libGUgdmFsdWUgZm9yIGFuIGVudW0gYW5kIHRoZXJlZm9yZSBhbHNvCkBAIC05NTA5LDggKzk1NTAsOCBAQAogICAvLwogICAvLyAjIyMjIENvbW1vbiBmaXhlcwogICAvLwotICAvLyBJZiB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBtaXNzaW5nIHZhbHVlcywgdGhlbiBhZGQgYSBjYXNlIGNsYXVzZQotICAvLyBmb3IgZWFjaCBvZiB0aGUgbWlzc2luZyB2YWx1ZXM6CisgIC8vIElmIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIG1pc3NpbmcgdmFsdWVzLCB0aGVuIGFkZCBhIGBjYXNlYAorICAvLyBjbGF1c2UgZm9yIGVhY2ggb2YgdGhlIG1pc3NpbmcgdmFsdWVzOgogICAvLwogICAvLyBgYGBkYXJ0CiAgIC8vIGVudW0gRSB7IGUxLCBlMiB9CkBAIC05NTI1LDcgKzk1NjYsNyBAQAogICAvLyB9CiAgIC8vIGBgYAogICAvLwotICAvLyBJZiB0aGUgbWlzc2luZyB2YWx1ZXMgc2hvdWxkIGJlIGhhbmRsZWQgdGhlIHNhbWUgd2F5LCB0aGVuIGFkZCBhIGRlZmF1bHQKKyAgLy8gSWYgdGhlIG1pc3NpbmcgdmFsdWVzIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIHdheSwgdGhlbiBhZGQgYSBgZGVmYXVsdGAKICAgLy8gY2xhdXNlOgogICAvLwogICAvLyBgYGBkYXJ0CkBAIC05NTY4LDEwICs5NjA5LDExIEBACiAgICAqIFBhcmFtZXRlcnM6CiAgICAqIDA6IHRoZSBuYW1lIG9mIHRoZSBub24tdHlwZSBlbGVtZW50CiAgICAqLwotICBzdGF0aWMgY29uc3QgU3RhdGljV2FybmluZ0NvZGUgTkVXX1dJVEhfTk9OX1RZUEUgPSBTdGF0aWNXYXJuaW5nQ29kZSgKLSAgICAgICdORVdfV0lUSF9OT05fVFlQRScsICJUaGUgbmFtZSAnezB9JyBpc24ndCBhIGNsYXNzLiIsCi0gICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgY2xhc3MuIiwKLSAgICAgIGlzVW5yZXNvbHZlZElkZW50aWZpZXI6IHRydWUpOworICBzdGF0aWMgY29uc3QgU3RhdGljV2FybmluZ0NvZGUgTkVXX1dJVEhfTk9OX1RZUEUgPQorICAgICAgU3RhdGljV2FybmluZ0NvZGVXaXRoVW5pcXVlTmFtZSgnQ1JFQVRJT05fV0lUSF9OT05fVFlQRScsCisgICAgICAgICAgJ05FV19XSVRIX05PTl9UWVBFJywgIlRoZSBuYW1lICd7MH0nIGlzbid0IGEgY2xhc3MuIiwKKyAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNvcnJlY3RpbmcgdGhlIG5hbWUgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgY2xhc3MuIiwKKyAgICAgICAgICBpc1VucmVzb2x2ZWRJZGVudGlmaWVyOiB0cnVlKTsKIAogICAvKioKICAgICogMTIuMTEuMSBOZXc6IElmIDxpPlQ8L2k+IGlzIGEgY2xhc3Mgb3IgcGFyYW1ldGVyaXplZCB0eXBlIGFjY2Vzc2libGUgaW4gdGhlCkBAIC05NzkyLDcgKzk4MzQsNyBAQAogICAvLyAjIyMjIERlc2NyaXB0aW9uCiAgIC8vCiAgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgaWRlbnRpZmllciBmb2xsb3dpbmcgdGhlCi0gIC8vIGBvbmAgaW4gYSBjYXRjaCBjbGF1c2UgaXMgZGVmaW5lZCB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIHR5cGUuCisgIC8vIGBvbmAgaW4gYSBgY2F0Y2hgIGNsYXVzZSBpcyBkZWZpbmVkIHRvIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgdHlwZS4KICAgLy8KICAgLy8gIyMjIyBFeGFtcGxlcwogICAvLwpAQCAtOTkxOCw3ICs5OTYwLDggQEAKICAgICAgICdQQVJUX09GX0RJRkZFUkVOVF9MSUJSQVJZJywKICAgICAgICJFeHBlY3RlZCB0aGlzIGxpYnJhcnkgdG8gYmUgcGFydCBvZiAnezB9Jywgbm90ICd7MX0nLiIsCiAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGluY2x1ZGluZyBhIGRpZmZlcmVudCBwYXJ0LCBvciBjaGFuZ2luZyB0aGUgbmFtZSBvZiAiCi0gICAgICAgICAgInRoZSBsaWJyYXJ5IGluIHRoZSBwYXJ0J3MgcGFydC1vZiBkaXJlY3RpdmUuIik7CisgICAgICAgICAgInRoZSBsaWJyYXJ5IGluIHRoZSBwYXJ0J3MgcGFydC1vZiBkaXJlY3RpdmUuIiwKKyAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiBQYXJhbWV0ZXJzOgpAQCAtMTAwNzUsNyArMTAxMTgsNyBAQAogICAgKi8KICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwotICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gaXQgZmluZHMgYSByZXR1cm4gc3RhdGVtZW50CisgIC8vIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBpdCBmaW5kcyBhIGByZXR1cm5gIHN0YXRlbWVudAogICAvLyB3aXRob3V0IGFuIGV4cHJlc3Npb24gaW4gYSBmdW5jdGlvbiB0aGF0IGRlY2xhcmVzIGEgcmV0dXJuIHR5cGUuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZXMKQEAgLTEwMTc2LDggKzEwMjE5LDggQEAKICAgLy8gIyMjIyBEZXNjcmlwdGlvbgogICAvLwogICAvLyBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gaW4gYQotICAvLyBzd2l0Y2ggc3RhdGVtZW50IGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb25zIGluIHRoZQotICAvLyBjYXNlIGNsYXVzZXMuCisgIC8vIGBzd2l0Y2hgIHN0YXRlbWVudCBpc24ndCBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9ucyBpbiB0aGUKKyAgLy8gYGNhc2VgIGNsYXVzZXMuCiAgIC8vCiAgIC8vICMjIyMgRXhhbXBsZQogICAvLwpAQCAtMTAxOTUsOCArMTAyMzgsOCBAQAogICAvLwogICAvLyAjIyMjIENvbW1vbiBmaXhlcwogICAvLwotICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgY2FzZSBleHByZXNzaW9ucyBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgZXhwcmVzc2lvbgotICAvLyBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudCB0byBoYXZlIHRoZSBjb3JyZWN0IHR5cGU6CisgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBgY2FzZWAgZXhwcmVzc2lvbnMgaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlCisgIC8vIGV4cHJlc3Npb24gaW4gdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCB0byBoYXZlIHRoZSBjb3JyZWN0IHR5cGU6CiAgIC8vCiAgIC8vIGBgYGRhcnQKICAgLy8gdm9pZCBmKFN0cmluZyBzKSB7CkBAIC0xMDIwNyw3ICsxMDI1MCw3IEBACiAgIC8vIH0KICAgLy8gYGBgCiAgIC8vCi0gIC8vIElmIHRoZSB0eXBlIG9mIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgY2FzZQorICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgYHN3aXRjaGAgZXhwcmVzc2lvbiBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgYGNhc2VgCiAgIC8vIGV4cHJlc3Npb25zIHRvIGhhdmUgdGhlIGNvcnJlY3QgdHlwZToKICAgLy8KICAgLy8gYGBgZGFydApAQCAtMTAyMjIsNyArMTAyNjUsOCBAQAogICAgICAgU3RhdGljV2FybmluZ0NvZGUoCiAgICAgICAgICAgJ1NXSVRDSF9FWFBSRVNTSU9OX05PVF9BU1NJR05BQkxFJywKICAgICAgICAgICAiVHlwZSAnezB9JyBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24gaXNuJ3QgYXNzaWduYWJsZSB0byAiCi0gICAgICAgICAgICAgICJ0aGUgdHlwZSAnezF9JyBvZiBjYXNlIGV4cHJlc3Npb25zLiIpOworICAgICAgICAgICAgICAidGhlIHR5cGUgJ3sxfScgb2YgY2FzZSBleHByZXNzaW9ucy4iLAorICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIC8qKgogICAgKiAxNS4xIFN0YXRpYyBUeXBlczogSXQgaXMgYSBzdGF0aWMgd2FybmluZyB0byB1c2UgYSBkZWZlcnJlZCB0eXBlIGluIGEgdHlwZQpAQCAtMTAzODgsNyArMTA0MzIsOCBAQAogICAgICAgIlVuZGVmaW5lZCBuYW1lICdhd2FpdCcgaW4gZnVuY3Rpb24gYm9keSBub3QgbWFya2VkIHdpdGggJ2FzeW5jJy4iLAogICAgICAgY29ycmVjdGlvbjogIlRyeSBjb3JyZWN0aW5nIHRoZSBuYW1lIHRvIG9uZSB0aGF0IGlzIGRlZmluZWQsICIKICAgICAgICAgICAiZGVmaW5pbmcgdGhlIG5hbWUsIG9yICIKLSAgICAgICAgICAiYWRkaW5nICdhc3luYycgdG8gdGhlIGVuY2xvc2luZyBmdW5jdGlvbiBib2R5LiIpOworICAgICAgICAgICJhZGRpbmcgJ2FzeW5jJyB0byB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIGJvZHkuIiwKKyAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IHRydWUpOwogCiAgIEBEZXByZWNhdGVkKCdVc2UgQ29tcGlsZVRpbWVFcnJvckNvZGUuVU5ERUZJTkVEX05BTUVEX1BBUkFNRVRFUicpCiAgIHN0YXRpYyBjb25zdCBDb21waWxlVGltZUVycm9yQ29kZSBVTkRFRklORURfTkFNRURfUEFSQU1FVEVSID0KQEAgLTEwNDYzLDcgKzEwNTA4LDggQEAKICAgICAgICAgICAgICAgIml0IGNhbiBiZSBkZXJlZmVyZW5jZWQuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOgogICAgICAgICAgICAgICAiVHJ5IGNoZWNraW5nIHRoYXQgdGhlIHZhbHVlIGlzbid0ICdudWxsJyBiZWZvcmUgZGVyZWZlcmVuY2luZyAiCi0gICAgICAgICAgICAgICJpdC4iKTsKKyAgICAgICAgICAgICAgIml0LiIsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIE5vIHBhcmFtZXRlcnMuCkBAIC0xMDUwMCw3ICsxMDU0Niw4IEBACiAgICAgICAgICAgIlRoZSAnIScgd2lsbCBoYXZlIG5vIGVmZmVjdCBiZWNhdXNlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBjYW4ndCBiZSIKICAgICAgICAgICAgICAgIiBudWxsLiIsCiAgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyB0aGUgJyEnIG9wZXJhdG9yLiIsCi0gICAgICAgICAgZXJyb3JTZXZlcml0eTogRXJyb3JTZXZlcml0eS5XQVJOSU5HKTsKKyAgICAgICAgICBlcnJvclNldmVyaXR5OiBFcnJvclNldmVyaXR5LldBUk5JTkcsCisgICAgICAgICAgaGFzUHVibGlzaGVkRG9jczogdHJ1ZSk7CiAKICAgLyoqCiAgICAqIE5vIHBhcmFtZXRlcnMuCkBAIC0xMDU2Nyw5ICsxMDYxNCwxMyBAQAogCiAgIGNvbnN0IFN0YXRpY1dhcm5pbmdDb2RlV2l0aFVuaXF1ZU5hbWUoCiAgICAgICBTdHJpbmcgbmFtZSwgdGhpcy51bmlxdWVOYW1lLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIHtTdHJpbmcgY29ycmVjdGlvbiwgYm9vbCBoYXNQdWJsaXNoZWREb2NzfSkKKyAgICAgIHtTdHJpbmcgY29ycmVjdGlvbiwKKyAgICAgIGJvb2wgaGFzUHVibGlzaGVkRG9jcywKKyAgICAgIGJvb2wgaXNVbnJlc29sdmVkSWRlbnRpZmllciA9IGZhbHNlfSkKICAgICAgIDogc3VwZXIobmFtZSwgbWVzc2FnZSwKLSAgICAgICAgICAgIGNvcnJlY3Rpb246IGNvcnJlY3Rpb24sIGhhc1B1Ymxpc2hlZERvY3M6IGhhc1B1Ymxpc2hlZERvY3MpOworICAgICAgICAgICAgY29ycmVjdGlvbjogY29ycmVjdGlvbiwKKyAgICAgICAgICAgIGhhc1B1Ymxpc2hlZERvY3M6IGhhc1B1Ymxpc2hlZERvY3MsCisgICAgICAgICAgICBpc1VucmVzb2x2ZWRJZGVudGlmaWVyOiBpc1VucmVzb2x2ZWRJZGVudGlmaWVyKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9jb25zdHJ1Y3Rvcl9maWVsZHNfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvbnN0cnVjdG9yX2ZpZWxkc192ZXJpZmllci5kYXJ0CmluZGV4IDNhZDM4ODMuLmQyZWU0NmEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvbnN0cnVjdG9yX2ZpZWxkc192ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvbnN0cnVjdG9yX2ZpZWxkc192ZXJpZmllci5kYXJ0CkBAIC02LDggKzYsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2xpc3RlbmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogLy8vIFZlcmlmaWVyIGZvciBpbml0aWFsaXppbmcgZmllbGRzIGluIGNvbnN0cnVjdG9ycy4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvcnJlY3Rfb3ZlcnJpZGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2NvcnJlY3Rfb3ZlcnJpZGUuZGFydAppbmRleCAzODRjMWM3Li4wNTEyYmFjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9jb3JyZWN0X292ZXJyaWRlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvY29ycmVjdF9vdmVycmlkZS5kYXJ0CkBAIC0xMiw5ICsxMiw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9leHRlbnNpb25zLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIGNsYXNzIENvcnJlY3RPdmVycmlkZUhlbHBlciB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9kZWFkX2NvZGVfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2RlYWRfY29kZV92ZXJpZmllci5kYXJ0CmluZGV4IGZlYTQ3ZGMuLjRlNWNlYmUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2RlYWRfY29kZV92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2RlYWRfY29kZV92ZXJpZmllci5kYXJ0CkBAIC0xMCwxMyArMTAsMTIgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9saXN0ZW5lci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zb3VyY2Uvc291cmNlX3JhbmdlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZXhpdF9kZXRlY3Rvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9mbG93X2FuYWx5c2lzX3Zpc2l0b3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvY29uc3RhbnQuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogCiB0eXBlZGVmIF9DYXRjaENsYXVzZXNWZXJpZmllclJlcG9ydGVyID0gdm9pZCBGdW5jdGlvbigKICAgQ2F0Y2hDbGF1c2UgZmlyc3QsCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9kdXBsaWNhdGVfZGVmaW5pdGlvbl92ZXJpZmllci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvZHVwbGljYXRlX2RlZmluaXRpb25fdmVyaWZpZXIuZGFydAppbmRleCA5Y2FiZWI3Li5lOTBlNWRlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9kdXBsaWNhdGVfZGVmaW5pdGlvbl92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2R1cGxpY2F0ZV9kZWZpbml0aW9uX3ZlcmlmaWVyLmRhcnQKQEAgLTE0Nyw5ICsxNDcsNyBAQAogICAgIF9jaGVja0NsYXNzTWVtYmVycyhub2RlLmRlY2xhcmVkRWxlbWVudCwgbm9kZS5tZW1iZXJzKTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGFsbCBvZiB0aGUgcGFyYW1ldGVycyBoYXZlIHVuaXF1ZSBuYW1lcy4KLSAgICovCisgIC8vLyBDaGVjayB0aGF0IGFsbCBvZiB0aGUgcGFyYW1ldGVycyBoYXZlIHVuaXF1ZSBuYW1lcy4KICAgdm9pZCBjaGVja1BhcmFtZXRlcnMoRm9ybWFsUGFyYW1ldGVyTGlzdCBub2RlKSB7CiAgICAgTWFwPFN0cmluZywgRWxlbWVudD4gZGVmaW5lZE5hbWVzID0gSGFzaE1hcDxTdHJpbmcsIEVsZW1lbnQ+KCk7CiAgICAgZm9yIChGb3JtYWxQYXJhbWV0ZXIgcGFyYW1ldGVyIGluIG5vZGUucGFyYW1ldGVycykgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvZ2V0dGVyX3NldHRlcl90eXBlc192ZXJpZmllci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvZ2V0dGVyX3NldHRlcl90eXBlc192ZXJpZmllci5kYXJ0CmluZGV4IGMyMTA0MGIuLjM4NjZlZjkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2dldHRlcl9zZXR0ZXJfdHlwZXNfdmVyaWZpZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9nZXR0ZXJfc2V0dGVyX3R5cGVzX3ZlcmlmaWVyLmRhcnQKQEAgLTgsOCArOCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvZXJyb3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogLy8vIFZlcmlmaWVzIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBnZXR0ZXIgbWF0Y2hlcyB0aGUgcGFyYW1ldGVyIHR5cGUKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2luaGVyaXRhbmNlX292ZXJyaWRlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9pbmhlcml0YW5jZV9vdmVycmlkZS5kYXJ0CmluZGV4IGY3YTkzMGEuLjg3ODY3OTEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2luaGVyaXRhbmNlX292ZXJyaWRlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvaW5oZXJpdGFuY2Vfb3ZlcnJpZGUuZGFydApAQCAtMTMsMTEgKzEzLDEwIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvaW5oZXJpdGFuY2VfbWFuYWdlcjMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb3JyZWN0X292ZXJyaWRlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9nZXR0ZXJfc2V0dGVyX3R5cGVzX3ZlcmlmaWVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2lkbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL2xpdGVyYWxfZWxlbWVudF92ZXJpZmllci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvbGl0ZXJhbF9lbGVtZW50X3ZlcmlmaWVyLmRhcnQKaW5kZXggZmNmNjk3Ny4uZTMwOThiMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvbGl0ZXJhbF9lbGVtZW50X3ZlcmlmaWVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvbGl0ZXJhbF9lbGVtZW50X3ZlcmlmaWVyLmRhcnQKQEAgLTgsOCArOCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIAogLy8vIFZlcmlmaWVyIGZvciBbQ29sbGVjdGlvbkVsZW1lbnRdcyBpbiBsaXN0LCBzZXQsIG9yIG1hcCBsaXRlcmFscy4KIGNsYXNzIExpdGVyYWxFbGVtZW50VmVyaWZpZXIgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvbnVsbGFibGVfZGVyZWZlcmVuY2VfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL251bGxhYmxlX2RlcmVmZXJlbmNlX3ZlcmlmaWVyLmRhcnQKaW5kZXggMmU2OWUzNi4uY2YwYThhZTYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL251bGxhYmxlX2RlcmVmZXJlbmNlX3ZlcmlmaWVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvbnVsbGFibGVfZGVyZWZlcmVuY2VfdmVyaWZpZXIuZGFydApAQCAtNiw4ICs2LDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9saXN0ZW5lci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIC8vLyBIZWxwZXIgZm9yIGNoZWNraW5nIHBvdGVudGlhbGx5IG51bGxhYmxlIGRlcmVmZXJlbmNlcy4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL292ZXJyaWRlX3ZlcmlmaWVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9vdmVycmlkZV92ZXJpZmllci5kYXJ0CmluZGV4IDkxYzc5NjguLmNmMThhNTUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL292ZXJyaWRlX3ZlcmlmaWVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3Ivb3ZlcnJpZGVfdmVyaWZpZXIuZGFydApAQCAtMTIsNyArMTIsNyBAQAogLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYE92ZXJyaWRlVmVyaWZpZXJgIHZpc2l0IGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIGEKIC8vLyBjb21waWxhdGlvbiB1bml0IHRvIHZlcmlmeSB0aGF0IGlmIHRoZXkgaGF2ZSBhbiBvdmVycmlkZSBhbm5vdGF0aW9uIGl0IGlzCiAvLy8gYmVpbmcgdXNlZCBjb3JyZWN0bHkuCi1jbGFzcyBPdmVycmlkZVZlcmlmaWVyIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvciB7CitjbGFzcyBPdmVycmlkZVZlcmlmaWVyIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvcjx2b2lkPiB7CiAgIC8vLyBUaGUgaW5oZXJpdGFuY2UgbWFuYWdlciB1c2VkIHRvIGZpbmQgb3ZlcnJpZGRlbiBtZXRob2RzLgogICBmaW5hbCBJbmhlcml0YW5jZU1hbmFnZXIzIF9pbmhlcml0YW5jZTsKIApAQCAtMzAsMTQgKzMwLDE0IEBACiAgICAgICA6IF9saWJyYXJ5VXJpID0gbGlicmFyeS5zb3VyY2UudXJpOwogCiAgIEBvdmVycmlkZQotICB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKENsYXNzRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9jdXJyZW50Q2xhc3MgPSBub2RlLmRlY2xhcmVkRWxlbWVudDsKICAgICBzdXBlci52aXNpdENsYXNzRGVjbGFyYXRpb24obm9kZSk7CiAgICAgX2N1cnJlbnRDbGFzcyA9IG51bGw7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGaWVsZERlY2xhcmF0aW9uKEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0RmllbGREZWNsYXJhdGlvbihGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb24gZmllbGQgaW4gbm9kZS5maWVsZHMudmFyaWFibGVzKSB7CiAgICAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gZmllbGQuZGVjbGFyZWRFbGVtZW50OwogICAgICAgaWYgKGZpZWxkRWxlbWVudC5oYXNPdmVycmlkZSkgewpAQCAtNTYsNyArNTYsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0TWV0aG9kRGVjbGFyYXRpb24oTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0TWV0aG9kRGVjbGFyYXRpb24oTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewogICAgIEV4ZWN1dGFibGVFbGVtZW50IGVsZW1lbnQgPSBub2RlLmRlY2xhcmVkRWxlbWVudDsKICAgICBpZiAoZWxlbWVudC5oYXNPdmVycmlkZSAmJiAhX2lzT3ZlcnJpZGUoZWxlbWVudCkpIHsKICAgICAgIGlmIChlbGVtZW50IGlzIE1ldGhvZEVsZW1lbnQpIHsKQEAgLTgxLDcgKzgxLDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdE1peGluRGVjbGFyYXRpb24oTWl4aW5EZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNaXhpbkRlY2xhcmF0aW9uKE1peGluRGVjbGFyYXRpb24gbm9kZSkgewogICAgIF9jdXJyZW50Q2xhc3MgPSBub2RlLmRlY2xhcmVkRWxlbWVudDsKICAgICBzdXBlci52aXNpdE1peGluRGVjbGFyYXRpb24obm9kZSk7CiAgICAgX2N1cnJlbnRDbGFzcyA9IG51bGw7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9yZXR1cm5fdHlwZV92ZXJpZmllci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvcmV0dXJuX3R5cGVfdmVyaWZpZXIuZGFydAppbmRleCA5ZjkyMThjLi5lY2E0ZmQwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci9yZXR1cm5fdHlwZV92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL3JldHVybl90eXBlX3ZlcmlmaWVyLmRhcnQKQEAgLTksOSArOSw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2Vycm9yX3ZlcmlmaWVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBjbGFzcyBSZXR1cm5UeXBlVmVyaWZpZXIgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvdHlwZV9hcmd1bWVudHNfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2Vycm9yL3R5cGVfYXJndW1lbnRzX3ZlcmlmaWVyLmRhcnQKaW5kZXggMzYzNTQzYS4uZWQzZjU3NyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvdHlwZV9hcmd1bWVudHNfdmVyaWZpZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci90eXBlX2FyZ3VtZW50c192ZXJpZmllci5kYXJ0CkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9hbGdlYnJhLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWEuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCcgc2hvdyBBbmFseXNpc09wdGlvbnNJbXBsOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CkBAIC0xOTAsMTAgKzE5MSw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSB0eXBlIGFyZ3VtZW50cyBpbiB0aGUgZ2l2ZW4gW3R5cGVOYW1lXSBhcmUgYWxsIHdpdGhpbgotICAgKiB0aGVpciBib3VuZHMuCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIHR5cGUgYXJndW1lbnRzIGluIHRoZSBnaXZlbiBbdHlwZU5hbWVdIGFyZSBhbGwgd2l0aGluCisgIC8vLyB0aGVpciBib3VuZHMuCiAgIHZvaWQgX2NoZWNrRm9yVHlwZUFyZ3VtZW50Tm90TWF0Y2hpbmdCb3VuZHMoVHlwZU5hbWUgdHlwZU5hbWUpIHsKICAgICB2YXIgZWxlbWVudCA9IHR5cGVOYW1lLm5hbWUuc3RhdGljRWxlbWVudDsKICAgICB2YXIgdHlwZSA9IHR5cGVOYW1lLnR5cGU7CkBAIC0yNTUsMTIgKzI1NCwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGxpc3Qgb2YgdHlwZSBbYXJndW1lbnRzXSBkb2VzIG5vdCBoYXZlIGEKLSAgICogdHlwZSBwYXJhbWV0ZXIgYXMgYSB0eXBlIGFyZ3VtZW50LiBUaGUgW2Vycm9yQ29kZV0gaXMgZWl0aGVyCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5JTlZBTElEX1RZUEVfQVJHVU1FTlRfSU5fQ09OU1RfTElTVF0gb3IKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklOVkFMSURfVFlQRV9BUkdVTUVOVF9JTl9DT05TVF9NQVBdLgotICAgKi8KKyAgLy8vIENoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gbGlzdCBvZiB0eXBlIFthcmd1bWVudHNdIGRvZXMgbm90IGhhdmUgYQorICAvLy8gdHlwZSBwYXJhbWV0ZXIgYXMgYSB0eXBlIGFyZ3VtZW50LiBUaGUgW2Vycm9yQ29kZV0gaXMgZWl0aGVyCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU5WQUxJRF9UWVBFX0FSR1VNRU5UX0lOX0NPTlNUX0xJU1RdIG9yCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU5WQUxJRF9UWVBFX0FSR1VNRU5UX0lOX0NPTlNUX01BUF0uCiAgIHZvaWQgX2NoZWNrVHlwZUFyZ3VtZW50Q29uc3QoCiAgICAgICBOb2RlTGlzdDxUeXBlQW5ub3RhdGlvbj4gYXJndW1lbnRzLCBFcnJvckNvZGUgZXJyb3JDb2RlKSB7CiAgICAgZm9yIChUeXBlQW5ub3RhdGlvbiB0eXBlIGluIGFyZ3VtZW50cykgewpAQCAtMjg4LDEwICsyODUsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW3R5cGVBcmd1bWVudHNdIGFyZSBhbGwgd2l0aGluIHRoZWlyIGJvdW5kcywgYXMKLSAgICogZGVmaW5lZCBieSB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbdHlwZUFyZ3VtZW50c10gYXJlIGFsbCB3aXRoaW4gdGhlaXIgYm91bmRzLCBhcworICAvLy8gZGVmaW5lZCBieSB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgogICB2b2lkIF9jaGVja1R5cGVBcmd1bWVudHMoSW52b2NhdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgIE5vZGVMaXN0PFR5cGVBbm5vdGF0aW9uPiB0eXBlQXJndW1lbnRMaXN0ID0gbm9kZS50eXBlQXJndW1lbnRzPy5hcmd1bWVudHM7CiAgICAgaWYgKHR5cGVBcmd1bWVudExpc3QgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZXJyb3IvdW51c2VkX2xvY2FsX2VsZW1lbnRzX3ZlcmlmaWVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci91bnVzZWRfbG9jYWxfZWxlbWVudHNfdmVyaWZpZXIuZGFydAppbmRleCBhZDI1MTY0Li5hNzEzYzFlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci91bnVzZWRfbG9jYWxfZWxlbWVudHNfdmVyaWZpZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9lcnJvci91bnVzZWRfbG9jYWxfZWxlbWVudHNfdmVyaWZpZXIuZGFydApAQCAtMTUsNyArMTUsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIAogLy8vIEFuIFtBc3RWaXNpdG9yXSB0aGF0IGZpbGxzIFtVc2VkTG9jYWxFbGVtZW50c10uCi1jbGFzcyBHYXRoZXJVc2VkTG9jYWxFbGVtZW50c1Zpc2l0b3IgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yIHsKK2NsYXNzIEdhdGhlclVzZWRMb2NhbEVsZW1lbnRzVmlzaXRvciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3I8dm9pZD4gewogICBmaW5hbCBVc2VkTG9jYWxFbGVtZW50cyB1c2VkRWxlbWVudHMgPSBVc2VkTG9jYWxFbGVtZW50cygpOwogCiAgIGZpbmFsIExpYnJhcnlFbGVtZW50IF9lbmNsb3NpbmdMaWJyYXJ5OwpAQCAtMjUsNyArMjUsNyBAQAogICBHYXRoZXJVc2VkTG9jYWxFbGVtZW50c1Zpc2l0b3IodGhpcy5fZW5jbG9zaW5nTGlicmFyeSk7CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24oQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSkgeworICB2b2lkIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24oQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSkgewogICAgIHZhciBlbGVtZW50ID0gbm9kZS5zdGF0aWNFbGVtZW50OwogICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKICAgICAgIHVzZWRFbGVtZW50cy5tZW1iZXJzLmFkZChlbGVtZW50KTsKQEAgLTM0LDE0ICszNCwxNCBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgdmFyIGVsZW1lbnQgPSBub2RlLnN0YXRpY0VsZW1lbnQ7CiAgICAgdXNlZEVsZW1lbnRzLm1lbWJlcnMuYWRkKGVsZW1lbnQpOwogICAgIHN1cGVyLnZpc2l0QmluYXJ5RXhwcmVzc2lvbihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENhdGNoQ2xhdXNlKENhdGNoQ2xhdXNlIG5vZGUpIHsKKyAgdm9pZCB2aXNpdENhdGNoQ2xhdXNlKENhdGNoQ2xhdXNlIG5vZGUpIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIGV4Y2VwdGlvblBhcmFtZXRlciA9IG5vZGUuZXhjZXB0aW9uUGFyYW1ldGVyOwogICAgIFNpbXBsZUlkZW50aWZpZXIgc3RhY2tUcmFjZVBhcmFtZXRlciA9IG5vZGUuc3RhY2tUcmFjZVBhcmFtZXRlcjsKICAgICBpZiAoZXhjZXB0aW9uUGFyYW1ldGVyICE9IG51bGwpIHsKQEAgLTU5LDcgKzU5LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKENsYXNzRGVjbGFyYXRpb24gbm9kZSkgewogICAgIENsYXNzRWxlbWVudCBlbmNsb3NpbmdDbGFzc09sZCA9IF9lbmNsb3NpbmdDbGFzczsKICAgICB0cnkgewogICAgICAgX2VuY2xvc2luZ0NsYXNzID0gbm9kZS5kZWNsYXJlZEVsZW1lbnQ7CkBAIC03MCw3ICs3MCw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBFeGVjdXRhYmxlRWxlbWVudCBlbmNsb3NpbmdFeGVjT2xkID0gX2VuY2xvc2luZ0V4ZWM7CiAgICAgdHJ5IHsKICAgICAgIF9lbmNsb3NpbmdFeGVjID0gbm9kZS5kZWNsYXJlZEVsZW1lbnQ7CkBAIC04MSw3ICs4MSw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgIGlmIChub2RlLnBhcmVudCBpcyEgRnVuY3Rpb25EZWNsYXJhdGlvbikgewogICAgICAgdXNlZEVsZW1lbnRzLmFkZEVsZW1lbnQobm9kZS5kZWNsYXJlZEVsZW1lbnQpOwogICAgIH0KQEAgLTg5LDE0ICs4OSwxNCBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0SW5kZXhFeHByZXNzaW9uKEluZGV4RXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRJbmRleEV4cHJlc3Npb24oSW5kZXhFeHByZXNzaW9uIG5vZGUpIHsKICAgICB2YXIgZWxlbWVudCA9IG5vZGUuc3RhdGljRWxlbWVudDsKICAgICB1c2VkRWxlbWVudHMubWVtYmVycy5hZGQoZWxlbWVudCk7CiAgICAgc3VwZXIudmlzaXRJbmRleEV4cHJlc3Npb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgRXhlY3V0YWJsZUVsZW1lbnQgZW5jbG9zaW5nRXhlY09sZCA9IF9lbmNsb3NpbmdFeGVjOwogICAgIHRyeSB7CiAgICAgICBfZW5jbG9zaW5nRXhlYyA9IG5vZGUuZGVjbGFyZWRFbGVtZW50OwpAQCAtMTA3LDIxICsxMDcsMjEgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdFBvc3RmaXhFeHByZXNzaW9uKFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFBvc3RmaXhFeHByZXNzaW9uKFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKICAgICB2YXIgZWxlbWVudCA9IG5vZGUuc3RhdGljRWxlbWVudDsKICAgICB1c2VkRWxlbWVudHMubWVtYmVycy5hZGQoZWxlbWVudCk7CiAgICAgc3VwZXIudmlzaXRQb3N0Zml4RXhwcmVzc2lvbihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdFByZWZpeEV4cHJlc3Npb24oUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRQcmVmaXhFeHByZXNzaW9uKFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewogICAgIHZhciBlbGVtZW50ID0gbm9kZS5zdGF0aWNFbGVtZW50OwogICAgIHVzZWRFbGVtZW50cy5tZW1iZXJzLmFkZChlbGVtZW50KTsKICAgICBzdXBlci52aXNpdFByZWZpeEV4cHJlc3Npb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRTaW1wbGVJZGVudGlmaWVyKFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgeworICB2b2lkIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKICAgICBpZiAobm9kZS5pbkRlY2xhcmF0aW9uQ29udGV4dCgpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjUwLDcgKzI1MCw3IEBACiAvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBbVW51c2VkTG9jYWxFbGVtZW50c1ZlcmlmaWVyXSB0cmF2ZXJzZSBhbiBBU1QKIC8vLyBsb29raW5nIGZvciBjYXNlcyBvZiBbSGludENvZGUuVU5VU0VEX0VMRU1FTlRdLCBbSGludENvZGUuVU5VU0VEX0ZJRUxEXSwKIC8vLyBbSGludENvZGUuVU5VU0VEX0xPQ0FMX1ZBUklBQkxFXSwgZXRjLgotY2xhc3MgVW51c2VkTG9jYWxFbGVtZW50c1ZlcmlmaWVyIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvciB7CitjbGFzcyBVbnVzZWRMb2NhbEVsZW1lbnRzVmVyaWZpZXIgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yPHZvaWQ+IHsKICAgLy8vIFRoZSBlcnJvciBsaXN0ZW5lciB0byB3aGljaCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KICAgZmluYWwgQW5hbHlzaXNFcnJvckxpc3RlbmVyIF9lcnJvckxpc3RlbmVyOwogCkBAIC0yNjksNyArMjY5LDcgQEAKICAgICAgIDogX2xpYnJhcnlVcmkgPSBsaWJyYXJ5LnNvdXJjZS51cmk7CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgaWYgKG5vZGUuaW5EZWNsYXJhdGlvbkNvbnRleHQoKSkgewogICAgICAgdmFyIGVsZW1lbnQgPSBub2RlLnN0YXRpY0VsZW1lbnQ7CiAgICAgICBpZiAoZWxlbWVudCBpcyBDbGFzc0VsZW1lbnQpIHsKQEAgLTQxNSwxNCArNDE1LDE0IEBACiAgICAgfQogICB9CiAKLSAgX3Zpc2l0Q2xhc3NFbGVtZW50KENsYXNzRWxlbWVudCBlbGVtZW50KSB7CisgIHZvaWQgX3Zpc2l0Q2xhc3NFbGVtZW50KENsYXNzRWxlbWVudCBlbGVtZW50KSB7CiAgICAgaWYgKCFfaXNVc2VkRWxlbWVudChlbGVtZW50KSkgewogICAgICAgX3JlcG9ydEVycm9yRm9yRWxlbWVudCgKICAgICAgICAgICBIaW50Q29kZS5VTlVTRURfRUxFTUVOVCwgZWxlbWVudCwgW2VsZW1lbnQuZGlzcGxheU5hbWVdKTsKICAgICB9CiAgIH0KIAotICBfdmlzaXRDb25zdHJ1Y3RvckVsZW1lbnQoQ29uc3RydWN0b3JFbGVtZW50IGVsZW1lbnQpIHsKKyAgdm9pZCBfdmlzaXRDb25zdHJ1Y3RvckVsZW1lbnQoQ29uc3RydWN0b3JFbGVtZW50IGVsZW1lbnQpIHsKICAgICAvLyBPbmx5IGNvbXBsYWluIGFib3V0IGFuIHVudXNlZCBjb25zdHJ1Y3RvciBpZiBpdCBpcyBub3QgdGhlIG9ubHkKICAgICAvLyBjb25zdHJ1Y3RvciBpbiB0aGUgY2xhc3MuIEEgc2luZ2xlIHVudXNlZCwgcHJpdmF0ZSBjb25zdHJ1Y3RvciBtYXkgc2VydmUKICAgICAvLyB0aGUgcHVycG9zZSBvZiBwcmV2ZW50aW5nIHRoZSBjbGFzcyBmcm9tIGJlaW5nIGV4dGVuZGVkLiBJbiBzZXJ2aW5nIHRoaXMKQEAgLTQzNCwyOCArNDM0LDI4IEBACiAgICAgfQogICB9CiAKLSAgX3Zpc2l0RmllbGRFbGVtZW50KEZpZWxkRWxlbWVudCBlbGVtZW50KSB7CisgIHZvaWQgX3Zpc2l0RmllbGRFbGVtZW50KEZpZWxkRWxlbWVudCBlbGVtZW50KSB7CiAgICAgaWYgKCFfaXNSZWFkTWVtYmVyKGVsZW1lbnQpKSB7CiAgICAgICBfcmVwb3J0RXJyb3JGb3JFbGVtZW50KAogICAgICAgICAgIEhpbnRDb2RlLlVOVVNFRF9GSUVMRCwgZWxlbWVudCwgW2VsZW1lbnQuZGlzcGxheU5hbWVdKTsKICAgICB9CiAgIH0KIAotICBfdmlzaXRGdW5jdGlvbkVsZW1lbnQoRnVuY3Rpb25FbGVtZW50IGVsZW1lbnQpIHsKKyAgdm9pZCBfdmlzaXRGdW5jdGlvbkVsZW1lbnQoRnVuY3Rpb25FbGVtZW50IGVsZW1lbnQpIHsKICAgICBpZiAoIV9pc1VzZWRFbGVtZW50KGVsZW1lbnQpKSB7CiAgICAgICBfcmVwb3J0RXJyb3JGb3JFbGVtZW50KAogICAgICAgICAgIEhpbnRDb2RlLlVOVVNFRF9FTEVNRU5ULCBlbGVtZW50LCBbZWxlbWVudC5kaXNwbGF5TmFtZV0pOwogICAgIH0KICAgfQogCi0gIF92aXNpdEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudChGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgZWxlbWVudCkgeworICB2b2lkIF92aXNpdEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudChGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgZWxlbWVudCkgewogICAgIGlmICghX2lzVXNlZEVsZW1lbnQoZWxlbWVudCkpIHsKICAgICAgIF9yZXBvcnRFcnJvckZvckVsZW1lbnQoCiAgICAgICAgICAgSGludENvZGUuVU5VU0VEX0VMRU1FTlQsIGVsZW1lbnQsIFtlbGVtZW50LmRpc3BsYXlOYW1lXSk7CiAgICAgfQogICB9CiAKLSAgX3Zpc2l0TG9jYWxWYXJpYWJsZUVsZW1lbnQoTG9jYWxWYXJpYWJsZUVsZW1lbnQgZWxlbWVudCkgeworICB2b2lkIF92aXNpdExvY2FsVmFyaWFibGVFbGVtZW50KExvY2FsVmFyaWFibGVFbGVtZW50IGVsZW1lbnQpIHsKICAgICBpZiAoIV9pc1VzZWRFbGVtZW50KGVsZW1lbnQpICYmICFfaXNOYW1lZFVuZGVyc2NvcmUoZWxlbWVudCkpIHsKICAgICAgIEhpbnRDb2RlIGVycm9yQ29kZTsKICAgICAgIGlmIChfdXNlZEVsZW1lbnRzLmlzQ2F0Y2hFeGNlcHRpb24oZWxlbWVudCkpIHsKQEAgLTQ2OSwyMSArNDY5LDIxIEBACiAgICAgfQogICB9CiAKLSAgX3Zpc2l0TWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKKyAgdm9pZCBfdmlzaXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmICghX2lzVXNlZE1lbWJlcihlbGVtZW50KSkgewogICAgICAgX3JlcG9ydEVycm9yRm9yRWxlbWVudCgKICAgICAgICAgICBIaW50Q29kZS5VTlVTRURfRUxFTUVOVCwgZWxlbWVudCwgW2VsZW1lbnQuZGlzcGxheU5hbWVdKTsKICAgICB9CiAgIH0KIAotICBfdmlzaXRQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudChQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBlbGVtZW50KSB7CisgIHZvaWQgX3Zpc2l0UHJvcGVydHlBY2Nlc3NvckVsZW1lbnQoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmICghX2lzVXNlZE1lbWJlcihlbGVtZW50KSkgewogICAgICAgX3JlcG9ydEVycm9yRm9yRWxlbWVudCgKICAgICAgICAgICBIaW50Q29kZS5VTlVTRURfRUxFTUVOVCwgZWxlbWVudCwgW2VsZW1lbnQuZGlzcGxheU5hbWVdKTsKICAgICB9CiAgIH0KIAotICBfdmlzaXRUb3BMZXZlbFZhcmlhYmxlRWxlbWVudChUb3BMZXZlbFZhcmlhYmxlRWxlbWVudCBlbGVtZW50KSB7CisgIHZvaWQgX3Zpc2l0VG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQoVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmICghX2lzVXNlZEVsZW1lbnQoZWxlbWVudCkpIHsKICAgICAgIF9yZXBvcnRFcnJvckZvckVsZW1lbnQoCiAgICAgICAgICAgSGludENvZGUuVU5VU0VEX0VMRU1FTlQsIGVsZW1lbnQsIFtlbGVtZW50LmRpc3BsYXlOYW1lXSk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9mYXN0YS9hc3RfYnVpbGRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZmFzdGEvYXN0X2J1aWxkZXIuZGFydAppbmRleCBhOTM3OGI3Li5jZWRhNTkxIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9mYXN0YS9hc3RfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2Zhc3RhL2FzdF9idWlsZGVyLmRhcnQKQEAgLTM3NzUsNyArMzc3NSw3IEBACiAgIGNvbnN0IF9JbnZhbGlkQ29sbGVjdGlvbkVsZW1lbnQuXygpOwogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQogCiAvLy8gRGF0YSBzdHJ1Y3R1cmUgcGxhY2VkIG9uIHRoZSBzdGFjayB0byByZXByZXNlbnQgYSBub24tZW1wdHkgc2VxdWVuY2UKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0CmluZGV4IGE2ZjEyOGYuLjQ3MDlmMDQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydApAQCAtNiwxMyArNiw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwvdXJpLmRhcnQnOwogCi0vKioKLSAqIEEgW1VyaVJlc29sdmVyXSBmb3IgW1Jlc291cmNlXXMuCi0gKi8KKy8vLyBBIFtVcmlSZXNvbHZlcl0gZm9yIFtSZXNvdXJjZV1zLgogY2xhc3MgUmVzb3VyY2VVcmlSZXNvbHZlciBleHRlbmRzIFVyaVJlc29sdmVyIHsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBgZmlsZWAgc2NoZW1lLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBgZmlsZWAgc2NoZW1lLgogICBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGUiOwogCiAgIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgX3Byb3ZpZGVyOwpAQCAtMzUsOCArMzEsNiBAQAogICBVcmkgcmVzdG9yZUFic29sdXRlKFNvdXJjZSBzb3VyY2UpID0+CiAgICAgICBfcHJvdmlkZXIucGF0aENvbnRleHQudG9Vcmkoc291cmNlLmZ1bGxOYW1lKTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3VyaV0gaXMgYSBgZmlsZWAgVVJJLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFt1cmldIGlzIGEgYGZpbGVgIFVSSS4KICAgc3RhdGljIGJvb2wgaXNGaWxlVXJpKFVyaSB1cmkpID0+IHVyaS5zY2hlbWUgPT0gRklMRV9TQ0hFTUU7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvYXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvYXN0LmRhcnQKaW5kZXggYTE5MDBhYi4uZmZhZmJkNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2FzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9hc3QuZGFydApAQCAtMiwxNiArMiwxNCBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogVGhpcyBsaWJyYXJ5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBjb252ZXJ0IGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgbGlicmFyeSB0bwotICogcmVmZXJlbmNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHB1YmxpYyBsaWJyYXJpZXM6Ci0gKiAqIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQKLSAqICogcGFja2FnZTphbmFseXplci9kYXJ0L2FzdC92aXNpdG9yLmRhcnQKLSAqCi0gKiBJZiB5b3VyIGNvZGUgaXMgdXNpbmcgQVBJcyBub3QgYXZhaWxhYmxlIGluIHRoZXNlIHB1YmxpYyBsaWJyYXJpZXMsIHBsZWFzZQotICogY29udGFjdCB0aGUgYW5hbHl6ZXIgdGVhbSB0byBlaXRoZXIgZmluZCBhbiBhbHRlcm5hdGUgQVBJIG9yIGhhdmUgdGhlIEFQSSB5b3UKLSAqIGRlcGVuZCBvbiBhZGRlZCB0byB0aGUgcHVibGljIEFQSS4KLSAqLworLy8vIFRoaXMgbGlicmFyeSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgY29udmVydCBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIGxpYnJhcnkgdG8KKy8vLyByZWZlcmVuY2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgcHVibGljIGxpYnJhcmllczoKKy8vLyAqIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQKKy8vLyAqIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdmlzaXRvci5kYXJ0CisvLy8KKy8vLyBJZiB5b3VyIGNvZGUgaXMgdXNpbmcgQVBJcyBub3QgYXZhaWxhYmxlIGluIHRoZXNlIHB1YmxpYyBsaWJyYXJpZXMsIHBsZWFzZQorLy8vIGNvbnRhY3QgdGhlIGFuYWx5emVyIHRlYW0gdG8gZWl0aGVyIGZpbmQgYW4gYWx0ZXJuYXRlIEFQSSBvciBoYXZlIHRoZSBBUEkKKy8vLyB5b3UgZGVwZW5kIG9uIGFkZGVkIHRvIHRoZSBwdWJsaWMgQVBJLgogQGRlcHJlY2F0ZWQKIGxpYnJhcnkgYW5hbHl6ZXIuc3JjLmdlbmVyYXRlZC5hc3Q7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQKaW5kZXggYzliYTA5MzMuLjkwYWJlODEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0CkBAIC05LDEwICs5LDEwIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvZXZhbHVhdGlvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC92YWx1ZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCcgc2hvdyBSZWNvcmRpbmdFcnJvckxpc3RlbmVyOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnIHNob3cgU291cmNlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIAogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYW5hbHlzaXMvZGVjbGFyZWRfdmFyaWFibGVzLmRhcnQnOwogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvY29uc3RhbnQvdmFsdWUuZGFydCc7CkBAIC05NiwyNiArOTYsMTggQEAKIC8vLyBpbmRpY2F0ZSB2YXJpb3VzIGNvbmRpdGlvbnMgZW5jb3VudGVyZWQgZHVyaW5nIGV2YWx1YXRpb24uIFRoZXNlIGFyZQogLy8vIGRvY3VtZW50ZWQgd2l0aCB0aGUgc3RhdGljIGZpZWxkcyB0aGF0IGRlZmluZSB0aG9zZSB2YWx1ZXMuCiBjbGFzcyBDb25zdGFudEV2YWx1YXRvciB7Ci0gIC8qKgotICAgKiBUaGUgc291cmNlIGNvbnRhaW5pbmcgdGhlIGV4cHJlc3Npb24ocykgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZC4KLSAgICovCisgIC8vLyBUaGUgc291cmNlIGNvbnRhaW5pbmcgdGhlIGV4cHJlc3Npb24ocykgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZC4KICAgZmluYWwgU291cmNlIF9zb3VyY2U7CiAKLSAgLyoqCi0gICAqIFRoZSB0eXBlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBrbm93biB0eXBlcy4KLSAgICovCisgIC8vLyBUaGUgdHlwZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUga25vd24gdHlwZXMuCiAgIGZpbmFsIFR5cGVQcm92aWRlciBfdHlwZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgdHlwZSBzeXN0ZW0gcHJpbWl0aXZlcy4KLSAgICovCisgIC8vLyBUaGUgdHlwZSBzeXN0ZW0gcHJpbWl0aXZlcy4KICAgZmluYWwgVHlwZVN5c3RlbUltcGwgX3R5cGVTeXN0ZW07CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGV2YWx1YXRvciB0byBldmFsdWF0ZSBleHByZXNzaW9ucyBpbiB0aGUgZ2l2ZW4KLSAgICogW3NvdXJjZV0uIFRoZSBbdHlwZVByb3ZpZGVyXSBpcyB0aGUgdHlwZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyBrbm93bgotICAgKiB0eXBlcy4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBldmFsdWF0b3IgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMgaW4gdGhlIGdpdmVuCisgIC8vLyBbc291cmNlXS4gVGhlIFt0eXBlUHJvdmlkZXJdIGlzIHRoZSB0eXBlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIGtub3duCisgIC8vLyB0eXBlcy4KICAgQ29uc3RhbnRFdmFsdWF0b3IodGhpcy5fc291cmNlLCBUeXBlUHJvdmlkZXIgdHlwZVByb3ZpZGVyLAogICAgICAge1R5cGVTeXN0ZW1JbXBsIHR5cGVTeXN0ZW19KQogICAgICAgOiBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW0gPz8KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbGVtZW50LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0CmluZGV4IGRhMDM2MTcuLmE4NzQ4MDYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbGVtZW50LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VsZW1lbnQuZGFydApAQCAtMiwxNyArMiwxNSBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogVGhpcyBsaWJyYXJ5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBjb252ZXJ0IGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgbGlicmFyeSB0bwotICogcmVmZXJlbmNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHB1YmxpYyBsaWJyYXJpZXM6Ci0gKiAqIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydAotICogKiBwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQKLSAqICogcGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdmlzaXRvci5kYXJ0Ci0gKgotICogSWYgeW91ciBjb2RlIGlzIHVzaW5nIEFQSXMgbm90IGF2YWlsYWJsZSBpbiB0aGVzZSBwdWJsaWMgbGlicmFyaWVzLCBwbGVhc2UKLSAqIGNvbnRhY3QgdGhlIGFuYWx5emVyIHRlYW0gdG8gZWl0aGVyIGZpbmQgYW4gYWx0ZXJuYXRlIEFQSSBvciBoYXZlIHRoZSBBUEkgeW91Ci0gKiBkZXBlbmQgb24gYWRkZWQgdG8gdGhlIHB1YmxpYyBBUEkuCi0gKi8KKy8vLyBUaGlzIGxpYnJhcnkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGNvbnZlcnQgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBsaWJyYXJ5IHRvCisvLy8gcmVmZXJlbmNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHB1YmxpYyBsaWJyYXJpZXM6CisvLy8gKiBwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQKKy8vLyAqIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydAorLy8vICogcGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdmlzaXRvci5kYXJ0CisvLy8KKy8vLyBJZiB5b3VyIGNvZGUgaXMgdXNpbmcgQVBJcyBub3QgYXZhaWxhYmxlIGluIHRoZXNlIHB1YmxpYyBsaWJyYXJpZXMsIHBsZWFzZQorLy8vIGNvbnRhY3QgdGhlIGFuYWx5emVyIHRlYW0gdG8gZWl0aGVyIGZpbmQgYW4gYWx0ZXJuYXRlIEFQSSBvciBoYXZlIHRoZSBBUEkKKy8vLyB5b3UgZGVwZW5kIG9uIGFkZGVkIHRvIHRoZSBwdWJsaWMgQVBJLgogQGRlcHJlY2F0ZWQKIGxpYnJhcnkgYW5hbHl6ZXIuc3JjLmdlbmVyYXRlZC5lbGVtZW50OwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VsZW1lbnRfcmVzb2x2ZXIuZGFydAppbmRleCBjYzkwMGVhLi5mNGVjZjk0IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbGVtZW50X3Jlc29sdmVyLmRhcnQKQEAgLTE1LDkgKzE1LDExIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9pbmhlcml0YW5jZV9tYW5hZ2VyMy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZXh0ZW5zaW9uX21lbWJlcl9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9tZXRob2RfaW52b2NhdGlvbl9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9yZXNvbHV0aW9uX3Jlc3VsdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci90eXBlX3Byb3BlcnR5X3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKQEAgLTI3LDgzICsyOSw3MyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAotLyoqCi0gKiBBbiBvYmplY3QgdXNlZCBieSBpbnN0YW5jZXMgb2YgW1Jlc29sdmVyVmlzaXRvcl0gdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHdpdGhpbgotICogdGhlIEFTVCBzdHJ1Y3R1cmUgdG8gdGhlIGVsZW1lbnRzIGJlaW5nIHJlZmVyZW5jZWQuIFRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQotICogZWxlbWVudCByZXNvbHZlciBhcmU6Ci0gKgotICogMS4gRXZlcnkgW1NpbXBsZUlkZW50aWZpZXJdIHNob3VsZCBiZSByZXNvbHZlZCB0byB0aGUgZWxlbWVudCB0byB3aGljaCBpdAotICogICAgcmVmZXJzLiBTcGVjaWZpY2FsbHk6Ci0gKiAgICAqIEFuIGlkZW50aWZpZXIgd2l0aGluIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGF0IG5hbWUgc2hvdWxkIHJlc29sdmUgdG8gdGhlCi0gKiAgICAgIGVsZW1lbnQgYmVpbmcgZGVjbGFyZWQuCi0gKiAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSBwcmVmaXggc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKLSAqICAgICAgcmVwcmVzZW50aW5nIHRoZSBpbXBvcnQgdGhhdCBkZWZpbmVzIHRoZSBwcmVmaXggKGFuIFtJbXBvcnRFbGVtZW50XSkuCi0gKiAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSB2YXJpYWJsZSBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudAotICogICAgICByZXByZXNlbnRpbmcgdGhlIHZhcmlhYmxlIChhIFtWYXJpYWJsZUVsZW1lbnRdKS4KLSAqICAgICogQW4gaWRlbnRpZmllciBkZW5vdGluZyBhIHBhcmFtZXRlciBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudAotICogICAgICByZXByZXNlbnRpbmcgdGhlIHBhcmFtZXRlciAoYSBbUGFyYW1ldGVyRWxlbWVudF0pLgotICogICAgKiBBbiBpZGVudGlmaWVyIGRlbm90aW5nIGEgZmllbGQgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKLSAqICAgICAgcmVwcmVzZW50aW5nIHRoZSBnZXR0ZXIgb3Igc2V0dGVyIGJlaW5nIGludm9rZWQgKGEKLSAqICAgICAgW1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50XSkuCi0gKiAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb3IgZnVuY3Rpb24gYmVpbmcgaW52b2tlZAotICogICAgICBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIG1ldGhvZCBvciBmdW5jdGlvbiAoYW4KLSAqICAgICAgW0V4ZWN1dGFibGVFbGVtZW50XSkuCi0gKiAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSBsYWJlbCBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudAotICogICAgICByZXByZXNlbnRpbmcgdGhlIGxhYmVsIChhIFtMYWJlbEVsZW1lbnRdKS4KLSAqICAgIFRoZSBpZGVudGlmaWVycyB3aXRoaW4gZGlyZWN0aXZlcyBhcmUgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUgYW5kIGFyZQotICogICAgY292ZXJlZCBiZWxvdy4KLSAqIDIuIEV2ZXJ5IG5vZGUgY29udGFpbmluZyBhIHRva2VuIHJlcHJlc2VudGluZyBhbiBvcGVyYXRvciB0aGF0IGNhbiBiZQotICogICAgb3ZlcnJpZGRlbiAoIFtCaW5hcnlFeHByZXNzaW9uXSwgW1ByZWZpeEV4cHJlc3Npb25dLCBbUG9zdGZpeEV4cHJlc3Npb25dKQotICogICAgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBtZXRob2QgaW52b2tlZCBieSB0aGF0Ci0gKiAgICBvcGVyYXRvciAoYSBbTWV0aG9kRWxlbWVudF0pLgotICogMy4gRXZlcnkgW0Z1bmN0aW9uRXhwcmVzc2lvbkludm9jYXRpb25dIHNob3VsZCByZXNvbHZlIHRvIHRoZSBlbGVtZW50Ci0gKiAgICByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uIGJlaW5nIGludm9rZWQgKGEgW0Z1bmN0aW9uRWxlbWVudF0pLiBUaGlzIHdpbGwKLSAqICAgIGJlIHRoZSBzYW1lIGVsZW1lbnQgYXMgdGhhdCB0byB3aGljaCB0aGUgbmFtZSBpcyByZXNvbHZlZCBpZiB0aGUgZnVuY3Rpb24KLSAqICAgIGhhcyBhIG5hbWUsIGJ1dCBpcyBwcm92aWRlZCBmb3IgdGhvc2UgY2FzZXMgd2hlcmUgYW4gdW5uYW1lZCBmdW5jdGlvbiBpcwotICogICAgYmVpbmcgaW52b2tlZC4KLSAqIDQuIEV2ZXJ5IFtMaWJyYXJ5RGlyZWN0aXZlXSBhbmQgW1BhcnRPZkRpcmVjdGl2ZV0gc2hvdWxkIHJlc29sdmUgdG8gdGhlCi0gKiAgICBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgbGlicmFyeSBiZWluZyBzcGVjaWZpZWQgYnkgdGhlIGRpcmVjdGl2ZSAoYQotICogICAgW0xpYnJhcnlFbGVtZW50XSkgdW5sZXNzLCBpbiB0aGUgY2FzZSBvZiBhIHBhcnQtb2YgZGlyZWN0aXZlLCB0aGUKLSAqICAgIHNwZWNpZmllZCBsaWJyYXJ5IGRvZXMgbm90IGV4aXN0LgotICogNS4gRXZlcnkgW0ltcG9ydERpcmVjdGl2ZV0gYW5kIFtFeHBvcnREaXJlY3RpdmVdIHNob3VsZCByZXNvbHZlIHRvIHRoZQotICogICAgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkgYmVpbmcgc3BlY2lmaWVkIGJ5IHRoZSBkaXJlY3RpdmUgdW5sZXNzCi0gKiAgICB0aGUgc3BlY2lmaWVkIGxpYnJhcnkgZG9lcyBub3QgZXhpc3QgKGFuIFtJbXBvcnRFbGVtZW50XSBvcgotICogICAgW0V4cG9ydEVsZW1lbnRdKS4KLSAqIDYuIFRoZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IGluIGFuIFtJbXBvcnREaXJlY3RpdmVdIHNob3VsZAotICogICAgcmVzb2x2ZSB0byB0aGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHByZWZpeCAoYSBbUHJlZml4RWxlbWVudF0pLgotICogNy4gVGhlIGlkZW50aWZpZXJzIGluIHRoZSBoaWRlIGFuZCBzaG93IGNvbWJpbmF0b3JzIGluIFtJbXBvcnREaXJlY3RpdmVdcwotICogICAgYW5kIFtFeHBvcnREaXJlY3RpdmVdcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcKLSAqICAgIGhpZGRlbiBvciBzaG93biwgcmVzcGVjdGl2ZWx5LCB1bmxlc3MgdGhvc2UgbmFtZXMgYXJlIG5vdCBkZWZpbmVkIGluIHRoZQotICogICAgc3BlY2lmaWVkIGxpYnJhcnkgKG9yIHRoZSBzcGVjaWZpZWQgbGlicmFyeSBkb2VzIG5vdCBleGlzdCkuCi0gKiA4LiBFdmVyeSBbUGFydERpcmVjdGl2ZV0gc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZQotICogICAgY29tcGlsYXRpb24gdW5pdCBiZWluZyBzcGVjaWZpZWQgYnkgdGhlIHN0cmluZyB1bmxlc3MgdGhlIHNwZWNpZmllZAotICogICAgY29tcGlsYXRpb24gdW5pdCBkb2VzIG5vdCBleGlzdCAoYSBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0pLgotICoKLSAqIE5vdGUgdGhhdCBBU1Qgbm9kZXMgdGhhdCB3b3VsZCByZXByZXNlbnQgZWxlbWVudHMgdGhhdCBhcmUgbm90IGRlZmluZWQgYXJlCi0gKiBub3QgcmVzb2x2ZWQgdG8gYW55dGhpbmcuIFRoaXMgaW5jbHVkZXMgc3VjaCB0aGluZ3MgYXMgcmVmZXJlbmNlcyB0bwotICogdW5kZWNsYXJlZCB2YXJpYWJsZXMgKHdoaWNoIGlzIGFuIGVycm9yKSBhbmQgbmFtZXMgaW4gaGlkZSBhbmQgc2hvdwotICogY29tYmluYXRvcnMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gdGhlIGltcG9ydGVkIGxpYnJhcnkgKHdoaWNoIGlzIG5vdCBhbgotICogZXJyb3IpLgotICovCisvLy8gQW4gb2JqZWN0IHVzZWQgYnkgaW5zdGFuY2VzIG9mIFtSZXNvbHZlclZpc2l0b3JdIHRvIHJlc29sdmUgcmVmZXJlbmNlcworLy8vIHdpdGhpbiB0aGUgQVNUIHN0cnVjdHVyZSB0byB0aGUgZWxlbWVudHMgYmVpbmcgcmVmZXJlbmNlZC4gVGhlIHJlcXVpcmVtZW50cworLy8vIGZvciB0aGUgZWxlbWVudCByZXNvbHZlciBhcmU6CisvLy8KKy8vLyAxLiBFdmVyeSBbU2ltcGxlSWRlbnRpZmllcl0gc2hvdWxkIGJlIHJlc29sdmVkIHRvIHRoZSBlbGVtZW50IHRvIHdoaWNoIGl0CisvLy8gICAgcmVmZXJzLiBTcGVjaWZpY2FsbHk6CisvLy8gICAgKiBBbiBpZGVudGlmaWVyIHdpdGhpbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhhdCBuYW1lIHNob3VsZCByZXNvbHZlIHRvIHRoZQorLy8vICAgICAgZWxlbWVudCBiZWluZyBkZWNsYXJlZC4KKy8vLyAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSBwcmVmaXggc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKKy8vLyAgICAgIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0IHRoYXQgZGVmaW5lcyB0aGUgcHJlZml4IChhbiBbSW1wb3J0RWxlbWVudF0pLgorLy8vICAgICogQW4gaWRlbnRpZmllciBkZW5vdGluZyBhIHZhcmlhYmxlIHNob3VsZCByZXNvbHZlIHRvIHRoZSBlbGVtZW50CisvLy8gICAgICByZXByZXNlbnRpbmcgdGhlIHZhcmlhYmxlIChhIFtWYXJpYWJsZUVsZW1lbnRdKS4KKy8vLyAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSBwYXJhbWV0ZXIgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKKy8vLyAgICAgIHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVyIChhIFtQYXJhbWV0ZXJFbGVtZW50XSkuCisvLy8gICAgKiBBbiBpZGVudGlmaWVyIGRlbm90aW5nIGEgZmllbGQgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKKy8vLyAgICAgIHJlcHJlc2VudGluZyB0aGUgZ2V0dGVyIG9yIHNldHRlciBiZWluZyBpbnZva2VkIChhCisvLy8gICAgICBbUHJvcGVydHlBY2Nlc3NvckVsZW1lbnRdKS4KKy8vLyAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgdGhlIG5hbWUgb2YgYSBtZXRob2Qgb3IgZnVuY3Rpb24gYmVpbmcgaW52b2tlZAorLy8vICAgICAgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBtZXRob2Qgb3IgZnVuY3Rpb24gKGFuCisvLy8gICAgICBbRXhlY3V0YWJsZUVsZW1lbnRdKS4KKy8vLyAgICAqIEFuIGlkZW50aWZpZXIgZGVub3RpbmcgYSBsYWJlbCBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudAorLy8vICAgICAgcmVwcmVzZW50aW5nIHRoZSBsYWJlbCAoYSBbTGFiZWxFbGVtZW50XSkuCisvLy8gICAgVGhlIGlkZW50aWZpZXJzIHdpdGhpbiBkaXJlY3RpdmVzIGFyZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZSBhbmQgYXJlCisvLy8gICAgY292ZXJlZCBiZWxvdy4KKy8vLyAyLiBFdmVyeSBub2RlIGNvbnRhaW5pbmcgYSB0b2tlbiByZXByZXNlbnRpbmcgYW4gb3BlcmF0b3IgdGhhdCBjYW4gYmUKKy8vLyAgICBvdmVycmlkZGVuICggW0JpbmFyeUV4cHJlc3Npb25dLCBbUHJlZml4RXhwcmVzc2lvbl0sIFtQb3N0Zml4RXhwcmVzc2lvbl0pCisvLy8gICAgc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBtZXRob2QgaW52b2tlZCBieSB0aGF0CisvLy8gICAgb3BlcmF0b3IgKGEgW01ldGhvZEVsZW1lbnRdKS4KKy8vLyAzLiBFdmVyeSBbRnVuY3Rpb25FeHByZXNzaW9uSW52b2NhdGlvbl0gc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQKKy8vLyAgICByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uIGJlaW5nIGludm9rZWQgKGEgW0Z1bmN0aW9uRWxlbWVudF0pLiBUaGlzIHdpbGwKKy8vLyAgICBiZSB0aGUgc2FtZSBlbGVtZW50IGFzIHRoYXQgdG8gd2hpY2ggdGhlIG5hbWUgaXMgcmVzb2x2ZWQgaWYgdGhlIGZ1bmN0aW9uCisvLy8gICAgaGFzIGEgbmFtZSwgYnV0IGlzIHByb3ZpZGVkIGZvciB0aG9zZSBjYXNlcyB3aGVyZSBhbiB1bm5hbWVkIGZ1bmN0aW9uIGlzCisvLy8gICAgYmVpbmcgaW52b2tlZC4KKy8vLyA0LiBFdmVyeSBbTGlicmFyeURpcmVjdGl2ZV0gYW5kIFtQYXJ0T2ZEaXJlY3RpdmVdIHNob3VsZCByZXNvbHZlIHRvIHRoZQorLy8vICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5IGJlaW5nIHNwZWNpZmllZCBieSB0aGUgZGlyZWN0aXZlIChhCisvLy8gICAgW0xpYnJhcnlFbGVtZW50XSkgdW5sZXNzLCBpbiB0aGUgY2FzZSBvZiBhIHBhcnQtb2YgZGlyZWN0aXZlLCB0aGUKKy8vLyAgICBzcGVjaWZpZWQgbGlicmFyeSBkb2VzIG5vdCBleGlzdC4KKy8vLyA1LiBFdmVyeSBbSW1wb3J0RGlyZWN0aXZlXSBhbmQgW0V4cG9ydERpcmVjdGl2ZV0gc2hvdWxkIHJlc29sdmUgdG8gdGhlCisvLy8gICAgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkgYmVpbmcgc3BlY2lmaWVkIGJ5IHRoZSBkaXJlY3RpdmUgdW5sZXNzCisvLy8gICAgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IGRvZXMgbm90IGV4aXN0IChhbiBbSW1wb3J0RWxlbWVudF0gb3IKKy8vLyAgICBbRXhwb3J0RWxlbWVudF0pLgorLy8vIDYuIFRoZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IGluIGFuIFtJbXBvcnREaXJlY3RpdmVdIHNob3VsZAorLy8vICAgIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggKGEgW1ByZWZpeEVsZW1lbnRdKS4KKy8vLyA3LiBUaGUgaWRlbnRpZmllcnMgaW4gdGhlIGhpZGUgYW5kIHNob3cgY29tYmluYXRvcnMgaW4gW0ltcG9ydERpcmVjdGl2ZV1zCisvLy8gICAgYW5kIFtFeHBvcnREaXJlY3RpdmVdcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgZWxlbWVudHMgdGhhdCBhcmUgYmVpbmcKKy8vLyAgICBoaWRkZW4gb3Igc2hvd24sIHJlc3BlY3RpdmVseSwgdW5sZXNzIHRob3NlIG5hbWVzIGFyZSBub3QgZGVmaW5lZCBpbiB0aGUKKy8vLyAgICBzcGVjaWZpZWQgbGlicmFyeSAob3IgdGhlIHNwZWNpZmllZCBsaWJyYXJ5IGRvZXMgbm90IGV4aXN0KS4KKy8vLyA4LiBFdmVyeSBbUGFydERpcmVjdGl2ZV0gc2hvdWxkIHJlc29sdmUgdG8gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZQorLy8vICAgIGNvbXBpbGF0aW9uIHVuaXQgYmVpbmcgc3BlY2lmaWVkIGJ5IHRoZSBzdHJpbmcgdW5sZXNzIHRoZSBzcGVjaWZpZWQKKy8vLyAgICBjb21waWxhdGlvbiB1bml0IGRvZXMgbm90IGV4aXN0IChhIFtDb21waWxhdGlvblVuaXRFbGVtZW50XSkuCisvLy8KKy8vLyBOb3RlIHRoYXQgQVNUIG5vZGVzIHRoYXQgd291bGQgcmVwcmVzZW50IGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGFyZQorLy8vIG5vdCByZXNvbHZlZCB0byBhbnl0aGluZy4gVGhpcyBpbmNsdWRlcyBzdWNoIHRoaW5ncyBhcyByZWZlcmVuY2VzIHRvCisvLy8gdW5kZWNsYXJlZCB2YXJpYWJsZXMgKHdoaWNoIGlzIGFuIGVycm9yKSBhbmQgbmFtZXMgaW4gaGlkZSBhbmQgc2hvdworLy8vIGNvbWJpbmF0b3JzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBsaWJyYXJ5ICh3aGljaCBpcyBub3QgYW4KKy8vLyBlcnJvcikuCiBjbGFzcyBFbGVtZW50UmVzb2x2ZXIgZXh0ZW5kcyBTaW1wbGVBc3RWaXNpdG9yPHZvaWQ+IHsKLSAgLyoqCi0gICAqIFRoZSByZXNvbHZlciBkcml2aW5nIHRoaXMgcGFydGljaXBhbnQuCi0gICAqLworICAvLy8gVGhlIHJlc29sdmVyIGRyaXZpbmcgdGhpcyBwYXJ0aWNpcGFudC4KICAgZmluYWwgUmVzb2x2ZXJWaXNpdG9yIF9yZXNvbHZlcjsKIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgZm9yIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYmVpbmcgdmlzaXRlZC4KLSAgICovCisgIC8vLyBUaGUgZWxlbWVudCBmb3IgdGhlIGxpYnJhcnkgY29udGFpbmluZyB0aGUgY29tcGlsYXRpb24gdW5pdCBiZWluZyB2aXNpdGVkLgogICBmaW5hbCBMaWJyYXJ5RWxlbWVudCBfZGVmaW5pbmdMaWJyYXJ5OwogCi0gIC8qKgotICAgKiBUaGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgJ2R5bmFtaWMnLgotICAgKi8KKyAgLy8vIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgdHlwZSAnZHluYW1pYycuCiAgIERhcnRUeXBlIF9keW5hbWljVHlwZTsKIAotICAvKioKLSAgICogVGhlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlICdUeXBlJy4KLSAgICovCisgIC8vLyBUaGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgJ1R5cGUnLgogICBJbnRlcmZhY2VUeXBlIF90eXBlVHlwZTsKIAogICAvLy8gV2hldGhlciBjb25zdGFudCBldmFsdWF0aW9uIGVycm9ycyBzaG91bGQgYmUgcmVwb3J0ZWQgZHVyaW5nIHJlc29sdXRpb24uCkBAIC0xMTgsMTAgKzExMCw4IEBACiAKICAgTWV0aG9kSW52b2NhdGlvblJlc29sdmVyIF9tZXRob2RJbnZvY2F0aW9uUmVzb2x2ZXI7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHZpc2l0b3IgdG8gd29yayBmb3IgdGhlIGdpdmVuIFtfcmVzb2x2ZXJdIHRvCi0gICAqIHJlc29sdmUgdGhlIG5vZGVzIGluIGEgY29tcGlsYXRpb24gdW5pdC4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCB2aXNpdG9yIHRvIHdvcmsgZm9yIHRoZSBnaXZlbiBbX3Jlc29sdmVyXSB0bworICAvLy8gcmVzb2x2ZSB0aGUgbm9kZXMgaW4gYSBjb21waWxhdGlvbiB1bml0LgogICBFbGVtZW50UmVzb2x2ZXIodGhpcy5fcmVzb2x2ZXIsCiAgICAgICB7dGhpcy5yZXBvcnRDb25zdEV2YWx1YXRpb25FcnJvcnMgPSB0cnVlLAogICAgICAgTWlncmF0YWJsZUFzdEluZm9Qcm92aWRlciBtaWdyYXRhYmxlQXN0SW5mb1Byb3ZpZGVyID0KQEAgLTEzOCwxMCArMTI4LDggQEAKICAgICApOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWZmIHRoZSBjdXJyZW50IGVuY2xvc2luZyBmdW5jdGlvbiBpcyBhIGNvbnN0YW50IGNvbnN0cnVjdG9yCi0gICAqIGRlY2xhcmF0aW9uLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWZmIHRoZSBjdXJyZW50IGVuY2xvc2luZyBmdW5jdGlvbiBpcyBhIGNvbnN0YW50IGNvbnN0cnVjdG9yCisgIC8vLyBkZWNsYXJhdGlvbi4KICAgYm9vbCBnZXQgaXNJbkNvbnN0Q29uc3RydWN0b3IgewogICAgIEV4ZWN1dGFibGVFbGVtZW50IGZ1bmN0aW9uID0gX3Jlc29sdmVyLmVuY2xvc2luZ0Z1bmN0aW9uOwogICAgIGlmIChmdW5jdGlvbiBpcyBDb25zdHJ1Y3RvckVsZW1lbnQpIHsKQEAgLTg2MiwxMiArODUwLDEwIEBACiAgICAgKTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBpbmRleCBbZXhwcmVzc2lvbl0gd2FzIHJlc29sdmVkLCBvdGhlcndpc2UgYQotICAgKiBbU3RhdGljVHlwZVdhcm5pbmdDb2RlLlVOREVGSU5FRF9PUEVSQVRPUl0gaXMgZ2VuZXJhdGVkLiBUaGUgW3RhcmdldF0gaXMKLSAgICogdGhlIHRhcmdldCBvZiB0aGUgZXhwcmVzc2lvbi4gVGhlIFttZXRob2ROYW1lXSBpcyB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0b3IKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG9mIHVzaW5nIG9mIHRoZSBnaXZlbiBpbmRleCBleHByZXNzaW9uLgotICAgKi8KKyAgLy8vIENoZWNrIHRoYXQgdGhlIGdpdmVuIGluZGV4IFtleHByZXNzaW9uXSB3YXMgcmVzb2x2ZWQsIG90aGVyd2lzZSBhCisgIC8vLyBbU3RhdGljVHlwZVdhcm5pbmdDb2RlLlVOREVGSU5FRF9PUEVSQVRPUl0gaXMgZ2VuZXJhdGVkLiBUaGUgW3RhcmdldF0gaXMKKyAgLy8vIHRoZSB0YXJnZXQgb2YgdGhlIGV4cHJlc3Npb24uIFRoZSBbbWV0aG9kTmFtZV0gaXMgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdG9yCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgb2YgdXNpbmcgb2YgdGhlIGdpdmVuIGluZGV4IGV4cHJlc3Npb24uCiAgIHZvaWQgX2NoZWNrRm9yVW5kZWZpbmVkSW5kZXhPcGVyYXRvcigKICAgICAgIEluZGV4RXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICAgRXhwcmVzc2lvbiB0YXJnZXQsCkBAIC05MjYsMTAgKzkxMiw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc3VtaW5nIHRoYXQgdGhlIGdpdmVuIFtpZGVudGlmaWVyXSBpcyBhIHByZWZpeCBmb3IgYSBkZWZlcnJlZCBpbXBvcnQsCi0gICAqIHJldHVybiB0aGUgbGlicmFyeSB0aGF0IGlzIGJlaW5nIGltcG9ydGVkLgotICAgKi8KKyAgLy8vIEFzc3VtaW5nIHRoYXQgdGhlIGdpdmVuIFtpZGVudGlmaWVyXSBpcyBhIHByZWZpeCBmb3IgYSBkZWZlcnJlZCBpbXBvcnQsCisgIC8vLyByZXR1cm4gdGhlIGxpYnJhcnkgdGhhdCBpcyBiZWluZyBpbXBvcnRlZC4KICAgTGlicmFyeUVsZW1lbnQgX2dldEltcG9ydGVkTGlicmFyeShTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsKICAgICBQcmVmaXhFbGVtZW50IHByZWZpeEVsZW1lbnQgPSBpZGVudGlmaWVyLnN0YXRpY0VsZW1lbnQgYXMgUHJlZml4RWxlbWVudDsKICAgICBMaXN0PEltcG9ydEVsZW1lbnQ+IGltcG9ydHMgPQpAQCAtOTM3LDEwICs5MjEsOCBAQAogICAgIHJldHVybiBpbXBvcnRzWzBdLmltcG9ydGVkTGlicmFyeTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gdGhhdCBpcyB0byBiZSB1c2VkIGZvcgotICAgKiB0eXBlIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIFtleHByZXNzaW9uXSB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yCisgIC8vLyB0eXBlIGFuYWx5c2lzLgogICBEYXJ0VHlwZSBfZ2V0U3RhdGljVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIHtib29sIHJlYWQgPSBmYWxzZX0pIHsKICAgICBpZiAoZXhwcmVzc2lvbiBpcyBOdWxsTGl0ZXJhbCkgewogICAgICAgcmV0dXJuIF90eXBlUHJvdmlkZXIubnVsbFR5cGU7CkBAIC05NTksOSArOTQxLDcgQEAKICAgICApOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtleHByZXNzaW9uXSBpcyBhIHByZWZpeCBmb3IgYSBkZWZlcnJlZCBpbXBvcnQuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dIGlzIGEgcHJlZml4IGZvciBhIGRlZmVycmVkIGltcG9ydC4KICAgYm9vbCBfaXNEZWZlcnJlZFByZWZpeChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICBpZiAoZXhwcmVzc2lvbiBpcyBTaW1wbGVJZGVudGlmaWVyKSB7CiAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBleHByZXNzaW9uLnN0YXRpY0VsZW1lbnQ7CkBAIC05NzcsMTEgKzk1Nyw5IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtub2RlXSBjYW4gdmFsaWRseSBiZSByZXNvbHZlZCB0byBhIHByZWZpeDoKLSAgICogKiBpdCBpcyB0aGUgcHJlZml4IGluIGFuIGltcG9ydCBkaXJlY3RpdmUsIG9yCi0gICAqICogaXQgaXMgdGhlIHByZWZpeCBpbiBhIHByZWZpeGVkIGlkZW50aWZpZXIuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW25vZGVdIGNhbiB2YWxpZGx5IGJlIHJlc29sdmVkIHRvIGEgcHJlZml4OgorICAvLy8gKiBpdCBpcyB0aGUgcHJlZml4IGluIGFuIGltcG9ydCBkaXJlY3RpdmUsIG9yCisgIC8vLyAqIGl0IGlzIHRoZSBwcmVmaXggaW4gYSBwcmVmaXhlZCBpZGVudGlmaWVyLgogICBib29sIF9pc1ZhbGlkQXNQcmVmaXgoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CiAgICAgQXN0Tm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICBpZiAocGFyZW50IGlzIEltcG9ydERpcmVjdGl2ZSkgewpAQCAtOTk1LDEzICs5NzMsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB0YXJnZXQgb2YgYSBicmVhayBvciBjb250aW51ZSBzdGF0ZW1lbnQsIGFuZCB1cGRhdGUgdGhlIHN0YXRpYwotICAgKiBlbGVtZW50IG9mIGl0cyBsYWJlbCAoaWYgYW55KS4gVGhlIFtwYXJlbnROb2RlXSBpcyB0aGUgQVNUIG5vZGUgb2YgdGhlCi0gICAqIGJyZWFrIG9yIGNvbnRpbnVlIHN0YXRlbWVudC4gVGhlIFtsYWJlbE5vZGVdIGlzIHRoZSBsYWJlbCBjb250YWluZWQgaW4gdGhhdAotICAgKiBzdGF0ZW1lbnQgKGlmIGFueSkuIFRoZSBmbGFnIFtpc0NvbnRpbnVlXSBpcyBgdHJ1ZWAgaWYgdGhlIG5vZGUgYmVpbmcKLSAgICogdmlzaXRlZCBpcyBhIGNvbnRpbnVlIHN0YXRlbWVudC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHRhcmdldCBvZiBhIGJyZWFrIG9yIGNvbnRpbnVlIHN0YXRlbWVudCwgYW5kIHVwZGF0ZSB0aGUgc3RhdGljCisgIC8vLyBlbGVtZW50IG9mIGl0cyBsYWJlbCAoaWYgYW55KS4gVGhlIFtwYXJlbnROb2RlXSBpcyB0aGUgQVNUIG5vZGUgb2YgdGhlCisgIC8vLyBicmVhayBvciBjb250aW51ZSBzdGF0ZW1lbnQuIFRoZSBbbGFiZWxOb2RlXSBpcyB0aGUgbGFiZWwgY29udGFpbmVkIGluCisgIC8vLyB0aGF0IHN0YXRlbWVudCAoaWYgYW55KS4gVGhlIGZsYWcgW2lzQ29udGludWVdIGlzIGB0cnVlYCBpZiB0aGUgbm9kZSBiZWluZworICAvLy8gdmlzaXRlZCBpcyBhIGNvbnRpbnVlIHN0YXRlbWVudC4KICAgQXN0Tm9kZSBfbG9va3VwQnJlYWtPckNvbnRpbnVlVGFyZ2V0KAogICAgICAgQXN0Tm9kZSBwYXJlbnROb2RlLCBTaW1wbGVJZGVudGlmaWVyIGxhYmVsTm9kZSwgYm9vbCBpc0NvbnRpbnVlKSB7CiAgICAgaWYgKGxhYmVsTm9kZSA9PSBudWxsKSB7CkBAIC0xMDUyLDkgKzEwMjgsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDb250aW51ZXMgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW4gW2Fubm90YXRpb25dLgotICAgKi8KKyAgLy8vIENvbnRpbnVlcyByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBbYW5ub3RhdGlvbl0uCiAgIHZvaWQgX3Jlc29sdmVBbm5vdGF0aW9uRWxlbWVudChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIG5hbWVOb2RlMTsKICAgICBTaW1wbGVJZGVudGlmaWVyIG5hbWVOb2RlMjsKQEAgLTExOTIsMTMgKzExNjYsMTEgQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvKioKLSAgICogR2l2ZW4gYW4gW2FyZ3VtZW50TGlzdF0gYW5kIHRoZSBbZXhlY3V0YWJsZUVsZW1lbnRdIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAqIHVzaW5nIHRob3NlIGFyZ3VtZW50LCBjb21wdXRlIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZQotICAgKiBsaXN0IG9mIGFyZ3VtZW50cy4gQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBjYW5ub3QKLSAgICogYmUgbWF0Y2hlZCB0byBhIHBhcmFtZXRlci4gUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUKLSAgICogYXJndW1lbnRzLCBvciBgbnVsbGAgaWYgbm8gY29ycmVzcG9uZGVuY2UgY291bGQgYmUgY29tcHV0ZWQuCi0gICAqLworICAvLy8gR2l2ZW4gYW4gW2FyZ3VtZW50TGlzdF0gYW5kIHRoZSBbZXhlY3V0YWJsZUVsZW1lbnRdIHRoYXQgd2lsbCBiZSBpbnZva2VkCisgIC8vLyB1c2luZyB0aG9zZSBhcmd1bWVudCwgY29tcHV0ZSB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgY29ycmVzcG9uZCB0bworICAvLy8gdGhlIGxpc3Qgb2YgYXJndW1lbnRzLiBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzCisgIC8vLyBjYW5ub3QgYmUgbWF0Y2hlZCB0byBhIHBhcmFtZXRlci4gUmV0dXJuIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY29ycmVzcG9uZCB0bworICAvLy8gdGhlIGFyZ3VtZW50cywgb3IgYG51bGxgIGlmIG5vIGNvcnJlc3BvbmRlbmNlIGNvdWxkIGJlIGNvbXB1dGVkLgogICBMaXN0PFBhcmFtZXRlckVsZW1lbnQ+IF9yZXNvbHZlQXJndW1lbnRzVG9GdW5jdGlvbigKICAgICAgIEFyZ3VtZW50TGlzdCBhcmd1bWVudExpc3QsIEV4ZWN1dGFibGVFbGVtZW50IGV4ZWN1dGFibGVFbGVtZW50KSB7CiAgICAgaWYgKGV4ZWN1dGFibGVFbGVtZW50ID09IG51bGwpIHsKQEAgLTEyMDgsMjMgKzExODAsMTkgQEAKICAgICByZXR1cm4gX3Jlc29sdmVBcmd1bWVudHNUb1BhcmFtZXRlcnMoYXJndW1lbnRMaXN0LCBwYXJhbWV0ZXJzKTsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiBhbiBbYXJndW1lbnRMaXN0XSBhbmQgdGhlIFtwYXJhbWV0ZXJzXSByZWxhdGVkIHRvIHRoZSBlbGVtZW50IHRoYXQKLSAgICogd2lsbCBiZSBpbnZva2VkIHVzaW5nIHRob3NlIGFyZ3VtZW50cywgY29tcHV0ZSB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQKLSAgICogY29ycmVzcG9uZCB0byB0aGUgbGlzdCBvZiBhcmd1bWVudHMuIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgaWYgYW55IG9mCi0gICAqIHRoZSBhcmd1bWVudHMgY2Fubm90IGJlIG1hdGNoZWQgdG8gYSBwYXJhbWV0ZXIuIFJldHVybiB0aGUgcGFyYW1ldGVycyB0aGF0Ci0gICAqIGNvcnJlc3BvbmQgdG8gdGhlIGFyZ3VtZW50cy4KLSAgICovCisgIC8vLyBHaXZlbiBhbiBbYXJndW1lbnRMaXN0XSBhbmQgdGhlIFtwYXJhbWV0ZXJzXSByZWxhdGVkIHRvIHRoZSBlbGVtZW50IHRoYXQKKyAgLy8vIHdpbGwgYmUgaW52b2tlZCB1c2luZyB0aG9zZSBhcmd1bWVudHMsIGNvbXB1dGUgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0CisgIC8vLyBjb3JyZXNwb25kIHRvIHRoZSBsaXN0IG9mIGFyZ3VtZW50cy4gQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBpZiBhbnkgb2YKKyAgLy8vIHRoZSBhcmd1bWVudHMgY2Fubm90IGJlIG1hdGNoZWQgdG8gYSBwYXJhbWV0ZXIuIFJldHVybiB0aGUgcGFyYW1ldGVycyB0aGF0CisgIC8vLyBjb3JyZXNwb25kIHRvIHRoZSBhcmd1bWVudHMuCiAgIExpc3Q8UGFyYW1ldGVyRWxlbWVudD4gX3Jlc29sdmVBcmd1bWVudHNUb1BhcmFtZXRlcnMoCiAgICAgICBBcmd1bWVudExpc3QgYXJndW1lbnRMaXN0LCBMaXN0PFBhcmFtZXRlckVsZW1lbnQ+IHBhcmFtZXRlcnMpIHsKICAgICByZXR1cm4gUmVzb2x2ZXJWaXNpdG9yLnJlc29sdmVBcmd1bWVudHNUb1BhcmFtZXRlcnMoCiAgICAgICAgIGFyZ3VtZW50TGlzdCwgcGFyYW1ldGVycywgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gW2NvbWJpbmF0b3JzXSBpbiB0aGUgc2NvcGUgb2YgdGhlIGdpdmVuCi0gICAqIFtsaWJyYXJ5XS4KLSAgICovCisgIC8vLyBSZXNvbHZlIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gW2NvbWJpbmF0b3JzXSBpbiB0aGUgc2NvcGUgb2YgdGhlIGdpdmVuCisgIC8vLyBbbGlicmFyeV0uCiAgIHZvaWQgX3Jlc29sdmVDb21iaW5hdG9ycygKICAgICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnksIE5vZGVMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzKSB7CiAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbCkgewpAQCAtMTI1OSwxMCArMTIyNyw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIGEgW25vZGVdIHRoYXQgY2FuIGhhdmUgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGl0LCByZXNvbHZlIHRoZQotICAgKiBhbm5vdGF0aW9ucyBpbiB0aGUgZWxlbWVudCBtb2RlbCByZXByZXNlbnRpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIG5vZGUuCi0gICAqLworICAvLy8gR2l2ZW4gYSBbbm9kZV0gdGhhdCBjYW4gaGF2ZSBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggaXQsIHJlc29sdmUgdGhlCisgIC8vLyBhbm5vdGF0aW9ucyBpbiB0aGUgZWxlbWVudCBtb2RlbCByZXByZXNlbnRpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIG5vZGUuCiAgIHZvaWQgX3Jlc29sdmVNZXRhZGF0YUZvclBhcmFtZXRlcihOb3JtYWxGb3JtYWxQYXJhbWV0ZXIgbm9kZSkgewogICAgIF9yZXNvbHZlQW5ub3RhdGlvbnMobm9kZS5tZXRhZGF0YSk7CiAgIH0KQEAgLTE1NTMsMTEgKzE1MTksOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBnaXZlbiBzaW1wbGUgW2lkZW50aWZpZXJdIGlmIHBvc3NpYmxlLiBSZXR1cm4gdGhlIGVsZW1lbnQgdG8KLSAgICogd2hpY2ggaXQgY291bGQgYmUgcmVzb2x2ZWQsIG9yIGBudWxsYCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuIFRoaXMKLSAgICogZG9lcyBub3QgcmVjb3JkIHRoZSByZXN1bHRzIG9mIHRoZSByZXNvbHV0aW9uLgotICAgKi8KKyAgLy8vIFJlc29sdmUgdGhlIGdpdmVuIHNpbXBsZSBbaWRlbnRpZmllcl0gaWYgcG9zc2libGUuIFJldHVybiB0aGUgZWxlbWVudCB0bworICAvLy8gd2hpY2ggaXQgY291bGQgYmUgcmVzb2x2ZWQsIG9yIGBudWxsYCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuIFRoaXMKKyAgLy8vIGRvZXMgbm90IHJlY29yZCB0aGUgcmVzdWx0cyBvZiB0aGUgcmVzb2x1dGlvbi4KICAgRWxlbWVudCBfcmVzb2x2ZVNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgICAgRWxlbWVudCBlbGVtZW50ID0gX3Jlc29sdmVyLm5hbWVTY29wZS5sb29rdXAoaWRlbnRpZmllciwgX2RlZmluaW5nTGlicmFyeSk7CiAgICAgZWxlbWVudCA9IF9yZXNvbHZlci50b0xlZ2FjeUVsZW1lbnQoZWxlbWVudCk7CkBAIC0xNjMyLDE4ICsxNTk2LDE1IEBACiAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogSWYgdGhlIGdpdmVuIFt0eXBlXSBpcyBhIHR5cGUgcGFyYW1ldGVyLCByZXNvbHZlIGl0IHRvIHRoZSB0eXBlIHRoYXQgc2hvdWxkCi0gICAqIGJlIHVzZWQgd2hlbiBsb29raW5nIHVwIG1lbWJlcnMuIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBvcmlnaW5hbCB0eXBlLgotICAgKi8KKyAgLy8vIElmIHRoZSBnaXZlbiBbdHlwZV0gaXMgYSB0eXBlIHBhcmFtZXRlciwgcmVzb2x2ZSBpdCB0byB0aGUgdHlwZSB0aGF0CisgIC8vLyBzaG91bGQgYmUgdXNlZCB3aGVuIGxvb2tpbmcgdXAgbWVtYmVycy4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIG9yaWdpbmFsCisgIC8vLyB0eXBlLgogICBEYXJ0VHlwZSBfcmVzb2x2ZVR5cGVQYXJhbWV0ZXIoRGFydFR5cGUgdHlwZSkgPT4KICAgICAgIHR5cGU/LnJlc29sdmVUb0JvdW5kKF90eXBlUHJvdmlkZXIub2JqZWN0VHlwZSk7CiAKLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gaXMgYSByZWZlcmVuY2UgdG8gYSBjbGFzcy4gSWYgaXQgaXMKLSAgICogdGhlbiB0aGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNsYXNzIGlzIHJldHVybmVkLCBvdGhlcndpc2UgYG51bGxgIGlzCi0gICAqIHJldHVybmVkLgotICAgKi8KKyAgLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gaXMgYSByZWZlcmVuY2UgdG8gYSBjbGFzcy4gSWYgaXQgaXMKKyAgLy8vIHRoZW4gdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIGBudWxsYCBpcworICAvLy8gcmV0dXJuZWQuCiAgIHN0YXRpYyBDbGFzc0VsZW1lbnQgZ2V0VHlwZVJlZmVyZW5jZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICBpZiAoZXhwcmVzc2lvbiBpcyBJZGVudGlmaWVyKSB7CiAgICAgICBFbGVtZW50IHN0YXRpY0VsZW1lbnQgPSBleHByZXNzaW9uLnN0YXRpY0VsZW1lbnQ7CkBAIC0xNjU0LDEwICsxNjE1LDggQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiBhIFtub2RlXSB0aGF0IGNhbiBoYXZlIGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpdCwgcmVzb2x2ZSB0aGUKLSAgICogYW5ub3RhdGlvbnMgaW4gdGhlIGVsZW1lbnQgbW9kZWwgcmVwcmVzZW50aW5nIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgbm9kZS4KLSAgICovCisgIC8vLyBHaXZlbiBhIFtub2RlXSB0aGF0IGNhbiBoYXZlIGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpdCwgcmVzb2x2ZSB0aGUKKyAgLy8vIGFubm90YXRpb25zIGluIHRoZSBlbGVtZW50IG1vZGVsIHJlcHJlc2VudGluZyB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIG5vZGUuCiAgIHN0YXRpYyB2b2lkIHJlc29sdmVNZXRhZGF0YShBbm5vdGF0ZWROb2RlIG5vZGUpIHsKICAgICBfcmVzb2x2ZUFubm90YXRpb25zKG5vZGUubWV0YWRhdGEpOwogICAgIGlmIChub2RlIGlzIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKQEAgLTE2NzQsMTAgKzE2MzMsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbaWRlbnRpZmllcl0gaXMgdGhlIHJldHVybiB0eXBlIG9mIGEgY29uc3RydWN0b3IKLSAgICogZGVjbGFyYXRpb24uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIHRoZSByZXR1cm4gdHlwZSBvZiBhCisgIC8vLyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi4KICAgc3RhdGljIGJvb2wgX2lzQ29uc3RydWN0b3JSZXR1cm5UeXBlKFNpbXBsZUlkZW50aWZpZXIgaWRlbnRpZmllcikgewogICAgIEFzdE5vZGUgcGFyZW50ID0gaWRlbnRpZmllci5wYXJlbnQ7CiAgICAgaWYgKHBhcmVudCBpcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CkBAIC0xNjg2LDEwICsxNjQzLDggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZhY3RvcnkKLSAgICogY29uc3RydWN0b3IuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZhY3RvcnkKKyAgLy8vIGNvbnN0cnVjdG9yLgogICBzdGF0aWMgYm9vbCBfaXNGYWN0b3J5Q29uc3RydWN0b3JSZXR1cm5UeXBlKFNpbXBsZUlkZW50aWZpZXIgaWRlbnRpZmllcikgewogICAgIEFzdE5vZGUgcGFyZW50ID0gaWRlbnRpZmllci5wYXJlbnQ7CiAgICAgaWYgKHBhcmVudCBpcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CkBAIC0xNjk5LDkgKzE2NTQsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXNvbHZlIGVhY2ggb2YgdGhlIGFubm90YXRpb25zIGluIHRoZSBnaXZlbiBsaXN0IG9mIFthbm5vdGF0aW9uc10uCi0gICAqLworICAvLy8gUmVzb2x2ZSBlYWNoIG9mIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgZ2l2ZW4gbGlzdCBvZiBbYW5ub3RhdGlvbnNdLgogICBzdGF0aWMgdm9pZCBfcmVzb2x2ZUFubm90YXRpb25zKE5vZGVMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zKSB7CiAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gaW4gYW5ub3RhdGlvbnMpIHsKICAgICAgIEVsZW1lbnRBbm5vdGF0aW9uSW1wbCBlbGVtZW50QW5ub3RhdGlvbiA9IGFubm90YXRpb24uZWxlbWVudEFubm90YXRpb247CkBAIC0xNzEwLDEyICsxNjYzLDEwIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBbiBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9vayB1cCBuYW1lcyBpbiB0aGUgbGV4aWNhbCBzY29wZSB3aGVuCi0gKiB0aGVyZSBpcyBubyBpZGVudGlmaWVyIGluIHRoZSBBU1Qgc3RydWN0dXJlLiBUaGVyZSBpcyBubyBpZGVudGlmaWVyIGluIHRoZQotICogQVNUIHdoZW4gdGhlIHBhcnNlciBjb3VsZCBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCBpbnZvY2F0aW9uIGFuZCBhbgotICogaW52b2NhdGlvbiBvZiBhIHRvcC1sZXZlbCBmdW5jdGlvbiBpbXBvcnRlZCB3aXRoIGEgcHJlZml4LgotICovCisvLy8gQW4gaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgbmFtZXMgaW4gdGhlIGxleGljYWwgc2NvcGUgd2hlbgorLy8vIHRoZXJlIGlzIG5vIGlkZW50aWZpZXIgaW4gdGhlIEFTVCBzdHJ1Y3R1cmUuIFRoZXJlIGlzIG5vIGlkZW50aWZpZXIgaW4gdGhlCisvLy8gQVNUIHdoZW4gdGhlIHBhcnNlciBjb3VsZCBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG1ldGhvZCBpbnZvY2F0aW9uIGFuZCBhbgorLy8vIGludm9jYXRpb24gb2YgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gaW1wb3J0ZWQgd2l0aCBhIHByZWZpeC4KIGNsYXNzIFN5bnRoZXRpY0lkZW50aWZpZXIgaW1wbGVtZW50cyBTaW1wbGVJZGVudGlmaWVyIHsKICAgQG92ZXJyaWRlCiAgIGZpbmFsIFN0cmluZyBuYW1lOwpAQCAtMTcyMyw1ICsxNjc0LDUgQEAKICAgU3ludGhldGljSWRlbnRpZmllcih0aGlzLm5hbWUpOwogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VsZW1lbnRfdHlwZV9wcm92aWRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VsZW1lbnRfdHlwZV9wcm92aWRlci5kYXJ0CmluZGV4IGUxYzk5ODUuLmNkNTY3MTkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbGVtZW50X3R5cGVfcHJvdmlkZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF90eXBlX3Byb3ZpZGVyLmRhcnQKQEAgLTU0LDYgKzU0LDkgQEAKICAgRnVuY3Rpb25UeXBlIGdldEV4ZWN1dGFibGVUeXBlKEVsZW1lbnRJbXBsV2l0aEZ1bmN0aW9uVHlwZSBlbGVtZW50KSA9PgogICAgICAgZWxlbWVudC50eXBlSW50ZXJuYWw7CiAKKyAgRGFydFR5cGUgZ2V0RXh0ZW5kZWRUeXBlKEV4dGVuc2lvbkVsZW1lbnRJbXBsIGVsZW1lbnQpID0+CisgICAgICBlbGVtZW50LmV4dGVuZGVkVHlwZUludGVybmFsOworCiAgIC8vLyBRdWVyaWVzIHRoZSB0eXBlIG9mIGEgZmllbGQuCiAgIERhcnRUeXBlIGdldEZpZWxkVHlwZShQcm9wZXJ0eUluZHVjaW5nRWxlbWVudEltcGwgZWxlbWVudCkgPT4KICAgICAgIGVsZW1lbnQudHlwZUludGVybmFsOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0CmluZGV4IDgxNDVjNmEuLmQyNWI5NmQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQKQEAgLTEyLDkgKzEyLDkgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9pbnN0cnVtZW50YXRpb24vaW5zdHJ1bWVudGF0aW9uLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NvdXJjZS9lcnJvcl9wcm9jZXNzb3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFR5cGVTeXN0ZW07CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZ2VuZXJhbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc2VydmljZXMvbGludC5kYXJ0JzsKQEAgLTIxNiw5ICsyMTYsNiBAQAogLy8vIEEgc2V0IG9mIGFuYWx5c2lzIG9wdGlvbnMgdXNlZCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBhbiBhbmFseXNpcwogLy8vIGNvbnRleHQuCiBhYnN0cmFjdCBjbGFzcyBBbmFseXNpc09wdGlvbnMgewotICAvLy8gVGhlIGxlbmd0aCBvZiB0aGUgbGlzdCByZXR1cm5lZCBieSBbc2lnbmF0dXJlXS4KLSAgc3RhdGljIGNvbnN0IGludCBzaWduYXR1cmVMZW5ndGggPSA0OwotCiAgIC8vLyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYHRydWVgIGlmIGFuYWx5c2lzIGlzIHRvIHBhcnNlIGFuZCBhbmFseXplIGZ1bmN0aW9uCiAgIC8vLyBib2RpZXMgZm9yIGEgZ2l2ZW4gc291cmNlLgogICBAZGVwcmVjYXRlZApAQCAtMzgzLDggKzM4MCw4IEBACiAKICAgLy8vIERldGVybWluZSB3aGV0aGVyIHR3byBzaWduYXR1cmVzIHJldHVybmVkIGJ5IFtzaWduYXR1cmVdIGFyZSBlcXVhbC4KICAgc3RhdGljIGJvb2wgc2lnbmF0dXJlc0VxdWFsKFVpbnQzMkxpc3QgYSwgVWludDMyTGlzdCBiKSB7Ci0gICAgYXNzZXJ0KGEubGVuZ3RoID09IHNpZ25hdHVyZUxlbmd0aCk7Ci0gICAgYXNzZXJ0KGIubGVuZ3RoID09IHNpZ25hdHVyZUxlbmd0aCk7CisgICAgYXNzZXJ0KGEubGVuZ3RoID09IEFuYWx5c2lzT3B0aW9uc0ltcGwuc2lnbmF0dXJlTGVuZ3RoKTsKKyAgICBhc3NlcnQoYi5sZW5ndGggPT0gQW5hbHlzaXNPcHRpb25zSW1wbC5zaWduYXR1cmVMZW5ndGgpOwogICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTQwMCw2ICszOTcsOSBAQAogLy8vIEEgc2V0IG9mIGFuYWx5c2lzIG9wdGlvbnMgdXNlZCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBhbiBhbmFseXNpcwogLy8vIGNvbnRleHQuCiBjbGFzcyBBbmFseXNpc09wdGlvbnNJbXBsIGltcGxlbWVudHMgQW5hbHlzaXNPcHRpb25zIHsKKyAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIGxpc3QgcmV0dXJuZWQgYnkgYHNpZ25hdHVyZWAgZ2V0dGVycy4KKyAgc3RhdGljIGNvbnN0IGludCBzaWduYXR1cmVMZW5ndGggPSA0OworCiAgIC8vLyBERVBSRUNBVEVEOiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc291cmNlcyBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUga2VwdCBpbgogICAvLy8gdGhlIGNhY2hlLgogICAvLy8KQEAgLTQwNyw5ICs0MDcsNiBAQAogICBAZGVwcmVjYXRlZAogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ0FDSEVfU0laRSA9IDY0OwogCi0gIC8vLyBUaGUgbGVuZ3RoIG9mIHRoZSBsaXN0IHJldHVybmVkIGJ5IFt1bmxpbmtlZFNpZ25hdHVyZV0uCi0gIHN0YXRpYyBjb25zdCBpbnQgdW5saW5rZWRTaWduYXR1cmVMZW5ndGggPSA0OwotCiAgIC8vLyBBIHByZWRpY2F0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYW5hbHlzaXMgaXMgdG8gcGFyc2UgYW5kIGFuYWx5emUgZnVuY3Rpb24KICAgLy8vIGJvZGllcy4KICAgQGRlcHJlY2F0ZWQKQEAgLTQyMiw2ICs0MTksOSBAQAogICAvLy8gVGhlIGNhY2hlZCBbc2lnbmF0dXJlXS4KICAgVWludDMyTGlzdCBfc2lnbmF0dXJlOwogCisgIC8vLyBUaGUgY2FjaGVkIFtzaWduYXR1cmVGb3JFbGVtZW50c10uCisgIFVpbnQzMkxpc3QgX3NpZ25hdHVyZUZvckVsZW1lbnRzOworCiAgIEBvdmVycmlkZQogICBWZXJzaW9uQ29uc3RyYWludCBzZGtWZXJzaW9uQ29uc3RyYWludDsKIApAQCAtNzcwLDYgKzc3MCwyMyBAQAogICAgIHJldHVybiBfc2lnbmF0dXJlOwogICB9CiAKKyAgVWludDMyTGlzdCBnZXQgc2lnbmF0dXJlRm9yRWxlbWVudHMgeworICAgIGlmIChfc2lnbmF0dXJlRm9yRWxlbWVudHMgPT0gbnVsbCkgeworICAgICAgQXBpU2lnbmF0dXJlIGJ1ZmZlciA9IEFwaVNpZ25hdHVyZSgpOworCisgICAgICAvLyBBcHBlbmQgZmVhdHVyZXMuCisgICAgICBidWZmZXIuYWRkSW50KEV4cGVyaW1lbnRTdGF0dXMua25vd25GZWF0dXJlcy5sZW5ndGgpOworICAgICAgZm9yICh2YXIgZmVhdHVyZSBpbiBFeHBlcmltZW50U3RhdHVzLmtub3duRmVhdHVyZXMudmFsdWVzKSB7CisgICAgICAgIGJ1ZmZlci5hZGRCb29sKGNvbnRleHRGZWF0dXJlcy5pc0VuYWJsZWQoZmVhdHVyZSkpOworICAgICAgfQorCisgICAgICAvLyBIYXNoIGFuZCBjb252ZXJ0IHRvIFVpbnQzMkxpc3QuCisgICAgICBMaXN0PGludD4gYnl0ZXMgPSBidWZmZXIudG9CeXRlTGlzdCgpOworICAgICAgX3NpZ25hdHVyZUZvckVsZW1lbnRzID0gVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKS5idWZmZXIuYXNVaW50MzJMaXN0KCk7CisgICAgfQorICAgIHJldHVybiBfc2lnbmF0dXJlRm9yRWxlbWVudHM7CisgIH0KKwogICBAb3ZlcnJpZGUKICAgYm9vbCBnZXQgc3Ryb25nTW9kZSA9PiB0cnVlOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZXJyb3JfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lcnJvcl92ZXJpZmllci5kYXJ0CmluZGV4IDJjYWI5NjYuLmUyNTY3YzQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lcnJvcl92ZXJpZmllci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lcnJvcl92ZXJpZmllci5kYXJ0CkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvaW5oZXJpdGFuY2VfbWFuYWdlcjMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvdmFyaWFuY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RpYWdub3N0aWMvZGlhZ25vc3RpY19mYWN0b3J5LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKQEAgLTM2LDcgKzM4LDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2phdmFfZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyRXJyb3JDb2RlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zZGsuZGFydCcgc2hvdyBEYXJ0U2RrLCBTZGtMaWJyYXJ5OwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnOwogCkBAIC0xMTIsNTYgKzExMywzNiBAQAogICB9CiB9CiAKLS8qKgotICogQSB2aXNpdG9yIHVzZWQgdG8gdHJhdmVyc2UgYW4gQVNUIHN0cnVjdHVyZSBsb29raW5nIGZvciBhZGRpdGlvbmFsIGVycm9ycyBhbmQKLSAqIHdhcm5pbmdzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBwYXJzZXIgYW5kIHJlc29sdmVyLgotICovCisvLy8gQSB2aXNpdG9yIHVzZWQgdG8gdHJhdmVyc2UgYW4gQVNUIHN0cnVjdHVyZSBsb29raW5nIGZvciBhZGRpdGlvbmFsIGVycm9ycworLy8vIGFuZCB3YXJuaW5ncyBub3QgY292ZXJlZCBieSB0aGUgcGFyc2VyIGFuZCByZXNvbHZlci4KIGNsYXNzIEVycm9yVmVyaWZpZXIgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yPHZvaWQ+IHsKLSAgLyoqCi0gICAqIFRoZSBlcnJvciByZXBvcnRlciBieSB3aGljaCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KLSAgICovCisgIC8vLyBUaGUgZXJyb3IgcmVwb3J0ZXIgYnkgd2hpY2ggZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQuCiAgIGZpbmFsIEVycm9yUmVwb3J0ZXIgX2Vycm9yUmVwb3J0ZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IGxpYnJhcnkgdGhhdCBpcyBiZWluZyBhbmFseXplZC4KLSAgICovCisgIC8vLyBUaGUgY3VycmVudCBsaWJyYXJ5IHRoYXQgaXMgYmVpbmcgYW5hbHl6ZWQuCiAgIGZpbmFsIExpYnJhcnlFbGVtZW50IF9jdXJyZW50TGlicmFyeTsKIAotICAvKioKLSAgICogVGhlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlICdpbnQnLgotICAgKi8KKyAgLy8vIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgdHlwZSAnaW50Jy4KICAgSW50ZXJmYWNlVHlwZSBfaW50VHlwZTsKIAotICAvKioKLSAgICogVGhlIG9wdGlvbnMgZm9yIHZlcmlmaWNhdGlvbi4KLSAgICovCisgIC8vLyBUaGUgb3B0aW9ucyBmb3IgdmVyaWZpY2F0aW9uLgogICBBbmFseXNpc09wdGlvbnNJbXBsIF9vcHRpb25zOwogCi0gIC8qKgotICAgKiBUaGUgb2JqZWN0IHByb3ZpZGluZyBhY2Nlc3MgdG8gdGhlIHR5cGVzIGRlZmluZWQgYnkgdGhlIGxhbmd1YWdlLgotICAgKi8KKyAgLy8vIFRoZSBvYmplY3QgcHJvdmlkaW5nIGFjY2VzcyB0byB0aGUgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCiAgIGZpbmFsIFR5cGVQcm92aWRlciBfdHlwZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgdHlwZSBzeXN0ZW0gcHJpbWl0aXZlcwotICAgKi8KKyAgLy8vIFRoZSB0eXBlIHN5c3RlbSBwcmltaXRpdmVzCiAgIFR5cGVTeXN0ZW1JbXBsIF90eXBlU3lzdGVtOwogCi0gIC8qKgotICAgKiBUaGUgbWFuYWdlciBmb3IgdGhlIGluaGVyaXRhbmNlIG1hcHBpbmdzLgotICAgKi8KKyAgLy8vIFRoZSBtYW5hZ2VyIGZvciB0aGUgaW5oZXJpdGFuY2UgbWFwcGluZ3MuCiAgIGZpbmFsIEluaGVyaXRhbmNlTWFuYWdlcjMgX2luaGVyaXRhbmNlTWFuYWdlcjsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGEgY2F0Y2ggY2xhdXNlLgotICAgKgotICAgKiBTZWUgW3Zpc2l0Q2F0Y2hDbGF1c2VdLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZpc2l0b3IgaXMgY3VycmVudGx5IHdpdGhpbiBhIGNhdGNoIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBTZWUgW3Zpc2l0Q2F0Y2hDbGF1c2VdLgogICBib29sIF9pc0luQ2F0Y2hDbGF1c2UgPSBmYWxzZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGEgY29tbWVudC4KLSAgICovCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBjb21tZW50LgogICBib29sIF9pc0luQ29tbWVudCA9IGZhbHNlOwogCiAgIC8vLyBUaGUgc3RhY2sgb2YgZmxhZ3MsIHdoZXJlIGB0cnVlYCBhdCB0aGUgdG9wIChsYXN0KSBvZiB0aGUgc3RhY2sgaW5kaWNhdGVzCkBAIC0xNzAsNjkgKzE1MSw0NyBAQAogICAvLy8gZXRjLgogICBmaW5hbCBMaXN0PGJvb2w+IF9pc0luTGF0ZUxvY2FsVmFyaWFibGUgPSBbZmFsc2VdOwogCi0gIC8qKgotICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBuYXRpdmUgY2xhc3MKLSAgICogZGVjbGFyYXRpb24uCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGEgbmF0aXZlIGNsYXNzCisgIC8vLyBkZWNsYXJhdGlvbi4KICAgYm9vbCBfaXNJbk5hdGl2ZUNsYXNzID0gZmFsc2U7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZpc2l0b3IgaXMgY3VycmVudGx5IHdpdGhpbiBhIHN0YXRpYyB2YXJpYWJsZQotICAgKiBkZWNsYXJhdGlvbi4KLSAgICovCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBzdGF0aWMKKyAgLy8vIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogICBib29sIF9pc0luU3RhdGljVmFyaWFibGVEZWNsYXJhdGlvbiA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gYW4gaW5zdGFuY2UKLSAgICogdmFyaWFibGUgZGVjbGFyYXRpb24sIHdoaWNoIGlzIG5vdCBgbGF0ZWAuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGFuIGluc3RhbmNlCisgIC8vLyB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgd2hpY2ggaXMgbm90IGBsYXRlYC4KICAgYm9vbCBfaXNJbkluc3RhbmNlTm90TGF0ZVZhcmlhYmxlRGVjbGFyYXRpb24gPSBmYWxzZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGEgY29uc3RydWN0b3IKLSAgICogaW5pdGlhbGl6ZXIuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlzaXRvciBpcyBjdXJyZW50bHkgd2l0aGluIGEgY29uc3RydWN0b3IKKyAgLy8vIGluaXRpYWxpemVyLgogICBib29sIF9pc0luQ29uc3RydWN0b3JJbml0aWFsaXplciA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBUaGlzIGlzIHNldCB0byBgdHJ1ZWAgaWZmIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBmdW5jdGlvbiB0eXBlZAotICAgKiBmb3JtYWwgcGFyYW1ldGVyLgotICAgKi8KKyAgLy8vIFRoaXMgaXMgc2V0IHRvIGB0cnVlYCBpZmYgdGhlIHZpc2l0b3IgaXMgY3VycmVudGx5IHdpdGhpbiBhIGZ1bmN0aW9uIHR5cGVkCisgIC8vLyBmb3JtYWwgcGFyYW1ldGVyLgogICBib29sIF9pc0luRnVuY3Rpb25UeXBlZEZvcm1hbFBhcmFtZXRlciA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXNpdG9yIGlzIGN1cnJlbnRseSB3aXRoaW4gY29kZSBpbiB0aGUgU0RLLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZpc2l0b3IgaXMgY3VycmVudGx5IHdpdGhpbiBjb2RlIGluIHRoZSBTREsuCiAgIGJvb2wgX2lzSW5TeXN0ZW1MaWJyYXJ5ID0gZmFsc2U7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgbGlicmFyeSBjb250YWlucyBhdCBsZWFzdCBvbmUgaW1wb3J0Ci0gICAqIGRpcmVjdGl2ZSB3aXRoIGEgVVJJIHRoYXQgdXNlcyB0aGUgImRhcnQtZXh0IiBzY2hlbWUuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudCBsaWJyYXJ5IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBpbXBvcnQKKyAgLy8vIGRpcmVjdGl2ZSB3aXRoIGEgVVJJIHRoYXQgdXNlcyB0aGUgImRhcnQtZXh0IiBzY2hlbWUuCiAgIGJvb2wgX2hhc0V4dFVyaSA9IGZhbHNlOwogCi0gIC8qKgotICAgKiBUaGUgY2xhc3MgY29udGFpbmluZyB0aGUgQVNUIG5vZGVzIGJlaW5nIHZpc2l0ZWQsIG9yIGBudWxsYCBpZiB3ZSBhcmUgbm90Ci0gICAqIGluIHRoZSBzY29wZSBvZiBhIGNsYXNzLgotICAgKi8KKyAgLy8vIFRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBBU1Qgbm9kZXMgYmVpbmcgdmlzaXRlZCwgb3IgYG51bGxgIGlmIHdlIGFyZSBub3QKKyAgLy8vIGluIHRoZSBzY29wZSBvZiBhIGNsYXNzLgogICBDbGFzc0VsZW1lbnRJbXBsIF9lbmNsb3NpbmdDbGFzczsKIAotICAvKioKLSAgICogVGhlIGVudW0gY29udGFpbmluZyB0aGUgQVNUIG5vZGVzIGJlaW5nIHZpc2l0ZWQsIG9yIGBudWxsYCBpZiB3ZSBhcmUgbm90Ci0gICAqIGluIHRoZSBzY29wZSBvZiBhbiBlbnVtLgotICAgKi8KKyAgLy8vIFRoZSBlbnVtIGNvbnRhaW5pbmcgdGhlIEFTVCBub2RlcyBiZWluZyB2aXNpdGVkLCBvciBgbnVsbGAgaWYgd2UgYXJlIG5vdAorICAvLy8gaW4gdGhlIHNjb3BlIG9mIGFuIGVudW0uCiAgIENsYXNzRWxlbWVudCBfZW5jbG9zaW5nRW51bTsKIAotICAvKioKLSAgICogVGhlIGVsZW1lbnQgb2YgdGhlIGV4dGVuc2lvbiBiZWluZyB2aXNpdGVkLCBvciBgbnVsbGAgaWYgd2UgYXJlIG5vdAotICAgKiBpbiB0aGUgc2NvcGUgb2YgYW4gZXh0ZW5zaW9uLgotICAgKi8KKyAgLy8vIFRoZSBlbGVtZW50IG9mIHRoZSBleHRlbnNpb24gYmVpbmcgdmlzaXRlZCwgb3IgYG51bGxgIGlmIHdlIGFyZSBub3QKKyAgLy8vIGluIHRoZSBzY29wZSBvZiBhbiBleHRlbnNpb24uCiAgIEV4dGVuc2lvbkVsZW1lbnQgX2VuY2xvc2luZ0V4dGVuc2lvbjsKIAotICAvKioKLSAgICogVGhlIGNvbnRleHQgb2YgdGhlIG1ldGhvZCBvciBmdW5jdGlvbiB0aGF0IHdlIGFyZSBjdXJyZW50bHkgdmlzaXRpbmcsIG9yCi0gICAqIGBudWxsYCBpZiB3ZSBhcmUgbm90IGluc2lkZSBhIG1ldGhvZCBvciBmdW5jdGlvbi4KLSAgICovCisgIC8vLyBUaGUgY29udGV4dCBvZiB0aGUgbWV0aG9kIG9yIGZ1bmN0aW9uIHRoYXQgd2UgYXJlIGN1cnJlbnRseSB2aXNpdGluZywgb3IKKyAgLy8vIGBudWxsYCBpZiB3ZSBhcmUgbm90IGluc2lkZSBhIG1ldGhvZCBvciBmdW5jdGlvbi4KICAgRW5jbG9zaW5nRXhlY3V0YWJsZUNvbnRleHQgX2VuY2xvc2luZ0V4ZWN1dGFibGUgPQogICAgICAgRW5jbG9zaW5nRXhlY3V0YWJsZUNvbnRleHQuZW1wdHkoKTsKIApAQCAtMjUzLDEwICsyMTIsOCBAQAogICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gX25hbWVzRm9yUmVmZXJlbmNlVG9EZWNsYXJlZFZhcmlhYmxlSW5Jbml0aWFsaXplciA9CiAgICAgICBIYXNoU2V0PFN0cmluZz4oKTsKIAotICAvKioKLSAgICogVGhlIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIGluIHRoZSBjdXJyZW50IHNjb3BlLCBidXQgcmlnaHQKLSAgICogbm93IGFyZSBub3QgZGVjbGFyZWQuCi0gICAqLworICAvLy8gVGhlIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIGluIHRoZSBjdXJyZW50IHNjb3BlLCBidXQgcmlnaHQKKyAgLy8vIG5vdyBhcmUgbm90IGRlY2xhcmVkLgogICBIaWRkZW5FbGVtZW50cyBfaGlkZGVuRWxlbWVudHM7CiAKICAgZmluYWwgX1VuaW5zdGFudGlhdGVkQm91bmRDaGVja2VyIF91bmluc3RhbnRpYXRlZEJvdW5kQ2hlY2tlcjsKQEAgLTI3MCw5ICsyMjcsNyBAQAogICBDb25zdHJ1Y3RvckZpZWxkc1ZlcmlmaWVyIF9jb25zdHJ1Y3RvckZpZWxkc1ZlcmlmaWVyOwogICBSZXR1cm5UeXBlVmVyaWZpZXIgX3JldHVyblR5cGVWZXJpZmllcjsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZXJyb3IgdmVyaWZpZXIuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZXJyb3IgdmVyaWZpZXIuCiAgIEVycm9yVmVyaWZpZXIoRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyLCB0aGlzLl9jdXJyZW50TGlicmFyeSwKICAgICAgIHRoaXMuX3R5cGVQcm92aWRlciwgdGhpcy5faW5oZXJpdGFuY2VNYW5hZ2VyKQogICAgICAgOiBfZXJyb3JSZXBvcnRlciA9IGVycm9yUmVwb3J0ZXIsCkBAIC0zMDQsMTQgKzI1OSwxMiBAQAogCiAgIENsYXNzRWxlbWVudCBnZXQgZW5jbG9zaW5nQ2xhc3MgPT4gX2VuY2xvc2luZ0NsYXNzOwogCi0gIC8qKgotICAgKiBGb3IgY29uc3VtZXJzIG9mIGVycm9yIHZlcmlmaWNhdGlvbiBhcyBhIGxpYnJhcnksIChjdXJyZW50bHkganVzdCB0aGUKLSAgICogYW5ndWxhciBwbHVnaW4pLCBleHBvc2UgYSBzZXR0ZXIgdGhhdCBjYW4gbWFrZSB0aGUgZXJyb3JzIHJlcG9ydGVkIG1vcmUKLSAgICogYWNjdXJhdGUgd2hlbiBkYW5nbGluZyBjb2RlIHNuaXBwZXRzIGFyZSBiZWluZyByZXNvbHZlZCBmcm9tIGEgY2xhc3MKLSAgICogY29udGV4dC4gTm90ZSB0aGF0IHRoaXMgc2V0dGVyIGlzIHZlcnkgZGVmZW5zaXZlIGZvciBwb3RlbnRpYWwgbWlzdXNlOyBpdAotICAgKiBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGluIHRoZSBtaWRkbGUgb2YgdmlzaXRpbmcgYSB0cmVlIGFuZCByZXF1aXJlcyBhbgotICAgKiBhbmFseXplci1wcm92aWRlZCBJbXBsIGluc3RhbmNlIHRvIHdvcmsuCi0gICAqLworICAvLy8gRm9yIGNvbnN1bWVycyBvZiBlcnJvciB2ZXJpZmljYXRpb24gYXMgYSBsaWJyYXJ5LCAoY3VycmVudGx5IGp1c3QgdGhlCisgIC8vLyBhbmd1bGFyIHBsdWdpbiksIGV4cG9zZSBhIHNldHRlciB0aGF0IGNhbiBtYWtlIHRoZSBlcnJvcnMgcmVwb3J0ZWQgbW9yZQorICAvLy8gYWNjdXJhdGUgd2hlbiBkYW5nbGluZyBjb2RlIHNuaXBwZXRzIGFyZSBiZWluZyByZXNvbHZlZCBmcm9tIGEgY2xhc3MKKyAgLy8vIGNvbnRleHQuIE5vdGUgdGhhdCB0aGlzIHNldHRlciBpcyB2ZXJ5IGRlZmVuc2l2ZSBmb3IgcG90ZW50aWFsIG1pc3VzZTsgaXQKKyAgLy8vIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgaW4gdGhlIG1pZGRsZSBvZiB2aXNpdGluZyBhIHRyZWUgYW5kIHJlcXVpcmVzIGFuCisgIC8vLyBhbmFseXplci1wcm92aWRlZCBJbXBsIGluc3RhbmNlIHRvIHdvcmsuCiAgIHNldCBlbmNsb3NpbmdDbGFzcyhDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50KSB7CiAgICAgYXNzZXJ0KGNsYXNzRWxlbWVudCBpcyBDbGFzc0VsZW1lbnRJbXBsKTsKICAgICBhc3NlcnQoX2VuY2xvc2luZ0NsYXNzID09IG51bGwpOwpAQCAtMTI3NywxMCArMTIzMCw4IEBACiAgICAgc3VwZXIudmlzaXRXaXRoQ2xhdXNlKG5vZGUpOwogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrcyB0aGUgY2xhc3MgZm9yIHByb2JsZW1zIHdpdGggdGhlIHN1cGVyY2xhc3MsIG1peGlucywgb3IgaW1wbGVtZW50ZWQKLSAgICogaW50ZXJmYWNlcy4KLSAgICovCisgIC8vLyBDaGVja3MgdGhlIGNsYXNzIGZvciBwcm9ibGVtcyB3aXRoIHRoZSBzdXBlcmNsYXNzLCBtaXhpbnMsIG9yIGltcGxlbWVudGVkCisgIC8vLyBpbnRlcmZhY2VzLgogICB2b2lkIF9jaGVja0NsYXNzSW5oZXJpdGFuY2UoCiAgICAgICBOYW1lZENvbXBpbGF0aW9uVW5pdE1lbWJlciBub2RlLAogICAgICAgVHlwZU5hbWUgc3VwZXJjbGFzcywKQEAgLTEzMDMsMTIgKzEyNTQsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogR2l2ZW4gYSBsaXN0IG9mIFtkaXJlY3RpdmVzXSB0aGF0IGhhdmUgdGhlIHNhbWUgcHJlZml4LCBnZW5lcmF0ZSBhbiBlcnJvcgotICAgKiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGltcG9ydCBhbmQgYW55IG9mIHRob3NlIGltcG9ydHMgaXMgZGVmZXJyZWQuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU0hBUkVEX0RFRkVSUkVEX1BSRUZJWF0uCi0gICAqLworICAvLy8gR2l2ZW4gYSBsaXN0IG9mIFtkaXJlY3RpdmVzXSB0aGF0IGhhdmUgdGhlIHNhbWUgcHJlZml4LCBnZW5lcmF0ZSBhbiBlcnJvcgorICAvLy8gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBpbXBvcnQgYW5kIGFueSBvZiB0aG9zZSBpbXBvcnRzIGlzIGRlZmVycmVkLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU0hBUkVEX0RFRkVSUkVEX1BSRUZJWF0uCiAgIHZvaWQgX2NoZWNrRGVmZXJyZWRQcmVmaXhDb2xsaXNpb24oTGlzdDxJbXBvcnREaXJlY3RpdmU+IGRpcmVjdGl2ZXMpIHsKICAgICBpbnQgY291bnQgPSBkaXJlY3RpdmVzLmxlbmd0aDsKICAgICBpZiAoY291bnQgPiAxKSB7CkBAIC0xMzIyLDEyICsxMjcxLDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IGFsbCBjbGFzc2VzIG9mIHRoZSBnaXZlbiBbd2l0aENsYXVzZV0gYXJlIHZhbGlkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1JWElOX0NMQVNTX0RFQ0xBUkVTX0NPTlNUUlVDVE9SXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1JWElOX0lOSEVSSVRTX0ZST01fTk9UX09CSkVDVF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgYWxsIGNsYXNzZXMgb2YgdGhlIGdpdmVuIFt3aXRoQ2xhdXNlXSBhcmUgdmFsaWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9DTEFTU19ERUNMQVJFU19DT05TVFJVQ1RPUl0sCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTUlYSU5fSU5IRVJJVFNfRlJPTV9OT1RfT0JKRUNUXS4KICAgYm9vbCBfY2hlY2tGb3JBbGxNaXhpbkVycm9yQ29kZXMoV2l0aENsYXVzZSB3aXRoQ2xhdXNlKSB7CiAgICAgaWYgKHdpdGhDbGF1c2UgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM3Myw5ICsxMzIwLDcgQEAKICAgICByZXR1cm4gcHJvYmxlbVJlcG9ydGVkOwogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIGZvciBlcnJvcnMgcmVsYXRlZCB0byB0aGUgcmVkaXJlY3RlZCBjb25zdHJ1Y3RvcnMuCi0gICAqLworICAvLy8gQ2hlY2sgZm9yIGVycm9ycyByZWxhdGVkIHRvIHRoZSByZWRpcmVjdGVkIGNvbnN0cnVjdG9ycy4KICAgdm9pZCBfY2hlY2tGb3JBbGxSZWRpcmVjdENvbnN0cnVjdG9yRXJyb3JDb2RlcygKICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAvLyBQcmVwYXJlIHJlZGlyZWN0ZWQgY29uc3RydWN0b3Igbm9kZQpAQCAtMTQyOCwxNSArMTM3MywxMyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZXhwb3J0IG5hbWVzcGFjZSBvZiB0aGUgZ2l2ZW4gZXhwb3J0IFtkaXJlY3RpdmVdIGRvZXMgbm90Ci0gICAqIGV4cG9ydCBhbnkgbmFtZSBhbHJlYWR5IGV4cG9ydGVkIGJ5IGFub3RoZXIgZXhwb3J0IGRpcmVjdGl2ZS4gVGhlCi0gICAqIFtleHBvcnRFbGVtZW50XSBpcyB0aGUgW0V4cG9ydEVsZW1lbnRdIHJldHJpZXZlZCBmcm9tIHRoZSBub2RlLiBJZiB0aGUKLSAgICogZWxlbWVudCBpbiB0aGUgbm9kZSB3YXMgYG51bGxgLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQuIFRoZQotICAgKiBbZXhwb3J0ZWRMaWJyYXJ5XSBpcyB0aGUgbGlicmFyeSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGV4cG9ydGVkIGVsZW1lbnQuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQU1CSUdVT1VTX0VYUE9SVF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGV4cG9ydCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuIGV4cG9ydCBbZGlyZWN0aXZlXSBkb2VzIG5vdAorICAvLy8gZXhwb3J0IGFueSBuYW1lIGFscmVhZHkgZXhwb3J0ZWQgYnkgYW5vdGhlciBleHBvcnQgZGlyZWN0aXZlLiBUaGUKKyAgLy8vIFtleHBvcnRFbGVtZW50XSBpcyB0aGUgW0V4cG9ydEVsZW1lbnRdIHJldHJpZXZlZCBmcm9tIHRoZSBub2RlLiBJZiB0aGUKKyAgLy8vIGVsZW1lbnQgaW4gdGhlIG5vZGUgd2FzIGBudWxsYCwgdGhlbiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLiBUaGUKKyAgLy8vIFtleHBvcnRlZExpYnJhcnldIGlzIHRoZSBsaWJyYXJ5IGVsZW1lbnQgY29udGFpbmluZyB0aGUgZXhwb3J0ZWQgZWxlbWVudC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkFNQklHVU9VU19FWFBPUlRdLgogICB2b2lkIF9jaGVja0ZvckFtYmlndW91c0V4cG9ydChFeHBvcnREaXJlY3RpdmUgZGlyZWN0aXZlLAogICAgICAgRXhwb3J0RWxlbWVudCBleHBvcnRFbGVtZW50LCBMaWJyYXJ5RWxlbWVudCBleHBvcnRlZExpYnJhcnkpIHsKICAgICBpZiAoZXhwb3J0ZWRMaWJyYXJ5ID09IG51bGwpIHsKQEAgLTE0NjMsMTAgKzE0MDYsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGUgZ2l2ZW4gbm9kZSB0byBzZWUgd2hldGhlciBpdCB3YXMgYW1iaWd1b3VzIGJlY2F1c2UgdGhlIG5hbWUgd2FzCi0gICAqIGltcG9ydGVkIGZyb20gdHdvIG9yIG1vcmUgaW1wb3J0cy4KLSAgICovCisgIC8vLyBDaGVjayB0aGUgZ2l2ZW4gbm9kZSB0byBzZWUgd2hldGhlciBpdCB3YXMgYW1iaWd1b3VzIGJlY2F1c2UgdGhlIG5hbWUgd2FzCisgIC8vLyBpbXBvcnRlZCBmcm9tIHR3byBvciBtb3JlIGltcG9ydHMuCiAgIHZvaWQgX2NoZWNrRm9yQW1iaWd1b3VzSW1wb3J0KFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgewogICAgIEVsZW1lbnQgZWxlbWVudCA9IG5vZGUuc3RhdGljRWxlbWVudDsKICAgICBpZiAoZWxlbWVudCBpcyBNdWx0aXBseURlZmluZWRFbGVtZW50SW1wbCkgewpAQCAtMTQ4MywxMiArMTQyNCwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dIGNhbiBiZSBhc3NpZ25lZCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgKiBwYXJhbWV0ZXJzLiBUaGUgW2V4cGVjdGVkU3RhdGljVHlwZV0gaXMgdGhlIGV4cGVjdGVkIHN0YXRpYyB0eXBlIG9mIHRoZQotICAgKiBwYXJhbWV0ZXIuIFRoZSBbYWN0dWFsU3RhdGljVHlwZV0gaXMgdGhlIGFjdHVhbCBzdGF0aWMgdHlwZSBvZiB0aGUKLSAgICogYXJndW1lbnQuCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFtleHByZXNzaW9uXSBjYW4gYmUgYXNzaWduZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHBhcmFtZXRlcnMuIFRoZSBbZXhwZWN0ZWRTdGF0aWNUeXBlXSBpcyB0aGUgZXhwZWN0ZWQgc3RhdGljIHR5cGUgb2YgdGhlCisgIC8vLyBwYXJhbWV0ZXIuIFRoZSBbYWN0dWFsU3RhdGljVHlwZV0gaXMgdGhlIGFjdHVhbCBzdGF0aWMgdHlwZSBvZiB0aGUKKyAgLy8vIGFyZ3VtZW50LgogICB2b2lkIF9jaGVja0ZvckFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUoCiAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgICBEYXJ0VHlwZSBleHBlY3RlZFN0YXRpY1R5cGUsCkBAIC0xNTA1LDE1ICsxNDQ0LDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbYXJndW1lbnRdIGNhbiBiZSBhc3NpZ25lZCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgKiBwYXJhbWV0ZXIuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvCi0gICAqIFtCZXN0UHJhY3RpY2VzVmVyaWZpZXIuY2hlY2tGb3JBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlRm9yQXJndW1lbnRdLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbYXJndW1lbnRdIGNhbiBiZSBhc3NpZ25lZCB0byBpdHMgY29ycmVzcG9uZGluZworICAvLy8gcGFyYW1ldGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvCisgIC8vLyBbQmVzdFByYWN0aWNlc1ZlcmlmaWVyLmNoZWNrRm9yQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZUZvckFyZ3VtZW50XS4KKyAgLy8vCisgIC8vLyBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgogICB2b2lkIF9jaGVja0ZvckFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGVGb3JBcmd1bWVudChFeHByZXNzaW9uIGFyZ3VtZW50LAogICAgICAge2Jvb2wgcHJvbW90ZVBhcmFtZXRlclRvTnVsbGFibGUgPSBmYWxzZX0pIHsKICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgewpAQCAtMTUyOSwzNiArMTQ2NiwzMiBAQAogICAgICAgICBzdGF0aWNQYXJhbWV0ZXJUeXBlLCBTdGF0aWNXYXJuaW5nQ29kZS5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dIGNhbiBiZSBhc3NpZ25lZCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgKiBwYXJhbWV0ZXJzLiBUaGUgW2V4cGVjdGVkU3RhdGljVHlwZV0gaXMgdGhlIGV4cGVjdGVkIHN0YXRpYyB0eXBlLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0bwotICAgKiBbQmVzdFByYWN0aWNlc1ZlcmlmaWVyLmNoZWNrRm9yQXJndW1lbnRUeXBlTm90QXNzaWduYWJsZVdpdGhFeHBlY3RlZFR5cGVzXS4KLSAgICoKLSAgICogU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkxJU1RfRUxFTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSwKLSAgICogW1N0YXRpY1dhcm5pbmdDb2RlLkxJU1RfRUxFTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1BUF9LRVlfVFlQRV9OT1RfQVNTSUdOQUJMRV0sCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5NQVBfVkFMVUVfVFlQRV9OT1RfQVNTSUdOQUJMRV0sCi0gICAqIFtTdGF0aWNXYXJuaW5nQ29kZS5NQVBfS0VZX1RZUEVfTk9UX0FTU0lHTkFCTEVdLCBhbmQKLSAgICogW1N0YXRpY1dhcm5pbmdDb2RlLk1BUF9WQUxVRV9UWVBFX05PVF9BU1NJR05BQkxFXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dIGNhbiBiZSBhc3NpZ25lZCB0byBpdHMgY29ycmVzcG9uZGluZworICAvLy8gcGFyYW1ldGVycy4gVGhlIFtleHBlY3RlZFN0YXRpY1R5cGVdIGlzIHRoZSBleHBlY3RlZCBzdGF0aWMgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0bworICAvLy8gW0Jlc3RQcmFjdGljZXNWZXJpZmllci5jaGVja0ZvckFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGVXaXRoRXhwZWN0ZWRUeXBlc10uCisgIC8vLworICAvLy8gU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSwKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5MSVNUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0sCisgIC8vLyBbU3RhdGljV2FybmluZ0NvZGUuTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1BUF9LRVlfVFlQRV9OT1RfQVNTSUdOQUJMRV0sCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTUFQX1ZBTFVFX1RZUEVfTk9UX0FTU0lHTkFCTEVdLAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLk1BUF9LRVlfVFlQRV9OT1RfQVNTSUdOQUJMRV0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLk1BUF9WQUxVRV9UWVBFX05PVF9BU1NJR05BQkxFXS4KICAgdm9pZCBfY2hlY2tGb3JBcmd1bWVudFR5cGVOb3RBc3NpZ25hYmxlV2l0aEV4cGVjdGVkVHlwZXMoCiAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24sIERhcnRUeXBlIGV4cGVjdGVkU3RhdGljVHlwZSwgRXJyb3JDb2RlIGVycm9yQ29kZSkgewogICAgIF9jaGVja0ZvckFyZ3VtZW50VHlwZU5vdEFzc2lnbmFibGUoCiAgICAgICAgIGV4cHJlc3Npb24sIGV4cGVjdGVkU3RhdGljVHlwZSwgZ2V0U3RhdGljVHlwZShleHByZXNzaW9uKSwgZXJyb3JDb2RlKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgYXJndW1lbnRzIGluIHRoZSBnaXZlbiBbYXJndW1lbnRMaXN0XSBjYW4gYmUgYXNzaWduZWQgdG8KLSAgICogdGhlaXIgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0bwotICAgKiBbQmVzdFByYWN0aWNlc1ZlcmlmaWVyLmNoZWNrRm9yQXJndW1lbnRUeXBlc05vdEFzc2lnbmFibGVJbkxpc3RdLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBhcmd1bWVudHMgaW4gdGhlIGdpdmVuIFthcmd1bWVudExpc3RdIGNhbiBiZSBhc3NpZ25lZCB0bworICAvLy8gdGhlaXIgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvCisgIC8vLyBbQmVzdFByYWN0aWNlc1ZlcmlmaWVyLmNoZWNrRm9yQXJndW1lbnRUeXBlc05vdEFzc2lnbmFibGVJbkxpc3RdLgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0uCiAgIHZvaWQgX2NoZWNrRm9yQXJndW1lbnRUeXBlc05vdEFzc2lnbmFibGVJbkxpc3QoQXJndW1lbnRMaXN0IGFyZ3VtZW50TGlzdCkgewogICAgIGlmIChhcmd1bWVudExpc3QgPT0gbnVsbCkgewogICAgICAgcmV0dXJuOwpAQCAtMTU5MCwxMyArMTUyMywxMSBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gaXMgbm90IGZpbmFsLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkFTU0lHTk1FTlRfVE9fQ09OU1RdLAotICAgKiBbU3RhdGljV2FybmluZ0NvZGUuQVNTSUdOTUVOVF9UT19GSU5BTF0sIGFuZAotICAgKiBbU3RhdGljV2FybmluZ0NvZGUuQVNTSUdOTUVOVF9UT19NRVRIT0RdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gaXMgbm90IGZpbmFsLgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuQVNTSUdOTUVOVF9UT19DT05TVF0sCisgIC8vLyBbU3RhdGljV2FybmluZ0NvZGUuQVNTSUdOTUVOVF9UT19GSU5BTF0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLkFTU0lHTk1FTlRfVE9fTUVUSE9EXS4KICAgdm9pZCBfY2hlY2tGb3JBc3NpZ25tZW50VG9GaW5hbChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnQKICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC0xNjYzLDEwICsxNTk0LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZpZXMgdGhhdCB0aGUgY2xhc3MgaXMgbm90IG5hbWVkIGBGdW5jdGlvbmAgYW5kIHRoYXQgaXQgZG9lc24ndAotICAgKiBleHRlbmRzL2ltcGxlbWVudHMvbWl4ZXMgaW4gYEZ1bmN0aW9uYC4KLSAgICovCisgIC8vLyBWZXJpZmllcyB0aGF0IHRoZSBjbGFzcyBpcyBub3QgbmFtZWQgYEZ1bmN0aW9uYCBhbmQgdGhhdCBpdCBkb2Vzbid0CisgIC8vLyBleHRlbmRzL2ltcGxlbWVudHMvbWl4ZXMgaW4gYEZ1bmN0aW9uYC4KICAgdm9pZCBfY2hlY2tGb3JCYWRGdW5jdGlvblVzZShDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBFeHRlbmRzQ2xhdXNlIGV4dGVuZHNDbGF1c2UgPSBub2RlLmV4dGVuZHNDbGF1c2U7CiAgICAgV2l0aENsYXVzZSB3aXRoQ2xhdXNlID0gbm9kZS53aXRoQ2xhdXNlOwpAQCAtMTY5NSwxNSArMTYyNCwxMyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIG5vdCBhIGtleXdvcmQsIGFuZCBnZW5lcmF0ZXMgdGhlCi0gICAqIGdpdmVuIFtlcnJvckNvZGVdIG9uIHRoZSBpZGVudGlmaWVyIGlmIGl0IGlzIGEga2V5d29yZC4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5CVUlMVF9JTl9JREVOVElGSUVSX0FTX0VYVEVOU0lPTl9OQU1FXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkJVSUxUX0lOX0lERU5USUZJRVJfQVNfVFlQRV9OQU1FXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkJVSUxUX0lOX0lERU5USUZJRVJfQVNfVFlQRV9QQVJBTUVURVJfTkFNRV0sIGFuZAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQlVJTFRfSU5fSURFTlRJRklFUl9BU19UWVBFREVGX05BTUVdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbaWRlbnRpZmllcl0gaXMgbm90IGEga2V5d29yZCwgYW5kIGdlbmVyYXRlcyB0aGUKKyAgLy8vIGdpdmVuIFtlcnJvckNvZGVdIG9uIHRoZSBpZGVudGlmaWVyIGlmIGl0IGlzIGEga2V5d29yZC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkJVSUxUX0lOX0lERU5USUZJRVJfQVNfRVhURU5TSU9OX05BTUVdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkJVSUxUX0lOX0lERU5USUZJRVJfQVNfVFlQRV9OQU1FXSwKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5CVUlMVF9JTl9JREVOVElGSUVSX0FTX1RZUEVfUEFSQU1FVEVSX05BTUVdLCBhbmQKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5CVUlMVF9JTl9JREVOVElGSUVSX0FTX1RZUEVERUZfTkFNRV0uCiAgIHZvaWQgX2NoZWNrRm9yQnVpbHRJbklkZW50aWZpZXJBc05hbWUoCiAgICAgICBTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIsIEVycm9yQ29kZSBlcnJvckNvZGUpIHsKICAgICBUb2tlbiB0b2tlbiA9IGlkZW50aWZpZXIudG9rZW47CkBAIC0xNzEzLDEyICsxNjQwLDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbc3dpdGNoQ2FzZV0gaXMgdGVybWluYXRlZCB3aXRoICdicmVhaycsICdjb250aW51ZScsCi0gICAqICdyZXR1cm4nIG9yICd0aHJvdycuCi0gICAqCi0gICAqIHNlZSBbU3RhdGljV2FybmluZ0NvZGUuQ0FTRV9CTE9DS19OT1RfVEVSTUlOQVRFRF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFtzd2l0Y2hDYXNlXSBpcyB0ZXJtaW5hdGVkIHdpdGggJ2JyZWFrJywgJ2NvbnRpbnVlJywKKyAgLy8vICdyZXR1cm4nIG9yICd0aHJvdycuCisgIC8vLworICAvLy8gc2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5DQVNFX0JMT0NLX05PVF9URVJNSU5BVEVEXS4KICAgdm9pZCBfY2hlY2tGb3JDYXNlQmxvY2tOb3RUZXJtaW5hdGVkKFN3aXRjaENhc2Ugc3dpdGNoQ2FzZSkgewogICAgIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IHN3aXRjaENhc2Uuc3RhdGVtZW50czsKICAgICBpZiAoc3RhdGVtZW50cy5pc0VtcHR5KSB7CkBAIC0xNzU3LDEyICsxNjgyLDEwIEBACiAgICAgICAgIFN0YXRpY1dhcm5pbmdDb2RlLkNBU0VfQkxPQ0tfTk9UX1RFUk1JTkFURUQsIHN3aXRjaENhc2Uua2V5d29yZCk7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIHN3aXRjaCBjYXNlcyBpbiB0aGUgZ2l2ZW4gc3dpdGNoIFtzdGF0ZW1lbnRdIGFyZSB0ZXJtaW5hdGVkCi0gICAqIHdpdGggJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ3JldGhyb3cnLCAncmV0dXJuJyBvciAndGhyb3cnLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkNBU0VfQkxPQ0tfTk9UX1RFUk1JTkFURURdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBzd2l0Y2ggY2FzZXMgaW4gdGhlIGdpdmVuIHN3aXRjaCBbc3RhdGVtZW50XSBhcmUKKyAgLy8vIHRlcm1pbmF0ZWQgd2l0aCAnYnJlYWsnLCAnY29udGludWUnLCAncmV0aHJvdycsICdyZXR1cm4nIG9yICd0aHJvdycuCisgIC8vLworICAvLy8gU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5DQVNFX0JMT0NLX05PVF9URVJNSU5BVEVEXS4KICAgdm9pZCBfY2hlY2tGb3JDYXNlQmxvY2tzTm90VGVybWluYXRlZChTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICAgaWYgKF9pc05vbk51bGxhYmxlQnlEZWZhdWx0KSByZXR1cm47CiAKQEAgLTE3NzYsMTQgKzE2OTksMTIgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIFtfZW5jbG9zaW5nQ2xhc3NdIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgYW5kIGdldHRlciBwYWlyCi0gICAqIHdpdGggdGhlIHNhbWUgbmFtZSwgdmlhIGluaGVyaXRhbmNlLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTkZMSUNUSU5HX1NUQVRJQ19BTkRfSU5TVEFOQ0VdLAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09ORkxJQ1RJTkdfTUVUSE9EX0FORF9GSUVMRF0sIGFuZAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09ORkxJQ1RJTkdfRklFTERfQU5EX01FVEhPRF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIFtfZW5jbG9zaW5nQ2xhc3NdIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgYW5kIGdldHRlciBwYWlyCisgIC8vLyB3aXRoIHRoZSBzYW1lIG5hbWUsIHZpYSBpbmhlcml0YW5jZS4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTkZMSUNUSU5HX1NUQVRJQ19BTkRfSU5TVEFOQ0VdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTkZMSUNUSU5HX01FVEhPRF9BTkRfRklFTERdLCBhbmQKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05GTElDVElOR19GSUVMRF9BTkRfTUVUSE9EXS4KICAgdm9pZCBfY2hlY2tGb3JDb25mbGljdGluZ0NsYXNzTWVtYmVycygpIHsKICAgICBpZiAoX2VuY2xvc2luZ0NsYXNzID09IG51bGwpIHsKICAgICAgIHJldHVybjsKQEAgLTE4NDUsMTMgKzE3NjYsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IGFsbCBjb25mbGljdHMgYmV0d2VlbiB0eXBlIHZhcmlhYmxlIGFuZCBlbmNsb3NpbmcgY2xhc3MuCi0gICAqIFRPRE8oc2NoZWdsb3YpCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfQ0xBU1NdLCBhbmQKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTkZMSUNUSU5HX1RZUEVfVkFSSUFCTEVfQU5EX01FTUJFUl0uCi0gICAqLworICAvLy8gVmVyaWZ5IGFsbCBjb25mbGljdHMgYmV0d2VlbiB0eXBlIHZhcmlhYmxlIGFuZCBlbmNsb3NpbmcgY2xhc3MuCisgIC8vLyBUT0RPKHNjaGVnbG92KQorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09ORkxJQ1RJTkdfVFlQRV9WQVJJQUJMRV9BTkRfQ0xBU1NdLCBhbmQKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05GTElDVElOR19UWVBFX1ZBUklBQkxFX0FORF9NRU1CRVJdLgogICB2b2lkIF9jaGVja0ZvckNvbmZsaWN0aW5nQ2xhc3NUeXBlVmFyaWFibGVFcnJvckNvZGVzKCkgewogICAgIGZvciAoVHlwZVBhcmFtZXRlckVsZW1lbnQgdHlwZVBhcmFtZXRlciBpbiBfZW5jbG9zaW5nQ2xhc3MudHlwZVBhcmFtZXRlcnMpIHsKICAgICAgIFN0cmluZyBuYW1lID0gdHlwZVBhcmFtZXRlci5uYW1lOwpAQCAtMTk5OSwxMSArMTkxOCw5IEBACiAgICAgICAgIFtzdXBlcnR5cGVdKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCBpZiB0aGUgZ2l2ZW4gW2NvbnN0cnVjdG9yXSBkZWNsYXJhdGlvbiBpcyAnY29uc3QnIHRoZW4gdGhlcmUKLSAgICogYXJlIG5vIG5vbi1maW5hbCBpbnN0YW5jZSB2YXJpYWJsZS4gVGhlIFtjb25zdHJ1Y3RvckVsZW1lbnRdIGlzIHRoZQotICAgKiBjb25zdHJ1Y3RvciBlbGVtZW50LgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IGlmIHRoZSBnaXZlbiBbY29uc3RydWN0b3JdIGRlY2xhcmF0aW9uIGlzICdjb25zdCcgdGhlbiB0aGVyZQorICAvLy8gYXJlIG5vIG5vbi1maW5hbCBpbnN0YW5jZSB2YXJpYWJsZS4gVGhlIFtjb25zdHJ1Y3RvckVsZW1lbnRdIGlzIHRoZQorICAvLy8gY29uc3RydWN0b3IgZWxlbWVudC4KICAgdm9pZCBfY2hlY2tGb3JDb25zdENvbnN0cnVjdG9yV2l0aE5vbkZpbmFsRmllbGQoCiAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yLAogICAgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yRWxlbWVudCkgewpAQCAtMjAyNCwxNCArMTk0MSwxMiBAQAogICAgICAgICBjb25zdHJ1Y3Rvcik7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuICdjb25zdCcgaW5zdGFuY2UgY3JlYXRpb24gW2V4cHJlc3Npb25dIGlzIG5vdAotICAgKiBjcmVhdGluZyBhIGRlZmVycmVkIHR5cGUuIFRoZSBbY29uc3RydWN0b3JOYW1lXSBpcyB0aGUgY29uc3RydWN0b3IgbmFtZSwKLSAgICogYWx3YXlzIG5vbi1gbnVsbGAuIFRoZSBbdHlwZU5hbWVdIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlZmluaW5nIHRoZQotICAgKiBjb25zdHJ1Y3RvciwgYWx3YXlzIG5vbi1gbnVsbGAuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfREVGRVJSRURfQ0xBU1NdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiAnY29uc3QnIGluc3RhbmNlIGNyZWF0aW9uIFtleHByZXNzaW9uXSBpcyBub3QKKyAgLy8vIGNyZWF0aW5nIGEgZGVmZXJyZWQgdHlwZS4gVGhlIFtjb25zdHJ1Y3Rvck5hbWVdIGlzIHRoZSBjb25zdHJ1Y3RvciBuYW1lLAorICAvLy8gYWx3YXlzIG5vbi1gbnVsbGAuIFRoZSBbdHlwZU5hbWVdIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlZmluaW5nIHRoZQorICAvLy8gY29uc3RydWN0b3IsIGFsd2F5cyBub24tYG51bGxgLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfREVGRVJSRURfQ0xBU1NdLgogICB2b2lkIF9jaGVja0ZvckNvbnN0RGVmZXJyZWRDbGFzcyhJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICAgQ29uc3RydWN0b3JOYW1lIGNvbnN0cnVjdG9yTmFtZSwgVHlwZU5hbWUgdHlwZU5hbWUpIHsKICAgICBpZiAodHlwZU5hbWUuaXNEZWZlcnJlZCkgewpAQCAtMjA0MiwxMiArMTk1NywxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gdGhyb3cgW2V4cHJlc3Npb25dIGlzIG5vdCBlbmNsb3NlZCBpbiBhICdjb25zdCcKLSAgICogY29uc3RydWN0b3IgZGVjbGFyYXRpb24uCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfQ09OU1RSVUNUT1JfVEhST1dTX0VYQ0VQVElPTl0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIHRocm93IFtleHByZXNzaW9uXSBpcyBub3QgZW5jbG9zZWQgaW4gYSAnY29uc3QnCisgIC8vLyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0NPTlNUUlVDVE9SX1RIUk9XU19FWENFUFRJT05dLgogICB2b2lkIF9jaGVja0ZvckNvbnN0RXZhbFRocm93c0V4Y2VwdGlvbihUaHJvd0V4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgIGlmIChfZW5jbG9zaW5nRXhlY3V0YWJsZS5pc0NvbnN0Q29uc3RydWN0b3IpIHsKICAgICAgIF9lcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yRm9yTm9kZSgKQEAgLTIwNTUsMTEgKzE5NjgsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gbm9ybWFsIGZvcm1hbCBbcGFyYW1ldGVyXSBpcyBub3QgJ2NvbnN0Jy4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9GT1JNQUxfUEFSQU1FVEVSXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gbm9ybWFsIGZvcm1hbCBbcGFyYW1ldGVyXSBpcyBub3QgJ2NvbnN0Jy4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0ZPUk1BTF9QQVJBTUVURVJdLgogICB2b2lkIF9jaGVja0ZvckNvbnN0Rm9ybWFsUGFyYW1ldGVyKE5vcm1hbEZvcm1hbFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKICAgICBpZiAocGFyYW1ldGVyLmlzQ29uc3QpIHsKICAgICAgIF9lcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yRm9yTm9kZSgKQEAgLTIwNjcsMTMgKzE5NzgsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGluc3RhbmNlIGNyZWF0aW9uIFtleHByZXNzaW9uXSBpcyBub3QgYmVpbmcgaW52b2tlZAotICAgKiBvbiBhbiBhYnN0cmFjdCBjbGFzcy4gVGhlIFt0eXBlTmFtZV0gaXMgdGhlIFtUeXBlTmFtZV0gb2YgdGhlCi0gICAqIFtDb25zdHJ1Y3Rvck5hbWVdIGZyb20gdGhlIFtJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbl0sIHRoaXMgaXMgdGhlIEFTVAotICAgKiBub2RlIHRoYXQgdGhlIGVycm9yIGlzIGF0dGFjaGVkIHRvLiBUaGUgW3R5cGVdIGlzIHRoZSB0eXBlIGJlaW5nCi0gICAqIGNvbnN0cnVjdGVkIHdpdGggdGhpcyBbSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25dLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBpbnN0YW5jZSBjcmVhdGlvbiBbZXhwcmVzc2lvbl0gaXMgbm90IGJlaW5nIGludm9rZWQKKyAgLy8vIG9uIGFuIGFic3RyYWN0IGNsYXNzLiBUaGUgW3R5cGVOYW1lXSBpcyB0aGUgW1R5cGVOYW1lXSBvZiB0aGUKKyAgLy8vIFtDb25zdHJ1Y3Rvck5hbWVdIGZyb20gdGhlIFtJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbl0sIHRoaXMgaXMgdGhlIEFTVAorICAvLy8gbm9kZSB0aGF0IHRoZSBlcnJvciBpcyBhdHRhY2hlZCB0by4gVGhlIFt0eXBlXSBpcyB0aGUgdHlwZSBiZWluZworICAvLy8gY29uc3RydWN0ZWQgd2l0aCB0aGlzIFtJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbl0uCiAgIHZvaWQgX2NoZWNrRm9yQ29uc3RPck5ld1dpdGhBYnN0cmFjdENsYXNzKAogICAgICAgSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgIFR5cGVOYW1lIHR5cGVOYW1lLApAQCAtMjA5NCwxNSArMjAwMywxMyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgY3JlYXRpb24gW2V4cHJlc3Npb25dIGlzIG5vdCBiZWluZyBpbnZva2VkCi0gICAqIG9uIGFuIGVudW0uIFRoZSBbdHlwZU5hbWVdIGlzIHRoZSBbVHlwZU5hbWVdIG9mIHRoZSBbQ29uc3RydWN0b3JOYW1lXSBmcm9tCi0gICAqIHRoZSBbSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25dLCB0aGlzIGlzIHRoZSBBU1Qgbm9kZSB0aGF0IHRoZSBlcnJvciBpcwotICAgKiBhdHRhY2hlZCB0by4gVGhlIFt0eXBlXSBpcyB0aGUgdHlwZSBiZWluZyBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMKLSAgICogW0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uXS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTlNUQU5USUFURV9FTlVNXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgY3JlYXRpb24gW2V4cHJlc3Npb25dIGlzIG5vdCBiZWluZyBpbnZva2VkCisgIC8vLyBvbiBhbiBlbnVtLiBUaGUgW3R5cGVOYW1lXSBpcyB0aGUgW1R5cGVOYW1lXSBvZiB0aGUgW0NvbnN0cnVjdG9yTmFtZV0gZnJvbQorICAvLy8gdGhlIFtJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbl0sIHRoaXMgaXMgdGhlIEFTVCBub2RlIHRoYXQgdGhlIGVycm9yIGlzCisgIC8vLyBhdHRhY2hlZCB0by4gVGhlIFt0eXBlXSBpcyB0aGUgdHlwZSBiZWluZyBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMKKyAgLy8vIFtJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbl0uCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTlNUQU5USUFURV9FTlVNXS4KICAgdm9pZCBfY2hlY2tGb3JDb25zdE9yTmV3V2l0aEVudW0oSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgIFR5cGVOYW1lIHR5cGVOYW1lLCBJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICBpZiAodHlwZS5lbGVtZW50LmlzRW51bSkgewpAQCAtMjExMSw5ICsyMDE4LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFtleHByZXNzaW9uXSBpcyBub3QgYSBtaXhpbiBpbnN0YW50aWF0aW9uLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gaXMgbm90IGEgbWl4aW4gaW5zdGFudGlhdGlvbi4KICAgdm9pZCBfY2hlY2tGb3JDb25zdE9yTmV3V2l0aE1peGluKEluc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24sCiAgICAgICBUeXBlTmFtZSB0eXBlTmFtZSwgSW50ZXJmYWNlVHlwZSB0eXBlKSB7CiAgICAgaWYgKHR5cGUuZWxlbWVudC5pc01peGluKSB7CkBAIC0yMTIyLDE1ICsyMDI3LDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiAnY29uc3QnIGluc3RhbmNlIGNyZWF0aW9uIFtleHByZXNzaW9uXSBpcyBub3QgYmVpbmcKLSAgICogaW52b2tlZCBvbiBhIGNvbnN0cnVjdG9yIHRoYXQgaXMgbm90ICdjb25zdCcuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgaW5zdGFuY2UgY3JlYXRpb24gd2FzIHRlc3RlZCB0byBiZSAnY29uc3QnCi0gICAqIGJlZm9yZSBiZWluZyBjYWxsZWQuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfV0lUSF9OT05fQ09OU1RdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiAnY29uc3QnIGluc3RhbmNlIGNyZWF0aW9uIFtleHByZXNzaW9uXSBpcyBub3QgYmVpbmcKKyAgLy8vIGludm9rZWQgb24gYSBjb25zdHJ1Y3RvciB0aGF0IGlzIG5vdCAnY29uc3QnLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgaW5zdGFuY2UgY3JlYXRpb24gd2FzIHRlc3RlZCB0byBiZSAnY29uc3QnCisgIC8vLyBiZWZvcmUgYmVpbmcgY2FsbGVkLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfV0lUSF9OT05fQ09OU1RdLgogICB2b2lkIF9jaGVja0ZvckNvbnN0V2l0aE5vbkNvbnN0KEluc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc3RydWN0b3JFbGVtZW50ID0KICAgICAgICAgZXhwcmVzc2lvbi5jb25zdHJ1Y3Rvck5hbWUuc3RhdGljRWxlbWVudDsKQEAgLTIxNDUsMTggKzIwNDgsMTYgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgaWYgdGhlIGdpdmVuICdjb25zdCcgaW5zdGFuY2UgY3JlYXRpb24gW2V4cHJlc3Npb25dIGlzIGJlaW5nCi0gICAqIGludm9rZWQgb24gdGhlIHJlc29sdmVkIGNvbnN0cnVjdG9yLiBUaGUgW2NvbnN0cnVjdG9yTmFtZV0gaXMgdGhlCi0gICAqIGNvbnN0cnVjdG9yIG5hbWUsIGFsd2F5cyBub24tYG51bGxgLiBUaGUgW3R5cGVOYW1lXSBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAgKiBkZWZpbmluZyB0aGUgY29uc3RydWN0b3IsIGFsd2F5cyBub24tYG51bGxgLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIGluc3RhbmNlIGNyZWF0aW9uIHdhcyB0ZXN0ZWQgdG8gYmUgJ2NvbnN0JwotICAgKiBiZWZvcmUgYmVpbmcgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX1dJVEhfVU5ERUZJTkVEX0NPTlNUUlVDVE9SXSwgYW5kCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9XSVRIX1VOREVGSU5FRF9DT05TVFJVQ1RPUl9ERUZBVUxUXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCBpZiB0aGUgZ2l2ZW4gJ2NvbnN0JyBpbnN0YW5jZSBjcmVhdGlvbiBbZXhwcmVzc2lvbl0gaXMgYmVpbmcKKyAgLy8vIGludm9rZWQgb24gdGhlIHJlc29sdmVkIGNvbnN0cnVjdG9yLiBUaGUgW2NvbnN0cnVjdG9yTmFtZV0gaXMgdGhlCisgIC8vLyBjb25zdHJ1Y3RvciBuYW1lLCBhbHdheXMgbm9uLWBudWxsYC4gVGhlIFt0eXBlTmFtZV0gaXMgdGhlIG5hbWUgb2YgdGhlCisgIC8vLyB0eXBlIGRlZmluaW5nIHRoZSBjb25zdHJ1Y3RvciwgYWx3YXlzIG5vbi1gbnVsbGAuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBpbnN0YW5jZSBjcmVhdGlvbiB3YXMgdGVzdGVkIHRvIGJlICdjb25zdCcKKyAgLy8vIGJlZm9yZSBiZWluZyBjYWxsZWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9XSVRIX1VOREVGSU5FRF9DT05TVFJVQ1RPUl0sIGFuZAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX1dJVEhfVU5ERUZJTkVEX0NPTlNUUlVDVE9SX0RFRkFVTFRdLgogICB2b2lkIF9jaGVja0ZvckNvbnN0V2l0aFVuZGVmaW5lZENvbnN0cnVjdG9yKAogICAgICAgSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbiwKICAgICAgIENvbnN0cnVjdG9yTmFtZSBjb25zdHJ1Y3Rvck5hbWUsCkBAIC0yMjAwLDEyICsyMTAxLDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBkZWZhdWx0IGZvcm1hbCBbcGFyYW1ldGVyXSBpcyBub3QgcGFydCBvZiBhIGZ1bmN0aW9uCi0gICAqIHR5cGVkIHBhcmFtZXRlci4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5ERUZBVUxUX1ZBTFVFX0lOX0ZVTkNUSU9OX1RZUEVEX1BBUkFNRVRFUl0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGRlZmF1bHQgZm9ybWFsIFtwYXJhbWV0ZXJdIGlzIG5vdCBwYXJ0IG9mIGEgZnVuY3Rpb24KKyAgLy8vIHR5cGVkIHBhcmFtZXRlci4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkRFRkFVTFRfVkFMVUVfSU5fRlVOQ1RJT05fVFlQRURfUEFSQU1FVEVSXS4KICAgdm9pZCBfY2hlY2tGb3JEZWZhdWx0VmFsdWVJbkZ1bmN0aW9uVHlwZWRQYXJhbWV0ZXIoCiAgICAgICBEZWZhdWx0Rm9ybWFsUGFyYW1ldGVyIHBhcmFtZXRlcikgewogICAgIC8vIE9LLCBub3QgaW4gYSBmdW5jdGlvbiB0eXBlZCBwYXJhbWV0ZXIuCkBAIC0yMjIyLDEwICsyMTIxLDggQEAKICAgICAgICAgcGFyYW1ldGVyKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXBvcnQgYSBkaWFnbm9zdGljIGlmIHRoZXJlIGFyZSBhbnkgZXh0ZW5zaW9ucyBpbiB0aGUgaW1wb3J0ZWQgbGlicmFyeQotICAgKiB0aGF0IGFyZSBub3QgaGlkZGVuLgotICAgKi8KKyAgLy8vIFJlcG9ydCBhIGRpYWdub3N0aWMgaWYgdGhlcmUgYXJlIGFueSBleHRlbnNpb25zIGluIHRoZSBpbXBvcnRlZCBsaWJyYXJ5CisgIC8vLyB0aGF0IGFyZSBub3QgaGlkZGVuLgogICB2b2lkIF9jaGVja0ZvckRlZmVycmVkSW1wb3J0T2ZFeHRlbnNpb25zKAogICAgICAgSW1wb3J0RGlyZWN0aXZlIGRpcmVjdGl2ZSwgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50KSB7CiAgICAgZm9yICh2YXIgZWxlbWVudCBpbiBpbXBvcnRFbGVtZW50Lm5hbWVzcGFjZS5kZWZpbmVkTmFtZXMudmFsdWVzKSB7CkBAIC0yMjM5LDEyICsyMTM2LDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IGFueSBkZWZlcnJlZCBpbXBvcnRzIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0gaGF2ZSBhCi0gICAqIHVuaXF1ZSBwcmVmaXguCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU0hBUkVEX0RFRkVSUkVEX1BSRUZJWF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgYW55IGRlZmVycmVkIGltcG9ydHMgaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIFt1bml0XSBoYXZlIGEKKyAgLy8vIHVuaXF1ZSBwcmVmaXguCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5TSEFSRURfREVGRVJSRURfUFJFRklYXS4KICAgdm9pZCBfY2hlY2tGb3JEZWZlcnJlZFByZWZpeENvbGxpc2lvbnMoQ29tcGlsYXRpb25Vbml0IHVuaXQpIHsKICAgICBOb2RlTGlzdDxEaXJlY3RpdmU+IGRpcmVjdGl2ZXMgPSB1bml0LmRpcmVjdGl2ZXM7CiAgICAgaW50IGNvdW50ID0gZGlyZWN0aXZlcy5sZW5ndGg7CkBAIC0yMjc0LDEwICsyMTY5LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgY2FsbGVyIHNob3VsZCBjb250aW51ZSBjaGVja2luZyB0aGUgcmVzdCBvZiB0aGUKLSAgICogaW5mb3JtYXRpb24gaW4gdGhlIGZvci1lYWNoIHBhcnQuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgY2FsbGVyIHNob3VsZCBjb250aW51ZSBjaGVja2luZyB0aGUgcmVzdCBvZiB0aGUKKyAgLy8vIGluZm9ybWF0aW9uIGluIHRoZSBmb3ItZWFjaCBwYXJ0LgogICBib29sIF9jaGVja0ZvckVhY2hQYXJ0cyhGb3JFYWNoUGFydHMgbm9kZSwgU2ltcGxlSWRlbnRpZmllciB2YXJpYWJsZSkgewogICAgIGlmIChfY2hlY2tGb3JVc2VPZlZvaWRSZXN1bHQobm9kZS5pdGVyYWJsZSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIzNjAsMTUgKzIyNTMsMTMgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXhwb3J0IFtkaXJlY3RpdmVdIGhhcyBhIHVuaXF1ZSBuYW1lIGFtb25nIG90aGVyCi0gICAqIGV4cG9ydGVkIGxpYnJhcmllcy4gVGhlIFtleHBvcnRFbGVtZW50XSBpcyB0aGUgW0V4cG9ydEVsZW1lbnRdIHJldHJpZXZlZAotICAgKiBmcm9tIHRoZSBub2RlLCBpZiB0aGUgZWxlbWVudCBpbiB0aGUgbm9kZSB3YXMgYG51bGxgLCB0aGVuIHRoaXMgbWV0aG9kIGlzCi0gICAqIG5vdCBjYWxsZWQuIFRoZSBbZXhwb3J0ZWRMaWJyYXJ5XSBpcyB0aGUgbGlicmFyeSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlCi0gICAqIGV4cG9ydGVkIGVsZW1lbnQuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhQT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXhwb3J0IFtkaXJlY3RpdmVdIGhhcyBhIHVuaXF1ZSBuYW1lIGFtb25nIG90aGVyCisgIC8vLyBleHBvcnRlZCBsaWJyYXJpZXMuIFRoZSBbZXhwb3J0RWxlbWVudF0gaXMgdGhlIFtFeHBvcnRFbGVtZW50XSByZXRyaWV2ZWQKKyAgLy8vIGZyb20gdGhlIG5vZGUsIGlmIHRoZSBlbGVtZW50IGluIHRoZSBub2RlIHdhcyBgbnVsbGAsIHRoZW4gdGhpcyBtZXRob2QgaXMKKyAgLy8vIG5vdCBjYWxsZWQuIFRoZSBbZXhwb3J0ZWRMaWJyYXJ5XSBpcyB0aGUgbGlicmFyeSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlCisgIC8vLyBleHBvcnRlZCBlbGVtZW50LgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhQT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FXS4KICAgdm9pZCBfY2hlY2tGb3JFeHBvcnREdXBsaWNhdGVMaWJyYXJ5TmFtZShFeHBvcnREaXJlY3RpdmUgZGlyZWN0aXZlLAogICAgICAgRXhwb3J0RWxlbWVudCBleHBvcnRFbGVtZW50LCBMaWJyYXJ5RWxlbWVudCBleHBvcnRlZExpYnJhcnkpIHsKICAgICBpZiAoZXhwb3J0ZWRMaWJyYXJ5ID09IG51bGwpIHsKQEAgLTIzOTQsMTQgKzIyODUsMTIgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdGhhdCBpZiB0aGUgdmlzaXRpbmcgbGlicmFyeSBpcyBub3Qgc3lzdGVtLCB0aGVuIGFueSBnaXZlbiBsaWJyYXJ5Ci0gICAqIHNob3VsZCBub3QgYmUgU0RLIGludGVybmFsIGxpYnJhcnkuIFRoZSBbZXhwb3J0RWxlbWVudF0gaXMgdGhlCi0gICAqIFtFeHBvcnRFbGVtZW50XSByZXRyaWV2ZWQgZnJvbSB0aGUgbm9kZSwgaWYgdGhlIGVsZW1lbnQgaW4gdGhlIG5vZGUgd2FzCi0gICAqIGBudWxsYCwgdGhlbiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYUE9SVF9JTlRFUk5BTF9MSUJSQVJZXS4KLSAgICovCisgIC8vLyBDaGVjayB0aGF0IGlmIHRoZSB2aXNpdGluZyBsaWJyYXJ5IGlzIG5vdCBzeXN0ZW0sIHRoZW4gYW55IGdpdmVuIGxpYnJhcnkKKyAgLy8vIHNob3VsZCBub3QgYmUgU0RLIGludGVybmFsIGxpYnJhcnkuIFRoZSBbZXhwb3J0RWxlbWVudF0gaXMgdGhlCisgIC8vLyBbRXhwb3J0RWxlbWVudF0gcmV0cmlldmVkIGZyb20gdGhlIG5vZGUsIGlmIHRoZSBlbGVtZW50IGluIHRoZSBub2RlIHdhcworICAvLy8gYG51bGxgLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5FWFBPUlRfSU5URVJOQUxfTElCUkFSWV0uCiAgIHZvaWQgX2NoZWNrRm9yRXhwb3J0SW50ZXJuYWxMaWJyYXJ5KAogICAgICAgRXhwb3J0RGlyZWN0aXZlIGRpcmVjdGl2ZSwgRXhwb3J0RWxlbWVudCBleHBvcnRFbGVtZW50KSB7CiAgICAgaWYgKF9pc0luU3lzdGVtTGlicmFyeSkgewpAQCAtMjQzMCw5ICsyMzE5LDcgQEAKICAgICAgICAgW2RpcmVjdGl2ZS51cmldKTsKICAgfQogCi0gIC8qKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYUE9SVF9MRUdBQ1lfU1lNQk9MXS4KLSAgICovCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYUE9SVF9MRUdBQ1lfU1lNQk9MXS4KICAgdm9pZCBfY2hlY2tGb3JFeHBvcnRMZWdhY3lTeW1ib2woRXhwb3J0RGlyZWN0aXZlIG5vZGUpIHsKICAgICBpZiAoIV9pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CiAgICAgICByZXR1cm47CkBAIC0yNDYxLDExICsyMzQ4LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGV4dGVuZHMgW2NsYXVzZV0gZG9lcyBub3QgZXh0ZW5kIGEgZGVmZXJyZWQgY2xhc3MuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhURU5EU19ERUZFUlJFRF9DTEFTU10uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGV4dGVuZHMgW2NsYXVzZV0gZG9lcyBub3QgZXh0ZW5kIGEgZGVmZXJyZWQgY2xhc3MuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5FWFRFTkRTX0RFRkVSUkVEX0NMQVNTXS4KICAgdm9pZCBfY2hlY2tGb3JFeHRlbmRzRGVmZXJyZWRDbGFzcyhUeXBlTmFtZSBzdXBlcmNsYXNzKSB7CiAgICAgaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewogICAgICAgcmV0dXJuOwpAQCAtMjQ3NCwxMiArMjM1OSwxMCBAQAogICAgICAgICBzdXBlcmNsYXNzLCBDb21waWxlVGltZUVycm9yQ29kZS5FWFRFTkRTX0RFRkVSUkVEX0NMQVNTKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5kcyBbY2xhdXNlXSBkb2VzIG5vdCBleHRlbmQgY2xhc3NlcyBzdWNoIGFzCi0gICAqICdudW0nIG9yICdTdHJpbmcnLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYVEVORFNfRElTQUxMT1dFRF9DTEFTU10uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGV4dGVuZHMgW2NsYXVzZV0gZG9lcyBub3QgZXh0ZW5kIGNsYXNzZXMgc3VjaCBhcworICAvLy8gJ251bScgb3IgJ1N0cmluZycuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5FWFRFTkRTX0RJU0FMTE9XRURfQ0xBU1NdLgogICBib29sIF9jaGVja0ZvckV4dGVuZHNEaXNhbGxvd2VkQ2xhc3MoVHlwZU5hbWUgc3VwZXJjbGFzcykgewogICAgIGlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI0ODgsMTggKzIzNzEsMTYgQEAKICAgICAgICAgc3VwZXJjbGFzcywgQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhURU5EU19ESVNBTExPV0VEX0NMQVNTKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW3R5cGVOYW1lXSBkb2VzIG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXhpbgotICAgKiBjbGFzc2VzIHRoYXQgYXJlIGRlZmVycmVkLgotICAgKgotICAgKiBTZWUgW19jaGVja0ZvckV4dGVuZHNEZWZlcnJlZENsYXNzXSwKLSAgICogW19jaGVja0ZvckV4dGVuZHNEZWZlcnJlZENsYXNzSW5UeXBlQWxpYXNdLAotICAgKiBbX2NoZWNrRm9ySW1wbGVtZW50c0RlZmVycmVkQ2xhc3NdLAotICAgKiBbX2NoZWNrRm9yQWxsTWl4aW5FcnJvckNvZGVzXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYVEVORFNfREVGRVJSRURfQ0xBU1NdLAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU1QTEVNRU5UU19ERUZFUlJFRF9DTEFTU10sIGFuZAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTUlYSU5fREVGRVJSRURfQ0xBU1NdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbdHlwZU5hbWVdIGRvZXMgbm90IGV4dGVuZCwgaW1wbGVtZW50IG9yIG1peGluCisgIC8vLyBjbGFzc2VzIHRoYXQgYXJlIGRlZmVycmVkLgorICAvLy8KKyAgLy8vIFNlZSBbX2NoZWNrRm9yRXh0ZW5kc0RlZmVycmVkQ2xhc3NdLAorICAvLy8gW19jaGVja0ZvckV4dGVuZHNEZWZlcnJlZENsYXNzSW5UeXBlQWxpYXNdLAorICAvLy8gW19jaGVja0ZvckltcGxlbWVudHNEZWZlcnJlZENsYXNzXSwKKyAgLy8vIFtfY2hlY2tGb3JBbGxNaXhpbkVycm9yQ29kZXNdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkVYVEVORFNfREVGRVJSRURfQ0xBU1NdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklNUExFTUVOVFNfREVGRVJSRURfQ0xBU1NdLCBhbmQKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9ERUZFUlJFRF9DTEFTU10uCiAgIGJvb2wgX2NoZWNrRm9yRXh0ZW5kc09ySW1wbGVtZW50c0RlZmVycmVkQ2xhc3MoCiAgICAgICBUeXBlTmFtZSB0eXBlTmFtZSwgRXJyb3JDb2RlIGVycm9yQ29kZSkgewogICAgIGlmICh0eXBlTmFtZS5pc1N5bnRoZXRpYykgewpAQCAtMjUxMiwxNSArMjM5MywxMyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW3R5cGVOYW1lXSBkb2VzIG5vdCBleHRlbmQsIGltcGxlbWVudCBvciBtaXhpbgotICAgKiBjbGFzc2VzIHN1Y2ggYXMgJ251bScgb3IgJ1N0cmluZycuCi0gICAqCi0gICAqIFRPRE8oc2NoZWdsb3YpIFJlbW92ZSB0aGlzIG1ldGhvZCwgd2hlbiBhbGwgaW5oZXJpdGFuY2UgLyBvdmVycmlkZQotICAgKiBpcyBjb25jZW50cmF0ZWQuIFdlIGtlZXAgaXQgZm9yIG5vdyBvbmx5IGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IHdoZW4KLSAgICogaW5oZXJpdGFuY2UgaXMgY29tcGxldGVseSB3cm9uZywgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFueXRoaW5nCi0gICAqIGVsc2UuCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFt0eXBlTmFtZV0gZG9lcyBub3QgZXh0ZW5kLCBpbXBsZW1lbnQgb3IgbWl4aW4KKyAgLy8vIGNsYXNzZXMgc3VjaCBhcyAnbnVtJyBvciAnU3RyaW5nJy4KKyAgLy8vCisgIC8vLyBUT0RPKHNjaGVnbG92KSBSZW1vdmUgdGhpcyBtZXRob2QsIHdoZW4gYWxsIGluaGVyaXRhbmNlIC8gb3ZlcnJpZGUKKyAgLy8vIGlzIGNvbmNlbnRyYXRlZC4gV2Uga2VlcCBpdCBmb3Igbm93IG9ubHkgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgd2hlbgorICAvLy8gaW5oZXJpdGFuY2UgaXMgY29tcGxldGVseSB3cm9uZywgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFueXRoaW5nCisgIC8vLyBlbHNlLgogICBib29sIF9jaGVja0ZvckV4dGVuZHNPckltcGxlbWVudHNEaXNhbGxvd2VkQ2xhc3MoCiAgICAgICBUeXBlTmFtZSB0eXBlTmFtZSwgRXJyb3JDb2RlIGVycm9yQ29kZSkgewogICAgIGlmICh0eXBlTmFtZS5pc1N5bnRoZXRpYykgewpAQCAtMjU1MSwxNCArMjQzMCwxMiBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgZmllbGQgW2luaXRpYWxpemVyXSBoYXMgY29tcGF0aWJsZSBmaWVsZAotICAgKiBhbmQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiB0eXBlcy4gVGhlIFtmaWVsZEVsZW1lbnRdIGlzIHRoZSBzdGF0aWMgZWxlbWVudAotICAgKiBmcm9tIHRoZSBuYW1lIGluIHRoZSBbQ29uc3RydWN0b3JGaWVsZEluaXRpYWxpemVyXS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9GSUVMRF9JTklUSUFMSVpFUl9OT1RfQVNTSUdOQUJMRV0sIGFuZAotICAgKiBbU3RhdGljV2FybmluZ0NvZGUuRklFTERfSU5JVElBTElaRVJfTk9UX0FTU0lHTkFCTEVdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmaWVsZCBbaW5pdGlhbGl6ZXJdIGhhcyBjb21wYXRpYmxlIGZpZWxkCisgIC8vLyBhbmQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiB0eXBlcy4gVGhlIFtmaWVsZEVsZW1lbnRdIGlzIHRoZSBzdGF0aWMgZWxlbWVudAorICAvLy8gZnJvbSB0aGUgbmFtZSBpbiB0aGUgW0NvbnN0cnVjdG9yRmllbGRJbml0aWFsaXplcl0uCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9GSUVMRF9JTklUSUFMSVpFUl9OT1RfQVNTSUdOQUJMRV0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLkZJRUxEX0lOSVRJQUxJWkVSX05PVF9BU1NJR05BQkxFXS4KICAgdm9pZCBfY2hlY2tGb3JGaWVsZEluaXRpYWxpemVyTm90QXNzaWduYWJsZSgKICAgICAgIENvbnN0cnVjdG9yRmllbGRJbml0aWFsaXplciBpbml0aWFsaXplciwgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCkgewogICAgIC8vIHByZXBhcmUgZmllbGQgdHlwZQpAQCAtMjYxNCwxMiArMjQ5MSwxMCBAQAogLy8gICAgICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBmaWVsZCBmb3JtYWwgW3BhcmFtZXRlcl0gaXMgaW4gYSBjb25zdHJ1Y3RvcgotICAgKiBkZWNsYXJhdGlvbi4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5GSUVMRF9JTklUSUFMSVpFUl9PVVRTSURFX0NPTlNUUlVDVE9SXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZmllbGQgZm9ybWFsIFtwYXJhbWV0ZXJdIGlzIGluIGEgY29uc3RydWN0b3IKKyAgLy8vIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuRklFTERfSU5JVElBTElaRVJfT1VUU0lERV9DT05TVFJVQ1RPUl0uCiAgIHZvaWQgX2NoZWNrRm9yRmllbGRJbml0aWFsaXppbmdGb3JtYWxSZWRpcmVjdGluZ0NvbnN0cnVjdG9yKAogICAgICAgRmllbGRGb3JtYWxQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CiAgICAgLy8gcHJlcGFyZSB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSBhIENvbnN0cnVjdG9yRGVjbGFyYXRpb24KQEAgLTI2NTMsMTMgKzI1MjgsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIHZhcmlhYmxlIGRlY2xhcmF0aW9uIFtsaXN0XSBoYXMgb25seSBpbml0aWFsaXplZAotICAgKiB2YXJpYWJsZXMgaWYgdGhlIGxpc3QgaXMgZmluYWwgb3IgY29uc3QuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfTk9UX0lOSVRJQUxJWkVEXSwgYW5kCi0gICAqIFtTdGF0aWNXYXJuaW5nQ29kZS5GSU5BTF9OT1RfSU5JVElBTElaRURdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBbbGlzdF0gaGFzIG9ubHkgaW5pdGlhbGl6ZWQKKyAgLy8vIHZhcmlhYmxlcyBpZiB0aGUgbGlzdCBpcyBmaW5hbCBvciBjb25zdC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX05PVF9JTklUSUFMSVpFRF0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLkZJTkFMX05PVF9JTklUSUFMSVpFRF0uCiAgIHZvaWQgX2NoZWNrRm9yRmluYWxOb3RJbml0aWFsaXplZChWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCBsaXN0KSB7CiAgICAgaWYgKF9pc0luTmF0aXZlQ2xhc3MgfHwgbGlzdC5pc1N5bnRoZXRpYykgewogICAgICAgcmV0dXJuOwpAQCAtMjY4NiwxNCArMjU1OSwxMiBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3JzIGluIHRoZSBnaXZlbiBbbWVtYmVyc10sIHZlcmlmeSB0aGF0IGFsbAotICAgKiBmaW5hbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkLiAgQ2FzZXMgaW4gd2hpY2ggdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNvbnN0cnVjdG9yIGFyZSBoYW5kbGVkIGluIFtfY2hlY2tGb3JBbGxGaW5hbEluaXRpYWxpemVkRXJyb3JDb2Rlc10uCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfTk9UX0lOSVRJQUxJWkVEXSwgYW5kCi0gICAqIFtTdGF0aWNXYXJuaW5nQ29kZS5GSU5BTF9OT1RfSU5JVElBTElaRURdLgotICAgKi8KKyAgLy8vIElmIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGdpdmVuIFttZW1iZXJzXSwgdmVyaWZ5IHRoYXQgYWxsCisgIC8vLyBmaW5hbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkLiAgQ2FzZXMgaW4gd2hpY2ggdGhlcmUgaXMgYXQgbGVhc3Qgb25lCisgIC8vLyBjb25zdHJ1Y3RvciBhcmUgaGFuZGxlZCBpbiBbX2NoZWNrRm9yQWxsRmluYWxJbml0aWFsaXplZEVycm9yQ29kZXNdLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfTk9UX0lOSVRJQUxJWkVEXSwgYW5kCisgIC8vLyBbU3RhdGljV2FybmluZ0NvZGUuRklOQUxfTk9UX0lOSVRJQUxJWkVEXS4KICAgdm9pZCBfY2hlY2tGb3JGaW5hbE5vdEluaXRpYWxpemVkSW5DbGFzcyhMaXN0PENsYXNzTWVtYmVyPiBtZW1iZXJzKSB7CiAgICAgZm9yIChDbGFzc01lbWJlciBjbGFzc01lbWJlciBpbiBtZW1iZXJzKSB7CiAgICAgICBpZiAoY2xhc3NNZW1iZXIgaXMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgewpAQCAtMjcyOCwxMyArMjU5OSwxMSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gaW1wbGVtZW50cyBbY2xhdXNlXSBkb2VzIG5vdCBpbXBsZW1lbnQgY2xhc3NlcyBzdWNoCi0gICAqIGFzICdudW0nIG9yICdTdHJpbmcnLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklNUExFTUVOVFNfRElTQUxMT1dFRF9DTEFTU10sCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5JTVBMRU1FTlRTX0RFRkVSUkVEX0NMQVNTXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gaW1wbGVtZW50cyBbY2xhdXNlXSBkb2VzIG5vdCBpbXBsZW1lbnQgY2xhc3NlcyBzdWNoCisgIC8vLyBhcyAnbnVtJyBvciAnU3RyaW5nJy4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklNUExFTUVOVFNfRElTQUxMT1dFRF9DTEFTU10sCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU1QTEVNRU5UU19ERUZFUlJFRF9DTEFTU10uCiAgIGJvb2wgX2NoZWNrRm9ySW1wbGVtZW50c0NsYXVzZUVycm9yQ29kZXMoSW1wbGVtZW50c0NsYXVzZSBjbGF1c2UpIHsKICAgICBpZiAoY2xhdXNlID09IG51bGwpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI4MDMsMTQgKzI2NzIsMTIgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgaWYgdGhlIGdpdmVuIFtpZGVudGlmaWVyXSBpcyBwYXJ0IG9mIGEgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXIsCi0gICAqIHRoZW4gaXQgZG9lcyBub3QgaW1wbGljaXRseSByZWZlcmVuY2UgJ3RoaXMnIGV4cHJlc3Npb24uCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU1QTElDSVRfVEhJU19SRUZFUkVOQ0VfSU5fSU5JVElBTElaRVJdLCBhbmQKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklOU1RBTkNFX01FTUJFUl9BQ0NFU1NfRlJPTV9TVEFUSUNdLgotICAgKiBUT0RPKHNjaGVnbG92KSByZW5hbWUgdGhpZCBtZXRob2QKLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCBpZiB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIHBhcnQgb2YgYSBjb25zdHJ1Y3RvcgorICAvLy8gaW5pdGlhbGl6ZXIsIHRoZW4gaXQgZG9lcyBub3QgaW1wbGljaXRseSByZWZlcmVuY2UgJ3RoaXMnIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTVBMSUNJVF9USElTX1JFRkVSRU5DRV9JTl9JTklUSUFMSVpFUl0sIGFuZAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklOU1RBTkNFX01FTUJFUl9BQ0NFU1NfRlJPTV9TVEFUSUNdLgorICAvLy8gVE9ETyhzY2hlZ2xvdikgcmVuYW1lIHRoaWQgbWV0aG9kCiAgIHZvaWQgX2NoZWNrRm9ySW1wbGljaXRUaGlzUmVmZXJlbmNlSW5Jbml0aWFsaXplcigKICAgICAgIFNpbXBsZUlkZW50aWZpZXIgaWRlbnRpZmllcikgewogICAgIGlmIChfaXNJbkNvbW1lbnQpIHsKQEAgLTI4NzQsMTQgKzI3NDEsMTIgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGltcG9ydCBbZGlyZWN0aXZlXSBoYXMgYSB1bmlxdWUgbmFtZSBhbW9uZyBvdGhlcgotICAgKiBpbXBvcnRlZCBsaWJyYXJpZXMuIFRoZSBbaW1wb3J0RWxlbWVudF0gaXMgdGhlIFtJbXBvcnRFbGVtZW50XSByZXRyaWV2ZWQKLSAgICogZnJvbSB0aGUgbm9kZSwgaWYgdGhlIGVsZW1lbnQgaW4gdGhlIG5vZGUgd2FzIGBudWxsYCwgdGhlbiB0aGlzIG1ldGhvZCBpcwotICAgKiBub3QgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklNUE9SVF9EVVBMSUNBVEVEX0xJQlJBUllfTkFNRV0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGltcG9ydCBbZGlyZWN0aXZlXSBoYXMgYSB1bmlxdWUgbmFtZSBhbW9uZyBvdGhlcgorICAvLy8gaW1wb3J0ZWQgbGlicmFyaWVzLiBUaGUgW2ltcG9ydEVsZW1lbnRdIGlzIHRoZSBbSW1wb3J0RWxlbWVudF0gcmV0cmlldmVkCisgIC8vLyBmcm9tIHRoZSBub2RlLCBpZiB0aGUgZWxlbWVudCBpbiB0aGUgbm9kZSB3YXMgYG51bGxgLCB0aGVuIHRoaXMgbWV0aG9kIGlzCisgIC8vLyBub3QgY2FsbGVkLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuSU1QT1JUX0RVUExJQ0FURURfTElCUkFSWV9OQU1FXS4KICAgdm9pZCBfY2hlY2tGb3JJbXBvcnREdXBsaWNhdGVMaWJyYXJ5TmFtZSgKICAgICAgIEltcG9ydERpcmVjdGl2ZSBkaXJlY3RpdmUsIEltcG9ydEVsZW1lbnQgaW1wb3J0RWxlbWVudCkgewogICAgIC8vIHByZXBhcmUgaW1wb3J0ZWQgbGlicmFyeQpAQCAtMjkwNiwxNCArMjc3MSwxMiBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGlmIHRoZSB2aXNpdGluZyBsaWJyYXJ5IGlzIG5vdCBzeXN0ZW0sIHRoZW4gYW55IGdpdmVuIGxpYnJhcnkKLSAgICogc2hvdWxkIG5vdCBiZSBTREsgaW50ZXJuYWwgbGlicmFyeS4gVGhlIFtpbXBvcnRFbGVtZW50XSBpcyB0aGUKLSAgICogW0ltcG9ydEVsZW1lbnRdIHJldHJpZXZlZCBmcm9tIHRoZSBub2RlLCBpZiB0aGUgZWxlbWVudCBpbiB0aGUgbm9kZSB3YXMKLSAgICogYG51bGxgLCB0aGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQKLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTVBPUlRfSU5URVJOQUxfTElCUkFSWV0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCBpZiB0aGUgdmlzaXRpbmcgbGlicmFyeSBpcyBub3Qgc3lzdGVtLCB0aGVuIGFueSBnaXZlbiBsaWJyYXJ5CisgIC8vLyBzaG91bGQgbm90IGJlIFNESyBpbnRlcm5hbCBsaWJyYXJ5LiBUaGUgW2ltcG9ydEVsZW1lbnRdIGlzIHRoZQorICAvLy8gW0ltcG9ydEVsZW1lbnRdIHJldHJpZXZlZCBmcm9tIHRoZSBub2RlLCBpZiB0aGUgZWxlbWVudCBpbiB0aGUgbm9kZSB3YXMKKyAgLy8vIGBudWxsYCwgdGhlbiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTVBPUlRfSU5URVJOQUxfTElCUkFSWV0uCiAgIHZvaWQgX2NoZWNrRm9ySW1wb3J0SW50ZXJuYWxMaWJyYXJ5KAogICAgICAgSW1wb3J0RGlyZWN0aXZlIGRpcmVjdGl2ZSwgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50KSB7CiAgICAgaWYgKF9pc0luU3lzdGVtTGlicmFyeSkgewpAQCAtMjkzOSwxMiArMjgwMiwxMCBAQAogICAgICAgICBbZGlyZWN0aXZlLnVyaS5zdHJpbmdWYWx1ZV0pOwogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgdGhlIGdpdmVuIFt0eXBlUmVmZXJlbmNlXSBpcyBub3QgYSB0eXBlIHJlZmVyZW5jZSBhbmQgdGhhdCB0aGVuCi0gICAqIHRoZSBbbmFtZV0gaXMgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG1lbWJlci4KLSAgICoKLSAgICogU2VlIFtTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5TVEFOQ0VfQUNDRVNTX1RPX1NUQVRJQ19NRU1CRVJdLgotICAgKi8KKyAgLy8vIENoZWNrIHRoYXQgdGhlIGdpdmVuIFt0eXBlUmVmZXJlbmNlXSBpcyBub3QgYSB0eXBlIHJlZmVyZW5jZSBhbmQgdGhhdCB0aGVuCisgIC8vLyB0aGUgW25hbWVdIGlzIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSBtZW1iZXIuCisgIC8vLworICAvLy8gU2VlIFtTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5TVEFOQ0VfQUNDRVNTX1RPX1NUQVRJQ19NRU1CRVJdLgogICB2b2lkIF9jaGVja0Zvckluc3RhbmNlQWNjZXNzVG9TdGF0aWNNZW1iZXIoCiAgICAgICBDbGFzc0VsZW1lbnQgdHlwZVJlZmVyZW5jZSwgRXhwcmVzc2lvbiB0YXJnZXQsIFNpbXBsZUlkZW50aWZpZXIgbmFtZSkgewogICAgIGlmIChfaXNJbkNvbW1lbnQpIHsKQEAgLTI5ODcsMTMgKzI4NDgsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgYW4gJ2ludCcgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogZ2l2ZW4gW2FyZ3VtZW50XS4gVGhpcyBpcyB1c2VkIGZvciBwcmVmaXggYW5kIHBvc3RmaXggZXhwcmVzc2lvbnMgd2hlcmUKLSAgICogdGhlIGFyZ3VtZW50IHZhbHVlIGlzIGltcGxpY2l0LgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IGFuICdpbnQnIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyBnaXZlbiBbYXJndW1lbnRdLiBUaGlzIGlzIHVzZWQgZm9yIHByZWZpeCBhbmQgcG9zdGZpeCBleHByZXNzaW9ucyB3aGVyZQorICAvLy8gdGhlIGFyZ3VtZW50IHZhbHVlIGlzIGltcGxpY2l0LgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0uCiAgIHZvaWQgX2NoZWNrRm9ySW50Tm90QXNzaWduYWJsZShFeHByZXNzaW9uIGFyZ3VtZW50KSB7CiAgICAgaWYgKGFyZ3VtZW50ID09IG51bGwpIHsKICAgICAgIHJldHVybjsKQEAgLTMwMDQsMTEgKzI4NjMsOSBAQAogICAgICAgICBTdGF0aWNXYXJuaW5nQ29kZS5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2Fubm90YXRpb25dIGlzbid0IGRlZmluZWQgaW4gYSBkZWZlcnJlZCBsaWJyYXJ5LgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklOVkFMSURfQU5OT1RBVElPTl9GUk9NX0RFRkVSUkVEX0xJQlJBUlldLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbYW5ub3RhdGlvbl0gaXNuJ3QgZGVmaW5lZCBpbiBhIGRlZmVycmVkIGxpYnJhcnkuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTlZBTElEX0FOTk9UQVRJT05fRlJPTV9ERUZFUlJFRF9MSUJSQVJZXS4KICAgdm9pZCBfY2hlY2tGb3JJbnZhbGlkQW5ub3RhdGlvbkZyb21EZWZlcnJlZExpYnJhcnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CiAgICAgSWRlbnRpZmllciBuYW1lSWRlbnRpZmllciA9IGFubm90YXRpb24ubmFtZTsKICAgICBpZiAobmFtZUlkZW50aWZpZXIgaXMgUHJlZml4ZWRJZGVudGlmaWVyICYmIG5hbWVJZGVudGlmaWVyLmlzRGVmZXJyZWQpIHsKQEAgLTMwMTgsMTIgKzI4NzUsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGxlZnQgaGFuZCBzaWRlIChbbGhzXSkgYW5kIHJpZ2h0IGhhbmQgc2lkZSAoW3Joc10pCi0gICAqIHJlcHJlc2VudCBhIHZhbGlkIGFzc2lnbm1lbnQuCi0gICAqCi0gICAqIFNlZSBbU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGxlZnQgaGFuZCBzaWRlIChbbGhzXSkgYW5kIHJpZ2h0IGhhbmQgc2lkZSAoW3Joc10pCisgIC8vLyByZXByZXNlbnQgYSB2YWxpZCBhc3NpZ25tZW50LgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVF0uCiAgIHZvaWQgX2NoZWNrRm9ySW52YWxpZEFzc2lnbm1lbnQoRXhwcmVzc2lvbiBsaHMsIEV4cHJlc3Npb24gcmhzKSB7CiAgICAgaWYgKGxocyA9PSBudWxsIHx8IHJocyA9PSBudWxsKSB7CiAgICAgICByZXR1cm47CkBAIC0zMDUxLDEyICsyOTA2LDEwIEBACiAgICAgICAgIHJocywgbGVmdFR5cGUsIFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQpOwogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIHRoZSBnaXZlbiBbaW5pdGlhbGl6ZXJdIHRvIGVuc3VyZSB0aGF0IHRoZSBmaWVsZCBiZWluZyBpbml0aWFsaXplZCBpcwotICAgKiBhIHZhbGlkIGZpZWxkLiBUaGUgW2ZpZWxkTmFtZV0gaXMgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUKLSAgICogW0NvbnN0cnVjdG9yRmllbGRJbml0aWFsaXplcl0uIFRoZSBbc3RhdGljRWxlbWVudF0gaXMgdGhlIHN0YXRpYyBlbGVtZW50Ci0gICAqIGZyb20gdGhlIG5hbWUgaW4gdGhlIFtDb25zdHJ1Y3RvckZpZWxkSW5pdGlhbGl6ZXJdLgotICAgKi8KKyAgLy8vIENoZWNrIHRoZSBnaXZlbiBbaW5pdGlhbGl6ZXJdIHRvIGVuc3VyZSB0aGF0IHRoZSBmaWVsZCBiZWluZyBpbml0aWFsaXplZAorICAvLy8gaXMgYSB2YWxpZCBmaWVsZC4gVGhlIFtmaWVsZE5hbWVdIGlzIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlCisgIC8vLyBbQ29uc3RydWN0b3JGaWVsZEluaXRpYWxpemVyXS4gVGhlIFtzdGF0aWNFbGVtZW50XSBpcyB0aGUgc3RhdGljIGVsZW1lbnQKKyAgLy8vIGZyb20gdGhlIG5hbWUgaW4gdGhlIFtDb25zdHJ1Y3RvckZpZWxkSW5pdGlhbGl6ZXJdLgogICB2b2lkIF9jaGVja0ZvckludmFsaWRGaWVsZChDb25zdHJ1Y3RvckZpZWxkSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIsCiAgICAgICBTaW1wbGVJZGVudGlmaWVyIGZpZWxkTmFtZSwgRWxlbWVudCBzdGF0aWNFbGVtZW50KSB7CiAgICAgaWYgKHN0YXRpY0VsZW1lbnQgaXMgRmllbGRFbGVtZW50KSB7CkBAIC0zMDgwLDEwICsyOTMzLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGdpdmVuIGZ1bmN0aW9uIFtib2R5XSBoYXMgYSBtb2RpZmllciBhc3NvY2lhdGVkCi0gICAqIHdpdGggaXQsIGFuZCByZXBvcnQgaXQgYXMgYW4gZXJyb3IgaWYgaXQgZG9lcy4KLSAgICovCisgIC8vLyBDaGVjayB0byBzZWUgd2hldGhlciB0aGUgZ2l2ZW4gZnVuY3Rpb24gW2JvZHldIGhhcyBhIG1vZGlmaWVyIGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggaXQsIGFuZCByZXBvcnQgaXQgYXMgYW4gZXJyb3IgaWYgaXQgZG9lcy4KICAgdm9pZCBfY2hlY2tGb3JJbnZhbGlkTW9kaWZpZXJPbkJvZHkoCiAgICAgICBGdW5jdGlvbkJvZHkgYm9keSwgQ29tcGlsZVRpbWVFcnJvckNvZGUgZXJyb3JDb2RlKSB7CiAgICAgVG9rZW4ga2V5d29yZCA9IGJvZHkua2V5d29yZDsKQEAgLTMwOTIsMTEgKzI5NDMsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgdXNhZ2Ugb2YgdGhlIGdpdmVuICd0aGlzJyBpcyB2YWxpZC4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTlZBTElEX1JFRkVSRU5DRV9UT19USElTXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgdXNhZ2Ugb2YgdGhlIGdpdmVuICd0aGlzJyBpcyB2YWxpZC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklOVkFMSURfUkVGRVJFTkNFX1RPX1RISVNdLgogICB2b2lkIF9jaGVja0ZvckludmFsaWRSZWZlcmVuY2VUb1RoaXMoVGhpc0V4cHJlc3Npb24gZXhwcmVzc2lvbikgewogICAgIGlmICghX2lzVGhpc0luVmFsaWRDb250ZXh0KGV4cHJlc3Npb24pKSB7CiAgICAgICBfZXJyb3JSZXBvcnRlci5yZXBvcnRFcnJvckZvck5vZGUoCkBAIC0zMTM1LDEzICsyOTg0LDExIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCBbbGl0ZXJhbF0gYXJlIHN1YnR5cGVzIG9mIHRoZQotICAgKiBsaXN0J3Mgc3RhdGljIHR5cGUuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLCBhbmQKLSAgICogW1N0YXRpY1dhcm5pbmdDb2RlLkxJU1RfRUxFTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QgW2xpdGVyYWxdIGFyZSBzdWJ0eXBlcyBvZiB0aGUKKyAgLy8vIGxpc3QncyBzdGF0aWMgdHlwZS4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkxJU1RfRUxFTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSwgYW5kCisgIC8vLyBbU3RhdGljV2FybmluZ0NvZGUuTElTVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgogICB2b2lkIF9jaGVja0Zvckxpc3RFbGVtZW50VHlwZU5vdEFzc2lnbmFibGUoTGlzdExpdGVyYWwgbGl0ZXJhbCkgewogICAgIC8vIERldGVybWluZSB0aGUgbGlzdCdzIGVsZW1lbnQgdHlwZS4gV2UgYmFzZSB0aGlzIG9uIHRoZSBzdGF0aWMgdHlwZSBhbmQKICAgICAvLyBub3QgdGhlIGxpdGVyYWwncyB0eXBlIGFyZ3VtZW50cyBiZWNhdXNlIGluIHN0cm9uZyBtb2RlLCB0aGUgdHlwZQpAQCAtMzIwNywxMSArMzA1NCw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBnaXZlbiBzd2l0Y2ggW3N0YXRlbWVudF0gd2hvc2Ugc3RhdGljIHR5cGUgaXMKLSAgICogYW4gZW51bSB0eXBlIGVpdGhlciBoYXZlIGEgZGVmYXVsdCBjYXNlIG9yIGluY2x1ZGUgYWxsIG9mIHRoZSBlbnVtCi0gICAqIGNvbnN0YW50cy4KLSAgICovCisgIC8vLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gc3dpdGNoIFtzdGF0ZW1lbnRdIHdob3NlIHN0YXRpYyB0eXBlIGlzCisgIC8vLyBhbiBlbnVtIHR5cGUgZWl0aGVyIGhhdmUgYSBkZWZhdWx0IGNhc2Ugb3IgaW5jbHVkZSBhbGwgb2YgdGhlIGVudW0KKyAgLy8vIGNvbnN0YW50cy4KICAgdm9pZCBfY2hlY2tGb3JNaXNzaW5nRW51bUNvbnN0YW50SW5Td2l0Y2goU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgewogICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIFRoaXMgbmVlZHMgdG8gYmUgY2hlY2tlZCBhZnRlciBjb25zdGFudCB2YWx1ZXMgaGF2ZQogICAgIC8vIGJlZW4gY29tcHV0ZWQuCkBAIC0zMjc1LDEzICszMTIwLDExIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBtaXhpbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0bHkgZGVjbGFyZWQKLSAgICogY29uc3RydWN0b3IuIFRoZSBbbWl4aW5OYW1lXSBpcyB0aGUgbm9kZSB0byByZXBvcnQgcHJvYmxlbSBvbi4gVGhlCi0gICAqIFttaXhpbkVsZW1lbnRdIGlzIHRoZSBtaXhpbmcgdG8gZXZhbHVhdGUuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTUlYSU5fQ0xBU1NfREVDTEFSRVNfQ09OU1RSVUNUT1JdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBtaXhpbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0bHkgZGVjbGFyZWQKKyAgLy8vIGNvbnN0cnVjdG9yLiBUaGUgW21peGluTmFtZV0gaXMgdGhlIG5vZGUgdG8gcmVwb3J0IHByb2JsZW0gb24uIFRoZQorICAvLy8gW21peGluRWxlbWVudF0gaXMgdGhlIG1peGluZyB0byBldmFsdWF0ZS4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1JWElOX0NMQVNTX0RFQ0xBUkVTX0NPTlNUUlVDVE9SXS4KICAgYm9vbCBfY2hlY2tGb3JNaXhpbkNsYXNzRGVjbGFyZXNDb25zdHJ1Y3RvcigKICAgICAgIFR5cGVOYW1lIG1peGluTmFtZSwgQ2xhc3NFbGVtZW50IG1peGluRWxlbWVudCkgewogICAgIGZvciAoQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yIGluIG1peGluRWxlbWVudC5jb25zdHJ1Y3RvcnMpIHsKQEAgLTMyOTYsMTMgKzMxMzksMTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIG1peGluIGhhcyB0aGUgJ09iamVjdCcgc3VwZXJjbGFzcy4gVGhlIFttaXhpbk5hbWVdIGlzCi0gICAqIHRoZSBub2RlIHRvIHJlcG9ydCBwcm9ibGVtIG9uLiBUaGUgW21peGluRWxlbWVudF0gaXMgdGhlIG1peGluZyB0bwotICAgKiBldmFsdWF0ZS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9JTkhFUklUU19GUk9NX05PVF9PQkpFQ1RdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBtaXhpbiBoYXMgdGhlICdPYmplY3QnIHN1cGVyY2xhc3MuCisgIC8vLworICAvLy8gVGhlIFttaXhpbk5hbWVdIGlzIHRoZSBub2RlIHRvIHJlcG9ydCBwcm9ibGVtIG9uLiBUaGUgW21peGluRWxlbWVudF0gaXMKKyAgLy8vIHRoZSBtaXhpbmcgdG8gZXZhbHVhdGUuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9JTkhFUklUU19GUk9NX05PVF9PQkpFQ1RdLgogICBib29sIF9jaGVja0Zvck1peGluSW5oZXJpdHNOb3RGcm9tT2JqZWN0KAogICAgICAgVHlwZU5hbWUgbWl4aW5OYW1lLCBDbGFzc0VsZW1lbnQgbWl4aW5FbGVtZW50KSB7CiAgICAgSW50ZXJmYWNlVHlwZSBtaXhpblN1cGVydHlwZSA9IG1peGluRWxlbWVudC5zdXBlcnR5cGU7CkBAIC0zNDA0LDExICszMjQ2LDkgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIG1peGluIGZyb20gYSBsaWJyYXJ5IG90aGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICogbGlicmFyeSB0aGF0IGRlZmluZXMgYSBwcml2YXRlIG1lbWJlciB0aGF0IGNvbmZsaWN0cyB3aXRoIGEgcHJpdmF0ZSBuYW1lCi0gICAqIGZyb20gdGhlIHNhbWUgbGlicmFyeSBidXQgZnJvbSBhIHN1cGVyY2xhc3Mgb3IgYSBkaWZmZXJlbnQgbWl4aW4uCi0gICAqLworICAvLy8gQ2hlY2sgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIG1peGluIGZyb20gYSBsaWJyYXJ5IG90aGVyIHRoYW4gdGhlIGN1cnJlbnQKKyAgLy8vIGxpYnJhcnkgdGhhdCBkZWZpbmVzIGEgcHJpdmF0ZSBtZW1iZXIgdGhhdCBjb25mbGljdHMgd2l0aCBhIHByaXZhdGUgbmFtZQorICAvLy8gZnJvbSB0aGUgc2FtZSBsaWJyYXJ5IGJ1dCBmcm9tIGEgc3VwZXJjbGFzcyBvciBhIGRpZmZlcmVudCBtaXhpbi4KICAgdm9pZCBfY2hlY2tGb3JNaXhpbldpdGhDb25mbGljdGluZ1ByaXZhdGVNZW1iZXIoCiAgICAgICBXaXRoQ2xhdXNlIHdpdGhDbGF1c2UsIFR5cGVOYW1lIHN1cGVyY2xhc3NOYW1lKSB7CiAgICAgaWYgKHdpdGhDbGF1c2UgPT0gbnVsbCkgewpAQCAtMzQ4MiwxMSArMzMyMiw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBbY29uc3RydWN0b3JdIGhhcyBhdCBtb3N0IG9uZSAnc3VwZXInIGluaXRpYWxpemVyLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1VTFRJUExFX1NVUEVSX0lOSVRJQUxJWkVSU10uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIFtjb25zdHJ1Y3Rvcl0gaGFzIGF0IG1vc3Qgb25lICdzdXBlcicgaW5pdGlhbGl6ZXIuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5NVUxUSVBMRV9TVVBFUl9JTklUSUFMSVpFUlNdLgogICB2b2lkIF9jaGVja0Zvck11bHRpcGxlU3VwZXJJbml0aWFsaXplcnMoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvcikgewogICAgIGJvb2wgaGFzU3VwZXJJbml0aWFsaXplciA9IGZhbHNlOwogICAgIGZvciAoQ29uc3RydWN0b3JJbml0aWFsaXplciBpbml0aWFsaXplciBpbiBjb25zdHJ1Y3Rvci5pbml0aWFsaXplcnMpIHsKQEAgLTM1MTUsMTEgKzMzNTMsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIG5hdGl2ZSBmdW5jdGlvbiBbYm9keV0gaXMgaW4gU0RLIGNvZGUuCi0gICAqCi0gICAqIFNlZSBbUGFyc2VyRXJyb3JDb2RlLk5BVElWRV9GVU5DVElPTl9CT0RZX0lOX05PTl9TREtfQ09ERV0uCi0gICAqLworICAvLy8gQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSBnaXZlbiBuYXRpdmUgZnVuY3Rpb24gW2JvZHldIGlzIGluIFNESyBjb2RlLgorICAvLy8KKyAgLy8vIFNlZSBbUGFyc2VyRXJyb3JDb2RlLk5BVElWRV9GVU5DVElPTl9CT0RZX0lOX05PTl9TREtfQ09ERV0uCiAgIHZvaWQgX2NoZWNrRm9yTmF0aXZlRnVuY3Rpb25Cb2R5SW5Ob25TZGtDb2RlKE5hdGl2ZUZ1bmN0aW9uQm9keSBib2R5KSB7CiAgICAgaWYgKCFfaXNJblN5c3RlbUxpYnJhcnkgJiYgIV9oYXNFeHRVcmkpIHsKICAgICAgIF9lcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yRm9yTm9kZSgKQEAgLTM1MjcsMTYgKzMzNjMsMTQgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGluc3RhbmNlIGNyZWF0aW9uIFtleHByZXNzaW9uXSBpbnZva2VzIGFuIGV4aXN0aW5nCi0gICAqIGNvbnN0cnVjdG9yLiBUaGUgW2NvbnN0cnVjdG9yTmFtZV0gaXMgdGhlIGNvbnN0cnVjdG9yIG5hbWUuIFRoZSBbdHlwZU5hbWVdCi0gICAqIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlIGRlZmluaW5nIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBpbnN0YW5jZSBjcmVhdGlvbiB3YXMgdGVzdGVkIHRvIGJlICduZXcnCi0gICAqIGJlZm9yZSBiZWluZyBjYWxsZWQuCi0gICAqCi0gICAqIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuTkVXX1dJVEhfVU5ERUZJTkVEX0NPTlNUUlVDVE9SXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gaW5zdGFuY2UgY3JlYXRpb24gW2V4cHJlc3Npb25dIGludm9rZXMgYW4gZXhpc3RpbmcKKyAgLy8vIGNvbnN0cnVjdG9yLiBUaGUgW2NvbnN0cnVjdG9yTmFtZV0gaXMgdGhlIGNvbnN0cnVjdG9yIG5hbWUuIFRoZSBbdHlwZU5hbWVdCisgIC8vLyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBkZWZpbmluZyB0aGUgY29uc3RydWN0b3IuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBpbnN0YW5jZSBjcmVhdGlvbiB3YXMgdGVzdGVkIHRvIGJlICduZXcnCisgIC8vLyBiZWZvcmUgYmVpbmcgY2FsbGVkLgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuTkVXX1dJVEhfVU5ERUZJTkVEX0NPTlNUUlVDVE9SXS4KICAgdm9pZCBfY2hlY2tGb3JOZXdXaXRoVW5kZWZpbmVkQ29uc3RydWN0b3IoCiAgICAgICBJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgICAgQ29uc3RydWN0b3JOYW1lIGNvbnN0cnVjdG9yTmFtZSwKQEAgLTM1NzAsMTMgKzM0MDQsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdGhhdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgW2RlY2xhcmF0aW9uXSBpbXBsaWNpdGx5IGNhbGxzIGRlZmF1bHQKLSAgICogY29uc3RydWN0b3Igb2YgaXRzIHN1cGVyY2xhc3MsIHRoZXJlIHNob3VsZCBiZSBzdWNoIGRlZmF1bHQgY29uc3RydWN0b3IgLQotICAgKiBpbXBsaWNpdCBvciBleHBsaWNpdC4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5OT19ERUZBVUxUX1NVUEVSX0NPTlNUUlVDVE9SX0lNUExJQ0lUXS4KLSAgICovCisgIC8vLyBDaGVjayB0aGF0IGlmIHRoZSBnaXZlbiBjbGFzcyBbZGVjbGFyYXRpb25dIGltcGxpY2l0bHkgY2FsbHMgZGVmYXVsdAorICAvLy8gY29uc3RydWN0b3Igb2YgaXRzIHN1cGVyY2xhc3MsIHRoZXJlIHNob3VsZCBiZSBzdWNoIGRlZmF1bHQgY29uc3RydWN0b3IgLQorICAvLy8gaW1wbGljaXQgb3IgZXhwbGljaXQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5OT19ERUZBVUxUX1NVUEVSX0NPTlNUUlVDVE9SX0lNUExJQ0lUXS4KICAgdm9pZCBfY2hlY2tGb3JOb0RlZmF1bHRTdXBlckNvbnN0cnVjdG9ySW1wbGljaXQoCiAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgLy8gZG8gbm90aGluZyBpZiB0aGVyZSBpcyBleHBsaWNpdCBjb25zdHJ1Y3RvcgpAQCAtMzYwNiwyMCArMzQzOCwyMiBAQAogICAgICAgfQogICAgIH0KIAotICAgIF9lcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yRm9yTm9kZSgKLSAgICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUuTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9JTVBMSUNJVCwKLSAgICAgICAgZGVjbGFyYXRpb24ubmFtZSwKLSAgICAgICAgW3N1cGVyVHlwZSwgX2VuY2xvc2luZ0NsYXNzLmRpc3BsYXlOYW1lXSk7CisgICAgaWYgKCFfdHlwZVByb3ZpZGVyLm5vblN1YnR5cGFibGVDbGFzc2VzLmNvbnRhaW5zKHN1cGVyVHlwZS5lbGVtZW50KSkgeworICAgICAgLy8gRG9uJ3QgcmVwb3J0IHRoaXMgZGlhZ25vc3RpYyBmb3Igbm9uLXN1YnR5cGFibGUgY2xhc3NlcyBiZWNhdXNlIHRoZQorICAgICAgLy8gcmVhbCBwcm9ibGVtIHdhcyBhbHJlYWR5IHJlcG9ydGVkLgorICAgICAgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKAorICAgICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlLk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVQsCisgICAgICAgICAgZGVjbGFyYXRpb24ubmFtZSwKKyAgICAgICAgICBbc3VwZXJUeXBlLCBfZW5jbG9zaW5nQ2xhc3MuZGlzcGxheU5hbWVdKTsKKyAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoZSBnaXZlbiBtYXAgW2xpdGVyYWxdIGVpdGhlcjoKLSAgICogKiBoYXMgYGNvbnN0IG1vZGlmaWVyYAotICAgKiAqIGhhcyBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cwotICAgKiAqIGlzIG5vdCBzdGFydCBvZiB0aGUgc3RhdGVtZW50Ci0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuTk9OX0NPTlNUX01BUF9BU19FWFBSRVNTSU9OX1NUQVRFTUVOVF0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoZSBnaXZlbiBtYXAgW2xpdGVyYWxdIGVpdGhlcjoKKyAgLy8vICogaGFzIGBjb25zdCBtb2RpZmllcmAKKyAgLy8vICogaGFzIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzCisgIC8vLyAqIGlzIG5vdCBzdGFydCBvZiB0aGUgc3RhdGVtZW50CisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5OT05fQ09OU1RfTUFQX0FTX0VYUFJFU1NJT05fU1RBVEVNRU5UXS4KICAgdm9pZCBfY2hlY2tGb3JOb25Db25zdE1hcEFzRXhwcmVzc2lvblN0YXRlbWVudDMoU2V0T3JNYXBMaXRlcmFsIGxpdGVyYWwpIHsKICAgICAvLyAiY29uc3QiCiAgICAgaWYgKGxpdGVyYWwuY29uc3RLZXl3b3JkICE9IG51bGwpIHsKQEAgLTM2NDMsMTIgKzM0NzcsMTAgQEAKICAgICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUuTk9OX0NPTlNUX01BUF9BU19FWFBSRVNTSU9OX1NUQVRFTUVOVCwgbGl0ZXJhbCk7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBbZGVjbGFyYXRpb25dIG9mIG9wZXJhdG9yIGBbXT1gLCBoYXMgYHZvaWRgCi0gICAqIHJldHVybiB0eXBlLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLk5PTl9WT0lEX1JFVFVSTl9GT1JfT1BFUkFUT1JdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBtZXRob2QgW2RlY2xhcmF0aW9uXSBvZiBvcGVyYXRvciBgW109YCwgaGFzIGB2b2lkYAorICAvLy8gcmV0dXJuIHR5cGUuCisgIC8vLworICAvLy8gU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5OT05fVk9JRF9SRVRVUk5fRk9SX09QRVJBVE9SXS4KICAgdm9pZCBfY2hlY2tGb3JOb25Wb2lkUmV0dXJuVHlwZUZvck9wZXJhdG9yKE1ldGhvZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAgICAgLy8gY2hlY2sgdGhhdCBbXT0gb3BlcmF0b3IKICAgICBTaW1wbGVJZGVudGlmaWVyIG5hbWUgPSBkZWNsYXJhdGlvbi5uYW1lOwpAQCAtMzY2NiwxMiArMzQ5OCwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIFt0eXBlTmFtZV0sIHVzZWQgYXMgdGhlIHJldHVybiB0eXBlIG9mIGEgc2V0dGVyLCBpcyB2YWxpZAotICAgKiAoZWl0aGVyIGBudWxsYCBvciB0aGUgdHlwZSAndm9pZCcpLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLk5PTl9WT0lEX1JFVFVSTl9GT1JfU0VUVEVSXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhlIFt0eXBlTmFtZV0sIHVzZWQgYXMgdGhlIHJldHVybiB0eXBlIG9mIGEgc2V0dGVyLCBpcyB2YWxpZAorICAvLy8gKGVpdGhlciBgbnVsbGAgb3IgdGhlIHR5cGUgJ3ZvaWQnKS4KKyAgLy8vCisgIC8vLyBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLk5PTl9WT0lEX1JFVFVSTl9GT1JfU0VUVEVSXS4KICAgdm9pZCBfY2hlY2tGb3JOb25Wb2lkUmV0dXJuVHlwZUZvclNldHRlcihUeXBlQW5ub3RhdGlvbiB0eXBlTmFtZSkgewogICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKSB7CiAgICAgICBEYXJ0VHlwZSB0eXBlID0gdHlwZU5hbWUudHlwZTsKQEAgLTM3NTIsMTIgKzM1ODIsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgYWxsIGNsYXNzZXMgb2YgdGhlIGdpdmVuIFtvbkNsYXVzZV0gYXJlIHZhbGlkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1JWElOX1NVUEVSX0NMQVNTX0NPTlNUUkFJTlRfRElTQUxMT1dFRF9DTEFTU10sCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9TVVBFUl9DTEFTU19DT05TVFJBSU5UX0RFRkVSUkVEX0NMQVNTXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCBhbGwgY2xhc3NlcyBvZiB0aGUgZ2l2ZW4gW29uQ2xhdXNlXSBhcmUgdmFsaWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5NSVhJTl9TVVBFUl9DTEFTU19DT05TVFJBSU5UX0RJU0FMTE9XRURfQ0xBU1NdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1JWElOX1NVUEVSX0NMQVNTX0NPTlNUUkFJTlRfREVGRVJSRURfQ0xBU1NdLgogICBib29sIF9jaGVja0Zvck9uQ2xhdXNlRXJyb3JDb2RlcyhPbkNsYXVzZSBvbkNsYXVzZSkgewogICAgIGlmIChvbkNsYXVzZSA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNzg0LDEzICszNjEyLDEzIEBACiAgICAgcmV0dXJuIHByb2JsZW1SZXBvcnRlZDsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIGdpdmVuIG9wZXJhdG9yLW1ldGhvZCBbZGVjbGFyYXRpb25dLCBkb2VzIG5vdCBoYXZlIGFuIG9wdGlvbmFsCi0gICAqIHBhcmFtZXRlci4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXRob2QgZGVjbGFyYXRpb24gd2FzIHRlc3RlZCB0byBiZQotICAgKiBhbiBvcGVyYXRvciBkZWNsYXJhdGlvbiBiZWZvcmUgYmVpbmcgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk9QVElPTkFMX1BBUkFNRVRFUl9JTl9PUEVSQVRPUl0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoZSBnaXZlbiBvcGVyYXRvci1tZXRob2QgW2RlY2xhcmF0aW9uXSwgZG9lcyBub3QgaGF2ZSBhbiBvcHRpb25hbAorICAvLy8gcGFyYW1ldGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHdhcyB0ZXN0ZWQgdG8gYmUgYW4KKyAgLy8vIG9wZXJhdG9yIGRlY2xhcmF0aW9uIGJlZm9yZSBiZWluZyBjYWxsZWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5PUFRJT05BTF9QQVJBTUVURVJfSU5fT1BFUkFUT1JdLgogICB2b2lkIF9jaGVja0Zvck9wdGlvbmFsUGFyYW1ldGVySW5PcGVyYXRvcihNZXRob2REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgIEZvcm1hbFBhcmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdCA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnM7CiAgICAgaWYgKHBhcmFtZXRlckxpc3QgPT0gbnVsbCkgewpAQCAtMzgwNywyNyArMzYzNSwyNSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWaWEgaW5mb3JtYWwgc3BlY2lmaWNhdGlvbjogZGFydC1sYW5nL2xhbmd1YWdlL2lzc3Vlcy80Ci0gICAqCi0gICAqIElmIGUgaXMgYW4gaW50ZWdlciBsaXRlcmFsIHdoaWNoIGlzIG5vdCB0aGUgb3BlcmFuZCBvZiBhIHVuYXJ5IG1pbnVzCi0gICAqIG9wZXJhdG9yLCB0aGVuOgotICAgKiAgIC0gSWYgdGhlIGNvbnRleHQgdHlwZSBpcyBkb3VibGUsIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZQotICAgKiAgIG51bWVyaWNhbCB2YWx1ZSBvZiBlIGlzIG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZSBieSBhIGRvdWJsZS4KLSAgICogICBPdGhlcndpc2UgdGhlIHN0YXRpYyB0eXBlIG9mIGUgaXMgZG91YmxlIGFuZCB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgZQotICAgKiAgIGlzIGEgZG91YmxlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGF0IHZhbHVlLgotICAgKiAgIC0gT3RoZXJ3aXNlICh0aGUgY3VycmVudCBiZWhhdmlvciBvZiBlLCB3aXRoIGEgc3RhdGljIHR5cGUgb2YgaW50KS4KLSAgICoKLSAgICogYW5kCi0gICAqCi0gICAqIElmIGUgaXMgLW4gYW5kIG4gaXMgYW4gaW50ZWdlciBsaXRlcmFsLCB0aGVuCi0gICAqICAgLSBJZiB0aGUgY29udGV4dCB0eXBlIGlzIGRvdWJsZSwgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlCi0gICAqICAgbnVtZXJpY2FsIHZhbHVlIG9mIG4gaXMgbm90IHByZWNpc2xleSByZXByZXNlbnRhYmxlIGJ5IGEgZG91YmxlLgotICAgKiAgIE90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgZSBpcyBkb3VibGUgYW5kIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBlCi0gICAqICAgaXMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSB1bmFyeSBtaW51cyBvcGVyYXRvciBvbiBhIGRvdWJsZSBpbnN0YW5jZQotICAgKiAgIHJlcHJlc2VudGluZyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIG4uCi0gICAqICAgLSBPdGhlcndpc2UgKHRoZSBjdXJyZW50IGJlaGF2aW9yIG9mIC1uKQotICAgKi8KKyAgLy8vIFZpYSBpbmZvcm1hbCBzcGVjaWZpY2F0aW9uOiBkYXJ0LWxhbmcvbGFuZ3VhZ2UvaXNzdWVzLzQKKyAgLy8vCisgIC8vLyBJZiBlIGlzIGFuIGludGVnZXIgbGl0ZXJhbCB3aGljaCBpcyBub3QgdGhlIG9wZXJhbmQgb2YgYSB1bmFyeSBtaW51cworICAvLy8gb3BlcmF0b3IsIHRoZW46CisgIC8vLyAgIC0gSWYgdGhlIGNvbnRleHQgdHlwZSBpcyBkb3VibGUsIGl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZQorICAvLy8gICBudW1lcmljYWwgdmFsdWUgb2YgZSBpcyBub3QgcHJlY2lzZWx5IHJlcHJlc2VudGFibGUgYnkgYSBkb3VibGUuCisgIC8vLyAgIE90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgZSBpcyBkb3VibGUgYW5kIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBlCisgIC8vLyAgIGlzIGEgZG91YmxlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGF0IHZhbHVlLgorICAvLy8gICAtIE90aGVyd2lzZSAodGhlIGN1cnJlbnQgYmVoYXZpb3Igb2YgZSwgd2l0aCBhIHN0YXRpYyB0eXBlIG9mIGludCkuCisgIC8vLworICAvLy8gYW5kCisgIC8vLworICAvLy8gSWYgZSBpcyAtbiBhbmQgbiBpcyBhbiBpbnRlZ2VyIGxpdGVyYWwsIHRoZW4KKyAgLy8vICAgLSBJZiB0aGUgY29udGV4dCB0eXBlIGlzIGRvdWJsZSwgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlCisgIC8vLyAgIG51bWVyaWNhbCB2YWx1ZSBvZiBuIGlzIG5vdCBwcmVjaXNsZXkgcmVwcmVzZW50YWJsZSBieSBhIGRvdWJsZS4KKyAgLy8vICAgT3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiBlIGlzIGRvdWJsZSBhbmQgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGUKKyAgLy8vICAgaXMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSB1bmFyeSBtaW51cyBvcGVyYXRvciBvbiBhIGRvdWJsZSBpbnN0YW5jZQorICAvLy8gICByZXByZXNlbnRpbmcgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiBuLgorICAvLy8gICAtIE90aGVyd2lzZSAodGhlIGN1cnJlbnQgYmVoYXZpb3Igb2YgLW4pCiAgIHZvaWQgX2NoZWNrRm9yT3V0T2ZSYW5nZShJbnRlZ2VyTGl0ZXJhbCBub2RlKSB7CiAgICAgU3RyaW5nIGxleGVtZSA9IG5vZGUubGl0ZXJhbC5sZXhlbWU7CiAgICAgZmluYWwgYm9vbCBpc05lZ2F0ZWQgPSAobm9kZSBhcyBJbnRlZ2VyTGl0ZXJhbEltcGwpLmltbWVkaWF0ZWx5TmVnYXRlZDsKQEAgLTM4NTYsMTEgKzM2ODIsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBuYW1lZCBvcHRpb25hbCBbcGFyYW1ldGVyXSBkb2VzIG5vdCBiZWdpbiB3aXRoICdfJy4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5QUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUl0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gbmFtZWQgb3B0aW9uYWwgW3BhcmFtZXRlcl0gZG9lcyBub3QgYmVnaW4gd2l0aCAnXycuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5QUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUl0uCiAgIHZvaWQgX2NoZWNrRm9yUHJpdmF0ZU9wdGlvbmFsUGFyYW1ldGVyKEZvcm1hbFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKICAgICAvLyBzaG91bGQgYmUgbmFtZWQgcGFyYW1ldGVyCiAgICAgaWYgKCFwYXJhbWV0ZXIuaXNOYW1lZCkgewpAQCAtMzg3NiwxMyArMzcwMCwxMSBAQAogICAgICAgICBDb21waWxlVGltZUVycm9yQ29kZS5QUklWQVRFX09QVElPTkFMX1BBUkFNRVRFUiwgcGFyYW1ldGVyKTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGlzIHRoZSByZWRpcmVjdGluZwotICAgKiBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGFuZCByZWZlcmVuY2VzIGl0c2VsZiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBUaGUKLSAgICogW2NvbnN0cnVjdG9yRWxlbWVudF0gaXMgdGhlIGNvbnN0cnVjdG9yIGVsZW1lbnQuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuUkVDVVJTSVZFX0NPTlNUUlVDVE9SX1JFRElSRUNUXS4KLSAgICovCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGlzIHRoZSByZWRpcmVjdGluZworICAvLy8gZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvciBhbmQgcmVmZXJlbmNlcyBpdHNlbGYgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gVGhlCisgIC8vLyBbY29uc3RydWN0b3JFbGVtZW50XSBpcyB0aGUgY29uc3RydWN0b3IgZWxlbWVudC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFQ1VSU0lWRV9DT05TVFJVQ1RPUl9SRURJUkVDVF0uCiAgIHZvaWQgX2NoZWNrRm9yUmVjdXJzaXZlQ29uc3RydWN0b3JSZWRpcmVjdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLAogICAgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yRWxlbWVudCkgewogICAgIC8vIHdlIGNoZWNrIGdlbmVyYXRpdmUgY29uc3RydWN0b3IgaGVyZQpAQCAtMzkwMiwxMyArMzcyNCwxMSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGhhcyByZWRpcmVjdGVkCi0gICAqIGNvbnN0cnVjdG9yIGFuZCByZWZlcmVuY2VzIGl0c2VsZiBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBUaGUKLSAgICogY29uc3RydWN0b3IgW2VsZW1lbnRdIGlzIHRoZSBlbGVtZW50IGludHJvZHVjZWQgYnkgdGhlIGRlY2xhcmF0aW9uLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFQ1VSU0lWRV9GQUNUT1JZX1JFRElSRUNUXS4KLSAgICovCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGhhcyByZWRpcmVjdGVkCisgIC8vLyBjb25zdHJ1Y3RvciBhbmQgcmVmZXJlbmNlcyBpdHNlbGYgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gVGhlCisgIC8vLyBjb25zdHJ1Y3RvciBbZWxlbWVudF0gaXMgdGhlIGVsZW1lbnQgaW50cm9kdWNlZCBieSB0aGUgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5SRUNVUlNJVkVfRkFDVE9SWV9SRURJUkVDVF0uCiAgIGJvb2wgX2NoZWNrRm9yUmVjdXJzaXZlRmFjdG9yeVJlZGlyZWN0KAogICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQ29uc3RydWN0b3JFbGVtZW50IGVsZW1lbnQpIHsKICAgICAvLyBwcmVwYXJlIHJlZGlyZWN0ZWQgY29uc3RydWN0b3IKQEAgLTM5MjgsMTggKzM3NDgsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGhhcyBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mCi0gICAqIHJlZGlyZWN0ZWQgY29uc3RydWN0b3IgaW52b2NhdGlvbihzKSwgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbnMgYW5kCi0gICAqIGZpZWxkIGluaXRpYWxpemVycy4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5BU1NFUlRfSU5fUkVESVJFQ1RJTkdfQ09OU1RSVUNUT1JdLAotICAgKiBbQ29tcGlsZVRpbWVFcnJvckNvZGUuREVGQVVMVF9WQUxVRV9JTl9SRURJUkVDVElOR19GQUNUT1JZX0NPTlNUUlVDVE9SXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkZJRUxEX0lOSVRJQUxJWkVSX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLk1VTFRJUExFX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SX0lOVk9DQVRJT05TXSwKLSAgICogW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlNVUEVSX0lOX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SXSwgYW5kCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5SRURJUkVDVF9HRU5FUkFUSVZFX1RPX05PTl9HRU5FUkFUSVZFX0NPTlNUUlVDVE9SXS4KLSAgICovCisgIC8vLyBDaGVjayB0aGF0IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBbZGVjbGFyYXRpb25dIGhhcyBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mCisgIC8vLyByZWRpcmVjdGVkIGNvbnN0cnVjdG9yIGludm9jYXRpb24ocyksIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb25zIGFuZAorICAvLy8gZmllbGQgaW5pdGlhbGl6ZXJzLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuQVNTRVJUX0lOX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SXSwKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5ERUZBVUxUX1ZBTFVFX0lOX1JFRElSRUNUSU5HX0ZBQ1RPUllfQ09OU1RSVUNUT1JdLAorICAvLy8gW0NvbXBpbGVUaW1lRXJyb3JDb2RlLkZJRUxEX0lOSVRJQUxJWkVSX1JFRElSRUNUSU5HX0NPTlNUUlVDVE9SXSwKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5NVUxUSVBMRV9SRURJUkVDVElOR19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OU10sCisgIC8vLyBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU1VQRVJfSU5fUkVESVJFQ1RJTkdfQ09OU1RSVUNUT1JdLCBhbmQKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5SRURJUkVDVF9HRU5FUkFUSVZFX1RPX05PTl9HRU5FUkFUSVZFX0NPTlNUUlVDVE9SXS4KICAgdm9pZCBfY2hlY2tGb3JSZWRpcmVjdGluZ0NvbnN0cnVjdG9yRXJyb3JDb2RlcygKICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAvLyBDaGVjayBmb3IgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlcnMKQEAgLTQwMzgsMTIgKzM4NTYsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgd2hldGhlciB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IsIFtlbGVtZW50XSwgaXMgY29uc3QsIGFuZAotICAgKiBbcmVkaXJlY3RlZEVsZW1lbnRdLCBpdHMgcmVkaXJlY3RlZSwgaXMgbm90IGNvbnN0LgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFRElSRUNUX1RPX05PTl9DT05TVF9DT05TVFJVQ1RPUl0uCi0gICAqLworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgcmVkaXJlY3RpbmcgY29uc3RydWN0b3IsIFtlbGVtZW50XSwgaXMgY29uc3QsIGFuZAorICAvLy8gW3JlZGlyZWN0ZWRFbGVtZW50XSwgaXRzIHJlZGlyZWN0ZWUsIGlzIG5vdCBjb25zdC4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFRElSRUNUX1RPX05PTl9DT05TVF9DT05TVFJVQ1RPUl0uCiAgIHZvaWQgX2NoZWNrRm9yUmVkaXJlY3RUb05vbkNvbnN0Q29uc3RydWN0b3IoCiAgICAgQ29uc3RydWN0b3JFbGVtZW50IGVsZW1lbnQsCiAgICAgQ29uc3RydWN0b3JFbGVtZW50IHJlZGlyZWN0ZWRFbGVtZW50LApAQCAtNDA5NiwxMSArMzkxMiw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgdGhlIGdpdmVuIHJldGhyb3cgW2V4cHJlc3Npb25dIGlzIGluc2lkZSBvZiBhIGNhdGNoIGNsYXVzZS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5SRVRIUk9XX09VVFNJREVfQ0FUQ0hdLgotICAgKi8KKyAgLy8vIENoZWNrIHRoYXQgdGhlIGdpdmVuIHJldGhyb3cgW2V4cHJlc3Npb25dIGlzIGluc2lkZSBvZiBhIGNhdGNoIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFVEhST1dfT1VUU0lERV9DQVRDSF0uCiAgIHZvaWQgX2NoZWNrRm9yUmV0aHJvd091dHNpZGVDYXRjaChSZXRocm93RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgaWYgKCFfaXNJbkNhdGNoQ2xhdXNlKSB7CiAgICAgICBfZXJyb3JSZXBvcnRlci5yZXBvcnRFcnJvckZvck5vZGUoCkBAIC00MTA4LDEyICszOTIyLDEwIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgaWYgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIFtkZWNsYXJhdGlvbl0gaXMgZ2VuZXJhdGl2ZSwgdGhlbgotICAgKiBpdCBkb2VzIG5vdCBoYXZlIGFuIGV4cHJlc3Npb24gZnVuY3Rpb24gYm9keS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUl0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCBpZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IgW2RlY2xhcmF0aW9uXSBpcyBnZW5lcmF0aXZlLCB0aGVuCisgIC8vLyBpdCBkb2VzIG5vdCBoYXZlIGFuIGV4cHJlc3Npb24gZnVuY3Rpb24gYm9keS4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlJFVFVSTl9JTl9HRU5FUkFUSVZFX0NPTlNUUlVDVE9SXS4KICAgdm9pZCBfY2hlY2tGb3JSZXR1cm5JbkdlbmVyYXRpdmVDb25zdHJ1Y3RvcigKICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKICAgICAvLyBpZ25vcmUgZmFjdG9yeQpAQCAtNDEzMCwxMyArMzk0MiwxMSBAQAogICAgICAgICBDb21waWxlVGltZUVycm9yQ29kZS5SRVRVUk5fSU5fR0VORVJBVElWRV9DT05TVFJVQ1RPUiwgYm9keSk7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBzZXQgW2xpdGVyYWxdIGFyZSBzdWJ0eXBlcyBvZiB0aGUKLSAgICogc2V0J3Mgc3RhdGljIHR5cGUuCi0gICAqCi0gICAqIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU0VUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0sIGFuZAotICAgKiBbU3RhdGljV2FybmluZ0NvZGUuU0VUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBzZXQgW2xpdGVyYWxdIGFyZSBzdWJ0eXBlcyBvZiB0aGUKKyAgLy8vIHNldCdzIHN0YXRpYyB0eXBlLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuU0VUX0VMRU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRV0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLlNFVF9FTEVNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdLgogICB2b2lkIF9jaGVja0ZvclNldEVsZW1lbnRUeXBlTm90QXNzaWduYWJsZTMoU2V0T3JNYXBMaXRlcmFsIGxpdGVyYWwpIHsKICAgICAvLyBEZXRlcm1pbmUgdGhlIHNldCdzIGVsZW1lbnQgdHlwZS4gV2UgYmFzZSB0aGlzIG9uIHRoZSBzdGF0aWMgdHlwZSBhbmQKICAgICAvLyBub3QgdGhlIGxpdGVyYWwncyB0eXBlIGFyZ3VtZW50cyBiZWNhdXNlIGluIHN0cm9uZyBtb2RlLCB0aGUgdHlwZQpAQCAtNDE2OCwxMiArMzk3OCwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGUgZ2l2ZW4gW3R5cGVSZWZlcmVuY2VdIGFuZCB0aGF0IHRoZSBbbmFtZV0gaXMgbm90IGEgcmVmZXJlbmNlIHRvCi0gICAqIGFuIGluc3RhbmNlIG1lbWJlci4KLSAgICoKLSAgICogU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5TVEFUSUNfQUNDRVNTX1RPX0lOU1RBTkNFX01FTUJFUl0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhlIGdpdmVuIFt0eXBlUmVmZXJlbmNlXSBhbmQgdGhhdCB0aGUgW25hbWVdIGlzIG5vdCBhIHJlZmVyZW5jZSB0bworICAvLy8gYW4gaW5zdGFuY2UgbWVtYmVyLgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuU1RBVElDX0FDQ0VTU19UT19JTlNUQU5DRV9NRU1CRVJdLgogICB2b2lkIF9jaGVja0ZvclN0YXRpY0FjY2Vzc1RvSW5zdGFuY2VNZW1iZXIoCiAgICAgICBDbGFzc0VsZW1lbnQgdHlwZVJlZmVyZW5jZSwgU2ltcGxlSWRlbnRpZmllciBuYW1lKSB7CiAgICAgLy8gT0ssIGluIGNvbW1lbnQKQEAgLTQxOTgsMTIgKzQwMDYsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQ2hlY2sgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgZ2l2ZW4gJ3N3aXRjaCcgW3N0YXRlbWVudF0gaXMKLSAgICogYXNzaWduYWJsZSB0byB0aGUgdHlwZSBvZiB0aGUgJ2Nhc2UnIG1lbWJlcnMuCi0gICAqCi0gICAqIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuU1dJVENIX0VYUFJFU1NJT05fTk9UX0FTU0lHTkFCTEVdLgotICAgKi8KKyAgLy8vIENoZWNrIHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gaW4gdGhlIGdpdmVuICdzd2l0Y2gnIFtzdGF0ZW1lbnRdIGlzCisgIC8vLyBhc3NpZ25hYmxlIHRvIHRoZSB0eXBlIG9mIHRoZSAnY2FzZScgbWVtYmVycy4KKyAgLy8vCisgIC8vLyBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLlNXSVRDSF9FWFBSRVNTSU9OX05PVF9BU1NJR05BQkxFXS4KICAgdm9pZCBfY2hlY2tGb3JTd2l0Y2hFeHByZXNzaW9uTm90QXNzaWduYWJsZShTd2l0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CiAgICAgLy8gRm9yIE5OQkQgd2UgdmVyaWZ5IHJ1bnRpbWUgdHlwZXMgb2YgdmFsdWVzLCBhbmQgc3VidHlwaW5nLgogICAgIGlmIChfaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewpAQCAtNDI1NSwxMiArNDA2MSwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2VsZW1lbnRdIGRvZXMgbm90IHJlZmVyZW5jZSBpdHNlbGYgZGlyZWN0bHkuCi0gICAqIElmIGl0IGRvZXMsIHJlcG9ydCB0aGUgZXJyb3Igb24gdGhlIFtub2RlXS4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5UWVBFX0FMSUFTX0NBTk5PVF9SRUZFUkVOQ0VfSVRTRUxGXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gW2VsZW1lbnRdIGRvZXMgbm90IHJlZmVyZW5jZSBpdHNlbGYgZGlyZWN0bHkuCisgIC8vLyBJZiBpdCBkb2VzLCByZXBvcnQgdGhlIGVycm9yIG9uIHRoZSBbbm9kZV0uCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5UWVBFX0FMSUFTX0NBTk5PVF9SRUZFUkVOQ0VfSVRTRUxGXS4KICAgdm9pZCBfY2hlY2tGb3JUeXBlQWxpYXNDYW5ub3RSZWZlcmVuY2VJdHNlbGYoCiAgICAgQXN0Tm9kZSBub2RlLAogICAgIEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCBlbGVtZW50LApAQCAtNDI3MywxMSArNDA3Nyw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBbdHlwZV0gaXMgbm90IGEgZGVmZXJyZWQgdHlwZS4KLSAgICoKLSAgICogU2VlIFtTdGF0aWNXYXJuaW5nQ29kZS5UWVBFX0FOTk9UQVRJT05fREVGRVJSRURfQ0xBU1NdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBbdHlwZV0gaXMgbm90IGEgZGVmZXJyZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLlRZUEVfQU5OT1RBVElPTl9ERUZFUlJFRF9DTEFTU10uCiAgIHZvaWQgX2NoZWNrRm9yVHlwZUFubm90YXRpb25EZWZlcnJlZENsYXNzKFR5cGVBbm5vdGF0aW9uIHR5cGUpIHsKICAgICBpZiAodHlwZSBpcyBUeXBlTmFtZSAmJiB0eXBlLmlzRGVmZXJyZWQpIHsKICAgICAgIF9lcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yRm9yTm9kZSgKQEAgLTQyODUsMTEgKzQwODcsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIHR5cGUgW3BhcmFtZXRlcnNdIHJlZmVyZW5jZXMgaXRzZWxmIGluIGl0cyBib3VuZC4KLSAgICoKLSAgICogU2VlIFtTdGF0aWNUeXBlV2FybmluZ0NvZGUuVFlQRV9QQVJBTUVURVJfU1VQRVJUWVBFX09GX0lUU19CT1VORF0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCBub25lIG9mIHRoZSB0eXBlIFtwYXJhbWV0ZXJzXSByZWZlcmVuY2VzIGl0c2VsZiBpbiBpdHMgYm91bmQuCisgIC8vLworICAvLy8gU2VlIFtTdGF0aWNUeXBlV2FybmluZ0NvZGUuVFlQRV9QQVJBTUVURVJfU1VQRVJUWVBFX09GX0lUU19CT1VORF0uCiAgIHZvaWQgX2NoZWNrRm9yVHlwZVBhcmFtZXRlckJvdW5kUmVjdXJzaW9uKExpc3Q8VHlwZVBhcmFtZXRlcj4gcGFyYW1ldGVycykgewogICAgIE1hcDxUeXBlUGFyYW1ldGVyRWxlbWVudCwgVHlwZVBhcmFtZXRlcj4gZWxlbWVudFRvTm9kZTsKICAgICBmb3IgKHZhciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycykgewpAQCAtNDMzNywxNSArNDEzNywxMyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGlmIHRoZSBnaXZlbiBnZW5lcmF0aXZlIFtjb25zdHJ1Y3Rvcl0gaGFzIG5laXRoZXIgYW4gZXhwbGljaXQKLSAgICogc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiBub3IgYSByZWRpcmVjdGluZyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLCB0aGF0Ci0gICAqIHRoZSBzdXBlcmNsYXNzIGhhcyBhIGRlZmF1bHQgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5VTkRFRklORURfQ09OU1RSVUNUT1JfSU5fSU5JVElBTElaRVJfREVGQVVMVF0sCi0gICAqIFtDb21waWxlVGltZUVycm9yQ29kZS5OT05fR0VORVJBVElWRV9DT05TVFJVQ1RPUl0sIGFuZAotICAgKiBbU3RhdGljV2FybmluZ0NvZGUuTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9FWFBMSUNJVF0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCBpZiB0aGUgZ2l2ZW4gZ2VuZXJhdGl2ZSBbY29uc3RydWN0b3JdIGhhcyBuZWl0aGVyIGFuIGV4cGxpY2l0CisgIC8vLyBzdXBlciBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIG5vciBhIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIGludm9jYXRpb24sCisgIC8vLyB0aGF0IHRoZSBzdXBlcmNsYXNzIGhhcyBhIGRlZmF1bHQgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3Rvci4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLlVOREVGSU5FRF9DT05TVFJVQ1RPUl9JTl9JTklUSUFMSVpFUl9ERUZBVUxUXSwKKyAgLy8vIFtDb21waWxlVGltZUVycm9yQ29kZS5OT05fR0VORVJBVElWRV9DT05TVFJVQ1RPUl0sIGFuZAorICAvLy8gW1N0YXRpY1dhcm5pbmdDb2RlLk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfRVhQTElDSVRdLgogICB2b2lkIF9jaGVja0ZvclVuZGVmaW5lZENvbnN0cnVjdG9ySW5Jbml0aWFsaXplckltcGxpY2l0KAogICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvcikgewogICAgIGlmIChfZW5jbG9zaW5nQ2xhc3MgPT0gbnVsbCkgewpAQCAtNDQ0NywxMiArNDI0NSwxMSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGlmIHRoZSBnaXZlbiBbbmFtZV0gaXMgYSByZWZlcmVuY2UgdG8gYSBzdGF0aWMgbWVtYmVyIGl0IGlzCi0gICAqIGRlZmluZWQgaW4gdGhlIGVuY2xvc2luZyBjbGFzcyByYXRoZXIgdGhhbiBpbiBhIHN1cGVyY2xhc3MuCi0gICAqCi0gICAqIFNlZSBbU3RhdGljVHlwZVdhcm5pbmdDb2RlLlVOUVVBTElGSUVEX1JFRkVSRU5DRV9UT19OT05fTE9DQUxfU1RBVElDX01FTUJFUl0uCi0gICAqLworICAvLy8gQ2hlY2sgdGhhdCBpZiB0aGUgZ2l2ZW4gW25hbWVdIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3RhdGljIG1lbWJlciBpdCBpcworICAvLy8gZGVmaW5lZCBpbiB0aGUgZW5jbG9zaW5nIGNsYXNzIHJhdGhlciB0aGFuIGluIGEgc3VwZXJjbGFzcy4KKyAgLy8vCisgIC8vLyBTZWUKKyAgLy8vIFtTdGF0aWNUeXBlV2FybmluZ0NvZGUuVU5RVUFMSUZJRURfUkVGRVJFTkNFX1RPX05PTl9MT0NBTF9TVEFUSUNfTUVNQkVSXS4KICAgdm9pZCBfY2hlY2tGb3JVbnF1YWxpZmllZFJlZmVyZW5jZVRvTm9uTG9jYWxTdGF0aWNNZW1iZXIoCiAgICAgICBTaW1wbGVJZGVudGlmaWVyIG5hbWUpIHsKICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lLnN0YXRpY0VsZW1lbnQ7CkBAIC00NDkyLDE1ICs0Mjg5LDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFdoaWxlIGluIGdlbmVyYWwgTmV2ZXIgaXMgYSBzb3J0IG9mIHBsYWNlaG9sZCB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzYWJsZQotICAgKiBhbnl3aGVyZSwgd2UgZXhwbGljaXRseSBiYXIgaXQgZnJvbSBzb21lIGR1YmlvdXMgc3ludGFjdGljIGxvY2F0aW9ucyBzdWNoCi0gICAqIGFzIGNhbGxpbmcgYSBtZXRob2Qgb24gTmV2ZXIsIHdoaWNoIGluIHByYWN0aWNlIHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UKLSAgICogYCh0aHJvdyB4KS50b1N0cmluZygpYCB3aGljaCBpcyBjbGVhcmx5IHNvbWV0aGluZyBiZXR3ZWVuIGEgbWlzdGFrZSBhbmQKLSAgICogZGVhZCBjb2RlLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLlJFQ0VJVkVSX09GX1RZUEVfTkVWRVJdLgotICAgKi8KKyAgLy8vIFdoaWxlIGluIGdlbmVyYWwgTmV2ZXIgaXMgYSBzb3J0IG9mIHBsYWNlaG9sZCB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzYWJsZQorICAvLy8gYW55d2hlcmUsIHdlIGV4cGxpY2l0bHkgYmFyIGl0IGZyb20gc29tZSBkdWJpb3VzIHN5bnRhY3RpYyBsb2NhdGlvbnMgc3VjaAorICAvLy8gYXMgY2FsbGluZyBhIG1ldGhvZCBvbiBOZXZlciwgd2hpY2ggaW4gcHJhY3RpY2Ugd291bGQgbG9vayBzb21ldGhpbmcgbGlrZQorICAvLy8gYCh0aHJvdyB4KS50b1N0cmluZygpYCB3aGljaCBpcyBjbGVhcmx5IHNvbWV0aGluZyBiZXR3ZWVuIGEgbWlzdGFrZSBhbmQKKyAgLy8vIGRlYWQgY29kZS4KKyAgLy8vCisgIC8vLyBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLlJFQ0VJVkVSX09GX1RZUEVfTkVWRVJdLgogICBib29sIF9jaGVja0ZvclVzZU9mTmV2ZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCB8fAogICAgICAgICAhaWRlbnRpY2FsKGV4cHJlc3Npb24uc3RhdGljVHlwZSwgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKQEAgLTQ1MTMsMTMgKzQzMDgsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgcmVzdWx0IG9mIGEgbWV0aG9kIG9yIGZ1bmN0aW9uIGlzIHVzZWQsIHdoZW4KLSAgICogaXQgcmV0dXJucyAndm9pZCcuIE9yLCBpbiByYXJlIGNhc2VzLCB3aGVuIG90aGVyIHR5cGVzIG9mIGV4cHJlc3Npb25zIGFyZQotICAgKiB2b2lkLCBzdWNoIGFzIGlkZW50aWZpZXJzLgotICAgKgotICAgKiBTZWUgW1N0YXRpY1dhcm5pbmdDb2RlLlVTRV9PRl9WT0lEX1JFU1VMVF0uCi0gICAqLworICAvLy8gQ2hlY2sgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCBvciBmdW5jdGlvbiBpcyB1c2VkLAorICAvLy8gd2hlbiBpdCByZXR1cm5zICd2b2lkJy4gT3IsIGluIHJhcmUgY2FzZXMsIHdoZW4gb3RoZXIgdHlwZXMgb2YgZXhwcmVzc2lvbnMKKyAgLy8vIGFyZSB2b2lkLCBzdWNoIGFzIGlkZW50aWZpZXJzLgorICAvLy8KKyAgLy8vIFNlZSBbU3RhdGljV2FybmluZ0NvZGUuVVNFX09GX1ZPSURfUkVTVUxUXS4KICAgYm9vbCBfY2hlY2tGb3JVc2VPZlZvaWRSZXN1bHQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCB8fAogICAgICAgICAhaWRlbnRpY2FsKGV4cHJlc3Npb24uc3RhdGljVHlwZSwgVm9pZFR5cGVJbXBsLmluc3RhbmNlKSkgewpAQCAtNDU5NiwxNSArNDM4OSwxMyBAQAogLy8gICAgICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIGdpdmVuIG9wZXJhdG9yLW1ldGhvZCBbZGVjbGFyYXRpb25dLCBoYXMgY29ycmVjdCBudW1iZXIgb2YKLSAgICogcGFyYW1ldGVycy4KLSAgICoKLSAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXRob2QgZGVjbGFyYXRpb24gd2FzIHRlc3RlZCB0byBiZSBhbgotICAgKiBvcGVyYXRvciBkZWNsYXJhdGlvbiBiZWZvcmUgYmVpbmcgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9PUEVSQVRPUl0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoZSBnaXZlbiBvcGVyYXRvci1tZXRob2QgW2RlY2xhcmF0aW9uXSwgaGFzIGNvcnJlY3QgbnVtYmVyIG9mCisgIC8vLyBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHdhcyB0ZXN0ZWQgdG8gYmUgYW4KKyAgLy8vIG9wZXJhdG9yIGRlY2xhcmF0aW9uIGJlZm9yZSBiZWluZyBjYWxsZWQuCisgIC8vLworICAvLy8gU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5XUk9OR19OVU1CRVJfT0ZfUEFSQU1FVEVSU19GT1JfT1BFUkFUT1JdLgogICB2b2lkIF9jaGVja0Zvcldyb25nTnVtYmVyT2ZQYXJhbWV0ZXJzRm9yT3BlcmF0b3IoCiAgICAgICBNZXRob2REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogICAgIC8vIHByZXBhcmUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKQEAgLTQ2NTYsMTYgKzQ0NDcsMTQgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIHNldHRlciBbcGFyYW1ldGVyTGlzdF0gaGFzIG9ubHkgb25lIHJlcXVpcmVkCi0gICAqIHBhcmFtZXRlci4gVGhlIFtzZXR0ZXJOYW1lXSBpcyB0aGUgbmFtZSBvZiB0aGUgc2V0dGVyIHRvIHJlcG9ydCBwcm9ibGVtcwotICAgKiBvbi4KLSAgICoKLSAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBtZXRob2QgZGVjbGFyYXRpb24gd2FzIHRlc3RlZCB0byBiZSBhIHNldHRlcgotICAgKiBiZWZvcmUgYmVpbmcgY2FsbGVkLgotICAgKgotICAgKiBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLldST05HX05VTUJFUl9PRl9QQVJBTUVURVJTX0ZPUl9TRVRURVJdLgotICAgKi8KKyAgLy8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBzZXR0ZXIgW3BhcmFtZXRlckxpc3RdIGhhcyBvbmx5IG9uZSByZXF1aXJlZAorICAvLy8gcGFyYW1ldGVyLiBUaGUgW3NldHRlck5hbWVdIGlzIHRoZSBuYW1lIG9mIHRoZSBzZXR0ZXIgdG8gcmVwb3J0IHByb2JsZW1zCisgIC8vLyBvbi4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiB3YXMgdGVzdGVkIHRvIGJlIGEgc2V0dGVyCisgIC8vLyBiZWZvcmUgYmVpbmcgY2FsbGVkLgorICAvLy8KKyAgLy8vIFNlZSBbQ29tcGlsZVRpbWVFcnJvckNvZGUuV1JPTkdfTlVNQkVSX09GX1BBUkFNRVRFUlNfRk9SX1NFVFRFUl0uCiAgIHZvaWQgX2NoZWNrRm9yV3JvbmdOdW1iZXJPZlBhcmFtZXRlcnNGb3JTZXR0ZXIoCiAgICAgICBTaW1wbGVJZGVudGlmaWVyIHNldHRlck5hbWUsIEZvcm1hbFBhcmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdCkgewogICAgIGlmIChzZXR0ZXJOYW1lID09IG51bGwgfHwgcGFyYW1ldGVyTGlzdCA9PSBudWxsKSB7CkBAIC00ODA3LDIxICs0NTk2LDE5IEBACiAgICAgX2VuY2xvc2luZ0NsYXNzLnN1cGVyY2xhc3NDb25zdHJhaW50cy5mb3JFYWNoKGNoZWNrT25lKTsKICAgfQogCi0gIC8qKgotICAgKiBDaGVjayBmb3IgaW52YWxpZCB2YXJpYW5jZSBwb3NpdGlvbnMgaW4gbWVtYmVycyBvZiBhIGNsYXNzIG9yIG1peGluLgotICAgKgotICAgKiBMZXQgYENgIGJlIGEgY2xhc3Mgb3IgbWl4aW4gZGVjbGFyYXRpb24gd2l0aCB0eXBlIHBhcmFtZXRlciBgVGAuCi0gICAqIElmIGBUYCBpcyBhbiBgb3V0YCB0eXBlIHBhcmFtZXRlciB0aGVuIGBUYCBjYW4gb25seSBhcHBlYXIgaW4gY292YXJpYW50Ci0gICAqIHBvc2l0aW9ucyB3aXRoaW4gdGhlIGFjY2Vzc29ycyBhbmQgbWV0aG9kcyBvZiBgQ2AuCi0gICAqIElmIGBUYCBpcyBhbiBgaW5gIHR5cGUgcGFyYW1ldGVyIHRoZW4gYFRgIGNhbiBvbmx5IGFwcGVhciBpbiBjb250cmF2YXJpYW50Ci0gICAqIHBvc2l0aW9ucyB3aXRoaW4gdGhlIGFjY2Vzc29ycyBhbmQgbWV0aG9kcyBvZiBgQ2AuCi0gICAqIElmIGBUYCBpcyBhbiBgaW5vdXRgIHR5cGUgcGFyYW1ldGVyIG9yIGEgdHlwZSBwYXJhbWV0ZXIgd2l0aCBubyBleHBsaWNpdAotICAgKiB2YXJpYW5jZSBtb2RpZmllciB0aGVuIGBUYCBjYW4gYXBwZWFyIGluIGFueSB2YXJpYW50IHBvc2l0aW9uIHdpdGhpbiB0aGUKLSAgICogYWNjZXNzb3JzIGFuZCBtZXRob2RzIG9mIGBDYC4KLSAgICoKLSAgICogRXJyb3JzIHNob3VsZCBvbmx5IGJlIHJlcG9ydGVkIGluIGNsYXNzZXMgYW5kIG1peGlucyBzaW5jZSB0aG9zZSBhcmUgdGhlCi0gICAqIG9ubHkgY29tcG9uZW50cyB0aGF0IGFsbG93IGV4cGxpY2l0IHZhcmlhbmNlIG1vZGlmaWVycy4KLSAgICovCisgIC8vLyBDaGVjayBmb3IgaW52YWxpZCB2YXJpYW5jZSBwb3NpdGlvbnMgaW4gbWVtYmVycyBvZiBhIGNsYXNzIG9yIG1peGluLgorICAvLy8KKyAgLy8vIExldCBgQ2AgYmUgYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbiB3aXRoIHR5cGUgcGFyYW1ldGVyIGBUYC4KKyAgLy8vIElmIGBUYCBpcyBhbiBgb3V0YCB0eXBlIHBhcmFtZXRlciB0aGVuIGBUYCBjYW4gb25seSBhcHBlYXIgaW4gY292YXJpYW50CisgIC8vLyBwb3NpdGlvbnMgd2l0aGluIHRoZSBhY2Nlc3NvcnMgYW5kIG1ldGhvZHMgb2YgYENgLgorICAvLy8gSWYgYFRgIGlzIGFuIGBpbmAgdHlwZSBwYXJhbWV0ZXIgdGhlbiBgVGAgY2FuIG9ubHkgYXBwZWFyIGluIGNvbnRyYXZhcmlhbnQKKyAgLy8vIHBvc2l0aW9ucyB3aXRoaW4gdGhlIGFjY2Vzc29ycyBhbmQgbWV0aG9kcyBvZiBgQ2AuCisgIC8vLyBJZiBgVGAgaXMgYW4gYGlub3V0YCB0eXBlIHBhcmFtZXRlciBvciBhIHR5cGUgcGFyYW1ldGVyIHdpdGggbm8gZXhwbGljaXQKKyAgLy8vIHZhcmlhbmNlIG1vZGlmaWVyIHRoZW4gYFRgIGNhbiBhcHBlYXIgaW4gYW55IHZhcmlhbnQgcG9zaXRpb24gd2l0aGluIHRoZQorICAvLy8gYWNjZXNzb3JzIGFuZCBtZXRob2RzIG9mIGBDYC4KKyAgLy8vCisgIC8vLyBFcnJvcnMgc2hvdWxkIG9ubHkgYmUgcmVwb3J0ZWQgaW4gY2xhc3NlcyBhbmQgbWl4aW5zIHNpbmNlIHRob3NlIGFyZSB0aGUKKyAgLy8vIG9ubHkgY29tcG9uZW50cyB0aGF0IGFsbG93IGV4cGxpY2l0IHZhcmlhbmNlIG1vZGlmaWVycy4KICAgdm9pZCBfY2hlY2tGb3JXcm9uZ1ZhcmlhbmNlUG9zaXRpb24oCiAgICAgICBWYXJpYW5jZSB2YXJpYW5jZSwgVHlwZVBhcmFtZXRlckVsZW1lbnQgdHlwZVBhcmFtZXRlciwgQXN0Tm9kZSBub2RlKSB7CiAgICAgVHlwZVBhcmFtZXRlckVsZW1lbnRJbXBsIHR5cGVQYXJhbWV0ZXJJbXBsID0KQEAgLTQ4MzksMTIgKzQ2MjYsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIGdpdmVuIGNsYXNzIFtkZWNsYXJhdGlvbl0gZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBjbGFzcyBpbgotICAgKiB0aGUgJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcy4KLSAgICoKLSAgICogU2VlIFtDb21waWxlVGltZUVycm9yQ29kZS5JTVBMRU1FTlRTX1NVUEVSX0NMQVNTXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gY2xhc3MgW2RlY2xhcmF0aW9uXSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGNsYXNzIGluCisgIC8vLyB0aGUgJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcy4KKyAgLy8vCisgIC8vLyBTZWUgW0NvbXBpbGVUaW1lRXJyb3JDb2RlLklNUExFTUVOVFNfU1VQRVJfQ0xBU1NdLgogICB2b2lkIF9jaGVja0ltcGxlbWVudHNTdXBlckNsYXNzKEltcGxlbWVudHNDbGF1c2UgaW1wbGVtZW50c0NsYXVzZSkgewogICAgIC8vIHByZXBhcmUgc3VwZXIgdHlwZQogICAgIEludGVyZmFjZVR5cGUgc3VwZXJUeXBlID0gX2VuY2xvc2luZ0NsYXNzLnN1cGVydHlwZTsKQEAgLTQ5MTQsMTAgKzQ2OTksOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDaGVja3MgdGhlIGNsYXNzIGZvciBwcm9ibGVtcyB3aXRoIHRoZSBzdXBlcmNsYXNzLCBtaXhpbnMsIG9yIGltcGxlbWVudGVkCi0gICAqIGludGVyZmFjZXMuCi0gICAqLworICAvLy8gQ2hlY2tzIHRoZSBjbGFzcyBmb3IgcHJvYmxlbXMgd2l0aCB0aGUgc3VwZXJjbGFzcywgbWl4aW5zLCBvciBpbXBsZW1lbnRlZAorICAvLy8gaW50ZXJmYWNlcy4KICAgdm9pZCBfY2hlY2tNaXhpbkluaGVyaXRhbmNlKE1peGluRGVjbGFyYXRpb24gbm9kZSwgT25DbGF1c2Ugb25DbGF1c2UsCiAgICAgICBJbXBsZW1lbnRzQ2xhdXNlIGltcGxlbWVudHNDbGF1c2UpIHsKICAgICAvLyBPbmx5IGNoZWNrIGZvciBhbGwgb2YgdGhlIGluaGVyaXRhbmNlIGxvZ2ljIGFyb3VuZCBjbGF1c2VzIGlmIHRoZXJlCkBAIC01MTA1LDEwICs0ODg4LDggQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiBhbiBbZXhwcmVzc2lvbl0gaW4gYSBzd2l0Y2ggY2FzZSB3aG9zZSB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhbgotICAgKiBlbnVtIGNvbnN0YW50LCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50LgotICAgKi8KKyAgLy8vIEdpdmVuIGFuIFtleHByZXNzaW9uXSBpbiBhIHN3aXRjaCBjYXNlIHdob3NlIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGFuCisgIC8vLyBlbnVtIGNvbnN0YW50LCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50LgogICBTdHJpbmcgX2dldENvbnN0YW50TmFtZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICAvLyBUT0RPKGJyaWFud2lsa2Vyc29uKSBDb252ZXJ0IHRoaXMgdG8gcmV0dXJuIHRoZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUKICAgICAvLyBjb25zdGFudC4KQEAgLTUxMjIsOSArNDkwMyw3IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtpbmQgb2YgdGhlIFtlbGVtZW50XS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUga2luZCBvZiB0aGUgW2VsZW1lbnRdLgogICBTdHJpbmcgX2dldEtpbmQoRXhlY3V0YWJsZUVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmIChlbGVtZW50IGlzIE1ldGhvZEVsZW1lbnQpIHsKICAgICAgIHJldHVybiAnbWV0aG9kJzsKQEAgLTUxNDgsOSArNDkyNyw3IEBACiAgICAgcmV0dXJuICdtZW1iZXInOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0aGF0IGRlZmluZXMgZ2l2ZW4gW2VsZW1lbnRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0aGF0IGRlZmluZXMgZ2l2ZW4gW2VsZW1lbnRdLgogICBTdHJpbmcgX2dldExpYnJhcnlOYW1lKEVsZW1lbnQgZWxlbWVudCkgewogICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKICAgICAgIHJldHVybiBTdHJpbmdVdGlsaXRpZXMuRU1QVFk7CkBAIC01MjEwLDEwICs0OTg3LDggQEAKICAgICAgICAgKHBhcmVudCkgPT4gcGFyZW50Lmxvb2tVcENvbmNyZXRlTWV0aG9kKG5hbWUsIHBhcmVudC5saWJyYXJ5KSAhPSBudWxsKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbY29uc3RydWN0b3JdIHJlZGlyZWN0cyB0byBpdHNlbGYsIGRpcmVjdGx5IG9yCi0gICAqIGluZGlyZWN0bHkuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2NvbnN0cnVjdG9yXSByZWRpcmVjdHMgdG8gaXRzZWxmLCBkaXJlY3RseSBvcgorICAvLy8gaW5kaXJlY3RseS4KICAgYm9vbCBfaGFzUmVkaXJlY3RpbmdGYWN0b3J5Q29uc3RydWN0b3JDeWNsZShDb25zdHJ1Y3RvckVsZW1lbnQgY29uc3RydWN0b3IpIHsKICAgICBTZXQ8Q29uc3RydWN0b3JFbGVtZW50PiBjb25zdHJ1Y3RvcnMgPSBIYXNoU2V0PENvbnN0cnVjdG9yRWxlbWVudD4oKTsKICAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY3VycmVudCA9IGNvbnN0cnVjdG9yOwpAQCAtNTI0MCw5ICs1MDE1LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gJ3RoaXMnIFtleHByZXNzaW9uXSBpcyBpbiBhIHZhbGlkIGNvbnRleHQuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gJ3RoaXMnIFtleHByZXNzaW9uXSBpcyBpbiBhIHZhbGlkIGNvbnRleHQuCiAgIGJvb2wgX2lzVGhpc0luVmFsaWRDb250ZXh0KFRoaXNFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICBmb3IgKEFzdE5vZGUgbm9kZSA9IGV4cHJlc3Npb24ucGFyZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLnBhcmVudCkgewogICAgICAgaWYgKG5vZGUgaXMgQ29tcGlsYXRpb25Vbml0KSB7CkBAIC01MjY1LDEwICs1MDM4LDggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW2lkZW50aWZpZXJdIGlzIGluIGEgbG9jYXRpb24gd2hlcmUgaXQgaXMKLSAgICogYWxsb3dlZCB0byByZXNvbHZlIHRvIGEgc3RhdGljIG1lbWJlciBvZiBhIHN1cGVydHlwZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbaWRlbnRpZmllcl0gaXMgaW4gYSBsb2NhdGlvbiB3aGVyZSBpdCBpcworICAvLy8gYWxsb3dlZCB0byByZXNvbHZlIHRvIGEgc3RhdGljIG1lbWJlciBvZiBhIHN1cGVydHlwZS4KICAgYm9vbCBfaXNVbnF1YWxpZmllZFJlZmVyZW5jZVRvTm9uTG9jYWxTdGF0aWNNZW1iZXJBbGxvd2VkKAogICAgICAgU2ltcGxlSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgICAgaWYgKGlkZW50aWZpZXIuaW5EZWNsYXJhdGlvbkNvbnRleHQoKSkgewpAQCAtNTMyNSwxMCArNTA5Niw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBbRmllbGRFbGVtZW50XXMgdGhhdCBhcmUgZGVjbGFyZWQgaW4gdGhlIFtDbGFzc0RlY2xhcmF0aW9uXSB3aXRoCi0gICAqIHRoZSBnaXZlbiBbY29uc3RydWN0b3JdLCBidXQgYXJlIG5vdCBpbml0aWFsaXplZC4KLSAgICovCisgIC8vLyBSZXR1cm4gW0ZpZWxkRWxlbWVudF1zIHRoYXQgYXJlIGRlY2xhcmVkIGluIHRoZSBbQ2xhc3NEZWNsYXJhdGlvbl0gd2l0aAorICAvLy8gdGhlIGdpdmVuIFtjb25zdHJ1Y3Rvcl0sIGJ1dCBhcmUgbm90IGluaXRpYWxpemVkLgogICBzdGF0aWMgTGlzdDxGaWVsZEVsZW1lbnQ+IGNvbXB1dGVOb3RJbml0aWFsaXplZEZpZWxkcygKICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IpIHsKICAgICBTZXQ8RmllbGRFbGVtZW50PiBmaWVsZHMgPSA8RmllbGRFbGVtZW50Pnt9OwpAQCAtNTM2NCwxMCArNTEzMyw4IEBACiAgICAgcmV0dXJuIGZpZWxkcy50b0xpc3QoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0gdGhhdCBpcyB0byBiZSB1c2VkIGZvcgotICAgKiB0eXBlIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIFtleHByZXNzaW9uXSB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yCisgIC8vLyB0eXBlIGFuYWx5c2lzLgogICBzdGF0aWMgRGFydFR5cGUgZ2V0U3RhdGljVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKICAgICBEYXJ0VHlwZSB0eXBlID0gZXhwcmVzc2lvbi5zdGF0aWNUeXBlOwogICAgIGlmICh0eXBlID09IG51bGwpIHsKQEAgLTUzNzcsMTAgKzUxNDQsOCBAQAogICAgIHJldHVybiB0eXBlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdmFyaWFibGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dLCBvcgotICAgKiBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50LgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgdmFyaWFibGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gW2V4cHJlc3Npb25dLCBvcgorICAvLy8gYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudC4KICAgc3RhdGljIFZhcmlhYmxlRWxlbWVudCBnZXRWYXJpYWJsZUVsZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CiAgICAgaWYgKGV4cHJlc3Npb24gaXMgSWRlbnRpZmllcikgewogICAgICAgRWxlbWVudCBlbGVtZW50ID0gZXhwcmVzc2lvbi5zdGF0aWNFbGVtZW50OwpAQCAtNTQwNiwzMyArNTE3MSwyNSBAQAogICB9CiB9CiAKLS8qKgotICogQSByZWNvcmQgb2YgdGhlIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkZWNsYXJlZCBpbiBzb21lIHNjb3BlIChibG9jayksIGJ1dCBhcmUKLSAqIG5vdCB5ZXQgZGVjbGFyZWQuCi0gKi8KKy8vLyBBIHJlY29yZCBvZiB0aGUgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGRlY2xhcmVkIGluIHNvbWUgc2NvcGUgKGJsb2NrKSwgYnV0CisvLy8gYXJlIG5vdCB5ZXQgZGVjbGFyZWQuCiBjbGFzcyBIaWRkZW5FbGVtZW50cyB7Ci0gIC8qKgotICAgKiBUaGUgZWxlbWVudHMgaGlkZGVuIGluIG91dGVyIHNjb3Blcywgb3IgYG51bGxgIGlmIHRoaXMgaXMgdGhlIG91dGVybW9zdAotICAgKiBzY29wZS4KLSAgICovCisgIC8vLyBUaGUgZWxlbWVudHMgaGlkZGVuIGluIG91dGVyIHNjb3Blcywgb3IgYG51bGxgIGlmIHRoaXMgaXMgdGhlIG91dGVybW9zdAorICAvLy8gc2NvcGUuCiAgIGZpbmFsIEhpZGRlbkVsZW1lbnRzIG91dGVyRWxlbWVudHM7CiAKICAgLy8vIEEgc2V0IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlLCBidXQgYXJlCiAgIC8vLyBub3QgeWV0IGRlY2xhcmVkLgogICBmaW5hbCBTZXQ8RWxlbWVudD4gX2VsZW1lbnRzID0gSGFzaFNldDxFbGVtZW50PigpOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZXQgb2YgaGlkZGVuIGVsZW1lbnRzIHRvIGluY2x1ZGUgYWxsIG9mIHRoZQotICAgKiBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBzZXQgb2YgW291dGVyRWxlbWVudHNdIGFuZCBhbGwgb2YgdGhlIGVsZW1lbnRzCi0gICAqIGRlY2xhcmVkIGluIHRoZSBnaXZlbiBbYmxvY2tdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNldCBvZiBoaWRkZW4gZWxlbWVudHMgdG8gaW5jbHVkZSBhbGwgb2YgdGhlCisgIC8vLyBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBzZXQgb2YgW291dGVyRWxlbWVudHNdIGFuZCBhbGwgb2YgdGhlIGVsZW1lbnRzCisgIC8vLyBkZWNsYXJlZCBpbiB0aGUgZ2l2ZW4gW2Jsb2NrXS4KICAgSGlkZGVuRWxlbWVudHModGhpcy5vdXRlckVsZW1lbnRzLCBCbG9jayBibG9jaykgewogICAgIF9pbml0aWFsaXplRWxlbWVudHMoYmxvY2spOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBzZXQgb2YgZWxlbWVudHMgY29udGFpbnMgdGhlIGdpdmVuIFtlbGVtZW50XS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc2V0IG9mIGVsZW1lbnRzIGNvbnRhaW5zIHRoZSBnaXZlbiBbZWxlbWVudF0uCiAgIGJvb2wgY29udGFpbnMoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgaWYgKF9lbGVtZW50cy5jb250YWlucyhlbGVtZW50KSkgewogICAgICAgcmV0dXJuIHRydWU7CkBAIC01NDQyLDMxICs1MTk5LDI1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCB0aGF0IHRoZSBnaXZlbiBbZWxlbWVudF0gaGFzIGJlZW4gZGVjbGFyZWQsIHNvIGl0IGlzIG5vIGxvbmdlcgotICAgKiBoaWRkZW4uCi0gICAqLworICAvLy8gUmVjb3JkIHRoYXQgdGhlIGdpdmVuIFtlbGVtZW50XSBoYXMgYmVlbiBkZWNsYXJlZCwgc28gaXQgaXMgbm8gbG9uZ2VyCisgIC8vLyBoaWRkZW4uCiAgIHZvaWQgZGVjbGFyZShFbGVtZW50IGVsZW1lbnQpIHsKICAgICBfZWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwogICB9CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgbm90IHlldCBkZWNsYXJlZCB0byBiZSBhbGwgb2YgdGhlCi0gICAqIGVsZW1lbnRzIGRlY2xhcmVkIHNvbWV3aGVyZSBpbiB0aGUgZ2l2ZW4gW2Jsb2NrXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB5ZXQgZGVjbGFyZWQgdG8gYmUgYWxsIG9mIHRoZQorICAvLy8gZWxlbWVudHMgZGVjbGFyZWQgc29tZXdoZXJlIGluIHRoZSBnaXZlbiBbYmxvY2tdLgogICB2b2lkIF9pbml0aWFsaXplRWxlbWVudHMoQmxvY2sgYmxvY2spIHsKICAgICBfZWxlbWVudHMuYWRkQWxsKEJsb2NrU2NvcGUuZWxlbWVudHNJbkJsb2NrKGJsb2NrKSk7CiAgIH0KIH0KIAotLyoqCi0gKiBSZWN1cnNpdmVseSB2aXNpdHMgYW4gQVNULCBsb29raW5nIGZvciBtZXRob2QgaW52b2NhdGlvbnMuCi0gKi8KLWNsYXNzIF9JbnZvY2F0aW9uQ29sbGVjdG9yIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvciB7CisvLy8gUmVjdXJzaXZlbHkgdmlzaXRzIGFuIEFTVCwgbG9va2luZyBmb3IgbWV0aG9kIGludm9jYXRpb25zLgorY2xhc3MgX0ludm9jYXRpb25Db2xsZWN0b3IgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yPHZvaWQ+IHsKICAgZmluYWwgTGlzdDxTdHJpbmc+IHN1cGVyQ2FsbHMgPSA8U3RyaW5nPltdOwogCiAgIEBvdmVycmlkZQotICB2aXNpdE1ldGhvZEludm9jYXRpb24oTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNZXRob2RJbnZvY2F0aW9uKE1ldGhvZEludm9jYXRpb24gbm9kZSkgewogICAgIGlmIChub2RlLnRhcmdldCBpcyBTdXBlckV4cHJlc3Npb24pIHsKICAgICAgIHN1cGVyQ2FsbHMuYWRkKG5vZGUubWV0aG9kTmFtZS5uYW1lKTsKICAgICB9CkBAIC01NDc0LDE2ICs1MjI1LDE0IEBACiAgIH0KIH0KIAotLyoqCi0gKiBSZWN1cnNpdmVseSB2aXNpdHMgYSB0eXBlIGFubm90YXRpb24sIGxvb2tpbmcgdW5pbnN0YW50aWF0ZWQgYm91bmRzLgotICovCi1jbGFzcyBfVW5pbnN0YW50aWF0ZWRCb3VuZENoZWNrZXIgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yIHsKKy8vLyBSZWN1cnNpdmVseSB2aXNpdHMgYSB0eXBlIGFubm90YXRpb24sIGxvb2tpbmcgdW5pbnN0YW50aWF0ZWQgYm91bmRzLgorY2xhc3MgX1VuaW5zdGFudGlhdGVkQm91bmRDaGVja2VyIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvcjx2b2lkPiB7CiAgIGZpbmFsIEVycm9yUmVwb3J0ZXIgX2Vycm9yUmVwb3J0ZXI7CiAKICAgX1VuaW5zdGFudGlhdGVkQm91bmRDaGVja2VyKHRoaXMuX2Vycm9yUmVwb3J0ZXIpOwogCiAgIEBvdmVycmlkZQotICB2aXNpdFR5cGVOYW1lKG5vZGUpIHsKKyAgdm9pZCB2aXNpdFR5cGVOYW1lKG5vZGUpIHsKICAgICB2YXIgdHlwZUFyZ3MgPSBub2RlLnR5cGVBcmd1bWVudHM7CiAgICAgaWYgKHR5cGVBcmdzICE9IG51bGwpIHsKICAgICAgIHR5cGVBcmdzLmFjY2VwdCh0aGlzKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9mZmlfdmVyaWZpZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9mZmlfdmVyaWZpZXIuZGFydAppbmRleCBmNWYxYjE5Li45Y2Y0N2YzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZmZpX3ZlcmlmaWVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2ZmaV92ZXJpZmllci5kYXJ0CkBAIC03LDggKzcsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2xpc3RlbmVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZXJyb3IvZmZpX2NvZGUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIAogLy8vIEEgdmlzaXRvciB1c2VkIHRvIGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgd2F5IHRoZSBgZGFydDpmZmlgIEFQSXMgYXJlIGJlaW5nCiAvLy8gdXNlZC4gU2VlICdwa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9mZmlfY2hlY2tzLm1kJyBmb3IgdGhlIHNwZWNpZmljYXRpb24KQEAgLTIxMCw3ICsyMTAsNyBAQAogICB9CiAKICAgLy8vIFJldHVybnMgYHRydWVgIGlmZiBbbmF0aXZlVHlwZV0gaXMgYSBzdHJ1Y3QgdHlwZS4KLSAgX2lzU3RydWN0Q2xhc3MoRGFydFR5cGUgbmF0aXZlVHlwZSkgeworICBib29sIF9pc1N0cnVjdENsYXNzKERhcnRUeXBlIG5hdGl2ZVR5cGUpIHsKICAgICBpZiAobmF0aXZlVHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICBmaW5hbCBzdXBlckNsYXNzRWxlbWVudCA9IG5hdGl2ZVR5cGUuZWxlbWVudC5zdXBlcnR5cGUuZWxlbWVudDsKICAgICAgIGlmIChzdXBlckNsYXNzRWxlbWVudC5saWJyYXJ5Lm5hbWUgPT0gJ2RhcnQuZmZpJykgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2luY3JlbWVudGFsX3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvaW5jcmVtZW50YWxfcmVzb2x2ZXIuZGFydAppbmRleCA1MmY5MTIyLi5jOWIyYjdlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvaW5jcmVtZW50YWxfcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvaW5jcmVtZW50YWxfcmVzb2x2ZXIuZGFydApAQCAtNSwxMSArNSw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2V4Y2VwdGlvbi9leGNlcHRpb24uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIAotLyoqCi0gKiBUaGUgY29udGV4dCB0byByZXNvbHZlIGFuIFtBc3ROb2RlXSBpbi4KLSAqLworLy8vIFRoZSBjb250ZXh0IHRvIHJlc29sdmUgYW4gW0FzdE5vZGVdIGluLgogY2xhc3MgUmVzb2x1dGlvbkNvbnRleHQgewogICBDb21waWxhdGlvblVuaXRFbGVtZW50IGVuY2xvc2luZ1VuaXQ7CiAgIENsYXNzRGVjbGFyYXRpb24gZW5jbG9zaW5nQ2xhc3NEZWNsYXJhdGlvbjsKQEAgLTE3LDI3ICsxNSwxOSBAQAogICBTY29wZSBzY29wZTsKIH0KIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIFtSZXNvbHV0aW9uQ29udGV4dEJ1aWxkZXJdIGJ1aWxkIHRoZSBjb250ZXh0IGZvciBhCi0gKiBnaXZlbiBub2RlIGluIGFuIEFTVCBzdHJ1Y3R1cmUuIEF0IHRoZSBtb21lbnQsIHRoaXMgY2xhc3Mgb25seSBoYW5kbGVzCi0gKiB0b3AtbGV2ZWwgYW5kIGNsYXNzLWxldmVsIGRlY2xhcmF0aW9ucy4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgW1Jlc29sdXRpb25Db250ZXh0QnVpbGRlcl0gYnVpbGQgdGhlIGNvbnRleHQgZm9yIGEKKy8vLyBnaXZlbiBub2RlIGluIGFuIEFTVCBzdHJ1Y3R1cmUuIEF0IHRoZSBtb21lbnQsIHRoaXMgY2xhc3Mgb25seSBoYW5kbGVzCisvLy8gdG9wLWxldmVsIGFuZCBjbGFzcy1sZXZlbCBkZWNsYXJhdGlvbnMuCiBjbGFzcyBSZXNvbHV0aW9uQ29udGV4dEJ1aWxkZXIgewotICAvKioKLSAgICogVGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGVuY2xvc2luZyBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0uCi0gICAqLworICAvLy8gVGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGVuY2xvc2luZyBbQ29tcGlsYXRpb25Vbml0RWxlbWVudF0uCiAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgX2VuY2xvc2luZ1VuaXQ7CiAKLSAgLyoqCi0gICAqIFRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBlbmNsb3NpbmcgW0NsYXNzRGVjbGFyYXRpb25dLCBvciBgbnVsbGAgaWYgd2UgYXJlCi0gICAqIG5vdCBpbiB0aGUgc2NvcGUgb2YgYSBjbGFzcy4KLSAgICovCisgIC8vLyBUaGUgY2xhc3MgY29udGFpbmluZyB0aGUgZW5jbG9zaW5nIFtDbGFzc0RlY2xhcmF0aW9uXSwgb3IgYG51bGxgIGlmIHdlIGFyZQorICAvLy8gbm90IGluIHRoZSBzY29wZSBvZiBhIGNsYXNzLgogICBDbGFzc0RlY2xhcmF0aW9uIF9lbmNsb3NpbmdDbGFzc0RlY2xhcmF0aW9uOwogCi0gIC8qKgotICAgKiBUaGUgY2xhc3MgY29udGFpbmluZyB0aGUgZW5jbG9zaW5nIFtDbGFzc0VsZW1lbnRdLCBvciBgbnVsbGAgaWYgd2UgYXJlIG5vdAotICAgKiBpbiB0aGUgc2NvcGUgb2YgYSBjbGFzcy4KLSAgICovCisgIC8vLyBUaGUgY2xhc3MgY29udGFpbmluZyB0aGUgZW5jbG9zaW5nIFtDbGFzc0VsZW1lbnRdLCBvciBgbnVsbGAgaWYgd2UgYXJlIG5vdAorICAvLy8gaW4gdGhlIHNjb3BlIG9mIGEgY2xhc3MuCiAgIENsYXNzRWxlbWVudCBfZW5jbG9zaW5nQ2xhc3M7CiAKICAgU2NvcGUgX3Njb3BlRm9yKEFzdE5vZGUgbm9kZSkgewpAQCAtNTIsMTcgKzQyLDE1IEBACiAgICAgcmV0dXJuIF9zY29wZUZvckFzdE5vZGUocGFyZW50KTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNjb3BlIGluIHdoaWNoIHRoZSBnaXZlbiBBU1Qgc3RydWN0dXJlIHNob3VsZCBiZSByZXNvbHZlZC4KLSAgICoKLSAgICogKk5vdGU6KiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aAotICAgKiBbSW5jcmVtZW50YWxSZXNvbHZlci5jYW5CZVJlc29sdmVkXS4KLSAgICoKLSAgICogW25vZGVdIC0gdGhlIHJvb3Qgb2YgdGhlIEFTVCBzdHJ1Y3R1cmUgdG8gYmUgcmVzb2x2ZWQuCi0gICAqCi0gICAqIFRocm93cyBbQW5hbHlzaXNFeGNlcHRpb25dIGlmIHRoZSBBU1Qgc3RydWN0dXJlIGhhcyBub3QgYmVlbiByZXNvbHZlZCBvcgotICAgKiBpcyBub3QgcGFydCBvZiBhIFtDb21waWxhdGlvblVuaXRdCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzY29wZSBpbiB3aGljaCB0aGUgZ2l2ZW4gQVNUIHN0cnVjdHVyZSBzaG91bGQgYmUgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gKk5vdGU6KiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aAorICAvLy8gW0luY3JlbWVudGFsUmVzb2x2ZXIuY2FuQmVSZXNvbHZlZF0uCisgIC8vLworICAvLy8gW25vZGVdIC0gdGhlIHJvb3Qgb2YgdGhlIEFTVCBzdHJ1Y3R1cmUgdG8gYmUgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gVGhyb3dzIFtBbmFseXNpc0V4Y2VwdGlvbl0gaWYgdGhlIEFTVCBzdHJ1Y3R1cmUgaGFzIG5vdCBiZWVuIHJlc29sdmVkIG9yCisgIC8vLyBpcyBub3QgcGFydCBvZiBhIFtDb21waWxhdGlvblVuaXRdCiAgIFNjb3BlIF9zY29wZUZvckFzdE5vZGUoQXN0Tm9kZSBub2RlKSB7CiAgICAgaWYgKG5vZGUgaXMgQ29tcGlsYXRpb25Vbml0KSB7CiAgICAgICByZXR1cm4gX3Njb3BlRm9yQ29tcGlsYXRpb25Vbml0KG5vZGUpOwpAQCAtMTM1LDE0ICsxMjMsMTIgQEAKICAgICByZXR1cm4gTGlicmFyeVNjb3BlKGxpYnJhcnlFbGVtZW50KTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGdpdmVuIEFTVCBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHJlc29sdmVkLgotICAgKgotICAgKiBbbm9kZV0gLSB0aGUgcm9vdCBvZiB0aGUgQVNUIHN0cnVjdHVyZSB0byBiZSByZXNvbHZlZC4KLSAgICoKLSAgICogVGhyb3dzIFtBbmFseXNpc0V4Y2VwdGlvbl0gaWYgdGhlIEFTVCBzdHJ1Y3R1cmUgaGFzIG5vdCBiZWVuIHJlc29sdmVkIG9yCi0gICAqIGlzIG5vdCBwYXJ0IG9mIGEgW0NvbXBpbGF0aW9uVW5pdF0KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGdpdmVuIEFTVCBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHJlc29sdmVkLgorICAvLy8KKyAgLy8vIFtub2RlXSAtIHRoZSByb290IG9mIHRoZSBBU1Qgc3RydWN0dXJlIHRvIGJlIHJlc29sdmVkLgorICAvLy8KKyAgLy8vIFRocm93cyBbQW5hbHlzaXNFeGNlcHRpb25dIGlmIHRoZSBBU1Qgc3RydWN0dXJlIGhhcyBub3QgYmVlbiByZXNvbHZlZCBvcgorICAvLy8gaXMgbm90IHBhcnQgb2YgYSBbQ29tcGlsYXRpb25Vbml0XQogICBzdGF0aWMgUmVzb2x1dGlvbkNvbnRleHQgY29udGV4dEZvcihBc3ROb2RlIG5vZGUpIHsKICAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBBbmFseXNpc0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBjb250ZXh0OiBub2RlIGlzIG51bGwiKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9pbnRlcm5lci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2ludGVybmVyLmRhcnQKaW5kZXggNWQ0YmM2Yy4uYmVmNDY4YyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2ludGVybmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2ludGVybmVyLmRhcnQKQEAgLTksMTAgKzksOCBAQAogZXhwb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvaW50ZXJuZXIuZGFydCcKICAgICBzaG93IEludGVybmVyLCBOdWxsSW50ZXJuZXI7CiAKLS8qKgotICogVGhlIGNsYXNzIGBNYXBwZWRJbnRlcm5lcmAgaW1wbGVtZW50cyBhbiBpbnRlcm5lciB0aGF0IHVzZXMgYSBtYXAgdG8gbWFuYWdlCi0gKiB0aGUgc3RyaW5ncyB0aGF0IGhhdmUgYmVlbiBpbnRlcm5lZC4KLSAqLworLy8vIFRoZSBjbGFzcyBgTWFwcGVkSW50ZXJuZXJgIGltcGxlbWVudHMgYW4gaW50ZXJuZXIgdGhhdCB1c2VzIGEgbWFwIHRvIG1hbmFnZQorLy8vIHRoZSBzdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIGludGVybmVkLgogY2xhc3MgTWFwcGVkSW50ZXJuZXIgaW1wbGVtZW50cyBJbnRlcm5lciB7CiAgIC8vLyBBIHRhYmxlIG1hcHBpbmcgc3RyaW5ncyB0byB0aGVtc2VsdmVzLgogICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IF90YWJsZSA9IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvamF2YV9jb3JlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvamF2YV9jb3JlLmRhcnQKaW5kZXggOTI1OTQxNi4uODAwZDAzZiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2phdmFfY29yZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9qYXZhX2NvcmUuZGFydApAQCAtMiwxMyArMiwxMSBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogSW5zZXJ0cyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGludG8gW3BhdHRlcm5dLgotICoKLSAqICAgICBmb3JtYXQoJ0hlbGxvLCB7MH0hJywgJ0pvaG4nKSA9ICdIZWxsbywgSm9obiEnCi0gKiAgICAgZm9ybWF0KCd7MH0gYXJlIHlvdSB7MX1pbmc/JywgJ0hvdycsICdkbycpID0gJ0hvdyBhcmUgeW91IGRvaW5nPycKLSAqICAgICBmb3JtYXQoJ3swfSBhcmUgeW91IHsxfWluZz8nLCAnV2hhdCcsICdyZWFkJykgPSAnV2hhdCBhcmUgeW91IHJlYWRpbmc/JwotICovCisvLy8gSW5zZXJ0cyB0aGUgZ2l2ZW4gYXJndW1lbnRzIGludG8gW3BhdHRlcm5dLgorLy8vCisvLy8gICAgIGZvcm1hdCgnSGVsbG8sIHswfSEnLCAnSm9obicpID0gJ0hlbGxvLCBKb2huIScKKy8vLyAgICAgZm9ybWF0KCd7MH0gYXJlIHlvdSB7MX1pbmc/JywgJ0hvdycsICdkbycpID0gJ0hvdyBhcmUgeW91IGRvaW5nPycKKy8vLyAgICAgZm9ybWF0KCd7MH0gYXJlIHlvdSB7MX1pbmc/JywgJ1doYXQnLCAncmVhZCcpID0gJ1doYXQgYXJlIHlvdSByZWFkaW5nPycKIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sCiAgICAgW2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzddKSB7CiAgIC8vIFRPRE8ocm55c3Ryb20pOiBUaGlzIGlzIG5vdCB1c2VkIGJ5IGFuYWx5emVyLCBidXQgaXMgY2FsbGVkIGJ5CkBAIC0xNiwxMyArMTQsMTIgQEAKICAgcmV0dXJuIGZvcm1hdExpc3QocGF0dGVybiwgW2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzddKTsKIH0KIAotLyoqCi0gKiBJbnNlcnRzIHRoZSBnaXZlbiBbYXJndW1lbnRzXSBpbnRvIFtwYXR0ZXJuXS4KLSAqCi0gKiAgICAgZm9ybWF0KCdIZWxsbywgezB9IScsIFsnSm9obiddKSA9ICdIZWxsbywgSm9obiEnCi0gKiAgICAgZm9ybWF0KCd7MH0gYXJlIHlvdSB7MX1pbmc/JywgWydIb3cnLCAnZG8nXSkgPSAnSG93IGFyZSB5b3UgZG9pbmc/JwotICogICAgIGZvcm1hdCgnezB9IGFyZSB5b3UgezF9aW5nPycsIFsnV2hhdCcsICdyZWFkJ10pID0gJ1doYXQgYXJlIHlvdSByZWFkaW5nPycKLSAqLworLy8vIEluc2VydHMgdGhlIGdpdmVuIFthcmd1bWVudHNdIGludG8gW3BhdHRlcm5dLgorLy8vCisvLy8gICAgIGZvcm1hdCgnSGVsbG8sIHswfSEnLCBbJ0pvaG4nXSkgPSAnSGVsbG8sIEpvaG4hJworLy8vICAgICBmb3JtYXQoJ3swfSBhcmUgeW91IHsxfWluZz8nLCBbJ0hvdycsICdkbyddKSA9ICdIb3cgYXJlIHlvdSBkb2luZz8nCisvLy8gICAgIGZvcm1hdCgnezB9IGFyZSB5b3UgezF9aW5nPycsIFsnV2hhdCcsICdyZWFkJ10pID0KKy8vLyAgICAgICAgICdXaGF0IGFyZSB5b3UgcmVhZGluZz8nCiBTdHJpbmcgZm9ybWF0TGlzdChTdHJpbmcgcGF0dGVybiwgTGlzdDxPYmplY3Q+IGFyZ3VtZW50cykgewogICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLmlzRW1wdHkpIHsKICAgICBhc3NlcnQoIXBhdHRlcm4uY29udGFpbnMoUmVnRXhwKHInXHsoXGQrKVx9JykpLApAQCAtMzgsOSArMzUsNyBAQAogICB9KTsKIH0KIAotLyoqCi0gKiBWZXJ5IGxpbWl0ZWQgcHJpbnRmIGltcGxlbWVudGF0aW9uLCBzdXBwb3J0cyBvbmx5ICVzIGFuZCAlZC4KLSAqLworLy8vIFZlcnkgbGltaXRlZCBwcmludGYgaW1wbGVtZW50YXRpb24sIHN1cHBvcnRzIG9ubHkgJXMgYW5kICVkLgogU3RyaW5nIF9wcmludGYoU3RyaW5nIGZtdCwgTGlzdCBhcmdzKSB7CiAgIFN0cmluZ0J1ZmZlciBzYiA9IFN0cmluZ0J1ZmZlcigpOwogICBib29sIG1hcmtGb3VuZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2phdmFfZW5naW5lLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydAppbmRleCBlMTUwNTA0Li5jODgyMzBkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydApAQCAtMjksMTAgKzI5LDggQEAKIAogICBzdGF0aWMgSW50ZXJuZXIgSU5URVJORVIgPSBOdWxsSW50ZXJuZXIoKTsKIAotICAvKioKLSAgICogQ29tcHV0ZSBsaW5lIHN0YXJ0cyBmb3IgdGhlIGdpdmVuIFtjb250ZW50XS4KLSAgICogTGluZXMgZW5kIHdpdGggYFxyYCwgYFxuYCBvciBgXHJcbmAuCi0gICAqLworICAvLy8gQ29tcHV0ZSBsaW5lIHN0YXJ0cyBmb3IgdGhlIGdpdmVuIFtjb250ZW50XS4KKyAgLy8vIExpbmVzIGVuZCB3aXRoIGBccmAsIGBcbmAgb3IgYFxyXG5gLgogICBzdGF0aWMgTGlzdDxpbnQ+IGNvbXB1dGVMaW5lU3RhcnRzKFN0cmluZyBjb250ZW50KSB7CiAgICAgTGlzdDxpbnQ+IGxpbmVTdGFydHMgPSA8aW50PlswXTsKICAgICBpbnQgbGVuZ3RoID0gY29udGVudC5sZW5ndGg7CkBAIC01Niw3ICs1NCw3IEBACiAgICAgcmV0dXJuIGxpbmVTdGFydHM7CiAgIH0KIAotICBzdGF0aWMgZW5kc1dpdGgzKFN0cmluZyBzdHIsIGludCBjMSwgaW50IGMyLCBpbnQgYzMpIHsKKyAgc3RhdGljIGJvb2wgZW5kc1dpdGgzKFN0cmluZyBzdHIsIGludCBjMSwgaW50IGMyLCBpbnQgYzMpIHsKICAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDsKICAgICByZXR1cm4gbGVuZ3RoID49IDMgJiYKICAgICAgICAgc3RyLmNvZGVVbml0QXQobGVuZ3RoIC0gMykgPT0gYzEgJiYKQEAgLTY0LDcgKzYyLDcgQEAKICAgICAgICAgc3RyLmNvZGVVbml0QXQobGVuZ3RoIC0gMSkgPT0gYzM7CiAgIH0KIAotICBzdGF0aWMgZW5kc1dpdGhDaGFyKFN0cmluZyBzdHIsIGludCBjKSB7CisgIHN0YXRpYyBib29sIGVuZHNXaXRoQ2hhcihTdHJpbmcgc3RyLCBpbnQgYykgewogICAgIGludCBsZW5ndGggPSBzdHIubGVuZ3RoOwogICAgIHJldHVybiBsZW5ndGggPiAwICYmIHN0ci5jb2RlVW5pdEF0KGxlbmd0aCAtIDEpID09IGM7CiAgIH0KQEAgLTEyNiwxMSArMTI0LDkgQEAKICAgICByZXR1cm4gLTE7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm90IGxldHRlci9kaWdpdCBjaGFyYWN0ZXIgaW4gdGhlIFtzdHJpbmddCi0gICAqIHRoYXQgaXMgYXQgb3IgYWZ0ZXIgdGhlIFtzdGFydEluZGV4XS4gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIFtzdHJpbmddIGlmCi0gICAqIGFsbCBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgYXJlIGxldHRlcnMvZGlnaXRzLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vdCBsZXR0ZXIvZGlnaXQgY2hhcmFjdGVyIGluIHRoZSBbc3RyaW5nXQorICAvLy8gdGhhdCBpcyBhdCBvciBhZnRlciB0aGUgW3N0YXJ0SW5kZXhdLiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgW3N0cmluZ10gaWYKKyAgLy8vIGFsbCBjaGFyYWN0ZXJzIHRvIHRoZSBlbmQgYXJlIGxldHRlcnMvZGlnaXRzLgogICBzdGF0aWMgaW50IGluZGV4T2ZGaXJzdE5vdExldHRlckRpZ2l0KFN0cmluZyBzdHJpbmcsIGludCBzdGFydEluZGV4KSB7CiAgICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKICAgICBpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGg7CkBAIC0xNjgsMTMgKzE2NCwxMyBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFByb2R1Y2UgYSBzdHJpbmcgY29udGFpbmluZyBhbGwgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBhcnJheSwgc3Vycm91bmRlZCBieSBzaW5nbGUgcXVvdGVzLAotICAgKiBhbmQgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gVGhlIGxpc3QgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBlbGVtZW50cy4KLSAgICoKLSAgICogQHBhcmFtIG5hbWVzIHRoZSBuYW1lcyB0byBiZSBwcmludGVkCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBwcmludGluZyB0aGUgbmFtZXMKLSAgICovCisgIC8vLyBQcm9kdWNlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gYXJyYXksCisgIC8vLyBzdXJyb3VuZGVkIGJ5IHNpbmdsZSBxdW90ZXMsIGFuZCBzZXBhcmF0ZWQgYnkgY29tbWFzLgorICAvLy8KKyAgLy8vIFRoZSBsaXN0IG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gZWxlbWVudHMuCisgIC8vLworICAvLy8gQHBhcmFtIG5hbWVzIHRoZSBuYW1lcyB0byBiZSBwcmludGVkCisgIC8vLyBAcmV0dXJuIHRoZSByZXN1bHQgb2YgcHJpbnRpbmcgdGhlIG5hbWVzCiAgIHN0YXRpYyBTdHJpbmcgcHJpbnRMaXN0T2ZRdW90ZWROYW1lcyhMaXN0PFN0cmluZz4gbmFtZXMpIHsKICAgICBpZiAobmFtZXMgPT0gbnVsbCkgewogICAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigiVGhlIGxpc3QgbXVzdCBub3QgYmUgbnVsbCIpOwpAQCAtMTk4LDIwICsxOTQsMjEgQEAKICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgIH0KIAotICBzdGF0aWMgc3RhcnRzV2l0aDIoU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgYzEsIGludCBjMikgeworICBzdGF0aWMgYm9vbCBzdGFydHNXaXRoMihTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBjMSwgaW50IGMyKSB7CiAgICAgcmV0dXJuIHN0ci5sZW5ndGggLSBzdGFydCA+PSAyICYmCiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBjMSAmJgogICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDEpID09IGMyOwogICB9CiAKLSAgc3RhdGljIHN0YXJ0c1dpdGgzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGMxLCBpbnQgYzIsIGludCBjMykgeworICBzdGF0aWMgYm9vbCBzdGFydHNXaXRoMyhTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBjMSwgaW50IGMyLCBpbnQgYzMpIHsKICAgICByZXR1cm4gc3RyLmxlbmd0aCAtIHN0YXJ0ID49IDMgJiYKICAgICAgICAgc3RyLmNvZGVVbml0QXQoc3RhcnQpID09IGMxICYmCiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0ICsgMSkgPT0gYzIgJiYKICAgICAgICAgc3RyLmNvZGVVbml0QXQoc3RhcnQgKyAyKSA9PSBjMzsKICAgfQogCi0gIHN0YXRpYyBzdGFydHNXaXRoNChTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBjMSwgaW50IGMyLCBpbnQgYzMsIGludCBjNCkgeworICBzdGF0aWMgYm9vbCBzdGFydHNXaXRoNCgKKyAgICAgIFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGMxLCBpbnQgYzIsIGludCBjMywgaW50IGM0KSB7CiAgICAgcmV0dXJuIHN0ci5sZW5ndGggLSBzdGFydCA+PSA0ICYmCiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBjMSAmJgogICAgICAgICBzdHIuY29kZVVuaXRBdChzdGFydCArIDEpID09IGMyICYmCkBAIC0yMTksNyArMjE2LDcgQEAKICAgICAgICAgc3RyLmNvZGVVbml0QXQoc3RhcnQgKyAzKSA9PSBjNDsKICAgfQogCi0gIHN0YXRpYyBzdGFydHNXaXRoNSgKKyAgc3RhdGljIGJvb2wgc3RhcnRzV2l0aDUoCiAgICAgICBTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBjMSwgaW50IGMyLCBpbnQgYzMsIGludCBjNCwgaW50IGM1KSB7CiAgICAgcmV0dXJuIHN0ci5sZW5ndGggLSBzdGFydCA+PSA1ICYmCiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBjMSAmJgpAQCAtMjI5LDcgKzIyNiw3IEBACiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0ICsgNCkgPT0gYzU7CiAgIH0KIAotICBzdGF0aWMgc3RhcnRzV2l0aDYoCisgIHN0YXRpYyBib29sIHN0YXJ0c1dpdGg2KAogICAgICAgU3RyaW5nIHN0ciwgaW50IHN0YXJ0LCBpbnQgYzEsIGludCBjMiwgaW50IGMzLCBpbnQgYzQsIGludCBjNSwgaW50IGM2KSB7CiAgICAgcmV0dXJuIHN0ci5sZW5ndGggLSBzdGFydCA+PSA2ICYmCiAgICAgICAgIHN0ci5jb2RlVW5pdEF0KHN0YXJ0KSA9PSBjMSAmJgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3BhcnNlcl9mYXN0YS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3BhcnNlcl9mYXN0YS5kYXJ0CmluZGV4IDhmOTcwNmIuLmEzYTAzYWQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9wYXJzZXJfZmFzdGEuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcGFyc2VyX2Zhc3RhLmRhcnQKQEAgLTQsMjMgKzQsMTcgQEAKIAogcGFydCBvZiBhbmFseXplci5wYXJzZXI7CiAKLS8qKgotICogUHJveHkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFuYWx5emVyIHBhcnNlciwgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlCi0gKiBGYXN0YSBwYXJzZXIuCi0gKi8KKy8vLyBQcm94eSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyLCBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKKy8vLyBGYXN0YSBwYXJzZXIuCiBhYnN0cmFjdCBjbGFzcyBQYXJzZXJBZGFwdGVyIGltcGxlbWVudHMgUGFyc2VyIHsKICAgQG92ZXJyaWRlCiAgIFRva2VuIGN1cnJlbnRUb2tlbjsKIAotICAvKioKLSAgICogVGhlIGZhc3RhIHBhcnNlciBiZWluZyB3cmFwcGVkLgotICAgKi8KKyAgLy8vIFRoZSBmYXN0YSBwYXJzZXIgYmVpbmcgd3JhcHBlZC4KICAgZmluYWwgZmFzdGEuUGFyc2VyIGZhc3RhUGFyc2VyOwogCi0gIC8qKgotICAgKiBUaGUgYnVpbGRlciB3aGljaCBjcmVhdGVzIHRoZSBhbmFseXplciBBU1QgZGF0YSBzdHJ1Y3R1cmVzCi0gICAqIGJhc2VkIG9uIHRoZSBGYXN0YSBwYXJzZXIuCi0gICAqLworICAvLy8gVGhlIGJ1aWxkZXIgd2hpY2ggY3JlYXRlcyB0aGUgYW5hbHl6ZXIgQVNUIGRhdGEgc3RydWN0dXJlcworICAvLy8gYmFzZWQgb24gdGhlIEZhc3RhIHBhcnNlci4KICAgZmluYWwgQXN0QnVpbGRlciBhc3RCdWlsZGVyOwogCiAgIFBhcnNlckFkYXB0ZXIodGhpcy5jdXJyZW50VG9rZW4sIEVycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwgVXJpIGZpbGVVcmksCkBAIC02MCw3ICs1NCw3IEBACiAKICAgLy8vIEFwcGVuZCB0aGUgZ2l2ZW4gdG9rZW4gdG8gdGhlIGVuZCBvZiB0aGUgdG9rZW4gc3RyZWFtLAogICAvLy8gYW5kIHVwZGF0ZSB0aGUgdG9rZW4ncyBvZmZzZXQuCi0gIGFwcGVuZFRva2VuKFRva2VuIHRva2VuLCBUb2tlbiBuZXdUb2tlbikgeworICB2b2lkIGFwcGVuZFRva2VuKFRva2VuIHRva2VuLCBUb2tlbiBuZXdUb2tlbikgewogICAgIHdoaWxlICghdG9rZW4ubmV4dC5pc0VvZikgewogICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwogICAgIH0KQEAgLTM2NSwxMyArMzU5LDkgQEAKICAgRXhwcmVzc2lvbiBwYXJzZVVuYXJ5RXhwcmVzc2lvbigpID0+IHBhcnNlRXhwcmVzc2lvbjIoKTsKIH0KIAotLyoqCi0gKiBSZXBsYWNlbWVudCBwYXJzZXIgYmFzZWQgb24gRmFzdGEuCi0gKi8KKy8vLyBSZXBsYWNlbWVudCBwYXJzZXIgYmFzZWQgb24gRmFzdGEuCiBjbGFzcyBfUGFyc2VyMiBleHRlbmRzIFBhcnNlckFkYXB0ZXIgewotICAvKioKLSAgICogVGhlIHNvdXJjZSBiZWluZyBwYXJzZWQuCi0gICAqLworICAvLy8gVGhlIHNvdXJjZSBiZWluZyBwYXJzZWQuCiAgIEBvdmVycmlkZQogICBmaW5hbCBTb3VyY2UgX3NvdXJjZTsKIApAQCAtMzk2LDUgKzM4Niw1IEBACiAgICAgICAgICAgICBhbGxvd05hdGl2ZUNsYXVzZTogYWxsb3dOYXRpdmVDbGF1c2UpOwogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydAppbmRleCA3MTcwOTYwLi43OWJkZmFjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydApAQCAtMjEsNiArMjEsNyBAQAogICAgIHNob3cgQ29uc3RydWN0b3JNZW1iZXIsIE1lbWJlcjsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L251bGxhYmlsaXR5X2VsaW1pbmF0b3IuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvYXNzaWdubWVudF9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2JpbmFyeV9leHByZXNzaW9uX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2JvZHlfaW5mZXJlbmNlX2NvbnRleHQuZGFydCc7CkBAIC00OSwxNSArNTAsMTQgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3N0YXRpY190eXBlX2FuYWx5emVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9wcm9tb3Rpb25fbWFuYWdlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdmFyaWFibGVfdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIGV4cG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGV4cG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC9jb25zdGFudF92ZXJpZmllci5kYXJ0JzsKK2V4cG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL2V4aXRfZGV0ZWN0b3IuZGFydCc7CiBleHBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7Ci1leHBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIAogLy8vIE1haW50YWlucyBhbmQgbWFuYWdlcyBjb250ZXh0dWFsIHR5cGUgaW5mb3JtYXRpb24gdXNlZCBmb3IKIC8vLyBpbmZlcnJpbmcgdHlwZXMuCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc2RrLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc2RrLmRhcnQKaW5kZXggMGFhYWJjZS4uMmVkNjRhZCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Nkay5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zZGsuZGFydApAQCAtNiwxMTggKzYsNzQgQEAKIAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC92aXNpdG9yLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnCi0gICAgc2hvdyBBbmFseXNpc0NvbnRleHQsIEFuYWx5c2lzT3B0aW9uczsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JyBzaG93IEFuYWx5c2lzQ29udGV4dDsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JyBzaG93IFNvdXJjZTsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19nZW5lcmFsLmRhcnQnOwogCi0vKioKLSAqIEEgRGFydCBTREsgaW5zdGFsbGVkIGluIGEgc3BlY2lmaWVkIGxvY2F0aW9uLgotICovCisvLy8gQSBEYXJ0IFNESyBpbnN0YWxsZWQgaW4gYSBzcGVjaWZpZWQgbG9jYXRpb24uCiBhYnN0cmFjdCBjbGFzcyBEYXJ0U2RrIHsKLSAgLyoqCi0gICAqIFRoZSBzaG9ydCBuYW1lIG9mIHRoZSBkYXJ0IFNESyAnYXN5bmMnIGxpYnJhcnkuCi0gICAqLworICAvLy8gVGhlIHNob3J0IG5hbWUgb2YgdGhlIGRhcnQgU0RLICdhc3luYycgbGlicmFyeS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBEQVJUX0FTWU5DID0gImRhcnQ6YXN5bmMiOwogCi0gIC8qKgotICAgKiBUaGUgc2hvcnQgbmFtZSBvZiB0aGUgZGFydCBTREsgJ2NvcmUnIGxpYnJhcnkuCi0gICAqLworICAvLy8gVGhlIHNob3J0IG5hbWUgb2YgdGhlIGRhcnQgU0RLICdjb3JlJyBsaWJyYXJ5LgogICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfQ09SRSA9ICJkYXJ0OmNvcmUiOwogCi0gIC8qKgotICAgKiBUaGUgc2hvcnQgbmFtZSBvZiB0aGUgZGFydCBTREsgJ2h0bWwnIGxpYnJhcnkuCi0gICAqLworICAvLy8gVGhlIHNob3J0IG5hbWUgb2YgdGhlIGRhcnQgU0RLICdodG1sJyBsaWJyYXJ5LgogICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfSFRNTCA9ICJkYXJ0Omh0bWwiOwogCi0gIC8qKgotICAgKiBUaGUgcHJlZml4IHNoYXJlZCBieSBhbGwgZGFydCBsaWJyYXJ5IFVSSXMuCi0gICAqLworICAvLy8gVGhlIHByZWZpeCBzaGFyZWQgYnkgYWxsIGRhcnQgbGlicmFyeSBVUklzLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIERBUlRfTElCUkFSWV9QUkVGSVggPSAiZGFydDoiOwogCi0gIC8qKgotICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgdGhhdCBpcyByZXR1cm5lZCB3aGVuIHRoZSByZWFsIHZlcnNpb24gbnVtYmVyIGNvdWxkIG5vdAotICAgKiBiZSBkZXRlcm1pbmVkLgotICAgKi8KKyAgLy8vIFRoZSB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIHJldHVybmVkIHdoZW4gdGhlIHJlYWwgdmVyc2lvbiBudW1iZXIgY291bGQgbm90CisgIC8vLyBiZSBkZXRlcm1pbmVkLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9ICIwIjsKIAogICAvLy8gUmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBgYWxsb3dlZF9leHBlcmltZW50cy5qc29uYCBmaWxlLCBvciBgbnVsbGAKICAgLy8vIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSByZWFkLCBlLmcuIGRvZXMgbm90IGV4aXN0LgogICBTdHJpbmcgZ2V0IGFsbG93ZWRFeHBlcmltZW50c0pzb247CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgYW5hbHlzaXMgY29udGV4dCB1c2VkIGZvciBhbGwgb2YgdGhlIHNvdXJjZXMgaW4gdGhpcyBbRGFydFNka10uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBhbmFseXNpcyBjb250ZXh0IHVzZWQgZm9yIGFsbCBvZiB0aGUgc291cmNlcyBpbiB0aGlzIFtEYXJ0U2RrXS4KICAgQW5hbHlzaXNDb250ZXh0IGdldCBjb250ZXh0OwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBsaWJyYXJpZXMgZGVmaW5lZCBpbiB0aGlzIFNESy4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBsaWJyYXJpZXMgZGVmaW5lZCBpbiB0aGlzIFNESy4KICAgTGlzdDxTZGtMaWJyYXJ5PiBnZXQgc2RrTGlicmFyaWVzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGlzIFNESywgb3IgYCIwImAgaWYgdGhlIHJldmlzaW9uIG51bWJlcgotICAgKiBjYW5ub3QgYmUgZGlzY292ZXJlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGlzIFNESywgb3IgYCIwImAgaWYgdGhlIHJldmlzaW9uIG51bWJlcgorICAvLy8gY2Fubm90IGJlIGRpc2NvdmVyZWQuCiAgIFN0cmluZyBnZXQgc2RrVmVyc2lvbjsKIAotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBsaWJyYXJ5IFVSSSdzIGZvciB0aGUgbGlicmFyaWVzIGRlZmluZWQgaW4KLSAgICogdGhpcyBTREsuCi0gICAqLworICAvLy8gUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBsaWJyYXJ5IFVSSSdzIGZvciB0aGUgbGlicmFyaWVzIGRlZmluZWQgaW4KKyAgLy8vIHRoaXMgU0RLLgogICBMaXN0PFN0cmluZz4gZ2V0IHVyaXM7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuICdmaWxlOicgW3VyaV0gaWYgdGhlIGZpbGUgaXMgaW4gdGhpcwotICAgKiBTREssIG9yIGBudWxsYCBpZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhpcyBTREsuCi0gICAqLworICAvLy8gUmV0dXJuIGEgc291cmNlIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gJ2ZpbGU6JyBbdXJpXSBpZiB0aGUgZmlsZSBpcyBpbgorICAvLy8gdGhpcyBTREssIG9yIGBudWxsYCBpZiB0aGUgZmlsZSBpcyBub3QgaW4gdGhpcyBTREsuCiAgIFNvdXJjZSBmcm9tRmlsZVVyaShVcmkgdXJpKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaWJyYXJ5IHJlcHJlc2VudGluZyB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiAnZGFydDonIFt1cmldLAotICAgKiBvciBgbnVsbGAgaWYgdGhlIGdpdmVuIFVSSSBkb2VzIG5vdCBkZW5vdGUgYSBsaWJyYXJ5IGluIHRoaXMgU0RLLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbGlicmFyeSByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gJ2RhcnQ6JyBbdXJpXSwKKyAgLy8vIG9yIGBudWxsYCBpZiB0aGUgZ2l2ZW4gVVJJIGRvZXMgbm90IGRlbm90ZSBhIGxpYnJhcnkgaW4gdGhpcyBTREsuCiAgIFNka0xpYnJhcnkgZ2V0U2RrTGlicmFyeShTdHJpbmcgdXJpKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuICdkYXJ0OicgW3VyaV0sIG9yCi0gICAqIGBudWxsYCBpZiB0aGUgZ2l2ZW4gVVJJIGRvZXMgbm90IGRlbm90ZSBhIGxpYnJhcnkgaW4gdGhpcyBTREsuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuICdkYXJ0OicgW3VyaV0sCisgIC8vLyBvciBgbnVsbGAgaWYgdGhlIGdpdmVuIFVSSSBkb2VzIG5vdCBkZW5vdGUgYSBsaWJyYXJ5IGluIHRoaXMgU0RLLgogICBTb3VyY2UgbWFwRGFydFVyaShTdHJpbmcgdXJpKTsKIH0KIAotLyoqCi0gKiBNYW5hZ2VzIHRoZSBEYXJ0U2RrJ3MgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gQ2xpZW50cyBuZWVkIHRvIGNyZWF0ZSBtdWx0aXBsZQotICogU0RLcyB3aGVuIHRoZSBhbmFseXNpcyBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSBTREsncyBjb250ZXh0cyB3aWxsCi0gKiBwcm9kdWNlIGRpZmZlcmVudCBhbmFseXNpcyByZXN1bHRzLgotICovCisvLy8gTWFuYWdlcyB0aGUgRGFydFNkaydzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIENsaWVudHMgbmVlZCB0byBjcmVhdGUKKy8vLyBtdWx0aXBsZSBTREtzIHdoZW4gdGhlIGFuYWx5c2lzIG9wdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRob3NlIFNESydzIGNvbnRleHRzCisvLy8gd2lsbCBwcm9kdWNlIGRpZmZlcmVudCBhbmFseXNpcyByZXN1bHRzLgogY2xhc3MgRGFydFNka01hbmFnZXIgewotICAvKioKLSAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkZWZhdWx0IFNESy4KLSAgICovCisgIC8vLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgU0RLLgogICBmaW5hbCBTdHJpbmcgZGVmYXVsdFNka0RpcmVjdG9yeTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBpdCBpcyBhY2NlcHRhYmxlIHRvIHVzZSBzdW1tYXJpZXMgd2hlbiB0aGV5IGFyZQotICAgKiBhdmFpbGFibGUuCi0gICAqLwotICBmaW5hbCBib29sIGNhblVzZVN1bW1hcmllczsKLQotICAvKioKLSAgICogQSB0YWJsZSBtYXBwaW5nIChhbiBlbmNvZGluZyBvZikgYW5hbHlzaXMgb3B0aW9ucyBhbmQgU0RLIGxvY2F0aW9ucyB0byB0aGUKLSAgICogRGFydFNkayBmcm9tIHRoYXQgbG9jYXRpb24gdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhvc2Ugb3B0aW9ucy4KLSAgICovCisgIC8vLyBBIHRhYmxlIG1hcHBpbmcgKGFuIGVuY29kaW5nIG9mKSBhbmFseXNpcyBvcHRpb25zIGFuZCBTREsgbG9jYXRpb25zIHRvIHRoZQorICAvLy8gRGFydFNkayBmcm9tIHRoYXQgbG9jYXRpb24gdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhvc2Ugb3B0aW9ucy4KICAgTWFwPFNka0Rlc2NyaXB0aW9uLCBEYXJ0U2RrPiBzZGtNYXAgPSBIYXNoTWFwPFNka0Rlc2NyaXB0aW9uLCBEYXJ0U2RrPigpOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBtYW5hZ2VyLgotICAgKi8KLSAgRGFydFNka01hbmFnZXIodGhpcy5kZWZhdWx0U2RrRGlyZWN0b3J5LCB0aGlzLmNhblVzZVN1bW1hcmllcyk7CisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBtYW5hZ2VyLgorICBEYXJ0U2RrTWFuYWdlcih0aGlzLmRlZmF1bHRTZGtEaXJlY3RvcnksIFtAZGVwcmVjYXRlZCBib29sIGNhblVzZVN1bW1hcmllc10pOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYW55IFNESyB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiBubyBTREtzIGhhdmUgYmVlbgotICAgKiBjcmVhdGVkLgotICAgKi8KKyAgLy8vIFJldHVybiBhbnkgU0RLIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCwgb3IgYG51bGxgIGlmIG5vIFNES3MgaGF2ZSBiZWVuCisgIC8vLyBjcmVhdGVkLgogICBEYXJ0U2RrIGdldCBhbnlTZGsgewogICAgIGlmIChzZGtNYXAuaXNFbXB0eSkgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMjUsMTAgKzgxLDggQEAKICAgICByZXR1cm4gc2RrTWFwLnZhbHVlcy5maXJzdDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgU0RLcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcKLSAgICogbWFuYWdlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9ycyBvZiB0aGUgU0RLcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcKKyAgLy8vIG1hbmFnZWQuCiAgIExpc3Q8U2RrRGVzY3JpcHRpb24+IGdldCBzZGtEZXNjcmlwdG9ycyA9PiBzZGtNYXAua2V5cy50b0xpc3QoKTsKIAogICAvLy8gUmV0dXJuIHRoZSBEYXJ0IFNESyB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gU0RLIFtkZXNjcmlwdGlvbl0uCkBAIC0xMzksMjcgKzkzLDIwIEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIG1hcCBmcm9tIERhcnQgbGlicmFyeSBVUkkncyB0byB0aGUgW1Nka0xpYnJhcnlJbXBsXSByZXByZXNlbnRpbmcgdGhhdAotICogbGlicmFyeS4KLSAqLworLy8vIEEgbWFwIGZyb20gRGFydCBsaWJyYXJ5IFVSSSdzIHRvIHRoZSBbU2RrTGlicmFyeUltcGxdIHJlcHJlc2VudGluZyB0aGF0CisvLy8gbGlicmFyeS4KIGNsYXNzIExpYnJhcnlNYXAgewogICAvLy8gQSB0YWJsZSBtYXBwaW5nIERhcnQgbGlicmFyeSBVUkkncyB0byB0aGUgbGlicmFyeS4KICAgZmluYWwgTWFwPFN0cmluZywgU2RrTGlicmFyeUltcGw+IF9saWJyYXJ5TWFwID0gPFN0cmluZywgU2RrTGlicmFyeUltcGw+e307CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHNkayBsaWJyYXJpZXMgaW4gdGhpcyBtYXBwaW5nLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHNkayBsaWJyYXJpZXMgaW4gdGhpcyBtYXBwaW5nLgogICBMaXN0PFNka0xpYnJhcnk+IGdldCBzZGtMaWJyYXJpZXMgPT4gTGlzdC5mcm9tKF9saWJyYXJ5TWFwLnZhbHVlcyk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgbGlicmFyeSBVUkkncyBmb3Igd2hpY2ggYSBtYXBwaW5nIGlzIGF2YWlsYWJsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgVVJJJ3MgZm9yIHdoaWNoIGEgbWFwcGluZyBpcworICAvLy8gYXZhaWxhYmxlLgogICBMaXN0PFN0cmluZz4gZ2V0IHVyaXMgPT4gX2xpYnJhcnlNYXAua2V5cy50b0xpc3QoKTsKIAotICAvKioKLSAgICogUmV0dXJuIGluZm8gZm9yIGRlYnVnZ2luZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzUyMjYuCi0gICAqLworICAvLy8gUmV0dXJuIGluZm8gZm9yIGRlYnVnZ2luZyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzUyMjYuCiAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGVidWdJbmZvKCkgewogICAgIHZhciBtYXAgPSA8U3RyaW5nLCBPYmplY3Q+e307CiAgICAgZm9yICh2YXIgdXJpIGluIF9saWJyYXJ5TWFwLmtleXMpIHsKQEAgLTE3MiwxMDEgKzExOSw0MiBAQAogICAgIHJldHVybiBtYXA7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuICdkYXJ0OicgW3VyaV0sIG9yIGBudWxsYCBpZiB0aGUgVVJJIGRvZXMKLSAgICogbm90IG1hcCB0byBhIGxpYnJhcnkuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuICdkYXJ0OicgW3VyaV0sIG9yIGBudWxsYCBpZiB0aGUgVVJJIGRvZXMKKyAgLy8vIG5vdCBtYXAgdG8gYSBsaWJyYXJ5LgogICBTZGtMaWJyYXJ5IGdldExpYnJhcnkoU3RyaW5nIHVyaSkgPT4gX2xpYnJhcnlNYXBbdXJpXTsKIAotICAvKioKLSAgICogU2V0IHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuICdkYXJ0OicgW3VyaV0gdG8gdGhlIGdpdmVuIFtsaWJyYXJ5XS4KLSAgICovCisgIC8vLyBTZXQgdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gJ2RhcnQ6JyBbdXJpXSB0byB0aGUgZ2l2ZW4gW2xpYnJhcnldLgogICB2b2lkIHNldExpYnJhcnkoU3RyaW5nIGRhcnRVcmksIFNka0xpYnJhcnlJbXBsIGxpYnJhcnkpIHsKICAgICBfbGlicmFyeU1hcFtkYXJ0VXJpXSA9IGxpYnJhcnk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlicmFyeSBVUkkncyBmb3Igd2hpY2ggYSBtYXBwaW5nIGlzIGF2YWlsYWJsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBsaWJyYXJ5IFVSSSdzIGZvciB3aGljaCBhIG1hcHBpbmcgaXMgYXZhaWxhYmxlLgogICBpbnQgc2l6ZSgpID0+IF9saWJyYXJ5TWFwLmxlbmd0aDsKIH0KIAotLyoqCi0gKiBBIGRlc2NyaXB0aW9uIG9mIGEgW0RhcnRTZGtdLgotICovCisvLy8gQSBkZXNjcmlwdGlvbiBvZiBhIFtEYXJ0U2RrXS4KIGNsYXNzIFNka0Rlc2NyaXB0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBwYXRocyB0byB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBkZWZpbmUgdGhlIFNESy4KLSAgICovCi0gIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXRoczsKKyAgLy8vIFRoZSBwYXRoIG9mIHRoZSBTREsuCisgIGZpbmFsIFN0cmluZyBwYXRoOwogCi0gIC8qKgotICAgKiBUaGUgYW5hbHlzaXMgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgU0RLJ3MgY29udGV4dC4KLSAgICovCi0gIGZpbmFsIEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBTREsgZGVzY3JpcHRpb24gdG8gZGVzY3JpYmUgYW4gU0RLIGJhc2VkIG9uIHRoZQotICAgKiBmaWxlcyBvciBkaXJlY3RvcmllcyBhdCB0aGUgZ2l2ZW4gW3BhdGhzXSB0aGF0IGlzIGFuYWx5emVkIHVzaW5nIHRoZSBnaXZlbgotICAgKiBbb3B0aW9uc10uCi0gICAqLwotICBTZGtEZXNjcmlwdGlvbih0aGlzLnBhdGhzLCB0aGlzLm9wdGlvbnMpOworICBTZGtEZXNjcmlwdGlvbih0aGlzLnBhdGgpOwogCiAgIEBvdmVycmlkZQogICBpbnQgZ2V0IGhhc2hDb2RlIHsKLSAgICBpbnQgaGFzaENvZGUgPSAwOwotICAgIGZvciAoaW50IHZhbHVlIGluIG9wdGlvbnMuc2lnbmF0dXJlKSB7Ci0gICAgICBoYXNoQ29kZSA9IEplbmtpbnNTbWlIYXNoLmNvbWJpbmUoaGFzaENvZGUsIHZhbHVlKTsKLSAgICB9Ci0gICAgZm9yIChTdHJpbmcgcGF0aCBpbiBwYXRocykgewotICAgICAgaGFzaENvZGUgPSBKZW5raW5zU21pSGFzaC5jb21iaW5lKGhhc2hDb2RlLCBwYXRoLmhhc2hDb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEplbmtpbnNTbWlIYXNoLmZpbmlzaChoYXNoQ29kZSk7CisgICAgcmV0dXJuIHBhdGguaGFzaENvZGU7CiAgIH0KIAogICBAb3ZlcnJpZGUKICAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb3RoZXIpIHsKICAgICBpZiAob3RoZXIgaXMgU2RrRGVzY3JpcHRpb24pIHsKLSAgICAgIGlmICghQW5hbHlzaXNPcHRpb25zLnNpZ25hdHVyZXNFcXVhbCgKLSAgICAgICAgICBvcHRpb25zLnNpZ25hdHVyZSwgb3RoZXIub3B0aW9ucy5zaWduYXR1cmUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGludCBsZW5ndGggPSBwYXRocy5sZW5ndGg7Ci0gICAgICBpZiAob3RoZXIucGF0aHMubGVuZ3RoICE9IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChvdGhlci5wYXRoc1tpXSAhPSBwYXRoc1tpXSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gb3RoZXIucGF0aCA9PSBwYXRoOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKLSAgICBib29sIG5lZWRzU2VwYXJhdG9yID0gZmFsc2U7Ci0gICAgdm9pZCBhZGQoU3RyaW5nIG9wdGlvbk5hbWUpIHsKLSAgICAgIGlmIChuZWVkc1NlcGFyYXRvcikgewotICAgICAgICBidWZmZXIud3JpdGUoJywgJyk7Ci0gICAgICB9Ci0gICAgICBidWZmZXIud3JpdGUob3B0aW9uTmFtZSk7Ci0gICAgICBuZWVkc1NlcGFyYXRvciA9IHRydWU7Ci0gICAgfQotCi0gICAgZm9yIChTdHJpbmcgcGF0aCBpbiBwYXRocykgewotICAgICAgYWRkKHBhdGgpOwotICAgIH0KLSAgICBpZiAobmVlZHNTZXBhcmF0b3IpIHsKLSAgICAgIGJ1ZmZlci53cml0ZSgnICcpOwotICAgIH0KLSAgICBidWZmZXIud3JpdGUoJygnKTsKLSAgICBidWZmZXIud3JpdGUob3B0aW9ucy5zaWduYXR1cmUpOwotICAgIGJ1ZmZlci53cml0ZSgnKScpOwotICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcGF0aDsKICAgfQogfQogCkBAIC0yOTUsMTggKzE4MywxNiBAQAogICAvLy8gdGhlIGxpYnJhcnkgY2FuIGJlIHVzZWQuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgX1BMQVRGT1JNUyA9ICJwbGF0Zm9ybXMiOwogCi0gIC8vLyBUaGUgdmFsdWUgb2YgdGhlIFtQTEFURk9STVNdIHBhcmFtZXRlciB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgbGlicmFyeSBjYW4KLSAgLy8vIGJlIHVzZWQgb24gdGhlIFZNLgorICAvLy8gVGhlIHZhbHVlIG9mIHRoZSBbUExBVEZPUk1TXSBwYXJhbWV0ZXIgdXNlZCB0byBzcGVjaWZ5IHRoYXQgdGhlIGxpYnJhcnkKKyAgLy8vIGNhbiBiZSB1c2VkIG9uIHRoZSBWTS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBfVk1fUExBVEZPUk0gPSAiVk1fUExBVEZPUk0iOwogCi0gIC8vLyBUaGUgbGlicmFyeSBtYXAgdGhhdCBpcyBwb3B1bGF0ZWQgYnkgdmlzaXRpbmcgdGhlIEFTVCBzdHJ1Y3R1cmUgcGFyc2VkIGZyb20KLSAgLy8vIHRoZSBjb250ZW50cyBvZiB0aGUgbGlicmFyaWVzIGZpbGUuCisgIC8vLyBUaGUgbGlicmFyeSBtYXAgdGhhdCBpcyBwb3B1bGF0ZWQgYnkgdmlzaXRpbmcgdGhlIEFTVCBzdHJ1Y3R1cmUgcGFyc2VkCisgIC8vLyBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgbGlicmFyaWVzIGZpbGUuCiAgIGZpbmFsIExpYnJhcnlNYXAgX2xpYnJhcmllc01hcCA9IExpYnJhcnlNYXAoKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaWJyYXJ5IG1hcCB0aGF0IHdhcyBwb3B1bGF0ZWQgYnkgdmlzaXRpbmcgdGhlIEFTVCBzdHJ1Y3R1cmUKLSAgICogcGFyc2VkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJpZXMgZmlsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxpYnJhcnkgbWFwIHRoYXQgd2FzIHBvcHVsYXRlZCBieSB2aXNpdGluZyB0aGUgQVNUIHN0cnVjdHVyZQorICAvLy8gcGFyc2VkIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJpZXMgZmlsZS4KICAgTGlicmFyeU1hcCBnZXQgbGlicmFyaWVzTWFwID0+IF9saWJyYXJpZXNNYXA7CiAKICAgLy8gVG8gYmUgYmFja3dhcmRzLWNvbXBhdGlibGUgdGhlIG5ldyBjYXRlZ29yaWVzIGZpZWxkIGlzIHRyYW5zbGF0ZWQgdG8KQEAgLTM3MiwxMTYgKzI1OCw3NyBAQAogICB9CiB9CiAKLS8qKgotICogUmVwcmVzZW50cyBhIHNpbmdsZSBsaWJyYXJ5IGluIHRoZSBTREsKLSAqLworLy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgbGlicmFyeSBpbiB0aGUgU0RLCiBhYnN0cmFjdCBjbGFzcyBTZGtMaWJyYXJ5IHsKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgY29udGFpbmluZyB0aGUgbGlicmFyeS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhdGVnb3J5IGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkuCiAgIFN0cmluZyBnZXQgY2F0ZWdvcnk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBsaWJyYXJ5IGNhbiBiZSBjb21waWxlZCB0byBKYXZhU2NyaXB0IGJ5IGRhcnQyanMuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIGxpYnJhcnkgY2FuIGJlIGNvbXBpbGVkIHRvIEphdmFTY3JpcHQgYnkgZGFydDJqcy4KICAgYm9vbCBnZXQgaXNEYXJ0MkpzTGlicmFyeTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgbGlicmFyeSBpcyBkb2N1bWVudGVkLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGxpYnJhcnkgaXMgZG9jdW1lbnRlZC4KICAgYm9vbCBnZXQgaXNEb2N1bWVudGVkOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBsaWJyYXJ5IGlzIGFuIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgbGlicmFyeSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LgogICBib29sIGdldCBpc0ltcGxlbWVudGF0aW9uOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIGxpYnJhcnkgaXMgaW50ZXJuYWwgY2FuIGJlIHVzZWQgb25seSBieSBvdGhlciBTREsgbGlicmFyaWVzLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgbGlicmFyeSBpcyBpbnRlcm5hbCBjYW4gYmUgdXNlZCBvbmx5IGJ5IG90aGVyIFNESworICAvLy8gbGlicmFyaWVzLgogICBib29sIGdldCBpc0ludGVybmFsOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgbGlicmFyeSBjYW4gYmUgdXNlZCBmb3IgYm90aCBjbGllbnQgYW5kIHNlcnZlci4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgbGlicmFyeSBjYW4gYmUgdXNlZCBmb3IgYm90aCBjbGllbnQgYW5kIHNlcnZlci4KICAgYm9vbCBnZXQgaXNTaGFyZWQ7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBsaWJyYXJ5IGNhbiBiZSBydW4gb24gdGhlIFZNLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBsaWJyYXJ5IGNhbiBiZSBydW4gb24gdGhlIFZNLgogICBib29sIGdldCBpc1ZtTGlicmFyeTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGRlZmluaW5nIHRoZSBsaWJyYXJ5LiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0bwotICAgKiB0aGUgYGxpYmAgZGlyZWN0b3J5IHdpdGhpbiB0aGUgU0RLLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSBkZWZpbmluZyB0aGUgbGlicmFyeS4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8KKyAgLy8vIHRoZSBgbGliYCBkaXJlY3Rvcnkgd2l0aGluIHRoZSBTREsuCiAgIFN0cmluZyBnZXQgcGF0aDsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBsaWJyYXJ5LiBUaGlzIGlzIHRoZSBVUkkgb2YgdGhlIGxpYnJhcnksCi0gICAqIGluY2x1ZGluZyBgZGFydDpgLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgbGlicmFyeS4gVGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBsaWJyYXJ5LAorICAvLy8gaW5jbHVkaW5nIGBkYXJ0OmAuCiAgIFN0cmluZyBnZXQgc2hvcnROYW1lOwogfQogCi0vKioKLSAqIFRoZSBpbmZvcm1hdGlvbiBrbm93biBhYm91dCBhIHNpbmdsZSBsaWJyYXJ5IHdpdGhpbiB0aGUgU0RLLgotICovCisvLy8gVGhlIGluZm9ybWF0aW9uIGtub3duIGFib3V0IGEgc2luZ2xlIGxpYnJhcnkgd2l0aGluIHRoZSBTREsuCiBjbGFzcyBTZGtMaWJyYXJ5SW1wbCBpbXBsZW1lbnRzIFNka0xpYnJhcnkgewotICAvKioKLSAgICogVGhlIGJpdCBtYXNrIHVzZWQgdG8gYWNjZXNzIHRoZSBiaXQgcmVwcmVzZW50aW5nIHRoZSBmbGFnIGluZGljYXRpbmcKLSAgICogd2hldGhlciBhIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gd29yayBvbiB0aGUgZGFydDJqcyBwbGF0Zm9ybS4KLSAgICovCisgIC8vLyBUaGUgYml0IG1hc2sgdXNlZCB0byBhY2Nlc3MgdGhlIGJpdCByZXByZXNlbnRpbmcgdGhlIGZsYWcgaW5kaWNhdGluZworICAvLy8gd2hldGhlciBhIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gd29yayBvbiB0aGUgZGFydDJqcyBwbGF0Zm9ybS4KICAgc3RhdGljIGludCBEQVJUMkpTX1BMQVRGT1JNID0gMTsKIAotICAvKioKLSAgICogVGhlIGJpdCBtYXNrIHVzZWQgdG8gYWNjZXNzIHRoZSBiaXQgcmVwcmVzZW50aW5nIHRoZSBmbGFnIGluZGljYXRpbmcKLSAgICogd2hldGhlciBhIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gd29yayBvbiB0aGUgVk0gcGxhdGZvcm0uCi0gICAqLworICAvLy8gVGhlIGJpdCBtYXNrIHVzZWQgdG8gYWNjZXNzIHRoZSBiaXQgcmVwcmVzZW50aW5nIHRoZSBmbGFnIGluZGljYXRpbmcKKyAgLy8vIHdoZXRoZXIgYSBsaWJyYXJ5IGlzIGludGVuZGVkIHRvIHdvcmsgb24gdGhlIFZNIHBsYXRmb3JtLgogICBzdGF0aWMgaW50IFZNX1BMQVRGT1JNID0gMjsKIAogICBAb3ZlcnJpZGUKICAgZmluYWwgU3RyaW5nIHNob3J0TmFtZTsKIAotICAvKioKLSAgICogVGhlIHBhdGggdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlIGxpYnJhcnkuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZQotICAgKiAnbGliJyBkaXJlY3Rvcnkgd2l0aGluIHRoZSBTREsuCi0gICAqLworICAvLy8gVGhlIHBhdGggdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlIGxpYnJhcnkuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZQorICAvLy8gJ2xpYicgZGlyZWN0b3J5IHdpdGhpbiB0aGUgU0RLLgogICBAb3ZlcnJpZGUKICAgU3RyaW5nIHBhdGg7CiAKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeSBjb250YWluaW5nIHRoZSBsaWJyYXJ5LiBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZAotICAgKiBpbiB0aGUgbGlicmFyaWVzIGZpbGUgYWxsIGxpYnJhcmllcyBhcmUgYXNzdW1lZCB0byBiZSBzaGFyZWQgYmV0d2VlbiBzZXJ2ZXIKLSAgICogYW5kIGNsaWVudC4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkgY29udGFpbmluZyB0aGUgbGlicmFyeS4gVW5sZXNzIG90aGVyd2lzZQorICAvLy8gc3BlY2lmaWVkIGluIHRoZSBsaWJyYXJpZXMgZmlsZSBhbGwgbGlicmFyaWVzIGFyZSBhc3N1bWVkIHRvIGJlIHNoYXJlZAorICAvLy8gYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudC4KICAgQG92ZXJyaWRlCiAgIFN0cmluZyBjYXRlZ29yeSA9ICJTaGFyZWQiOwogCi0gIC8qKgotICAgKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGRvY3VtZW50ZWQuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgbGlicmFyeSBpcyBkb2N1bWVudGVkLgogICBib29sIF9kb2N1bWVudGVkID0gdHJ1ZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgbGlicmFyeSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGxpYnJhcnkgaXMgYW4gaW1wbGVtZW50YXRpb24gbGlicmFyeS4KICAgYm9vbCBfaW1wbGVtZW50YXRpb24gPSBmYWxzZTsKIAotICAvKioKLSAgICogQW4gZW5jb2Rpbmcgb2Ygd2hpY2ggcGxhdGZvcm1zIHRoaXMgbGlicmFyeSBpcyBpbnRlbmRlZCB0byB3b3JrIG9uLgotICAgKi8KKyAgLy8vIEFuIGVuY29kaW5nIG9mIHdoaWNoIHBsYXRmb3JtcyB0aGlzIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gd29yayBvbi4KICAgaW50IF9wbGF0Zm9ybXMgPSAwOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBsaWJyYXJ5IHRvIHJlcHJlc2VudCB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbgotICAgKiBbbmFtZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgbGlicmFyeSB0byByZXByZXNlbnQgdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIFtuYW1lXS4KICAgU2RrTGlicmFyeUltcGwodGhpcy5zaG9ydE5hbWUpOwogCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciB0aGUgbGlicmFyeSBpcyBkb2N1bWVudGVkLgotICAgKi8KKyAgLy8vIFNldCB3aGV0aGVyIHRoZSBsaWJyYXJ5IGlzIGRvY3VtZW50ZWQuCiAgIHNldCBkb2N1bWVudGVkKGJvb2wgZG9jdW1lbnRlZCkgewogICAgIHRoaXMuX2RvY3VtZW50ZWQgPSBkb2N1bWVudGVkOwogICB9CkBAIC01MDQsMTYgKzM1MSwxMiBAQAogICBAb3ZlcnJpZGUKICAgYm9vbCBnZXQgaXNWbUxpYnJhcnkgPT4gKF9wbGF0Zm9ybXMgJiBWTV9QTEFURk9STSkgIT0gMDsKIAotICAvKioKLSAgICogUmVjb3JkIHRoYXQgdGhpcyBsaWJyYXJ5IGNhbiBiZSBjb21waWxlZCB0byBKYXZhU2NyaXB0IGJ5IGRhcnQyanMuCi0gICAqLworICAvLy8gUmVjb3JkIHRoYXQgdGhpcyBsaWJyYXJ5IGNhbiBiZSBjb21waWxlZCB0byBKYXZhU2NyaXB0IGJ5IGRhcnQyanMuCiAgIHZvaWQgc2V0RGFydDJKc0xpYnJhcnkoKSB7CiAgICAgX3BsYXRmb3JtcyB8PSBEQVJUMkpTX1BMQVRGT1JNOwogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCB0aGF0IHRoaXMgbGlicmFyeSBjYW4gYmUgcnVuIG9uIHRoZSBWTS4KLSAgICovCisgIC8vLyBSZWNvcmQgdGhhdCB0aGlzIGxpYnJhcnkgY2FuIGJlIHJ1biBvbiB0aGUgVk0uCiAgIHZvaWQgc2V0Vm1MaWJyYXJ5KCkgewogICAgIF9wbGF0Zm9ybXMgfD0gVk1fUExBVEZPUk07CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zZGtfaW8uZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zZGtfaW8uZGFydAppbmRleCBhMmUwNThjLi5mZTdlY2MwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc2RrX2lvLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Nka19pby5kYXJ0CkBAIC0xNSw0MSArMTUsMjUgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZV9pby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9pZGwuZGFydCcgc2hvdyBQYWNrYWdlQnVuZGxlOwogCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgRGFydCBTREsgaW4gd2hpY2ggdGhlIGF2YWlsYWJsZSBsaWJyYXJpZXMgYXJlCi0gKiBzdG9yZWQgaW4gYSBsaWJyYXJ5IG1hcC4gU3ViY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIHBvcHVsYXRpbmcgdGhlCi0gKiBsaWJyYXJ5IG1hcC4KLSAqLworLy8vIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgRGFydCBTREsgaW4gd2hpY2ggdGhlIGF2YWlsYWJsZSBsaWJyYXJpZXMKKy8vLyBhcmUgc3RvcmVkIGluIGEgbGlicmFyeSBtYXAuIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoZQorLy8vIGxpYnJhcnkgbWFwLgogQGRlcHJlY2F0ZWQKIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGFydFNkayBpbXBsZW1lbnRzIERhcnRTZGsgewotICAvKioKLSAgICogQSBtYXBwaW5nIGZyb20gRGFydCBsaWJyYXJ5IFVSSSdzIHRvIHRoZSBsaWJyYXJ5IHJlcHJlc2VudGVkIGJ5IHRoYXQgVVJJLgotICAgKi8KKyAgLy8vIEEgbWFwcGluZyBmcm9tIERhcnQgbGlicmFyeSBVUkkncyB0byB0aGUgbGlicmFyeSByZXByZXNlbnRlZCBieSB0aGF0IFVSSS4KICAgTGlicmFyeU1hcCBsaWJyYXJ5TWFwID0gTGlicmFyeU1hcCgpOwogCi0gIC8qKgotICAgKiBUaGUgW0FuYWx5c2lzT3B0aW9uc10gdG8gdXNlIHRvIGNyZWF0ZSB0aGUgW2NvbnRleHRdLgotICAgKi8KKyAgLy8vIFRoZSBbQW5hbHlzaXNPcHRpb25zXSB0byB1c2UgdG8gY3JlYXRlIHRoZSBbY29udGV4dF0uCiAgIEFuYWx5c2lzT3B0aW9ucyBfYW5hbHlzaXNPcHRpb25zOwogCi0gIC8qKgotICAgKiBUaGUgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIGFuIFNESyBzdW1tYXJ5IHNob3VsZCBiZSB1c2VkLiBUaGlzIGlzIGEKLSAgICogdGVtcG9yYXJ5IGZsYWcgdW50aWwgc3VtbWFyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAqLwotICBib29sIF91c2VTdW1tYXJ5ID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBbQW5hbHlzaXNDb250ZXh0XSB3aGljaCBpcyB1c2VkIGZvciBhbGwgb2YgdGhlIHNvdXJjZXMgaW4gdGhpcyBTREsuCi0gICAqLworICAvLy8gVGhlIFtBbmFseXNpc0NvbnRleHRdIHdoaWNoIGlzIHVzZWQgZm9yIGFsbCBvZiB0aGUgc291cmNlcyBpbiB0aGlzIFNESy4KICAgU2RrQW5hbHlzaXNDb250ZXh0IF9hbmFseXNpc0NvbnRleHQ7CiAKICAgLy8vIFRoZSBtYXBwaW5nIGZyb20gRGFydCBVUkkncyB0byB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2VzLgogICBmaW5hbCBNYXA8U3RyaW5nLCBTb3VyY2U+IF91cmlUb1NvdXJjZU1hcCA9IEhhc2hNYXA8U3RyaW5nLCBTb3VyY2U+KCk7CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgW29wdGlvbnNdIGZvciB0aGlzIFNESyBhbmFseXNpcyBjb250ZXh0LiAgVGhyb3cgW1N0YXRlRXJyb3JdIGlmIHRoZQotICAgKiBjb250ZXh0IGhhcyBiZWVuIGFscmVhZHkgY3JlYXRlZC4KLSAgICovCisgIC8vLyBTZXQgdGhlIFtvcHRpb25zXSBmb3IgdGhpcyBTREsgYW5hbHlzaXMgY29udGV4dC4gIFRocm93IFtTdGF0ZUVycm9yXSBpZgorICAvLy8gdGhlIGNvbnRleHQgaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkLgogICBzZXQgYW5hbHlzaXNPcHRpb25zKEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zKSB7CiAgICAgaWYgKF9hbmFseXNpc0NvbnRleHQgIT0gbnVsbCkgewogICAgICAgdGhyb3cgU3RhdGVFcnJvcigKQEAgLTczLDI3ICs1Nyw5IEBACiAgIEBvdmVycmlkZQogICBMaXN0PFN0cmluZz4gZ2V0IHVyaXMgPT4gbGlicmFyeU1hcC51cmlzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBTREsgc3VtbWFyeSB3aWxsIGJlIHVzZWQgd2hlbiBhdmFpbGFibGUuCi0gICAqLwotICBib29sIGdldCB1c2VTdW1tYXJ5ID0+IF91c2VTdW1tYXJ5OwotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHdoZXRoZXIgU0RLIHN1bW1hcnkgc2hvdWxkIGJlIHVzZWQuCi0gICAqLwotICBzZXQgdXNlU3VtbWFyeShib29sIHVzZSkgewotICAgIGlmIChfYW5hbHlzaXNDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgIHRocm93IFN0YXRlRXJyb3IoCi0gICAgICAgICAgJ1RoZSAidXNlU3VtbWFyeSIgZmxhZyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjb250ZXh0IGNyZWF0aW9uLicpOwotICAgIH0KLSAgICBfdXNlU3VtbWFyeSA9IHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdGhlIGV4dGVuc2lvbnMgZnJvbSBvbmUgb3IgbW9yZSBzZGsgZXh0ZW5zaW9uIGZpbGVzIHRvIHRoaXMgc2RrLiBUaGUKLSAgICogW2V4dGVuc2lvbnNdIHNob3VsZCBiZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG5hbWVzIG9mIGV4dGVuc2lvbnMgdG8gdGhlIHBhdGhzCi0gICAqIHdoZXJlIHRob3NlIGV4dGVuc2lvbnMgY2FuIGJlIGZvdW5kLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgZXh0ZW5zaW9ucyBmcm9tIG9uZSBvciBtb3JlIHNkayBleHRlbnNpb24gZmlsZXMgdG8gdGhpcyBzZGsuIFRoZQorICAvLy8gW2V4dGVuc2lvbnNdIHNob3VsZCBiZSBhIHRhYmxlIG1hcHBpbmcgdGhlIG5hbWVzIG9mIGV4dGVuc2lvbnMgdG8gdGhlCisgIC8vLyBwYXRocyB3aGVyZSB0aG9zZSBleHRlbnNpb25zIGNhbiBiZSBmb3VuZC4KICAgdm9pZCBhZGRFeHRlbnNpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0ZW5zaW9ucykgewogICAgIGV4dGVuc2lvbnMuZm9yRWFjaCgoU3RyaW5nIHVyaSwgU3RyaW5nIHBhdGgpIHsKICAgICAgIFN0cmluZyBzaG9ydE5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5pbmRleE9mKCc6JykgKyAxKTsKQEAgLTEyNiwxMSArOTIsOSBAQAogICBAb3ZlcnJpZGUKICAgU2RrTGlicmFyeSBnZXRTZGtMaWJyYXJ5KFN0cmluZyBkYXJ0VXJpKSA9PiBsaWJyYXJ5TWFwLmdldExpYnJhcnkoZGFydFVyaSk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgW1BhY2thZ2VCdW5kbGVdIGZvciB0aGlzIFNESywgaWYgaXQgZXhpc3RzLCBvciBgbnVsbGAgb3RoZXJ3aXNlLgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBgYW5hbHl6ZXJgIGFuZCBgYW5hbHl6ZXJfY2xpYAotICAgKiBwYWNrYWdlcy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtQYWNrYWdlQnVuZGxlXSBmb3IgdGhpcyBTREssIGlmIGl0IGV4aXN0cywgb3IgYG51bGxgCisgIC8vLyBvdGhlcndpc2UuIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGBhbmFseXplcmAgYW5kCisgIC8vLyBgYW5hbHl6ZXJfY2xpYCBwYWNrYWdlcy4KICAgQGRlcHJlY2F0ZWQKICAgUGFja2FnZUJ1bmRsZSBnZXRTdW1tYXJ5U2RrQnVuZGxlKGJvb2wgXyk7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydAppbmRleCA5NDBkZjM5Li41YzIxNTJlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0CkBAIC00NywxMSArNDcsOSBAQAogICBib29sIG9wZXJhdG9yID09KE9iamVjdCBvYmplY3QpID0+IG9iamVjdCBpcyBTb3VyY2UgJiYgb2JqZWN0LnVyaSA9PSB1cmk7CiB9CiAKLS8qKgotICogQSBjYWNoZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnRlbnQgb2YgYSBbU291cmNlXS4KLSAqCi0gKiBUT0RPKHNjaGVnbG92KSBSZW1vdmUgaXQuCi0gKi8KKy8vLyBBIGNhY2hlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udGVudCBvZiBhIFtTb3VyY2VdLgorLy8vCisvLy8gVE9ETyhzY2hlZ2xvdikgUmVtb3ZlIGl0LgogY2xhc3MgQ29udGVudENhY2hlIHsKICAgLy8vIEEgdGFibGUgbWFwcGluZyB0aGUgZnVsbCBwYXRoIG9mIHNvdXJjZXMgdG8gdGhlIGNvbnRlbnRzIG9mIHRob3NlIHNvdXJjZXMuCiAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udGVudHMgb2YgYSBzb3VyY2UuCkBAIC02NCw5ICs2Miw3IEBACiAKICAgaW50IF9uZXh0U3RhbXAgPSAwOwogCi0gIC8qKgotICAgKiBWaXNpdCBhbGwgZW50cmllcyBvZiB0aGlzIGNhY2hlLgotICAgKi8KKyAgLy8vIFZpc2l0IGFsbCBlbnRyaWVzIG9mIHRoaXMgY2FjaGUuCiAgIHZvaWQgYWNjZXB0KENvbnRlbnRDYWNoZVZpc2l0b3IgdmlzaXRvcikgewogICAgIF9jb250ZW50TWFwLmZvckVhY2goKFN0cmluZyBmdWxsUGF0aCwgU3RyaW5nIGNvbnRlbnRzKSB7CiAgICAgICBpbnQgc3RhbXAgPSBfc3RhbXBNYXBbZnVsbFBhdGhdOwpAQCAtNzQsNDEgKzcwLDMzIEBACiAgICAgfSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gW3NvdXJjZV0sIG9yIGBudWxsYCBpZiB0aGlzIGNhY2hlIGRvZXMgbm90Ci0gICAqIG92ZXJyaWRlIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlLgotICAgKgotICAgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZXhjZXB0IGJ5Ci0gICAqIFtBbmFseXNpc0NvbnRleHQuZ2V0Q29udGVudHNdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFtzb3VyY2VdLCBvciBgbnVsbGAgaWYgdGhpcyBjYWNoZSBkb2VzCisgIC8vLyBub3Qgb3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UuCisgIC8vLworICAvLy8gPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGV4Y2VwdCBieQorICAvLy8gW0FuYWx5c2lzQ29udGV4dC5nZXRDb250ZW50c10uCiAgIFN0cmluZyBnZXRDb250ZW50cyhTb3VyY2Ugc291cmNlKSA9PiBfY29udGVudE1hcFtzb3VyY2UuZnVsbE5hbWVdOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbc291cmNlXSBleGlzdHMsIGBmYWxzZWAgaWYgaXQgZG9lcyBub3QgZXhpc3QsCi0gICAqIG9yIGBudWxsYCBpZiB0aGlzIGNhY2hlIGRvZXMgbm90IG92ZXJyaWRlIGV4aXN0ZW5jZSBvZiB0aGUgc291cmNlLgotICAgKgotICAgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZXhjZXB0IGJ5Ci0gICAqIFtBbmFseXNpc0NvbnRleHQuZXhpc3RzXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbc291cmNlXSBleGlzdHMsIGBmYWxzZWAgaWYgaXQgZG9lcyBub3QgZXhpc3QsCisgIC8vLyBvciBgbnVsbGAgaWYgdGhpcyBjYWNoZSBkb2VzIG5vdCBvdmVycmlkZSBleGlzdGVuY2Ugb2YgdGhlIHNvdXJjZS4KKyAgLy8vCisgIC8vLyA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZXhjZXB0IGJ5CisgIC8vLyBbQW5hbHlzaXNDb250ZXh0LmV4aXN0c10uCiAgIGJvb2wgZ2V0RXhpc3RzKFNvdXJjZSBzb3VyY2UpIHsKICAgICByZXR1cm4gX2NvbnRlbnRNYXAuY29udGFpbnNLZXkoc291cmNlLmZ1bGxOYW1lKSA/IHRydWUgOiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mIHRoZSBnaXZlbiBbc291cmNlXSwgb3IgYG51bGxgIGlmIHRoaXMKLSAgICogY2FjaGUgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UuCi0gICAqCi0gICAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBleGNlcHQgYnkKLSAgICogW0FuYWx5c2lzQ29udGV4dC5nZXRNb2RpZmljYXRpb25TdGFtcF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIGdpdmVuIFtzb3VyY2VdLCBvciBgbnVsbGAgaWYgdGhpcworICAvLy8gY2FjaGUgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UuCisgIC8vLworICAvLy8gPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGV4Y2VwdCBieQorICAvLy8gW0FuYWx5c2lzQ29udGV4dC5nZXRNb2RpZmljYXRpb25TdGFtcF0uCiAgIGludCBnZXRNb2RpZmljYXRpb25TdGFtcChTb3VyY2Ugc291cmNlKSA9PiBfc3RhbXBNYXBbc291cmNlLmZ1bGxOYW1lXTsKIAotICAvKioKLSAgICogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gW3NvdXJjZV0gdG8gdGhlIGdpdmVuIFtjb250ZW50c10uIFRoaXMgaGFzCi0gICAqIHRoZSBlZmZlY3Qgb2Ygb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBjb250ZW50cyBvZiB0aGUgc291cmNlLiBJZiB0aGUKLSAgICogY29udGVudHMgYXJlIGBudWxsYCB0aGUgb3ZlcnJpZGUgaXMgcmVtb3ZlZCBzbyB0aGF0IHRoZSBkZWZhdWx0IGNvbnRlbnRzCi0gICAqIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqLworICAvLy8gU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gW3NvdXJjZV0gdG8gdGhlIGdpdmVuIFtjb250ZW50c10uIFRoaXMgaGFzCisgIC8vLyB0aGUgZWZmZWN0IG9mIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgY29udGVudHMgb2YgdGhlIHNvdXJjZS4gSWYgdGhlCisgIC8vLyBjb250ZW50cyBhcmUgYG51bGxgIHRoZSBvdmVycmlkZSBpcyByZW1vdmVkIHNvIHRoYXQgdGhlIGRlZmF1bHQgY29udGVudHMKKyAgLy8vIHdpbGwgYmUgcmV0dXJuZWQuCiAgIFN0cmluZyBzZXRDb250ZW50cyhTb3VyY2Ugc291cmNlLCBTdHJpbmcgY29udGVudHMpIHsKICAgICBTdHJpbmcgZnVsbE5hbWUgPSBzb3VyY2UuZnVsbE5hbWU7CiAgICAgaWYgKGNvbnRlbnRzID09IG51bGwpIHsKQEAgLTE1MCwzMyArMTM4LDI1IEBACiAgIH0KIH0KIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBEYXJ0VXJpUmVzb2x2ZXJgIHJlc29sdmUgYGRhcnRgIFVSSSdzLgotICovCisvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgRGFydFVyaVJlc29sdmVyYCByZXNvbHZlIGBkYXJ0YCBVUkkncy4KIGNsYXNzIERhcnRVcmlSZXNvbHZlciBleHRlbmRzIFVyaVJlc29sdmVyIHsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBgZGFydGAgc2NoZW1lLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBgZGFydGAgc2NoZW1lLgogICBzdGF0aWMgU3RyaW5nIERBUlRfU0NIRU1FID0gImRhcnQiOwogCiAgIC8vLyBUaGUgcHJlZml4IG9mIGEgVVJJIHVzaW5nIHRoZSBkYXJ0LWV4dCBzY2hlbWUgdG8gcmVmZXJlbmNlIGEgbmF0aXZlIGNvZGUKICAgLy8vIGxpYnJhcnkuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgX0RBUlRfRVhUX1NDSEVNRSA9ICJkYXJ0LWV4dDoiOwogCi0gIC8qKgotICAgKiBUaGUgRGFydCBTREsgYWdhaW5zdCB3aGljaCBVUkkncyBhcmUgdG8gYmUgcmVzb2x2ZWQuCi0gICAqLworICAvLy8gVGhlIERhcnQgU0RLIGFnYWluc3Qgd2hpY2ggVVJJJ3MgYXJlIHRvIGJlIHJlc29sdmVkLgogICBmaW5hbCBEYXJ0U2RrIF9zZGs7CiAKICAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHJlc29sdmVyIHRvIHJlc29sdmUgRGFydCBVUkkncyBhZ2FpbnN0IHRoZQogICAvLy8gZ2l2ZW4gcGxhdGZvcm0gd2l0aGluIHRoZSBnaXZlbiBEYXJ0IFNESy4KICAgRGFydFVyaVJlc29sdmVyKHRoaXMuX3Nkayk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgW0RhcnRTZGtdIGFnYWluc3Qgd2hpY2ggVVJJcyBhcmUgdG8gYmUgcmVzb2x2ZWQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIFtEYXJ0U2RrXSBhZ2FpbnN0IHdoaWNoIFVSSXMgYXJlIHRvIGJlIHJlc29sdmVkLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgW0RhcnRTZGtdIGFnYWluc3Qgd2hpY2ggVVJJcyBhcmUgdG8gYmUgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gQHJldHVybiB0aGUgW0RhcnRTZGtdIGFnYWluc3Qgd2hpY2ggVVJJcyBhcmUgdG8gYmUgcmVzb2x2ZWQuCiAgIERhcnRTZGsgZ2V0IGRhcnRTZGsgPT4gX3NkazsKIAogICBAb3ZlcnJpZGUKQEAgLTE5Myw1MyArMTczLDM5IEBACiAgICAgcmV0dXJuIGRhcnRTb3VyY2U/LnVyaTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZGFydC1leHQ6YCBVUkkuCi0gICAqCi0gICAqIEBwYXJhbSB1cmlDb250ZW50IHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkgYmVpbmcgdGVzdGVkCi0gICAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZGFydC1leHQ6YCBVUkkKLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZGFydC1leHQ6YCBVUkkuCisgIC8vLworICAvLy8gQHBhcmFtIHVyaUNvbnRlbnQgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSSBiZWluZyB0ZXN0ZWQKKyAgLy8vIEByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZGFydC1leHQ6YCBVUkkKICAgc3RhdGljIGJvb2wgaXNEYXJ0RXh0VXJpKFN0cmluZyB1cmlDb250ZW50KSA9PgogICAgICAgdXJpQ29udGVudCAhPSBudWxsICYmIHVyaUNvbnRlbnQuc3RhcnRzV2l0aChfREFSVF9FWFRfU0NIRU1FKTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYGRhcnQ6YCBVUkkuCi0gICAqCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBiZWluZyB0ZXN0ZWQKLSAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBkYXJ0OmAgVVJJCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYGRhcnQ6YCBVUkkuCisgIC8vLworICAvLy8gQHBhcmFtIHVyaSB0aGUgVVJJIGJlaW5nIHRlc3RlZAorICAvLy8gQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBkYXJ0OmAgVVJJCiAgIHN0YXRpYyBib29sIGlzRGFydFVyaShVcmkgdXJpKSA9PiBEQVJUX1NDSEVNRSA9PSB1cmkuc2NoZW1lOwogfQogCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYExvY2F0aW9uYCByZXByZXNlbnQgdGhlIGxvY2F0aW9uIG9mIGEgY2hhcmFjdGVyIGFzIGEgbGluZSBhbmQKLSAqIGNvbHVtbiBwYWlyLgotICovCisvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgTG9jYXRpb25gIHJlcHJlc2VudCB0aGUgbG9jYXRpb24gb2YgYSBjaGFyYWN0ZXIgYXMgYQorLy8vIGxpbmUgYW5kIGNvbHVtbiBwYWlyLgogQGRlcHJlY2F0ZWQKIGNsYXNzIExpbmVJbmZvX0xvY2F0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBvbmUtYmFzZWQgaW5kZXggb2YgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyLgotICAgKi8KKyAgLy8vIFRoZSBvbmUtYmFzZWQgaW5kZXggb2YgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyLgogICBmaW5hbCBpbnQgbGluZU51bWJlcjsKIAotICAvKioKLSAgICogVGhlIG9uZS1iYXNlZCBpbmRleCBvZiB0aGUgY29sdW1uIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3Rlci4KLSAgICovCisgIC8vLyBUaGUgb25lLWJhc2VkIGluZGV4IG9mIHRoZSBjb2x1bW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyLgogICBmaW5hbCBpbnQgY29sdW1uTnVtYmVyOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBsb2NhdGlvbiB0byByZXByZXNlbnQgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgKiBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIFtsaW5lTnVtYmVyXSBhbmQgW2NvbHVtbk51bWJlcl0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgbG9jYXRpb24gdG8gcmVwcmVzZW50IHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgLy8vIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gW2xpbmVOdW1iZXJdIGFuZCBbY29sdW1uTnVtYmVyXS4KICAgTGluZUluZm9fTG9jYXRpb24odGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbk51bWJlcik7CiAKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpID0+ICckbGluZU51bWJlcjokY29sdW1uTnVtYmVyJzsKIH0KIAotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBub24tZXhpc3RpbmcgW1NvdXJjZV0uCi0gKi8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBub24tZXhpc3RpbmcgW1NvdXJjZV0uCiBjbGFzcyBOb25FeGlzdGluZ1NvdXJjZSBleHRlbmRzIFNvdXJjZSB7CiAgIHN0YXRpYyBmaW5hbCB1bmtub3duID0gTm9uRXhpc3RpbmdTb3VyY2UoCiAgICAgICAnL3Vua25vd24uZGFydCcsIHBhdGhvcy50b1VyaSgnL3Vua25vd24uZGFydCcpLCBVcmlLaW5kLkZJTEVfVVJJKTsKQEAgLTI5MCwyNTggKzI1NiwyMDUgQEAKICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ05vbkV4aXN0aW5nU291cmNlKCR1cmksICRmdWxsTmFtZSknOwogfQogCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgYFNvdXJjZWAgZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgc291cmNlCi0gKiBjb2RlIHRoYXQgY2FuIGJlIGFuYWx5emVkIGJ5IHRoZSBhbmFseXNpcyBlbmdpbmUuCi0gKgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIG5lZWQgdG8gYmUgYXdhcmUgb2Ygc29tZSBhc3N1bXB0aW9ucyBtYWRlCi0gKiBieSB0aGUgYW5hbHlzaXMgZW5naW5lIGNvbmNlcm5pbmcgc291cmNlczoKLSAqCi0gKiAqIFNvdXJjZXMgYXJlIG5vdCByZXF1aXJlZCB0byBiZSB1bmlxdWUuIFRoYXQgaXMsIHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotICogaW5zdGFuY2VzIHJlcHJlc2VudGluZyB0aGUgc2FtZSBzb3VyY2UuCi0gKiAqIFNvdXJjZXMgYXJlIGxvbmcgbGl2ZWQuIFRoYXQgaXMsIHRoZSBlbmdpbmUgaXMgYWxsb3dlZCB0byBob2xkIG9uIHRvIGEKLSAqIHNvdXJjZSBmb3IgYW4gZXh0ZW5kZWQgcGVyaW9kIG9mIHRpbWUgYW5kIHRoYXQgc291cmNlIG11c3QgY29udGludWUgdG8KLSAqIHJlcG9ydCBhY2N1cmF0ZSBhbmQgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBCZWNhdXNlIG9mIHRoZXNlIGFzc3VtcHRpb25zLCBtb3N0IGltcGxlbWVudGF0aW9ucyB3aWxsIG5vdCBtYWludGFpbiBhbnkKLSAqIHN0YXRlIGJ1dCB3aWxsIGRlbGVnYXRlIHRvIGFuIGF1dGhvcml0YXRpdmUgc3lzdGVtIG9mIHJlY29yZCBpbiBvcmRlciB0bwotICogaW1wbGVtZW50IHRoaXMgQVBJLiBGb3IgZXhhbXBsZSwgYSBzb3VyY2UgdGhhdCByZXByZXNlbnRzIGZpbGVzIG9uIGRpc2sKLSAqIHdvdWxkIHR5cGljYWxseSBxdWVyeSB0aGUgZmlsZSBzeXN0ZW0gdG8gZGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiB0aGUgZmlsZS4KLSAqCi0gKiBJZiB0aGUgaW5zdGFuY2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgQVBJIGFyZSB0aGUgc3lzdGVtIG9mIHJlY29yZCwgdGhlbiB0aGV5Ci0gKiB3aWxsIHR5cGljYWxseSBiZSB1bmlxdWUuIEluIHRoYXQgY2FzZSwgc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkIHRoYXQKLSAqIHJlcHJlc2VudCBub24tZXhpc3RlbnQgZmlsZXMgbXVzdCBhbHNvIGJlIHJldGFpbmVkIHNvIHRoYXQgaWYgdGhvc2UgZmlsZXMKLSAqIGFyZSBjcmVhdGVkIGF0IGEgbGF0ZXIgZGF0ZSB0aGUgbG9uZy1saXZlZCBzb3VyY2VzIHJlcHJlc2VudGluZyB0aG9zZSBmaWxlcwotICogd2lsbCBrbm93IHRoYXQgdGhleSBub3cgZXhpc3QuCi0gKi8KKy8vLyBUaGUgaW50ZXJmYWNlIGBTb3VyY2VgIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHNvdXJjZQorLy8vIGNvZGUgdGhhdCBjYW4gYmUgYW5hbHl6ZWQgYnkgdGhlIGFuYWx5c2lzIGVuZ2luZS4KKy8vLworLy8vIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBuZWVkIHRvIGJlIGF3YXJlIG9mIHNvbWUgYXNzdW1wdGlvbnMgbWFkZQorLy8vIGJ5IHRoZSBhbmFseXNpcyBlbmdpbmUgY29uY2VybmluZyBzb3VyY2VzOgorLy8vCisvLy8gKiBTb3VyY2VzIGFyZSBub3QgcmVxdWlyZWQgdG8gYmUgdW5pcXVlLiBUaGF0IGlzLCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUKKy8vLyBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHNvdXJjZS4KKy8vLyAqIFNvdXJjZXMgYXJlIGxvbmcgbGl2ZWQuIFRoYXQgaXMsIHRoZSBlbmdpbmUgaXMgYWxsb3dlZCB0byBob2xkIG9uIHRvIGEKKy8vLyBzb3VyY2UgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lIGFuZCB0aGF0IHNvdXJjZSBtdXN0IGNvbnRpbnVlIHRvCisvLy8gcmVwb3J0IGFjY3VyYXRlIGFuZCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgorLy8vCisvLy8gQmVjYXVzZSBvZiB0aGVzZSBhc3N1bXB0aW9ucywgbW9zdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBub3QgbWFpbnRhaW4gYW55CisvLy8gc3RhdGUgYnV0IHdpbGwgZGVsZWdhdGUgdG8gYW4gYXV0aG9yaXRhdGl2ZSBzeXN0ZW0gb2YgcmVjb3JkIGluIG9yZGVyIHRvCisvLy8gaW1wbGVtZW50IHRoaXMgQVBJLiBGb3IgZXhhbXBsZSwgYSBzb3VyY2UgdGhhdCByZXByZXNlbnRzIGZpbGVzIG9uIGRpc2sKKy8vLyB3b3VsZCB0eXBpY2FsbHkgcXVlcnkgdGhlIGZpbGUgc3lzdGVtIHRvIGRldGVybWluZSB0aGUgc3RhdGUgb2YgdGhlIGZpbGUuCisvLy8KKy8vLyBJZiB0aGUgaW5zdGFuY2VzIHRoYXQgaW1wbGVtZW50IHRoaXMgQVBJIGFyZSB0aGUgc3lzdGVtIG9mIHJlY29yZCwgdGhlbiB0aGV5CisvLy8gd2lsbCB0eXBpY2FsbHkgYmUgdW5pcXVlLiBJbiB0aGF0IGNhc2UsIHNvdXJjZXMgdGhhdCBhcmUgY3JlYXRlZCB0aGF0CisvLy8gcmVwcmVzZW50IG5vbi1leGlzdGVudCBmaWxlcyBtdXN0IGFsc28gYmUgcmV0YWluZWQgc28gdGhhdCBpZiB0aG9zZSBmaWxlcworLy8vIGFyZSBjcmVhdGVkIGF0IGEgbGF0ZXIgZGF0ZSB0aGUgbG9uZy1saXZlZCBzb3VyY2VzIHJlcHJlc2VudGluZyB0aG9zZSBmaWxlcworLy8vIHdpbGwga25vdyB0aGF0IHRoZXkgbm93IGV4aXN0LgogYWJzdHJhY3QgY2xhc3MgU291cmNlIGltcGxlbWVudHMgQW5hbHlzaXNUYXJnZXQgewotICAvKioKLSAgICogR2V0IHRoZSBjb250ZW50cyBhbmQgdGltZXN0YW1wIG9mIHRoaXMgc291cmNlLgotICAgKgotICAgKiBDbGllbnRzIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbWV0aG9kIFtBbmFseXNpc0NvbnRleHQuZ2V0Q29udGVudHNdCi0gICAqIGJlY2F1c2UgY29udGV4dHMgY2FuIGhhdmUgbG9jYWwgb3ZlcnJpZGVzIG9mIHRoZSBjb250ZW50IG9mIGEgc291cmNlIHRoYXQKLSAgICogdGhlIHNvdXJjZSBpcyBub3QgYXdhcmUgb2YuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIGFuZCB0aW1lc3RhbXAgb2YgdGhlIHNvdXJjZQotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBzb3VyY2UgY291bGQgbm90IGJlIGFjY2Vzc2VkCi0gICAqLworICAvLy8gR2V0IHRoZSBjb250ZW50cyBhbmQgdGltZXN0YW1wIG9mIHRoaXMgc291cmNlLgorICAvLy8KKyAgLy8vIENsaWVudHMgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBtZXRob2QgW0FuYWx5c2lzQ29udGV4dC5nZXRDb250ZW50c10KKyAgLy8vIGJlY2F1c2UgY29udGV4dHMgY2FuIGhhdmUgbG9jYWwgb3ZlcnJpZGVzIG9mIHRoZSBjb250ZW50IG9mIGEgc291cmNlIHRoYXQKKyAgLy8vIHRoZSBzb3VyY2UgaXMgbm90IGF3YXJlIG9mLgorICAvLy8KKyAgLy8vIEByZXR1cm4gdGhlIGNvbnRlbnRzIGFuZCB0aW1lc3RhbXAgb2YgdGhlIHNvdXJjZQorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc291cmNlIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAogICBUaW1lc3RhbXBlZERhdGE8U3RyaW5nPiBnZXQgY29udGVudHM7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhbiBlbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlCi0gICAqIGEgc291cmNlIHRoYXQgaXMgZXF1YWwgdG8gdGhpcyBzb3VyY2UuCi0gICAqCi0gICAqIEByZXR1cm4gYW4gZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZQotICAgKiBTZWUgW1NvdXJjZUZhY3RvcnkuZnJvbUVuY29kaW5nXS4KLSAgICovCisgIC8vLyBSZXR1cm4gYW4gZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICAvLy8gYSBzb3VyY2UgdGhhdCBpcyBlcXVhbCB0byB0aGlzIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIGFuIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2UKKyAgLy8vIFNlZSBbU291cmNlRmFjdG9yeS5mcm9tRW5jb2RpbmddLgogICBAZGVwcmVjYXRlZAogICBTdHJpbmcgZ2V0IGVuY29kaW5nOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZ1bGwgKGxvbmcpIHZlcnNpb24gb2YgdGhlIG5hbWUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIHRoZQotICAgKiB1c2VyIHRvIGRlbm90ZSB0aGlzIHNvdXJjZS4gRm9yIGV4YW1wbGUsIGZvciBhIHNvdXJjZSByZXByZXNlbnRpbmcgYSBmaWxlCi0gICAqIHRoaXMgd291bGQgdHlwaWNhbGx5IGJlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlLgotICAgKgotICAgKiBAcmV0dXJuIGEgbmFtZSB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgdG8gZGVub3RlIHRoaXMgc291cmNlCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBmdWxsIChsb25nKSB2ZXJzaW9uIG9mIHRoZSBuYW1lIHRoYXQgY2FuIGJlIGRpc3BsYXllZCB0byB0aGUKKyAgLy8vIHVzZXIgdG8gZGVub3RlIHRoaXMgc291cmNlLiBGb3IgZXhhbXBsZSwgZm9yIGEgc291cmNlIHJlcHJlc2VudGluZyBhIGZpbGUKKyAgLy8vIHRoaXMgd291bGQgdHlwaWNhbGx5IGJlIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlLgorICAvLy8KKyAgLy8vIEByZXR1cm4gYSBuYW1lIHRoYXQgY2FuIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciB0byBkZW5vdGUgdGhpcyBzb3VyY2UKICAgU3RyaW5nIGdldCBmdWxsTmFtZTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgaGFzaCBjb2RlIGZvciB0aGlzIHNvdXJjZS4KLSAgICoKLSAgICogQHJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBzb3VyY2UKLSAgICogU2VlIFtPYmplY3QuaGFzaENvZGVdLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBzb3VyY2UuCisgIC8vLworICAvLy8gQHJldHVybiBhIGhhc2ggY29kZSBmb3IgdGhpcyBzb3VyY2UKKyAgLy8vIFNlZSBbT2JqZWN0Lmhhc2hDb2RlXS4KICAgQG92ZXJyaWRlCiAgIGludCBnZXQgaGFzaENvZGU7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBzb3VyY2UgaXMgaW4gb25lIG9mIHRoZSBzeXN0ZW0gbGlicmFyaWVzLgotICAgKgotICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIGlzIGluIGEgc3lzdGVtIGxpYnJhcnkKLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc291cmNlIGlzIGluIG9uZSBvZiB0aGUgc3lzdGVtIGxpYnJhcmllcy4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIGlzIGluIGEgc3lzdGVtIGxpYnJhcnkKICAgYm9vbCBnZXQgaXNJblN5c3RlbUxpYnJhcnk7CiAKICAgQG92ZXJyaWRlCiAgIFNvdXJjZSBnZXQgbGlicmFyeVNvdXJjZSA9PiBudWxsOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBmb3IgdGhpcyBzb3VyY2UsIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlCi0gICAqIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQSBtb2RpZmljYXRpb24gc3RhbXAgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciB3aXRoCi0gICAqIHRoZSBwcm9wZXJ0eSB0aGF0IGlmIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGhhdmUgbm90IGJlZW4gbW9kaWZpZWQKLSAgICogc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIHdhcyBhY2Nlc3NlZCB0aGVuIHRoZSBzYW1lCi0gICAqIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQsIGJ1dCBpZiB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBoYXZlIGJlZW4KLSAgICogbW9kaWZpZWQgb25lIG9yIG1vcmUgdGltZXMgKGV2ZW4gaWYgdGhlIG5ldCBjaGFuZ2UgaXMgemVybykgdGhlIHN0YW1wcwotICAgKiB3aWxsIGJlIGRpZmZlcmVudC4KLSAgICoKLSAgICogQ2xpZW50cyBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIG1ldGhvZAotICAgKiBbQW5hbHlzaXNDb250ZXh0LmdldE1vZGlmaWNhdGlvblN0YW1wXSBiZWNhdXNlIGNvbnRleHRzIGNhbiBoYXZlIGxvY2FsCi0gICAqIG92ZXJyaWRlcyBvZiB0aGUgY29udGVudCBvZiBhIHNvdXJjZSB0aGF0IHRoZSBzb3VyY2UgaXMgbm90IGF3YXJlIG9mLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGZvciB0aGlzIHNvdXJjZSwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUKKyAgLy8vIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQSBtb2RpZmljYXRpb24gc3RhbXAgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciB3aXRoCisgIC8vLyB0aGUgcHJvcGVydHkgdGhhdCBpZiB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBoYXZlIG5vdCBiZWVuIG1vZGlmaWVkCisgIC8vLyBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgd2FzIGFjY2Vzc2VkIHRoZW4gdGhlIHNhbWUKKyAgLy8vIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQsIGJ1dCBpZiB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBoYXZlIGJlZW4KKyAgLy8vIG1vZGlmaWVkIG9uZSBvciBtb3JlIHRpbWVzIChldmVuIGlmIHRoZSBuZXQgY2hhbmdlIGlzIHplcm8pIHRoZSBzdGFtcHMKKyAgLy8vIHdpbGwgYmUgZGlmZmVyZW50LgorICAvLy8KKyAgLy8vIENsaWVudHMgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBtZXRob2QKKyAgLy8vIFtBbmFseXNpc0NvbnRleHQuZ2V0TW9kaWZpY2F0aW9uU3RhbXBdIGJlY2F1c2UgY29udGV4dHMgY2FuIGhhdmUgbG9jYWwKKyAgLy8vIG92ZXJyaWRlcyBvZiB0aGUgY29udGVudCBvZiBhIHNvdXJjZSB0aGF0IHRoZSBzb3VyY2UgaXMgbm90IGF3YXJlIG9mLgogICBpbnQgZ2V0IG1vZGlmaWNhdGlvblN0YW1wOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzaG9ydCB2ZXJzaW9uIG9mIHRoZSBuYW1lIHRoYXQgY2FuIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciB0bwotICAgKiBkZW5vdGUgdGhpcyBzb3VyY2UuIEZvciBleGFtcGxlLCBmb3IgYSBzb3VyY2UgcmVwcmVzZW50aW5nIGEgZmlsZSB0aGlzCi0gICAqIHdvdWxkIHR5cGljYWxseSBiZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICoKLSAgICogQHJldHVybiBhIG5hbWUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHRvIGRlbm90ZSB0aGlzIHNvdXJjZQotICAgKi8KKyAgLy8vIFJldHVybiBhIHNob3J0IHZlcnNpb24gb2YgdGhlIG5hbWUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHRvCisgIC8vLyBkZW5vdGUgdGhpcyBzb3VyY2UuIEZvciBleGFtcGxlLCBmb3IgYSBzb3VyY2UgcmVwcmVzZW50aW5nIGEgZmlsZSB0aGlzCisgIC8vLyB3b3VsZCB0eXBpY2FsbHkgYmUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgIC8vLworICAvLy8gQHJldHVybiBhIG5hbWUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHRvIGRlbm90ZSB0aGlzIHNvdXJjZQogICBTdHJpbmcgZ2V0IHNob3J0TmFtZTsKIAogICBAb3ZlcnJpZGUKICAgU291cmNlIGdldCBzb3VyY2UgPT4gdGhpczsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4gdGhlIFVSSSBmcm9tIHdoaWNoIHRoaXMgc291cmNlIHdhcyBvcmlnaW5hbGx5IGRlcml2ZWQKICAgVXJpIGdldCB1cmk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUga2luZCBvZiBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkLiBJZgotICAgKiB0aGlzIHNvdXJjZSB3YXMgY3JlYXRlZCBmcm9tIGFuIGFic29sdXRlIFVSSSwgdGhlbiB0aGUgcmV0dXJuZWQga2luZCB3aWxsCi0gICAqIHJlZmxlY3QgdGhlIHNjaGVtZSBvZiB0aGUgYWJzb2x1dGUgVVJJLiBJZiBpdCB3YXMgY3JlYXRlZCBmcm9tIGEgcmVsYXRpdmUKLSAgICogVVJJLCB0aGVuIHRoZSByZXR1cm5lZCBraW5kIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGtpbmQgb2YgdGhlIHNvdXJjZQotICAgKiBhZ2FpbnN0IHdoaWNoIHRoZSByZWxhdGl2ZSBVUkkgd2FzIHJlc29sdmVkLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBraW5kIG9mIFVSSSBmcm9tIHdoaWNoIHRoaXMgc291cmNlIHdhcyBvcmlnaW5hbGx5IGRlcml2ZWQKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGtpbmQgb2YgVVJJIGZyb20gd2hpY2ggdGhpcyBzb3VyY2Ugd2FzIG9yaWdpbmFsbHkgZGVyaXZlZC4gSWYKKyAgLy8vIHRoaXMgc291cmNlIHdhcyBjcmVhdGVkIGZyb20gYW4gYWJzb2x1dGUgVVJJLCB0aGVuIHRoZSByZXR1cm5lZCBraW5kIHdpbGwKKyAgLy8vIHJlZmxlY3QgdGhlIHNjaGVtZSBvZiB0aGUgYWJzb2x1dGUgVVJJLiBJZiBpdCB3YXMgY3JlYXRlZCBmcm9tIGEgcmVsYXRpdmUKKyAgLy8vIFVSSSwgdGhlbiB0aGUgcmV0dXJuZWQga2luZCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBraW5kIG9mIHRoZSBzb3VyY2UKKyAgLy8vIGFnYWluc3Qgd2hpY2ggdGhlIHJlbGF0aXZlIFVSSSB3YXMgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gQHJldHVybiB0aGUga2luZCBvZiBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkCiAgIFVyaUtpbmQgZ2V0IHVyaUtpbmQ7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHNhbWUKLSAgICogc291cmNlIGNvZGUgYXMgdGhpcyBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHRoaXMgb2JqZWN0Ci0gICAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBzb3VyY2UgdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lCi0gICAqICAgICAgICAgc291cmNlIGNvZGUgYXMgdGhpcyBzb3VyY2UKLSAgICogU2VlIFtPYmplY3QuPT1dLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIHNhbWUKKyAgLy8vIHNvdXJjZSBjb2RlIGFzIHRoaXMgc291cmNlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHRoaXMgb2JqZWN0CisgIC8vLyBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgc2FtZQorICAvLy8gICAgICAgICBzb3VyY2UgY29kZSBhcyB0aGlzIHNvdXJjZQorICAvLy8gU2VlIFtPYmplY3QuPT1dLgogICBAb3ZlcnJpZGUKICAgYm9vbCBvcGVyYXRvciA9PShPYmplY3Qgb2JqZWN0KTsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHNvdXJjZSBleGlzdHMuCi0gICAqCi0gICAqIENsaWVudHMgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBtZXRob2QgW0FuYWx5c2lzQ29udGV4dC5leGlzdHNdIGJlY2F1c2UKLSAgICogY29udGV4dHMgY2FuIGhhdmUgbG9jYWwgb3ZlcnJpZGVzIG9mIHRoZSBjb250ZW50IG9mIGEgc291cmNlIHRoYXQgdGhlCi0gICAqIHNvdXJjZSBpcyBub3QgYXdhcmUgb2YgYW5kIGEgc291cmNlIHdpdGggbG9jYWwgY29udGVudCBpcyBjb25zaWRlcmVkIHRvCi0gICAqIGV4aXN0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gZmlsZSBvbiBkaXNrLgotICAgKgotICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIHNvdXJjZSBleGlzdHMKLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgc291cmNlIGV4aXN0cy4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbWV0aG9kIFtBbmFseXNpc0NvbnRleHQuZXhpc3RzXSBiZWNhdXNlCisgIC8vLyBjb250ZXh0cyBjYW4gaGF2ZSBsb2NhbCBvdmVycmlkZXMgb2YgdGhlIGNvbnRlbnQgb2YgYSBzb3VyY2UgdGhhdCB0aGUKKyAgLy8vIHNvdXJjZSBpcyBub3QgYXdhcmUgb2YgYW5kIGEgc291cmNlIHdpdGggbG9jYWwgY29udGVudCBpcyBjb25zaWRlcmVkIHRvCisgIC8vLyBleGlzdCBldmVuIGlmIHRoZXJlIGlzIG5vIGZpbGUgb24gZGlzay4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIHNvdXJjZSBleGlzdHMKICAgYm9vbCBleGlzdHMoKTsKIH0KIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBTb3VyY2VGYWN0b3J5YCByZXNvbHZlIHBvc3NpYmx5IHJlbGF0aXZlIFVSSSdzIGFnYWluc3QgYW4gZXhpc3RpbmcKLSAqIFtTb3VyY2VdLgotICovCisvLy8gSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgU291cmNlRmFjdG9yeWAgcmVzb2x2ZSBwb3NzaWJseSByZWxhdGl2ZSBVUkkncworLy8vIGFnYWluc3QgYW4gZXhpc3RpbmcgW1NvdXJjZV0uCiBhYnN0cmFjdCBjbGFzcyBTb3VyY2VGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNvdXJjZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIGFic29sdXRlIFVSSQotICAgKiBbcmVzb2x2ZXJzXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzb3VyY2UgZmFjdG9yeSB3aXRoIHRoZSBnaXZlbiBhYnNvbHV0ZSBVUkkKKyAgLy8vIFtyZXNvbHZlcnNdLgogICBmYWN0b3J5IFNvdXJjZUZhY3RvcnkoTGlzdDxVcmlSZXNvbHZlcj4gcmVzb2x2ZXJzKSA9IFNvdXJjZUZhY3RvcnlJbXBsOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtEYXJ0U2RrXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBbU291cmNlRmFjdG9yeV0sIG9yIGBudWxsYCBpZgotICAgKiB0aGVyZSBpcyBubyBzdWNoIFNESy4KLSAgICoKLSAgICogQHJldHVybiB0aGUgW0RhcnRTZGtdIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFtTb3VyY2VGYWN0b3J5XSwgb3IgYG51bGxgIGlmCi0gICAqICAgICAgICAgdGhlcmUgaXMgbm8gc3VjaCBTREsKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtEYXJ0U2RrXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBbU291cmNlRmFjdG9yeV0sIG9yIGBudWxsYCBpZgorICAvLy8gdGhlcmUgaXMgbm8gc3VjaCBTREsuCisgIC8vLworICAvLy8gQHJldHVybiB0aGUgW0RhcnRTZGtdIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFtTb3VyY2VGYWN0b3J5XSwgb3IgYG51bGxgIGlmCisgIC8vLyAgICAgICAgIHRoZXJlIGlzIG5vIHN1Y2ggU0RLCiAgIERhcnRTZGsgZ2V0IGRhcnRTZGs7CiAKICAgLy8vIEEgdGFibGUgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIHBhdGhzIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcKICAgLy8vIHRoZSBwYWNrYWdlIChvciBbbnVsbF0gaWYgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBwYWNrYWdlIFVSSSByZXNvbHZlcikuCiAgIE1hcDxTdHJpbmcsIExpc3Q8Rm9sZGVyPj4gZ2V0IHBhY2thZ2VNYXA7CiAKLSAgLyoqCi0gICAqIENsZWFyIGFueSBjYWNoZWQgVVJJIHJlc29sdXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIFtTb3VyY2VGYWN0b3J5XSBpdHNlbGYsCi0gICAqIGFuZCBhbHNvIGFzayBlYWNoIFtVcmlSZXNvbHZlcl1zIHRvIGNsZWFyIGl0cyBjYWNoZXMuCi0gICAqLworICAvLy8gQ2xlYXIgYW55IGNhY2hlZCBVUkkgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgW1NvdXJjZUZhY3RvcnldIGl0c2VsZiwKKyAgLy8vIGFuZCBhbHNvIGFzayBlYWNoIFtVcmlSZXNvbHZlcl1zIHRvIGNsZWFyIGl0cyBjYWNoZXMuCiAgIHZvaWQgY2xlYXJDYWNoZSgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYWJzb2x1dGUgVVJJLCBvciBgbnVsbGAgaWYKLSAgICogdGhlIFVSSSBpcyBub3QgYSB2YWxpZCBVUkkgb3IgaWYgaXQgaXMgbm90IGFuIGFic29sdXRlIFVSSS4KLSAgICoKLSAgICogQHBhcmFtIGFic29sdXRlVXJpIHRoZSBhYnNvbHV0ZSBVUkkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHJldHVybiBhIHNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhYnNvbHV0ZSBVUkkKLSAgICovCisgIC8vLyBSZXR1cm4gYSBzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYWJzb2x1dGUgVVJJLCBvciBgbnVsbGAgaWYKKyAgLy8vIHRoZSBVUkkgaXMgbm90IGEgdmFsaWQgVVJJIG9yIGlmIGl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBVUkkuCisgIC8vLworICAvLy8gQHBhcmFtIGFic29sdXRlVXJpIHRoZSBhYnNvbHV0ZSBVUkkgdG8gYmUgcmVzb2x2ZWQKKyAgLy8vIEByZXR1cm4gYSBzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWJzb2x1dGUgVVJJCiAgIFNvdXJjZSBmb3JVcmkoU3RyaW5nIGFic29sdXRlVXJpKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGFic29sdXRlIFVSSSwgb3IgYG51bGxgIGlmCi0gICAqIHRoZSBVUkkgaXMgbm90IGFuIGFic29sdXRlIFVSSS4KLSAgICoKLSAgICogQHBhcmFtIGFic29sdXRlVXJpIHRoZSBhYnNvbHV0ZSBVUkkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHJldHVybiBhIHNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhYnNvbHV0ZSBVUkkKLSAgICovCisgIC8vLyBSZXR1cm4gYSBzb3VyY2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYWJzb2x1dGUgVVJJLCBvciBgbnVsbGAgaWYKKyAgLy8vIHRoZSBVUkkgaXMgbm90IGFuIGFic29sdXRlIFVSSS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gYWJzb2x1dGVVcmkgdGhlIGFic29sdXRlIFVSSSB0byBiZSByZXNvbHZlZAorICAvLy8gQHJldHVybiBhIHNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhYnNvbHV0ZSBVUkkKICAgU291cmNlIGZvclVyaTIoVXJpIGFic29sdXRlVXJpKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgc291cmNlIHJlcHJlc2VudGluZyB0aGUgVVJJIHRoYXQgcmVzdWx0cyBmcm9tIHJlc29sdmluZyB0aGUgZ2l2ZW4KLSAgICogKHBvc3NpYmx5IHJlbGF0aXZlKSBbY29udGFpbmVkVXJpXSBhZ2FpbnN0IHRoZSBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBbY29udGFpbmluZ1NvdXJjZV0sIHdoZXRoZXIgb3Igbm90IHRoZSByZXN1bHRpbmcgc291cmNlIGV4aXN0cywgb3IgYG51bGxgCi0gICAqIGlmIGVpdGhlciB0aGUgW2NvbnRhaW5lZFVyaV0gaXMgaW52YWxpZCBvciBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdAotICAgKiB0aGUgW2NvbnRhaW5pbmdTb3VyY2VdJ3MgVVJJLgotICAgKi8KKyAgLy8vIFJldHVybiBhIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIFVSSSB0aGF0IHJlc3VsdHMgZnJvbSByZXNvbHZpbmcgdGhlIGdpdmVuCisgIC8vLyAocG9zc2libHkgcmVsYXRpdmUpIFtjb250YWluZWRVcmldIGFnYWluc3QgdGhlIFVSSSBhc3NvY2lhdGVkIHdpdGggdGhlCisgIC8vLyBbY29udGFpbmluZ1NvdXJjZV0sIHdoZXRoZXIgb3Igbm90IHRoZSByZXN1bHRpbmcgc291cmNlIGV4aXN0cywgb3IgYG51bGxgCisgIC8vLyBpZiBlaXRoZXIgdGhlIFtjb250YWluZWRVcmldIGlzIGludmFsaWQgb3IgaWYgaXQgY2Fubm90IGJlIHJlc29sdmVkCisgIC8vLyBhZ2FpbnN0IHRoZSBbY29udGFpbmluZ1NvdXJjZV0ncyBVUkkuCiAgIFNvdXJjZSByZXNvbHZlVXJpKFNvdXJjZSBjb250YWluaW5nU291cmNlLCBTdHJpbmcgY29udGFpbmVkVXJpKTsKIAotICAvKioKLSAgICogUmV0dXJuIGFuIGFic29sdXRlIFVSSSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHNvdXJjZSwgb3IgYG51bGxgIGlmIGEKLSAgICogdmFsaWQgVVJJIGNhbm5vdCBiZSBjb21wdXRlZC4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHRvIGdldCBVUkkgZm9yCi0gICAqIEByZXR1cm4gdGhlIGFic29sdXRlIFVSSSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHNvdXJjZQotICAgKi8KKyAgLy8vIFJldHVybiBhbiBhYnNvbHV0ZSBVUkkgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBzb3VyY2UsIG9yIGBudWxsYCBpZiBhCisgIC8vLyB2YWxpZCBVUkkgY2Fubm90IGJlIGNvbXB1dGVkLgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBnZXQgVVJJIGZvcgorICAvLy8gQHJldHVybiB0aGUgYWJzb2x1dGUgVVJJIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc291cmNlCiAgIFVyaSByZXN0b3JlVXJpKFNvdXJjZSBzb3VyY2UpOwogfQogCi0vKioKLSAqIFRoZSBlbnVtZXJhdGlvbiBgU291cmNlS2luZGAgZGVmaW5lcyB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIHNvdXJjZXMgdGhhdCBhcmUKLSAqIGtub3duIHRvIHRoZSBhbmFseXNpcyBlbmdpbmUuCi0gKi8KKy8vLyBUaGUgZW51bWVyYXRpb24gYFNvdXJjZUtpbmRgIGRlZmluZXMgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBzb3VyY2VzIHRoYXQgYXJlCisvLy8ga25vd24gdG8gdGhlIGFuYWx5c2lzIGVuZ2luZS4KIGNsYXNzIFNvdXJjZUtpbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlPFNvdXJjZUtpbmQ+IHsKLSAgLyoqCi0gICAqIEEgc291cmNlIGNvbnRhaW5pbmcgSFRNTC4gVGhlIEhUTUwgbWlnaHQgb3IgbWlnaHQgbm90IGNvbnRhaW4gRGFydCBzY3JpcHRzLgotICAgKi8KKyAgLy8vIEEgc291cmNlIGNvbnRhaW5pbmcgSFRNTC4gVGhlIEhUTUwgbWlnaHQgb3IgbWlnaHQgbm90IGNvbnRhaW4gRGFydAorICAvLy8gc2NyaXB0cy4KICAgc3RhdGljIGNvbnN0IFNvdXJjZUtpbmQgSFRNTCA9IFNvdXJjZUtpbmQoJ0hUTUwnLCAwKTsKIAotICAvKioKLSAgICogQSBEYXJ0IGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBub3QgYSBwYXJ0IG9mIGFub3RoZXIgbGlicmFyeS4gTGlicmFyaWVzCi0gICAqIG1pZ2h0IG9yIG1pZ2h0IG5vdCBjb250YWluIGFueSBkaXJlY3RpdmVzLCBpbmNsdWRpbmcgYSBsaWJyYXJ5IGRpcmVjdGl2ZS4KLSAgICovCisgIC8vLyBBIERhcnQgY29tcGlsYXRpb24gdW5pdCB0aGF0IGlzIG5vdCBhIHBhcnQgb2YgYW5vdGhlciBsaWJyYXJ5LiBMaWJyYXJpZXMKKyAgLy8vIG1pZ2h0IG9yIG1pZ2h0IG5vdCBjb250YWluIGFueSBkaXJlY3RpdmVzLCBpbmNsdWRpbmcgYSBsaWJyYXJ5IGRpcmVjdGl2ZS4KICAgc3RhdGljIGNvbnN0IFNvdXJjZUtpbmQgTElCUkFSWSA9IFNvdXJjZUtpbmQoJ0xJQlJBUlknLCAxKTsKIAotICAvKioKLSAgICogQSBEYXJ0IGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBpcyBwYXJ0IG9mIGFub3RoZXIgbGlicmFyeS4gUGFydHMgY29udGFpbiBhCi0gICAqIHBhcnQtb2YgZGlyZWN0aXZlLgotICAgKi8KKyAgLy8vIEEgRGFydCBjb21waWxhdGlvbiB1bml0IHRoYXQgaXMgcGFydCBvZiBhbm90aGVyIGxpYnJhcnkuIFBhcnRzIGNvbnRhaW4gYQorICAvLy8gcGFydC1vZiBkaXJlY3RpdmUuCiAgIHN0YXRpYyBjb25zdCBTb3VyY2VLaW5kIFBBUlQgPSBTb3VyY2VLaW5kKCdQQVJUJywgMik7CiAKLSAgLyoqCi0gICAqIEFuIHVua25vd24ga2luZCBvZiBzb3VyY2UuIFVzZWQgYm90aCB3aGVuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpZGVudGlmeQotICAgKiB0aGUga2luZCBvZiBhIHNvdXJjZSBhbmQgYWxzbyB3aGVuIHRoZSBraW5kIG9mIGEgc291cmNlIGlzIG5vdCBrbm93bgotICAgKiB3aXRob3V0IHBlcmZvcm1pbmcgYSBjb21wdXRhdGlvbiBhbmQgdGhlIGNsaWVudCBkb2VzIG5vdCB3YW50IHRvIHNwZW5kIHRoZQotICAgKiB0aW1lIHRvIGlkZW50aWZ5IHRoZSBraW5kLgotICAgKi8KKyAgLy8vIEFuIHVua25vd24ga2luZCBvZiBzb3VyY2UuIFVzZWQgYm90aCB3aGVuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpZGVudGlmeQorICAvLy8gdGhlIGtpbmQgb2YgYSBzb3VyY2UgYW5kIGFsc28gd2hlbiB0aGUga2luZCBvZiBhIHNvdXJjZSBpcyBub3Qga25vd24KKyAgLy8vIHdpdGhvdXQgcGVyZm9ybWluZyBhIGNvbXB1dGF0aW9uIGFuZCB0aGUgY2xpZW50IGRvZXMgbm90IHdhbnQgdG8gc3BlbmQgdGhlCisgIC8vLyB0aW1lIHRvIGlkZW50aWZ5IHRoZSBraW5kLgogICBzdGF0aWMgY29uc3QgU291cmNlS2luZCBVTktOT1dOID0gU291cmNlS2luZCgnVU5LTk9XTicsIDMpOwogCiAgIHN0YXRpYyBjb25zdCBMaXN0PFNvdXJjZUtpbmQ+IHZhbHVlcyA9IFtIVE1MLCBMSUJSQVJZLCBQQVJULCBVTktOT1dOXTsKIAotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhpcyBzb3VyY2Uga2luZC4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGlzIHNvdXJjZSBraW5kLgogICBmaW5hbCBTdHJpbmcgbmFtZTsKIAotICAvKioKLSAgICogVGhlIG9yZGluYWwgdmFsdWUgb2YgdGhlIHNvdXJjZSBraW5kLgotICAgKi8KKyAgLy8vIFRoZSBvcmRpbmFsIHZhbHVlIG9mIHRoZSBzb3VyY2Uga2luZC4KICAgZmluYWwgaW50IG9yZGluYWw7CiAKICAgY29uc3QgU291cmNlS2luZCh0aGlzLm5hbWUsIHRoaXMub3JkaW5hbCk7CkBAIC01NTYsNDcgKzQ2OSwzMSBAQAogICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwogfQogCi0vKioKLSAqIFRoZSBlbnVtZXJhdGlvbiBgVXJpS2luZGAgZGVmaW5lcyB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIFVSSSdzIHRoYXQgYXJlCi0gKiBrbm93biB0byB0aGUgYW5hbHlzaXMgZW5naW5lLiBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBraW5kIG9mCi0gKiBVUkkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gc291cmNlLgotICovCisvLy8gVGhlIGVudW1lcmF0aW9uIGBVcmlLaW5kYCBkZWZpbmVzIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgVVJJJ3MgdGhhdCBhcmUKKy8vLyBrbm93biB0byB0aGUgYW5hbHlzaXMgZW5naW5lLiBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBraW5kIG9mCisvLy8gVVJJIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHNvdXJjZS4KIGNsYXNzIFVyaUtpbmQgaW1wbGVtZW50cyBDb21wYXJhYmxlPFVyaUtpbmQ+IHsKLSAgLyoqCi0gICAqIEEgJ2RhcnQ6JyBVUkkuCi0gICAqLworICAvLy8gQSAnZGFydDonIFVSSS4KICAgc3RhdGljIGNvbnN0IFVyaUtpbmQgREFSVF9VUkkgPSBVcmlLaW5kKCdEQVJUX1VSSScsIDAsIDB4NjQpOwogCi0gIC8qKgotICAgKiBBICdmaWxlOicgVVJJLgotICAgKi8KKyAgLy8vIEEgJ2ZpbGU6JyBVUkkuCiAgIHN0YXRpYyBjb25zdCBVcmlLaW5kIEZJTEVfVVJJID0gVXJpS2luZCgnRklMRV9VUkknLCAxLCAweDY2KTsKIAotICAvKioKLSAgICogQSAncGFja2FnZTonIFVSSS4KLSAgICovCisgIC8vLyBBICdwYWNrYWdlOicgVVJJLgogICBzdGF0aWMgY29uc3QgVXJpS2luZCBQQUNLQUdFX1VSSSA9IFVyaUtpbmQoJ1BBQ0tBR0VfVVJJJywgMiwgMHg3MCk7CiAKICAgc3RhdGljIGNvbnN0IExpc3Q8VXJpS2luZD4gdmFsdWVzID0gW0RBUlRfVVJJLCBGSUxFX1VSSSwgUEFDS0FHRV9VUkldOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGlzIFVSSSBraW5kLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoaXMgVVJJIGtpbmQuCiAgIGZpbmFsIFN0cmluZyBuYW1lOwogCi0gIC8qKgotICAgKiBUaGUgb3JkaW5hbCB2YWx1ZSBvZiB0aGUgVVJJIGtpbmQuCi0gICAqLworICAvLy8gVGhlIG9yZGluYWwgdmFsdWUgb2YgdGhlIFVSSSBraW5kLgogICBmaW5hbCBpbnQgb3JkaW5hbDsKIAotICAvKioKLSAgICogVGhlIHNpbmdsZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBpZGVudGlmeSB0aGlzIGtpbmQgb2YgVVJJLgotICAgKi8KKyAgLy8vIFRoZSBzaW5nbGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBraW5kIG9mIFVSSS4KICAgZmluYWwgaW50IGVuY29kaW5nOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBVUkkga2luZCB0byBoYXZlIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBVUkkga2luZCB0byBoYXZlIHRoZSBnaXZlbiBlbmNvZGluZy4KICAgY29uc3QgVXJpS2luZCh0aGlzLm5hbWUsIHRoaXMub3JkaW5hbCwgdGhpcy5lbmNvZGluZyk7CiAKICAgQG92ZXJyaWRlCkBAIC02MDgsMTAgKzUwNSw4IEBACiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBuYW1lOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFVSSSBraW5kIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBbZW5jb2RpbmddLCBvciBgbnVsbGAgaWYgdGhlcmUKLSAgICogaXMgbm8ga2luZCB3aXRoIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFVSSSBraW5kIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBbZW5jb2RpbmddLCBvciBgbnVsbGAgaWYKKyAgLy8vIHRoZXJlIGlzIG5vIGtpbmQgd2l0aCB0aGUgZ2l2ZW4gZW5jb2RpbmcuCiAgIHN0YXRpYyBVcmlLaW5kIGZyb21FbmNvZGluZyhpbnQgZW5jb2RpbmcpIHsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKGVuY29kaW5nID09IDB4NjQpIHsKQEAgLTYyNiw5ICs1MjEsNyBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgVVJJIGtpbmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFVSSSBraW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCiAgIHN0YXRpYyBVcmlLaW5kIGZyb21TY2hlbWUoU3RyaW5nIHNjaGVtZSkgewogICAgIGlmIChzY2hlbWUgPT0gJ3BhY2thZ2UnKSB7CiAgICAgICByZXR1cm4gVXJpS2luZC5QQUNLQUdFX1VSSTsKQEAgLTY0MSwzOSArNTM0LDMyIEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgYFVyaVJlc29sdmVyYCBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiBvYmplY3RzIHRoYXQgYXJlIHVzZWQgdG8gcmVzb2x2ZQotICogVVJJJ3MgZm9yIGEgc291cmNlIGZhY3RvcnkuIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBhcmUgZXhwZWN0ZWQgdG8gcmVzb2x2ZSBhIHNpbmdsZSBzY2hlbWUgb2YKLSAqIGFic29sdXRlIFVSSS4KLSAqCi0gKiBOT1RJQ0U6IGluIGEgZnV0dXJlIGJyZWFraW5nIGNoYW5nZSByZWxlYXNlIG9mIHRoZSBhbmFseXplciwgYSBtZXRob2QKLSAqIGB2b2lkIGNsZWFyQ2FjaGUoKWAgd2lsbCBiZSBhZGRlZC4gIENsaWVudHMgdGhhdCBpbXBsZW1lbnQsIGJ1dCBkbyBub3QKLSAqIGV4dGVuZCwgdGhpcyBjbGFzcywgY2FuIHByZXBhcmUgZm9yIHRoZSBicmVha2luZyBjaGFuZ2UgYnkgYWRkaW5nIGFuCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IGNsZWFycyBhbnkgY2FjaGVkIFVSSSByZXNvbHV0aW9uCi0gKiBpbmZvcm1hdGlvbi4KLSAqLworLy8vIFRoZSBhYnN0cmFjdCBjbGFzcyBgVXJpUmVzb2x2ZXJgIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIG9iamVjdHMgdGhhdCBhcmUKKy8vLyB1c2VkIHRvIHJlc29sdmUgVVJJJ3MgZm9yIGEgc291cmNlIGZhY3RvcnkuIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBhcmUKKy8vLyBleHBlY3RlZCB0byByZXNvbHZlIGEgc2luZ2xlIHNjaGVtZSBvZiBhYnNvbHV0ZSBVUkkuCisvLy8KKy8vLyBOT1RJQ0U6IGluIGEgZnV0dXJlIGJyZWFraW5nIGNoYW5nZSByZWxlYXNlIG9mIHRoZSBhbmFseXplciwgYSBtZXRob2QKKy8vLyBgdm9pZCBjbGVhckNhY2hlKClgIHdpbGwgYmUgYWRkZWQuICBDbGllbnRzIHRoYXQgaW1wbGVtZW50LCBidXQgZG8gbm90CisvLy8gZXh0ZW5kLCB0aGlzIGNsYXNzLCBjYW4gcHJlcGFyZSBmb3IgdGhlIGJyZWFraW5nIGNoYW5nZSBieSBhZGRpbmcgYW4KKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IGNsZWFycyBhbnkgY2FjaGVkIFVSSSByZXNvbHV0aW9uCisvLy8gaW5mb3JtYXRpb24uCiBhYnN0cmFjdCBjbGFzcyBVcmlSZXNvbHZlciB7Ci0gIC8qKgotICAgKiBDbGVhciBhbnkgY2FjaGVkIFVSSSByZXNvbHV0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KKyAgLy8vIENsZWFyIGFueSBjYWNoZWQgVVJJIHJlc29sdXRpb24gaW5mb3JtYXRpb24uCiAgIHZvaWQgY2xlYXJDYWNoZSgpIHt9CiAKLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIGdpdmVuIGFic29sdXRlIFVSSS4gUmV0dXJuIGEgW1NvdXJjZV0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIHRvIHdoaWNoCi0gICAqIGl0IHdhcyByZXNvbHZlZCwgd2hldGhlciBvciBub3QgdGhlIHJlc3VsdGluZyBzb3VyY2UgZXhpc3RzLCBvciBgbnVsbGAgaWYgaXQgY291bGQgbm90IGJlCi0gICAqIHJlc29sdmVkIGJlY2F1c2UgdGhlIFVSSSBpcyBpbnZhbGlkLgotICAgKgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIGFjdHVhbFVyaSB0aGUgYWN0dWFsIHVyaSBmb3IgdGhpcyBzb3VyY2UgLS0gaWYgYG51bGxgLCB0aGUgdmFsdWUgb2YgW3VyaV0gd2lsbCBiZSB1c2VkCi0gICAqIEByZXR1cm4gYSBbU291cmNlXSByZXByZXNlbnRpbmcgdGhlIGZpbGUgdG8gd2hpY2ggZ2l2ZW4gVVJJIHdhcyByZXNvbHZlZAotICAgKi8KKyAgLy8vIFJlc29sdmUgdGhlIGdpdmVuIGFic29sdXRlIFVSSS4gUmV0dXJuIGEgW1NvdXJjZV0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIHRvCisgIC8vLyB3aGljaCBpdCB3YXMgcmVzb2x2ZWQsIHdoZXRoZXIgb3Igbm90IHRoZSByZXN1bHRpbmcgc291cmNlIGV4aXN0cywgb3IKKyAgLy8vIGBudWxsYCBpZiBpdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB0aGUgVVJJIGlzIGludmFsaWQuCisgIC8vLworICAvLy8gQHBhcmFtIHVyaSB0aGUgVVJJIHRvIGJlIHJlc29sdmVkCisgIC8vLyBAcGFyYW0gYWN0dWFsVXJpIHRoZSBhY3R1YWwgdXJpIGZvciB0aGlzIHNvdXJjZSAtLSBpZiBgbnVsbGAsIHRoZSB2YWx1ZSBvZgorICAvLy8gW3VyaV0gd2lsbCBiZSB1c2VkCisgIC8vLyBAcmV0dXJuIGEgW1NvdXJjZV0gcmVwcmVzZW50aW5nIHRoZSBmaWxlIHRvIHdoaWNoIGdpdmVuIFVSSSB3YXMgcmVzb2x2ZWQKICAgU291cmNlIHJlc29sdmVBYnNvbHV0ZShVcmkgdXJpLCBbVXJpIGFjdHVhbFVyaV0pOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gYWJzb2x1dGUgVVJJIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gW3NvdXJjZV0sIG9yIGBudWxsYCBpZiBhCi0gICAqIHZhbGlkIFVSSSBjYW5ub3QgYmUgY29tcHV0ZWQuCi0gICAqCi0gICAqIFRoZSBjb21wdXRhdGlvbiBzaG91bGQgYmUgYmFzZWQgc29sZWx5IG9uIFtzb3VyY2UuZnVsbE5hbWVdLgotICAgKi8KKyAgLy8vIFJldHVybiBhbiBhYnNvbHV0ZSBVUkkgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBbc291cmNlXSwgb3IgYG51bGxgIGlmIGEKKyAgLy8vIHZhbGlkIFVSSSBjYW5ub3QgYmUgY29tcHV0ZWQuCisgIC8vLworICAvLy8gVGhlIGNvbXB1dGF0aW9uIHNob3VsZCBiZSBiYXNlZCBzb2xlbHkgb24gW3NvdXJjZS5mdWxsTmFtZV0uCiAgIFVyaSByZXN0b3JlQWJzb2x1dGUoU291cmNlIHNvdXJjZSkgPT4gbnVsbDsKIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zb3VyY2VfaW8uZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9zb3VyY2VfaW8uZGFydAppbmRleCAzNjQ1MzA5Li4xNmQ4MmQyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc291cmNlX2lvLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3NvdXJjZV9pby5kYXJ0CkBAIC0xMiwxOCArMTIsMTQgQEAKIAogZXhwb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgW0V4cGxpY2l0U291cmNlUmVzb2x2ZXJdIG1hcCBVUklzIHRvIGZpbGVzIG9uIGRpc2sKLSAqIHVzaW5nIGEgZml4ZWQgbWFwcGluZyBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgW0V4cGxpY2l0U291cmNlUmVzb2x2ZXJdIG1hcCBVUklzIHRvIGZpbGVzIG9uIGRpc2sKKy8vLyB1c2luZyBhIGZpeGVkIG1hcHBpbmcgcHJvdmlkZWQgYXQgY29uc3RydWN0aW9uIHRpbWUuCiBAZGVwcmVjYXRlZAogY2xhc3MgRXhwbGljaXRTb3VyY2VSZXNvbHZlciBleHRlbmRzIFVyaVJlc29sdmVyIHsKICAgZmluYWwgTWFwPFVyaSwgSmF2YUZpbGU+IHVyaVRvRmlsZU1hcDsKICAgZmluYWwgTWFwPFN0cmluZywgVXJpPiBwYXRoVG9VcmlNYXA7CiAKLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBbRXhwbGljaXRTb3VyY2VSZXNvbHZlcl0gYmFzZWQgb24gdGhlIGdpdmVuIFt1cmlUb0ZpbGVNYXBdLgotICAgKi8KKyAgLy8vIENvbnN0cnVjdCBhbiBbRXhwbGljaXRTb3VyY2VSZXNvbHZlcl0gYmFzZWQgb24gdGhlIGdpdmVuIFt1cmlUb0ZpbGVNYXBdLgogICBFeHBsaWNpdFNvdXJjZVJlc29sdmVyKE1hcDxVcmksIEphdmFGaWxlPiB1cmlUb0ZpbGVNYXApCiAgICAgICA6IHVyaVRvRmlsZU1hcCA9IHVyaVRvRmlsZU1hcCwKICAgICAgICAgcGF0aFRvVXJpTWFwID0gX2NvbXB1dGVQYXRoVG9VcmlNYXAodXJpVG9GaWxlTWFwKTsKQEAgLTQ0LDkgKzQwLDcgQEAKICAgICByZXR1cm4gcGF0aFRvVXJpTWFwW3NvdXJjZS5mdWxsTmFtZV07CiAgIH0KIAotICAvKioKLSAgICogQnVpbGQgdGhlIGludmVyc2UgbWFwcGluZyBvZiBbdXJpVG9Tb3VyY2VNYXBdLgotICAgKi8KKyAgLy8vIEJ1aWxkIHRoZSBpbnZlcnNlIG1hcHBpbmcgb2YgW3VyaVRvU291cmNlTWFwXS4KICAgc3RhdGljIE1hcDxTdHJpbmcsIFVyaT4gX2NvbXB1dGVQYXRoVG9VcmlNYXAoCiAgICAgICBNYXA8VXJpLCBKYXZhRmlsZT4gdXJpVG9Tb3VyY2VNYXApIHsKICAgICBNYXA8U3RyaW5nLCBVcmk+IHBhdGhUb1VyaU1hcCA9IDxTdHJpbmcsIFVyaT57fTsKQEAgLTU3LDU1ICs1MSwzOCBAQAogICB9CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgRmlsZUJhc2VkU291cmNlYCBpbXBsZW1lbnQgYSBzb3VyY2UgdGhhdCByZXByZXNlbnRzIGEgZmlsZS4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYEZpbGVCYXNlZFNvdXJjZWAgaW1wbGVtZW50IGEgc291cmNlIHRoYXQgcmVwcmVzZW50cworLy8vIGEgZmlsZS4KIGNsYXNzIEZpbGVCYXNlZFNvdXJjZSBleHRlbmRzIFNvdXJjZSB7Ci0gIC8qKgotICAgKiBBIGZ1bmN0aW9uIHRoYXQgY2hhbmdlcyB0aGUgd2F5IHRoYXQgZmlsZXMgYXJlIHJlYWQgb2ZmIG9mIGRpc2suCi0gICAqLworICAvLy8gQSBmdW5jdGlvbiB0aGF0IGNoYW5nZXMgdGhlIHdheSB0aGF0IGZpbGVzIGFyZSByZWFkIG9mZiBvZiBkaXNrLgogICBzdGF0aWMgRnVuY3Rpb24gZmlsZVJlYWRNb2RlID0gKFN0cmluZyBzKSA9PiBzOwogCi0gIC8qKgotICAgKiBNYXAgZnJvbSBlbmNvZGVkIFVSSS9maWxlcGF0aCBwYWlyIHRvIGEgdW5pcXVlIGludGVnZXIgaWRlbnRpZmllci4gIFRoaXMKLSAgICogaWRlbnRpZmllciBpcyB1c2VkIGZvciBlcXVhbGl0eSB0ZXN0cyBhbmQgaGFzaCBjb2Rlcy4KLSAgICoKLSAgICogVGhlIFVSSSBhbmQgZmlsZXBhdGggYXJlIGpvaW5lZCBpbnRvIGEgcGFpciBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhbiAnQCcKLSAgICogY2hhcmFjdGVyLgotICAgKi8KKyAgLy8vIE1hcCBmcm9tIGVuY29kZWQgVVJJL2ZpbGVwYXRoIHBhaXIgdG8gYSB1bmlxdWUgaW50ZWdlciBpZGVudGlmaWVyLiAgVGhpcworICAvLy8gaWRlbnRpZmllciBpcyB1c2VkIGZvciBlcXVhbGl0eSB0ZXN0cyBhbmQgaGFzaCBjb2Rlcy4KKyAgLy8vCisgIC8vLyBUaGUgVVJJIGFuZCBmaWxlcGF0aCBhcmUgam9pbmVkIGludG8gYSBwYWlyIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIGFuICdAJworICAvLy8gY2hhcmFjdGVyLgogICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgaW50PiBfaWRUYWJsZSA9IEhhc2hNYXA8U3RyaW5nLCBpbnQ+KCk7CiAKLSAgLyoqCi0gICAqIFRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkLgotICAgKi8KKyAgLy8vIFRoZSBVUkkgZnJvbSB3aGljaCB0aGlzIHNvdXJjZSB3YXMgb3JpZ2luYWxseSBkZXJpdmVkLgogICBAb3ZlcnJpZGUKICAgZmluYWwgVXJpIHVyaTsKIAotICAvKioKLSAgICogVGhlIHVuaXF1ZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBbRmlsZUJhc2VkU291cmNlXS4KLSAgICovCisgIC8vLyBUaGUgdW5pcXVlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFtGaWxlQmFzZWRTb3VyY2VdLgogICBmaW5hbCBpbnQgaWQ7CiAKLSAgLyoqCi0gICAqIFRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgotICAgKi8KKyAgLy8vIFRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgogICBmaW5hbCBKYXZhRmlsZSBmaWxlOwogCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIGFic29sdXRlIHBhdGggb2YgdGhpcyBzb3VyY2UuCi0gICAqLworICAvLy8gVGhlIGNhY2hlZCBhYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc291cmNlLgogICBTdHJpbmcgX2Fic29sdXRlUGF0aDsKIAotICAvKioKLSAgICogVGhlIGNhY2hlZCBlbmNvZGluZyBmb3IgdGhpcyBzb3VyY2UuCi0gICAqLworICAvLy8gVGhlIGNhY2hlZCBlbmNvZGluZyBmb3IgdGhpcyBzb3VyY2UuCiAgIFN0cmluZyBfZW5jb2Rpbmc7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNvdXJjZSBvYmplY3QgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBbZmlsZV0uIElmCi0gICAqIGEgW3VyaV0gaXMgZ2l2ZW4sIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBVUkkgZnJvbSB3aGljaCB0aGUgc291cmNlIHdhcwotICAgKiBkZXJpdmVkLCBvdGhlcndpc2UgYSBgZmlsZTpgIFVSSSB3aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIFtmaWxlXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzb3VyY2Ugb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gW2ZpbGVdLiBJZgorICAvLy8gYSBbdXJpXSBpcyBnaXZlbiwgdGhlbiBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIFVSSSBmcm9tIHdoaWNoIHRoZSBzb3VyY2UKKyAgLy8vIHdhcyBkZXJpdmVkLCBvdGhlcndpc2UgYSBgZmlsZTpgIFVSSSB3aWxsIGJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIFtmaWxlXS4KICAgRmlsZUJhc2VkU291cmNlKEphdmFGaWxlIGZpbGUsIFtVcmkgdXJpXSkKICAgICAgIDogdGhpcy51cmkgPSB1cmkgPz8gZmlsZS50b1VSSSgpLAogICAgICAgICB0aGlzLmZpbGUgPSBmaWxlLApAQCAtMTE5LDE3ICs5NiwxNiBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29udGVudHMgYW5kIHRpbWVzdGFtcCBvZiB0aGUgdW5kZXJseWluZyBmaWxlLgotICAgKgotICAgKiBDbGllbnRzIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbWV0aG9kIFtBbmFseXNpc0NvbnRleHQuZ2V0Q29udGVudHNdCi0gICAqIGJlY2F1c2UgY29udGV4dHMgY2FuIGhhdmUgbG9jYWwgb3ZlcnJpZGVzIG9mIHRoZSBjb250ZW50IG9mIGEgc291cmNlIHRoYXQgdGhlIHNvdXJjZSBpcyBub3QKLSAgICogYXdhcmUgb2YuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgcGFpcmVkIHdpdGggdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBvZiB0aGUgc291cmNlCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHNvdXJjZSBjb3VsZCBub3QgYmUgYWNjZXNzZWQKLSAgICogU2VlIFtjb250ZW50c10uCi0gICAqLworICAvLy8gR2V0IHRoZSBjb250ZW50cyBhbmQgdGltZXN0YW1wIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGUuCisgIC8vLworICAvLy8gQ2xpZW50cyBzaG91bGQgY29uc2lkZXIgdXNpbmcgdGhlIG1ldGhvZCBbQW5hbHlzaXNDb250ZXh0LmdldENvbnRlbnRzXQorICAvLy8gYmVjYXVzZSBjb250ZXh0cyBjYW4gaGF2ZSBsb2NhbCBvdmVycmlkZXMgb2YgdGhlIGNvbnRlbnQgb2YgYSBzb3VyY2UgdGhhdAorICAvLy8gdGhlIHNvdXJjZSBpcyBub3QgYXdhcmUgb2YuCisgIC8vLworICAvLy8gQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBwYWlyZWQgd2l0aCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mCisgIC8vLyB0aGUgc291cmNlCisgIC8vLyBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBzb3VyY2UgY291bGQgbm90IGJlIGFjY2Vzc2VkCisgIC8vLyBTZWUgW2NvbnRlbnRzXS4KICAgVGltZXN0YW1wZWREYXRhPFN0cmluZz4gZ2V0IGNvbnRlbnRzRnJvbUZpbGUgewogICAgIHJldHVybiBUaW1lc3RhbXBlZERhdGE8U3RyaW5nPigKICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWQoKSwgZmlsZVJlYWRNb2RlKGZpbGUucmVhZEFzU3RyaW5nU3luYygpKSk7CkBAIC0xODUsMTcgKzE2MSwxMyBAQAogICB9CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgRmlsZVVyaVJlc29sdmVyYCByZXNvbHZlIGBmaWxlYCBVUkkncy4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIG5vdyBkZXByZWNhdGVkLCAnbmV3IEZpbGVVcmlSZXNvbHZlcigpJyBpcyBlcXVpdmFsZW50IHRvCi0gKiAnbmV3IFJlc291cmNlVXJpUmVzb2x2ZXIoUGh5c2ljYWxSZXNvdXJjZVByb3ZpZGVyLklOU1RBTkNFKScuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBGaWxlVXJpUmVzb2x2ZXJgIHJlc29sdmUgYGZpbGVgIFVSSSdzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBub3cgZGVwcmVjYXRlZCwgJ25ldyBGaWxlVXJpUmVzb2x2ZXIoKScgaXMgZXF1aXZhbGVudCB0bworLy8vICduZXcgUmVzb3VyY2VVcmlSZXNvbHZlcihQaHlzaWNhbFJlc291cmNlUHJvdmlkZXIuSU5TVEFOQ0UpJy4KIEBkZXByZWNhdGVkCiBjbGFzcyBGaWxlVXJpUmVzb2x2ZXIgZXh0ZW5kcyBVcmlSZXNvbHZlciB7Ci0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgYGZpbGVgIHNjaGVtZS4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYGZpbGVgIHNjaGVtZS4KICAgc3RhdGljIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlIjsKIAogICBAb3ZlcnJpZGUKQEAgLTIxMSw0MiArMTgzLDMwIEBACiAgICAgcmV0dXJuIFVyaS5maWxlKHNvdXJjZS5mdWxsTmFtZSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYGZpbGVgIFVSSS4KLSAgICoKLSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIGJlaW5nIHRlc3RlZAotICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYGZpbGVgIFVSSQotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBmaWxlYCBVUkkuCisgIC8vLworICAvLy8gQHBhcmFtIHVyaSB0aGUgVVJJIGJlaW5nIHRlc3RlZAorICAvLy8gQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBmaWxlYCBVUkkKICAgc3RhdGljIGJvb2wgaXNGaWxlVXJpKFVyaSB1cmkpID0+IHVyaS5zY2hlbWUgPT0gRklMRV9TQ0hFTUU7CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIGludGVyZmFjZSBgTG9jYWxTb3VyY2VQcmVkaWNhdGVgIGFyZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4KLSAqIFtTb3VyY2VdIGlzICJsb2NhbCIgaW4gc29tZSBzZW5zZSwgc28gY2FuIGJlIHVwZGF0ZWQuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgaW50ZXJmYWNlIGBMb2NhbFNvdXJjZVByZWRpY2F0ZWAgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZQorLy8vIGdpdmVuIFtTb3VyY2VdIGlzICJsb2NhbCIgaW4gc29tZSBzZW5zZSwgc28gY2FuIGJlIHVwZGF0ZWQuCiBhYnN0cmFjdCBjbGFzcyBMb2NhbFNvdXJjZVByZWRpY2F0ZSB7Ci0gIC8qKgotICAgKiBJbnN0YW5jZSBvZiBbTG9jYWxTb3VyY2VQcmVkaWNhdGVdIHRoYXQgYWx3YXlzIHJldHVybnMgYGZhbHNlYC4KLSAgICovCisgIC8vLyBJbnN0YW5jZSBvZiBbTG9jYWxTb3VyY2VQcmVkaWNhdGVdIHRoYXQgYWx3YXlzIHJldHVybnMgYGZhbHNlYC4KICAgc3RhdGljIGZpbmFsIExvY2FsU291cmNlUHJlZGljYXRlIEZBTFNFID0gTG9jYWxTb3VyY2VQcmVkaWNhdGVfRkFMU0UoKTsKIAotICAvKioKLSAgICogSW5zdGFuY2Ugb2YgW0xvY2FsU291cmNlUHJlZGljYXRlXSB0aGF0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC4KLSAgICovCisgIC8vLyBJbnN0YW5jZSBvZiBbTG9jYWxTb3VyY2VQcmVkaWNhdGVdIHRoYXQgYWx3YXlzIHJldHVybnMgYHRydWVgLgogICBzdGF0aWMgZmluYWwgTG9jYWxTb3VyY2VQcmVkaWNhdGUgVFJVRSA9IExvY2FsU291cmNlUHJlZGljYXRlX1RSVUUoKTsKIAotICAvKioKLSAgICogSW5zdGFuY2Ugb2YgW0xvY2FsU291cmNlUHJlZGljYXRlXSB0aGF0IHJldHVybnMgYHRydWVgIGZvciBhbGwgW1NvdXJjZV1zCi0gICAqIGV4Y2VwdCBvZiBTREsuCi0gICAqLworICAvLy8gSW5zdGFuY2Ugb2YgW0xvY2FsU291cmNlUHJlZGljYXRlXSB0aGF0IHJldHVybnMgYHRydWVgIGZvciBhbGwgW1NvdXJjZV1zCisgIC8vLyBleGNlcHQgb2YgU0RLLgogICBzdGF0aWMgZmluYWwgTG9jYWxTb3VyY2VQcmVkaWNhdGUgTk9UX1NESyA9IExvY2FsU291cmNlUHJlZGljYXRlX05PVF9TREsoKTsKIAotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gW1NvdXJjZV0gaXMgbG9jYWwuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIFtTb3VyY2VdIHRvIGFuYWx5emUKLSAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtTb3VyY2VdIGlzIGxvY2FsCi0gICAqLworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gW1NvdXJjZV0gaXMgbG9jYWwuCisgIC8vLworICAvLy8gQHBhcmFtIHNvdXJjZSB0aGUgW1NvdXJjZV0gdG8gYW5hbHl6ZQorICAvLy8gQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtTb3VyY2VdIGlzIGxvY2FsCiAgIGJvb2wgaXNMb2NhbChTb3VyY2Ugc291cmNlKTsKIH0KIApAQCAtMjY1LDQ4ICsyMjUsMzkgQEAKICAgYm9vbCBpc0xvY2FsKFNvdXJjZSBzb3VyY2UpID0+IHRydWU7CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgUGFja2FnZVVyaVJlc29sdmVyYCByZXNvbHZlIGBwYWNrYWdlYCBVUkkncyBpbiB0aGUgY29udGV4dCBvZgotICogYW4gYXBwbGljYXRpb24uCi0gKgotICogRm9yIHRoZSBwdXJwb3NlcyBvZiBzaGFyaW5nIGFuYWx5c2lzLCB0aGUgcGF0aCB0byBlYWNoIHBhY2thZ2UgdW5kZXIgdGhlICJwYWNrYWdlcyIgZGlyZWN0b3J5Ci0gKiBzaG91bGQgYmUgY2Fub25pY2FsaXplZCwgYnV0IHRvIHByZXNlcnZlIHJlbGF0aXZlIGxpbmtzIHdpdGhpbiBhIHBhY2thZ2UsIHRoZSByZW1haW5kZXIgb2YgdGhlCi0gKiBwYXRoIGZyb20gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IHRvIHRoZSBsZWFmIHNob3VsZCBub3QuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBQYWNrYWdlVXJpUmVzb2x2ZXJgIHJlc29sdmUgYHBhY2thZ2VgIFVSSSdzIGluIHRoZQorLy8vIGNvbnRleHQgb2YgYW4gYXBwbGljYXRpb24uCisvLy8KKy8vLyBGb3IgdGhlIHB1cnBvc2VzIG9mIHNoYXJpbmcgYW5hbHlzaXMsIHRoZSBwYXRoIHRvIGVhY2ggcGFja2FnZSB1bmRlciB0aGUKKy8vLyAicGFja2FnZXMiIGRpcmVjdG9yeSBzaG91bGQgYmUgY2Fub25pY2FsaXplZCwgYnV0IHRvIHByZXNlcnZlIHJlbGF0aXZlIGxpbmtzCisvLy8gd2l0aGluIGEgcGFja2FnZSwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcGF0aCBmcm9tIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSB0bworLy8vIHRoZSBsZWFmIHNob3VsZCBub3QuCiBAZGVwcmVjYXRlZAogY2xhc3MgUGFja2FnZVVyaVJlc29sdmVyIGV4dGVuZHMgVXJpUmVzb2x2ZXIgewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGBwYWNrYWdlYCBzY2hlbWUuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGBwYWNrYWdlYCBzY2hlbWUuCiAgIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TQ0hFTUUgPSAicGFja2FnZSI7CiAKLSAgLyoqCi0gICAqIExvZyBleGNlcHRpb25zIHRocm93biB3aXRoIHRoZSBtZXNzYWdlICJSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZSIgb25seSBvbmNlLgotICAgKi8KKyAgLy8vIExvZyBleGNlcHRpb25zIHRocm93biB3aXRoIHRoZSBtZXNzYWdlICJSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZSIgb25seQorICAvLy8gb25jZS4KICAgc3RhdGljIGJvb2wgX0NhbkxvZ1JlcXVpcmVkS2V5SW9FeGNlcHRpb24gPSB0cnVlOwogCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBkaXJlY3RvcmllcyB0aGF0IGBwYWNrYWdlYCBVUkkncyBhcmUgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0by4KLSAgICovCisgIC8vLyBUaGUgcGFja2FnZSBkaXJlY3RvcmllcyB0aGF0IGBwYWNrYWdlYCBVUkkncyBhcmUgYXNzdW1lZCB0byBiZSByZWxhdGl2ZQorICAvLy8gdG8uCiAgIGZpbmFsIExpc3Q8SmF2YUZpbGU+IF9wYWNrYWdlc0RpcmVjdG9yaWVzOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZXNvbHZlciB0byByZXNvbHZlIGBwYWNrYWdlYCBVUkkncyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4KLSAgICogcGFja2FnZSBkaXJlY3Rvcmllcy4KLSAgICoKLSAgICogQHBhcmFtIHBhY2thZ2VzRGlyZWN0b3JpZXMgdGhlIHBhY2thZ2UgZGlyZWN0b3JpZXMgdGhhdCBgcGFja2FnZWAgVVJJJ3MgYXJlIGFzc3VtZWQgdG8gYmUKLSAgICogICAgICAgICAgcmVsYXRpdmUgdG8KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZXNvbHZlciB0byByZXNvbHZlIGBwYWNrYWdlYCBVUkkncyByZWxhdGl2ZSB0bworICAvLy8gdGhlIGdpdmVuIHBhY2thZ2UgZGlyZWN0b3JpZXMuCisgIC8vLworICAvLy8gQHBhcmFtIHBhY2thZ2VzRGlyZWN0b3JpZXMgdGhlIHBhY2thZ2UgZGlyZWN0b3JpZXMgdGhhdCBgcGFja2FnZWAgVVJJJ3MKKyAgLy8vICAgICAgICAgIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvCiAgIFBhY2thZ2VVcmlSZXNvbHZlcih0aGlzLl9wYWNrYWdlc0RpcmVjdG9yaWVzKSB7CiAgICAgaWYgKF9wYWNrYWdlc0RpcmVjdG9yaWVzLmlzRW1wdHkpIHsKICAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoIkF0IGxlYXN0IG9uZSBwYWNrYWdlIGRpcmVjdG9yeSBtdXN0IGJlIHByb3ZpZGVkIik7CiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIElmIHRoZSBsaXN0IG9mIHBhY2thZ2UgZGlyZWN0b3JpZXMgY29udGFpbnMgb25lIGVsZW1lbnQsIHJldHVybiBpdC4KLSAgICogT3RoZXJ3aXNlIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIEludGVuZGVkIGZvciB0ZXN0aW5nLgotICAgKi8KKyAgLy8vIElmIHRoZSBsaXN0IG9mIHBhY2thZ2UgZGlyZWN0b3JpZXMgY29udGFpbnMgb25lIGVsZW1lbnQsIHJldHVybiBpdC4KKyAgLy8vIE90aGVyd2lzZSByYWlzZSBhbiBleGNlcHRpb24uICBJbnRlbmRlZCBmb3IgdGVzdGluZy4KICAgU3RyaW5nIGdldCBwYWNrYWdlc0RpcmVjdG9yeV9mb3JUZXN0aW5nIHsKICAgICBpbnQgbGVuZ3RoID0gX3BhY2thZ2VzRGlyZWN0b3JpZXMubGVuZ3RoOwogICAgIGlmIChsZW5ndGggIT0gMSkgewpAQCAtMzE1LDE1ICsyNjYsMTMgQEAKICAgICByZXR1cm4gX3BhY2thZ2VzRGlyZWN0b3JpZXNbMF0uZ2V0UGF0aCgpOwogICB9CiAKLSAgLyoqCi0gICAqIEFuc3dlciB0aGUgY2Fub25pY2FsIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2thZ2VzRGlyZWN0b3J5IHRoZSAicGFja2FnZXMiIGRpcmVjdG9yeSAobm90IGBudWxsYCkKLSAgICogQHBhcmFtIHBrZ05hbWUgdGhlIHBhY2thZ2UgbmFtZSAobm90IGBudWxsYCwgbm90IGVtcHR5KQotICAgKiBAcGFyYW0gcmVsUGF0aCB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGFja2FnZSBkaXJlY3RvcnkgKG5vdCBgbnVsbGAsIG5vIGxlYWRpbmcgc2xhc2gsCi0gICAqICAgICAgICAgIGJ1dCBtYXkgYmUgZW1wdHkgc3RyaW5nKQotICAgKiBAcmV0dXJuIHRoZSBmaWxlIChub3QgYG51bGxgKQotICAgKi8KKyAgLy8vIEFuc3dlciB0aGUgY2Fub25pY2FsIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gcGFja2FnZXNEaXJlY3RvcnkgdGhlICJwYWNrYWdlcyIgZGlyZWN0b3J5IChub3QgYG51bGxgKQorICAvLy8gQHBhcmFtIHBrZ05hbWUgdGhlIHBhY2thZ2UgbmFtZSAobm90IGBudWxsYCwgbm90IGVtcHR5KQorICAvLy8gQHBhcmFtIHJlbFBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IChub3QgYG51bGxgLCBubworICAvLy8gICAgICAgICAgbGVhZGluZyBzbGFzaCwgYnV0IG1heSBiZSBlbXB0eSBzdHJpbmcpCisgIC8vLyBAcmV0dXJuIHRoZSBmaWxlIChub3QgYG51bGxgKQogICBKYXZhRmlsZSBnZXRDYW5vbmljYWxGaWxlKAogICAgICAgSmF2YUZpbGUgcGFja2FnZXNEaXJlY3RvcnksIFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgcmVsUGF0aCkgewogICAgIEphdmFGaWxlIHBrZ0RpciA9IEphdmFGaWxlLnJlbGF0aXZlKHBhY2thZ2VzRGlyZWN0b3J5LCBwa2dOYW1lKTsKQEAgLTQxNCwxMCArMzYzLDkgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBAcmV0dXJuIGB0cnVlYCBpZiAiZmlsZSIgd2FzIGZvdW5kIGluICJwYWNrYWdlc0RpciIsIGFuZCBpdCBpcyBwYXJ0IG9mIHRoZSAibGliIiBmb2xkZXIKLSAgICogICAgICAgICBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjb250YWlucyBpbiB0aGlzICJwYWNrYWdlc0RpciIuCi0gICAqLworICAvLy8gQHJldHVybiBgdHJ1ZWAgaWYgImZpbGUiIHdhcyBmb3VuZCBpbiAicGFja2FnZXNEaXIiLCBhbmQgaXQgaXMgcGFydCBvZgorICAvLy8gICAgICAgICB0aGUgImxpYiIgZm9sZGVyIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNvbnRhaW5zIGluIHRoaXMKKyAgLy8vICAgICAgICAgInBhY2thZ2VzRGlyIi4KICAgYm9vbCBfaXNTZWxmUmVmZXJlbmNlKEphdmFGaWxlIHBhY2thZ2VzRGlyLCBKYXZhRmlsZSBmaWxlKSB7CiAgICAgSmF2YUZpbGUgcm9vdERpciA9IHBhY2thZ2VzRGlyLmdldFBhcmVudEZpbGUoKTsKICAgICBpZiAocm9vdERpciA9PSBudWxsKSB7CkBAIC00MjgsNDkgKzM3NiwzNSBAQAogICAgIHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKCIkcm9vdFBhdGgvbGliIik7CiAgIH0KIAotICAvKioKLSAgICogQ29udmVydCB0aGUgZ2l2ZW4gZmlsZSBwYXRoIHRvIGEgImZpbGU6IiBVUkkuICBPbiBXaW5kb3dzLCB0aGlzIHRyYW5zZm9ybXMKLSAgICogYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLgotICAgKi8KKyAgLy8vIENvbnZlcnQgdGhlIGdpdmVuIGZpbGUgcGF0aCB0byBhICJmaWxlOiIgVVJJLiAgT24gV2luZG93cywgdGhpcyB0cmFuc2Zvcm1zCisgIC8vLyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuCiAgIFN0cmluZyBfdG9GaWxlVXJpKFN0cmluZyBmaWxlUGF0aCkgPT4gcGF0aC5jb250ZXh0LnRvVXJpKGZpbGVQYXRoKS50b1N0cmluZygpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgcGFja2FnZWAgVVJJLgotICAgKgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgYmVpbmcgdGVzdGVkCi0gICAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgcGFja2FnZWAgVVJJCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYHBhY2thZ2VgIFVSSS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gdXJpIHRoZSBVUkkgYmVpbmcgdGVzdGVkCisgIC8vLyBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGEgYHBhY2thZ2VgIFVSSQogICBzdGF0aWMgYm9vbCBpc1BhY2thZ2VVcmkoVXJpIHVyaSkgPT4gUEFDS0FHRV9TQ0hFTUUgPT0gdXJpLnNjaGVtZTsKIH0KIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBSZWxhdGl2ZUZpbGVVcmlSZXNvbHZlcmAgcmVzb2x2ZSBgZmlsZWAgVVJJJ3MuCi0gKgotICogVGhpcyBjbGFzcyBpcyBub3cgZGVwcmVjYXRlZCwgZmlsZSBVUkkgcmVzb2x1dGlvbiBzaG91bGQgYmUgZG9uZSB3aXRoCi0gKiBSZXNvdXJjZVVyaVJlc29sdmVyLCBpLmUuCi0gKiAnbmV3IFJlc291cmNlVXJpUmVzb2x2ZXIoUGh5c2ljYWxSZXNvdXJjZVByb3ZpZGVyLklOU1RBTkNFKScuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBSZWxhdGl2ZUZpbGVVcmlSZXNvbHZlcmAgcmVzb2x2ZSBgZmlsZWAgVVJJJ3MuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIG5vdyBkZXByZWNhdGVkLCBmaWxlIFVSSSByZXNvbHV0aW9uIHNob3VsZCBiZSBkb25lIHdpdGgKKy8vLyBSZXNvdXJjZVVyaVJlc29sdmVyLCBpLmUuCisvLy8gJ25ldyBSZXNvdXJjZVVyaVJlc29sdmVyKFBoeXNpY2FsUmVzb3VyY2VQcm92aWRlci5JTlNUQU5DRSknLgogQGRlcHJlY2F0ZWQKIGNsYXNzIFJlbGF0aXZlRmlsZVVyaVJlc29sdmVyIGV4dGVuZHMgVXJpUmVzb2x2ZXIgewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGBmaWxlYCBzY2hlbWUuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGBmaWxlYCBzY2hlbWUuCiAgIHN0YXRpYyBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7CiAKLSAgLyoqCi0gICAqIFRoZSBkaXJlY3RvcmllcyBmb3IgdGhlIHJlbGF0dmllIFVSSSdzCi0gICAqLworICAvLy8gVGhlIGRpcmVjdG9yaWVzIGZvciB0aGUgcmVsYXR2aWUgVVJJJ3MKICAgZmluYWwgTGlzdDxKYXZhRmlsZT4gX3JlbGF0aXZlRGlyZWN0b3JpZXM7CiAKLSAgLyoqCi0gICAqIFRoZSByb290IGRpcmVjdG9yeSBmb3IgYWxsIHRoZSBzb3VyY2UgdHJlZXMKLSAgICovCisgIC8vLyBUaGUgcm9vdCBkaXJlY3RvcnkgZm9yIGFsbCB0aGUgc291cmNlIHRyZWVzCiAgIGZpbmFsIEphdmFGaWxlIF9yb290RGlyZWN0b3J5OwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCByZXNvbHZlciB0byByZXNvbHZlIGBmaWxlYCBVUkkncyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcm9vdAotICAgKiBkaXJlY3RvcnkuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgcmVzb2x2ZXIgdG8gcmVzb2x2ZSBgZmlsZWAgVVJJJ3MgcmVsYXRpdmUgdG8KKyAgLy8vIHRoZSBnaXZlbiByb290IGRpcmVjdG9yeS4KICAgUmVsYXRpdmVGaWxlVXJpUmVzb2x2ZXIodGhpcy5fcm9vdERpcmVjdG9yeSwgdGhpcy5fcmVsYXRpdmVEaXJlY3RvcmllcykKICAgICAgIDogc3VwZXIoKTsKIApAQCAtNDkwLDExICs0MjQsOSBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBmaWxlYCBVUkkuCi0gICAqCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBiZWluZyB0ZXN0ZWQKLSAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGBmaWxlYCBVUkkKLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZmlsZWAgVVJJLgorICAvLy8KKyAgLy8vIEBwYXJhbSB1cmkgdGhlIFVSSSBiZWluZyB0ZXN0ZWQKKyAgLy8vIEByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSBgZmlsZWAgVVJJCiAgIHN0YXRpYyBib29sIGlzRmlsZVVyaShVcmkgdXJpKSA9PiB1cmkuc2NoZW1lID09IEZJTEVfU0NIRU1FOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3N0YXRpY190eXBlX2FuYWx5emVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc3RhdGljX3R5cGVfYW5hbHl6ZXIuZGFydAppbmRleCBmMjI0OTIwLi5lYWZhMDI4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc3RhdGljX3R5cGVfYW5hbHl6ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvc3RhdGljX3R5cGVfYW5hbHl6ZXIuZGFydApAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKQEAgLTIzLDYxICsyNCw0MyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQnCiAgICAgc2hvdyBnZXRFeHByZXNzaW9uVHlwZSwgZ2V0UmVhZFR5cGU7CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgU3RhdGljVHlwZUFuYWx5emVyYCBwZXJmb3JtIHR3byB0eXBlLXJlbGF0ZWQgdGFza3MuIEZpcnN0LCB0aGV5Ci0gKiBjb21wdXRlIHRoZSBzdGF0aWMgdHlwZSBvZiBldmVyeSBleHByZXNzaW9uLiBTZWNvbmQsIHRoZXkgbG9vayBmb3IgYW55IHN0YXRpYyB0eXBlIGVycm9ycyBvcgotICogd2FybmluZ3MgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGdlbmVyYXRlZC4gVGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHR5cGUgYW5hbHl6ZXIgYXJlOgotICogPG9sPgotICogKiBFdmVyeSBlbGVtZW50IHRoYXQgcmVmZXJzIHRvIHR5cGVzIHNob3VsZCBiZSBmdWxseSBwb3B1bGF0ZWQuCi0gKiAqIEV2ZXJ5IG5vZGUgcmVwcmVzZW50aW5nIGFuIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlc29sdmVkIHRvIHRoZSBUeXBlIG9mIHRoZSBleHByZXNzaW9uLgotICogPC9vbD4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYFN0YXRpY1R5cGVBbmFseXplcmAgcGVyZm9ybSB0d28gdHlwZS1yZWxhdGVkIHRhc2tzLiBGaXJzdCwgdGhleQorLy8vIGNvbXB1dGUgdGhlIHN0YXRpYyB0eXBlIG9mIGV2ZXJ5IGV4cHJlc3Npb24uIFNlY29uZCwgdGhleSBsb29rIGZvciBhbnkgc3RhdGljIHR5cGUgZXJyb3JzIG9yCisvLy8gd2FybmluZ3MgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGdlbmVyYXRlZC4gVGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHR5cGUgYW5hbHl6ZXIgYXJlOgorLy8vIDxvbD4KKy8vLyAqIEV2ZXJ5IGVsZW1lbnQgdGhhdCByZWZlcnMgdG8gdHlwZXMgc2hvdWxkIGJlIGZ1bGx5IHBvcHVsYXRlZC4KKy8vLyAqIEV2ZXJ5IG5vZGUgcmVwcmVzZW50aW5nIGFuIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlc29sdmVkIHRvIHRoZSBUeXBlIG9mIHRoZSBleHByZXNzaW9uLgorLy8vIDwvb2w+CiBjbGFzcyBTdGF0aWNUeXBlQW5hbHl6ZXIgZXh0ZW5kcyBTaW1wbGVBc3RWaXNpdG9yPHZvaWQ+IHsKLSAgLyoqCi0gICAqIFRoZSByZXNvbHZlciBkcml2aW5nIHRoZSByZXNvbHV0aW9uIGFuZCB0eXBlIGFuYWx5c2lzLgotICAgKi8KKyAgLy8vIFRoZSByZXNvbHZlciBkcml2aW5nIHRoZSByZXNvbHV0aW9uIGFuZCB0eXBlIGFuYWx5c2lzLgogICBmaW5hbCBSZXNvbHZlclZpc2l0b3IgX3Jlc29sdmVyOwogCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXNvbHZlIHR5cGVzLgotICAgKi8KKyAgLy8vIFRoZSBmZWF0dXJlIHNldCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlc29sdmUgdHlwZXMuCiAgIGZpbmFsIEZlYXR1cmVTZXQgX2ZlYXR1cmVTZXQ7CiAKICAgZmluYWwgTWlncmF0aW9uUmVzb2x1dGlvbkhvb2tzIF9taWdyYXRpb25SZXNvbHV0aW9uSG9va3M7CiAKLSAgLyoqCi0gICAqIFRoZSBvYmplY3QgcHJvdmlkaW5nIGFjY2VzcyB0byB0aGUgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCi0gICAqLworICAvLy8gVGhlIG9iamVjdCBwcm92aWRpbmcgYWNjZXNzIHRvIHRoZSB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBsYW5ndWFnZS4KICAgVHlwZVByb3ZpZGVySW1wbCBfdHlwZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgdHlwZSBzeXN0ZW0gaW4gdXNlIGZvciBzdGF0aWMgdHlwZSBhbmFseXNpcy4KLSAgICovCisgIC8vLyBUaGUgdHlwZSBzeXN0ZW0gaW4gdXNlIGZvciBzdGF0aWMgdHlwZSBhbmFseXNpcy4KICAgVHlwZVN5c3RlbUltcGwgX3R5cGVTeXN0ZW07CiAKLSAgLyoqCi0gICAqIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgdHlwZSAnZHluYW1pYycuCi0gICAqLworICAvLy8gVGhlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlICdkeW5hbWljJy4KICAgRGFydFR5cGUgX2R5bmFtaWNUeXBlOwogCi0gIC8qKgotICAgKiBUcnVlIGlmIGluZmVyZW5jZSBmYWlsdXJlcyBzaG91bGQgYmUgcmVwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAgICovCisgIC8vLyBUcnVlIGlmIGluZmVyZW5jZSBmYWlsdXJlcyBzaG91bGQgYmUgcmVwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KICAgYm9vbCBfc3RyaWN0SW5mZXJlbmNlOwogCi0gIC8qKgotICAgKiBUaGUgb2JqZWN0IHByb3ZpZGluZyBwcm9tb3RlZCBvciBkZWNsYXJlZCB0eXBlcyBvZiB2YXJpYWJsZXMuCi0gICAqLworICAvLy8gVGhlIG9iamVjdCBwcm92aWRpbmcgcHJvbW90ZWQgb3IgZGVjbGFyZWQgdHlwZXMgb2YgdmFyaWFibGVzLgogICBMb2NhbFZhcmlhYmxlVHlwZVByb3ZpZGVyIF9sb2NhbFZhcmlhYmxlVHlwZVByb3ZpZGVyOwogCiAgIGZpbmFsIEZsb3dBbmFseXNpc0hlbHBlciBfZmxvd0FuYWx5c2lzOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzdGF0aWMgdHlwZSBhbmFseXplciB0byBhbmFseXplIHR5cGVzIGZvciB0aGUKLSAgICogW19yZXNvbHZlcl0gYmFzZWQgb24gdGhlCi0gICAqCi0gICAqIEBwYXJhbSByZXNvbHZlciB0aGUgcmVzb2x2ZXIgZHJpdmluZyB0aGlzIHBhcnRpY2lwYW50Ci0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc3RhdGljIHR5cGUgYW5hbHl6ZXIgdG8gYW5hbHl6ZSB0eXBlcyBmb3IgdGhlCisgIC8vLyBbX3Jlc29sdmVyXSBiYXNlZCBvbiB0aGUKKyAgLy8vCisgIC8vLyBAcGFyYW0gcmVzb2x2ZXIgdGhlIHJlc29sdmVyIGRyaXZpbmcgdGhpcyBwYXJ0aWNpcGFudAogICBTdGF0aWNUeXBlQW5hbHl6ZXIodGhpcy5fcmVzb2x2ZXIsIHRoaXMuX2ZlYXR1cmVTZXQsIHRoaXMuX2Zsb3dBbmFseXNpcywKICAgICAgIHRoaXMuX21pZ3JhdGlvblJlc29sdXRpb25Ib29rcykgewogICAgIF90eXBlUHJvdmlkZXIgPSBfcmVzb2x2ZXIudHlwZVByb3ZpZGVyOwpAQCAtOTMsMTQgKzc2LDEyIEBACiAgIGJvb2wgZ2V0IF9pc05vbk51bGxhYmxlQnlEZWZhdWx0ID0+CiAgICAgICBfZmVhdHVyZVNldC5pc0VuYWJsZWQoRmVhdHVyZS5ub25fbnVsbGFibGUpOwogCi0gIC8qKgotICAgKiBHaXZlbiBhIGNvbnN0cnVjdG9yIGZvciBhIGdlbmVyaWMgdHlwZSwgcmV0dXJucyB0aGUgZXF1aXZhbGVudCBnZW5lcmljCi0gICAqIGZ1bmN0aW9uIHR5cGUgdGhhdCB3ZSBjb3VsZCB1c2UgdG8gZm9yd2FyZCB0byB0aGUgY29uc3RydWN0b3IsIG9yIGZvciBhCi0gICAqIG5vbi1nZW5lcmljIHR5cGUgc2ltcGx5IHJldHVybnMgdGhlIGNvbnN0cnVjdG9yIHR5cGUuCi0gICAqCi0gICAqIEZvciBleGFtcGxlIGdpdmVuIHRoZSB0eXBlIGBjbGFzcyBDPFQ+IHsgQyhUIGFyZyk7IH1gLCB0aGUgZ2VuZXJpYyBmdW5jdGlvbgotICAgKiB0eXBlIGlzIGA8VD4oVCkgLT4gQzxUPmAuCi0gICAqLworICAvLy8gR2l2ZW4gYSBjb25zdHJ1Y3RvciBmb3IgYSBnZW5lcmljIHR5cGUsIHJldHVybnMgdGhlIGVxdWl2YWxlbnQgZ2VuZXJpYworICAvLy8gZnVuY3Rpb24gdHlwZSB0aGF0IHdlIGNvdWxkIHVzZSB0byBmb3J3YXJkIHRvIHRoZSBjb25zdHJ1Y3Rvciwgb3IgZm9yIGEKKyAgLy8vIG5vbi1nZW5lcmljIHR5cGUgc2ltcGx5IHJldHVybnMgdGhlIGNvbnN0cnVjdG9yIHR5cGUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUgZ2l2ZW4gdGhlIHR5cGUgYGNsYXNzIEM8VD4geyBDKFQgYXJnKTsgfWAsIHRoZSBnZW5lcmljIGZ1bmN0aW9uCisgIC8vLyB0eXBlIGlzIGA8VD4oVCkgLT4gQzxUPmAuCiAgIEZ1bmN0aW9uVHlwZSBjb25zdHJ1Y3RvclRvR2VuZXJpY0Z1bmN0aW9uVHlwZSgKICAgICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zdHJ1Y3RvcikgewogICAgIHZhciBjbGFzc0VsZW1lbnQgPSBjb25zdHJ1Y3Rvci5lbmNsb3NpbmdFbGVtZW50OwpAQCAtMTE3LDEyICs5OCwxMCBAQAogICAgICk7CiAgIH0KIAotICAvKioKLSAgICogUmVjb3JkIHRoYXQgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBub2RlIGlzIHRoZSBnaXZlbiB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbm9kZSB3aG9zZSB0eXBlIGlzIHRvIGJlIHJlY29yZGVkCi0gICAqIEBwYXJhbSB0eXBlIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgbm9kZQotICAgKi8KKyAgLy8vIFJlY29yZCB0aGF0IHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgZ2l2ZW4gbm9kZSBpcyB0aGUgZ2l2ZW4gdHlwZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgbm9kZSB3aG9zZSB0eXBlIGlzIHRvIGJlIHJlY29yZGVkCisgIC8vLyBAcGFyYW0gdHlwZSB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIG5vZGUKICAgdm9pZCByZWNvcmRTdGF0aWNUeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgRGFydFR5cGUgdHlwZSkgewogICAgIGlmIChfbWlncmF0aW9uUmVzb2x1dGlvbkhvb2tzICE9IG51bGwpIHsKICAgICAgIHR5cGUgPSBfbWlncmF0aW9uUmVzb2x1dGlvbkhvb2tzLm1vZGlmeUV4cHJlc3Npb25UeXBlKApAQCAtMTM5LDM0ICsxMTgsMjggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuNTogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgc3RyaW5nIGxpdGVyYWwgaXMKLSAgICogYFN0cmluZ2AuPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjU6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIHN0cmluZyBsaXRlcmFsIGlzCisgIC8vLyBgU3RyaW5nYC48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0QWRqYWNlbnRTdHJpbmdzKEFkamFjZW50U3RyaW5ncyBub2RlKSB7CiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBfbm9uTnVsbGFibGUoX3R5cGVQcm92aWRlci5zdHJpbmdUeXBlKSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMzI6IDxibG9ja3F1b3RlPi4uLiB0aGUgY2FzdCBleHByZXNzaW9uIDxpPmUgYXMgVDwvaT4gLi4uCi0gICAqCi0gICAqIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgPGk+VDwvaT4gZG9lcyBub3QgZGVub3RlIGEgdHlwZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbAotICAgKiBzY29wZS4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIGEgY2FzdCBleHByZXNzaW9uIDxpPmUgYXMgVDwvaT4gaXMgPGk+VDwvaT4uPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjMyOiA8YmxvY2txdW90ZT4uLi4gdGhlIGNhc3QgZXhwcmVzc2lvbiA8aT5lIGFzIFQ8L2k+IC4uLgorICAvLy8KKyAgLy8vIEl0IGlzIGEgc3RhdGljIHdhcm5pbmcgaWYgPGk+VDwvaT4gZG9lcyBub3QgZGVub3RlIGEgdHlwZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbAorICAvLy8gc2NvcGUuCisgIC8vLworICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIGEgY2FzdCBleHByZXNzaW9uIDxpPmUgYXMgVDwvaT4gaXMgPGk+VDwvaT4uPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdEFzRXhwcmVzc2lvbihBc0V4cHJlc3Npb24gbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX2dldFR5cGUobm9kZS50eXBlKSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTYuMjkgKEF3YWl0IEV4cHJlc3Npb25zKToKLSAgICoKLSAgICogICBUaGUgc3RhdGljIHR5cGUgb2YgW3RoZSBleHByZXNzaW9uICJhd2FpdCBlIl0gaXMgZmxhdHRlbihUKSB3aGVyZSBUIGlzCi0gICAqICAgdGhlIHN0YXRpYyB0eXBlIG9mIGUuCi0gICAqLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTYuMjkgKEF3YWl0IEV4cHJlc3Npb25zKToKKyAgLy8vCisgIC8vLyAgIFRoZSBzdGF0aWMgdHlwZSBvZiBbdGhlIGV4cHJlc3Npb24gImF3YWl0IGUiXSBpcyBmbGF0dGVuKFQpIHdoZXJlIFQgaXMKKyAgLy8vICAgdGhlIHN0YXRpYyB0eXBlIG9mIGUuCiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgRGFydFR5cGUgcmVzdWx0VHlwZSA9IF9nZXRTdGF0aWNUeXBlKG5vZGUuZXhwcmVzc2lvbik7CkBAIC0xNzQsNDMgKzE0NywzNSBAQAogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgcmVzdWx0VHlwZSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuNDogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgYm9vbGVhbiBsaXRlcmFsIGlzCi0gICAqIGJvb2wuPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjQ6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIGJvb2xlYW4gbGl0ZXJhbCBpcworICAvLy8gYm9vbC48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0Qm9vbGVhbkxpdGVyYWwoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX25vbk51bGxhYmxlKF90eXBlUHJvdmlkZXIuYm9vbFR5cGUpKTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xNS4yOiA8YmxvY2txdW90ZT5BIGNhc2NhZGVkIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24KLSAgICogb2YgdGhlIGZvcm0gPGk+ZS4uc3VmZml4PC9pPiBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIDxpPih0KSB7dC5zdWZmaXg7IHJldHVybgotICAgKiB0O30oZSk8L2k+LjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xNS4yOiA8YmxvY2txdW90ZT5BIGNhc2NhZGVkIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24KKyAgLy8vIG9mIHRoZSBmb3JtIDxpPmUuLnN1ZmZpeDwvaT4gaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiA8aT4odCkge3Quc3VmZml4OyByZXR1cm4KKyAgLy8vIHQ7fShlKTwvaT4uPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdENhc2NhZGVFeHByZXNzaW9uKENhc2NhZGVFeHByZXNzaW9uIG5vZGUpIHsKICAgICByZWNvcmRTdGF0aWNUeXBlKG5vZGUsIF9nZXRTdGF0aWNUeXBlKG5vZGUudGFyZ2V0KSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMTk6IDxibG9ja3F1b3RlPiAuLi4gYSBjb25kaXRpb25hbCBleHByZXNzaW9uIDxpPmM8L2k+IG9mCi0gICAqIHRoZSBmb3JtIDxpPmU8c3ViPjE8L3N1Yj4gPyBlPHN1Yj4yPC9zdWI+IDogZTxzdWI+Mzwvc3ViPjwvaT4gLi4uCi0gICAqCi0gICAqIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgdHlwZSBvZiBlPHN1Yj4xPC9zdWI+IG1heSBub3QgYmUgYXNzaWduZWQgdG8gYGJvb2xgLgotICAgKgotICAgKiBUaGUgc3RhdGljIHR5cGUgb2YgPGk+YzwvaT4gaXMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIHRoZSBzdGF0aWMgdHlwZSBvZiA8aT5lPHN1Yj4yPC9zdWI+PC9pPgotICAgKiBhbmQgdGhlIHN0YXRpYyB0eXBlIG9mIDxpPmU8c3ViPjM8L3N1Yj48L2k+LjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xOTogPGJsb2NrcXVvdGU+IC4uLiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gPGk+YzwvaT4gb2YKKyAgLy8vIHRoZSBmb3JtIDxpPmU8c3ViPjE8L3N1Yj4gPyBlPHN1Yj4yPC9zdWI+IDogZTxzdWI+Mzwvc3ViPjwvaT4gLi4uCisgIC8vLworICAvLy8gSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmIHRoZSB0eXBlIG9mIGU8c3ViPjE8L3N1Yj4gbWF5IG5vdCBiZSBhc3NpZ25lZCB0byBgYm9vbGAuCisgIC8vLworICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIDxpPmM8L2k+IGlzIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgc3RhdGljIHR5cGUgb2YgPGk+ZTxzdWI+Mjwvc3ViPjwvaT4KKyAgLy8vIGFuZCB0aGUgc3RhdGljIHR5cGUgb2YgPGk+ZTxzdWI+Mzwvc3ViPjwvaT4uPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdENvbmRpdGlvbmFsRXhwcmVzc2lvbihDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewogICAgIF9hbmFseXplTGVhc3RVcHBlckJvdW5kKG5vZGUsIG5vZGUudGhlbkV4cHJlc3Npb24sIG5vZGUuZWxzZUV4cHJlc3Npb24pOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjM6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIGxpdGVyYWwgZG91YmxlIGlzCi0gICAqIGRvdWJsZS48L2Jsb2NrcXVvdGU+Ci0gICAqLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMzogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgbGl0ZXJhbCBkb3VibGUgaXMKKyAgLy8vIGRvdWJsZS48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0RG91YmxlTGl0ZXJhbChEb3VibGVMaXRlcmFsIG5vZGUpIHsKICAgICByZWNvcmRTdGF0aWNUeXBlKG5vZGUsIF9ub25OdWxsYWJsZShfdHlwZVByb3ZpZGVyLmRvdWJsZVR5cGUpKTsKQEAgLTIyMSw0NCArMTg2LDQwIEBACiAgICAgX3Jlc29sdmVyLmV4dGVuc2lvblJlc29sdmVyLnJlc29sdmVPdmVycmlkZShub2RlKTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi45OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSBmdW5jdGlvbiBsaXRlcmFsIG9mIHRoZQotICAgKiBmb3JtIDxpPihUPHN1Yj4xPC9zdWI+IGE8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBUPHN1Yj5uPC9zdWI+IGE8c3ViPm48L3N1Yj4sIFtUPHN1Yj5uKzE8L3N1Yj4KLSAgICogeDxzdWI+bisxPC9zdWI+ID0gZDEsICZoZWxsaXA7LCBUPHN1Yj5uK2s8L3N1Yj4geDxzdWI+bitrPC9zdWI+ID0gZGtdKSA9PiBlPC9pPiBpcwotICAgKiA8aT4oVDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFRuLCBbVDxzdWI+bisxPC9zdWI+IHg8c3ViPm4rMTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm4razwvc3ViPgotICAgKiB4PHN1Yj5uK2s8L3N1Yj5dKSAmcmFycjsgVDxzdWI+MDwvc3ViPjwvaT4sIHdoZXJlIDxpPlQ8c3ViPjA8L3N1Yj48L2k+IGlzIHRoZSBzdGF0aWMgdHlwZSBvZgotICAgKiA8aT5lPC9pPi4gSW4gYW55IGNhc2Ugd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMSAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotICAgKiBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgZHluYW1pYy4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSA8aT4oVDxzdWI+MTwvc3ViPiBhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywKLSAgICogVDxzdWI+bjwvc3ViPiBhPHN1Yj5uPC9zdWI+LCB7VDxzdWI+bisxPC9zdWI+IHg8c3ViPm4rMTwvc3ViPiA6IGQxLCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+Ci0gICAqIHg8c3ViPm4razwvc3ViPiA6IGRrfSkgPT4gZTwvaT4gaXMgPGk+KFQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBUPHN1Yj5uPC9zdWI+LCB7VDxzdWI+bisxPC9zdWI+Ci0gICAqIHg8c3ViPm4rMTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm4razwvc3ViPiB4PHN1Yj5uK2s8L3N1Yj59KSAmcmFycjsgVDxzdWI+MDwvc3ViPjwvaT4sIHdoZXJlCi0gICAqIDxpPlQ8c3ViPjA8L3N1Yj48L2k+IGlzIHRoZSBzdGF0aWMgdHlwZSBvZiA8aT5lPC9pPi4gSW4gYW55IGNhc2Ugd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMQotICAgKiAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgZHluYW1pYy4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSA8aT4oVDxzdWI+MTwvc3ViPiBhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywKLSAgICogVDxzdWI+bjwvc3ViPiBhPHN1Yj5uPC9zdWI+LCBbVDxzdWI+bisxPC9zdWI+IHg8c3ViPm4rMTwvc3ViPiA9IGQxLCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+Ci0gICAqIHg8c3ViPm4razwvc3ViPiA9IGRrXSkge3N9PC9pPiBpcyA8aT4oVDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm48L3N1Yj4sIFtUPHN1Yj5uKzE8L3N1Yj4KLSAgICogeDxzdWI+bisxPC9zdWI+LCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+IHg8c3ViPm4razwvc3ViPl0pICZyYXJyOyBkeW5hbWljPC9pPi4gSW4gYW55IGNhc2UKLSAgICogd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMSAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbgotICAgKiBzcGVjaWZpZWQgYXMgZHluYW1pYy4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSA8aT4oVDxzdWI+MTwvc3ViPiBhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywKLSAgICogVDxzdWI+bjwvc3ViPiBhPHN1Yj5uPC9zdWI+LCB7VDxzdWI+bisxPC9zdWI+IHg8c3ViPm4rMTwvc3ViPiA6IGQxLCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+Ci0gICAqIHg8c3ViPm4razwvc3ViPiA6IGRrfSkge3N9PC9pPiBpcyA8aT4oVDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm48L3N1Yj4sIHtUPHN1Yj5uKzE8L3N1Yj4KLSAgICogeDxzdWI+bisxPC9zdWI+LCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+IHg8c3ViPm4razwvc3ViPn0pICZyYXJyOyBkeW5hbWljPC9pPi4gSW4gYW55IGNhc2UKLSAgICogd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMSAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbgotICAgKiBzcGVjaWZpZWQgYXMgZHluYW1pYy48L2Jsb2NrcXVvdGU+Ci0gICAqLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuOTogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUKKyAgLy8vIGZvcm0gPGk+KFQ8c3ViPjE8L3N1Yj4gYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm48L3N1Yj4gYTxzdWI+bjwvc3ViPiwgW1Q8c3ViPm4rMTwvc3ViPgorICAvLy8geDxzdWI+bisxPC9zdWI+ID0gZDEsICZoZWxsaXA7LCBUPHN1Yj5uK2s8L3N1Yj4geDxzdWI+bitrPC9zdWI+ID0gZGtdKSA9PiBlPC9pPiBpcworICAvLy8gPGk+KFQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBUbiwgW1Q8c3ViPm4rMTwvc3ViPiB4PHN1Yj5uKzE8L3N1Yj4sICZoZWxsaXA7LCBUPHN1Yj5uK2s8L3N1Yj4KKyAgLy8vIHg8c3ViPm4razwvc3ViPl0pICZyYXJyOyBUPHN1Yj4wPC9zdWI+PC9pPiwgd2hlcmUgPGk+VDxzdWI+MDwvc3ViPjwvaT4gaXMgdGhlIHN0YXRpYyB0eXBlIG9mCisgIC8vLyA8aT5lPC9pPi4gSW4gYW55IGNhc2Ugd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMSAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcworICAvLy8gY29uc2lkZXJlZCB0byBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzIGR5bmFtaWMuCisgIC8vLworICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIGEgZnVuY3Rpb24gbGl0ZXJhbCBvZiB0aGUgZm9ybSA8aT4oVDxzdWI+MTwvc3ViPiBhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywKKyAgLy8vIFQ8c3ViPm48L3N1Yj4gYTxzdWI+bjwvc3ViPiwge1Q8c3ViPm4rMTwvc3ViPiB4PHN1Yj5uKzE8L3N1Yj4gOiBkMSwgJmhlbGxpcDssIFQ8c3ViPm4razwvc3ViPgorICAvLy8geDxzdWI+bitrPC9zdWI+IDogZGt9KSA9PiBlPC9pPiBpcyA8aT4oVDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm48L3N1Yj4sIHtUPHN1Yj5uKzE8L3N1Yj4KKyAgLy8vIHg8c3ViPm4rMTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm4razwvc3ViPiB4PHN1Yj5uK2s8L3N1Yj59KSAmcmFycjsgVDxzdWI+MDwvc3ViPjwvaT4sIHdoZXJlCisgIC8vLyA8aT5UPHN1Yj4wPC9zdWI+PC9pPiBpcyB0aGUgc3RhdGljIHR5cGUgb2YgPGk+ZTwvaT4uIEluIGFueSBjYXNlIHdoZXJlIDxpPlQ8c3ViPmk8L3N1Yj4sIDEKKyAgLy8vICZsdDs9IGkgJmx0Oz0gbjwvaT4sIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIHNwZWNpZmllZCBhcyBkeW5hbWljLgorICAvLy8KKyAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiBhIGZ1bmN0aW9uIGxpdGVyYWwgb2YgdGhlIGZvcm0gPGk+KFQ8c3ViPjE8L3N1Yj4gYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssCisgIC8vLyBUPHN1Yj5uPC9zdWI+IGE8c3ViPm48L3N1Yj4sIFtUPHN1Yj5uKzE8L3N1Yj4geDxzdWI+bisxPC9zdWI+ID0gZDEsICZoZWxsaXA7LCBUPHN1Yj5uK2s8L3N1Yj4KKyAgLy8vIHg8c3ViPm4razwvc3ViPiA9IGRrXSkge3N9PC9pPiBpcyA8aT4oVDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm48L3N1Yj4sIFtUPHN1Yj5uKzE8L3N1Yj4KKyAgLy8vIHg8c3ViPm4rMTwvc3ViPiwgJmhlbGxpcDssIFQ8c3ViPm4razwvc3ViPiB4PHN1Yj5uK2s8L3N1Yj5dKSAmcmFycjsgZHluYW1pYzwvaT4uIEluIGFueSBjYXNlCisgIC8vLyB3aGVyZSA8aT5UPHN1Yj5pPC9zdWI+LCAxICZsdDs9IGkgJmx0Oz0gbjwvaT4sIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuCisgIC8vLyBzcGVjaWZpZWQgYXMgZHluYW1pYy4KKyAgLy8vCisgIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgYSBmdW5jdGlvbiBsaXRlcmFsIG9mIHRoZSBmb3JtIDxpPihUPHN1Yj4xPC9zdWI+IGE8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LAorICAvLy8gVDxzdWI+bjwvc3ViPiBhPHN1Yj5uPC9zdWI+LCB7VDxzdWI+bisxPC9zdWI+IHg8c3ViPm4rMTwvc3ViPiA6IGQxLCAmaGVsbGlwOywgVDxzdWI+bitrPC9zdWI+CisgIC8vLyB4PHN1Yj5uK2s8L3N1Yj4gOiBka30pIHtzfTwvaT4gaXMgPGk+KFQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBUPHN1Yj5uPC9zdWI+LCB7VDxzdWI+bisxPC9zdWI+CisgIC8vLyB4PHN1Yj5uKzE8L3N1Yj4sICZoZWxsaXA7LCBUPHN1Yj5uK2s8L3N1Yj4geDxzdWI+bitrPC9zdWI+fSkgJnJhcnI7IGR5bmFtaWM8L2k+LiBJbiBhbnkgY2FzZQorICAvLy8gd2hlcmUgPGk+VDxzdWI+aTwvc3ViPiwgMSAmbHQ7PSBpICZsdDs9IG48L2k+LCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgYmVlbgorICAvLy8gc3BlY2lmaWVkIGFzIGR5bmFtaWMuPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdEZ1bmN0aW9uRXhwcmVzc2lvbihGdW5jdGlvbkV4cHJlc3Npb24gbm9kZSkge30KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMjk6IDxibG9ja3F1b3RlPkFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybQotICAgKiA8aT5lPHN1Yj4xPC9zdWI+W2U8c3ViPjI8L3N1Yj5dPC9pPiBpcyBldmFsdWF0ZWQgYXMgYSBtZXRob2QgaW52b2NhdGlvbiBvZiB0aGUgb3BlcmF0b3IgbWV0aG9kCi0gICAqIDxpPltdPC9pPiBvbiA8aT5lPHN1Yj4xPC9zdWI+PC9pPiB3aXRoIGFyZ3VtZW50IDxpPmU8c3ViPjI8L3N1Yj48L2k+LjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4yOTogPGJsb2NrcXVvdGU+QW4gYXNzaWduYWJsZSBleHByZXNzaW9uIG9mIHRoZSBmb3JtCisgIC8vLyA8aT5lPHN1Yj4xPC9zdWI+W2U8c3ViPjI8L3N1Yj5dPC9pPiBpcyBldmFsdWF0ZWQgYXMgYSBtZXRob2QgaW52b2NhdGlvbiBvZiB0aGUgb3BlcmF0b3IgbWV0aG9kCisgIC8vLyA8aT5bXTwvaT4gb24gPGk+ZTxzdWI+MTwvc3ViPjwvaT4gd2l0aCBhcmd1bWVudCA8aT5lPHN1Yj4yPC9zdWI+PC9pPi48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0SW5kZXhFeHByZXNzaW9uKEluZGV4RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgaWYgKGlkZW50aWNhbChub2RlLnJlYWxUYXJnZXQuc3RhdGljVHlwZSwgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKQEAgLTI4MiwzOCArMjQzLDM0IEBACiAgICAgX3Jlc29sdmVyLm51bGxTaG9ydGluZ1Rlcm1pbmF0aW9uKG5vZGUpOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjExLjE6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIG5ldyBleHByZXNzaW9uIG9mCi0gICAqIGVpdGhlciB0aGUgZm9ybSA8aT5uZXcgVC5pZChhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywgYTxzdWI+bjwvc3ViPik8L2k+IG9yIHRoZSBmb3JtIDxpPm5ldwotICAgKiBUKGE8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBhPHN1Yj5uPC9zdWI+KTwvaT4gaXMgPGk+VDwvaT4uPC9ibG9ja3F1b3RlPgotICAgKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xMS4yOiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSBjb25zdGFudCBvYmplY3QKLSAgICogZXhwcmVzc2lvbiBvZiBlaXRoZXIgdGhlIGZvcm0gPGk+Y29uc3QgVC5pZChhPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywgYTxzdWI+bjwvc3ViPik8L2k+IG9yIHRoZQotICAgKiBmb3JtIDxpPmNvbnN0IFQoYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIGE8c3ViPm48L3N1Yj4pPC9pPiBpcyA8aT5UPC9pPi4gPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjExLjE6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIG5ldyBleHByZXNzaW9uIG9mCisgIC8vLyBlaXRoZXIgdGhlIGZvcm0gPGk+bmV3IFQuaWQoYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIGE8c3ViPm48L3N1Yj4pPC9pPiBvciB0aGUgZm9ybSA8aT5uZXcKKyAgLy8vIFQoYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIGE8c3ViPm48L3N1Yj4pPC9pPiBpcyA8aT5UPC9pPi48L2Jsb2NrcXVvdGU+CisgIC8vLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMTEuMjogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgY29uc3RhbnQgb2JqZWN0CisgIC8vLyBleHByZXNzaW9uIG9mIGVpdGhlciB0aGUgZm9ybSA8aT5jb25zdCBULmlkKGE8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBhPHN1Yj5uPC9zdWI+KTwvaT4gb3IgdGhlCisgIC8vLyBmb3JtIDxpPmNvbnN0IFQoYTxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIGE8c3ViPm48L3N1Yj4pPC9pPiBpcyA8aT5UPC9pPi4gPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdEluc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKEluc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKICAgICBfaW5mZXJJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbihub2RlKTsKICAgICByZWNvcmRTdGF0aWNUeXBlKG5vZGUsIG5vZGUuY29uc3RydWN0b3JOYW1lLnR5cGUudHlwZSk7CiAgIH0KIAotICAvKioKLSAgICogPGJsb2NrcXVvdGU+Ci0gICAqIEFuIGludGVnZXIgbGl0ZXJhbCBoYXMgc3RhdGljIHR5cGUgXGNvZGV7aW50fSwgdW5sZXNzIHRoZSBzdXJyb3VuZGluZwotICAgKiBzdGF0aWMgY29udGV4dCB0eXBlIGlzIGEgdHlwZSB3aGljaCBcY29kZXtpbnR9IGlzIG5vdCBhc3NpZ25hYmxlIHRvLCBhbmQKLSAgICogXGNvZGV7ZG91YmxlfSBpcy4gSW4gdGhhdCBjYXNlIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgaW50ZWdlciBsaXRlcmFsIGlzCi0gICAqIFxjb2Rle2RvdWJsZX0uCi0gICAqIDxibG9ja3F1b3RlPgotICAgKgotICAgKiBhbmQKLSAgICoKLSAgICogPGJsb2NrcXVvdGU+Ci0gICAqIElmICRlJCBpcyBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIFxjb2Rley0kbCR9IHdoZXJlICRsJCBpcyBhbiBpbnRlZ2VyCi0gICAqIGxpdGVyYWwgKFxyZWZ7bnVtYmVyc30pIHdpdGggbnVtZXJpYyBpbnRlZ2VyIHZhbHVlICRpJCwgdGhlbiB0aGUgc3RhdGljCi0gICAqIHR5cGUgb2YgJGUkIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpbnRlZ2VyIGxpdGVyYWwgd2l0aCB0aGUKLSAgICogc2FtZSBjb250ZXh0dHlwZQotICAgKiA8L2Jsb2NrcXVvdGU+Ci0gICAqLworICAvLy8gPGJsb2NrcXVvdGU+CisgIC8vLyBBbiBpbnRlZ2VyIGxpdGVyYWwgaGFzIHN0YXRpYyB0eXBlIFxjb2Rle2ludH0sIHVubGVzcyB0aGUgc3Vycm91bmRpbmcKKyAgLy8vIHN0YXRpYyBjb250ZXh0IHR5cGUgaXMgYSB0eXBlIHdoaWNoIFxjb2Rle2ludH0gaXMgbm90IGFzc2lnbmFibGUgdG8sIGFuZAorICAvLy8gXGNvZGV7ZG91YmxlfSBpcy4gSW4gdGhhdCBjYXNlIHRoZSBzdGF0aWMgdHlwZSBvZiB0aGUgaW50ZWdlciBsaXRlcmFsIGlzCisgIC8vLyBcY29kZXtkb3VibGV9LgorICAvLy8gPGJsb2NrcXVvdGU+CisgIC8vLworICAvLy8gYW5kCisgIC8vLworICAvLy8gPGJsb2NrcXVvdGU+CisgIC8vLyBJZiAkZSQgaXMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBcY29kZXstJGwkfSB3aGVyZSAkbCQgaXMgYW4gaW50ZWdlcgorICAvLy8gbGl0ZXJhbCAoXHJlZntudW1iZXJzfSkgd2l0aCBudW1lcmljIGludGVnZXIgdmFsdWUgJGkkLCB0aGVuIHRoZSBzdGF0aWMKKyAgLy8vIHR5cGUgb2YgJGUkIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpbnRlZ2VyIGxpdGVyYWwgd2l0aCB0aGUKKyAgLy8vIHNhbWUgY29udGV4dHR5cGUKKyAgLy8vIDwvYmxvY2txdW90ZT4KICAgQG92ZXJyaWRlCiAgIHZvaWQgdmlzaXRJbnRlZ2VyTGl0ZXJhbChJbnRlZ2VyTGl0ZXJhbCBub2RlKSB7CiAgICAgLy8gQ2hlY2sgdGhlIHBhcmVudCBjb250ZXh0IGZvciBuZWdhdGVkIGludGVnZXIgbGl0ZXJhbHMuCkBAIC0zMjgsMTIgKzI4NSwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4zMTogPGJsb2NrcXVvdGU+SXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiA8aT5UPC9pPiBkb2VzIG5vdAotICAgKiBkZW5vdGUgYSB0eXBlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlLgotICAgKgotICAgKiBUaGUgc3RhdGljIHR5cGUgb2YgYW4gaXMtZXhwcmVzc2lvbiBpcyBgYm9vbGAuPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjMxOiA8YmxvY2txdW90ZT5JdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIDxpPlQ8L2k+IGRvZXMgbm90CisgIC8vLyBkZW5vdGUgYSB0eXBlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlLgorICAvLy8KKyAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiBhbiBpcy1leHByZXNzaW9uIGlzIGBib29sYC48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0SXNFeHByZXNzaW9uKElzRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBfbm9uTnVsbGFibGUoX3R5cGVQcm92aWRlci5ib29sVHlwZSkpOwpAQCAtMzUwLDEwICszMDUsOCBAQAogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX2dldFN0YXRpY1R5cGUoZXhwcmVzc2lvbikpOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjI6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBgbnVsbGAgaXMgYm90dG9tLgotICAgKiA8L2Jsb2NrcXVvdGU+Ci0gICAqLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMjogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGBudWxsYCBpcyBib3R0b20uCisgIC8vLyA8L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0TnVsbExpdGVyYWwoTnVsbExpdGVyYWwgbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX3R5cGVQcm92aWRlci5udWxsVHlwZSk7CkBAIC0zNjUsOSArMzE4LDcgQEAKICAgICByZWNvcmRTdGF0aWNUeXBlKG5vZGUsIF9nZXRTdGF0aWNUeXBlKGV4cHJlc3Npb24pKTsKICAgfQogCi0gIC8qKgotICAgKiBTZWUgW3Zpc2l0U2ltcGxlSWRlbnRpZmllcl0uCi0gICAqLworICAvLy8gU2VlIFt2aXNpdFNpbXBsZUlkZW50aWZpZXJdLgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdFByZWZpeGVkSWRlbnRpZmllcihQcmVmaXhlZElkZW50aWZpZXIgbm9kZSkgewogICAgIFNpbXBsZUlkZW50aWZpZXIgcHJlZml4ZWRJZGVudGlmaWVyID0gbm9kZS5pZGVudGlmaWVyOwpAQCAtNDIzLDQ3ICszNzQsNDUgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMTM6IDxibG9ja3F1b3RlPiBQcm9wZXJ0eSBleHRyYWN0aW9uIGFsbG93cyBmb3IgYSBtZW1iZXIgb2YKLSAgICogYW4gb2JqZWN0IHRvIGJlIGNvbmNpc2VseSBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0LiBJZiA8aT5vPC9pPiBpcyBhbiBvYmplY3QsIGFuZCBpZiA8aT5tPC9pPgotICAgKiBpcyB0aGUgbmFtZSBvZiBhIG1ldGhvZCBtZW1iZXIgb2YgPGk+bzwvaT4sIHRoZW4KLSAgICogKiA8aT5vLm08L2k+IGlzIGRlZmluZWQgdG8gYmUgZXF1aXZhbGVudCB0bzogPGk+KHI8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCByPHN1Yj5uPC9zdWI+LAotICAgKiB7cDxzdWI+MTwvc3ViPiA6IGQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBwPHN1Yj5rPC9zdWI+IDogZDxzdWI+azwvc3ViPn0pe3JldHVybgotICAgKiBvLm0ocjxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIHI8c3ViPm48L3N1Yj4sIHA8c3ViPjE8L3N1Yj46IHA8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LAotICAgKiBwPHN1Yj5rPC9zdWI+OiBwPHN1Yj5rPC9zdWI+KTt9PC9pPiBpZiA8aT5tPC9pPiBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycyA8aT5yPHN1Yj4xPC9zdWI+LAotICAgKiAmaGVsbGlwOywgcjxzdWI+bjwvc3ViPjwvaT4sIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIDxpPnA8c3ViPjE8L3N1Yj4gJmhlbGxpcDsgcDxzdWI+azwvc3ViPjwvaT4KLSAgICogd2l0aCBkZWZhdWx0cyA8aT5kPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywgZDxzdWI+azwvc3ViPjwvaT4uCi0gICAqICogPGk+KHI8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCByPHN1Yj5uPC9zdWI+LCBbcDxzdWI+MTwvc3ViPiA9IGQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LAotICAgKiBwPHN1Yj5rPC9zdWI+ID0gZDxzdWI+azwvc3ViPl0pe3JldHVybiBvLm0ocjxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIHI8c3ViPm48L3N1Yj4sCi0gICAqIHA8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBwPHN1Yj5rPC9zdWI+KTt9PC9pPiBpZiA8aT5tPC9pPiBoYXMgcmVxdWlyZWQgcGFyYW1ldGVycwotICAgKiA8aT5yPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywgcjxzdWI+bjwvc3ViPjwvaT4sIGFuZCBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKLSAgICogPGk+cDxzdWI+MTwvc3ViPiAmaGVsbGlwOyBwPHN1Yj5rPC9zdWI+PC9pPiB3aXRoIGRlZmF1bHRzIDxpPmQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LAotICAgKiBkPHN1Yj5rPC9zdWI+PC9pPi4KLSAgICogT3RoZXJ3aXNlLCBpZiA8aT5tPC9pPiBpcyB0aGUgbmFtZSBvZiBhIGdldHRlciBtZW1iZXIgb2YgPGk+bzwvaT4gKGRlY2xhcmVkIGltcGxpY2l0bHkgb3IKLSAgICogZXhwbGljaXRseSkgdGhlbiA8aT5vLm08L2k+IGV2YWx1YXRlcyB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnZXR0ZXIuIDwvYmxvY2txdW90ZT4KLSAgICoKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMTc6IDxibG9ja3F1b3RlPiAuLi4gYSBnZXR0ZXIgaW52b2NhdGlvbiA8aT5pPC9pPiBvZiB0aGUKLSAgICogZm9ybSA8aT5lLm08L2k+IC4uLgotICAgKgotICAgKiBMZXQgPGk+VDwvaT4gYmUgdGhlIHN0YXRpYyB0eXBlIG9mIDxpPmU8L2k+LiBJdCBpcyBhIHN0YXRpYyB0eXBlIHdhcm5pbmcgaWYgPGk+VDwvaT4gZG9lcyBub3QKLSAgICogaGF2ZSBhIGdldHRlciBuYW1lZCA8aT5tPC9pPi4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIDxpPmk8L2k+IGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiA8aT5ULm08L2k+LCBpZiA8aT5ULm08L2k+IGV4aXN0czsKLSAgICogb3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiA8aT5pPC9pPiBpcyBkeW5hbWljLgotICAgKgotICAgKiAuLi4gYSBnZXR0ZXIgaW52b2NhdGlvbiA8aT5pPC9pPiBvZiB0aGUgZm9ybSA8aT5DLm08L2k+IC4uLgotICAgKgotICAgKiBJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIGlmIHRoZXJlIGlzIG5vIGNsYXNzIDxpPkM8L2k+IGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZSBvZgotICAgKiA8aT5pPC9pPiwgb3IgaWYgPGk+QzwvaT4gZG9lcyBub3QgZGVjbGFyZSwgaW1wbGljaXRseSBvciBleHBsaWNpdGx5LCBhIGdldHRlciBuYW1lZCA8aT5tPC9pPi4KLSAgICoKLSAgICogVGhlIHN0YXRpYyB0eXBlIG9mIDxpPmk8L2k+IGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiA8aT5DLm08L2k+IGlmIGl0IGV4aXN0cyBvciBkeW5hbWljCi0gICAqIG90aGVyd2lzZS4KLSAgICoKLSAgICogLi4uIGEgdG9wLWxldmVsIGdldHRlciBpbnZvY2F0aW9uIDxpPmk8L2k+IG9mIHRoZSBmb3JtIDxpPm08L2k+LCB3aGVyZSA8aT5tPC9pPiBpcyBhbgotICAgKiBpZGVudGlmaWVyIC4uLgotICAgKgotICAgKiBUaGUgc3RhdGljIHR5cGUgb2YgPGk+aTwvaT4gaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mIDxpPm08L2k+LjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xMzogPGJsb2NrcXVvdGU+IFByb3BlcnR5IGV4dHJhY3Rpb24gYWxsb3dzIGZvciBhIG1lbWJlciBvZgorICAvLy8gYW4gb2JqZWN0IHRvIGJlIGNvbmNpc2VseSBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0LiBJZiA8aT5vPC9pPiBpcyBhbiBvYmplY3QsIGFuZCBpZiA8aT5tPC9pPgorICAvLy8gaXMgdGhlIG5hbWUgb2YgYSBtZXRob2QgbWVtYmVyIG9mIDxpPm88L2k+LCB0aGVuCisgIC8vLyAqIDxpPm8ubTwvaT4gaXMgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvOiA8aT4ocjxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIHI8c3ViPm48L3N1Yj4sCisgIC8vLyB7cDxzdWI+MTwvc3ViPiA6IGQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCBwPHN1Yj5rPC9zdWI+IDogZDxzdWI+azwvc3ViPn0pe3JldHVybgorICAvLy8gby5tKHI8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCByPHN1Yj5uPC9zdWI+LCBwPHN1Yj4xPC9zdWI+OiBwPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywKKyAgLy8vIHA8c3ViPms8L3N1Yj46IHA8c3ViPms8L3N1Yj4pO308L2k+IGlmIDxpPm08L2k+IGhhcyByZXF1aXJlZCBwYXJhbWV0ZXJzIDxpPnI8c3ViPjE8L3N1Yj4sCisgIC8vLyAmaGVsbGlwOywgcjxzdWI+bjwvc3ViPjwvaT4sIGFuZCBuYW1lZCBwYXJhbWV0ZXJzIDxpPnA8c3ViPjE8L3N1Yj4gJmhlbGxpcDsgcDxzdWI+azwvc3ViPjwvaT4KKyAgLy8vIHdpdGggZGVmYXVsdHMgPGk+ZDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIGQ8c3ViPms8L3N1Yj48L2k+LgorICAvLy8gKiA8aT4ocjxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIHI8c3ViPm48L3N1Yj4sIFtwPHN1Yj4xPC9zdWI+ID0gZDxzdWI+MTwvc3ViPiwgJmhlbGxpcDssCisgIC8vLyBwPHN1Yj5rPC9zdWI+ID0gZDxzdWI+azwvc3ViPl0pe3JldHVybiBvLm0ocjxzdWI+MTwvc3ViPiwgJmhlbGxpcDssIHI8c3ViPm48L3N1Yj4sCisgIC8vLyBwPHN1Yj4xPC9zdWI+LCAmaGVsbGlwOywgcDxzdWI+azwvc3ViPik7fTwvaT4gaWYgPGk+bTwvaT4gaGFzIHJlcXVpcmVkIHBhcmFtZXRlcnMKKyAgLy8vIDxpPnI8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LCByPHN1Yj5uPC9zdWI+PC9pPiwgYW5kIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycworICAvLy8gPGk+cDxzdWI+MTwvc3ViPiAmaGVsbGlwOyBwPHN1Yj5rPC9zdWI+PC9pPiB3aXRoIGRlZmF1bHRzIDxpPmQ8c3ViPjE8L3N1Yj4sICZoZWxsaXA7LAorICAvLy8gZDxzdWI+azwvc3ViPjwvaT4uCisgIC8vLyBPdGhlcndpc2UsIGlmIDxpPm08L2k+IGlzIHRoZSBuYW1lIG9mIGEgZ2V0dGVyIG1lbWJlciBvZiA8aT5vPC9pPiAoZGVjbGFyZWQgaW1wbGljaXRseSBvcgorICAvLy8gZXhwbGljaXRseSkgdGhlbiA8aT5vLm08L2k+IGV2YWx1YXRlcyB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnZXR0ZXIuIDwvYmxvY2txdW90ZT4KKyAgLy8vCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xNzogPGJsb2NrcXVvdGU+IC4uLiBhIGdldHRlciBpbnZvY2F0aW9uIDxpPmk8L2k+IG9mIHRoZQorICAvLy8gZm9ybSA8aT5lLm08L2k+IC4uLgorICAvLy8KKyAgLy8vIExldCA8aT5UPC9pPiBiZSB0aGUgc3RhdGljIHR5cGUgb2YgPGk+ZTwvaT4uIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiA8aT5UPC9pPiBkb2VzIG5vdAorICAvLy8gaGF2ZSBhIGdldHRlciBuYW1lZCA8aT5tPC9pPi4KKyAgLy8vCisgIC8vLyBUaGUgc3RhdGljIHR5cGUgb2YgPGk+aTwvaT4gaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mIDxpPlQubTwvaT4sIGlmIDxpPlQubTwvaT4gZXhpc3RzOworICAvLy8gb3RoZXJ3aXNlIHRoZSBzdGF0aWMgdHlwZSBvZiA8aT5pPC9pPiBpcyBkeW5hbWljLgorICAvLy8KKyAgLy8vIC4uLiBhIGdldHRlciBpbnZvY2F0aW9uIDxpPmk8L2k+IG9mIHRoZSBmb3JtIDxpPkMubTwvaT4gLi4uCisgIC8vLworICAvLy8gSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGVyZSBpcyBubyBjbGFzcyA8aT5DPC9pPiBpbiB0aGUgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUgb2YKKyAgLy8vIDxpPmk8L2k+LCBvciBpZiA8aT5DPC9pPiBkb2VzIG5vdCBkZWNsYXJlLCBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHksIGEgZ2V0dGVyIG5hbWVkIDxpPm08L2k+LgorICAvLy8KKyAgLy8vIFRoZSBzdGF0aWMgdHlwZSBvZiA8aT5pPC9pPiBpcyB0aGUgZGVjbGFyZWQgcmV0dXJuIHR5cGUgb2YgPGk+Qy5tPC9pPiBpZiBpdCBleGlzdHMgb3IgZHluYW1pYworICAvLy8gb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIC4uLiBhIHRvcC1sZXZlbCBnZXR0ZXIgaW52b2NhdGlvbiA8aT5pPC9pPiBvZiB0aGUgZm9ybSA8aT5tPC9pPiwgd2hlcmUgPGk+bTwvaT4gaXMgYW4KKyAgLy8vIGlkZW50aWZpZXIgLi4uCisgIC8vLworICAvLy8gVGhlIHN0YXRpYyB0eXBlIG9mIDxpPmk8L2k+IGlzIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSBvZiA8aT5tPC9pPi48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0UHJvcGVydHlBY2Nlc3MoUHJvcGVydHlBY2Nlc3Mgbm9kZSkgewogICAgIFNpbXBsZUlkZW50aWZpZXIgcHJvcGVydHlOYW1lID0gbm9kZS5wcm9wZXJ0eU5hbWU7CkBAIC00ODYsNTMgKzQzNSw0OSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi45OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSByZXRocm93IGV4cHJlc3Npb24gaXMKLSAgICogYm90dG9tLjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi45OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSByZXRocm93IGV4cHJlc3Npb24gaXMKKyAgLy8vIGJvdHRvbS48L2Jsb2NrcXVvdGU+CiAgIEBvdmVycmlkZQogICB2b2lkIHZpc2l0UmV0aHJvd0V4cHJlc3Npb24oUmV0aHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX3R5cGVQcm92aWRlci5ib3R0b21UeXBlKTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4zMDogPGJsb2NrcXVvdGU+RXZhbHVhdGlvbiBvZiBhbiBpZGVudGlmaWVyIGV4cHJlc3Npb24KLSAgICogPGk+ZTwvaT4gb2YgdGhlIGZvcm0gPGk+aWQ8L2k+IHByb2NlZWRzIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqIExldCA8aT5kPC9pPiBiZSB0aGUgaW5uZXJtb3N0IGRlY2xhcmF0aW9uIGluIHRoZSBlbmNsb3NpbmcgbGV4aWNhbCBzY29wZSB3aG9zZSBuYW1lIGlzCi0gICAqIDxpPmlkPC9pPi4gSWYgbm8gc3VjaCBkZWNsYXJhdGlvbiBleGlzdHMgaW4gdGhlIGxleGljYWwgc2NvcGUsIGxldCA8aT5kPC9pPiBiZSB0aGUgZGVjbGFyYXRpb24KLSAgICogb2YgdGhlIGluaGVyaXRlZCBtZW1iZXIgbmFtZWQgPGk+aWQ8L2k+IGlmIGl0IGV4aXN0cy4KLSAgICogKiBJZiA8aT5kPC9pPiBpcyBhIGNsYXNzIG9yIHR5cGUgYWxpYXMgPGk+VDwvaT4sIHRoZSB2YWx1ZSBvZiA8aT5lPC9pPiBpcyB0aGUgdW5pcXVlIGluc3RhbmNlCi0gICAqIG9mIGNsYXNzIGBUeXBlYCByZWlmeWluZyA8aT5UPC9pPi4KLSAgICogKiBJZiA8aT5kPC9pPiBpcyBhIHR5cGUgcGFyYW1ldGVyIDxpPlQ8L2k+LCB0aGVuIHRoZSB2YWx1ZSBvZiA8aT5lPC9pPiBpcyB0aGUgdmFsdWUgb2YgdGhlCi0gICAqIGFjdHVhbCB0eXBlIGFyZ3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gPGk+VDwvaT4gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yCi0gICAqIHRoYXQgY3JlYXRlZCB0aGUgY3VycmVudCBiaW5kaW5nIG9mIHRoaXMuIFdlIGFyZSBhc3N1cmVkIHRoYXQgdGhpcyBpcyB3ZWxsIGRlZmluZWQsIGJlY2F1c2UgaWYKLSAgICogd2Ugd2VyZSBpbiBhIHN0YXRpYyBtZW1iZXIgdGhlIHJlZmVyZW5jZSB0byA8aT5UPC9pPiB3b3VsZCBiZSBhIGNvbXBpbGUtdGltZSBlcnJvci4KLSAgICogKiBJZiA8aT5kPC9pPiBpcyBhIGxpYnJhcnkgdmFyaWFibGUgdGhlbjoKLSAgICogKiBJZiA8aT5kPC9pPiBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPnZhciB2ID0gZTxzdWI+aTwvc3ViPjs8L2k+LCA8aT5UIHYgPQotICAgKiBlPHN1Yj5pPC9zdWI+OzwvaT4sIDxpPmZpbmFsIHYgPSBlPHN1Yj5pPC9zdWI+OzwvaT4sIDxpPmZpbmFsIFQgdiA9IGU8c3ViPmk8L3N1Yj47PC9pPiwgYW5kIG5vCi0gICAqIHZhbHVlIGhhcyB5ZXQgYmVlbiBzdG9yZWQgaW50byA8aT52PC9pPiB0aGVuIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uIDxpPmU8c3ViPmk8L3N1Yj48L2k+IGlzCi0gICAqIGV2YWx1YXRlZC4gSWYsIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiA8aT5lPHN1Yj5pPC9zdWI+PC9pPiwgdGhlIGdldHRlciBmb3IgPGk+djwvaT4gaXMKLSAgICogcmVmZXJlbmNlZCwgYSBDeWNsaWNJbml0aWFsaXphdGlvbkVycm9yIGlzIHRocm93bi4gSWYgdGhlIGV2YWx1YXRpb24gc3VjY2VlZGVkIHlpZWxkaW5nIGFuCi0gICAqIG9iamVjdCA8aT5vPC9pPiwgbGV0IDxpPnIgPSBvPC9pPiwgb3RoZXJ3aXNlIGxldCA8aT5yID0gbnVsbDwvaT4uIEluIGFueSBjYXNlLCA8aT5yPC9pPiBpcwotICAgKiBzdG9yZWQgaW50byA8aT52PC9pPi4gVGhlIHZhbHVlIG9mIDxpPmU8L2k+IGlzIDxpPnI8L2k+LgotICAgKiAqIElmIDxpPmQ8L2k+IGlzIG9mIG9uZSBvZiB0aGUgZm9ybXMgPGk+Y29uc3QgdiA9IGU7PC9pPiBvciA8aT5jb25zdCBUIHYgPSBlOzwvaT4gdGhlIHJlc3VsdAotICAgKiBvZiB0aGUgZ2V0dGVyIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGlsZSB0aW1lIGNvbnN0YW50IDxpPmU8L2k+LiBPdGhlcndpc2UKLSAgICogKiA8aT5lPC9pPiBldmFsdWF0ZXMgdG8gdGhlIGN1cnJlbnQgYmluZGluZyBvZiA8aT5pZDwvaT4uCi0gICAqICogSWYgPGk+ZDwvaT4gaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBmb3JtYWwgcGFyYW1ldGVyIHRoZW4gPGk+ZTwvaT4gZXZhbHVhdGVzIHRvIHRoZSBjdXJyZW50Ci0gICAqIGJpbmRpbmcgb2YgPGk+aWQ8L2k+LgotICAgKiAqIElmIDxpPmQ8L2k+IGlzIGEgc3RhdGljIG1ldGhvZCwgdG9wIGxldmVsIGZ1bmN0aW9uIG9yIGxvY2FsIGZ1bmN0aW9uIHRoZW4gPGk+ZTwvaT4KLSAgICogZXZhbHVhdGVzIHRvIHRoZSBmdW5jdGlvbiBkZWZpbmVkIGJ5IDxpPmQ8L2k+LgotICAgKiAqIElmIDxpPmQ8L2k+IGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHN0YXRpYyB2YXJpYWJsZSBvciBzdGF0aWMgZ2V0dGVyIGRlY2xhcmVkIGluIGNsYXNzCi0gICAqIDxpPkM8L2k+LCB0aGVuIDxpPmU8L2k+IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGdldHRlciBpbnZvY2F0aW9uIDxpPkMuaWQ8L2k+LgotICAgKiAqIElmIDxpPmQ8L2k+IGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHRvcCBsZXZlbCBnZXR0ZXIsIHRoZW4gPGk+ZTwvaT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAgICogZ2V0dGVyIGludm9jYXRpb24gPGk+aWQ8L2k+LgotICAgKiAqIE90aGVyd2lzZSwgaWYgPGk+ZTwvaT4gb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLAotICAgKiBtZXRob2QsIGdldHRlciwgb3Igc2V0dGVyKSBvciB2YXJpYWJsZSBpbml0aWFsaXplciwgZXZhbHVhdGlvbiBvZiBlIGNhdXNlcyBhIE5vU3VjaE1ldGhvZEVycm9yCi0gICAqIHRvIGJlIHRocm93bi4KLSAgICogKiBPdGhlcndpc2UgPGk+ZTwvaT4gaXMgZXF1aXZhbGVudCB0byB0aGUgcHJvcGVydHkgZXh0cmFjdGlvbiA8aT50aGlzLmlkPC9pPi4KLSAgICogPC9ibG9ja3F1b3RlPgotICAgKi8KKyAgLy8vIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjMwOiA8YmxvY2txdW90ZT5FdmFsdWF0aW9uIG9mIGFuIGlkZW50aWZpZXIgZXhwcmVzc2lvbgorICAvLy8gPGk+ZTwvaT4gb2YgdGhlIGZvcm0gPGk+aWQ8L2k+IHByb2NlZWRzIGFzIGZvbGxvd3M6CisgIC8vLworICAvLy8gTGV0IDxpPmQ8L2k+IGJlIHRoZSBpbm5lcm1vc3QgZGVjbGFyYXRpb24gaW4gdGhlIGVuY2xvc2luZyBsZXhpY2FsIHNjb3BlIHdob3NlIG5hbWUgaXMKKyAgLy8vIDxpPmlkPC9pPi4gSWYgbm8gc3VjaCBkZWNsYXJhdGlvbiBleGlzdHMgaW4gdGhlIGxleGljYWwgc2NvcGUsIGxldCA8aT5kPC9pPiBiZSB0aGUgZGVjbGFyYXRpb24KKyAgLy8vIG9mIHRoZSBpbmhlcml0ZWQgbWVtYmVyIG5hbWVkIDxpPmlkPC9pPiBpZiBpdCBleGlzdHMuCisgIC8vLyAqIElmIDxpPmQ8L2k+IGlzIGEgY2xhc3Mgb3IgdHlwZSBhbGlhcyA8aT5UPC9pPiwgdGhlIHZhbHVlIG9mIDxpPmU8L2k+IGlzIHRoZSB1bmlxdWUgaW5zdGFuY2UKKyAgLy8vIG9mIGNsYXNzIGBUeXBlYCByZWlmeWluZyA8aT5UPC9pPi4KKyAgLy8vICogSWYgPGk+ZDwvaT4gaXMgYSB0eXBlIHBhcmFtZXRlciA8aT5UPC9pPiwgdGhlbiB0aGUgdmFsdWUgb2YgPGk+ZTwvaT4gaXMgdGhlIHZhbHVlIG9mIHRoZQorICAvLy8gYWN0dWFsIHR5cGUgYXJndW1lbnQgY29ycmVzcG9uZGluZyB0byA8aT5UPC9pPiB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRpdmUgY29uc3RydWN0b3IKKyAgLy8vIHRoYXQgY3JlYXRlZCB0aGUgY3VycmVudCBiaW5kaW5nIG9mIHRoaXMuIFdlIGFyZSBhc3N1cmVkIHRoYXQgdGhpcyBpcyB3ZWxsIGRlZmluZWQsIGJlY2F1c2UgaWYKKyAgLy8vIHdlIHdlcmUgaW4gYSBzdGF0aWMgbWVtYmVyIHRoZSByZWZlcmVuY2UgdG8gPGk+VDwvaT4gd291bGQgYmUgYSBjb21waWxlLXRpbWUgZXJyb3IuCisgIC8vLyAqIElmIDxpPmQ8L2k+IGlzIGEgbGlicmFyeSB2YXJpYWJsZSB0aGVuOgorICAvLy8gKiBJZiA8aT5kPC9pPiBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPnZhciB2ID0gZTxzdWI+aTwvc3ViPjs8L2k+LCA8aT5UIHYgPQorICAvLy8gZTxzdWI+aTwvc3ViPjs8L2k+LCA8aT5maW5hbCB2ID0gZTxzdWI+aTwvc3ViPjs8L2k+LCA8aT5maW5hbCBUIHYgPSBlPHN1Yj5pPC9zdWI+OzwvaT4sIGFuZCBubworICAvLy8gdmFsdWUgaGFzIHlldCBiZWVuIHN0b3JlZCBpbnRvIDxpPnY8L2k+IHRoZW4gdGhlIGluaXRpYWxpemVyIGV4cHJlc3Npb24gPGk+ZTxzdWI+aTwvc3ViPjwvaT4gaXMKKyAgLy8vIGV2YWx1YXRlZC4gSWYsIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiA8aT5lPHN1Yj5pPC9zdWI+PC9pPiwgdGhlIGdldHRlciBmb3IgPGk+djwvaT4gaXMKKyAgLy8vIHJlZmVyZW5jZWQsIGEgQ3ljbGljSW5pdGlhbGl6YXRpb25FcnJvciBpcyB0aHJvd24uIElmIHRoZSBldmFsdWF0aW9uIHN1Y2NlZWRlZCB5aWVsZGluZyBhbgorICAvLy8gb2JqZWN0IDxpPm88L2k+LCBsZXQgPGk+ciA9IG88L2k+LCBvdGhlcndpc2UgbGV0IDxpPnIgPSBudWxsPC9pPi4gSW4gYW55IGNhc2UsIDxpPnI8L2k+IGlzCisgIC8vLyBzdG9yZWQgaW50byA8aT52PC9pPi4gVGhlIHZhbHVlIG9mIDxpPmU8L2k+IGlzIDxpPnI8L2k+LgorICAvLy8gKiBJZiA8aT5kPC9pPiBpcyBvZiBvbmUgb2YgdGhlIGZvcm1zIDxpPmNvbnN0IHYgPSBlOzwvaT4gb3IgPGk+Y29uc3QgVCB2ID0gZTs8L2k+IHRoZSByZXN1bHQKKyAgLy8vIG9mIHRoZSBnZXR0ZXIgaXMgdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlIHRpbWUgY29uc3RhbnQgPGk+ZTwvaT4uIE90aGVyd2lzZQorICAvLy8gKiA8aT5lPC9pPiBldmFsdWF0ZXMgdG8gdGhlIGN1cnJlbnQgYmluZGluZyBvZiA8aT5pZDwvaT4uCisgIC8vLyAqIElmIDxpPmQ8L2k+IGlzIGEgbG9jYWwgdmFyaWFibGUgb3IgZm9ybWFsIHBhcmFtZXRlciB0aGVuIDxpPmU8L2k+IGV2YWx1YXRlcyB0byB0aGUgY3VycmVudAorICAvLy8gYmluZGluZyBvZiA8aT5pZDwvaT4uCisgIC8vLyAqIElmIDxpPmQ8L2k+IGlzIGEgc3RhdGljIG1ldGhvZCwgdG9wIGxldmVsIGZ1bmN0aW9uIG9yIGxvY2FsIGZ1bmN0aW9uIHRoZW4gPGk+ZTwvaT4KKyAgLy8vIGV2YWx1YXRlcyB0byB0aGUgZnVuY3Rpb24gZGVmaW5lZCBieSA8aT5kPC9pPi4KKyAgLy8vICogSWYgPGk+ZDwvaT4gaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGljIHZhcmlhYmxlIG9yIHN0YXRpYyBnZXR0ZXIgZGVjbGFyZWQgaW4gY2xhc3MKKyAgLy8vIDxpPkM8L2k+LCB0aGVuIDxpPmU8L2k+IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGdldHRlciBpbnZvY2F0aW9uIDxpPkMuaWQ8L2k+LgorICAvLy8gKiBJZiA8aT5kPC9pPiBpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSB0b3AgbGV2ZWwgZ2V0dGVyLCB0aGVuIDxpPmU8L2k+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgIC8vLyBnZXR0ZXIgaW52b2NhdGlvbiA8aT5pZDwvaT4uCisgIC8vLyAqIE90aGVyd2lzZSwgaWYgPGk+ZTwvaT4gb2NjdXJzIGluc2lkZSBhIHRvcCBsZXZlbCBvciBzdGF0aWMgZnVuY3Rpb24gKGJlIGl0IGZ1bmN0aW9uLAorICAvLy8gbWV0aG9kLCBnZXR0ZXIsIG9yIHNldHRlcikgb3IgdmFyaWFibGUgaW5pdGlhbGl6ZXIsIGV2YWx1YXRpb24gb2YgZSBjYXVzZXMgYSBOb1N1Y2hNZXRob2RFcnJvcgorICAvLy8gdG8gYmUgdGhyb3duLgorICAvLy8gKiBPdGhlcndpc2UgPGk+ZTwvaT4gaXMgZXF1aXZhbGVudCB0byB0aGUgcHJvcGVydHkgZXh0cmFjdGlvbiA8aT50aGlzLmlkPC9pPi4KKyAgLy8vIDwvYmxvY2txdW90ZT4KICAgQG92ZXJyaWRlCiAgIHZvaWQgdmlzaXRTaW1wbGVJZGVudGlmaWVyKFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgewogICAgIEVsZW1lbnQgZWxlbWVudCA9IG5vZGUuc3RhdGljRWxlbWVudDsKQEAgLTU4MSwxOSArNTI2LDE1IEBACiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBzdGF0aWNUeXBlKTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi41OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSBzdHJpbmcgbGl0ZXJhbCBpcwotICAgKiBgU3RyaW5nYC48L2Jsb2NrcXVvdGU+Ci0gICAqLworICAvLy8gVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuNTogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGEgc3RyaW5nIGxpdGVyYWwgaXMKKyAgLy8vIGBTdHJpbmdgLjwvYmxvY2txdW90ZT4KICAgQG92ZXJyaWRlCiAgIHZvaWQgdmlzaXRTaW1wbGVTdHJpbmdMaXRlcmFsKFNpbXBsZVN0cmluZ0xpdGVyYWwgbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX25vbk51bGxhYmxlKF90eXBlUHJvdmlkZXIuc3RyaW5nVHlwZSkpOwogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjU6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIHN0cmluZyBsaXRlcmFsIGlzCi0gICAqIGBTdHJpbmdgLjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi41OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSBzdHJpbmcgbGl0ZXJhbCBpcworICAvLy8gYFN0cmluZ2AuPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdFN0cmluZ0ludGVycG9sYXRpb24oU3RyaW5nSW50ZXJwb2xhdGlvbiBub2RlKSB7CiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBfbm9uTnVsbGFibGUoX3R5cGVQcm92aWRlci5zdHJpbmdUeXBlKSk7CkBAIC02MTYsMTAgKzU1Nyw4IEBACiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBfbm9uTnVsbGFibGUoX3R5cGVQcm92aWRlci5zeW1ib2xUeXBlKSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlIERhcnQgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgMTIuMTA6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBgdGhpc2AgaXMgdGhlCi0gICAqIGludGVyZmFjZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi4xMDogPGJsb2NrcXVvdGU+VGhlIHN0YXRpYyB0eXBlIG9mIGB0aGlzYCBpcyB0aGUKKyAgLy8vIGludGVyZmFjZSBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGNsYXNzLjwvYmxvY2txdW90ZT4KICAgQG92ZXJyaWRlCiAgIHZvaWQgdmlzaXRUaGlzRXhwcmVzc2lvbihUaGlzRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgaWYgKF9yZXNvbHZlci50aGlzVHlwZSA9PSBudWxsKSB7CkBAIC02MzEsMTAgKzU3MCw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFRoZSBEYXJ0IExhbmd1YWdlIFNwZWNpZmljYXRpb24sIDEyLjg6IDxibG9ja3F1b3RlPlRoZSBzdGF0aWMgdHlwZSBvZiBhIHRocm93IGV4cHJlc3Npb24gaXMKLSAgICogYm90dG9tLjwvYmxvY2txdW90ZT4KLSAgICovCisgIC8vLyBUaGUgRGFydCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCAxMi44OiA8YmxvY2txdW90ZT5UaGUgc3RhdGljIHR5cGUgb2YgYSB0aHJvdyBleHByZXNzaW9uIGlzCisgIC8vLyBib3R0b20uPC9ibG9ja3F1b3RlPgogICBAb3ZlcnJpZGUKICAgdm9pZCB2aXNpdFRocm93RXhwcmVzc2lvbihUaHJvd0V4cHJlc3Npb24gbm9kZSkgewogICAgIHJlY29yZFN0YXRpY1R5cGUobm9kZSwgX3R5cGVQcm92aWRlci5ib3R0b21UeXBlKTsKQEAgLTY0NSwxMCArNTgyLDggQEAKICAgICBfaW5mZXJMb2NhbFZhcmlhYmxlVHlwZShub2RlLCBub2RlLmluaXRpYWxpemVyKTsKICAgfQogCi0gIC8qKgotICAgKiBTZXQgdGhlIHN0YXRpYyB0eXBlIG9mIFtub2RlXSB0byBiZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHN0YXRpYwotICAgKiB0eXBlcyBvZiBzdWJleHByZXNzaW9ucyBbZXhwcjFdIGFuZCBbZXhwcjJdLgotICAgKi8KKyAgLy8vIFNldCB0aGUgc3RhdGljIHR5cGUgb2YgW25vZGVdIHRvIGJlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgc3RhdGljCisgIC8vLyB0eXBlcyBvZiBzdWJleHByZXNzaW9ucyBbZXhwcjFdIGFuZCBbZXhwcjJdLgogICB2b2lkIF9hbmFseXplTGVhc3RVcHBlckJvdW5kKAogICAgICAgRXhwcmVzc2lvbiBub2RlLCBFeHByZXNzaW9uIGV4cHIxLCBFeHByZXNzaW9uIGV4cHIyLAogICAgICAge2Jvb2wgcmVhZCA9IGZhbHNlfSkgewpAQCAtNjU4LDEwICs1OTMsOCBAQAogICAgIF9hbmFseXplTGVhc3RVcHBlckJvdW5kVHlwZXMobm9kZSwgc3RhdGljVHlwZTEsIHN0YXRpY1R5cGUyKTsKICAgfQogCi0gIC8qKgotICAgKiBTZXQgdGhlIHN0YXRpYyB0eXBlIG9mIFtub2RlXSB0byBiZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdGhlIHN0YXRpYwotICAgKiB0eXBlcyBbc3RhdGljVHlwZTFdIGFuZCBbc3RhdGljVHlwZTJdLgotICAgKi8KKyAgLy8vIFNldCB0aGUgc3RhdGljIHR5cGUgb2YgW25vZGVdIHRvIGJlIHRoZSBsZWFzdCB1cHBlciBib3VuZCBvZiB0aGUgc3RhdGljCisgIC8vLyB0eXBlcyBbc3RhdGljVHlwZTFdIGFuZCBbc3RhdGljVHlwZTJdLgogICB2b2lkIF9hbmFseXplTGVhc3RVcHBlckJvdW5kVHlwZXMoCiAgICAgICBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIHN0YXRpY1R5cGUxLCBEYXJ0VHlwZSBzdGF0aWNUeXBlMikgewogICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2FuIHN0aWxsIGhhcHBlbi4KQEAgLTY3OSwyMCArNjEyLDE2IEBACiAgICAgcmVjb3JkU3RhdGljVHlwZShub2RlLCBzdGF0aWNUeXBlKTsKICAgfQogCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZWZpbml0ZSB0eXBlIG9mIGV4cHJlc3Npb24sIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNhc2VzIHdoZXJlCi0gICAqIHRoZSBtb3N0IHByZWNpc2UgdHlwZSBpcyBkZXNpcmVkLCBmb3IgZXhhbXBsZSBjb21wdXRpbmcgdGhlIGxlYXN0IHVwcGVyCi0gICAqIGJvdW5kLgotICAgKgotICAgKiBTZWUgW2dldEV4cHJlc3Npb25UeXBlXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gV2l0aG91dCBzdHJvbmcgbW9kZSwgdGhpcyBpcwotICAgKiBlcXVpdmFsZW50IHRvIFtfZ2V0U3RhdGljVHlwZV0uCi0gICAqLworICAvLy8gR2V0cyB0aGUgZGVmaW5pdGUgdHlwZSBvZiBleHByZXNzaW9uLCB3aGljaCBjYW4gYmUgdXNlZCBpbiBjYXNlcyB3aGVyZQorICAvLy8gdGhlIG1vc3QgcHJlY2lzZSB0eXBlIGlzIGRlc2lyZWQsIGZvciBleGFtcGxlIGNvbXB1dGluZyB0aGUgbGVhc3QgdXBwZXIKKyAgLy8vIGJvdW5kLgorICAvLy8KKyAgLy8vIFNlZSBbZ2V0RXhwcmVzc2lvblR5cGVdIGZvciBtb3JlIGluZm9ybWF0aW9uLiBXaXRob3V0IHN0cm9uZyBtb2RlLCB0aGlzIGlzCisgIC8vLyBlcXVpdmFsZW50IHRvIFtfZ2V0U3RhdGljVHlwZV0uCiAgIERhcnRUeXBlIF9nZXRFeHByZXNzaW9uVHlwZShFeHByZXNzaW9uIGV4cHIsIHtib29sIHJlYWQgPSBmYWxzZX0pID0+CiAgICAgICBnZXRFeHByZXNzaW9uVHlwZShleHByLCBfdHlwZVN5c3RlbSwgX3R5cGVQcm92aWRlciwgcmVhZDogcmVhZCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgc3RhdGljIHR5cGUgb2YgdGhlIGdpdmVuIFtleHByZXNzaW9uXS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBnaXZlbiBbZXhwcmVzc2lvbl0uCiAgIERhcnRUeXBlIF9nZXRTdGF0aWNUeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwge2Jvb2wgcmVhZCA9IGZhbHNlfSkgewogICAgIERhcnRUeXBlIHR5cGU7CiAgICAgaWYgKHJlYWQpIHsKQEAgLTcxOCw5ICs2NDcsNyBAQAogICAgIHJldHVybiB0eXBlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gdHlwZSBbYW5ub3RhdGlvbl0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB0eXBlIFthbm5vdGF0aW9uXS4KICAgRGFydFR5cGUgX2dldFR5cGUoVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbikgewogICAgIERhcnRUeXBlIHR5cGUgPSBhbm5vdGF0aW9uLnR5cGU7CiAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewpAQCAtNzMxLDEyICs2NTgsMTAgQEAKICAgICByZXR1cm4gdHlwZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgcmVjb3JkZWQgZm9yIGEgbm9kZSB0aGF0IHJlc29sdmVkIHRvIHRoZSBnaXZlbiBhY2Nlc3Nvci4KLSAgICoKLSAgICogQHBhcmFtIGFjY2Vzc29yIHRoZSBhY2Nlc3NvciB0aGF0IHRoZSBub2RlIHJlc29sdmVkIHRvCi0gICAqIEByZXR1cm4gdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgcmVjb3JkZWQgZm9yIGEgbm9kZSB0aGF0IHJlc29sdmVkIHRvIHRoZSBnaXZlbiBhY2Nlc3NvcgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSByZWNvcmRlZCBmb3IgYSBub2RlIHRoYXQgcmVzb2x2ZWQgdG8gdGhlIGdpdmVuIGFjY2Vzc29yLgorICAvLy8KKyAgLy8vIEBwYXJhbSBhY2Nlc3NvciB0aGUgYWNjZXNzb3IgdGhhdCB0aGUgbm9kZSByZXNvbHZlZCB0bworICAvLy8gQHJldHVybiB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSByZWNvcmRlZCBmb3IgYSBub2RlIHRoYXQgcmVzb2x2ZWQgdG8gdGhlIGdpdmVuIGFjY2Vzc29yCiAgIERhcnRUeXBlIF9nZXRUeXBlT2ZQcm9wZXJ0eShQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBhY2Nlc3NvcikgewogICAgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvblR5cGUgPSBhY2Nlc3Nvci50eXBlOwogICAgIGlmIChmdW5jdGlvblR5cGUgPT0gbnVsbCkgewpAQCAtNzYzLDEwICs2ODgsOCBAQAogICAgIHJldHVybiBmdW5jdGlvblR5cGUucmV0dXJuVHlwZTsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiBhbiBpbnN0YW5jZSBjcmVhdGlvbiBvZiBhIHBvc3NpYmx5IGdlbmVyaWMgdHlwZSwgaW5mZXIgdGhlIHR5cGUKLSAgICogYXJndW1lbnRzIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgdHlwZSBhcyB3ZWxsIGFzIHRoZSBhcmd1bWVudCB0eXBlcy4KLSAgICovCisgIC8vLyBHaXZlbiBhbiBpbnN0YW5jZSBjcmVhdGlvbiBvZiBhIHBvc3NpYmx5IGdlbmVyaWMgdHlwZSwgaW5mZXIgdGhlIHR5cGUKKyAgLy8vIGFyZ3VtZW50cyB1c2luZyB0aGUgY3VycmVudCBjb250ZXh0IHR5cGUgYXMgd2VsbCBhcyB0aGUgYXJndW1lbnQgdHlwZXMuCiAgIHZvaWQgX2luZmVySW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24oSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gbm9kZSkgewogICAgIENvbnN0cnVjdG9yTmFtZSBjb25zdHJ1Y3RvciA9IG5vZGUuY29uc3RydWN0b3JOYW1lOwogICAgIENvbnN0cnVjdG9yRWxlbWVudCBvcmlnaW5hbEVsZW1lbnQgPSBjb25zdHJ1Y3Rvci5zdGF0aWNFbGVtZW50OwpAQCAtODIyLDEyICs3NDUsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogR2l2ZW4gYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgaXRzIGluaXRpYWxpemVyLCBhdHRlbXB0IHRvIGluZmVyCi0gICAqIGEgdHlwZSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGJhc2VkIG9uIHRoZSBpbml0aWFsaXplci4KLSAgICogSW5mZXJlbmNlIGlzIG9ubHkgZG9uZSBpZiBhbiBleHBsaWNpdCB0eXBlIGlzIG5vdCBwcmVzZW50LCBhbmQgaWYKLSAgICogaW5mZXJyaW5nIGEgdHlwZSBpbXByb3ZlcyB0aGUgdHlwZS4KLSAgICovCisgIC8vLyBHaXZlbiBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFuZCBpdHMgaW5pdGlhbGl6ZXIsIGF0dGVtcHQgdG8gaW5mZXIKKyAgLy8vIGEgdHlwZSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGJhc2VkIG9uIHRoZSBpbml0aWFsaXplci4KKyAgLy8vIEluZmVyZW5jZSBpcyBvbmx5IGRvbmUgaWYgYW4gZXhwbGljaXQgdHlwZSBpcyBub3QgcHJlc2VudCwgYW5kIGlmCisgIC8vLyBpbmZlcnJpbmcgYSB0eXBlIGltcHJvdmVzIHRoZSB0eXBlLgogICB2b2lkIF9pbmZlckxvY2FsVmFyaWFibGVUeXBlKAogICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLCBFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CiAgICAgQXN0Tm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKQEAgLTg1NywxMyArNzc4LDExIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIGEgcHJvcGVydHkgYWNjZXNzIFtub2RlXSB3aXRoIHN0YXRpYyB0eXBlIFtub2RlVHlwZV0sCi0gICAqIGFuZCBbaWRdIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGJlaW5nIGFjY2Vzc2VkLCBpbmZlciBhIHR5cGUgZm9yIHRoZQotICAgKiBhY2Nlc3MgaXRzZWxmIGFuZCBpdHMgY29uc3RpdHVlbnQgY29tcG9uZW50cyBpZiB0aGUgYWNjZXNzIGlzIHRvIG9uZSBvZiB0aGUKLSAgICogbWV0aG9kcyBvciBnZXR0ZXJzIG9mIHRoZSBidWlsdCBpbiAnT2JqZWN0JyB0eXBlLCBhbmQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzCi0gICAqIGEgc2VhbGVkIHR5cGUuIFJldHVybnMgdHJ1ZSBpZiBpbmZlcmVuY2Ugc3VjY2VlZGVkLgotICAgKi8KKyAgLy8vIEdpdmVuIGEgcHJvcGVydHkgYWNjZXNzIFtub2RlXSB3aXRoIHN0YXRpYyB0eXBlIFtub2RlVHlwZV0sCisgIC8vLyBhbmQgW2lkXSBpcyB0aGUgcHJvcGVydHkgbmFtZSBiZWluZyBhY2Nlc3NlZCwgaW5mZXIgYSB0eXBlIGZvciB0aGUKKyAgLy8vIGFjY2VzcyBpdHNlbGYgYW5kIGl0cyBjb25zdGl0dWVudCBjb21wb25lbnRzIGlmIHRoZSBhY2Nlc3MgaXMgdG8gb25lIG9mIHRoZQorICAvLy8gbWV0aG9kcyBvciBnZXR0ZXJzIG9mIHRoZSBidWlsdCBpbiAnT2JqZWN0JyB0eXBlLCBhbmQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzCisgIC8vLyBhIHNlYWxlZCB0eXBlLiBSZXR1cm5zIHRydWUgaWYgaW5mZXJlbmNlIHN1Y2NlZWRlZC4KICAgYm9vbCBfaW5mZXJPYmplY3RBY2Nlc3MoCiAgICAgICBFeHByZXNzaW9uIG5vZGUsIERhcnRUeXBlIG5vZGVUeXBlLCBTaW1wbGVJZGVudGlmaWVyIGlkKSB7CiAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhY2Nlc3MgbGlrZSBgbGlicmFyeVByZWZpeC5oYXNoQ29kZWAgZG9uJ3QgaW5mZXIgaXQuCkBAIC04OTEsMTEgKzgxMCw5IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIGFuIHVuaW5zdGFudGlhdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSwgcmVmZXJlbmNlZCBieSB0aGUKLSAgICogW2lkZW50aWZpZXJdIGluIHRoZSB0ZWFyLW9mZiBbZXhwcmVzc2lvbl0sIHRyeSB0byBpbmZlciB0aGUgaW5zdGFudGlhdGVkCi0gICAqIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBmcm9tIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0LgotICAgKi8KKyAgLy8vIEdpdmVuIGFuIHVuaW5zdGFudGlhdGVkIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSwgcmVmZXJlbmNlZCBieSB0aGUKKyAgLy8vIFtpZGVudGlmaWVyXSBpbiB0aGUgdGVhci1vZmYgW2V4cHJlc3Npb25dLCB0cnkgdG8gaW5mZXIgdGhlIGluc3RhbnRpYXRlZAorICAvLy8gZ2VuZXJpYyBmdW5jdGlvbiB0eXBlIGZyb20gdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuCiAgIERhcnRUeXBlIF9pbmZlclRlYXJPZmYoCiAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uLAogICAgIFNpbXBsZUlkZW50aWZpZXIgaWRlbnRpZmllciwKQEAgLTkxOCw5ICs4MzUsNyBAQAogICAgIHJldHVybiB0ZWFyT2ZmVHlwZTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbbm9kZV0gaXMgbm90IGEgdHlwZSBsaXRlcmFsLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtub2RlXSBpcyBub3QgYSB0eXBlIGxpdGVyYWwuCiAgIGJvb2wgX2lzRXhwcmVzc2lvbklkZW50aWZpZXIoSWRlbnRpZmllciBub2RlKSB7CiAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgIGlmIChub2RlIGlzIFNpbXBsZUlkZW50aWZpZXIgJiYgbm9kZS5pbkRlY2xhcmF0aW9uQ29udGV4dCgpKSB7CkBAIC05NDEsMTAgKzg1Niw4IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBub24tbnVsbGFibGUgdmFyaWFudCBvZiB0aGUgW3R5cGVdIGlmIE5OQkQgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlCi0gICAqIHJldHVybiB0aGUgdHlwZSBpdHNlbGYuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBub24tbnVsbGFibGUgdmFyaWFudCBvZiB0aGUgW3R5cGVdIGlmIE5OQkQgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm4gdGhlIHR5cGUgaXRzZWxmLgogICBEYXJ0VHlwZSBfbm9uTnVsbGFibGUoRGFydFR5cGUgdHlwZSkgewogICAgIGlmIChfaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewogICAgICAgcmV0dXJuIF90eXBlU3lzdGVtLnByb21vdGVUb05vbk51bGwodHlwZSk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9hc3RfdGVzdF9mYWN0b3J5LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9hc3RfdGVzdF9mYWN0b3J5LmRhcnQKaW5kZXggMmI5YjgyMi4uOGI4NzQ0YSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvYXN0X3Rlc3RfZmFjdG9yeS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2FzdF90ZXN0X2ZhY3RvcnkuZGFydApAQCAtMTQsMTggKzE0LDE5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKLS8qKgotICogVGhlIGNsYXNzIGBBc3RUZXN0RmFjdG9yeWAgZGVmaW5lcyB1dGlsaXR5IG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQVNUIG5vZGVzLiBUaGUKLSAqIG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQgYXJlIGNvbXBsZXRlIGluIHRoZSBzZW5zZSB0aGF0IGFsbCBvZiB0aGUgdG9rZW5zIHRoYXQgd291bGQgaGF2ZSBiZWVuCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGVzIGJ5IGEgcGFyc2VyIGFyZSBhbHNvIGNyZWF0ZWQsIGJ1dCB0aGUgdG9rZW4gc3RyZWFtIGlzIG5vdCBjb25zdHJ1Y3RlZC4KLSAqIE5vbmUgb2YgdGhlIG5vZGVzIGFyZSByZXNvbHZlZC4KLSAqCi0gKiBUaGUgZ2VuZXJhbCBwYXR0ZXJuIGlzIGZvciB0aGUgbmFtZSBvZiB0aGUgZmFjdG9yeSBtZXRob2QgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gKiBvZiBBU1Qgbm9kZSBiZWluZyBjcmVhdGVkLiBUaGVyZSBhcmUgdHdvIG5vdGFibGUgZXhjZXB0aW9ucy4gVGhlIGZpcnN0IGlzIGZvciBtZXRob2RzIGNyZWF0aW5nCi0gKiBub2RlcyB0aGF0IGFyZSBwYXJ0IG9mIGEgY2FzY2FkZSBleHByZXNzaW9uLiBUaGVzZSBtZXRob2RzIGFyZSBhbGwgcHJlZml4ZWQgd2l0aCAnY2FzY2FkZWQnLiBUaGUKLSAqIHNlY29uZCBpcyBwbGFjZXMgd2hlcmUgYSBzaG9ydGVyIG5hbWUgc2VlbWVkIHVuYW1iaWd1b3VzIGFuZCBlYXNpZXIgdG8gcmVhZCwgc3VjaCBhcyB1c2luZwotICogJ2lkZW50aWZpZXInIHJhdGhlciB0aGFuICdwcmVmaXhlZElkZW50aWZpZXInLCBvciAnaW50ZWdlcicgcmF0aGVyIHRoYW4gJ2ludGVnZXJMaXRlcmFsJy4KLSAqLworLy8vIFRoZSBjbGFzcyBgQXN0VGVzdEZhY3RvcnlgIGRlZmluZXMgdXRpbGl0eSBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKy8vLyBjcmVhdGUgQVNUIG5vZGVzLiBUaGUgbm9kZXMgdGhhdCBhcmUgY3JlYXRlZCBhcmUgY29tcGxldGUgaW4gdGhlIHNlbnNlIHRoYXQKKy8vLyBhbGwgb2YgdGhlIHRva2VucyB0aGF0IHdvdWxkIGhhdmUgYmVlbgorLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgYnkgYSBwYXJzZXIgYXJlIGFsc28gY3JlYXRlZCwgYnV0IHRoZSB0b2tlbiBzdHJlYW0KKy8vLyBpcyBub3QgY29uc3RydWN0ZWQuIE5vbmUgb2YgdGhlIG5vZGVzIGFyZSByZXNvbHZlZC4KKy8vLworLy8vIFRoZSBnZW5lcmFsIHBhdHRlcm4gaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBmYWN0b3J5IG1ldGhvZCB0byBiZSB0aGUgc2FtZSBhcworLy8vIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiBBU1Qgbm9kZSBiZWluZyBjcmVhdGVkLiBUaGVyZSBhcmUgdHdvIG5vdGFibGUKKy8vLyBleGNlcHRpb25zLiBUaGUgZmlyc3QgaXMgZm9yIG1ldGhvZHMgY3JlYXRpbmcgbm9kZXMgdGhhdCBhcmUgcGFydCBvZiBhCisvLy8gY2FzY2FkZSBleHByZXNzaW9uLiBUaGVzZSBtZXRob2RzIGFyZSBhbGwgcHJlZml4ZWQgd2l0aCAnY2FzY2FkZWQnLiBUaGUKKy8vLyBzZWNvbmQgaXMgcGxhY2VzIHdoZXJlIGEgc2hvcnRlciBuYW1lIHNlZW1lZCB1bmFtYmlndW91cyBhbmQgZWFzaWVyIHRvIHJlYWQsCisvLy8gc3VjaCBhcyB1c2luZyAnaWRlbnRpZmllcicgcmF0aGVyIHRoYW4gJ3ByZWZpeGVkSWRlbnRpZmllcicsIG9yICdpbnRlZ2VyJworLy8vIHJhdGhlciB0aGFuICdpbnRlZ2VyTGl0ZXJhbCcuCiBjbGFzcyBBc3RUZXN0RmFjdG9yeSB7CiAgIHN0YXRpYyBBZGphY2VudFN0cmluZ3MgYWRqYWNlbnRTdHJpbmdzKExpc3Q8U3RyaW5nTGl0ZXJhbD4gc3RyaW5ncykgPT4KICAgICAgIGFzdEZhY3RvcnkuYWRqYWNlbnRTdHJpbmdzKHN0cmluZ3MpOwpAQCAtMTMyMCwxMyArMTMyMSwxMSBAQAogICAgICAgICB0eXBlcywgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLkdUKSk7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIGEgdHlwZSBuYW1lIHdob3NlIG5hbWUgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGdpdmVuIFtlbGVtZW50XSBhbmQKLSAgICogd2hvc2UgdHlwZSBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICoKLSAgICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgY2xhc3MgZWxlbWVudHMgdGhhdCBoYXZlCi0gICAqIHR5cGUgcGFyYW1ldGVycy4KLSAgICovCisgIC8vLyBDcmVhdGUgYSB0eXBlIG5hbWUgd2hvc2UgbmFtZSBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgZ2l2ZW4gW2VsZW1lbnRdIGFuZAorICAvLy8gd2hvc2UgdHlwZSBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgLy8vCisgIC8vLyA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSBjbGFzcyBlbGVtZW50cyB0aGF0CisgIC8vLyBoYXZlIHR5cGUgcGFyYW1ldGVycy4KICAgc3RhdGljIFR5cGVOYW1lIHR5cGVOYW1lKENsYXNzRWxlbWVudCBlbGVtZW50LAogICAgICAgW0xpc3Q8VHlwZUFubm90YXRpb24+IGFyZ3VtZW50c10pIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIG5hbWUgPSBpZGVudGlmaWVyMyhlbGVtZW50Lm5hbWUpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvZWxlbWVudF9mYWN0b3J5LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9lbGVtZW50X2ZhY3RvcnkuZGFydAppbmRleCA5MGMwOGViLi4wYjYzMzIzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9lbGVtZW50X2ZhY3RvcnkuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9lbGVtZW50X2ZhY3RvcnkuZGFydApAQCAtMTMsMjUgKzEzLDIyIEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvc2Vzc2lvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvdmFyaWFuY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvYXN0X3Rlc3RfZmFjdG9yeS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2RhcnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JzsKIAotLyoqCi0gKiBUaGUgY2xhc3MgYEVsZW1lbnRGYWN0b3J5YCBkZWZpbmVzIHV0aWxpdHkgbWV0aG9kcyB1c2VkIHRvIGNyZWF0ZSBlbGVtZW50cyBmb3IgdGVzdGluZwotICogcHVycG9zZXMuIFRoZSBlbGVtZW50cyB0aGF0IGFyZSBjcmVhdGVkIGFyZSBjb21wbGV0ZSBpbiB0aGUgc2Vuc2UgdGhhdCBhcyBtdWNoIG9mIHRoZSBlbGVtZW50Ci0gKiBtb2RlbCBhcyBjYW4gYmUgY3JlYXRlZCwgZ2l2ZW4gdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uLCBoYXMgYmVlbiBjcmVhdGVkLgotICovCisvLy8gVGhlIGNsYXNzIGBFbGVtZW50RmFjdG9yeWAgZGVmaW5lcyB1dGlsaXR5IG1ldGhvZHMgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMKKy8vLyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gVGhlIGVsZW1lbnRzIHRoYXQgYXJlIGNyZWF0ZWQgYXJlIGNvbXBsZXRlIGluIHRoZQorLy8vIHNlbnNlIHRoYXQgYXMgbXVjaCBvZiB0aGUgZWxlbWVudCBtb2RlbCBhcyBjYW4gYmUgY3JlYXRlZCwgZ2l2ZW4gdGhlCisvLy8gcHJvdmlkZWQgaW5mb3JtYXRpb24sIGhhcyBiZWVuIGNyZWF0ZWQuCiBjbGFzcyBFbGVtZW50RmFjdG9yeSB7Ci0gIC8qKgotICAgKiBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNsYXNzICdPYmplY3QnLgotICAgKi8KKyAgLy8vIFRoZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY2xhc3MgJ09iamVjdCcuCiAgIHN0YXRpYyBDbGFzc0VsZW1lbnRJbXBsIF9vYmplY3RFbGVtZW50OwogICBzdGF0aWMgSW50ZXJmYWNlVHlwZSBfb2JqZWN0VHlwZTsKIApAQCAtODIsNyArNzksOCBAQAogICAgIHJldHVybiBlbGVtZW50OwogICB9CiAKLSAgc3RhdGljIGNsYXNzVHlwZUFsaWFzKFN0cmluZyB0eXBlTmFtZSwgSW50ZXJmYWNlVHlwZSBzdXBlcmNsYXNzVHlwZSwKKyAgc3RhdGljIENsYXNzRWxlbWVudEltcGwgY2xhc3NUeXBlQWxpYXMoCisgICAgICBTdHJpbmcgdHlwZU5hbWUsIEludGVyZmFjZVR5cGUgc3VwZXJjbGFzc1R5cGUsCiAgICAgICBbTGlzdDxTdHJpbmc+IHBhcmFtZXRlck5hbWVzXSkgewogICAgIENsYXNzRWxlbWVudEltcGwgZWxlbWVudCA9CiAgICAgICAgIGNsYXNzRWxlbWVudCh0eXBlTmFtZSwgc3VwZXJjbGFzc1R5cGUsIHBhcmFtZXRlck5hbWVzKTsKQEAgLTI1NCwxMSArMjUyLDkgQEAKICAgICAgICAgICBJZGVudGlmaWVyIG5hbWUpID0+CiAgICAgICBGaWVsZEZvcm1hbFBhcmFtZXRlckVsZW1lbnRJbXBsKG5hbWUubmFtZSwgbmFtZS5vZmZzZXQpOwogCi0gIC8qKgotICAgKiBEZXN0cm95IGFueSBzdGF0aWMgc3RhdGUgcmV0YWluZWQgYnkgW0VsZW1lbnRGYWN0b3J5XS4gIFRoaXMgc2hvdWxkIGJlCi0gICAqIGNhbGxlZCBmcm9tIHRoZSBgc2V0VXBgIG1ldGhvZCBvZiBhbnkgdGVzdHMgdGhhdCB1c2UgW0VsZW1lbnRGYWN0b3J5XSwgaW4KLSAgICogb3JkZXIgdG8gZW5zdXJlIHRoYXQgc3RhdGUgaXMgbm90IHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIHRlc3RzLgotICAgKi8KKyAgLy8vIERlc3Ryb3kgYW55IHN0YXRpYyBzdGF0ZSByZXRhaW5lZCBieSBbRWxlbWVudEZhY3RvcnldLiAgVGhpcyBzaG91bGQgYmUKKyAgLy8vIGNhbGxlZCBmcm9tIHRoZSBgc2V0VXBgIG1ldGhvZCBvZiBhbnkgdGVzdHMgdGhhdCB1c2UgW0VsZW1lbnRGYWN0b3J5XSwgaW4KKyAgLy8vIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHN0YXRlIGlzIG5vdCBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSB0ZXN0cy4KICAgc3RhdGljIHZvaWQgZmx1c2hTdGF0aWNTdGF0ZSgpIHsKICAgICBfb2JqZWN0RWxlbWVudCA9IG51bGw7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2VsZW1lbnRfc2VhcmNoLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9lbGVtZW50X3NlYXJjaC5kYXJ0CmluZGV4IDA1MzcyNGUuLmUwYmZkYmIxIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9lbGVtZW50X3NlYXJjaC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2VsZW1lbnRfc2VhcmNoLmRhcnQKQEAgLTYsOSArNiw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIAotLyoqCi0gKiBTZWFyY2ggdGhlIFt1bml0XSBmb3IgdGhlIFtFbGVtZW50XXMgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgotICovCisvLy8gU2VhcmNoIHRoZSBbdW5pdF0gZm9yIHRoZSBbRWxlbWVudF1zIHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KIExpc3Q8RWxlbWVudD4gZmluZEVsZW1lbnRzQnlOYW1lKENvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgbmFtZSkgewogICB2YXIgZmluZGVyID0gX0VsZW1lbnRzQnlOYW1lRmluZGVyKG5hbWUpOwogICB1bml0LmFjY2VwdChmaW5kZXIpOwpAQCAtMjIsNyArMjAsNyBAQAogICBfRWxlbWVudHNCeU5hbWVGaW5kZXIodGhpcy5uYW1lKTsKIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRTaW1wbGVJZGVudGlmaWVyKFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgeworICB2b2lkIHZpc2l0U2ltcGxlSWRlbnRpZmllcihTaW1wbGVJZGVudGlmaWVyIG5vZGUpIHsKICAgICBpZiAobm9kZS5uYW1lID09IG5hbWUgJiYgbm9kZS5pbkRlY2xhcmF0aW9uQ29udGV4dCgpKSB7CiAgICAgICBlbGVtZW50cy5hZGQobm9kZS5zdGF0aWNFbGVtZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9ub2RlX3NlYXJjaC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3Rpbmcvbm9kZV9zZWFyY2guZGFydAppbmRleCA5Mjc0M2M3Li45YTJiMTVkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9ub2RlX3NlYXJjaC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL25vZGVfc2VhcmNoLmRhcnQKQEAgLTUsOSArNSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L3Zpc2l0b3IuZGFydCc7CiAKLS8qKgotICogU2VhcmNoIHRoZSBbdW5pdF0gZm9yIGRlY2xhcmVkIFtTaW1wbGVJZGVudGlmaWVyXXMgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgotICovCisvLy8gU2VhcmNoIHRoZSBbdW5pdF0gZm9yIGRlY2xhcmVkIFtTaW1wbGVJZGVudGlmaWVyXXMgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgogTGlzdDxTaW1wbGVJZGVudGlmaWVyPiBmaW5kRGVjbGFyZWRJZGVudGlmaWVyc0J5TmFtZSgKICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIG5hbWUpIHsKICAgdmFyIGZpbmRlciA9IF9EZWNsYXJlZElkZW50aWZpZXJzQnlOYW1lRmluZGVyKG5hbWUpOwpAQCAtMjIsNyArMjAsNyBAQAogICBfRGVjbGFyZWRJZGVudGlmaWVyc0J5TmFtZUZpbmRlcih0aGlzLm5hbWUpOwogCiAgIEBvdmVycmlkZQotICB2aXNpdFNpbXBsZUlkZW50aWZpZXIoU2ltcGxlSWRlbnRpZmllciBub2RlKSB7CisgIHZvaWQgdmlzaXRTaW1wbGVJZGVudGlmaWVyKFNpbXBsZUlkZW50aWZpZXIgbm9kZSkgewogICAgIGlmIChub2RlLm5hbWUgPT0gbmFtZSAmJiBub2RlLmluRGVjbGFyYXRpb25Db250ZXh0KCkpIHsKICAgICAgIGlkZW50aWZpZXJzLmFkZChub2RlKTsKICAgICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy90ZXN0X3R5cGVfcHJvdmlkZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL3Rlc3RfdHlwZV9wcm92aWRlci5kYXJ0CmluZGV4IGU0N2E2MzUuLjdkYjRlYTAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL3Rlc3RfdHlwZV9wcm92aWRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL3Rlc3RfdHlwZV9wcm92aWRlci5kYXJ0CkBAIC0xMSwxMCArMTEsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90ZXN0X3V0aWxpdGllcy9tb2NrX3Nka19lbGVtZW50cy5kYXJ0JzsKIAotLyoqCi0gKiBBIHR5cGUgcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCBieSB0ZXN0cyB3aXRob3V0IGNyZWF0aW5nIHRoZSBlbGVtZW50IG1vZGVsCi0gKiBmb3IgdGhlIGNvcmUgbGlicmFyeS4KLSAqLworLy8vIEEgdHlwZSBwcm92aWRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGVsZW1lbnQgbW9kZWwKKy8vLyBmb3IgdGhlIGNvcmUgbGlicmFyeS4KIGNsYXNzIFRlc3RUeXBlUHJvdmlkZXIgZXh0ZW5kcyBUeXBlUHJvdmlkZXJJbXBsIHsKICAgZmFjdG9yeSBUZXN0VHlwZVByb3ZpZGVyKCkgewogICAgIHZhciBhbmFseXNpc0NvbnRleHQgPSBfTW9ja0FuYWx5c2lzQ29udGV4dCgpOwpAQCAtNDEsNyArMzksNyBAQAogICBmaW5hbCBTb3VyY2VGYWN0b3J5IHNvdXJjZUZhY3RvcnkgPSBfTW9ja1NvdXJjZUZhY3RvcnkoKTsKIAogICBAb3ZlcnJpZGUKLSAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworICBkeW5hbWljIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKIH0KIAogY2xhc3MgX01vY2tBbmFseXNpc1Nlc3Npb24gaW1wbGVtZW50cyBBbmFseXNpc1Nlc3Npb25JbXBsIHsKQEAgLTQ5LDcgKzQ3LDcgQEAKICAgZmluYWwgQ2xhc3NIaWVyYXJjaHkgY2xhc3NIaWVyYXJjaHkgPSBDbGFzc0hpZXJhcmNoeSgpOwogCiAgIEBvdmVycmlkZQotICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CisgIGR5bmFtaWMgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQogCiBjbGFzcyBfTW9ja1NvdXJjZSBpbXBsZW1lbnRzIFNvdXJjZSB7CkBAIC02NSw3ICs2Myw3IEBACiAgIFN0cmluZyBnZXQgZnVsbE5hbWUgPT4gdXJpLnBhdGg7CiAKICAgQG92ZXJyaWRlCi0gIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKKyAgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CiB9CiAKIGNsYXNzIF9Nb2NrU291cmNlRmFjdG9yeSBpbXBsZW1lbnRzIFNvdXJjZUZhY3RvcnkgewpAQCAtNzYsNSArNzQsNSBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKKyAgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy90b2tlbl9mYWN0b3J5LmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy90b2tlbl9mYWN0b3J5LmRhcnQKaW5kZXggNGYxMGRmZS4uNzFkYWJjNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvdG9rZW5fZmFjdG9yeS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL3Rva2VuX2ZhY3RvcnkuZGFydApAQCAtNSw5ICs1LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC90b2tlbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvdG9rZW4uZGFydCc7CiAKLS8qKgotICogQSBzZXQgb2YgdXRpbGl0eSBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHRva2Vucy4KLSAqLworLy8vIEEgc2V0IG9mIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSB0b2tlbnMuCiBjbGFzcyBUb2tlbkZhY3RvcnkgewogICBzdGF0aWMgVG9rZW4gdG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkIGtleXdvcmQpID0+IEtleXdvcmRUb2tlbihrZXl3b3JkLCAwKTsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3RpbWVzdGFtcGVkX2RhdGEuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90aW1lc3RhbXBlZF9kYXRhLmRhcnQKaW5kZXggNzA4NGNiZC4uNWZhOGIzNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3RpbWVzdGFtcGVkX2RhdGEuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGltZXN0YW1wZWRfZGF0YS5kYXJ0CkBAIC0yLDIzICsyLDE1IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLyoqCi0gKiBBbmFseXNpcyBkYXRhIGZvciB3aGljaCB3ZSBoYXZlIGEgbW9kaWZpY2F0aW9uIHRpbWUuCi0gKi8KKy8vLyBBbmFseXNpcyBkYXRhIGZvciB3aGljaCB3ZSBoYXZlIGEgbW9kaWZpY2F0aW9uIHRpbWUuCiBjbGFzcyBUaW1lc3RhbXBlZERhdGE8RT4gewotICAvKioKLSAgICogVGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBzb3VyY2UgZnJvbSB3aGljaCB0aGUgZGF0YSB3YXMgY3JlYXRlZC4KLSAgICovCisgIC8vLyBUaGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBkYXRhIHdhcyBjcmVhdGVkLgogICBmaW5hbCBpbnQgbW9kaWZpY2F0aW9uVGltZTsKIAotICAvKioKLSAgICogVGhlIGRhdGEgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIHRoZSBzb3VyY2UuCi0gICAqLworICAvLy8gVGhlIGRhdGEgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIHRoZSBzb3VyY2UuCiAgIGZpbmFsIEUgZGF0YTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgaG9sZGVyIHRvIGFzc29jaWF0ZSB0aGUgZ2l2ZW4gW2RhdGFdIHdpdGggdGhlCi0gICAqIGdpdmVuIFttb2RpZmljYXRpb25UaW1lXS4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBob2xkZXIgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBbZGF0YV0gd2l0aCB0aGUKKyAgLy8vIGdpdmVuIFttb2RpZmljYXRpb25UaW1lXS4KICAgVGltZXN0YW1wZWREYXRhKHRoaXMubW9kaWZpY2F0aW9uVGltZSwgdGhpcy5kYXRhKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90eXBlX3Byb21vdGlvbl9tYW5hZ2VyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdHlwZV9wcm9tb3Rpb25fbWFuYWdlci5kYXJ0CmluZGV4IGE2YmExOWQuLjJlZDRkM2UgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90eXBlX3Byb21vdGlvbl9tYW5hZ2VyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3R5cGVfcHJvbW90aW9uX21hbmFnZXIuZGFydApAQCAtOCw3ICs4LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdmFyaWFibGVfdHlwZV9wcm92aWRlci5kYXJ0JzsKIAogLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYFR5cGVQcm9tb3Rpb25NYW5hZ2VyYCBtYW5hZ2UgdGhlIGFiaWxpdHkgdG8gcHJvbW90ZQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydAppbmRleCA3ZmQzMWM4Li5jNDU3NDIwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydApAQCAtMiwxNTU0ICsyLDcgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi1pbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CitARGVwcmVjYXRlZCgiVXNlIHBhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0IGluc3RlYWQiKQorbGlicmFyeSB0eXBlX3N5c3RlbV9nZW5lcmF0ZWQ7CiAKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC9hc3QuZGFydCcgc2hvdyBBc3ROb2RlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYXN0L3Rva2VuLmRhcnQnIHNob3cgVG9rZW5UeXBlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9udWxsX3NhZmV0eV91bmRlcnN0YW5kaW5nX2ZsYWcuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L251bGxhYmlsaXR5X3N1ZmZpeC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCcgYXMgcHVibGljOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2xpc3RlbmVyLmRhcnQnIHNob3cgRXJyb3JSZXBvcnRlcjsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9nZW5lcmljX2luZmVycmVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZ3JlYXRlc3RfbG93ZXJfYm91bmQuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9sZWFzdF91cHBlcl9ib3VuZC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L25vcm1hbGl6ZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L251bGxhYmlsaXR5X2VsaW1pbmF0b3IuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9ydW50aW1lX3R5cGVfZXF1YWxpdHkuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9zdWJ0eXBlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdG9wX21lcmdlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc2NoZW1hLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zY2hlbWFfZWxpbWluYXRpb24uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgYFR5cGVTeXN0ZW1gIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIGFuIG9iamVjdCByZXByZXNlbnRpbmcKLSAqIHRoZSB0eXBlIHN5c3RlbS4gIFRoaXMgcHJvdmlkZXMgYSBjb21tb24gbG9jYXRpb24gdG8gcHV0IG1ldGhvZHMgdGhhdCBhY3Qgb24KLSAqIHR5cGVzIGJ1dCBtYXkgbmVlZCBhY2Nlc3MgdG8gbW9yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzLCBhbmQgaXQgcGF2ZXMgdGhlCi0gKiB3YXkgZm9yIGEgcG9zc2libGUgZnV0dXJlIHdoZXJlIHdlIG1heSB3aXNoIHRvIG1ha2UgdGhlIHR5cGUgc3lzdGVtCi0gKiBwbHVnZ2FibGUuCi0gKi8KLS8vIFRPRE8oYnJpYW53aWxrZXJzb24pIFJlbmFtZSB0aGlzIGNsYXNzIHRvIFR5cGVTeXN0ZW1JbXBsLgotYWJzdHJhY3QgY2xhc3MgVHlwZVN5c3RlbSBpbXBsZW1lbnRzIHB1YmxpYy5UeXBlU3lzdGVtIHsKLSAgLy8vIElmIGB0cnVlYCwgdGhlbiBOTkJEIHR5cGUgcnVsZXMgc2hvdWxkIGJlIHVzZWQuCi0gIC8vLyBJZiBgZmFsc2VgLCB0aGVuIGxlZ2FjeSB0eXBlIHJ1bGVzIHNob3VsZCBiZSB1c2VkLgotICBmaW5hbCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQ7Ci0KLSAgVHlwZVN5c3RlbSh7QHJlcXVpcmVkIHRoaXMuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdH0pOwotCi0gIC8qKgotICAgKiBUaGUgcHJvdmlkZXIgb2YgdHlwZXMgZm9yIHRoZSBzeXN0ZW0KLSAgICovCi0gIFR5cGVQcm92aWRlciBnZXQgdHlwZVByb3ZpZGVyOwotCi0gIEBvdmVycmlkZQotICBUeXBlSW1wbCBmbGF0dGVuKERhcnRUeXBlIHR5cGUpIHsKLSAgICBpZiAoaWRlbnRpY2FsKHR5cGUsIFVua25vd25JbmZlcnJlZFR5cGUuaW5zdGFuY2UpKSB7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvLyBpZiBUIGlzIFM/IHRoZW4gZmxhdHRlbihUKSA9IGZsYXR0ZW4oUyk/Ci0gICAgLy8gaWYgVCBpcyBTKiB0aGVuIGZsYXR0ZW4oVCkgPSBmbGF0dGVuKFMpKgotICAgIE51bGxhYmlsaXR5U3VmZml4IG51bGxhYmlsaXR5U3VmZml4ID0gdHlwZS5udWxsYWJpbGl0eVN1ZmZpeDsKLSAgICBpZiAobnVsbGFiaWxpdHlTdWZmaXggIT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSkgewotICAgICAgdmFyIFMgPSAodHlwZSBhcyBUeXBlSW1wbCkud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgcmV0dXJuIGZsYXR0ZW4oUykud2l0aE51bGxhYmlsaXR5KG51bGxhYmlsaXR5U3VmZml4KTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7Ci0gICAgICAvLyBJbXBsZW1lbnQgdGhlIGNhc2VzOgotICAgICAgLy8gIC0gIklmIFQgPSBGdXR1cmVPcjxTPiB0aGVuIGZsYXR0ZW4oVCkgPSBTLiIKLSAgICAgIC8vICAtICJJZiBUID0gRnV0dXJlPFM+IHRoZW4gZmxhdHRlbihUKSA9IFMuIgotICAgICAgaWYgKHR5cGUuaXNEYXJ0QXN5bmNGdXR1cmVPciB8fCB0eXBlLmlzRGFydEFzeW5jRnV0dXJlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLnR5cGVBcmd1bWVudHMuaXNOb3RFbXB0eQotICAgICAgICAgICAgPyB0eXBlLnR5cGVBcmd1bWVudHNbMF0KLSAgICAgICAgICAgIDogRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlOwotICAgICAgfQotICAgICAgLy8gSW1wbGVtZW50IHRoZSBjYXNlOiAiT3RoZXJ3aXNlIGlmIFQgPDogRnV0dXJlIHRoZW4gbGV0IFMgYmUgYSB0eXBlCi0gICAgICAvLyBzdWNoIHRoYXQgVCA8PCBGdXR1cmU8Uz4gYW5kIGZvciBhbGwgUiwgaWYgVCA8PCBGdXR1cmU8Uj4gdGhlbiBTIDw8IFIuCi0gICAgICAvLyBUaGVuIGZsYXR0ZW4oVCkgPSBTLiIKLSAgICAgIC8vCi0gICAgICAvLyBJbiBvdGhlciB3b3JkcywgZ2l2ZW4gdGhlIHNldCBvZiBhbGwgdHlwZXMgUiBzdWNoIHRoYXQgVCA8PCBGdXR1cmU8Uj4sCi0gICAgICAvLyBsZXQgUyBiZSB0aGUgbW9zdCBzcGVjaWZpYyBvZiB0aG9zZSB0eXBlcywgaWYgYW55IHN1Y2ggUyBleGlzdHMuCi0gICAgICAvLwotICAgICAgLy8gU2luY2Ugd2Ugb25seSBjYXJlIGFib3V0IHRoZSBtb3N0IHNwZWNpZmljIHR5cGUsIGl0IGlzIHN1ZmZpY2llbnQgdG8KLSAgICAgIC8vIGxvb2sgYXQgdGhlIHR5cGVzIGFwcGVhcmluZyBhcyBhIHBhcmFtZXRlciB0byBGdXR1cmUgaW4gdGhlIHR5cGUKLSAgICAgIC8vIGhpZXJhcmNoeSBvZiBULiAgV2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciB0aGUgc3VwZXJ0eXBlcyBvZiB0aG9zZQotICAgICAgLy8gdHlwZXMsIHNpbmNlIHRoZXkgYXJlIGJ5IGRlZmluaXRpb24gbGVzcyBzcGVjaWZpYy4KLSAgICAgIExpc3Q8RGFydFR5cGU+IGNhbmRpZGF0ZVR5cGVzID0KLSAgICAgICAgICBfc2VhcmNoVHlwZUhpZXJhcmNoeUZvckZ1dHVyZVR5cGVQYXJhbWV0ZXJzKHR5cGUpOwotICAgICAgRGFydFR5cGUgZmxhdHRlblJlc3VsdCA9Ci0gICAgICAgICAgSW50ZXJmYWNlVHlwZUltcGwuZmluZE1vc3RTcGVjaWZpY1R5cGUoY2FuZGlkYXRlVHlwZXMsIHRoaXMpOwotICAgICAgaWYgKGZsYXR0ZW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZmxhdHRlblJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSW1wbGVtZW50IHRoZSBjYXNlOiAiSW4gYW55IG90aGVyIGNpcmN1bXN0YW5jZSwgZmxhdHRlbihUKSA9IFQuIgotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgTGlzdDxJbnRlcmZhY2VUeXBlPiBnYXRoZXJNaXhpblN1cGVydHlwZUNvbnN0cmFpbnRzRm9ySW5mZXJlbmNlKAotICAgICAgQ2xhc3NFbGVtZW50IG1peGluRWxlbWVudCkgewotICAgIExpc3Q8SW50ZXJmYWNlVHlwZT4gY2FuZGlkYXRlczsKLSAgICBpZiAobWl4aW5FbGVtZW50LmlzTWl4aW4pIHsKLSAgICAgIGNhbmRpZGF0ZXMgPSBtaXhpbkVsZW1lbnQuc3VwZXJjbGFzc0NvbnN0cmFpbnRzOwotICAgIH0gZWxzZSB7Ci0gICAgICBjYW5kaWRhdGVzID0gW21peGluRWxlbWVudC5zdXBlcnR5cGVdOwotICAgICAgY2FuZGlkYXRlcy5hZGRBbGwobWl4aW5FbGVtZW50Lm1peGlucyk7Ci0gICAgICBpZiAobWl4aW5FbGVtZW50LmlzTWl4aW5BcHBsaWNhdGlvbikgewotICAgICAgICBjYW5kaWRhdGVzLnJlbW92ZUxhc3QoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNhbmRpZGF0ZXMKLSAgICAgICAgLndoZXJlKCh0eXBlKSA9PiB0eXBlLmVsZW1lbnQudHlwZVBhcmFtZXRlcnMuaXNOb3RFbXB0eSkKLSAgICAgICAgLnRvTGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIG9mIHR3byB0eXBlcy4KLSAgICovCi0gIERhcnRUeXBlIGdldExlYXN0VXBwZXJCb3VuZChEYXJ0VHlwZSB0eXBlMSwgRGFydFR5cGUgdHlwZTIpOwotCi0gIC8qKgotICAgKiBHaXZlbiBhIFtEYXJ0VHlwZV0gW3R5cGVdLCBpbnN0YW50aWF0ZSBpdCB3aXRoIGl0cyBib3VuZHMuCi0gICAqCi0gICAqIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uIHRoZSB0eXBlIHN5c3RlbSwgZm9yIGV4YW1wbGUsIGluCi0gICAqIGNsYXNzaWMgRGFydCBgZHluYW1pY2Agd2lsbCBiZSB1c2VkIGZvciBhbGwgdHlwZSBhcmd1bWVudHMsIHdoZXJlYXMKLSAgICogc3Ryb25nIG1vZGUgcHJlZmVycyB0aGUgYWN0dWFsIGJvdW5kIHR5cGUgaWYgaXQgd2FzIHNwZWNpZmllZC4KLSAgICovCi0gIERhcnRUeXBlIGluc3RhbnRpYXRlVG9Cb3VuZHMoRGFydFR5cGUgdHlwZSwge0xpc3Q8Ym9vbD4gaGFzRXJyb3J9KTsKLQotICAvKioKLSAgICogR2l2ZW4gYSBbRGFydFR5cGVdIFt0eXBlXSBhbmQgYSBsaXN0IG9mIHR5cGVzCi0gICAqIFt0eXBlQXJndW1lbnRzXSwgaW5zdGFudGlhdGUgdGhlIHR5cGUgZm9ybWFscyB3aXRoIHRoZQotICAgKiBwcm92aWRlZCBhY3R1YWxzLiAgSWYgW3R5cGVdIGlzIG5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSwKLSAgICogbm8gaW5zdGFudGlhdGlvbiBpcyBkb25lLgotICAgKi8KLSAgRGFydFR5cGUgaW5zdGFudGlhdGVUeXBlKERhcnRUeXBlIHR5cGUsIExpc3Q8RGFydFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKLSAgICBpZiAodHlwZSBpcyBGdW5jdGlvblR5cGUpIHsKLSAgICAgIHJldHVybiB0eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOwotICAgIH0gZWxzZSBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlSW1wbCkgewotICAgICAgLy8gVE9ETyhzY2hlZ2xvdikgVXNlIGBDbGFzc0VsZW1lbnQuaW5zdGFudGlhdGUoKWAsIGRvbid0IHVzZSByYXcgdHlwZXMuCi0gICAgICByZXR1cm4gdHlwZS5lbGVtZW50Lmluc3RhbnRpYXRlKAotICAgICAgICB0eXBlQXJndW1lbnRzOiB0eXBlQXJndW1lbnRzLAotICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogdHlwZS5udWxsYWJpbGl0eVN1ZmZpeCwKLSAgICAgICk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1bmluc3RhbnRpYXRlZCBbdHlwZUZvcm1hbHNdLCBpbnN0YW50aWF0ZSB0aGVtIHRvIHRoZWlyIGJvdW5kcy4KLSAgICovCi0gIExpc3Q8RGFydFR5cGU+IGluc3RhbnRpYXRlVHlwZUZvcm1hbHNUb0JvdW5kcygKLSAgICAgIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IHR5cGVGb3JtYWxzLAotICAgICAge0xpc3Q8Ym9vbD4gaGFzRXJyb3J9KTsKLQotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2xlZnRUeXBlXSBpcyBhc3NpZ25hYmxlIHRvIHRoZSBbcmlnaHRUeXBlXSAodGhhdCBpcywKLSAgICogaWYgbGVmdFR5cGUgPD09PiByaWdodFR5cGUpLgotICAgKi8KLSAgQG92ZXJyaWRlCi0gIGJvb2wgaXNBc3NpZ25hYmxlVG8oRGFydFR5cGUgbGVmdFR5cGUsIERhcnRUeXBlIHJpZ2h0VHlwZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtsZWZ0VHlwZV0gaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHRoZSBbcmlnaHRUeXBlXQotICAgKiAodGhhdCBpcywgaWYgbGVmdFR5cGUgPDwgcmlnaHRUeXBlKSwgYXMgZGVmaW5lZCBpbiB0aGUgRGFydCBsYW5ndWFnZSBzcGVjLgotICAgKgotICAgKiBJbiBzdHJvbmcgbW9kZSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIFtpc1N1YnR5cGVPZl0uCi0gICAqLwotICBARGVwcmVjYXRlZCgnVXNlIGlzU3VidHlwZU9mKCkgaW5zdGVhZC4nKQotICBib29sIGlzTW9yZVNwZWNpZmljVGhhbihEYXJ0VHlwZSBsZWZ0VHlwZSwgRGFydFR5cGUgcmlnaHRUeXBlKTsKLQotICBAb3ZlcnJpZGUKLSAgYm9vbCBpc05vbk51bGxhYmxlKERhcnRUeXBlIHR5cGUpIHsKLSAgICBpZiAodHlwZS5pc0R5bmFtaWMgfHwgdHlwZS5pc1ZvaWQgfHwgdHlwZS5pc0RhcnRDb3JlTnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAodHlwZS5udWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAodHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICByZXR1cm4gaXNOb25OdWxsYWJsZSgodHlwZSBhcyBJbnRlcmZhY2VUeXBlKS50eXBlQXJndW1lbnRzWzBdKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKLSAgICAgIHJldHVybiBpc05vbk51bGxhYmxlKHR5cGUuYm91bmQpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBvdmVycmlkZQotICBib29sIGlzTnVsbGFibGUoRGFydFR5cGUgdHlwZSkgewotICAgIGlmICh0eXBlLmlzRHluYW1pYyB8fCB0eXBlLmlzVm9pZCB8fCB0eXBlLmlzRGFydENvcmVOdWxsKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHR5cGUubnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAodHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICByZXR1cm4gaXNOdWxsYWJsZSgodHlwZSBhcyBJbnRlcmZhY2VUeXBlKS50eXBlQXJndW1lbnRzWzBdKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQG92ZXJyaWRlCi0gIGJvb2wgaXNQb3RlbnRpYWxseU5vbk51bGxhYmxlKERhcnRUeXBlIHR5cGUpID0+ICFpc051bGxhYmxlKHR5cGUpOwotCi0gIEBvdmVycmlkZQotICBib29sIGlzUG90ZW50aWFsbHlOdWxsYWJsZShEYXJ0VHlwZSB0eXBlKSA9PiAhaXNOb25OdWxsYWJsZSh0eXBlKTsKLQotICBAb3ZlcnJpZGUKLSAgYm9vbCBpc1N0cmljdGx5Tm9uTnVsbGFibGUoRGFydFR5cGUgdHlwZSkgewotICAgIGlmICh0eXBlLmlzRHluYW1pYyB8fCB0eXBlLmlzVm9pZCB8fCB0eXBlLmlzRGFydENvcmVOdWxsKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmICh0eXBlLm51bGxhYmlsaXR5U3VmZml4ICE9IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmlzRGFydEFzeW5jRnV0dXJlT3IpIHsKLSAgICAgIHJldHVybiBpc1N0cmljdGx5Tm9uTnVsbGFibGUodHlwZS50eXBlQXJndW1lbnRzWzBdKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKLSAgICAgIHJldHVybiBpc1N0cmljdGx5Tm9uTnVsbGFibGUodHlwZS5ib3VuZCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIFtsZWZ0VHlwZV0gaXMgYSBzdWJ0eXBlIG9mIHRoZSBbcmlnaHRUeXBlXSAodGhhdCBpcywKLSAgICogaWYgbGVmdFR5cGUgPDogcmlnaHRUeXBlKS4KLSAgICovCi0gIEBvdmVycmlkZQotICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIGxlZnRUeXBlLCBEYXJ0VHlwZSByaWdodFR5cGUpOwotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSBsZWFzdFVwcGVyQm91bmQoRGFydFR5cGUgbGVmdFR5cGUsIERhcnRUeXBlIHJpZ2h0VHlwZSkgewotICAgIGlmICghTnVsbFNhZmV0eVVuZGVyc3RhbmRpbmdGbGFnLmlzRW5hYmxlZCkgewotICAgICAgbGVmdFR5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIGxlZnRUeXBlKTsKLSAgICAgIHJpZ2h0VHlwZSA9IE51bGxhYmlsaXR5RWxpbWluYXRvci5wZXJmb3JtKHR5cGVQcm92aWRlciwgcmlnaHRUeXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldExlYXN0VXBwZXJCb3VuZChsZWZ0VHlwZSwgcmlnaHRUeXBlKTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIGEgbnVsbGFibGUgdmVyc2lvbiBvZiBbdHlwZV0uICBUaGUgcmVzdWx0IHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8KLSAgLy8vIHRoZSB1bmlvbiBgdHlwZSB8IE51bGxgIChpZiB3ZSBzdXBwb3J0ZWQgdW5pb24gdHlwZXMpLgotICBEYXJ0VHlwZSBtYWtlTnVsbGFibGUoVHlwZUltcGwgdHlwZSkgewotICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogaGFuZGxlIHR5cGUgcGFyYW1ldGVyIHR5cGVzCi0gICAgcmV0dXJuIHR5cGUud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uKTsKLSAgfQotCi0gIC8vLyBBdHRlbXB0cyB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBzdWJzdGl0dXRpb24gZm9yIHRoZSBbbWl4aW5FbGVtZW50XQotICAvLy8gdHlwZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gW3NyY1R5cGVzXSB0byBtYWtlIGl0IGVxdWFsIHRvCi0gIC8vLyBbZGVzdFR5cGVzXS4gIElmIG5vIHN1Y2ggc3Vic3RpdHV0aW9uIGNhbiBiZSBmb3VuZCwgYG51bGxgIGlzIHJldHVybmVkLgotICBMaXN0PERhcnRUeXBlPiBtYXRjaFN1cGVydHlwZUNvbnN0cmFpbnRzKAotICAgIENsYXNzRWxlbWVudCBtaXhpbkVsZW1lbnQsCi0gICAgTGlzdDxEYXJ0VHlwZT4gc3JjVHlwZXMsCi0gICAgTGlzdDxEYXJ0VHlwZT4gZGVzdFR5cGVzLAotICApIHsKLSAgICB2YXIgdHlwZVBhcmFtZXRlcnMgPSBtaXhpbkVsZW1lbnQudHlwZVBhcmFtZXRlcnM7Ci0gICAgdmFyIGluZmVycmVyID0gR2VuZXJpY0luZmVycmVyKHRoaXMsIHR5cGVQYXJhbWV0ZXJzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyY1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbmZlcnJlci5jb25zdHJhaW5SZXR1cm5UeXBlKHNyY1R5cGVzW2ldLCBkZXN0VHlwZXNbaV0pOwotICAgICAgaW5mZXJyZXIuY29uc3RyYWluUmV0dXJuVHlwZShkZXN0VHlwZXNbaV0sIHNyY1R5cGVzW2ldKTsKLSAgICB9Ci0KLSAgICB2YXIgaW5mZXJyZWRUeXBlcyA9IGluZmVycmVyLmluZmVyKAotICAgICAgdHlwZVBhcmFtZXRlcnMsCi0gICAgICBjb25zaWRlckV4dGVuZHNDbGF1c2U6IGZhbHNlLAotICAgICk7Ci0gICAgdmFyIHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5mcm9tUGFpcnModHlwZVBhcmFtZXRlcnMsIGluZmVycmVkVHlwZXMpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShzcmNUeXBlc1tpXSkgIT0gZGVzdFR5cGVzW2ldKSB7Ci0gICAgICAgIC8vIEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIHN1YnN0aXR1dGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW5mZXJyZWRUeXBlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2hlcyB0aGUgc3VwZXJpbnRlcmZhY2VzIG9mIFt0eXBlXSBmb3IgaW1wbGVtZW50YXRpb25zIG9mIFtnZW5lcmljVHlwZV0KLSAgICogYW5kIHJldHVybnMgdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZSBhcmd1bWVudCB1c2VkIGZvciB0aGF0IGdlbmVyaWMgdHlwZS4KLSAgICoKLSAgICogRm9yIGEgbW9yZSBnZW5lcmFsL3JvYnVzdCBzb2x1dGlvbiwgdXNlIFtJbnRlcmZhY2VUeXBlSW1wbC5hc0luc3RhbmNlT2ZdLgotICAgKgotICAgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gW3R5cGVdIGBMaXN0PGludD5gIGFuZCBbZ2VuZXJpY1R5cGVdIGBJdGVyYWJsZTxUPmAsCi0gICAqIHJldHVybnMgW2ludF0uCi0gICAqCi0gICAqIFJldHVybnMgYG51bGxgIGlmIFt0eXBlXSBkb2VzIG5vdCBpbXBsZW1lbnQgW2dlbmVyaWNUeXBlXS4KLSAgICovCi0gIERhcnRUeXBlIG1vc3RTcGVjaWZpY1R5cGVBcmd1bWVudChEYXJ0VHlwZSB0eXBlLCBEYXJ0VHlwZSBnZW5lcmljVHlwZSkgewotICAgIGlmICh0eXBlIGlzISBJbnRlcmZhY2VUeXBlKSByZXR1cm4gbnVsbDsKLSAgICBpZiAoZ2VuZXJpY1R5cGUgaXMhIEludGVyZmFjZVR5cGUpIHJldHVybiBudWxsOwotCi0gICAgdmFyIGFzSW5zdGFuY2VPZiA9ICh0eXBlIGFzIEludGVyZmFjZVR5cGVJbXBsKQotICAgICAgICAuYXNJbnN0YW5jZU9mKChnZW5lcmljVHlwZSBhcyBJbnRlcmZhY2VUeXBlKS5lbGVtZW50KTsKLQotICAgIGlmIChhc0luc3RhbmNlT2YgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGFzSW5zdGFuY2VPZi50eXBlQXJndW1lbnRzWzBdOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBub24tbnVsbGFibGUgdmVyc2lvbiBvZiBbdHlwZV0uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gIC8vLyBvcGVyYXRpb24gYE5vbk51bGxgIGRlZmluZWQgaW4gdGhlIHNwZWMuCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSBwcm9tb3RlVG9Ob25OdWxsKERhcnRUeXBlIHR5cGUpIHsKLSAgICBpZiAodHlwZS5pc0RhcnRDb3JlTnVsbCkgcmV0dXJuIE5ldmVyVHlwZUltcGwuaW5zdGFuY2U7Ci0KLSAgICBpZiAodHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZUltcGwpIHsKLSAgICAgIHZhciBlbGVtZW50ID0gdHlwZS5lbGVtZW50OwotCi0gICAgICAvLyBOb25OdWxsKFggJiBUKSA9IFggJiBOb25OdWxsKFQpCi0gICAgICBpZiAodHlwZS5wcm9tb3RlZEJvdW5kICE9IG51bGwpIHsKLSAgICAgICAgdmFyIHByb21vdGVkQm91bmQgPSBwcm9tb3RlVG9Ob25OdWxsKHR5cGUucHJvbW90ZWRCb3VuZCk7Ci0gICAgICAgIHJldHVybiBUeXBlUGFyYW1ldGVyVHlwZUltcGwoCi0gICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKLSAgICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogTnVsbGFiaWxpdHlTdWZmaXgubm9uZSwKLSAgICAgICAgICBwcm9tb3RlZEJvdW5kOiBwcm9tb3RlZEJvdW5kLAotICAgICAgICApOwotICAgICAgfQotCi0gICAgICAvLyBOb25OdWxsKFgpID0gWCAmIE5vbk51bGwoQiksIHdoZXJlIEIgaXMgdGhlIGJvdW5kIG9mIFgKLSAgICAgIHZhciBwcm9tb3RlZEJvdW5kID0gZWxlbWVudC5ib3VuZCAhPSBudWxsCi0gICAgICAgICAgPyBwcm9tb3RlVG9Ob25OdWxsKGVsZW1lbnQuYm91bmQpCi0gICAgICAgICAgOiB0eXBlUHJvdmlkZXIub2JqZWN0VHlwZTsKLSAgICAgIGlmIChpZGVudGljYWwocHJvbW90ZWRCb3VuZCwgZWxlbWVudC5ib3VuZCkpIHsKLSAgICAgICAgcHJvbW90ZWRCb3VuZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gVHlwZVBhcmFtZXRlclR5cGVJbXBsKAotICAgICAgICBlbGVtZW50OiBlbGVtZW50LAotICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeDogTnVsbGFiaWxpdHlTdWZmaXgubm9uZSwKLSAgICAgICAgcHJvbW90ZWRCb3VuZDogcHJvbW90ZWRCb3VuZCwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh0eXBlIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgYmluYXJ5IGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gW29wZXJhdG9yXSB3aG9zZQotICAgKiBsZWZ0IG9wZXJhbmQgaGFzIHRoZSB0eXBlIFtsZWZ0VHlwZV0gYW5kIHdob3NlIHJpZ2h0IG9wZXJhbmQgaGFzIHRoZSB0eXBlCi0gICAqIFtyaWdodFR5cGVdLCBnaXZlbiB0aGF0IHJlc29sdXRpb24gaGFzIHNvIGZhciBwcm9kdWNlZCB0aGUgW2N1cnJlbnRUeXBlXS4KLSAgICovCi0gIERhcnRUeXBlIHJlZmluZUJpbmFyeUV4cHJlc3Npb25UeXBlKERhcnRUeXBlIGxlZnRUeXBlLCBUb2tlblR5cGUgb3BlcmF0b3IsCi0gICAgICBEYXJ0VHlwZSByaWdodFR5cGUsIERhcnRUeXBlIGN1cnJlbnRUeXBlKSB7Ci0gICAgLy8gYm9vbAotICAgIGlmIChvcGVyYXRvciA9PSBUb2tlblR5cGUuQU1QRVJTQU5EX0FNUEVSU0FORCB8fAotICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuQkFSX0JBUiB8fAotICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuRVFfRVEgfHwKLSAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLkJBTkdfRVEpIHsKLSAgICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgICAgIHJldHVybiBwcm9tb3RlVG9Ob25OdWxsKHR5cGVQcm92aWRlci5ib29sVHlwZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHlwZVByb3ZpZGVyLmJvb2xUeXBlOwotICAgIH0KLSAgICBpZiAobGVmdFR5cGUuaXNEYXJ0Q29yZUludCkgewotICAgICAgLy8gaW50IG9wIGRvdWJsZQotICAgICAgaWYgKG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VUyB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QRVJDRU5UIHx8Ci0gICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVMgfHwKLSAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUiB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VU19FUSB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QRVJDRU5UX0VRIHx8Ci0gICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVNfRVEgfHwKLSAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUl9FUSkgewotICAgICAgICBpZiAocmlnaHRUeXBlLmlzRGFydENvcmVEb3VibGUpIHsKLSAgICAgICAgICBJbnRlcmZhY2VUeXBlSW1wbCBkb3VibGVUeXBlID0gdHlwZVByb3ZpZGVyLmRvdWJsZVR5cGU7Ci0gICAgICAgICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9tb3RlVG9Ob25OdWxsKGRvdWJsZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gZG91YmxlVHlwZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gaW50IG9wIGludAotICAgICAgaWYgKG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VUyB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QRVJDRU5UIHx8Ci0gICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVMgfHwKLSAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUiB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5USUxERV9TTEFTSCB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VU19FUSB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QRVJDRU5UX0VRIHx8Ci0gICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVNfRVEgfHwKLSAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUl9FUSB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5USUxERV9TTEFTSF9FUSB8fAotICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QTFVTX1BMVVMgfHwKLSAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuTUlOVVNfTUlOVVMpIHsKLSAgICAgICAgaWYgKHJpZ2h0VHlwZS5pc0RhcnRDb3JlSW50KSB7Ci0gICAgICAgICAgSW50ZXJmYWNlVHlwZUltcGwgaW50VHlwZSA9IHR5cGVQcm92aWRlci5pbnRUeXBlOwotICAgICAgICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvbW90ZVRvTm9uTnVsbChpbnRUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGludFR5cGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZGVmYXVsdAotICAgIHJldHVybiBjdXJyZW50VHlwZTsKLSAgfQotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSByZXNvbHZlVG9Cb3VuZChEYXJ0VHlwZSB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGVJbXBsKSB7Ci0gICAgICB2YXIgZWxlbWVudCA9IHR5cGUuZWxlbWVudDsKLQotICAgICAgdmFyIGJvdW5kID0gZWxlbWVudC5ib3VuZDsKLSAgICAgIGlmIChib3VuZCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiB0eXBlUHJvdmlkZXIub2JqZWN0VHlwZTsKLSAgICAgIH0KLQotICAgICAgTnVsbGFiaWxpdHlTdWZmaXggbnVsbGFiaWxpdHlTdWZmaXggPSB0eXBlLm51bGxhYmlsaXR5U3VmZml4OwotICAgICAgTnVsbGFiaWxpdHlTdWZmaXggbmV3TnVsbGFiaWxpdHlTdWZmaXg7Ci0gICAgICBpZiAobnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24gfHwKLSAgICAgICAgICBib3VuZC5udWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgewotICAgICAgICBuZXdOdWxsYWJpbGl0eVN1ZmZpeCA9IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uOwotICAgICAgfSBlbHNlIGlmIChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyIHx8Ci0gICAgICAgICAgYm91bmQubnVsbGFiaWxpdHlTdWZmaXggPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcikgewotICAgICAgICBuZXdOdWxsYWJpbGl0eVN1ZmZpeCA9IE51bGxhYmlsaXR5U3VmZml4LnN0YXI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuZXdOdWxsYWJpbGl0eVN1ZmZpeCA9IE51bGxhYmlsaXR5U3VmZml4Lm5vbmU7Ci0gICAgICB9Ci0KLSAgICAgIHZhciByZXNvbHZlZCA9IHJlc29sdmVUb0JvdW5kKGJvdW5kKSBhcyBUeXBlSW1wbDsKLSAgICAgIHJldHVybiByZXNvbHZlZC53aXRoTnVsbGFiaWxpdHkobmV3TnVsbGFiaWxpdHlTdWZmaXgpOwotICAgIH0KLQotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyaWVzIHRvIHByb21vdGUgZnJvbSB0aGUgZmlyc3QgdHlwZSBmcm9tIHRoZSBzZWNvbmQgdHlwZSwgYW5kIHJldHVybnMgdGhlCi0gICAqIHByb21vdGVkIHR5cGUgaWYgaXQgc3VjY2VlZHMsIG90aGVyd2lzZSBudWxsLgotICAgKi8KLSAgRGFydFR5cGUgdHJ5UHJvbW90ZVRvVHlwZShEYXJ0VHlwZSB0bywgRGFydFR5cGUgZnJvbSk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgW0RhcnRUeXBlXSB0eXBlLCByZXR1cm4gdGhlIFtUeXBlUGFyYW1ldGVyRWxlbWVudF1zIGNvcnJlc3BvbmRpbmcKLSAgICogdG8gaXRzIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHdob3NlIHR5cGUgYXJndW1lbnRzIGFyZSB0byBiZSByZXR1cm5lZAotICAgKiBAcmV0dXJuIHRoZSB0eXBlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHR5cGUKLSAgICovCi0gIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IHR5cGVGb3JtYWxzQXNFbGVtZW50cyhEYXJ0VHlwZSB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7Ci0gICAgICByZXR1cm4gdHlwZS50eXBlRm9ybWFsczsKLSAgICB9IGVsc2UgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewotICAgICAgcmV0dXJuIHR5cGUuZWxlbWVudC50eXBlUGFyYW1ldGVyczsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNvbnN0IDxUeXBlUGFyYW1ldGVyRWxlbWVudD5bXTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gW3R5cGVdLCBzZWFyY2ggaXRzIGNsYXNzIGhpZXJhcmNoeSBmb3IgdHlwZXMgb2YgdGhlCi0gICAqIGZvcm0gRnV0dXJlPFI+LCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGUgcmVzdWx0aW5nIFIncy4KLSAgICovCi0gIExpc3Q8RGFydFR5cGU+IF9zZWFyY2hUeXBlSGllcmFyY2h5Rm9yRnV0dXJlVHlwZVBhcmFtZXRlcnMoRGFydFR5cGUgdHlwZSkgewotICAgIExpc3Q8RGFydFR5cGU+IHJlc3VsdCA9IDxEYXJ0VHlwZT5bXTsKLSAgICBIYXNoU2V0PENsYXNzRWxlbWVudD4gdmlzaXRlZENsYXNzZXMgPSBIYXNoU2V0PENsYXNzRWxlbWVudD4oKTsKLSAgICB2b2lkIHJlY3Vyc2UoSW50ZXJmYWNlVHlwZUltcGwgdHlwZSkgewotICAgICAgaWYgKHR5cGUuaXNEYXJ0QXN5bmNGdXR1cmUgJiYgdHlwZS50eXBlQXJndW1lbnRzLmlzTm90RW1wdHkpIHsKLSAgICAgICAgcmVzdWx0LmFkZCh0eXBlLnR5cGVBcmd1bWVudHNbMF0pOwotICAgICAgfQotICAgICAgaWYgKHZpc2l0ZWRDbGFzc2VzLmFkZCh0eXBlLmVsZW1lbnQpKSB7Ci0gICAgICAgIGlmICh0eXBlLnN1cGVyY2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgIHJlY3Vyc2UodHlwZS5zdXBlcmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlIGluIHR5cGUuaW50ZXJmYWNlcykgewotICAgICAgICAgIHJlY3Vyc2UoaW50ZXJmYWNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXNpdGVkQ2xhc3Nlcy5yZW1vdmUodHlwZS5lbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZWN1cnNlKHR5cGUpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGUgW3B1YmxpYy5UeXBlU3lzdGVtXSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgVHlwZVN5c3RlbUltcGwgZXh0ZW5kcyBUeXBlU3lzdGVtIHsKLSAgLyoqCi0gICAqIEZhbHNlIGlmIGltcGxpY2l0IGNhc3RzIHNob3VsZCBhbHdheXMgYmUgZGlzYWxsb3dlZC4KLSAgICoKLSAgICogVGhpcyBhZmZlY3RzIHRoZSBiZWhhdmlvciBvZiBbaXNBc3NpZ25hYmxlVG9dLgotICAgKi8KLSAgYm9vbCBpbXBsaWNpdENhc3RzOwotCi0gIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGluZmVyZW5jZSBmYWlsdXJlcyBhcmUgYWxsb3dlZCwgb2ZmIGJ5IGRlZmF1bHQuCi0gIC8vLwotICAvLy8gVGhpcyBvcHRpb24gaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KLSAgYm9vbCBzdHJpY3RJbmZlcmVuY2U7Ci0KLSAgQG92ZXJyaWRlCi0gIGZpbmFsIFR5cGVQcm92aWRlciB0eXBlUHJvdmlkZXI7Ci0KLSAgLy8vIFRoZSBjYWNoZWQgaW5zdGFuY2Ugb2YgYE9iamVjdD9gLgotICBJbnRlcmZhY2VUeXBlSW1wbCBfb2JqZWN0UXVlc3Rpb247Ci0KLSAgLy8vIFRoZSBjYWNoZWQgaW5zdGFuY2Ugb2YgYE9iamVjdCpgLgotICBJbnRlcmZhY2VUeXBlSW1wbCBfb2JqZWN0U3RhcjsKLQotICAvLy8gVGhlIGNhY2hlZCBpbnN0YW5jZSBvZiBgT2JqZWN0IWAuCi0gIEludGVyZmFjZVR5cGVJbXBsIF9vYmplY3ROb25lOwotCi0gIC8vLyBUaGUgY2FjaGVkIGluc3RhbmNlIG9mIGBOdWxsIWAuCi0gIEludGVyZmFjZVR5cGVJbXBsIF9udWxsTm9uZTsKLQotICBHcmVhdGVzdExvd2VyQm91bmRIZWxwZXIgX2dyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlcjsKLSAgTGVhc3RVcHBlckJvdW5kSGVscGVyIF9sZWFzdFVwcGVyQm91bmRIZWxwZXI7Ci0KLSAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3VidHlwaW5nIHJlbGF0aW9uLgotICBTdWJ0eXBlSGVscGVyIF9zdWJ0eXBlSGVscGVyOwotCi0gIFR5cGVTeXN0ZW1JbXBsKHsKLSAgICBAcmVxdWlyZWQgdGhpcy5pbXBsaWNpdENhc3RzLAotICAgIEByZXF1aXJlZCBib29sIGlzTm9uTnVsbGFibGVCeURlZmF1bHQsCi0gICAgQHJlcXVpcmVkIHRoaXMuc3RyaWN0SW5mZXJlbmNlLAotICAgIEByZXF1aXJlZCB0aGlzLnR5cGVQcm92aWRlciwKLSAgfSkgOiBzdXBlcihpc05vbk51bGxhYmxlQnlEZWZhdWx0OiBpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgX2dyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlciA9IEdyZWF0ZXN0TG93ZXJCb3VuZEhlbHBlcih0aGlzKTsKLSAgICBfbGVhc3RVcHBlckJvdW5kSGVscGVyID0gTGVhc3RVcHBlckJvdW5kSGVscGVyKHRoaXMpOwotICAgIF9zdWJ0eXBlSGVscGVyID0gU3VidHlwZUhlbHBlcih0aGlzKTsKLSAgfQotCi0gIEludGVyZmFjZVR5cGVJbXBsIGdldCBudWxsTm9uZSA9PgotICAgICAgX251bGxOb25lID8/PSAodHlwZVByb3ZpZGVyLm51bGxUeXBlIGFzIFR5cGVJbXBsKQotICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0KLSAgSW50ZXJmYWNlVHlwZUltcGwgZ2V0IG9iamVjdE5vbmUgPT4KLSAgICAgIF9vYmplY3ROb25lID8/PSAodHlwZVByb3ZpZGVyLm9iamVjdFR5cGUgYXMgVHlwZUltcGwpCi0gICAgICAgICAgLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLQotICBJbnRlcmZhY2VUeXBlSW1wbCBnZXQgb2JqZWN0UXVlc3Rpb24gPT4KLSAgICAgIF9vYmplY3RRdWVzdGlvbiA/Pz0gKHR5cGVQcm92aWRlci5vYmplY3RUeXBlIGFzIFR5cGVJbXBsKQotICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pOwotCi0gIEludGVyZmFjZVR5cGVJbXBsIGdldCBvYmplY3RTdGFyID0+Ci0gICAgICBfb2JqZWN0U3RhciA/Pz0gKHR5cGVQcm92aWRlci5vYmplY3RUeXBlIGFzIFR5cGVJbXBsKQotICAgICAgICAgIC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXguc3Rhcik7Ci0KLSAgLy8vIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHR5cGUgW3RdIGFjY2VwdHMgZnVuY3Rpb24gdHlwZXMsIGFuZCByZXF1aXJlcyBhbgotICAvLy8gaW1wbGljaXQgY29lcmNpb24gaWYgaW50ZXJmYWNlIHR5cGVzIHdpdGggYSBgY2FsbGAgbWV0aG9kIGFyZSBwYXNzZWQgaW4uCi0gIC8vLwotICAvLy8gVGhpcyBpcyB0cnVlIGZvcjoKLSAgLy8vIC0gYWxsIGZ1bmN0aW9uIHR5cGVzCi0gIC8vLyAtIHRoZSBzcGVjaWFsIHR5cGUgYEZ1bmN0aW9uYCB0aGF0IGlzIGEgc3VwZXJ0eXBlIG9mIGFsbCBmdW5jdGlvbiB0eXBlcwotICAvLy8gLSBgRnV0dXJlT3I8VD5gIHdoZXJlIFQgaXMgb25lIG9mIHRoZSB0d28gY2FzZXMgYWJvdmUuCi0gIC8vLwotICAvLy8gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyBmYWxzZSBpZiBbdF0gaXMgYSB0b3AgdHlwZSBzdWNoIGFzIE9iamVjdC4KLSAgYm9vbCBhY2NlcHRzRnVuY3Rpb25UeXBlKERhcnRUeXBlIHQpIHsKLSAgICBpZiAodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHQuaXNEYXJ0QXN5bmNGdXR1cmVPcikgewotICAgICAgcmV0dXJuIGFjY2VwdHNGdW5jdGlvblR5cGUoKHQgYXMgSW50ZXJmYWNlVHlwZSkudHlwZUFyZ3VtZW50c1swXSk7Ci0gICAgfQotICAgIHJldHVybiB0IGlzIEZ1bmN0aW9uVHlwZSB8fCB0LmlzRGFydENvcmVGdW5jdGlvbjsKLSAgfQotCi0gIGJvb2wgYW55UGFyYW1ldGVyVHlwZShGdW5jdGlvblR5cGUgZnQsIGJvb2wgRnVuY3Rpb24oRGFydFR5cGUgdCkgcHJlZGljYXRlKSB7Ci0gICAgcmV0dXJuIGZ0LnBhcmFtZXRlcnMuYW55KChwKSA9PiBwcmVkaWNhdGUocC50eXBlKSk7Ci0gIH0KLQotICAvKioKLSAgICogRWxpbWluYXRlcyB0eXBlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb250ZXh0IFt0eXBlXSwgcmVwbGFjaW5nIHRoZW0gd2l0aAotICAgKiBgTnVsbGAgb3IgYE9iamVjdGAgYXMgYXBwcm9wcmlhdGUuCi0gICAqCi0gICAqIEZvciBleGFtcGxlIGluIGBMaXN0PFQ+IGxpc3QgPSBjb25zdCBbXWAsIHRoZSBjb250ZXh0IHR5cGUgZm9yIGluZmVycmluZwotICAgKiB0aGUgbGlzdCBzaG91bGQgYmUgY2hhbmdlZCBmcm9tIGBMaXN0PFQ+YCB0byBgTGlzdDxOdWxsPmAgc28gdGhlIGNvbnN0YW50Ci0gICAqIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSB0eXBlIHZhcmlhYmxlcyBgVGAgKGJlY2F1c2UgaXQgY2FuJ3QgYmUgY2Fub25pY2FsaXplZAotICAgKiBhdCBjb21waWxlIHRpbWUsIGFzIGBUYCBpcyB1bmtub3duKS4KLSAgICoKLSAgICogQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byB0aGUgImxlYXN0IGNsb3N1cmUiLCBleGNlcHQgaW5zdGVhZCBvZgotICAgKiBlbGltaW5hdGluZyBgX2AgKFtVbmtub3duSW5mZXJyZWRUeXBlXSkgaXQgZWxpbWluYXRlcyBhbGwgdHlwZSB2YXJpYWJsZXMKLSAgICogKFtUeXBlUGFyYW1ldGVyVHlwZV0pLgotICAgKgotICAgKiBUaGUgZXF1aXZhbGVudCBDRkUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIGBUeXBlVmFyaWFibGVFbGltaW5hdG9yYCBjbGFzcy4KLSAgICovCi0gIERhcnRUeXBlIGVsaW1pbmF0ZVR5cGVWYXJpYWJsZXMoRGFydFR5cGUgdHlwZSkgewotICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgICByZXR1cm4gX1R5cGVWYXJpYWJsZUVsaW1pbmF0b3IoCi0gICAgICAgIG9iamVjdFF1ZXN0aW9uLAotICAgICAgICBOZXZlclR5cGVJbXBsLmluc3RhbmNlLAotICAgICAgKS5zdWJzdGl0dXRlVHlwZSh0eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIF9UeXBlVmFyaWFibGVFbGltaW5hdG9yKAotICAgICAgICBvYmplY3ROb25lLAotICAgICAgICB0eXBlUHJvdmlkZXIubnVsbFR5cGUsCi0gICAgICApLnN1YnN0aXR1dGVUeXBlKHR5cGUpOwotICAgIH0KLSAgfQotCi0gIC8vLyBEZWZpbmVzIHRoZSAicmVtYWluZGVyIiBvZiBgVGAgd2hlbiBgU2AgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCi0gIC8vLyBjb25zaWRlcmF0aW9uIGJ5IGFuIGluc3RhbmNlIGNoZWNrLiAgVGhpcyBvcGVyYXRpb24gaXMgdXNlZCBmb3IgdHlwZQotICAvLy8gcHJvbW90aW9uIGR1cmluZyBmbG93IGFuYWx5c2lzLgotICBEYXJ0VHlwZSBmYWN0b3IoRGFydFR5cGUgVCwgRGFydFR5cGUgUykgewotICAgIC8vICogSWYgVCA8OiBTIHRoZW4gTmV2ZXIKLSAgICBpZiAoaXNTdWJ0eXBlT2YyKFQsIFMpKSB7Ci0gICAgICByZXR1cm4gTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZTsKLSAgICB9Ci0KLSAgICB2YXIgVF9udWxsYWJpbGl0eSA9IFQubnVsbGFiaWxpdHlTdWZmaXg7Ci0KLSAgICAvLyAqIEVsc2UgaWYgVCBpcyBSPyBhbmQgTnVsbCA8OiBTIHRoZW4gZmFjdG9yKFIsIFMpCi0gICAgLy8gKiBFbHNlIGlmIFQgaXMgUj8gdGhlbiBmYWN0b3IoUiwgUyk/Ci0gICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKLSAgICAgIHZhciBSID0gKFQgYXMgVHlwZUltcGwpLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIHZhciBmYWN0b3JfUlMgPSBmYWN0b3IoUiwgUykgYXMgVHlwZUltcGw7Ci0gICAgICBpZiAoaXNTdWJ0eXBlT2YyKG51bGxOb25lLCBTKSkgewotICAgICAgICByZXR1cm4gZmFjdG9yX1JTOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcl9SUy53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vICogRWxzZSBpZiBUIGlzIFIqIGFuZCBOdWxsIDw6IFMgdGhlbiBmYWN0b3IoUiwgUykKLSAgICAvLyAqIEVsc2UgaWYgVCBpcyBSKiB0aGVuIGZhY3RvcihSLCBTKSoKLSAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7Ci0gICAgICB2YXIgUiA9IChUIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICB2YXIgZmFjdG9yX1JTID0gZmFjdG9yKFIsIFMpIGFzIFR5cGVJbXBsOwotICAgICAgaWYgKGlzU3VidHlwZU9mMihudWxsTm9uZSwgUykpIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcl9SUzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3JfUlMud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4LnN0YXIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vICogRWxzZSBpZiBUIGlzIEZ1dHVyZU9yPFI+IGFuZCBGdXR1cmU8Uj4gPDogUyB0aGVuIGZhY3RvcihSLCBTKQotICAgIC8vICogRWxzZSBpZiBUIGlzIEZ1dHVyZU9yPFI+IGFuZCBSIDw6IFMgdGhlbiBmYWN0b3IoRnV0dXJlPFI+LCBTKQotICAgIGlmIChUIGlzIEludGVyZmFjZVR5cGUgJiYgVC5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICB2YXIgUiA9IFQudHlwZUFyZ3VtZW50c1swXTsKLSAgICAgIHZhciBmdXR1cmVfUiA9IHR5cGVQcm92aWRlci5mdXR1cmVUeXBlMihSKTsKLSAgICAgIGlmIChpc1N1YnR5cGVPZjIoZnV0dXJlX1IsIFMpKSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3IoUiwgUyk7Ci0gICAgICB9Ci0gICAgICBpZiAoaXNTdWJ0eXBlT2YyKFIsIFMpKSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3IoZnV0dXJlX1IsIFMpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUOwotICB9Ci0KLSAgLy8vIENvbXB1dGUgImZ1dHVyZSB2YWx1ZSB0eXBlIiBvZiBbVF0uCi0gIC8vLwotICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS8KLSAgLy8vIFNlZSBgbm5iZC9mZWF0dXJlLXNwZWNpZmljYXRpb24ubWRgCi0gIC8vLyBTZWUgYCN0aGUtZnV0dXJlLXZhbHVlLXR5cGUtb2YtYW4tYXN5bmNocm9ub3VzLW5vbi1nZW5lcmF0b3ItZnVuY3Rpb25gCi0gIERhcnRUeXBlIGZ1dHVyZVZhbHVlVHlwZShEYXJ0VHlwZSBUKSB7Ci0gICAgLy8gZnV0dXJlVmFsdWVUeXBlKGBTP2ApID0gZnV0dXJlVmFsdWVUeXBlKGBTYCksIGZvciBhbGwgYFNgLgotICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShgUypgKSA9IGZ1dHVyZVZhbHVlVHlwZShgU2ApLCBmb3IgYWxsIGBTYC4KLSAgICBpZiAoVC5udWxsYWJpbGl0eVN1ZmZpeCAhPSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKSB7Ci0gICAgICB2YXIgUyA9IChUIGFzIFR5cGVJbXBsKS53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICByZXR1cm4gZnV0dXJlVmFsdWVUeXBlKFMpOwotICAgIH0KLQotICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShGdXR1cmU8YFNgPikgPSBgU2AsIGZvciBhbGwgYFNgLgotICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShGdXR1cmVPcjxgU2A+KSA9IGBTYCwgZm9yIGFsbCBgU2AuCi0gICAgaWYgKFQgaXMgSW50ZXJmYWNlVHlwZSkgewotICAgICAgaWYgKFQuaXNEYXJ0QXN5bmNGdXR1cmUgfHwgVC5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICAgIHJldHVybiBULnR5cGVBcmd1bWVudHNbMF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gZnV0dXJlVmFsdWVUeXBlKGBkeW5hbWljYCkgPSBgZHluYW1pY2AuCi0gICAgaWYgKGlkZW50aWNhbChULCBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UpKSB7Ci0gICAgICByZXR1cm4gVDsKLSAgICB9Ci0KLSAgICAvLyBmdXR1cmVWYWx1ZVR5cGUoYHZvaWRgKSA9IGB2b2lkYC4KLSAgICBpZiAoaWRlbnRpY2FsKFQsIFZvaWRUeXBlSW1wbC5pbnN0YW5jZSkpIHsKLSAgICAgIHJldHVybiBUOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBgU2AsIGZ1dHVyZVZhbHVlVHlwZShgU2ApID0gYE9iamVjdD9gLgotICAgIHJldHVybiBvYmplY3RRdWVzdGlvbjsKLSAgfQotCi0gIC8vLyBHaXZlbiBhIHR5cGUgdCwgaWYgdCBpcyBhbiBpbnRlcmZhY2UgdHlwZSB3aXRoIGEgY2FsbCBtZXRob2QKLSAgLy8vIGRlZmluZWQsIHJldHVybiB0aGUgZnVuY3Rpb24gdHlwZSBmb3IgdGhlIGNhbGwgbWV0aG9kLCBvdGhlcndpc2UKLSAgLy8vIHJldHVybiBudWxsLgotICBGdW5jdGlvblR5cGUgZ2V0Q2FsbE1ldGhvZFR5cGUoRGFydFR5cGUgdCkgewotICAgIGlmICh0IGlzIEludGVyZmFjZVR5cGUpIHsKLSAgICAgIHJldHVybiB0Lmxvb2tVcE1ldGhvZDIoJ2NhbGwnLCB0LmVsZW1lbnQubGlicmFyeSk/LnR5cGU7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLy8vIENvbXB1dGVzIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCBvZiBbVDFdIGFuZCBbVDJdLgotICBEYXJ0VHlwZSBnZXRHcmVhdGVzdExvd2VyQm91bmQoRGFydFR5cGUgVDEsIERhcnRUeXBlIFQyKSB7Ci0gICAgcmV0dXJuIF9ncmVhdGVzdExvd2VyQm91bmRIZWxwZXIuZ2V0R3JlYXRlc3RMb3dlckJvdW5kKFQxLCBUMik7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbGVhc3QgdXBwZXIgYm91bmQgb2YgdHdvIHR5cGVzLgotICAgKgotICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCi0gICAqIFNlZSBgcmVzb3VyY2VzL3R5cGUtc3lzdGVtL3VwcGVyLWxvd2VyLWJvdW5kcy5tZGAKLSAgICovCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSBnZXRMZWFzdFVwcGVyQm91bmQoRGFydFR5cGUgVDEsIERhcnRUeXBlIFQyKSB7Ci0gICAgcmV0dXJuIF9sZWFzdFVwcGVyQm91bmRIZWxwZXIuZ2V0TGVhc3RVcHBlckJvdW5kKFQxLCBUMik7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgZ3JlYXRlc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYF9gLgotICAvLy8KLSAgLy8vIFRoZSBncmVhdGVzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgX2AgaXMgZGVmaW5lZCBhcwotICAvLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYF9gIHJlcGxhY2VkIHdpdGggYE51bGxgLCBhbmQgZXZlcnkKLSAgLy8vIGNvbnRyYXZhcmlhbnQgb2NjdXJyZW5jZSBvZiBgX2AgcmVwbGFjZWQgd2l0aCBgT2JqZWN0YC4KLSAgLy8vCi0gIC8vLyBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIG5vIGluc3RhbmNlcyBvZiBgX2AsIHRoZSBvcmlnaW5hbCBzY2hlbWEgb2JqZWN0IGlzCi0gIC8vLyByZXR1cm5lZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uLgotICAvLy8KLSAgLy8vIE5vdGUgdGhhdCB0aGUgY2xvc3VyZSBvZiBhIHR5cGUgc2NoZW1hIGlzIGEgcHJvcGVyIHR5cGUuCi0gIC8vLwotICAvLy8gTm90ZSB0aGF0IHRoZSBncmVhdGVzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYWx3YXlzIGEgc3VwZXJ0eXBlIG9mCi0gIC8vLyBhbnkgdHlwZSB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWEuCi0gIERhcnRUeXBlIGdyZWF0ZXN0Q2xvc3VyZShEYXJ0VHlwZSBzY2hlbWEpIHsKLSAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewotICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAotICAgICAgICB0b3BUeXBlOiBvYmplY3RRdWVzdGlvbiwKLSAgICAgICAgYm90dG9tVHlwZTogTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSwKLSAgICAgICAgaXNMZWFzdENsb3N1cmU6IGZhbHNlLAotICAgICAgICBzY2hlbWE6IHNjaGVtYSwKLSAgICAgICk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBUeXBlU2NoZW1hRWxpbWluYXRpb25WaXNpdG9yLnJ1bigKLSAgICAgICAgdG9wVHlwZTogRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlLAotICAgICAgICBib3R0b21UeXBlOiB0eXBlUHJvdmlkZXIubnVsbFR5cGUsCi0gICAgICAgIGlzTGVhc3RDbG9zdXJlOiBmYWxzZSwKLSAgICAgICAgc2NoZW1hOiBzY2hlbWEsCi0gICAgICApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGdlbmVyaWMgZnVuY3Rpb24gdHlwZSBgRjxUMCwgVDEsIC4uLiBUbj5gIGFuZCBhIGNvbnRleHQgdHlwZSBDLAotICAgKiBpbmZlciBhbiBpbnN0YW50aWF0aW9uIG9mIEYsIHN1Y2ggdGhhdCBgRjxTMCwgUzEsIC4uLiwgU24+YCA8OiBDLgotICAgKgotICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gW2luZmVyR2VuZXJpY0Z1bmN0aW9uT3JUeXBlXSwgYnV0IHRoZSByZXR1cm4gdHlwZSBpcwotICAgKiBhbHNvIGNvbnNpZGVyZWQgYXMgcGFydCBvZiB0aGUgc29sdXRpb24uCi0gICAqCi0gICAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBbY29udGV4dFR5cGVdIHRoYXQgaXMgYWxzbwotICAgKiB1bmluc3RhbnRpYXRlZCwgb3IgYSBbZm5UeXBlXSB0aGF0IGlzIGFscmVhZHkgaW5zdGFudGlhdGVkLCBpdCB3aWxsIGhhdmUKLSAgICogbm8gZWZmZWN0IGFuZCByZXR1cm4gYG51bGxgLgotICAgKi8KLSAgTGlzdDxEYXJ0VHlwZT4gaW5mZXJGdW5jdGlvblR5cGVJbnN0YW50aWF0aW9uKAotICAgICAgRnVuY3Rpb25UeXBlIGNvbnRleHRUeXBlLCBGdW5jdGlvblR5cGUgZm5UeXBlLAotICAgICAge0Vycm9yUmVwb3J0ZXIgZXJyb3JSZXBvcnRlciwgQXN0Tm9kZSBlcnJvck5vZGV9KSB7Ci0gICAgaWYgKGNvbnRleHRUeXBlLnR5cGVGb3JtYWxzLmlzTm90RW1wdHkgfHwgZm5UeXBlLnR5cGVGb3JtYWxzLmlzRW1wdHkpIHsKLSAgICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgVHlwZVN5c3RlbSB0aGF0IHdpbGwgYWxsb3cgY2VydGFpbiB0eXBlIHBhcmFtZXRlcnMgdG8gYmUKLSAgICAvLyBpbmZlcnJlZC4gSXQgd2lsbCBvcHRpbWlzdGljYWxseSBhc3N1bWUgdGhlc2UgdHlwZSBwYXJhbWV0ZXJzIGNhbiBiZQotICAgIC8vIHN1YnR5cGVzIChvciBzdXBlcnR5cGVzKSBhcyBuZWNlc3NhcnksIGFuZCB0cmFjayB0aGUgY29uc3RyYWludHMgdGhhdAotICAgIC8vIGFyZSBpbXBsaWVkIGJ5IHRoaXMuCi0gICAgdmFyIGluZmVycmVyID0gR2VuZXJpY0luZmVycmVyKHRoaXMsIGZuVHlwZS50eXBlRm9ybWFscyk7Ci0gICAgaW5mZXJyZXIuY29uc3RyYWluR2VuZXJpY0Z1bmN0aW9uSW5Db250ZXh0KGZuVHlwZSwgY29udGV4dFR5cGUpOwotCi0gICAgLy8gSW5mZXIgYW5kIGluc3RhbnRpYXRlIHRoZSByZXN1bHRpbmcgdHlwZS4KLSAgICByZXR1cm4gaW5mZXJyZXIuaW5mZXIoCi0gICAgICBmblR5cGUudHlwZUZvcm1hbHMsCi0gICAgICBlcnJvclJlcG9ydGVyOiBlcnJvclJlcG9ydGVyLAotICAgICAgZXJyb3JOb2RlOiBlcnJvck5vZGUsCi0gICAgKTsKLSAgfQotCi0gIC8vLyBJbmZlcnMgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyB0eXBlLCBmdW5jdGlvbiwgbWV0aG9kLCBvcgotICAvLy8gbGlzdC9tYXAgbGl0ZXJhbCwgdXNpbmcgdGhlIGRvd253YXJkIGNvbnRleHQgdHlwZSBhcyB3ZWxsIGFzIHRoZQotICAvLy8gYXJndW1lbnQgdHlwZXMgaWYgYXZhaWxhYmxlLgotICAvLy8KLSAgLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhIGZ1bmN0aW9uIHR5cGUgd2l0aCBnZW5lcmljIHR5cGUgcGFyYW1ldGVycywgdGhpcwotICAvLy8gaW5mZXJzIHRoZSB0eXBlIHBhcmFtZXRlcnMgZnJvbSB0aGUgYWN0dWFsIGFyZ3VtZW50IHR5cGVzLCBhbmQgcmV0dXJucyB0aGUKLSAgLy8vIGluc3RhbnRpYXRlZCBmdW5jdGlvbiB0eXBlLgotICAvLy8KLSAgLy8vIENvbmNyZXRlbHksIGdpdmVuIGEgZnVuY3Rpb24gdHlwZSB3aXRoIHBhcmFtZXRlciB0eXBlcyBQMCwgUDEsIC4uLiBQbiwKLSAgLy8vIHJlc3VsdCB0eXBlIFIsIGFuZCBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyBUMCwgVDEsIC4uLiBUbSwgdXNlIHRoZQotICAvLy8gYXJndW1lbnQgdHlwZXMgQTAsIEExLCAuLi4gQW4gdG8gc29sdmUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCi0gIC8vLwotICAvLy8gRm9yIGVhY2ggcGFyYW1ldGVyIFBpLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IEFpIDw6IFBpLiBXZSBjYW4gZG8gdGhpcyBieQotICAvLy8gcnVubmluZyB0aGUgc3VidHlwZSBhbGdvcml0aG0sIGFuZCB3aGVuIHdlIHJlYWNoIGEgdHlwZSBwYXJhbWV0ZXIgVGosCi0gIC8vLyByZWNvcmRpbmcgdGhlIGxvd2VyIG9yIHVwcGVyIGJvdW5kIGl0IG11c3Qgc2F0aXNmeS4gQXQgdGhlIGVuZCwgYWxsCi0gIC8vLyBjb25zdHJhaW50cyBjYW4gYmUgY29tYmluZWQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlLgotICAvLy8KLSAgLy8vIEFsbCBjb25zdHJhaW50cyBvbiBlYWNoIHR5cGUgcGFyYW1ldGVyIFRqIGFyZSB0cmFja2VkLCBhcyB3ZWxsIGFzIHdoZXJlCi0gIC8vLyB0aGV5IG9yaWdpbmF0ZWQsIHNvIHdlIGNhbiBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlIHRyYWNpbmcgYmFjayB0byB0aGUKLSAgLy8vIGFyZ3VtZW50IHZhbHVlcywgdHlwZSBwYXJhbWV0ZXIgImV4dGVuZHMiIGNsYXVzZSwgb3IgdGhlIHJldHVybiB0eXBlCi0gIC8vLyBjb250ZXh0LgotICBMaXN0PERhcnRUeXBlPiBpbmZlckdlbmVyaWNGdW5jdGlvbk9yVHlwZSh7Ci0gICAgQ2xhc3NFbGVtZW50IGdlbmVyaWNDbGFzcywKLSAgICBAcmVxdWlyZWQgTGlzdDxUeXBlUGFyYW1ldGVyRWxlbWVudD4gdHlwZVBhcmFtZXRlcnMsCi0gICAgQHJlcXVpcmVkIExpc3Q8UGFyYW1ldGVyRWxlbWVudD4gcGFyYW1ldGVycywKLSAgICBAcmVxdWlyZWQgRGFydFR5cGUgZGVjbGFyZWRSZXR1cm5UeXBlLAotICAgIEByZXF1aXJlZCBMaXN0PERhcnRUeXBlPiBhcmd1bWVudFR5cGVzLAotICAgIEByZXF1aXJlZCBEYXJ0VHlwZSBjb250ZXh0UmV0dXJuVHlwZSwKLSAgICBFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIsCi0gICAgQXN0Tm9kZSBlcnJvck5vZGUsCi0gICAgYm9vbCBkb3dud2FyZHMgPSBmYWxzZSwKLSAgICBib29sIGlzQ29uc3QgPSBmYWxzZSwKLSAgfSkgewotICAgIGlmICh0eXBlUGFyYW1ldGVycy5pc0VtcHR5KSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSBUeXBlU3lzdGVtIHRoYXQgd2lsbCBhbGxvdyBjZXJ0YWluIHR5cGUgcGFyYW1ldGVycyB0byBiZQotICAgIC8vIGluZmVycmVkLiBJdCB3aWxsIG9wdGltaXN0aWNhbGx5IGFzc3VtZSB0aGVzZSB0eXBlIHBhcmFtZXRlcnMgY2FuIGJlCi0gICAgLy8gc3VidHlwZXMgKG9yIHN1cGVydHlwZXMpIGFzIG5lY2Vzc2FyeSwgYW5kIHRyYWNrIHRoZSBjb25zdHJhaW50cyB0aGF0Ci0gICAgLy8gYXJlIGltcGxpZWQgYnkgdGhpcy4KLSAgICB2YXIgaW5mZXJyZXIgPSBHZW5lcmljSW5mZXJyZXIodGhpcywgdHlwZVBhcmFtZXRlcnMpOwotCi0gICAgaWYgKGNvbnRleHRSZXR1cm5UeXBlICE9IG51bGwpIHsKLSAgICAgIGlmIChpc0NvbnN0KSB7Ci0gICAgICAgIGNvbnRleHRSZXR1cm5UeXBlID0gZWxpbWluYXRlVHlwZVZhcmlhYmxlcyhjb250ZXh0UmV0dXJuVHlwZSk7Ci0gICAgICB9Ci0gICAgICBpbmZlcnJlci5jb25zdHJhaW5SZXR1cm5UeXBlKGRlY2xhcmVkUmV0dXJuVHlwZSwgY29udGV4dFJldHVyblR5cGUpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgLy8gVHJ5IHRvIHBhc3MgZWFjaCBhcmd1bWVudCB0byBlYWNoIHBhcmFtZXRlciwgcmVjb3JkaW5nIGFueSB0eXBlCi0gICAgICAvLyBwYXJhbWV0ZXIgYm91bmRzIHRoYXQgd2VyZSBpbXBsaWVkIGJ5IHRoaXMgYXNzaWdubWVudC4KLSAgICAgIGluZmVycmVyLmNvbnN0cmFpbkFyZ3VtZW50KAotICAgICAgICBhcmd1bWVudFR5cGVzW2ldLAotICAgICAgICBwYXJhbWV0ZXJzW2ldLnR5cGUsCi0gICAgICAgIHBhcmFtZXRlcnNbaV0ubmFtZSwKLSAgICAgICAgZ2VuZXJpY0NsYXNzOiBnZW5lcmljQ2xhc3MsCi0gICAgICApOwotICAgIH0KLQotICAgIHJldHVybiBpbmZlcnJlci5pbmZlcigKLSAgICAgIHR5cGVQYXJhbWV0ZXJzLAotICAgICAgZXJyb3JSZXBvcnRlcjogZXJyb3JSZXBvcnRlciwKLSAgICAgIGVycm9yTm9kZTogZXJyb3JOb2RlLAotICAgICAgZG93bndhcmRzSW5mZXJQaGFzZTogZG93bndhcmRzLAotICAgICk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBbRGFydFR5cGVdIFt0eXBlXSwgaWYgW3R5cGVdIGlzIGFuIHVuaW5zdGFudGlhdGVkCi0gICAqIHBhcmFtZXRlcml6ZWQgdHlwZSB0aGVuIGluc3RhbnRpYXRlIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZWlyCi0gICAqIGJvdW5kcy4gU2VlIHRoZSBpc3N1ZSBmb3IgdGhlIGFsZ29yaXRobSBkZXNjcmlwdGlvbi4KLSAgICoKLSAgICogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI3NTI2I2lzc3VlY29tbWVudC0yNjAwMjEzOTcKLSAgICoKLSAgICogVE9ETyhzY2hlZ2xvdikgTW92ZSB0aGlzIG1ldGhvZCB0byBlbGVtZW50cyBmb3IgY2xhc3NlcywgdHlwZWRlZnMsCi0gICAqIGFuZCBnZW5lcmljIGZ1bmN0aW9uczsgY29tcHV0ZSBsYXppbHkgYW5kIGNhY2hlLgotICAgKi8KLSAgQG92ZXJyaWRlCi0gIERhcnRUeXBlIGluc3RhbnRpYXRlVG9Cb3VuZHMoRGFydFR5cGUgdHlwZSwKLSAgICAgIHtMaXN0PGJvb2w+IGhhc0Vycm9yLCBNYXA8VHlwZVBhcmFtZXRlckVsZW1lbnQsIERhcnRUeXBlPiBrbm93blR5cGVzfSkgewotICAgIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IHR5cGVGb3JtYWxzID0gdHlwZUZvcm1hbHNBc0VsZW1lbnRzKHR5cGUpOwotICAgIExpc3Q8RGFydFR5cGU+IGFyZ3VtZW50cyA9IGluc3RhbnRpYXRlVHlwZUZvcm1hbHNUb0JvdW5kcyh0eXBlRm9ybWFscywKLSAgICAgICAgaGFzRXJyb3I6IGhhc0Vycm9yLCBrbm93blR5cGVzOiBrbm93blR5cGVzKTsKLSAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHJldHVybiBpbnN0YW50aWF0ZVR5cGUodHlwZSwgYXJndW1lbnRzKTsKLSAgfQotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSBpbnN0YW50aWF0ZVRvQm91bmRzMih7Ci0gICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudCwKLSAgICBGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgZnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50LAotICAgIEByZXF1aXJlZCBOdWxsYWJpbGl0eVN1ZmZpeCBudWxsYWJpbGl0eVN1ZmZpeCwKLSAgfSkgewotICAgIGlmIChjbGFzc0VsZW1lbnQgIT0gbnVsbCkgewotICAgICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gY2xhc3NFbGVtZW50LnR5cGVQYXJhbWV0ZXJzOwotICAgICAgdmFyIHR5cGVBcmd1bWVudHMgPSBfZGVmYXVsdFR5cGVBcmd1bWVudHModHlwZVBhcmFtZXRlcnMpOwotICAgICAgdmFyIHR5cGUgPSBjbGFzc0VsZW1lbnQuaW5zdGFudGlhdGUoCi0gICAgICAgIHR5cGVBcmd1bWVudHM6IHR5cGVBcmd1bWVudHMsCi0gICAgICAgIG51bGxhYmlsaXR5U3VmZml4OiBudWxsYWJpbGl0eVN1ZmZpeCwKLSAgICAgICk7Ci0gICAgICB0eXBlID0gdG9MZWdhY3lUeXBlKHR5cGUpOwotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfSBlbHNlIGlmIChmdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgIT0gbnVsbCkgewotICAgICAgdmFyIHR5cGVQYXJhbWV0ZXJzID0gZnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50LnR5cGVQYXJhbWV0ZXJzOwotICAgICAgdmFyIHR5cGVBcmd1bWVudHMgPSBfZGVmYXVsdFR5cGVBcmd1bWVudHModHlwZVBhcmFtZXRlcnMpOwotICAgICAgdmFyIHR5cGUgPSBmdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQuaW5zdGFudGlhdGUoCi0gICAgICAgIHR5cGVBcmd1bWVudHM6IHR5cGVBcmd1bWVudHMsCi0gICAgICAgIG51bGxhYmlsaXR5U3VmZml4OiBudWxsYWJpbGl0eVN1ZmZpeCwKLSAgICAgICk7Ci0gICAgICB0eXBlID0gdG9MZWdhY3lUeXBlKHR5cGUpOwotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IEFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgZWxlbWVudCcpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1bmluc3RhbnRpYXRlZCBbdHlwZUZvcm1hbHNdLCBpbnN0YW50aWF0ZSB0aGVtIHRvIHRoZWlyIGJvdW5kcy4KLSAgICogU2VlIHRoZSBpc3N1ZSBmb3IgdGhlIGFsZ29yaXRobSBkZXNjcmlwdGlvbi4KLSAgICoKLSAgICogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzI3NTI2I2lzc3VlY29tbWVudC0yNjAwMjEzOTcKLSAgICovCi0gIEBvdmVycmlkZQotICBMaXN0PERhcnRUeXBlPiBpbnN0YW50aWF0ZVR5cGVGb3JtYWxzVG9Cb3VuZHMoCi0gICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiB0eXBlRm9ybWFscywKLSAgICAgIHtMaXN0PGJvb2w+IGhhc0Vycm9yLAotICAgICAgTWFwPFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBEYXJ0VHlwZT4ga25vd25UeXBlc30pIHsKLSAgICBpbnQgY291bnQgPSB0eXBlRm9ybWFscy5sZW5ndGg7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgIHJldHVybiBjb25zdCA8RGFydFR5cGU+W107Ci0gICAgfQotCi0gICAgU2V0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBhbGwgPSA8VHlwZVBhcmFtZXRlckVsZW1lbnQ+e307Ci0gICAgLy8gYWxsIGdyb3VuZAotICAgIE1hcDxUeXBlUGFyYW1ldGVyRWxlbWVudCwgRGFydFR5cGU+IGRlZmF1bHRzID0ga25vd25UeXBlcyA/PyB7fTsKLSAgICAvLyBub3QgZ3JvdW5kCi0gICAgTWFwPFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBEYXJ0VHlwZT4gcGFydGlhbHMgPSB7fTsKLQotICAgIGZvciAoVHlwZVBhcmFtZXRlckVsZW1lbnQgdHlwZVBhcmFtZXRlciBpbiB0eXBlRm9ybWFscykgewotICAgICAgYWxsLmFkZCh0eXBlUGFyYW1ldGVyKTsKLSAgICAgIGlmICghZGVmYXVsdHMuY29udGFpbnNLZXkodHlwZVBhcmFtZXRlcikpIHsKLSAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXIuYm91bmQgPT0gbnVsbCkgewotICAgICAgICAgIGRlZmF1bHRzW3R5cGVQYXJhbWV0ZXJdID0gRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBhcnRpYWxzW3R5cGVQYXJhbWV0ZXJdID0gdHlwZVBhcmFtZXRlci5ib3VuZDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8VHlwZVBhcmFtZXRlckVsZW1lbnQ+IGdldEZyZWVQYXJhbWV0ZXJzKERhcnRUeXBlIHJvb3RUeXBlKSB7Ci0gICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBwYXJhbWV0ZXJzOwotICAgICAgU2V0PERhcnRUeXBlPiB2aXNpdGVkVHlwZXMgPSBIYXNoU2V0PERhcnRUeXBlPigpOwotCi0gICAgICB2b2lkIGFwcGVuZFBhcmFtZXRlcnMoRGFydFR5cGUgdHlwZSkgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2aXNpdGVkVHlwZXMuY29udGFpbnModHlwZSkpIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdmlzaXRlZFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKLSAgICAgICAgICB2YXIgZWxlbWVudCA9IHR5cGUuZWxlbWVudDsKLSAgICAgICAgICBpZiAoYWxsLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzID8/PSA8VHlwZVBhcmFtZXRlckVsZW1lbnQ+W107Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHR5cGUgaXMgRnVuY3Rpb25UeXBlKSB7Ci0gICAgICAgICAgICBhcHBlbmRQYXJhbWV0ZXJzKHR5cGUucmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICB0eXBlLnBhcmFtZXRlcnMubWFwKChwKSA9PiBwLnR5cGUpLmZvckVhY2goYXBwZW5kUGFyYW1ldGVycyk7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUpIHsKLSAgICAgICAgICAgIHR5cGUudHlwZUFyZ3VtZW50cy5mb3JFYWNoKGFwcGVuZFBhcmFtZXRlcnMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhcHBlbmRQYXJhbWV0ZXJzKHJvb3RUeXBlKTsKLSAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIGJvb2wgaGFzUHJvZ3Jlc3MgPSB0cnVlOwotICAgIHdoaWxlIChoYXNQcm9ncmVzcykgewotICAgICAgaGFzUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgIGZvciAoVHlwZVBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyIGluIHBhcnRpYWxzLmtleXMpIHsKLSAgICAgICAgRGFydFR5cGUgdmFsdWUgPSBwYXJ0aWFsc1twYXJhbWV0ZXJdOwotICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiBmcmVlUGFyYW1ldGVycyA9IGdldEZyZWVQYXJhbWV0ZXJzKHZhbHVlKTsKLSAgICAgICAgaWYgKGZyZWVQYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICBkZWZhdWx0c1twYXJhbWV0ZXJdID0gdmFsdWU7Ci0gICAgICAgICAgcGFydGlhbHMucmVtb3ZlKHBhcmFtZXRlcik7Ci0gICAgICAgICAgaGFzUHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGZyZWVQYXJhbWV0ZXJzLmV2ZXJ5KGRlZmF1bHRzLmNvbnRhaW5zS2V5KSkgewotICAgICAgICAgIGRlZmF1bHRzW3BhcmFtZXRlcl0gPQotICAgICAgICAgICAgICBTdWJzdGl0dXRpb24uZnJvbU1hcChkZWZhdWx0cykuc3Vic3RpdHV0ZVR5cGUodmFsdWUpOwotICAgICAgICAgIHBhcnRpYWxzLnJlbW92ZShwYXJhbWV0ZXIpOwotICAgICAgICAgIGhhc1Byb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIHN0b3BwZWQgbWFraW5nIHByb2dyZXNzLCBhbmQgbm90IGFsbCB0eXBlcyBhcmUgZ3JvdW5kLAotICAgIC8vIHRoZW4gdGhlIHdob2xlIHR5cGUgaXMgbWFsYm91bmRlZCBhbmQgYW4gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkCi0gICAgLy8gaWYgZXJyb3JzIGFyZSByZXF1ZXN0ZWQsIGFuZCBhIHBhcnRpYWxseSBjb21wbGV0ZWQgdHlwZSBzaG91bGQKLSAgICAvLyBiZSByZXR1cm5lZC4KLSAgICBpZiAocGFydGlhbHMuaXNOb3RFbXB0eSkgewotICAgICAgaWYgKGhhc0Vycm9yICE9IG51bGwpIHsKLSAgICAgICAgaGFzRXJyb3JbMF0gPSB0cnVlOwotICAgICAgfQotICAgICAgdmFyIGRvbWFpbiA9IGRlZmF1bHRzLmtleXMudG9MaXN0KCk7Ci0gICAgICB2YXIgcmFuZ2UgPSBkZWZhdWx0cy52YWx1ZXMudG9MaXN0KCk7Ci0gICAgICAvLyBCdWlsZCBhIHN1YnN0aXR1dGlvbiBQaGkgbWFwcGluZyBlYWNoIHVuY29tcGxldGVkIHR5cGUgdmFyaWFibGUgdG8KLSAgICAgIC8vIGR5bmFtaWMsIGFuZCBlYWNoIGNvbXBsZXRlZCB0eXBlIHZhcmlhYmxlIHRvIGl0cyBkZWZhdWx0LgotICAgICAgZm9yIChUeXBlUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIgaW4gcGFydGlhbHMua2V5cykgewotICAgICAgICBkb21haW4uYWRkKHBhcmFtZXRlcik7Ci0gICAgICAgIHJhbmdlLmFkZChEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UpOwotICAgICAgfQotICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGZvciBhbiB1bmNvbXBsZXRlZCB0eXBlIHZhcmlhYmxlIChUIGV4dGVuZHMgQikKLSAgICAgIC8vIHRvIGJlIFBoaShCKQotICAgICAgZm9yIChUeXBlUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIgaW4gcGFydGlhbHMua2V5cykgewotICAgICAgICBkZWZhdWx0c1twYXJhbWV0ZXJdID0gU3Vic3RpdHV0aW9uLmZyb21QYWlycyhkb21haW4sIHJhbmdlKQotICAgICAgICAgICAgLnN1YnN0aXR1dGVUeXBlKHBhcnRpYWxzW3BhcmFtZXRlcl0pOwotICAgICAgfQotICAgIH0KLQotICAgIExpc3Q8RGFydFR5cGU+IG9yZGVyZWRBcmd1bWVudHMgPQotICAgICAgICB0eXBlRm9ybWFscy5tYXAoKHApID0+IGRlZmF1bHRzW3BdKS50b0xpc3QoKTsKLSAgICByZXR1cm4gb3JkZXJlZEFyZ3VtZW50czsKLSAgfQotCi0gIEBvdmVycmlkZQotICBib29sIGlzQXNzaWduYWJsZVRvKERhcnRUeXBlIGZyb21UeXBlLCBEYXJ0VHlwZSB0b1R5cGUpIHsKLSAgICBpZiAoIU51bGxTYWZldHlVbmRlcnN0YW5kaW5nRmxhZy5pc0VuYWJsZWQpIHsKLSAgICAgIGZyb21UeXBlID0gTnVsbGFiaWxpdHlFbGltaW5hdG9yLnBlcmZvcm0odHlwZVByb3ZpZGVyLCBmcm9tVHlwZSk7Ci0gICAgICB0b1R5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIHRvVHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBpc0Fzc2lnbmFibGVUbzIoZnJvbVR5cGUsIHRvVHlwZSk7Ci0gIH0KLQotICBib29sIGlzQXNzaWduYWJsZVRvMihEYXJ0VHlwZSBmcm9tVHlwZSwgRGFydFR5cGUgdG9UeXBlKSB7Ci0gICAgLy8gQW4gYWN0dWFsIHN1YnR5cGUKLSAgICBpZiAoaXNTdWJ0eXBlT2YyKGZyb21UeXBlLCB0b1R5cGUpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBBIGNhbGwgbWV0aG9kIHRlYXJvZmYKLSAgICBpZiAoZnJvbVR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJgotICAgICAgICAhaXNOdWxsYWJsZShmcm9tVHlwZSkgJiYKLSAgICAgICAgYWNjZXB0c0Z1bmN0aW9uVHlwZSh0b1R5cGUpKSB7Ci0gICAgICB2YXIgY2FsbE1ldGhvZFR5cGUgPSBnZXRDYWxsTWV0aG9kVHlwZShmcm9tVHlwZSk7Ci0gICAgICBpZiAoY2FsbE1ldGhvZFR5cGUgIT0gbnVsbCAmJiBpc0Fzc2lnbmFibGVUbzIoY2FsbE1ldGhvZFR5cGUsIHRvVHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRmlyc3QgbWFrZSBzdXJlIC0tbm8taW1wbGljaXQtY2FzdHMgZGlzYWJsZXMgYWxsIGRvd25jYXN0cywgaW5jbHVkaW5nCi0gICAgLy8gZHluYW1pYyBjYXN0cy4KLSAgICBpZiAoIWltcGxpY2l0Q2FzdHMpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgaGFuZGxlIE5OQkQgZGVmYXVsdCBiZWhhdmlvciwgd2hlcmUgd2UgZGlzYWJsZSBub24tZHluYW1pYyBkb3duY2FzdHMuCi0gICAgaWYgKGlzTm9uTnVsbGFibGVCeURlZmF1bHQpIHsKLSAgICAgIHJldHVybiBmcm9tVHlwZS5pc0R5bmFtaWM7Ci0gICAgfQotCi0gICAgLy8gRG9uJ3QgYWxsb3cgaW1wbGljaXQgZG93bmNhc3RzIGJldHdlZW4gZnVuY3Rpb24gdHlwZXMKLSAgICAvLyBhbmQgY2FsbCBtZXRob2Qgb2JqZWN0cywgYXMgdGhlc2Ugd2lsbCBhbG1vc3QgYWx3YXlzIGZhaWwuCi0gICAgaWYgKGZyb21UeXBlIGlzIEZ1bmN0aW9uVHlwZSAmJiBnZXRDYWxsTWV0aG9kVHlwZSh0b1R5cGUpICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBhbGxvdyBhIG5vbi1nZW5lcmljIGZ1bmN0aW9uIHdoZXJlIGEgZ2VuZXJpYyBvbmUgaXMgZXhwZWN0ZWQuIFRoZQotICAgIC8vIGZvcm1lciB3b3VsZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZSBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvIGl0LgotICAgIC8vIFRPRE8ocm55c3Ryb20pOiBUaGlzIHNhbWUgY2hlY2sgYWxzbyBleGlzdHMgaW4gRnVuY3Rpb25UeXBlSW1wbC5yZWxhdGUoKQotICAgIC8vIGJ1dCB3ZSBkb24ndCBhbHdheXMgcmVsaWFibHkgZ28gdGhyb3VnaCB0aGF0IGNvZGUgcGF0aC4gVGhpcyBzaG91bGQgYmUKLSAgICAvLyBjbGVhbmVkIHVwIHRvIGF2b2lkIHRoZSByZWR1bmRhbmN5LgotICAgIGlmIChmcm9tVHlwZSBpcyBGdW5jdGlvblR5cGUgJiYKLSAgICAgICAgdG9UeXBlIGlzIEZ1bmN0aW9uVHlwZSAmJgotICAgICAgICBmcm9tVHlwZS50eXBlRm9ybWFscy5pc0VtcHR5ICYmCi0gICAgICAgIHRvVHlwZS50eXBlRm9ybWFscy5pc05vdEVtcHR5KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHN1YnR5cGUgcmVsYXRpb24gZ29lcyB0aGUgb3RoZXIgd2F5LCBhbGxvdyB0aGUgaW1wbGljaXQgZG93bmNhc3QuCi0gICAgaWYgKGlzU3VidHlwZU9mMih0b1R5cGUsIGZyb21UeXBlKSkgewotICAgICAgLy8gVE9ETyhsZWFmcCxqbWVzc2VybHkpOiB3ZSBlbWl0IHdhcm5pbmdzL2hpbnRzIGZvciB0aGVzZSBpbgotICAgICAgLy8gc3JjL3Rhc2svc3Ryb25nL2NoZWNrZXIuZGFydCwgd2hpY2ggaXMgYSBiaXQgaW5jb25zaXN0ZW50LiBUaGF0Ci0gICAgICAvLyBjb2RlIHNob3VsZCBiZSBoYW5kbGVkIGludG8gcGxhY2VzIHRoYXQgdXNlIGlzQXNzaWduYWJsZVRvLCBzdWNoIGFzCi0gICAgICAvLyBFcnJvclZlcmlmaWVyLgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8vIFJldHVybiBgdHJ1ZWAgIGZvciB0aGluZ3MgaW4gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG9mIGBOZXZlcmAuCi0gIGJvb2wgaXNCb3R0b20oRGFydFR5cGUgdHlwZSkgewotICAgIC8vIEJPVFRPTShOZXZlcikgaXMgdHJ1ZQotICAgIGlmIChpZGVudGljYWwodHlwZSwgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIEJPVFRPTShYJlQpIGlzIHRydWUgaWZmIEJPVFRPTShUKQotICAgIC8vIEJPVFRPTShYIGV4dGVuZHMgVCkgaXMgdHJ1ZSBpZmYgQk9UVE9NKFQpCi0gICAgaWYgKHR5cGUgaXMgVHlwZVBhcmFtZXRlclR5cGVJbXBsKSB7Ci0gICAgICB2YXIgVCA9IHR5cGUucHJvbW90ZWRCb3VuZDsKLSAgICAgIGlmIChUICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGlzQm90dG9tKFQpOwotICAgICAgfQotCi0gICAgICBUID0gdHlwZS5lbGVtZW50LmJvdW5kOwotICAgICAgaWYgKFQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gaXNCb3R0b20oVCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQk9UVE9NKFQpIGlzIGZhbHNlIG90aGVyd2lzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vLyBEZWZpbmVzIGFuIChhbG1vc3QpIHRvdGFsIG9yZGVyIG9uIGJvdHRvbSBhbmQgYE51bGxgIHR5cGVzLiBUaGlzIGRvZXMgbm90Ci0gIC8vLyBjdXJyZW50bHkgY29uc2lzdGVudGx5IG9yZGVyIHR3byBkaWZmZXJlbnQgdHlwZSB2YXJpYWJsZXMgd2l0aCB0aGUgc2FtZQotICAvLy8gYm91bmQuCi0gIGJvb2wgaXNNb3JlQm90dG9tKERhcnRUeXBlIFQsIERhcnRUeXBlIFMpIHsKLSAgICB2YXIgVF9pbXBsID0gVCBhcyBUeXBlSW1wbDsKLSAgICB2YXIgU19pbXBsID0gUyBhcyBUeXBlSW1wbDsKLQotICAgIHZhciBUX251bGxhYmlsaXR5ID0gVF9pbXBsLm51bGxhYmlsaXR5U3VmZml4OwotICAgIHZhciBTX251bGxhYmlsaXR5ID0gU19pbXBsLm51bGxhYmlsaXR5U3VmZml4OwotCi0gICAgLy8gTU9SRUJPVFRPTShOZXZlciwgVCkgPSB0cnVlCi0gICAgaWYgKGlkZW50aWNhbChULCBOZXZlclR5cGVJbXBsLmluc3RhbmNlKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTU9SRUJPVFRPTShULCBOZXZlcikgPSBmYWxzZQotICAgIGlmIChpZGVudGljYWwoUywgTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBNT1JFQk9UVE9NKE51bGwsIFQpID0gdHJ1ZQotICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUgJiYgVC5pc0RhcnRDb3JlTnVsbCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTU9SRUJPVFRPTShULCBOdWxsKSA9IGZhbHNlCi0gICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSAmJiBTLmlzRGFydENvcmVOdWxsKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gTU9SRUJPVFRPTShUPywgUz8pID0gTU9SRUJPVFRPTShULCBTKQotICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uICYmCi0gICAgICAgIFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKLSAgICAgIHZhciBUMiA9IFRfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICB2YXIgUzIgPSBTX2ltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgcmV0dXJuIGlzTW9yZUJvdHRvbShUMiwgUzIpOwotICAgIH0KLQotICAgIC8vIE1PUkVCT1RUT00oVCwgUz8pID0gdHJ1ZQotICAgIGlmIChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBNT1JFQk9UVE9NKFQ/LCBTKSA9IGZhbHNlCi0gICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBNT1JFQk9UVE9NKFQqLCBTKikgPSBNT1JFQk9UVE9NKFQsIFMpCi0gICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhciAmJgotICAgICAgICBTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKLSAgICAgIHZhciBUMiA9IFRfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICB2YXIgUzIgPSBTX2ltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgcmV0dXJuIGlzTW9yZUJvdHRvbShUMiwgUzIpOwotICAgIH0KLQotICAgIC8vIE1PUkVCT1RUT00oVCwgUyopID0gdHJ1ZQotICAgIGlmIChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE1PUkVCT1RUT00oVCosIFMpID0gZmFsc2UKLSAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVHlwZSBwYXJhbWV0ZXJzLgotICAgIGlmIChUIGlzIFR5cGVQYXJhbWV0ZXJUeXBlSW1wbCAmJiBTIGlzIFR5cGVQYXJhbWV0ZXJUeXBlSW1wbCkgewotICAgICAgLy8gV2UgaGF2ZSBlbGltaW5hdGVkIHRoZSBwb3NzaWJpbGl0eSB0aGF0IFRfbnVsbGFiaWxpdHkgb3IgU19udWxsYWJpbGl0eQotICAgICAgLy8gaXMgYW55dGhpbmcgZXhjZXB0IG5vbmUgYnkgdGhpcyBwb2ludC4KLSAgICAgIGFzc2VydChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgYXNzZXJ0KFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICB2YXIgVF9lbGVtZW50ID0gVC5lbGVtZW50OwotICAgICAgdmFyIFNfZWxlbWVudCA9IFMuZWxlbWVudDsKLQotICAgICAgLy8gTU9SRUJPVFRPTShYJlQsIFkmUykgPSBNT1JFQk9UVE9NKFQsIFMpCi0gICAgICB2YXIgVF9wcm9tb3RlZEJvdW5kID0gVC5wcm9tb3RlZEJvdW5kOwotICAgICAgdmFyIFNfcHJvbW90ZWRCb3VuZCA9IFMucHJvbW90ZWRCb3VuZDsKLSAgICAgIGlmIChUX3Byb21vdGVkQm91bmQgIT0gbnVsbCAmJiBTX3Byb21vdGVkQm91bmQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gaXNNb3JlQm90dG9tKFRfcHJvbW90ZWRCb3VuZCwgU19wcm9tb3RlZEJvdW5kKTsKLSAgICAgIH0KLQotICAgICAgLy8gTU9SRUJPVFRPTShYJlQsIFMpID0gdHJ1ZQotICAgICAgaWYgKFRfcHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyBNT1JFQk9UVE9NKFQsIFkmUykgPSBmYWxzZQotICAgICAgaWYgKFNfcHJvbW90ZWRCb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy8gTU9SRUJPVFRPTShYIGV4dGVuZHMgVCwgWSBleHRlbmRzIFMpID0gTU9SRUJPVFRPTShULCBTKQotICAgICAgdmFyIFRfYm91bmQgPSBUX2VsZW1lbnQuYm91bmQ7Ci0gICAgICB2YXIgU19ib3VuZCA9IFNfZWxlbWVudC5ib3VuZDsKLSAgICAgIC8vIFRoZSBpbnZhcmlhbnQgb2YgdGhlIGxhcmdlciBhbGdvcml0aG0gdGhhdCB0aGlzIGlzIG9ubHkgY2FsbGVkIHdpdGgKLSAgICAgIC8vIHR5cGVzIHRoYXQgc2F0aXNmeSBgQk9UVE9NKFQpYCBvciBgTlVMTChUKWAsIGFuZCBhbGwgc3VjaCB0eXBlcywgaWYKLSAgICAgIC8vIHRoZXkgYXJlIHR5cGUgdmFyaWFibGVzLCBoYXZlIGJvdW5kcyB3aGljaCB0aGVtc2VsdmVzIGFyZQotICAgICAgLy8gYEJPVFRPTWAgb3IgYE5VTExgIHR5cGVzLgotICAgICAgYXNzZXJ0KFRfYm91bmQgIT0gbnVsbCk7Ci0gICAgICBhc3NlcnQoU19ib3VuZCAhPSBudWxsKTsKLSAgICAgIHJldHVybiBpc01vcmVCb3R0b20oVF9ib3VuZCwgU19ib3VuZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQG92ZXJyaWRlCi0gIGJvb2wgaXNNb3JlU3BlY2lmaWNUaGFuKERhcnRUeXBlIHQxLCBEYXJ0VHlwZSB0MikgPT4gaXNTdWJ0eXBlT2YyKHQxLCB0Mik7Ci0KLSAgLy8vIERlZmluZXMgYSB0b3RhbCBvcmRlciBvbiB0b3AgYW5kIE9iamVjdCB0eXBlcy4KLSAgYm9vbCBpc01vcmVUb3AoRGFydFR5cGUgVCwgRGFydFR5cGUgUykgewotICAgIHZhciBUX2ltcGwgPSBUIGFzIFR5cGVJbXBsOwotICAgIHZhciBTX2ltcGwgPSBTIGFzIFR5cGVJbXBsOwotCi0gICAgdmFyIFRfbnVsbGFiaWxpdHkgPSBUX2ltcGwubnVsbGFiaWxpdHlTdWZmaXg7Ci0gICAgdmFyIFNfbnVsbGFiaWxpdHkgPSBTX2ltcGwubnVsbGFiaWxpdHlTdWZmaXg7Ci0KLSAgICAvLyBNT1JFVE9QKHZvaWQsIFMpID0gdHJ1ZQotICAgIGlmIChpZGVudGljYWwoVCwgVm9pZFR5cGVJbXBsLmluc3RhbmNlKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChULCB2b2lkKSA9IGZhbHNlCi0gICAgaWYgKGlkZW50aWNhbChTLCBWb2lkVHlwZUltcGwuaW5zdGFuY2UpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChkeW5hbWljLCBTKSA9IHRydWUKLSAgICBpZiAoaWRlbnRpY2FsKFQsIER5bmFtaWNUeXBlSW1wbC5pbnN0YW5jZSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE1PUkVUT1AoVCwgZHluYW1pYykgPSBmYWxzZQotICAgIGlmIChpZGVudGljYWwoUywgRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIE1PUkVUT1AoT2JqZWN0LCBTKSA9IHRydWUKLSAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lICYmIFQuaXNEYXJ0Q29yZU9iamVjdCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChULCBPYmplY3QpID0gZmFsc2UKLSAgICBpZiAoU19udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lICYmIFMuaXNEYXJ0Q29yZU9iamVjdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIE1PUkVUT1AoVCosIFMqKSA9IE1PUkVUT1AoVCwgUykKLSAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyICYmCi0gICAgICAgIFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcikgewotICAgICAgdmFyIFQyID0gVF9pbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIHZhciBTMiA9IFNfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICByZXR1cm4gaXNNb3JlVG9wKFQyLCBTMik7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChULCBTKikgPSB0cnVlCi0gICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXguc3RhcikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChUKiwgUykgPSBmYWxzZQotICAgIGlmIChUX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBNT1JFVE9QKFQ/LCBTPykgPSBNT1JFVE9QKFQsIFMpCi0gICAgaWYgKFRfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24gJiYKLSAgICAgICAgU19udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgewotICAgICAgdmFyIFQyID0gVF9pbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIHZhciBTMiA9IFNfaW1wbC53aXRoTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHlTdWZmaXgubm9uZSk7Ci0gICAgICByZXR1cm4gaXNNb3JlVG9wKFQyLCBTMik7Ci0gICAgfQotCi0gICAgLy8gTU9SRVRPUChULCBTPykgPSB0cnVlCi0gICAgaWYgKFNfbnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHlTdWZmaXgucXVlc3Rpb24pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE1PUkVUT1AoVD8sIFMpID0gZmFsc2UKLSAgICBpZiAoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIE1PUkVUT1AoRnV0dXJlT3I8VD4sIEZ1dHVyZU9yPFM+KSA9IE1PUkVUT1AoVCwgUykKLSAgICBpZiAoVCBpcyBJbnRlcmZhY2VUeXBlICYmCi0gICAgICAgIFQuaXNEYXJ0QXN5bmNGdXR1cmVPciAmJgotICAgICAgICBTIGlzIEludGVyZmFjZVR5cGUgJiYKLSAgICAgICAgUy5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICBhc3NlcnQoVF9udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIGFzc2VydChTX251bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgdmFyIFQyID0gVC50eXBlQXJndW1lbnRzWzBdOwotICAgICAgdmFyIFMyID0gUy50eXBlQXJndW1lbnRzWzBdOwotICAgICAgcmV0dXJuIGlzTW9yZVRvcChUMiwgUzIpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vLyBSZXR1cm4gYHRydWVgIGZvciB0aGluZ3MgaW4gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG9mIGBOdWxsYC4KLSAgYm9vbCBpc051bGwoRGFydFR5cGUgdHlwZSkgewotICAgIHZhciB0eXBlSW1wbCA9IHR5cGUgYXMgVHlwZUltcGw7Ci0gICAgdmFyIG51bGxhYmlsaXR5U3VmZml4ID0gdHlwZUltcGwubnVsbGFiaWxpdHlTdWZmaXg7Ci0KLSAgICAvLyBOVUxMKE51bGwpIGlzIHRydWUKLSAgICAvLyBBbHNvIGluY2x1ZGVzIGBOdWxsP2AgYW5kIGBOdWxsKmAgZnJvbSB0aGUgcnVsZXMgYmVsb3cuCi0gICAgaWYgKHR5cGUuaXNEYXJ0Q29yZU51bGwpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIE5VTEwoVD8pIGlzIHRydWUgaWZmIE5VTEwoVCkgb3IgQk9UVE9NKFQpCi0gICAgLy8gTlVMTChUKikgaXMgdHJ1ZSBpZmYgTlVMTChUKSBvciBCT1RUT00oVCkKLSAgICAvLyBDYXNlcyBmb3IgYE51bGw/YCBhbmQgYE51bGwqYCBhcmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlLgotICAgIGlmIChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5xdWVzdGlvbiB8fAotICAgICAgICBudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5zdGFyKSB7Ci0gICAgICB2YXIgVCA9IHR5cGVJbXBsLndpdGhOdWxsYWJpbGl0eShOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIHJldHVybiBpc0JvdHRvbShUKTsKLSAgICB9Ci0KLSAgICAvLyBOVUxMKFQpIGlzIGZhbHNlIG90aGVyd2lzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vLyBSZXR1cm4gYHRydWVgIGZvciBhbnkgdHlwZSB3aGljaCBpcyBpbiB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YgYE9iamVjdGAuCi0gIGJvb2wgaXNPYmplY3QoRGFydFR5cGUgdHlwZSkgewotICAgIFR5cGVJbXBsIHR5cGVJbXBsID0gdHlwZTsKLSAgICBpZiAodHlwZUltcGwubnVsbGFiaWxpdHlTdWZmaXggIT0gTnVsbGFiaWxpdHlTdWZmaXgubm9uZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIE9CSkVDVChPYmplY3QpIGlzIHRydWUKLSAgICBpZiAodHlwZS5pc0RhcnRDb3JlT2JqZWN0KSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBPQkpFQ1QoRnV0dXJlT3I8VD4pIGlzIE9CSkVDVChUKQotICAgIGlmICh0eXBlIGlzIEludGVyZmFjZVR5cGUgJiYgdHlwZS5pc0RhcnRBc3luY0Z1dHVyZU9yKSB7Ci0gICAgICB2YXIgVCA9IHR5cGUudHlwZUFyZ3VtZW50c1swXTsKLSAgICAgIHJldHVybiBpc09iamVjdChUKTsKLSAgICB9Ci0KLSAgICAvLyBPQkpFQ1QoVCkgaXMgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8vIENoZWNrIGlmIFtsZWZ0VHlwZV0gaXMgYSBzdWJ0eXBlIG9mIFtyaWdodFR5cGVdLgotICAvLy8KLSAgLy8vIEltcGxlbWVudHM6Ci0gIC8vLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlCi0gIC8vLyBTZWUgYHJlc291cmNlcy90eXBlLXN5c3RlbS9zdWJ0eXBpbmcubWRgCi0gIEBvdmVycmlkZQotICBib29sIGlzU3VidHlwZU9mKERhcnRUeXBlIGxlZnRUeXBlLCBEYXJ0VHlwZSByaWdodFR5cGUpIHsKLSAgICBpZiAoIU51bGxTYWZldHlVbmRlcnN0YW5kaW5nRmxhZy5pc0VuYWJsZWQpIHsKLSAgICAgIGxlZnRUeXBlID0gTnVsbGFiaWxpdHlFbGltaW5hdG9yLnBlcmZvcm0odHlwZVByb3ZpZGVyLCBsZWZ0VHlwZSk7Ci0gICAgICByaWdodFR5cGUgPSBOdWxsYWJpbGl0eUVsaW1pbmF0b3IucGVyZm9ybSh0eXBlUHJvdmlkZXIsIHJpZ2h0VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBpc1N1YnR5cGVPZjIobGVmdFR5cGUsIHJpZ2h0VHlwZSk7Ci0gIH0KLQotICBib29sIGlzU3VidHlwZU9mMihEYXJ0VHlwZSBsZWZ0VHlwZSwgRGFydFR5cGUgcmlnaHRUeXBlKSB7Ci0gICAgcmV0dXJuIF9zdWJ0eXBlSGVscGVyLmlzU3VidHlwZU9mKGxlZnRUeXBlLCByaWdodFR5cGUpOwotICB9Ci0KLSAgLy8vIFJldHVybiBgdHJ1ZWAgZm9yIGFueSB0eXBlIHdoaWNoIGlzIGluIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBvZiB0b3AgdHlwZXMuCi0gIGJvb2wgaXNUb3AoRGFydFR5cGUgdHlwZSkgewotICAgIC8vIFRPUCg/KSBpcyB0cnVlCi0gICAgaWYgKGlkZW50aWNhbCh0eXBlLCBVbmtub3duSW5mZXJyZWRUeXBlLmluc3RhbmNlKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gVE9QKGR5bmFtaWMpIGlzIHRydWUKLSAgICBpZiAoaWRlbnRpY2FsKHR5cGUsIER5bmFtaWNUeXBlSW1wbC5pbnN0YW5jZSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFRPUCh2b2lkKSBpcyB0cnVlCi0gICAgaWYgKGlkZW50aWNhbCh0eXBlLCBWb2lkVHlwZUltcGwuaW5zdGFuY2UpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2YXIgdHlwZUltcGwgPSB0eXBlIGFzIFR5cGVJbXBsOwotICAgIHZhciBudWxsYWJpbGl0eVN1ZmZpeCA9IHR5cGVJbXBsLm51bGxhYmlsaXR5U3VmZml4OwotCi0gICAgLy8gVE9QKFQ/KSBpcyB0cnVlIGlmZiBUT1AoVCkgb3IgT0JKRUNUKFQpCi0gICAgLy8gVE9QKFQqKSBpcyB0cnVlIGlmZiBUT1AoVCkgb3IgT0JKRUNUKFQpCi0gICAgaWYgKG51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnF1ZXN0aW9uIHx8Ci0gICAgICAgIG51bGxhYmlsaXR5U3VmZml4ID09IE51bGxhYmlsaXR5U3VmZml4LnN0YXIpIHsKLSAgICAgIHZhciBUID0gdHlwZUltcGwud2l0aE51bGxhYmlsaXR5KE51bGxhYmlsaXR5U3VmZml4Lm5vbmUpOwotICAgICAgcmV0dXJuIGlzVG9wKFQpIHx8IGlzT2JqZWN0KFQpOwotICAgIH0KLQotICAgIC8vIFRPUChGdXR1cmVPcjxUPikgaXMgVE9QKFQpCi0gICAgaWYgKHR5cGUgaXMgSW50ZXJmYWNlVHlwZSAmJiB0eXBlLmlzRGFydEFzeW5jRnV0dXJlT3IpIHsKLSAgICAgIGFzc2VydChudWxsYWJpbGl0eVN1ZmZpeCA9PSBOdWxsYWJpbGl0eVN1ZmZpeC5ub25lKTsKLSAgICAgIHZhciBUID0gdHlwZS50eXBlQXJndW1lbnRzWzBdOwotICAgICAgcmV0dXJuIGlzVG9wKFQpOwotICAgIH0KLQotICAgIC8vIFRPUChUKSBpcyBmYWxzZSBvdGhlcndpc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgbGVhc3QgY2xvc3VyZSBvZiB0aGUgZ2l2ZW4gdHlwZSBbc2NoZW1hXSB3aXRoIHJlc3BlY3QgdG8gYF9gLgotICAvLy8KLSAgLy8vIFRoZSBsZWFzdCBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgYFBgIHdpdGggcmVzcGVjdCB0byBgX2AgaXMgZGVmaW5lZCBhcwotICAvLy8gYFBgIHdpdGggZXZlcnkgY292YXJpYW50IG9jY3VycmVuY2Ugb2YgYF9gIHJlcGxhY2VkIHdpdGggYE9iamVjdGAsIGFuCi0gIC8vLyBldmVyeSBjb250cmF2YXJpYW50IG9jY3VycmVuY2Ugb2YgYF9gIHJlcGxhY2VkIHdpdGggYE51bGxgLgotICAvLy8KLSAgLy8vIElmIHRoZSBzY2hlbWEgY29udGFpbnMgbm8gaW5zdGFuY2VzIG9mIGBfYCwgdGhlIG9yaWdpbmFsIHNjaGVtYSBvYmplY3QgaXMKLSAgLy8vIHJldHVybmVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24uCi0gIC8vLwotICAvLy8gTm90ZSB0aGF0IHRoZSBjbG9zdXJlIG9mIGEgdHlwZSBzY2hlbWEgaXMgYSBwcm9wZXIgdHlwZS4KLSAgLy8vCi0gIC8vLyBOb3RlIHRoYXQgdGhlIGxlYXN0IGNsb3N1cmUgb2YgYSB0eXBlIHNjaGVtYSBpcyBhbHdheXMgYSBzdWJ0eXBlIG9mIGFueQotICAvLy8gdHlwZSB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWEuCi0gIERhcnRUeXBlIGxlYXN0Q2xvc3VyZShEYXJ0VHlwZSBzY2hlbWEpIHsKLSAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgewotICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAotICAgICAgICB0b3BUeXBlOiBvYmplY3RRdWVzdGlvbiwKLSAgICAgICAgYm90dG9tVHlwZTogTmV2ZXJUeXBlSW1wbC5pbnN0YW5jZSwKLSAgICAgICAgaXNMZWFzdENsb3N1cmU6IHRydWUsCi0gICAgICAgIHNjaGVtYTogc2NoZW1hLAotICAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIFR5cGVTY2hlbWFFbGltaW5hdGlvblZpc2l0b3IucnVuKAotICAgICAgICB0b3BUeXBlOiBEeW5hbWljVHlwZUltcGwuaW5zdGFuY2UsCi0gICAgICAgIGJvdHRvbVR5cGU6IHR5cGVQcm92aWRlci5udWxsVHlwZSwKLSAgICAgICAgaXNMZWFzdENsb3N1cmU6IHRydWUsCi0gICAgICAgIHNjaGVtYTogc2NoZW1hLAotICAgICAgKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIFtUXS4KLSAgICoKLSAgICogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZQotICAgKiBTZWUgYHJlc291cmNlcy90eXBlLXN5c3RlbS9ub3JtYWxpemF0aW9uLm1kYAotICAgKi8KLSAgRGFydFR5cGUgbm9ybWFsaXplKERhcnRUeXBlIFQpIHsKLSAgICByZXR1cm4gTm9ybWFsaXplSGVscGVyKHRoaXMpLm5vcm1hbGl6ZShUKTsKLSAgfQotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSByZWZpbmVCaW5hcnlFeHByZXNzaW9uVHlwZShEYXJ0VHlwZSBsZWZ0VHlwZSwgVG9rZW5UeXBlIG9wZXJhdG9yLAotICAgICAgRGFydFR5cGUgcmlnaHRUeXBlLCBEYXJ0VHlwZSBjdXJyZW50VHlwZSkgewotICAgIGlmIChsZWZ0VHlwZSBpcyBUeXBlUGFyYW1ldGVyVHlwZSAmJiBsZWZ0VHlwZS5ib3VuZC5pc0RhcnRDb3JlTnVtKSB7Ci0gICAgICBpZiAocmlnaHRUeXBlID09IGxlZnRUeXBlIHx8IHJpZ2h0VHlwZS5pc0RhcnRDb3JlSW50KSB7Ci0gICAgICAgIGlmIChvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVUyB8fAotICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTIHx8Ci0gICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUiB8fAotICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlBMVVNfRVEgfHwKLSAgICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VU19FUSB8fAotICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlNUQVJfRVEgfHwKLSAgICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5QTFVTX1BMVVMgfHwKLSAgICAgICAgICAgIG9wZXJhdG9yID09IFRva2VuVHlwZS5NSU5VU19NSU5VUykgewotICAgICAgICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvbW90ZVRvTm9uTnVsbChsZWZ0VHlwZSBhcyBUeXBlSW1wbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBsZWZ0VHlwZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJpZ2h0VHlwZS5pc0RhcnRDb3JlRG91YmxlKSB7Ci0gICAgICAgIGlmIChvcGVyYXRvciA9PSBUb2tlblR5cGUuUExVUyB8fAotICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLk1JTlVTIHx8Ci0gICAgICAgICAgICBvcGVyYXRvciA9PSBUb2tlblR5cGUuU1RBUiB8fAotICAgICAgICAgICAgb3BlcmF0b3IgPT0gVG9rZW5UeXBlLlNMQVNIKSB7Ci0gICAgICAgICAgSW50ZXJmYWNlVHlwZUltcGwgZG91YmxlVHlwZSA9IHR5cGVQcm92aWRlci5kb3VibGVUeXBlOwotICAgICAgICAgIGlmIChpc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvbW90ZVRvTm9uTnVsbChkb3VibGVUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGRvdWJsZVR5cGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjdXJyZW50VHlwZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyCi0gICAgICAgIC5yZWZpbmVCaW5hcnlFeHByZXNzaW9uVHlwZShsZWZ0VHlwZSwgb3BlcmF0b3IsIHJpZ2h0VHlwZSwgY3VycmVudFR5cGUpOwotICB9Ci0KLSAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgcnVudGltZSB0eXBlcyBbVDFdIGFuZCBbVDJdIGFyZSBlcXVhbC4KLSAgLy8vCi0gIC8vLyBubmJkL2ZlYXR1cmUtc3BlY2lmaWNhdGlvbi5tZCNydW50aW1lLXR5cGUtZXF1YWxpdHktb3BlcmF0b3IKLSAgYm9vbCBydW50aW1lVHlwZXNFcXVhbChEYXJ0VHlwZSBUMSwgRGFydFR5cGUgVDIpIHsKLSAgICByZXR1cm4gUnVudGltZVR5cGVFcXVhbGl0eUhlbHBlcih0aGlzKS5lcXVhbChUMSwgVDIpOwotICB9Ci0KLSAgRGFydFR5cGUgdG9MZWdhY3lUeXBlKERhcnRUeXBlIHR5cGUpIHsKLSAgICBpZiAoaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgcmV0dXJuIHR5cGU7Ci0gICAgcmV0dXJuIE51bGxhYmlsaXR5RWxpbWluYXRvci5wZXJmb3JtKHR5cGVQcm92aWRlciwgdHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogTWVyZ2VzIHR3byB0eXBlcyBpbnRvIGEgc2luZ2xlIHR5cGUuCi0gICAqIENvbXB1dGUgdGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiBbVF0uCi0gICAqCi0gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvbGFuZ3VhZ2UvCi0gICAqIFNlZSBgYWNjZXB0ZWQvZnV0dXJlLXJlbGVhc2VzL25uYmQvZmVhdHVyZS1zcGVjaWZpY2F0aW9uLm1kYAotICAgKiBTZWUgYCNjbGFzc2VzLWRlZmluZWQtaW4tb3B0ZWQtaW4tbGlicmFyaWVzYAotICAgKi8KLSAgRGFydFR5cGUgdG9wTWVyZ2UoRGFydFR5cGUgVCwgRGFydFR5cGUgUykgewotICAgIHJldHVybiBUb3BNZXJnZUhlbHBlcih0aGlzKS50b3BNZXJnZShULCBTKTsKLSAgfQotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSB0cnlQcm9tb3RlVG9UeXBlKERhcnRUeXBlIHRvLCBEYXJ0VHlwZSBmcm9tKSB7Ci0gICAgLy8gQWxsb3cgcHJvbW90aW5nIHRvIGEgc3VidHlwZSwgZm9yIGV4YW1wbGU6Ci0gICAgLy8KLSAgICAvLyAgICAgZihCYXNlIGIpIHsKLSAgICAvLyAgICAgICBpZiAoYiBpcyBTdWJUeXBlT2ZCYXNlKSB7Ci0gICAgLy8gICAgICAgICAvLyBwcm9tb3RlIGBiYCB0byBTdWJUeXBlT2ZCYXNlIGZvciB0aGlzIGJsb2NrCi0gICAgLy8gICAgICAgfQotICAgIC8vICAgICB9Ci0gICAgLy8KLSAgICAvLyBUaGlzIGFsbG93cyB0aGUgdmFyaWFibGUgdG8gYmUgdXNlZCB3aGVyZXZlciB0aGUgc3VwZXJ0eXBlIChoZXJlIGBCYXNlYCkKLSAgICAvLyBpcyBleHBlY3RlZCwgd2hpbGUgZ2FpbmluZyBhIG1vcmUgcHJlY2lzZSB0eXBlLgotICAgIGlmIChpc1N1YnR5cGVPZjIodG8sIGZyb20pKSB7Ci0gICAgICByZXR1cm4gdG87Ci0gICAgfQotICAgIC8vIEZvciBhIHR5cGUgcGFyYW1ldGVyIGBUIGV4dGVuZHMgVWAsIGFsbG93IHByb21vdGluZyB0aGUgdXBwZXIgYm91bmQKLSAgICAvLyBgVWAgdG8gYFNgIHdoZXJlIGBTIDw6IFVgLCB5aWVsZGluZyBhIHR5cGUgcGFyYW1ldGVyIGBUIGV4dGVuZHMgU2AuCi0gICAgaWYgKGZyb20gaXMgVHlwZVBhcmFtZXRlclR5cGUpIHsKLSAgICAgIGlmIChpc1N1YnR5cGVPZjIodG8sIGZyb20uYm91bmQgPz8gRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlKSkgewotICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSBmcm9tLmVsZW1lbnQuZGVjbGFyYXRpb247Ci0gICAgICAgIHJldHVybiBUeXBlUGFyYW1ldGVyVHlwZUltcGwoCi0gICAgICAgICAgZWxlbWVudDogZGVjbGFyYXRpb24sCi0gICAgICAgICAgbnVsbGFiaWxpdHlTdWZmaXg6IGZyb20ubnVsbGFiaWxpdHlTdWZmaXgsCi0gICAgICAgICAgcHJvbW90ZWRCb3VuZDogdG8sCi0gICAgICAgICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICB2b2lkIHVwZGF0ZU9wdGlvbnMoewotICAgIEByZXF1aXJlZCBib29sIGltcGxpY2l0Q2FzdHMsCi0gICAgQHJlcXVpcmVkIGJvb2wgc3RyaWN0SW5mZXJlbmNlLAotICB9KSB7Ci0gICAgdGhpcy5pbXBsaWNpdENhc3RzID0gaW1wbGljaXRDYXN0czsKLSAgICB0aGlzLnN0cmljdEluZmVyZW5jZSA9IHN0cmljdEluZmVyZW5jZTsKLSAgfQotCi0gIExpc3Q8RGFydFR5cGU+IF9kZWZhdWx0VHlwZUFyZ3VtZW50cygKLSAgICBMaXN0PFR5cGVQYXJhbWV0ZXJFbGVtZW50PiB0eXBlUGFyYW1ldGVycywKLSAgKSB7Ci0gICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzLm1hcCgodHlwZVBhcmFtZXRlcikgewotICAgICAgdmFyIHR5cGVQYXJhbWV0ZXJJbXBsID0gdHlwZVBhcmFtZXRlciBhcyBUeXBlUGFyYW1ldGVyRWxlbWVudEltcGw7Ci0gICAgICByZXR1cm4gdHlwZVBhcmFtZXRlckltcGwuZGVmYXVsdFR5cGU7Ci0gICAgfSkudG9MaXN0KCk7Ci0gIH0KLX0KLQotY2xhc3MgX1R5cGVWYXJpYWJsZUVsaW1pbmF0b3IgZXh0ZW5kcyBTdWJzdGl0dXRpb24gewotICBmaW5hbCBEYXJ0VHlwZSBfdG9wVHlwZTsKLSAgZmluYWwgRGFydFR5cGUgX2JvdHRvbVR5cGU7Ci0KLSAgX1R5cGVWYXJpYWJsZUVsaW1pbmF0b3IoCi0gICAgdGhpcy5fdG9wVHlwZSwKLSAgICB0aGlzLl9ib3R0b21UeXBlLAotICApOwotCi0gIEBvdmVycmlkZQotICBEYXJ0VHlwZSBnZXRTdWJzdGl0dXRlKFR5cGVQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlciwgYm9vbCB1cHBlckJvdW5kKSB7Ci0gICAgcmV0dXJuIHVwcGVyQm91bmQgPyBfYm90dG9tVHlwZSA6IF90b3BUeXBlOwotICB9Ci19CitleHBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfY29sbGVjdGlvbi5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19jb2xsZWN0aW9uLmRhcnQKaW5kZXggNzRmYmViYS4uNTk3NThlNCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19jb2xsZWN0aW9uLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19jb2xsZWN0aW9uLmRhcnQKQEAgLTQsOSArNCw3IEBACiAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2phdmFfY29yZS5kYXJ0JzsKIAotLyoqCi0gKiBSZXR1cm5zIGB0cnVlYCBpZiBhIGFuZCBiIGNvbnRhaW4gZXF1YWwgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCi0gKi8KKy8vLyBSZXR1cm5zIGB0cnVlYCBpZiBhIGFuZCBiIGNvbnRhaW4gZXF1YWwgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCiBib29sIGxpc3RzRXF1YWwoTGlzdCBhLCBMaXN0IGIpIHsKICAgLy8gVE9ETyhybnlzdHJvbSk6IHBhY2thZ2U6Y29sbGVjdGlvbiBhbHNvIGltcGxlbWVudHMgdGhpcywgYW5kIGFuYWx5emVyCiAgIC8vIGFscmVhZHkgdHJhbnNpdGl2ZWx5IGRlcGVuZHMgb24gdGhhdCBwYWNrYWdlLiBDb25zaWRlciB1c2luZyBpdCBpbnN0ZWFkLgpAQCAtMjcsMzAgKzI1LDIyIEBACiAgIHJldHVybiB0cnVlOwogfQogCi0vKioKLSAqIE1ldGhvZHMgZm9yIG9wZXJhdGluZyBvbiBpbnRlZ2VycyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzIG9mIGJvb2xlYW5zLiBUaGVzZQotICogYXJyYXlzIGNhbiBiZSBpbmRleGVkIGJ5IGVpdGhlciBpbnRlZ2VycyBvciBieSBlbnVtZXJhdGlvbiBjb25zdGFudHMuCi0gKi8KKy8vLyBNZXRob2RzIGZvciBvcGVyYXRpbmcgb24gaW50ZWdlcnMgYXMgaWYgdGhleSB3ZXJlIGFycmF5cyBvZiBib29sZWFucy4gVGhlc2UKKy8vLyBhcnJheXMgY2FuIGJlIGluZGV4ZWQgYnkgZWl0aGVyIGludGVnZXJzIG9yIGJ5IGVudW1lcmF0aW9uIGNvbnN0YW50cy4KIGNsYXNzIEJvb2xlYW5BcnJheSB7Ci0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IG9mIHRoZSBnaXZlbiBbYXJyYXldIGF0IHRoZSBnaXZlbiBbaW5kZXhdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgb2YgdGhlIGdpdmVuIFthcnJheV0gYXQgdGhlIGdpdmVuIFtpbmRleF0uCiAgIHN0YXRpYyBib29sIGdldChpbnQgYXJyYXksIGludCBpbmRleCkgewogICAgIF9jaGVja0luZGV4KGluZGV4KTsKICAgICByZXR1cm4gKGFycmF5ICYgKDEgPDwgaW5kZXgpKSA+IDA7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgIEBkZXByZWNhdGVkCiAgIHN0YXRpYyBib29sIGdldEVudW08RSBleHRlbmRzIEVudW08RT4+KGludCBhcnJheSwgRW51bTxFPiBpbmRleCkgPT4KICAgICAgIGdldChhcnJheSwgaW5kZXgub3JkaW5hbCk7CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgb2YgdGhlIGdpdmVuIFthcnJheV0gYXQgdGhlIGdpdmVuIFtpbmRleF0gdG8KLSAgICogdGhlIGdpdmVuIFt2YWx1ZV0uCi0gICAqLworICAvLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gW2FycmF5XSBhdCB0aGUgZ2l2ZW4gW2luZGV4XSB0bworICAvLy8gdGhlIGdpdmVuIFt2YWx1ZV0uCiAgIHN0YXRpYyBpbnQgc2V0KGludCBhcnJheSwgaW50IGluZGV4LCBib29sIHZhbHVlKSB7CiAgICAgX2NoZWNrSW5kZXgoaW5kZXgpOwogICAgIGlmICh2YWx1ZSkgewpAQCAtNjAsMTcgKzUwLDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCisgIC8vLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCB0byB0aGUgZ2l2ZW4gdmFsdWUuCiAgIEBkZXByZWNhdGVkCiAgIHN0YXRpYyBpbnQgc2V0RW51bTxFIGV4dGVuZHMgRW51bTxFPj4oaW50IGFycmF5LCBFbnVtPEU+IGluZGV4LCBib29sIHZhbHVlKSA9PgogICAgICAgc2V0KGFycmF5LCBpbmRleC5vcmRpbmFsLCB2YWx1ZSk7CiAKLSAgLyoqCi0gICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgbm90IHdpdGhpbiB0aGUgYm91bmRzIGFsbG93ZWQgZm9yIGFuCi0gICAqIGludGVnZXItZW5jb2RlZCBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4KLSAgICovCisgIC8vLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5vdCB3aXRoaW4gdGhlIGJvdW5kcyBhbGxvd2VkIGZvciBhbgorICAvLy8gaW50ZWdlci1lbmNvZGVkIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLgogICBzdGF0aWMgdm9pZCBfY2hlY2tJbmRleChpbnQgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gMzApIHsKICAgICAgIHRocm93IFJhbmdlRXJyb3IoIkluZGV4IG5vdCBiZXR3ZWVuIDAgYW5kIDMwOiAkaW5kZXgiKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQKaW5kZXggNDRkNmE0ZS4uODdkZWRlOSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQKQEAgLTksMTAgKzksOCBAQAogZXhwb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3V0aWwvcmVzb2x2ZV9yZWxhdGl2ZV91cmkuZGFydCcKICAgICBzaG93IHJlc29sdmVSZWxhdGl2ZVVyaTsKIAotLyoqCi0gKiBJZiB0aGUgZ2l2ZW4gW25vZGVdIGhhcyBhIGRvY3VtZW50YXRpb24gY29tbWVudCwgcmVtZW1iZXIgaXRzIGNvbnRlbnQKLSAqIGFuZCByYW5nZSBpbnRvIHRoZSBnaXZlbiBbZWxlbWVudF0uCi0gKi8KKy8vLyBJZiB0aGUgZ2l2ZW4gW25vZGVdIGhhcyBhIGRvY3VtZW50YXRpb24gY29tbWVudCwgcmVtZW1iZXIgaXRzIGNvbnRlbnQKKy8vLyBhbmQgcmFuZ2UgaW50byB0aGUgZ2l2ZW4gW2VsZW1lbnRdLgogdm9pZCBzZXRFbGVtZW50RG9jdW1lbnRhdGlvbkNvbW1lbnQoRWxlbWVudEltcGwgZWxlbWVudCwgQW5ub3RhdGVkTm9kZSBub2RlKSB7CiAgIENvbW1lbnQgY29tbWVudCA9IG5vZGUuZG9jdW1lbnRhdGlvbkNvbW1lbnQ7CiAgIGlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5pc0RvY3VtZW50YXRpb24pIHsKQEAgLTIxLDEwICsxOSw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBDaGVjayB3aGV0aGVyIFt1cmkxXSBzdGFydHMgd2l0aCAob3IgJ2lzIHByZWZpeGVkIGJ5JykgW3VyaTJdIGJ5IGNoZWNraW5nCi0gKiBwYXRoIHNlZ21lbnRzLgotICovCisvLy8gQ2hlY2sgd2hldGhlciBbdXJpMV0gc3RhcnRzIHdpdGggKG9yICdpcyBwcmVmaXhlZCBieScpIFt1cmkyXSBieSBjaGVja2luZworLy8vIHBhdGggc2VnbWVudHMuCiBib29sIHN0YXJ0c1dpdGgoVXJpIHVyaTEsIFVyaSB1cmkyKSB7CiAgIExpc3Q8U3RyaW5nPiB1cmkxU2VnbWVudHMgPSB1cmkxLnBhdGhTZWdtZW50czsKICAgTGlzdDxTdHJpbmc+IHVyaTJTZWdtZW50cyA9IHVyaTIucGF0aFNlZ21lbnRzLnRvTGlzdCgpOwpAQCAtNDksMTAgKzQ1LDggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qKgotICogVGhlIGtpbmQgb2YgYSBwYXJhbWV0ZXIuIEEgcGFyYW1ldGVyIGNhbiBiZSBlaXRoZXIgcG9zaXRpb25hbCBvciBuYW1lZCwgYW5kCi0gKiBjYW4gYmUgZWl0aGVyIHJlcXVpcmVkIG9yIG9wdGlvbmFsLiAKLSAqLworLy8vIFRoZSBraW5kIG9mIGEgcGFyYW1ldGVyLiBBIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIHBvc2l0aW9uYWwgb3IgbmFtZWQsIGFuZAorLy8vIGNhbiBiZSBlaXRoZXIgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCiBjbGFzcyBQYXJhbWV0ZXJLaW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQYXJhbWV0ZXJLaW5kPiB7CiAgIC8vLyBBIHBvc2l0aW9uYWwgcmVxdWlyZWQgcGFyYW1ldGVyLgogICBzdGF0aWMgY29uc3QgUGFyYW1ldGVyS2luZCBSRVFVSVJFRCA9CkBAIC03NiwyOSArNzAsMTkgQEAKICAgICBOQU1FRAogICBdOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGlzIHBhcmFtZXRlci4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGlzIHBhcmFtZXRlci4KICAgZmluYWwgU3RyaW5nIG5hbWU7CiAKLSAgLyoqCi0gICAqIFRoZSBvcmRpbmFsIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICAqLworICAvLy8gVGhlIG9yZGluYWwgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgZmluYWwgaW50IG9yZGluYWw7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpcyBhIG5hbWVkIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpcyBhIG5hbWVkIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgogICBmaW5hbCBib29sIGlzTmFtZWQ7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpcyBhbiBvcHRpb25hbCBvciByZXF1aXJlZCBwYXJhbWV0ZXIuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGFuIG9wdGlvbmFsIG9yIHJlcXVpcmVkIHBhcmFtZXRlci4KICAgZmluYWwgYm9vbCBpc09wdGlvbmFsOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBraW5kIHdpdGggdGhlIGdpdmVuIHN0YXRlLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGtpbmQgd2l0aCB0aGUgZ2l2ZW4gc3RhdGUuCiAgIGNvbnN0IFBhcmFtZXRlcktpbmQodGhpcy5uYW1lLCB0aGlzLm9yZGluYWwsIHRoaXMuaXNOYW1lZCwgdGhpcy5pc09wdGlvbmFsKTsKIAogICBAb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZ2VuZXJhbC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19nZW5lcmFsLmRhcnQKaW5kZXggMzAwOGE3Ny4uZGMwNWMyYyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19nZW5lcmFsLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19nZW5lcmFsLmRhcnQKQEAgLTgsMjIgKzgsMTcgQEAKIAogaW1wb3J0ICdwYWNrYWdlOnlhbWwveWFtbC5kYXJ0JzsKIAotLyoqCi0gKiBUZXN0IGlmIHRoZSBnaXZlbiBbdmFsdWVdIGlzIGBmYWxzZWAgb3IgdGhlIHN0cmluZyAiZmFsc2UiIChjYXNlLWluc2Vuc2l0aXZlKS4KLSAqLworLy8vIFRlc3QgaWYgdGhlIGdpdmVuIFt2YWx1ZV0gaXMgYGZhbHNlYCBvciB0aGUgc3RyaW5nICJmYWxzZSIKKy8vLyAoY2FzZS1pbnNlbnNpdGl2ZSkuCiBib29sIGlzRmFsc2UoT2JqZWN0IHZhbHVlKSA9PgogICAgIHZhbHVlIGlzIGJvb2wgPyAhdmFsdWUgOiB0b0xvd2VyQ2FzZSh2YWx1ZSkgPT0gJ2ZhbHNlJzsKIAotLyoqCi0gKiBUZXN0IGlmIHRoZSBnaXZlbiBbdmFsdWVdIGlzIGB0cnVlYCBvciB0aGUgc3RyaW5nICJ0cnVlIiAoY2FzZS1pbnNlbnNpdGl2ZSkuCi0gKi8KKy8vLyBUZXN0IGlmIHRoZSBnaXZlbiBbdmFsdWVdIGlzIGB0cnVlYCBvciB0aGUgc3RyaW5nICJ0cnVlIiAoY2FzZS1pbnNlbnNpdGl2ZSkuCiBib29sIGlzVHJ1ZShPYmplY3QgdmFsdWUpID0+CiAgICAgdmFsdWUgaXMgYm9vbCA/IHZhbHVlIDogdG9Mb3dlckNhc2UodmFsdWUpID09ICd0cnVlJzsKIAotLyoqCi0gKiBTYWZlbHkgY29udmVydCB0aGUgZ2l2ZW4gW3ZhbHVlXSB0byBhIGJvb2wgdmFsdWUsIG9yIHJldHVybiBgbnVsbGAgaWYgdGhlCi0gKiB2YWx1ZSBjb3VsZCBub3QgYmUgY29udmVydGVkLgotICovCisvLy8gU2FmZWx5IGNvbnZlcnQgdGhlIGdpdmVuIFt2YWx1ZV0gdG8gYSBib29sIHZhbHVlLCBvciByZXR1cm4gYG51bGxgIGlmIHRoZQorLy8vIHZhbHVlIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQuCiBib29sIHRvQm9vbChPYmplY3QgdmFsdWUpIHsKICAgaWYgKHZhbHVlIGlzIFlhbWxTY2FsYXIpIHsKICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBZYW1sU2NhbGFyKS52YWx1ZTsKQEAgLTQxLDE2ICszNiwxMiBAQAogICByZXR1cm4gbnVsbDsKIH0KIAotLyoqCi0gKiBTYWZlbHkgY29udmVydCB0aGlzIFt2YWx1ZV0gdG8gbG93ZXIgY2FzZSwgcmV0dXJuaW5nIGBudWxsYCBpZiBbdmFsdWVdIGlzCi0gKiBudWxsLgotICovCisvLy8gU2FmZWx5IGNvbnZlcnQgdGhpcyBbdmFsdWVdIHRvIGxvd2VyIGNhc2UsIHJldHVybmluZyBgbnVsbGAgaWYgW3ZhbHVlXSBpcworLy8vIG51bGwuCiBTdHJpbmcgdG9Mb3dlckNhc2UoT2JqZWN0IHZhbHVlKSA9PiB2YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKTsKIAotLyoqCi0gKiBTYWZlbHkgY29udmVydCB0aGlzIFt2YWx1ZV0gdG8gdXBwZXIgY2FzZSwgcmV0dXJuaW5nIGBudWxsYCBpZiBbdmFsdWVdIGlzCi0gKiBudWxsLgotICovCisvLy8gU2FmZWx5IGNvbnZlcnQgdGhpcyBbdmFsdWVdIHRvIHVwcGVyIGNhc2UsIHJldHVybmluZyBgbnVsbGAgaWYgW3ZhbHVlXSBpcworLy8vIG51bGwuCiBTdHJpbmcgdG9VcHBlckNhc2UoT2JqZWN0IHZhbHVlKSA9PiB2YWx1ZT8udG9TdHJpbmcoKT8udG9VcHBlckNhc2UoKTsKIAogLy8vIEplbmtpbnMgaGFzaCBmdW5jdGlvbiwgb3B0aW1pemVkIGZvciBzbWFsbCBpbnRlZ2Vycy4KQEAgLTEwNCwxNSArOTUsMTEgQEAKICAgICAgIGZpbmlzaChjb21iaW5lKGNvbWJpbmUoY29tYmluZShjb21iaW5lKDAsIGEpLCBiKSwgYyksIGQpKTsKIH0KIAotLyoqCi0gKiBBIHNpbXBsZSBsaW1pdGVkIHF1ZXVlLgotICovCisvLy8gQSBzaW1wbGUgbGltaXRlZCBxdWV1ZS4KIGNsYXNzIExpbWl0ZWRRdWV1ZTxFPiBleHRlbmRzIExpc3RRdWV1ZTxFPiB7CiAgIGZpbmFsIGludCBsaW1pdDsKIAotICAvKioKLSAgICogQ3JlYXRlIGEgcXVldWUgd2l0aCBbbGltaXRdIGl0ZW1zLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIHF1ZXVlIHdpdGggW2xpbWl0XSBpdGVtcy4KICAgTGltaXRlZFF1ZXVlKHRoaXMubGltaXQpOwogCiAgIEBvdmVycmlkZQpAQCAtMTI0LDU3ICsxMTEsMzkgQEAKICAgfQogfQogCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgZ2F0aGVyaW5nIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MuICBUaGlzIGNsYXNzIGlzIG1vZGVsZWQgb24KLSAqIHRoZSBVc2VyVGFnIGNsYXNzIGluIGRhcnQ6ZGV2ZWxvcGVyIHNvIHRoYXQgaXQgY2FuIGludGVyb3BlcmF0ZSBlYXNpbHkgd2l0aAotICogaXQuCi0gKi8KKy8vLyBIZWxwZXIgY2xhc3MgZm9yIGdhdGhlcmluZyBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzLiAgVGhpcyBjbGFzcyBpcyBtb2RlbGVkIG9uCisvLy8gdGhlIFVzZXJUYWcgY2xhc3MgaW4gZGFydDpkZXZlbG9wZXIgc28gdGhhdCBpdCBjYW4gaW50ZXJvcGVyYXRlIGVhc2lseSB3aXRoCisvLy8gaXQuCiBhYnN0cmFjdCBjbGFzcyBQZXJmb3JtYW5jZVRhZyB7Ci0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBbUGVyZm9ybWFuY2VUYWddcyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gYSBsaXN0IG9mIGFsbCBbUGVyZm9ybWFuY2VUYWddcyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZC4KICAgc3RhdGljIExpc3Q8UGVyZm9ybWFuY2VUYWc+IGdldCBhbGwgPT4gX1BlcmZvcm1hbmNlVGFnSW1wbC5hbGwudG9MaXN0KCk7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY3VycmVudCBbUGVyZm9ybWFuY2VUYWddIGZvciB0aGUgaXNvbGF0ZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgW1BlcmZvcm1hbmNlVGFnXSBmb3IgdGhlIGlzb2xhdGUuCiAgIHN0YXRpYyBQZXJmb3JtYW5jZVRhZyBnZXQgY3VycmVudCA9PiBfUGVyZm9ybWFuY2VUYWdJbXBsLmN1cnJlbnQ7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgW1BlcmZvcm1hbmNlVGFnXSB0aGF0IGlzIGluaXRpYWxseSBjdXJyZW50LiAgVGhpcyBpcyBpbnRlbmRlZAotICAgKiB0byB0cmFjayB0aW1lIHdoZW4gdGhlIHN5c3RlbSBpcyBwZXJmb3JtaW5nIHVua25vd24gb3BlcmF0aW9ucy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtQZXJmb3JtYW5jZVRhZ10gdGhhdCBpcyBpbml0aWFsbHkgY3VycmVudC4gIFRoaXMgaXMgaW50ZW5kZWQKKyAgLy8vIHRvIHRyYWNrIHRpbWUgd2hlbiB0aGUgc3lzdGVtIGlzIHBlcmZvcm1pbmcgdW5rbm93biBvcGVyYXRpb25zLgogICBzdGF0aWMgUGVyZm9ybWFuY2VUYWcgZ2V0IHVua25vd24gPT4gX1BlcmZvcm1hbmNlVGFnSW1wbC51bmtub3duOwogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBbUGVyZm9ybWFuY2VUYWddIGhhdmluZyB0aGUgZ2l2ZW4gW2xhYmVsXS4gIEEgW1VzZXJUYWddIHdpbGwgYWxzbwotICAgKiBiZSBjcmVhdGVkLCBoYXZpbmcgdGhlIHNhbWUgW2xhYmVsXSwgc28gdGhhdCBwZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBjYW4KLSAgICogYmUgcXVlcmllZCB1c2luZyB0aGUgb2JzZXJ2YXRvcnkuCi0gICAqLworICAvLy8gQ3JlYXRlIGEgW1BlcmZvcm1hbmNlVGFnXSBoYXZpbmcgdGhlIGdpdmVuIFtsYWJlbF0uICBBIFtVc2VyVGFnXSB3aWxsIGFsc28KKyAgLy8vIGJlIGNyZWF0ZWQsIGhhdmluZyB0aGUgc2FtZSBbbGFiZWxdLCBzbyB0aGF0IHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIGNhbgorICAvLy8gYmUgcXVlcmllZCB1c2luZyB0aGUgb2JzZXJ2YXRvcnkuCiAgIGZhY3RvcnkgUGVyZm9ybWFuY2VUYWcoU3RyaW5nIGxhYmVsKSA9IF9QZXJmb3JtYW5jZVRhZ0ltcGw7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IHRoaXMgW1BlcmZvcm1hbmNlVGFnXSBoYXMKLSAgICogYmVlbiB0aGUgY3VycmVudCBbUGVyZm9ybWFuY2VUYWddIGZvciB0aGUgaXNvbGF0ZS4KLSAgICoKLSAgICogVGhpcyBjYWxsIGlzIHNhZmUgZXZlbiBpZiB0aGlzIFtQZXJmb3JtYW5jZVRhZ10gaXMgY3VycmVudC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGlzIFtQZXJmb3JtYW5jZVRhZ10gaGFzCisgIC8vLyBiZWVuIHRoZSBjdXJyZW50IFtQZXJmb3JtYW5jZVRhZ10gZm9yIHRoZSBpc29sYXRlLgorICAvLy8KKyAgLy8vIFRoaXMgY2FsbCBpcyBzYWZlIGV2ZW4gaWYgdGhpcyBbUGVyZm9ybWFuY2VUYWddIGlzIGN1cnJlbnQuCiAgIGludCBnZXQgZWxhcHNlZE1zOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxhYmVsIGZvciB0aGlzIFtQZXJmb3JtYW5jZVRhZ10uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhpcyBbUGVyZm9ybWFuY2VUYWddLgogICBTdHJpbmcgZ2V0IGxhYmVsOwogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBjaGlsZCB0YWcgb2YgdGhlIGN1cnJlbnQgdGFnLiBUaGUgbmV3IHRhZydzIG5hbWUgd2lsbCBpbmNsdWRlIHRoZQotICAgKiBwYXJlbnQncyBuYW1lLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIGNoaWxkIHRhZyBvZiB0aGUgY3VycmVudCB0YWcuIFRoZSBuZXcgdGFnJ3MgbmFtZSB3aWxsIGluY2x1ZGUgdGhlCisgIC8vLyBwYXJlbnQncyBuYW1lLgogICBQZXJmb3JtYW5jZVRhZyBjcmVhdGVDaGlsZChTdHJpbmcgY2hpbGRUYWdOYW1lKTsKIAotICAvKioKLSAgICogTWFrZSB0aGlzIHRoZSBjdXJyZW50IHRhZyBmb3IgdGhlIGlzb2xhdGUsIGFuZCByZXR1cm4gdGhlIHByZXZpb3VzIHRhZy4KLSAgICovCisgIC8vLyBNYWtlIHRoaXMgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGUgaXNvbGF0ZSwgYW5kIHJldHVybiB0aGUgcHJldmlvdXMgdGFnLgogICBQZXJmb3JtYW5jZVRhZyBtYWtlQ3VycmVudCgpOwogCiAgIC8vLyBNYWtlIHRoaXMgdGhlIGN1cnJlbnQgdGFnIGZvciB0aGUgaXNvbGF0ZSwgcnVuIFtmXSwgYW5kIHJlc3RvcmUgdGhlCkBAIC0xODUsOSArMTU0LDcgQEAKICAgLy8vIHByZXZpb3VzIHRhZy4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIFtmXS4KICAgRnV0dXJlPEU+IG1ha2VDdXJyZW50V2hpbGVBc3luYzxFPihGdXR1cmU8RT4gRnVuY3Rpb24oKSBmKTsKIAotICAvKioKLSAgICogUmVzZXQgdGhlIHRvdGFsIHRpbWUgdHJhY2tlZCBieSBhbGwgW1BlcmZvcm1hbmNlVGFnXXMgdG8gemVyby4KLSAgICovCisgIC8vLyBSZXNldCB0aGUgdG90YWwgdGltZSB0cmFja2VkIGJ5IGFsbCBbUGVyZm9ybWFuY2VUYWddcyB0byB6ZXJvLgogICBzdGF0aWMgdm9pZCByZXNldCgpIHsKICAgICBmb3IgKF9QZXJmb3JtYW5jZVRhZ0ltcGwgdGFnIGluIF9QZXJmb3JtYW5jZVRhZ0ltcGwuYWxsKSB7CiAgICAgICB0YWcuc3RvcHdhdGNoLnJlc2V0KCk7CkBAIC0xOTYsMjcgKzE2MywxOSBAQAogfQogCiBjbGFzcyBfUGVyZm9ybWFuY2VUYWdJbXBsIGltcGxlbWVudHMgUGVyZm9ybWFuY2VUYWcgewotICAvKioKLSAgICogVGhlIGN1cnJlbnQgcGVyZm9ybWFuY2UgdGFnIGZvciB0aGUgaXNvbGF0ZS4KLSAgICovCisgIC8vLyBUaGUgY3VycmVudCBwZXJmb3JtYW5jZSB0YWcgZm9yIHRoZSBpc29sYXRlLgogICBzdGF0aWMgX1BlcmZvcm1hbmNlVGFnSW1wbCBjdXJyZW50ID0gdW5rbm93bjsKIAogICBzdGF0aWMgZmluYWwgX1BlcmZvcm1hbmNlVGFnSW1wbCB1bmtub3duID0gX1BlcmZvcm1hbmNlVGFnSW1wbCgndW5rbm93bicpOwogCi0gIC8qKgotICAgKiBBIGxpc3Qgb2YgYWxsIHBlcmZvcm1hbmNlIHRhZ3MgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBzbyBmYXIuCi0gICAqLworICAvLy8gQSBsaXN0IG9mIGFsbCBwZXJmb3JtYW5jZSB0YWdzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgc28gZmFyLgogICBzdGF0aWMgTGlzdDxfUGVyZm9ybWFuY2VUYWdJbXBsPiBhbGwgPSA8X1BlcmZvcm1hbmNlVGFnSW1wbD5bXTsKIAotICAvKioKLSAgICogVGhlIFtVc2VyVGFnXSBhc3NvY2lhdGVkIHdpdGggdGhpcyBbUGVyZm9ybWFuY2VUYWddLgotICAgKi8KKyAgLy8vIFRoZSBbVXNlclRhZ10gYXNzb2NpYXRlZCB3aXRoIHRoaXMgW1BlcmZvcm1hbmNlVGFnXS4KICAgZmluYWwgVXNlclRhZyB1c2VyVGFnOwogCi0gIC8qKgotICAgKiBTdG9wd2F0Y2ggdHJhY2tpbmcgdGhlIGFtb3VudCBvZiB0aW1lIHRoaXMgW1BlcmZvcm1hbmNlVGFnXSBoYXMgYmVlbiB0aGUKLSAgICogY3VycmVudCB0YWcgZm9yIHRoZSBpc29sYXRlLgotICAgKi8KKyAgLy8vIFN0b3B3YXRjaCB0cmFja2luZyB0aGUgYW1vdW50IG9mIHRpbWUgdGhpcyBbUGVyZm9ybWFuY2VUYWddIGhhcyBiZWVuIHRoZQorICAvLy8gY3VycmVudCB0YWcgZm9yIHRoZSBpc29sYXRlLgogICBmaW5hbCBTdG9wd2F0Y2ggc3RvcHdhdGNoOwogCiAgIF9QZXJmb3JtYW5jZVRhZ0ltcGwoU3RyaW5nIGxhYmVsKQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvaGludC9zZGtfY29uc3RyYWludF92ZXJpZmllci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvaGludC9zZGtfY29uc3RyYWludF92ZXJpZmllci5kYXJ0CmluZGV4IGUzOTVkOGMuLmU3MDk4YjUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2hpbnQvc2RrX2NvbnN0cmFpbnRfdmVyaWZpZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9oaW50L3Nka19jb25zdHJhaW50X3ZlcmlmaWVyLmRhcnQKQEAgLTEyLDcgKzEyLDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgTmFtZXNwYWNlOwogaW1wb3J0ICdwYWNrYWdlOnB1Yl9zZW12ZXIvcHViX3NlbXZlci5kYXJ0JzsKIAogLy8vIEEgdmlzaXRvciB0aGF0IGZpbmRzIGNvZGUgdGhhdCBhc3N1bWVzIGEgbGF0ZXIgdmVyc2lvbiBvZiB0aGUgU0RLIHRoYW4gdGhlCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L2NvbmZpZy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9jb25maWcuZGFydAppbmRleCAxNTkzODVjLi5iNmM4MDFjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L2NvbmZpZy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvY29uZmlnLmRhcnQKQEAgLTUsOSArNSw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwveWFtbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp5YW1sL3lhbWwuZGFydCc7CiAKLS8qKgotICogUGFyc2UgdGhlIGdpdmVuIG1hcCBpbnRvIGEgbGludCBjb25maWcuCi0gKi8KKy8vLyBQYXJzZSB0aGUgZ2l2ZW4gbWFwIGludG8gYSBsaW50IGNvbmZpZy4KIExpbnRDb25maWcgcGFyc2VDb25maWcoWWFtbE1hcCBvcHRpb25zTWFwKSB7CiAgIGlmIChvcHRpb25zTWFwICE9IG51bGwpIHsKICAgICB2YXIgb3B0aW9ucyA9IGdldFZhbHVlKG9wdGlvbnNNYXAsICdsaW50ZXInKTsKQEAgLTE5LDEwICsxNyw4IEBACiAgIHJldHVybiBudWxsOwogfQogCi0vKioKLSAqIFByb2Nlc3MgdGhlIGdpdmVuIG9wdGlvbiBbZmlsZUNvbnRlbnRzXSBhbmQgcHJvZHVjZSBhIGNvcnJlc3BvbmRpbmcKLSAqIFtMaW50Q29uZmlnXS4KLSAqLworLy8vIFByb2Nlc3MgdGhlIGdpdmVuIG9wdGlvbiBbZmlsZUNvbnRlbnRzXSBhbmQgcHJvZHVjZSBhIGNvcnJlc3BvbmRpbmcKKy8vLyBbTGludENvbmZpZ10uCiBMaW50Q29uZmlnIHByb2Nlc3NBbmFseXNpc09wdGlvbnNGaWxlKFN0cmluZyBmaWxlQ29udGVudHMsIHtTdHJpbmcgZmlsZVVybH0pIHsKICAgdmFyIHlhbWwgPSBsb2FkWWFtbE5vZGUoZmlsZUNvbnRlbnRzLCBzb3VyY2VVcmw6IGZpbGVVcmwpOwogICBpZiAoeWFtbCBpcyBZYW1sTWFwKSB7CkBAIC0zMSw5ICsyNyw3IEBACiAgIHJldHVybiBudWxsOwogfQogCi0vKioKLSAqIFRoZSBjb25maWd1cmF0aW9uIG9mIGxpbnQgcnVsZXMgd2l0aGluIGFuIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KLSAqLworLy8vIFRoZSBjb25maWd1cmF0aW9uIG9mIGxpbnQgcnVsZXMgd2l0aGluIGFuIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KIGFic3RyYWN0IGNsYXNzIExpbnRDb25maWcgewogICBmYWN0b3J5IExpbnRDb25maWcucGFyc2UoU3RyaW5nIHNvdXJjZSwge1N0cmluZyBzb3VyY2VVcmx9KSA9PgogICAgICAgX0xpbnRDb25maWcoKS4uX3BhcnNlKHNvdXJjZSwgc291cmNlVXJsOiBzb3VyY2VVcmwpOwpAQCAtNDUsOSArMzksNyBAQAogICBMaXN0PFJ1bGVDb25maWc+IGdldCBydWxlQ29uZmlnczsKIH0KIAotLyoqCi0gKiBUaGUgY29uZmlndXJhdGlvbiBvZiBhIHNpbmdsZSBsaW50IHJ1bGUgd2l0aGluIGFuIGFuYWx5c2lzIG9wdGlvbnMgZmlsZS4KLSAqLworLy8vIFRoZSBjb25maWd1cmF0aW9uIG9mIGEgc2luZ2xlIGxpbnQgcnVsZSB3aXRoaW4gYW4gYW5hbHlzaXMgb3B0aW9ucyBmaWxlLgogYWJzdHJhY3QgY2xhc3MgUnVsZUNvbmZpZyB7CiAgIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGFyZ3MgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwogICBTdHJpbmcgZ2V0IGdyb3VwOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9saW50ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvbGludGVyLmRhcnQKaW5kZXggMTczOTJjZi4uYjNlOWQxNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9saW50ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L2xpbnRlci5kYXJ0CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydCcgYXMgZmlsZV9zeXN0ZW07CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L3Rva2VuLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2NvbnN0YW50L2NvbXB1dGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvY29uc3RhbnRfdmVyaWZpZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvY29uc3RhbnQvZXZhbHVhdGlvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC9wb3RlbnRpYWxseV9jb25zdGFudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9jb25zdGFudC91dGlsaXRpZXMuZGFydCc7CkBAIC0zMSw4ICszMiw3IEBACiAgICAgICAgIEFuYWx5c2lzRXJyb3JJbmZvSW1wbCwKICAgICAgICAgQW5hbHlzaXNPcHRpb25zLAogICAgICAgICBBbmFseXNpc09wdGlvbnNJbXBsOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcKLSAgICBzaG93IENvbnN0YW50VmVyaWZpZXIsIFNjb3BlZFZpc2l0b3I7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFNjb3BlZFZpc2l0b3I7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCcgc2hvdyBMaW5lSW5mbzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZV9pby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvbGludC9hbmFseXNpcy5kYXJ0JzsKQEAgLTE0Myw3ICsxNDMsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIG9uRXJyb3IoQW5hbHlzaXNFcnJvciBlcnJvcikgPT4gZXJyb3JzLmFkZChlcnJvcik7CisgIHZvaWQgb25FcnJvcihBbmFseXNpc0Vycm9yIGVycm9yKSA9PiBlcnJvcnMuYWRkKGVycm9yKTsKIAogICBJdGVyYWJsZTxBbmFseXNpc0Vycm9ySW5mbz4gX2xpbnRQdWJzcGVjRmlsZShGaWxlIHNvdXJjZUZpbGUpID0+CiAgICAgICBsaW50UHVic3BlY1NvdXJjZSgKQEAgLTc5Niw3ICs3OTYsNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIG9uRXJyb3IoQW5hbHlzaXNFcnJvciBlcnJvcikgPT4gZXJyb3JzLmFkZChlcnJvcik7CisgIHZvaWQgb25FcnJvcihBbmFseXNpc0Vycm9yIGVycm9yKSA9PiBlcnJvcnMuYWRkKGVycm9yKTsKIAogICBAb3ZlcnJpZGUKICAgSXRlcmFibGU8QW5hbHlzaXNFcnJvckluZm8+IF9saW50UHVic3BlY0ZpbGUoRmlsZSBzb3VyY2VGaWxlKSA9PgpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9vcHRpb25zX3J1bGVfdmFsaWRhdG9yLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L29wdGlvbnNfcnVsZV92YWxpZGF0b3IuZGFydAppbmRleCBiMGU3ZjY0Li4zMWYyN2MwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L29wdGlvbnNfcnVsZV92YWxpZGF0b3IuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L29wdGlvbnNfcnVsZV92YWxpZGF0b3IuZGFydApAQCAtMTEsNTcgKzExLDQ1IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3V0aWwveWFtbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp5YW1sL3lhbWwuZGFydCc7CiAKLS8qKgotICogQSBoaW50IGNvZGUgaW5kaWNhdGluZyByZWZlcmVuY2UgdG8gYSBkZXByZWNhdGVkIGxpbnQuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIDA6IHRoZSBydWxlIG5hbWUKLSAqLworLy8vIEEgaGludCBjb2RlIGluZGljYXRpbmcgcmVmZXJlbmNlIHRvIGEgZGVwcmVjYXRlZCBsaW50LgorLy8vCisvLy8gUGFyYW1ldGVyczoKKy8vLyAwOiB0aGUgcnVsZSBuYW1lCiBjb25zdCBBbmFseXNpc09wdGlvbnNIaW50Q29kZSBERVBSRUNBVEVEX0xJTlRfSElOVCA9IEFuYWx5c2lzT3B0aW9uc0hpbnRDb2RlKAogICAgICdERVBSRUNBVEVEX0xJTlRfSElOVCcsCiAgICAgIid7MH0nIGlzIGEgZGVwcmVjYXRlZCBsaW50IHJ1bGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCIpOwogCi0vKioKLSAqIER1cGxpY2F0ZSBydWxlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogMDogdGhlIHJ1bGUgbmFtZQotICovCisvLy8gRHVwbGljYXRlIHJ1bGVzLgorLy8vCisvLy8gUGFyYW1ldGVyczoKKy8vLyAwOiB0aGUgcnVsZSBuYW1lCiBjb25zdCBBbmFseXNpc09wdGlvbnNIaW50Q29kZSBEVVBMSUNBVEVfUlVMRV9ISU5UID0gQW5hbHlzaXNPcHRpb25zSGludENvZGUoCiAgICAgJ0RVUExJQ0FURV9SVUxFJywKICAgICAiVGhlIHJ1bGUgezB9IGlzIGFscmVhZHkgc3BlY2lmaWVkIGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGFnYWluLiIsCiAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyBhbGwgYnV0IG9uZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBydWxlLiIpOwogCi0vKioKLSAqIEFuIGVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbmNvbXBhdGlibGUgcnVsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogMDogdGhlIHJ1bGUgbmFtZQotICogMTogdGhlIGluY29tcGF0aWJsZSBydWxlCi0gKi8KKy8vLyBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW5jb21wYXRpYmxlIHJ1bGUuCisvLy8KKy8vLyBQYXJhbWV0ZXJzOgorLy8vIDA6IHRoZSBydWxlIG5hbWUKKy8vLyAxOiB0aGUgaW5jb21wYXRpYmxlIHJ1bGUKIGNvbnN0IEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlIElOQ09NUEFUSUJMRV9MSU5UX1dBUk5JTkcgPQogICAgIEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlKCdJTkNPTVBBVElCTEVfTElOVF9XQVJOSU5HJywKICAgICAgICAgIlRoZSBydWxlICd7MH0nIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBydWxlICd7MX0nIiwKICAgICAgICAgY29ycmVjdGlvbjogIlRyeSByZW1vdmluZyBvbmUgb2YgdGhlIGluY29tcGF0aWJsZSBydWxlcy4iKTsKIAotLyoqCi0gKiBBbiBlcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5kZWZpbmVkIGxpbnQgcnVsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogMDogdGhlIHJ1bGUgbmFtZQotICovCisvLy8gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIHVuZGVmaW5lZCBsaW50IHJ1bGUuCisvLy8KKy8vLyBQYXJhbWV0ZXJzOgorLy8vIDA6IHRoZSBydWxlIG5hbWUKIGNvbnN0IEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlIFVOREVGSU5FRF9MSU5UX1dBUk5JTkcgPQogICAgIEFuYWx5c2lzT3B0aW9uc1dhcm5pbmdDb2RlKAogICAgICAgICAnVU5ERUZJTkVEX0xJTlRfV0FSTklORycsICInezB9JyBpcyBub3QgYSByZWNvZ25pemVkIGxpbnQgcnVsZSIpOwogCi0vKioKLSAqIFJ1bGUgcHJvdmlkZXIuCi0gKi8KKy8vLyBSdWxlIHByb3ZpZGVyLgogdHlwZWRlZiBMaW50UnVsZVByb3ZpZGVyID0gSXRlcmFibGU8TGludFJ1bGU+IEZ1bmN0aW9uKCk7CiAKLS8qKgotICogVmFsaWRhdGVzIGBsaW50ZXJgIHJ1bGUgY29uZmlndXJhdGlvbnMuCi0gKi8KKy8vLyBWYWxpZGF0ZXMgYGxpbnRlcmAgcnVsZSBjb25maWd1cmF0aW9ucy4KIGNsYXNzIExpbnRlclJ1bGVPcHRpb25zVmFsaWRhdG9yIGV4dGVuZHMgT3B0aW9uc1ZhbGlkYXRvciB7CiAgIHN0YXRpYyBjb25zdCBsaW50ZXIgPSAnbGludGVyJzsKICAgc3RhdGljIGNvbnN0IHJ1bGVzS2V5ID0gJ3J1bGVzJzsKQEAgLTg1LDcgKzczLDcgQEAKICAgICByZXR1cm4gZXJyb3JzOwogICB9CiAKLSAgdmFsaWRhdGVSdWxlcyhZYW1sTm9kZSBydWxlcywgRXJyb3JSZXBvcnRlciByZXBvcnRlcikgeworICB2b2lkIHZhbGlkYXRlUnVsZXMoWWFtbE5vZGUgcnVsZXMsIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgICBpZiAocnVsZXMgaXMgWWFtbExpc3QpIHsKICAgICAgIGZpbmFsIHNlZW5SdWxlcyA9IDxTdHJpbmc+e307CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvcHJvamVjdC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9wcm9qZWN0LmRhcnQKaW5kZXggZmVmODkzMi4uNzQ5OGFiYiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9wcm9qZWN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9wcm9qZWN0LmRhcnQKQEAgLTgsNyArOCw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hbmFseXNpcy9yZXN1bHRzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9saW50L2lvLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9saW50L3B1Yi5kYXJ0JzsKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIF9jYWxjdWxhdGUoKSBhc3luYyB7CisgIHZvaWQgX2NhbGN1bGF0ZSgpIGFzeW5jIHsKICAgICBpZiAoc291cmNlcyA9PSBudWxsIHx8IHNvdXJjZXMuaXNFbXB0eSkgewogICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvcHViLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L3B1Yi5kYXJ0CmluZGV4IDViODVlNzEuLmFiMTllNTcgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvcHViLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9wdWIuZGFydApAQCAtMTI4LDcgKzEyOCw3IEBACiAgIFBTRW50cnkgZ2V0IGhvbWVwYWdlOwogICBQU0VudHJ5IGdldCBuYW1lOwogICBQU0VudHJ5IGdldCB2ZXJzaW9uOwotICBhY2NlcHQoUHVic3BlY1Zpc2l0b3IgdmlzaXRvcik7CisgIHZvaWQgYWNjZXB0KFB1YnNwZWNWaXNpdG9yIHZpc2l0b3IpOwogfQogCiBhYnN0cmFjdCBjbGFzcyBQdWJzcGVjVmlzaXRvcjxUPiB7CkBAIC0yMzgsNyArMjM4LDcgQEAKICAgQG92ZXJyaWRlCiAgIEl0ZXJhdG9yPFBTRGVwZW5kZW5jeT4gZ2V0IGl0ZXJhdG9yID0+IGRlcGVuZGVuY2llcy5pdGVyYXRvcjsKIAotICBhZGQoUFNEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKKyAgdm9pZCBhZGQoUFNEZXBlbmRlbmN5IGRlcGVuZGVuY3kpIHsKICAgICBpZiAoZGVwZW5kZW5jeSAhPSBudWxsKSB7CiAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgIH0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICB9CiAKLSAgX3BhcnNlKFN0cmluZyBzcmMsIHtVcmkgc291cmNlVXJsfSkgeworICB2b2lkIF9wYXJzZShTdHJpbmcgc3JjLCB7VXJpIHNvdXJjZVVybH0pIHsKICAgICB2YXIgeWFtbCA9IGxvYWRZYW1sTm9kZShzcmMsIHNvdXJjZVVybDogc291cmNlVXJsKTsKICAgICBpZiAoeWFtbCBpcyEgWWFtbE1hcCkgewogICAgICAgcmV0dXJuOwpAQCAtNDM5LDcgKzQzOSw3IEBACiAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBTdHJpbmdCdWZmZXIoKTsKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpID0+IGJ1ZmZlci50b1N0cmluZygpOwotICB3cml0ZWxpbihPYmplY3QgdmFsdWUpIHsKKyAgdm9pZCB3cml0ZWxpbihPYmplY3QgdmFsdWUpIHsKICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgYnVmZmVyLndyaXRlbG4odmFsdWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvcmVnaXN0cnkuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvcmVnaXN0cnkuZGFydAppbmRleCBiNmUyMzUwLi4zZmQyZmYzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L3JlZ2lzdHJ5LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbGludC9yZWdpc3RyeS5kYXJ0CkBAIC03LDEzICs3LDkgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvbGludC9jb25maWcuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2xpbnQvbGludGVyLmRhcnQnOwogCi0vKioKLSAqIFJlZ2lzdHJ5IG9mIGxpbnQgcnVsZXMuCi0gKi8KKy8vLyBSZWdpc3RyeSBvZiBsaW50IHJ1bGVzLgogY2xhc3MgUmVnaXN0cnkgd2l0aCBJdGVyYWJsZU1peGluPExpbnRSdWxlPiB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCByZWdpc3RyeSB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0gICAqLworICAvLy8gVGhlIGRlZmF1bHQgcmVnaXN0cnkgdG8gYmUgdXNlZCBieSBjbGllbnRzLgogICBzdGF0aWMgZmluYWwgUmVnaXN0cnkgcnVsZVJlZ2lzdHJ5ID0gUmVnaXN0cnkoKTsKIAogICAvLy8gQSB0YWJsZSBtYXBwaW5nIHJ1bGUgbmFtZXMgdG8gcnVsZXMuCkBAIC0yMiwzNyArMTgsMjcgQEAKICAgQG92ZXJyaWRlCiAgIEl0ZXJhdG9yPExpbnRSdWxlPiBnZXQgaXRlcmF0b3IgPT4gX3J1bGVNYXAudmFsdWVzLml0ZXJhdG9yOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBydWxlcyB0aGF0IGFyZSBkZWZpbmVkLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3Qgb2YgdGhlIHJ1bGVzIHRoYXQgYXJlIGRlZmluZWQuCiAgIEl0ZXJhYmxlPExpbnRSdWxlPiBnZXQgcnVsZXMgPT4gX3J1bGVNYXAudmFsdWVzOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpbnQgcnVsZSB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBsaW50IHJ1bGUgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgogICBMaW50UnVsZSBvcGVyYXRvciBbXShTdHJpbmcgbmFtZSkgPT4gX3J1bGVNYXBbbmFtZV07CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbnQgcnVsZXMgZXhwbGljaXRseSBlbmFibGVkIGJ5IHRoZSBnaXZlbiBbY29uZmlnXS4KLSAgICoKLSAgICogRm9yIGV4YW1wbGU6Ci0gICAqICAgICBteV9ydWxlOiB0cnVlCi0gICAqCi0gICAqIGVuYWJsZXMgYG15X3J1bGVgLgotICAgKgotICAgKiBVbnNwZWNpZmllZCBydWxlcyBhcmUgdHJlYXRlZCBhcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAgKi8KKyAgLy8vIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbnQgcnVsZXMgZXhwbGljaXRseSBlbmFibGVkIGJ5IHRoZSBnaXZlbiBbY29uZmlnXS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZToKKyAgLy8vICAgICBteV9ydWxlOiB0cnVlCisgIC8vLworICAvLy8gZW5hYmxlcyBgbXlfcnVsZWAuCisgIC8vLworICAvLy8gVW5zcGVjaWZpZWQgcnVsZXMgYXJlIHRyZWF0ZWQgYXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgSXRlcmFibGU8TGludFJ1bGU+IGVuYWJsZWQoTGludENvbmZpZyBjb25maWcpID0+IHJ1bGVzCiAgICAgICAud2hlcmUoKHJ1bGUpID0+IGNvbmZpZy5ydWxlQ29uZmlncy5hbnkoKHJjKSA9PiByYy5lbmFibGVzKHJ1bGUubmFtZSkpKTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW50IHJ1bGUgd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgbGludCBydWxlIHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KICAgTGludFJ1bGUgZ2V0UnVsZShTdHJpbmcgbmFtZSkgPT4gX3J1bGVNYXBbbmFtZV07CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gbGludCBbcnVsZV0gdG8gdGhpcyByZWdpc3RyeS4KLSAgICovCisgIC8vLyBBZGQgdGhlIGdpdmVuIGxpbnQgW3J1bGVdIHRvIHRoaXMgcmVnaXN0cnkuCiAgIHZvaWQgcmVnaXN0ZXIoTGludFJ1bGUgcnVsZSkgewogICAgIF9ydWxlTWFwW3J1bGUubmFtZV0gPSBydWxlOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9saW50L3V0aWwuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvdXRpbC5kYXJ0CmluZGV4IDI1YjJlYzUuLjczMjVkNDggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvdXRpbC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2xpbnQvdXRpbC5kYXJ0CkBAIC0xMzcsMTYgKzEzNywxNSBAQAogICBTdHJpbmcgdHlwZUluZm8oVHlwZSB0eXBlKSA9PiB0eXBlLnRvU3RyaW5nKCk7CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Tm9kZShBc3ROb2RlIG5vZGUpIHsKKyAgdm9pZCB2aXNpdE5vZGUoQXN0Tm9kZSBub2RlKSB7CiAgICAgd3JpdGUobm9kZSk7CiAKICAgICArK2luZGVudDsKICAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICAgLS1pbmRlbnQ7Ci0gICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICB3cml0ZShBc3ROb2RlIG5vZGUpIHsKKyAgdm9pZCB3cml0ZShBc3ROb2RlIG5vZGUpIHsKICAgICAvL0VPTCBjb21tZW50cwogICAgIHZhciBjb21tZW50cyA9IGdldFByZWNlZGluZ0NvbW1lbnRzKG5vZGUuYmVnaW5Ub2tlbik7CiAgICAgY29tbWVudHMuZm9yRWFjaCgoYykgPT4gc2luay53cml0ZWxuKCckeyIgICIgKiBpbmRlbnR9JGMnKSk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9tYW5pZmVzdC9tYW5pZmVzdF92YWxpZGF0b3IuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL21hbmlmZXN0L21hbmlmZXN0X3ZhbGlkYXRvci5kYXJ0CmluZGV4IGQ3OTI3ZTUuLjgyMGUxYjIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL21hbmlmZXN0L21hbmlmZXN0X3ZhbGlkYXRvci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL21hbmlmZXN0L21hbmlmZXN0X3ZhbGlkYXRvci5kYXJ0CkBAIC0xMywyMCArMTMsMTQgQEAKIGltcG9ydCAnbWFuaWZlc3Rfd2FybmluZ19jb2RlLmRhcnQnOwogCiBjbGFzcyBNYW5pZmVzdFZhbGlkYXRvciB7Ci0gIC8qKgotICAgKiBUaGUgc291cmNlIHJlcHJlc2VudGluZyB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqLworICAvLy8gVGhlIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgogICBmaW5hbCBTb3VyY2Ugc291cmNlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlIHZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4KLSAgICogW3NvdXJjZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZSB2YWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuCisgIC8vLyBbc291cmNlXS4KICAgTWFuaWZlc3RWYWxpZGF0b3IodGhpcy5zb3VyY2UpOwogCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgW2NvbnRlbnRzXSBvZiB0aGUgQW5kcm9pZCBNYW5pZmVzdCBmaWxlLgotICAgKi8KKyAgLy8vIFZhbGlkYXRlIHRoZSBbY29udGVudHNdIG9mIHRoZSBBbmRyb2lkIE1hbmlmZXN0IGZpbGUuCiAgIExpc3Q8QW5hbHlzaXNFcnJvcj4gdmFsaWRhdGUoU3RyaW5nIGNvbnRlbnRzLCBib29sIGNoZWNrTWFuaWZlc3QpIHsKICAgICBSZWNvcmRpbmdFcnJvckxpc3RlbmVyIHJlY29yZGVyID0gUmVjb3JkaW5nRXJyb3JMaXN0ZW5lcigpOwogICAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIgPSBFcnJvclJlcG9ydGVyKApAQCAtNzAsOSArNjQsNyBAQAogICBib29sIF9oYXNGZWF0dXJlQ2FtZXJhQXV0b0ZvY3VzKExpc3Q8RWxlbWVudD4gZmVhdHVyZXMpID0+CiAgICAgICBmZWF0dXJlcy5hbnkoKGYpID0+IGYubG9jYWxOYW1lID09IEhBUkRXQVJFX0ZFQVRVUkVfQ0FNRVJBX0FVVE9GT0NVUyk7CiAKLSAgLyoqCi0gICAqIFJlcG9ydCBhbiBlcnJvciBmb3IgdGhlIGdpdmVuIG5vZGUuCi0gICAqLworICAvLy8gUmVwb3J0IGFuIGVycm9yIGZvciB0aGUgZ2l2ZW4gbm9kZS4KICAgdm9pZCBfcmVwb3J0RXJyb3JGb3JOb2RlKAogICAgICAgRXJyb3JSZXBvcnRlciByZXBvcnRlciwgTm9kZSBub2RlLCBkeW5hbWljIGtleSwgRXJyb3JDb2RlIGVycm9yQ29kZSwKICAgICAgIFtMaXN0PE9iamVjdD4gYXJndW1lbnRzXSkgewpAQCAtODIsMTAgKzc0LDggQEAKICAgICAgICAgZXJyb3JDb2RlLCBzcGFuLnN0YXJ0Lm9mZnNldCwgc3Bhbi5sZW5ndGgsIGFyZ3VtZW50cyk7CiAgIH0KIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlICdhY3Rpdml0eScgdGFncy4KLSAgICovCi0gIF92YWxpZGF0ZUFjdGl2aXRpZXMoTGlzdDxFbGVtZW50PiBhY3Rpdml0ZXMsIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgLy8vIFZhbGlkYXRlIHRoZSAnYWN0aXZpdHknIHRhZ3MuCisgIHZvaWQgX3ZhbGlkYXRlQWN0aXZpdGllcyhMaXN0PEVsZW1lbnQ+IGFjdGl2aXRlcywgRXJyb3JSZXBvcnRlciByZXBvcnRlcikgewogICAgIGFjdGl2aXRlcy5mb3JFYWNoKChhY3Rpdml0eSkgewogICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBhY3Rpdml0eS5hdHRyaWJ1dGVzOwogICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoQVRUUklCVVRFX1NDUkVFTl9PUklFTlRBVElPTikpIHsKQEAgLTEwNCwxMCArOTQsOCBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBgdXNlcy1mZWF0dXJlYCB0YWdzLgotICAgKi8KLSAgX3ZhbGlkYXRlRmVhdHVyZXMoTGlzdDxFbGVtZW50PiBmZWF0dXJlcywgRXJyb3JSZXBvcnRlciByZXBvcnRlcikgeworICAvLy8gVmFsaWRhdGUgdGhlIGB1c2VzLWZlYXR1cmVgIHRhZ3MuCisgIHZvaWQgX3ZhbGlkYXRlRmVhdHVyZXMoTGlzdDxFbGVtZW50PiBmZWF0dXJlcywgRXJyb3JSZXBvcnRlciByZXBvcnRlcikgewogICAgIHZhciB1bnN1cHBvcnRlZCA9IGZlYXR1cmVzCiAgICAgICAgIC53aGVyZSgoZWxlbWVudCkgPT4gVU5TVVBQT1JURURfSEFSRFdBUkVfRkVBVFVSRVMKICAgICAgICAgICAgIC5jb250YWlucyhlbGVtZW50LmF0dHJpYnV0ZXNbQU5EUk9JRF9OQU1FXSkpCkBAIC0xMzEsMTAgKzExOSw4IEBACiAgICAgfSk7CiAgIH0KIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGB1c2VzLXBlcm1pc3Npb25gIHRhZ3MuCi0gICAqLwotICBfdmFsaWRhdGVQZXJtaXNzaW9ucyhMaXN0PEVsZW1lbnQ+IHBlcm1pc3Npb25zLCBMaXN0PEVsZW1lbnQ+IGZlYXR1cmVzLAorICAvLy8gVmFsaWRhdGUgdGhlIGB1c2VzLXBlcm1pc3Npb25gIHRhZ3MuCisgIHZvaWQgX3ZhbGlkYXRlUGVybWlzc2lvbnMoTGlzdDxFbGVtZW50PiBwZXJtaXNzaW9ucywgTGlzdDxFbGVtZW50PiBmZWF0dXJlcywKICAgICAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgICBwZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSB7CiAgICAgICBpZiAocGVybWlzc2lvbi5hdHRyaWJ1dGVzW0FORFJPSURfTkFNRV0gPT0gQU5EUk9JRF9QRVJNSVNTSU9OX0NBTUVSQSkgewpAQCAtMTU4LDEwICsxNDQsOCBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIHRoZSB0b3VjaHNjcmVlbiBmZWF0dXJlIHRhZy4KLSAgICovCi0gIF92YWxpZGF0ZVRvdWNoU2NyZWVuRmVhdHVyZSgKKyAgLy8vIFZhbGlkYXRlIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIHRoZSB0b3VjaHNjcmVlbiBmZWF0dXJlIHRhZy4KKyAgdm9pZCBfdmFsaWRhdGVUb3VjaFNjcmVlbkZlYXR1cmUoCiAgICAgICBMaXN0PEVsZW1lbnQ+IGZlYXR1cmVzLCBFbGVtZW50IG1hbmlmZXN0LCBFcnJvclJlcG9ydGVyIHJlcG9ydGVyKSB7CiAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlcy5maXJzdFdoZXJlKAogICAgICAgICAoZWxlbWVudCkgPT4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL21hbmlmZXN0L21hbmlmZXN0X3dhcm5pbmdfY29kZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbWFuaWZlc3QvbWFuaWZlc3Rfd2FybmluZ19jb2RlLmRhcnQKaW5kZXggMTk4N2RiMC4uZjRkNWI4ZiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvbWFuaWZlc3QvbWFuaWZlc3Rfd2FybmluZ19jb2RlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvbWFuaWZlc3QvbWFuaWZlc3Rfd2FybmluZ19jb2RlLmRhcnQKQEAgLTQsNTQgKzQsNTIgQEAKIAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2Vycm9yL2Vycm9yLmRhcnQnOwogCi0vKioKLSAqIFRoZSBlcnJvciBjb2RlcyB1c2VkIGZvciB3YXJuaW5ncyBpbiBhbmFseXNpcyBvcHRpb25zIGZpbGVzLiBUaGUgY29udmVudGlvbgotICogZm9yIHRoaXMgY2xhc3MgaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIGluZGljYXRlIHRoZSBwcm9ibGVtIHRoYXQKLSAqIGNhdXNlZCB0aGUgZXJyb3IgdG8gYmUgZ2VuZXJhdGVkIGFuZCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgdG8gZXhwbGFpbiB3aGF0IGlzCi0gKiB3cm9uZyBhbmQsIHdoZW4gYXBwcm9wcmlhdGUsIGhvdyB0aGUgcHJvYmxlbSBjYW4gYmUgY29ycmVjdGVkLgotICovCisvLy8gVGhlIGVycm9yIGNvZGVzIHVzZWQgZm9yIHdhcm5pbmdzIGluIGFuYWx5c2lzIG9wdGlvbnMgZmlsZXMuIFRoZSBjb252ZW50aW9uCisvLy8gZm9yIHRoaXMgY2xhc3MgaXMgZm9yIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBjb2RlIHRvIGluZGljYXRlIHRoZSBwcm9ibGVtCisvLy8gdGhhdCBjYXVzZWQgdGhlIGVycm9yIHRvIGJlIGdlbmVyYXRlZCBhbmQgZm9yIHRoZSBlcnJvciBtZXNzYWdlIHRvIGV4cGxhaW4KKy8vLyB3aGF0IGlzIHdyb25nIGFuZCwgd2hlbiBhcHByb3ByaWF0ZSwgaG93IHRoZSBwcm9ibGVtIGNhbiBiZSBjb3JyZWN0ZWQuCiBjbGFzcyBNYW5pZmVzdFdhcm5pbmdDb2RlIGV4dGVuZHMgRXJyb3JDb2RlIHsKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzcGVjaWZpZWQgaGFyZHdhcmUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZSBPUy4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWVkIGhhcmR3YXJlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbgorICAvLy8gQ2hyb21lIE9TLgogICBzdGF0aWMgY29uc3QgTWFuaWZlc3RXYXJuaW5nQ29kZSBVTlNVUFBPUlRFRF9DSFJPTUVfT1NfSEFSRFdBUkUgPQotICAgICAgTWFuaWZlc3RXYXJuaW5nQ29kZSgnVU5TVVBQT1JURURfQ0hST01FX09TX0hBUkRXQVJFJywKLSAgICAgICAgICAiVGhlIGZlYXR1cmUgezB9IGlzIG5vdCBzdXBwb3J0ZWQgb24gQ2hyb21lIE9TLCBjb25zaWRlciBtYWtpbmcgaXQgb3B0aW9uYWwuIiwKKyAgICAgIE1hbmlmZXN0V2FybmluZ0NvZGUoCisgICAgICAgICAgJ1VOU1VQUE9SVEVEX0NIUk9NRV9PU19IQVJEV0FSRScsCisgICAgICAgICAgJ1RoZSBmZWF0dXJlIHswfSBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZSBPUywgY29uc2lkZXIgbWFraW5nIGl0ICcKKyAgICAgICAgICAgICAgJ29wdGlvbmFsLicsCiAgICAgICAgICAgY29ycmVjdGlvbjoKLSAgICAgICAgICAgICAgIlRyeSBhZGRpbmcgYGFuZHJvaWQ6cmVxdWlyZWQ9XCJmYWxzZVwiYCBmb3IgdGhpcyBmZWF0dXJlLiIpOworICAgICAgICAgICAgICAnVHJ5IGFkZGluZyBgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiYCBmb3IgdGhpcyBmZWF0dXJlLicpOwogCi0gIC8qKgotICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWVkIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBDaHJvbWUgT1MuCi0gICAqLworICAvLy8gQSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNwZWNpZmllZCBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgb24gQ2hyb21lIE9TLgogICBzdGF0aWMgY29uc3QgTWFuaWZlc3RXYXJuaW5nQ29kZSBVTlNVUFBPUlRFRF9DSFJPTUVfT1NfRkVBVFVSRSA9Ci0gICAgICBNYW5pZmVzdFdhcm5pbmdDb2RlKCdVTlNVUFBPUlRFRF9DSFJPTUVfT1NfRkVBVFVSRScsCi0gICAgICAgICAgJ1RoZSBmZWF0dXJlIHswfSBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZSBPUywgY29uc2lkZXIgbWFraW5nIGl0IG9wdGlvbmFsLicsCisgICAgICBNYW5pZmVzdFdhcm5pbmdDb2RlKAorICAgICAgICAgICdVTlNVUFBPUlRFRF9DSFJPTUVfT1NfRkVBVFVSRScsCisgICAgICAgICAgJ1RoZSBmZWF0dXJlIHswfSBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZSBPUywgY29uc2lkZXIgbWFraW5nIGl0ICcKKyAgICAgICAgICAgICAgJ29wdGlvbmFsLicsCiAgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSBjaGFuZ2luZyB0byBgYW5kcm9pZDpyZXF1aXJlZD1cImZhbHNlXCJgIGZvciB0aGlzICIKICAgICAgICAgICAgICAgImZlYXR1cmUuIik7CiAKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHRvdWNoc2NyZWVuIGZlYXR1cmUgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUKLSAgICogbWFuaWZlc3QuCi0gICAqLworICAvLy8gQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgdG91Y2hzY3JlZW4gZmVhdHVyZSBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZQorICAvLy8gbWFuaWZlc3QuCiAgIHN0YXRpYyBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlIE5PX1RPVUNIU0NSRUVOX0ZFQVRVUkUgPSBNYW5pZmVzdFdhcm5pbmdDb2RlKAogICAgICAgJ05PX1RPVUNIU0NSRUVOX0ZFQVRVUkUnLAotICAgICAgIlRoZSBkZWZhdWx0IFwiYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlblwiIG5lZWRzIHRvIGJlIG9wdGlvbmFsIGZvciBDaHJvbWUgT1MuICIsCisgICAgICAnVGhlIGRlZmF1bHQgImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIG5lZWRzIHRvIGJlIG9wdGlvbmFsIGZvciAnCisgICAgICAgICAgJ0Nocm9tZSBPUy4gJywKICAgICAgIGNvcnJlY3Rpb246ICJDb25zaWRlciBhZGRpbmcgIgogICAgICAgICAgICI8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT1cImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW5cIiBhbmRyb2lkOnJlcXVpcmVkPVwiZmFsc2VcIiAvPiIKICAgICAgICAgICAiIHRvIHRoZSBtYW5pZmVzdC4iKTsKIAotICAvKioKLSAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gQ2hyb21lIE9TLgotICAgKi8KKyAgLy8vIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZQorICAvLy8gT1MuCiAgIHN0YXRpYyBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlIFBFUk1JU1NJT05fSU1QTElFU19VTlNVUFBPUlRFRF9IQVJEV0FSRSA9Ci0gICAgICBNYW5pZmVzdFdhcm5pbmdDb2RlKCdQRVJNSVNTSU9OX0lNUExJRVNfVU5TVVBQT1JURURfSEFSRFdBUkUnLAotICAgICAgICAgICJQZXJtaXNzaW9uIG1ha2VzIGFwcCBpbmNvbXBhdGlibGUgZm9yIENocm9tZSBPUywgY29uc2lkZXIgYWRkaW5nIG9wdGlvbmFsIHswfSBmZWF0dXJlIHRhZywgIiwKKyAgICAgIE1hbmlmZXN0V2FybmluZ0NvZGUoCisgICAgICAgICAgJ1BFUk1JU1NJT05fSU1QTElFU19VTlNVUFBPUlRFRF9IQVJEV0FSRScsCisgICAgICAgICAgJ1Blcm1pc3Npb24gbWFrZXMgYXBwIGluY29tcGF0aWJsZSBmb3IgQ2hyb21lIE9TLCBjb25zaWRlciBhZGRpbmcgJworICAgICAgICAgICAgICAnb3B0aW9uYWwgezB9IGZlYXR1cmUgdGFnLCAnLAogICAgICAgICAgIGNvcnJlY3Rpb246ICIgVHJ5IGFkZGluZyBgPHVzZXMtZmVhdHVyZSAiCiAgICAgICAgICAgICAgICJhbmRyb2lkOm5hbWU9XCJ7MH1cIiAgYW5kcm9pZDpyZXF1aXJlZD1cImZhbHNlXCI+YC4iKTsKIAotICAvKioKLSAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgY2FtZXJhIHBlcm1pc3Npb25zIGlzIG5vdCBzdXBwb3J0ZWQgb24gQ2hyb21lIE9TLgotICAgKi8KKyAgLy8vIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNhbWVyYSBwZXJtaXNzaW9ucyBpcyBub3Qgc3VwcG9ydGVkIG9uIENocm9tZQorICAvLy8gT1MuCiAgIHN0YXRpYyBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlIENBTUVSQV9QRVJNSVNTSU9OU19JTkNPTVBBVElCTEUgPSBNYW5pZmVzdFdhcm5pbmdDb2RlKAogICAgICAgJ0NBTUVSQV9QRVJNSVNTSU9OU19JTkNPTVBBVElCTEUnLAogICAgICAgIkNhbWVyYSBwZXJtaXNzaW9ucyBtYWtlIGFwcCBpbmNvbXBhdGlibGUgZm9yIENocm9tZSBPUywgY29uc2lkZXIgYWRkaW5nICIKQEAgLTYxLDkgKzU5LDcgQEAKICAgICAgICAgICAiYDx1c2VzLWZlYXR1cmUgIgogICAgICAgICAgICJhbmRyb2lkOm5hbWU9XCJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXNcIiAgYW5kcm9pZDpyZXF1aXJlZD1cImZhbHNlXCI+YC4iKTsKIAotICAvKioKLSAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0aXZpdHkgaXMgc2V0IHRvIGJlIG5vbiByZXNpemFibGUuCi0gICAqLworICAvLy8gQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0aXZpdHkgaXMgc2V0IHRvIGJlIG5vbiByZXNpemFibGUuCiAgIHN0YXRpYyBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlIE5PTl9SRVNJWkFCTEVfQUNUSVZJVFkgPSBNYW5pZmVzdFdhcm5pbmdDb2RlKAogICAgICAgJ05PTl9SRVNJWkFCTEVfQUNUSVZJVFknLAogICAgICAgIlRoZSBgPGFjdGl2aXR5PmAgZWxlbWVudCBzaG91bGQgYmUgYWxsb3dlZCB0byBiZSByZXNpemVkIHRvIGFsbG93ICIKQEAgLTcxLDkgKzY3LDcgQEAKICAgICAgIGNvcnJlY3Rpb246ICJDb25zaWRlciBkZWNsYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgIgogICAgICAgICAgICJhY3Rpdml0eSBlbGVtZW50IHdpdGggYHJlc2l6YWJsZUFjdGl2aXR5PVwidHJ1ZVwiYCBhdHRyaWJ1dGUuIik7CiAKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGl2aXR5IGlzIGxvY2tlZCB0byBhbiBvcmllbnRhdGlvbi4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpdml0eSBpcyBsb2NrZWQgdG8gYW4gb3JpZW50YXRpb24uCiAgIHN0YXRpYyBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlIFNFVFRJTkdfT1JJRU5UQVRJT05fT05fQUNUSVZJVFkgPQogICAgICAgTWFuaWZlc3RXYXJuaW5nQ29kZSgKICAgICAgICAgICAnU0VUVElOR19PUklFTlRBVElPTl9PTl9BQ1RJVklUWScsCkBAIC04NCwxMCArNzgsOCBAQAogICAgICAgICAgICAgICAiQ29uc2lkZXIgZGVjbGFyaW5nIHRoZSBjb3JyZXNwb25kaW5nIGFjdGl2aXR5IGVsZW1lbnQgd2l0aCIKICAgICAgICAgICAgICAgIiBgc2NyZWVuT3JpZW50YXRpb249XCJ1bnNwZWNpZmllZFwiYCBvciBgXCJmdWxsU2Vuc29yXCJgIGF0dHJpYnV0ZS4iKTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgd2FybmluZyBjb2RlIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXSwgW21lc3NhZ2VdCi0gICAqIGFuZCBbY29ycmVjdGlvbl0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgd2FybmluZyBjb2RlIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXSwKKyAgLy8vIFttZXNzYWdlXSBhbmQgW2NvcnJlY3Rpb25dLgogICBjb25zdCBNYW5pZmVzdFdhcm5pbmdDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgbWVzc2FnZSwge1N0cmluZyBjb3JyZWN0aW9ufSkKICAgICAgIDogc3VwZXIudGVtcG9yYXJ5KG5hbWUsIG1lc3NhZ2UsIGNvcnJlY3Rpb246IGNvcnJlY3Rpb24pOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9wdWJzcGVjL3B1YnNwZWNfdmFsaWRhdG9yLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9wdWJzcGVjL3B1YnNwZWNfdmFsaWRhdG9yLmRhcnQKaW5kZXggYTdhMGUzYmQuLmQ5Y2I2YzYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3B1YnNwZWMvcHVic3BlY192YWxpZGF0b3IuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9wdWJzcGVjL3B1YnNwZWNfdmFsaWRhdG9yLmRhcnQKQEAgLTEyLDUyICsxMiwzNCBAQAogaW1wb3J0ICdwYWNrYWdlOnlhbWwveWFtbC5kYXJ0JzsKIAogY2xhc3MgUHVic3BlY1ZhbGlkYXRvciB7Ci0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgc3ViLWZpZWxkICh1bmRlciBgZmx1dHRlcmApIHdob3NlIHZhbHVlIGlzIGEgbGlzdCBvZiBhc3NldHMKLSAgICogYXZhaWxhYmxlIHRvIEZsdXR0ZXIgYXBwcyBhdCBydW50aW1lLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBzdWItZmllbGQgKHVuZGVyIGBmbHV0dGVyYCkgd2hvc2UgdmFsdWUgaXMgYSBsaXN0IG9mCisgIC8vLyBhc3NldHMgYXZhaWxhYmxlIHRvIEZsdXR0ZXIgYXBwcyBhdCBydW50aW1lLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIEFTU0VUU19GSUVMRCA9ICdhc3NldHMnOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgd2hvc2UgdmFsdWUgaXMgYSBtYXAgb2YgZGVwZW5kZW5jaWVzLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aG9zZSB2YWx1ZSBpcyBhIG1hcCBvZiBkZXBlbmRlbmNpZXMuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgREVQRU5ERU5DSUVTX0ZJRUxEID0gJ2RlcGVuZGVuY2llcyc7CiAKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aG9zZSB2YWx1ZSBpcyBhIG1hcCBvZiBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHdob3NlIHZhbHVlIGlzIGEgbWFwIG9mIGRldmVsb3BtZW50IGRlcGVuZGVuY2llcy4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBERVZfREVQRU5ERU5DSUVTX0ZJRUxEID0gJ2Rldl9kZXBlbmRlbmNpZXMnOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgd2hvc2UgdmFsdWUgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIEZsdXR0ZXItc3BlY2lmaWMKLSAgICogY29uZmlndXJhdGlvbiBkYXRhLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aG9zZSB2YWx1ZSBpcyBhIHNwZWNpZmljYXRpb24gb2YgRmx1dHRlci1zcGVjaWZpYworICAvLy8gY29uZmlndXJhdGlvbiBkYXRhLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIEZMVVRURVJfRklFTEQgPSAnZmx1dHRlcic7CiAKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3aG9zZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZS4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZmllbGQgd2hvc2UgdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9GSUVMRCA9ICduYW1lJzsKIAotICAvKioKLSAgICogVGhlIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4KLSAgICovCisgIC8vLyBUaGUgcmVzb3VyY2UgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGZpbGUgc3lzdGVtLgogICBmaW5hbCBSZXNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgc291cmNlIHJlcHJlc2VudGluZyB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqLworICAvLy8gVGhlIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgogICBmaW5hbCBTb3VyY2Ugc291cmNlOwogCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlIHZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4KLSAgICogW3NvdXJjZV0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZSB2YWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuCisgIC8vLyBbc291cmNlXS4KICAgUHVic3BlY1ZhbGlkYXRvcih0aGlzLnByb3ZpZGVyLCB0aGlzLnNvdXJjZSk7CiAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBbY29udGVudHNdLgotICAgKi8KKyAgLy8vIFZhbGlkYXRlIHRoZSBnaXZlbiBbY29udGVudHNdLgogICBMaXN0PEFuYWx5c2lzRXJyb3I+IHZhbGlkYXRlKE1hcDxkeW5hbWljLCBZYW1sTm9kZT4gY29udGVudHMpIHsKICAgICBSZWNvcmRpbmdFcnJvckxpc3RlbmVyIHJlY29yZGVyID0gUmVjb3JkaW5nRXJyb3JMaXN0ZW5lcigpOwogICAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIgPSBFcnJvclJlcG9ydGVyKApAQCAtNzMsMTAgKzU1LDggQEAKICAgICByZXR1cm4gcmVjb3JkZXIuZXJyb3JzOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgYW4gYXNzZXQgKGZpbGUpIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWJzb2x1dGUsIG5vcm1hbGl6ZWQKLSAgICogW2Fzc2V0UGF0aF0gb3IgaW4gYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHBhcmVudCBvZiB0aGUgZmlsZS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIGFuIGFzc2V0IChmaWxlKSBleGlzdHMgYXQgdGhlIGdpdmVuIGFic29sdXRlLCBub3JtYWxpemVkCisgIC8vLyBbYXNzZXRQYXRoXSBvciBpbiBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcGFyZW50IG9mIHRoZSBmaWxlLgogICBib29sIF9hc3NldEV4aXN0c0F0UGF0aChTdHJpbmcgYXNzZXRQYXRoKSB7CiAgICAgLy8gQ2hlY2sgZm9yIGFzc2V0IGRpcmVjdG9yaWVzLgogICAgIEZvbGRlciBhc3NldERpcmVjdG9yeSA9IHByb3ZpZGVyLmdldEZvbGRlcihhc3NldFBhdGgpOwpAQCAtMTA1LDExICs4NSw5IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgbmFtZXMgb2YgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIGFuZCB3aG9zZQotICAgKiB2YWx1ZXMgYXJlIHRoZSBzcGVjaWZpY2F0aW9ucyBvZiB0aG9zZSBkZXBlbmRlbmNpZXMuIFRoZSBtYXAgaXMgZXh0cmFjdGVkCi0gICAqIGZyb20gdGhlIGdpdmVuIFtjb250ZW50c10gdXNpbmcgdGhlIGdpdmVuIFtrZXldLgotICAgKi8KKyAgLy8vIFJldHVybiBhIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgbmFtZXMgb2YgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIGFuZCB3aG9zZQorICAvLy8gdmFsdWVzIGFyZSB0aGUgc3BlY2lmaWNhdGlvbnMgb2YgdGhvc2UgZGVwZW5kZW5jaWVzLiBUaGUgbWFwIGlzIGV4dHJhY3RlZAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gW2NvbnRlbnRzXSB1c2luZyB0aGUgZ2l2ZW4gW2tleV0uCiAgIE1hcDxkeW5hbWljLCBZYW1sTm9kZT4gX2dldERlY2xhcmVkRGVwZW5kZW5jaWVzKAogICAgICAgRXJyb3JSZXBvcnRlciByZXBvcnRlciwgTWFwPGR5bmFtaWMsIFlhbWxOb2RlPiBjb250ZW50cywgU3RyaW5nIGtleSkgewogICAgIFlhbWxOb2RlIGZpZWxkID0gY29udGVudHNba2V5XTsKQEAgLTEyMyw5ICsxMDEsNyBAQAogICAgIHJldHVybiA8U3RyaW5nLCBZYW1sTm9kZT57fTsKICAgfQogCi0gIC8qKgotICAgKiBSZXBvcnQgYW4gZXJyb3IgZm9yIHRoZSBnaXZlbiBub2RlLgotICAgKi8KKyAgLy8vIFJlcG9ydCBhbiBlcnJvciBmb3IgdGhlIGdpdmVuIG5vZGUuCiAgIHZvaWQgX3JlcG9ydEVycm9yRm9yTm9kZSgKICAgICAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIsIFlhbWxOb2RlIG5vZGUsIEVycm9yQ29kZSBlcnJvckNvZGUsCiAgICAgICBbTGlzdDxPYmplY3Q+IGFyZ3VtZW50c10pIHsKQEAgLTEzNCw5ICsxMTAsNyBAQAogICAgICAgICBlcnJvckNvZGUsIHNwYW4uc3RhcnQub2Zmc2V0LCBzcGFuLmxlbmd0aCwgYXJndW1lbnRzKTsKICAgfQogCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVkIGBuYW1lYCBmaWVsZC4KLSAgICovCisgIC8vLyBWYWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVkIGBuYW1lYCBmaWVsZC4KICAgdm9pZCBfdmFsaWRhdGVEZXBlbmRlbmNpZXMoCiAgICAgICBFcnJvclJlcG9ydGVyIHJlcG9ydGVyLCBNYXA8ZHluYW1pYywgWWFtbE5vZGU+IGNvbnRlbnRzKSB7CiAgICAgTWFwPGR5bmFtaWMsIFlhbWxOb2RlPiBkZWNsYXJlZERlcGVuZGVuY2llcyA9CkBAIC0xNTIsOSArMTI2LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb25hbCBgZmx1dHRlcmAgZmllbGQuCi0gICAqLworICAvLy8gVmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb25hbCBgZmx1dHRlcmAgZmllbGQuCiAgIHZvaWQgX3ZhbGlkYXRlRmx1dHRlcigKICAgICAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIsIE1hcDxkeW5hbWljLCBZYW1sTm9kZT4gY29udGVudHMpIHsKICAgICBZYW1sTm9kZSBmbHV0dGVyRmllbGQgPSBjb250ZW50c1tGTFVUVEVSX0ZJRUxEXTsKQEAgLTIxMSw5ICsxODMsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVkIGBuYW1lYCBmaWVsZC4KLSAgICovCisgIC8vLyBWYWxpZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVkIGBuYW1lYCBmaWVsZC4KICAgdm9pZCBfdmFsaWRhdGVOYW1lKEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXIsIE1hcDxkeW5hbWljLCBZYW1sTm9kZT4gY29udGVudHMpIHsKICAgICBZYW1sTm9kZSBuYW1lRmllbGQgPSBjb250ZW50c1tOQU1FX0ZJRUxEXTsKICAgICBpZiAobmFtZUZpZWxkID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3B1YnNwZWMvcHVic3BlY193YXJuaW5nX2NvZGUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3B1YnNwZWMvcHVic3BlY193YXJuaW5nX2NvZGUuZGFydAppbmRleCAxMmM4ZDQ2Li43ZTAzYjQyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9wdWJzcGVjL3B1YnNwZWNfd2FybmluZ19jb2RlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvcHVic3BlYy9wdWJzcGVjX3dhcm5pbmdfY29kZS5kYXJ0CkBAIC00LDg5ICs0LDcwIEBACiAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKIAotLyoqCi0gKiBUaGUgZXJyb3IgY29kZXMgdXNlZCBmb3Igd2FybmluZ3MgaW4gYW5hbHlzaXMgb3B0aW9ucyBmaWxlcy4gVGhlIGNvbnZlbnRpb24KLSAqIGZvciB0aGlzIGNsYXNzIGlzIGZvciB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgY29kZSB0byBpbmRpY2F0ZSB0aGUgcHJvYmxlbSB0aGF0Ci0gKiBjYXVzZWQgdGhlIGVycm9yIHRvIGJlIGdlbmVyYXRlZCBhbmQgZm9yIHRoZSBlcnJvciBtZXNzYWdlIHRvIGV4cGxhaW4gd2hhdCBpcwotICogd3JvbmcgYW5kLCB3aGVuIGFwcHJvcHJpYXRlLCBob3cgdGhlIHByb2JsZW0gY2FuIGJlIGNvcnJlY3RlZC4KLSAqLworLy8vIFRoZSBlcnJvciBjb2RlcyB1c2VkIGZvciB3YXJuaW5ncyBpbiBhbmFseXNpcyBvcHRpb25zIGZpbGVzLiBUaGUgY29udmVudGlvbgorLy8vIGZvciB0aGlzIGNsYXNzIGlzIGZvciB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgY29kZSB0byBpbmRpY2F0ZSB0aGUgcHJvYmxlbQorLy8vIHRoYXQgY2F1c2VkIHRoZSBlcnJvciB0byBiZSBnZW5lcmF0ZWQgYW5kIGZvciB0aGUgZXJyb3IgbWVzc2FnZSB0byBleHBsYWluCisvLy8gd2hhdCBpcyB3cm9uZyBhbmQsIHdoZW4gYXBwcm9wcmlhdGUsIGhvdyB0aGUgcHJvYmxlbSBjYW4gYmUgY29ycmVjdGVkLgogY2xhc3MgUHVic3BlY1dhcm5pbmdDb2RlIGV4dGVuZHMgRXJyb3JDb2RlIHsKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzcGVjaWZpZWQgYXNzZXQgZG9lcyBub3QgZXhpc3QuCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqIDA6IHRoZSBwYXRoIHRvIHRoZSBhc3NldCBhcyBnaXZlbiBpbiB0aGUgZmlsZS4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWVkIGFzc2V0IGRvZXMgbm90IGV4aXN0LgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgcGF0aCB0byB0aGUgYXNzZXQgYXMgZ2l2ZW4gaW4gdGhlIGZpbGUuCiAgIHN0YXRpYyBjb25zdCBQdWJzcGVjV2FybmluZ0NvZGUgQVNTRVRfRE9FU19OT1RfRVhJU1QgPSBQdWJzcGVjV2FybmluZ0NvZGUoCiAgICAgICAnQVNTRVRfRE9FU19OT1RfRVhJU1QnLCAiVGhlIGFzc2V0IHswfSBkb2VzIG5vdCBleGlzdC4iLAogICAgICAgY29ycmVjdGlvbjogIlRyeSBjcmVhdGluZyB0aGUgZmlsZSBvciBmaXhpbmcgdGhlIHBhdGggdG8gdGhlIGZpbGUuIik7CiAKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzcGVjaWZpZWQgYXNzZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotICAgKgotICAgKiBQYXJhbWV0ZXJzOgotICAgKiAwOiB0aGUgcGF0aCB0byB0aGUgYXNzZXQgZGlyZWN0b3J5IGFzIGdpdmVuIGluIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzcGVjaWZpZWQgYXNzZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgcGF0aCB0byB0aGUgYXNzZXQgZGlyZWN0b3J5IGFzIGdpdmVuIGluIHRoZSBmaWxlLgogICBzdGF0aWMgY29uc3QgUHVic3BlY1dhcm5pbmdDb2RlIEFTU0VUX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVCA9CiAgICAgICBQdWJzcGVjV2FybmluZ0NvZGUoJ0FTU0VUX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVCcsCiAgICAgICAgICAgIlRoZSBhc3NldCBkaXJlY3RvcnkgezB9IGRvZXMgbm90IGV4aXN0LiIsCiAgICAgICAgICAgY29ycmVjdGlvbjogIlRyeSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IG9yIGZpeGluZyB0aGUgcGF0aCB0byB0aGUgIgogICAgICAgICAgICAgICAiZGlyZWN0b3J5LiIpOwogCi0gIC8qKgotICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgYXNzZXQgZmllbGQgaXMgbm90IGEgbGlzdC4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgYXNzZXQgZmllbGQgaXMgbm90IGEgbGlzdC4KICAgc3RhdGljIGNvbnN0IFB1YnNwZWNXYXJuaW5nQ29kZSBBU1NFVF9GSUVMRF9OT1RfTElTVCA9IFB1YnNwZWNXYXJuaW5nQ29kZSgKICAgICAgICdBU1NFVF9GSUVMRF9OT1RfTElTVCcsCi0gICAgICAiVGhlIHZhbHVlIG9mIHRoZSAnYXNzZXQnIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGEgbGlzdCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzLiIsCisgICAgICAiVGhlIHZhbHVlIG9mIHRoZSAnYXNzZXQnIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGEgbGlzdCBvZiByZWxhdGl2ZSAiCisgICAgICAgICAgImZpbGUgcGF0aHMuIiwKICAgICAgIGNvcnJlY3Rpb246CiAgICAgICAgICAgIlRyeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBiZSBhIGxpc3Qgb2YgcmVsYXRpdmUgZmlsZSBwYXRocy4iKTsKIAotICAvKioKLSAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBlbGVtZW50IGluIHRoZSBhc3NldCBsaXN0IGlzIG5vdCBhIHN0cmluZy4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGVsZW1lbnQgaW4gdGhlIGFzc2V0IGxpc3QgaXMgbm90IGEgc3RyaW5nLgogICBzdGF0aWMgY29uc3QgUHVic3BlY1dhcm5pbmdDb2RlIEFTU0VUX05PVF9TVFJJTkcgPSBQdWJzcGVjV2FybmluZ0NvZGUoCiAgICAgICAnQVNTRVRfTk9UX1NUUklORycsICJBc3NldHMgYXJlIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSBwYXRocyAoc3RyaW5ncykuIiwKICAgICAgIGNvcnJlY3Rpb246ICJUcnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYmUgYSBzdHJpbmcuIik7CiAKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHZhbHVlIG9mIGEgZGVwZW5kZW5jaWVzIGZpZWxkIGlzIG5vdCBhIG1hcC4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBvZiBhIGRlcGVuZGVuY2llcyBmaWVsZCBpcyBub3QgYSBtYXAuCiAgIHN0YXRpYyBjb25zdCBQdWJzcGVjV2FybmluZ0NvZGUgREVQRU5ERU5DSUVTX0ZJRUxEX05PVF9NQVAgPQogICAgICAgUHVic3BlY1dhcm5pbmdDb2RlKCdERVBFTkRFTkNJRVNfRklFTERfTk9UX01BUCcsCiAgICAgICAgICAgIlRoZSB2YWx1ZSBvZiB0aGUgJ3swfScgZmllbGQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBtYXAuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGJlIGEgbWFwLiIpOwogCi0gIC8qKgotICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgZmx1dHRlciBmaWVsZCBpcyBub3QgYSBtYXAuCi0gICAqLworICAvLy8gQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGZsdXR0ZXIgZmllbGQgaXMgbm90IGEgbWFwLgogICBzdGF0aWMgY29uc3QgUHVic3BlY1dhcm5pbmdDb2RlIEZMVVRURVJfRklFTERfTk9UX01BUCA9IFB1YnNwZWNXYXJuaW5nQ29kZSgKICAgICAgICdGTFVUVEVSX0ZJRUxEX05PVF9NQVAnLAogICAgICAgIlRoZSB2YWx1ZSBvZiB0aGUgJ2ZsdXR0ZXInIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGEgbWFwLiIsCiAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGJlIGEgbWFwLiIpOwogCi0gIC8qKgotICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBuYW1lIGZpZWxkIGlzIG1pc3NpbmcuCi0gICAqLworICAvLy8gQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgbmFtZSBmaWVsZCBpcyBtaXNzaW5nLgogICBzdGF0aWMgY29uc3QgUHVic3BlY1dhcm5pbmdDb2RlIE1JU1NJTkdfTkFNRSA9IFB1YnNwZWNXYXJuaW5nQ29kZSgKICAgICAgICdNSVNTSU5HX05BTUUnLCAiVGhlIG5hbWUgZmllbGQgaXMgcmVxdWlyZWQgYnV0IG1pc3NpbmcuIiwKICAgICAgIGNvcnJlY3Rpb246ICJUcnkgYWRkaW5nIGEgZmllbGQgbmFtZWQgJ25hbWUnLiIpOwogCi0gIC8qKgotICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBuYW1lIGZpZWxkIGlzIG5vdCBhIHN0cmluZy4KLSAgICovCisgIC8vLyBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBuYW1lIGZpZWxkIGlzIG5vdCBhIHN0cmluZy4KICAgc3RhdGljIGNvbnN0IFB1YnNwZWNXYXJuaW5nQ29kZSBOQU1FX05PVF9TVFJJTkcgPSBQdWJzcGVjV2FybmluZ0NvZGUoCiAgICAgICAnTkFNRV9OT1RfU1RSSU5HJywKICAgICAgICJUaGUgdmFsdWUgb2YgdGhlIG5hbWUgZmllbGQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzdHJpbmcuIiwKICAgICAgIGNvcnJlY3Rpb246ICJUcnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYmUgYSBzdHJpbmcuIik7CiAKLSAgLyoqCi0gICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBwYWNrYWdlIGxpc3RlZCBhcyBhIGRldiBkZXBlbmRlbmN5IGlzIGFsc28gbGlzdGVkCi0gICAqIGFzIGEgbm9ybWFsIGRlcGVuZGVuY3kuCi0gICAqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqIDA6IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGluIHRoZSBkZXZfZGVwZW5kZW5jeSBsaXN0LgotICAgKi8KKyAgLy8vIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBwYWNrYWdlIGxpc3RlZCBhcyBhIGRldiBkZXBlbmRlbmN5IGlzIGFsc28gbGlzdGVkCisgIC8vLyBhcyBhIG5vcm1hbCBkZXBlbmRlbmN5LgorICAvLy8KKyAgLy8vIFBhcmFtZXRlcnM6CisgIC8vLyAwOiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpbiB0aGUgZGV2X2RlcGVuZGVuY3kgbGlzdC4KICAgc3RhdGljIGNvbnN0IFB1YnNwZWNXYXJuaW5nQ29kZSBVTk5FQ0VTU0FSWV9ERVZfREVQRU5ERU5DWSA9CiAgICAgICBQdWJzcGVjV2FybmluZ0NvZGUoCiAgICAgICAgICAgJ1VOTkVDRVNTQVJZX0RFVl9ERVBFTkRFTkNZJywKQEAgLTk0LDEwICs3NSw4IEBACiAgICAgICAgICAgICAgICJub3JtYWwgZGVwZW5kZW5jeSBvbiB0aGF0IHBhY2thZ2UuIiwKICAgICAgICAgICBjb3JyZWN0aW9uOiAiVHJ5IHJlbW92aW5nIHRoZSBkZXYgZGVwZW5kZW5jeS4iKTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgd2FybmluZyBjb2RlIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXSwgW21lc3NhZ2VdCi0gICAqIGFuZCBbY29ycmVjdGlvbl0uCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgd2FybmluZyBjb2RlIHRvIGhhdmUgdGhlIGdpdmVuIFtuYW1lXSwKKyAgLy8vIFttZXNzYWdlXSBhbmQgW2NvcnJlY3Rpb25dLgogICBjb25zdCBQdWJzcGVjV2FybmluZ0NvZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBtZXNzYWdlLCB7U3RyaW5nIGNvcnJlY3Rpb259KQogICAgICAgOiBzdXBlci50ZW1wb3JhcnkobmFtZSwgbWVzc2FnZSwgY29ycmVjdGlvbjogY29ycmVjdGlvbik7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3NlcnZpY2VzL2xpbnQuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3NlcnZpY2VzL2xpbnQuZGFydAppbmRleCAyZmRjZTdiLi5mNjUxMzBmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zZXJ2aWNlcy9saW50LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc2VydmljZXMvbGludC5kYXJ0CkBAIC0zNSw5ICszNSw3IEBACiAgIC8vLyBOT1RFOiB0aGlzIGlzIHNldCBieSB0aGUgZnJhbWV3b3JrIGJlZm9yZSB2aXNpdCBiZWdpbnMuCiAgIEVycm9yUmVwb3J0ZXIgcmVwb3J0ZXI7CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbGludCBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbnRlci4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxpbnQgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW50ZXIuCiAgIExpbnRDb2RlIGdldCBsaW50Q29kZSA9PiBudWxsOwogCiAgIC8vLyBMaW50ZXIgbmFtZS4KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3NvdXJjZS9wYWNrYWdlX21hcF9wcm92aWRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Byb3ZpZGVyLmRhcnQKaW5kZXggNjkwNTNiYS4uZTRjOTMyMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Byb3ZpZGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Byb3ZpZGVyLmRhcnQKQEAgLTQsMzkgKzQsMjkgQEAKIAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2ZpbGVfc3lzdGVtL2ZpbGVfc3lzdGVtLmRhcnQnOwogCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIG91dHB1dCBieSBQYWNrYWdlTWFwUHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zIGJvdGggdGhlIHBhY2thZ2UKLSAqIG1hcCBhbmQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLSAqLworLy8vIERhdGEgc3RydWN0dXJlIG91dHB1dCBieSBQYWNrYWdlTWFwUHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zIGJvdGggdGhlIHBhY2thZ2UKKy8vLyBtYXAgYW5kIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCiBjbGFzcyBQYWNrYWdlTWFwSW5mbyB7Ci0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBtYXAgaXRzZWxmLiAgVGhpcyBpcyBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSB0byBhIGxpc3Qgb2YKLSAgICogdGhlIGZvbGRlcnMgY29udGFpbmluZyBzb3VyY2UgY29kZSBmb3IgdGhlIHBhY2thZ2UuCi0gICAqCi0gICAqIGBudWxsYCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICovCisgIC8vLyBUaGUgcGFja2FnZSBtYXAgaXRzZWxmLiAgVGhpcyBpcyBhIG1hcCBmcm9tIHBhY2thZ2UgbmFtZSB0byBhIGxpc3Qgb2YKKyAgLy8vIHRoZSBmb2xkZXJzIGNvbnRhaW5pbmcgc291cmNlIGNvZGUgZm9yIHRoZSBwYWNrYWdlLgorICAvLy8KKyAgLy8vIGBudWxsYCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAgTWFwPFN0cmluZywgTGlzdDxGb2xkZXI+PiBwYWNrYWdlTWFwOwogCi0gIC8qKgotICAgKiBEZXBlbmRlbmN5IGluZm9ybWF0aW9uLiAgVGhpcyBpcyBhIHNldCBvZiB0aGUgcGF0aHMgd2hpY2ggd2VyZSBjb25zdWx0ZWQKLSAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHBhY2thZ2UgbWFwLiAgSWYgYW55IG9mIHRoZXNlIGZpbGVzIGlzCi0gICAqIG1vZGlmaWVkLCB0aGUgcGFja2FnZSBtYXAgd2lsbCBuZWVkIHRvIGJlIHJlZ2VuZXJhdGVkLgotICAgKi8KKyAgLy8vIERlcGVuZGVuY3kgaW5mb3JtYXRpb24uICBUaGlzIGlzIGEgc2V0IG9mIHRoZSBwYXRocyB3aGljaCB3ZXJlIGNvbnN1bHRlZAorICAvLy8gaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIHBhY2thZ2UgbWFwLiAgSWYgYW55IG9mIHRoZXNlIGZpbGVzIGlzCisgIC8vLyBtb2RpZmllZCwgdGhlIHBhY2thZ2UgbWFwIHdpbGwgbmVlZCB0byBiZSByZWdlbmVyYXRlZC4KICAgU2V0PFN0cmluZz4gZGVwZW5kZW5jaWVzOwogCiAgIFBhY2thZ2VNYXBJbmZvKHRoaXMucGFja2FnZU1hcCwgdGhpcy5kZXBlbmRlbmNpZXMpOwogfQogCi0vKioKLSAqIEEgUGFja2FnZU1hcFByb3ZpZGVyIGlzIGFuIGVudGl0eSBjYXBhYmxlIG9mIGRldGVybWluaW5nIHRoZSBtYXBwaW5nIGZyb20KLSAqIHBhY2thZ2UgbmFtZSB0byBzb3VyY2UgZGlyZWN0b3J5IGZvciBhIGdpdmVuIGZvbGRlci4KLSAqLworLy8vIEEgUGFja2FnZU1hcFByb3ZpZGVyIGlzIGFuIGVudGl0eSBjYXBhYmxlIG9mIGRldGVybWluaW5nIHRoZSBtYXBwaW5nIGZyb20KKy8vLyBwYWNrYWdlIG5hbWUgdG8gc291cmNlIGRpcmVjdG9yeSBmb3IgYSBnaXZlbiBmb2xkZXIuCiBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlTWFwUHJvdmlkZXIgewotICAvKioKLSAgICogQ29tcHV0ZSBhIHBhY2thZ2UgbWFwIGZvciB0aGUgZ2l2ZW4gZm9sZGVyLCBpZiBwb3NzaWJsZS4KLSAgICoKLSAgICogSWYgYSBwYWNrYWdlIG1hcCBjYW4ndCBiZSBjb21wdXRlZCAoZS5nLiBiZWNhdXNlIGFuIGVycm9yIG9jY3VycmVkKSwgYQotICAgKiBbUGFja2FnZU1hcEluZm9dIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQsIGJ1dCBpdHMgcGFja2FnZU1hcCB3aWxsIGJlIG51bGwuCi0gICAqLworICAvLy8gQ29tcHV0ZSBhIHBhY2thZ2UgbWFwIGZvciB0aGUgZ2l2ZW4gZm9sZGVyLCBpZiBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBJZiBhIHBhY2thZ2UgbWFwIGNhbid0IGJlIGNvbXB1dGVkIChlLmcuIGJlY2F1c2UgYW4gZXJyb3Igb2NjdXJyZWQpLCBhCisgIC8vLyBbUGFja2FnZU1hcEluZm9dIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQsIGJ1dCBpdHMgcGFja2FnZU1hcCB3aWxsIGJlIG51bGwuCiAgIFBhY2thZ2VNYXBJbmZvIGNvbXB1dGVQYWNrYWdlTWFwKEZvbGRlciBmb2xkZXIpOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zb3VyY2UvcGFja2FnZV9tYXBfcmVzb2x2ZXIuZGFydAppbmRleCBjNjE4YTI5Li40M2Q4YmE0IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zb3VyY2UvcGFja2FnZV9tYXBfcmVzb2x2ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zb3VyY2UvcGFja2FnZV9tYXBfcmVzb2x2ZXIuZGFydApAQCAtOSwzMyArOSwyMyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL2Fzc2VydHMuZGFydCcgYXMgYXNzZXJ0czsKIGltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aG9zOwogCi0vKioKLSAqIEEgW1VyaVJlc29sdmVyXSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGBwYWNrYWdlOmAgc2NoZW1lIHRoYXQgdXNlcyBhIG1hcCBvZgotICogcGFja2FnZSBuYW1lcyB0byB0aGVpciBkaXJlY3Rvcmllcy4KLSAqLworLy8vIEEgW1VyaVJlc29sdmVyXSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGBwYWNrYWdlOmAgc2NoZW1lIHRoYXQgdXNlcyBhIG1hcCBvZgorLy8vIHBhY2thZ2UgbmFtZXMgdG8gdGhlaXIgZGlyZWN0b3JpZXMuCiBjbGFzcyBQYWNrYWdlTWFwVXJpUmVzb2x2ZXIgZXh0ZW5kcyBVcmlSZXNvbHZlciB7Ci0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgYHBhY2thZ2VgIHNjaGVtZS4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYHBhY2thZ2VgIHNjaGVtZS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBQQUNLQUdFX1NDSEVNRSA9ICJwYWNrYWdlIjsKIAotICAvKioKLSAgICogQSB0YWJsZSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcKLSAgICogdGhlIHBhY2thZ2UuCi0gICAqLworICAvLy8gQSB0YWJsZSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcKKyAgLy8vIHRoZSBwYWNrYWdlLgogICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEZvbGRlcj4+IHBhY2thZ2VNYXA7CiAKLSAgLyoqCi0gICAqIFRoZSBbUmVzb3VyY2VQcm92aWRlcl0gZm9yIHRoaXMgcmVzb2x2ZXIuCi0gICAqLworICAvLy8gVGhlIFtSZXNvdXJjZVByb3ZpZGVyXSBmb3IgdGhpcyByZXNvbHZlci4KICAgZmluYWwgUmVzb3VyY2VQcm92aWRlciByZXNvdXJjZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgW1BhY2thZ2VNYXBVcmlSZXNvbHZlcl0uCi0gICAqCi0gICAqIFtwYWNrYWdlTWFwXSBpcyBhIHRhYmxlIG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byB0aGUgcGF0aHMgb2YgdGhlCi0gICAqIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UKLSAgICovCisgIC8vLyBDcmVhdGUgYSBuZXcgW1BhY2thZ2VNYXBVcmlSZXNvbHZlcl0uCisgIC8vLworICAvLy8gW3BhY2thZ2VNYXBdIGlzIGEgdGFibGUgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIHRoZSBwYXRocyBvZiB0aGUKKyAgLy8vIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UKICAgUGFja2FnZU1hcFVyaVJlc29sdmVyKHRoaXMucmVzb3VyY2VQcm92aWRlciwgdGhpcy5wYWNrYWdlTWFwKSB7CiAgICAgYXNzZXJ0cy5ub3ROdWxsKHJlc291cmNlUHJvdmlkZXIpOwogICAgIGFzc2VydHMubm90TnVsbChwYWNrYWdlTWFwKTsKQEAgLTkwLDkgKzgwLDcgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBbdXJpXSBpcyBhIGBwYWNrYWdlYCBVUkkuCi0gICAqLworICAvLy8gUmV0dXJucyBgdHJ1ZWAgaWYgW3VyaV0gaXMgYSBgcGFja2FnZWAgVVJJLgogICBzdGF0aWMgYm9vbCBpc1BhY2thZ2VVcmkoVXJpIHVyaSkgewogICAgIHJldHVybiB1cmkuc2NoZW1lID09IFBBQ0tBR0VfU0NIRU1FOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zb3VyY2Uvc291cmNlX3Jlc291cmNlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zb3VyY2Uvc291cmNlX3Jlc291cmNlLmRhcnQKaW5kZXggZDQ1MDY5OS4uZTI0MGU4MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc291cmNlL3NvdXJjZV9yZXNvdXJjZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3NvdXJjZS9zb3VyY2VfcmVzb3VyY2UuZGFydApAQCAtMTMsNTUgKzEzLDM3IEBACiAvLy8gY2xpZW50cyB0aGF0IGNvbnZlcnQgYWxsIHRleHQgdG8gYW4gaW50ZXJuYWwgZm9ybWF0LgogdHlwZWRlZiBGaWxlUmVhZE1vZGUgPSBTdHJpbmcgRnVuY3Rpb24oU3RyaW5nIHMpOwogCi0vKioKLSAqIEEgc291cmNlIHRoYXQgcmVwcmVzZW50cyBhIGZpbGUuCi0gKi8KKy8vLyBBIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgYSBmaWxlLgogY2xhc3MgRmlsZVNvdXJjZSBleHRlbmRzIFNvdXJjZSB7Ci0gIC8qKgotICAgKiBBIGZ1bmN0aW9uIHRoYXQgY2hhbmdlcyB0aGUgd2F5IHRoYXQgZmlsZXMgYXJlIHJlYWQgb2ZmIG9mIGRpc2suCi0gICAqLworICAvLy8gQSBmdW5jdGlvbiB0aGF0IGNoYW5nZXMgdGhlIHdheSB0aGF0IGZpbGVzIGFyZSByZWFkIG9mZiBvZiBkaXNrLgogICBzdGF0aWMgRmlsZVJlYWRNb2RlIGZpbGVSZWFkTW9kZSA9IChTdHJpbmcgcykgPT4gczsKIAotICAvKioKLSAgICogTWFwIGZyb20gZW5jb2RlZCBVUkkvZmlsZXBhdGggcGFpciB0byBhIHVuaXF1ZSBpbnRlZ2VyIGlkZW50aWZpZXIuICBUaGlzCi0gICAqIGlkZW50aWZpZXIgaXMgdXNlZCBmb3IgZXF1YWxpdHkgdGVzdHMgYW5kIGhhc2ggY29kZXMuCi0gICAqCi0gICAqIFRoZSBVUkkgYW5kIGZpbGVwYXRoIGFyZSBqb2luZWQgaW50byBhIHBhaXIgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggYW4gJ0AnCi0gICAqIGNoYXJhY3Rlci4KLSAgICovCisgIC8vLyBNYXAgZnJvbSBlbmNvZGVkIFVSSS9maWxlcGF0aCBwYWlyIHRvIGEgdW5pcXVlIGludGVnZXIgaWRlbnRpZmllci4gIFRoaXMKKyAgLy8vIGlkZW50aWZpZXIgaXMgdXNlZCBmb3IgZXF1YWxpdHkgdGVzdHMgYW5kIGhhc2ggY29kZXMuCisgIC8vLworICAvLy8gVGhlIFVSSSBhbmQgZmlsZXBhdGggYXJlIGpvaW5lZCBpbnRvIGEgcGFpciBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhbiAnQCcKKyAgLy8vIGNoYXJhY3Rlci4KICAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gX2lkVGFibGUgPSBIYXNoTWFwPFN0cmluZywgaW50PigpOwogCi0gIC8qKgotICAgKiBUaGUgVVJJIGZyb20gd2hpY2ggdGhpcyBzb3VyY2Ugd2FzIG9yaWdpbmFsbHkgZGVyaXZlZC4KLSAgICovCisgIC8vLyBUaGUgVVJJIGZyb20gd2hpY2ggdGhpcyBzb3VyY2Ugd2FzIG9yaWdpbmFsbHkgZGVyaXZlZC4KICAgQG92ZXJyaWRlCiAgIGZpbmFsIFVyaSB1cmk7CiAKLSAgLyoqCi0gICAqIFRoZSB1bmlxdWUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc291cmNlLgotICAgKi8KKyAgLy8vIFRoZSB1bmlxdWUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc291cmNlLgogICBmaW5hbCBpbnQgaWQ7CiAKLSAgLyoqCi0gICAqIFRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgotICAgKi8KKyAgLy8vIFRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgogICBmaW5hbCBGaWxlIGZpbGU7CiAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNvdXJjZS4KLSAgICovCisgIC8vLyBUaGUgY2FjaGVkIGFic29sdXRlIHBhdGggb2YgdGhpcyBzb3VyY2UuCiAgIFN0cmluZyBfYWJzb2x1dGVQYXRoOwogCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIGVuY29kaW5nIGZvciB0aGlzIHNvdXJjZS4KLSAgICovCisgIC8vLyBUaGUgY2FjaGVkIGVuY29kaW5nIGZvciB0aGlzIHNvdXJjZS4KICAgU3RyaW5nIF9lbmNvZGluZzsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc291cmNlIG9iamVjdCB0byByZXByZXNlbnQgdGhlIGdpdmVuIFtmaWxlXS4gSWYKLSAgICogYSBbdXJpXSBpcyBnaXZlbiwgdGhlbiBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIFVSSSBmcm9tIHdoaWNoIHRoZSBzb3VyY2Ugd2FzCi0gICAqIGRlcml2ZWQsIG90aGVyd2lzZSBhIGBmaWxlOmAgVVJJIHdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgW2ZpbGVdLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNvdXJjZSBvYmplY3QgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBbZmlsZV0uIElmCisgIC8vLyBhIFt1cmldIGlzIGdpdmVuLCB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgVVJJIGZyb20gd2hpY2ggdGhlIHNvdXJjZQorICAvLy8gd2FzIGRlcml2ZWQsIG90aGVyd2lzZSBhIGBmaWxlOmAgVVJJIHdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgW2ZpbGVdLgogICBGaWxlU291cmNlKEZpbGUgZmlsZSwgW1VyaSB1cmldKQogICAgICAgOiB0aGlzLnVyaSA9IHVyaSA/PyBmaWxlLnRvVXJpKCksCiAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGUsCkBAIC03NSwxNiArNTcsMTQgQEAKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBHZXQgYW5kIHJldHVybiB0aGUgY29udGVudHMgYW5kIHRpbWVzdGFtcCBvZiB0aGUgdW5kZXJseWluZyBmaWxlLgotICAgKgotICAgKiBDbGllbnRzIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbWV0aG9kIFtBbmFseXNpc0NvbnRleHQuZ2V0Q29udGVudHNdCi0gICAqIGJlY2F1c2UgY29udGV4dHMgY2FuIGhhdmUgbG9jYWwgb3ZlcnJpZGVzIG9mIHRoZSBjb250ZW50IG9mIGEgc291cmNlIHRoYXQKLSAgICogdGhlIHNvdXJjZSBpcyBub3QgYXdhcmUgb2YuCi0gICAqCi0gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc291cmNlIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICogU2VlIFtjb250ZW50c10uCi0gICAqLworICAvLy8gR2V0IGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIGFuZCB0aW1lc3RhbXAgb2YgdGhlIHVuZGVybHlpbmcgZmlsZS4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbWV0aG9kIFtBbmFseXNpc0NvbnRleHQuZ2V0Q29udGVudHNdCisgIC8vLyBiZWNhdXNlIGNvbnRleHRzIGNhbiBoYXZlIGxvY2FsIG92ZXJyaWRlcyBvZiB0aGUgY29udGVudCBvZiBhIHNvdXJjZSB0aGF0CisgIC8vLyB0aGUgc291cmNlIGlzIG5vdCBhd2FyZSBvZi4KKyAgLy8vCisgIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHNvdXJjZSBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCisgIC8vLyBTZWUgW2NvbnRlbnRzXS4KICAgVGltZXN0YW1wZWREYXRhPFN0cmluZz4gZ2V0IGNvbnRlbnRzRnJvbUZpbGUgewogICAgIHJldHVybiBUaW1lc3RhbXBlZERhdGE8U3RyaW5nPigKICAgICAgICAgbW9kaWZpY2F0aW9uU3RhbXAsIGZpbGVSZWFkTW9kZShmaWxlLnJlYWRBc1N0cmluZ1N5bmMoKSkpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3RyaW5nX3NvdXJjZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3RyaW5nX3NvdXJjZS5kYXJ0CmluZGV4IDgxMWI0OTMuLmRmNDA4Y2YgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N0cmluZ19zb3VyY2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdHJpbmdfc291cmNlLmRhcnQKQEAgLTUsMTMgKzUsOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnIHNob3cgVGltZXN0YW1wZWREYXRhOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwogCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFtTb3VyY2VdIHRoYXQncyBiYXNlZCBvbiBhbiBpbi1tZW1vcnkgRGFydCBzdHJpbmcuCi0gKi8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBbU291cmNlXSB0aGF0J3MgYmFzZWQgb24gYW4gaW4tbWVtb3J5IERhcnQgc3RyaW5nLgogY2xhc3MgU3RyaW5nU291cmNlIGV4dGVuZHMgU291cmNlIHsKLSAgLyoqCi0gICAqIFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UuCi0gICAqLworICAvLy8gVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZS4KICAgZmluYWwgU3RyaW5nIF9jb250ZW50czsKIAogICBAb3ZlcnJpZGUKQEAgLTQ3LDEwICs0Myw4IEBACiAgIEBvdmVycmlkZQogICBVcmlLaW5kIGdldCB1cmlLaW5kID0+IFVyaUtpbmQuRklMRV9VUkk7CiAKLSAgLyoqCi0gICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtvYmplY3RdIGlzIGEgc3RyaW5nIHNvdXJjZSB0aGF0IGlzIGVxdWFsIHRvCi0gICAqIHRoaXMgc291cmNlLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFtvYmplY3RdIGlzIGEgc3RyaW5nIHNvdXJjZSB0aGF0IGlzIGVxdWFsIHRvCisgIC8vLyB0aGlzIHNvdXJjZS4KICAgQG92ZXJyaWRlCiAgIGJvb2wgb3BlcmF0b3IgPT0oT2JqZWN0IG9iamVjdCkgewogICAgIHJldHVybiBvYmplY3QgaXMgU3RyaW5nU291cmNlICYmCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2FwaV9zaWduYXR1cmUuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYXBpX3NpZ25hdHVyZS5kYXJ0CmluZGV4IGJmYTVhMjAuLjRhNmQ0MDQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYXBpX3NpZ25hdHVyZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYXBpX3NpZ25hdHVyZS5kYXJ0CkBAIC0xMSw2NyArMTEsNTEgQEAKIGltcG9ydCAncGFja2FnZTpjcnlwdG8vY3J5cHRvLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnB1Yl9zZW12ZXIvcHViX3NlbXZlci5kYXJ0JzsKIAotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBbQXBpU2lnbmF0dXJlXSBjb2xsZWN0cyBkYXRhIGluIHRoZSBmb3JtIG9mIHByaW1pdGl2ZSB0eXBlcwotICogKHN0cmluZ3MsIGludHMsIGJvb2xzLCBldGMuKSBmcm9tIGEgc3VtbWFyeSAiYnVpbGRlciIgb2JqZWN0LCBhbmQgdXNlcyB0aGVtCi0gKiB0byBnZW5lcmF0ZSBhbiBNRDUgc2lnbmF0dXJlIG9mIGEgdGhlIG5vbi1pbmZvcm1hdGl2ZSBwYXJ0cyBvZiB0aGUgc3VtbWFyeQotICogKGkuZS4gdGhvc2UgcGFydHMgcmVwcmVzZW50aW5nIHRoZSBBUEkgb2YgdGhlIGNvZGUgYmVpbmcgc3VtbWFyaXplZCkuCi0gKgotICogTm90ZSB0aGF0IHRoZSBkYXRhIHBhc3NlZCB0byB0aGUgTUQ1IHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgdW50eXBlZC4gIFNvLCBmb3IKLSAqIGluc3RhbmNlLCBhbiBBUEkgc2lnbmF0dXJlIGJ1aWx0IGZyb20gYSBzZXF1ZW5jZSBvZiBgZmFsc2VgIGJvb2xlYW5zIGlzCi0gKiBsaWtlbHkgdG8gbWF0Y2ggYW4gQVBJIHNpZ25hdHVyZSBidWlsdCBmcm9tIGEgc2VxdWVuY2Ugb2YgemVyb3MuICBUaGUgY2FsbGVyCi0gKiBzaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudDsgZS5nLiBpZiBhIGRhdGEgc3RydWN0dXJlIG1heSBiZSByZXByZXNlbnRlZAotICogZWl0aGVyIGJ5IGEgYm9vbGVhbiBvciBhbiBpbnQsIHRoZSBjYWxsZXIgc2hvdWxkIGVuY29kZSBhIHRhZyBkaXN0aW5ndWlzaGluZwotICogdGhlIHR3byByZXByZXNlbnRhdGlvbnMgYmVmb3JlIGVuY29kaW5nIHRoZSBkYXRhLgotICovCisvLy8gQW4gaW5zdGFuY2Ugb2YgW0FwaVNpZ25hdHVyZV0gY29sbGVjdHMgZGF0YSBpbiB0aGUgZm9ybSBvZiBwcmltaXRpdmUgdHlwZXMKKy8vLyAoc3RyaW5ncywgaW50cywgYm9vbHMsIGV0Yy4pIGZyb20gYSBzdW1tYXJ5ICJidWlsZGVyIiBvYmplY3QsIGFuZCB1c2VzIHRoZW0KKy8vLyB0byBnZW5lcmF0ZSBhbiBNRDUgc2lnbmF0dXJlIG9mIGEgdGhlIG5vbi1pbmZvcm1hdGl2ZSBwYXJ0cyBvZiB0aGUgc3VtbWFyeQorLy8vIChpLmUuIHRob3NlIHBhcnRzIHJlcHJlc2VudGluZyB0aGUgQVBJIG9mIHRoZSBjb2RlIGJlaW5nIHN1bW1hcml6ZWQpLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBkYXRhIHBhc3NlZCB0byB0aGUgTUQ1IHNpZ25hdHVyZSBhbGdvcml0aG0gaXMgdW50eXBlZC4gIFNvLAorLy8vIGZvciBpbnN0YW5jZSwgYW4gQVBJIHNpZ25hdHVyZSBidWlsdCBmcm9tIGEgc2VxdWVuY2Ugb2YgYGZhbHNlYCBib29sZWFucyBpcworLy8vIGxpa2VseSB0byBtYXRjaCBhbiBBUEkgc2lnbmF0dXJlIGJ1aWx0IGZyb20gYSBzZXF1ZW5jZSBvZiB6ZXJvcy4gIFRoZSBjYWxsZXIKKy8vLyBzaG91bGQgdGFrZSB0aGlzIGludG8gYWNjb3VudDsgZS5nLiBpZiBhIGRhdGEgc3RydWN0dXJlIG1heSBiZSByZXByZXNlbnRlZAorLy8vIGVpdGhlciBieSBhIGJvb2xlYW4gb3IgYW4gaW50LCB0aGUgY2FsbGVyIHNob3VsZCBlbmNvZGUgYSB0YWcgZGlzdGluZ3Vpc2hpbmcKKy8vLyB0aGUgdHdvIHJlcHJlc2VudGF0aW9ucyBiZWZvcmUgZW5jb2RpbmcgdGhlIGRhdGEuCiBjbGFzcyBBcGlTaWduYXR1cmUgewotICAvKioKLSAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcy4gIEFueSB0aW1lIHRoaXMgY2xhc3MgaXMgY2hhbmdlZAotICAgKiBpbiBhIHdheSB0aGF0IGFmZmVjdHMgdGhlIGRhdGEgY29sbGVjdGVkIGluIFtfZGF0YV0sIHRoaXMgdmVyc2lvbiBudW1iZXIKLSAgICogc2hvdWxkIGJlIGluY3JlbWVudGVkLCBzbyB0aGF0IGEgc3VtbWFyeSBzaWduZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZQotICAgKiBzaWduYXR1cmUgYWxnb3JpdGhtIHdvbid0IGFjY2lkZW50YWxseSBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBhIHN1bW1hcnkKLSAgICogc2lnbmVkIGJ5IGFuIG9sZGVyIHZlcnNpb24uCi0gICAqLworICAvLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcy4gIEFueSB0aW1lIHRoaXMgY2xhc3MgaXMgY2hhbmdlZAorICAvLy8gaW4gYSB3YXkgdGhhdCBhZmZlY3RzIHRoZSBkYXRhIGNvbGxlY3RlZCBpbiBbX2RhdGFdLCB0aGlzIHZlcnNpb24gbnVtYmVyCisgIC8vLyBzaG91bGQgYmUgaW5jcmVtZW50ZWQsIHNvIHRoYXQgYSBzdW1tYXJ5IHNpZ25lZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgdGhlCisgIC8vLyBzaWduYXR1cmUgYWxnb3JpdGhtIHdvbid0IGFjY2lkZW50YWxseSBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBhCisgIC8vLyBzdW1tYXJ5IHNpZ25lZCBieSBhbiBvbGRlciB2ZXJzaW9uLgogICBzdGF0aWMgY29uc3QgaW50IF9WRVJTSU9OID0gMDsKIAotICAvKioKLSAgICogRGF0YSBhY2N1bXVsYXRlZCBzbyBmYXIuCi0gICAqLworICAvLy8gRGF0YSBhY2N1bXVsYXRlZCBzbyBmYXIuCiAgIEJ5dGVEYXRhIF9kYXRhID0gQnl0ZURhdGEoNDA5Nik7CiAKLSAgLyoqCi0gICAqIE9mZnNldCBpbnRvIFtfZGF0YV0gd2hlcmUgdGhlIG5leHQgYnl0ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICovCisgIC8vLyBPZmZzZXQgaW50byBbX2RhdGFdIHdoZXJlIHRoZSBuZXh0IGJ5dGUgc2hvdWxkIGJlIHdyaXR0ZW4uCiAgIGludCBfb2Zmc2V0ID0gMDsKIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFtBcGlTaWduYXR1cmVdIHdoaWNoIGlzIHJlYWR5IHRvIGFjY2VwdCBkYXRhLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhbiBbQXBpU2lnbmF0dXJlXSB3aGljaCBpcyByZWFkeSB0byBhY2NlcHQgZGF0YS4KICAgQXBpU2lnbmF0dXJlKCkgewogICAgIGFkZEludChfVkVSU0lPTik7CiAgIH0KIAotICAvKioKLSAgICogRm9yIHRlc3Rpbmcgb25seTogY3JlYXRlIGFuIFtBcGlTaWduYXR1cmVdIHdoaWNoIGRvZXNuJ3QgaW5jbHVkZSBhbnkKLSAgICogdmVyc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVuaXQgdGVzdHMsIHNpbmNlIHRoZSBkYXRhCi0gICAqIGlzIHN0YWJsZSBldmVuIGlmIFtfVkVSU0lPTl0gaXMgY2hhbmdlZC4KLSAgICovCisgIC8vLyBGb3IgdGVzdGluZyBvbmx5OiBjcmVhdGUgYW4gW0FwaVNpZ25hdHVyZV0gd2hpY2ggZG9lc24ndCBpbmNsdWRlIGFueQorICAvLy8gdmVyc2lvbiBpbmZvcm1hdGlvbi4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHVuaXQgdGVzdHMsIHNpbmNlIHRoZSBkYXRhCisgIC8vLyBpcyBzdGFibGUgZXZlbiBpZiBbX1ZFUlNJT05dIGlzIGNoYW5nZWQuCiAgIEFwaVNpZ25hdHVyZS51bnZlcnNpb25lZCgpOwogCi0gIC8qKgotICAgKiBDb2xsZWN0IGEgYm9vbGVhbiB2YWx1ZS4KLSAgICovCisgIC8vLyBDb2xsZWN0IGEgYm9vbGVhbiB2YWx1ZS4KICAgdm9pZCBhZGRCb29sKGJvb2wgYikgewogICAgIF9tYWtlUm9vbSgxKTsKICAgICBfZGF0YS5zZXRVaW50OChfb2Zmc2V0LCBiID8gMSA6IDApOwogICAgIF9vZmZzZXQrKzsKICAgfQogCi0gIC8qKgotICAgKiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgYXJiaXRyYXJ5IGJ5dGVzLiAgTm90ZSB0aGF0IHRoZSBsZW5ndGggaXMgbm90Ci0gICAqIGNvbGxlY3RlZCwgc28gZm9yIGV4YW1wbGUgYGFkZEJ5dGVzKFsxLCAyXSk7YCB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzCi0gICAqIGBhZGRCeXRlcyhbMV0pOyBhZGRCeXRlcyhbMl0pO2AuCi0gICAqLworICAvLy8gQ29sbGVjdCBhIHNlcXVlbmNlIG9mIGFyYml0cmFyeSBieXRlcy4gIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIGlzIG5vdAorICAvLy8gY29sbGVjdGVkLCBzbyBmb3IgZXhhbXBsZSBgYWRkQnl0ZXMoWzEsIDJdKTtgIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QgYXMKKyAgLy8vIGBhZGRCeXRlcyhbMV0pOyBhZGRCeXRlcyhbMl0pO2AuCiAgIHZvaWQgYWRkQnl0ZXMoTGlzdDxpbnQ+IGJ5dGVzKSB7CiAgICAgaW50IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICAgICBfbWFrZVJvb20obGVuZ3RoKTsKQEAgLTgxLDE4ICs2NSwxNCBAQAogICAgIF9vZmZzZXQgKz0gbGVuZ3RoOwogICB9CiAKLSAgLyoqCi0gICAqIENvbGxlY3QgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgotICAgKi8KKyAgLy8vIENvbGxlY3QgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLgogICB2b2lkIGFkZERvdWJsZShkb3VibGUgZCkgewogICAgIF9tYWtlUm9vbSg4KTsKICAgICBfZGF0YS5zZXRGbG9hdDY0KF9vZmZzZXQsIGQsIEVuZGlhbi5saXR0bGUpOwogICAgIF9vZmZzZXQgKz0gODsKICAgfQogCi0gIC8qKgotICAgKiBDb2xsZWN0IGEgW0ZlYXR1cmVTZXRdLgotICAgKi8KKyAgLy8vIENvbGxlY3QgYSBbRmVhdHVyZVNldF0uCiAgIHZvaWQgYWRkRmVhdHVyZVNldChGZWF0dXJlU2V0IGZlYXR1cmVTZXQpIHsKICAgICB2YXIga25vd25GZWF0dXJlcyA9IEV4cGVyaW1lbnRTdGF0dXMua25vd25GZWF0dXJlczsKICAgICBhZGRJbnQoa25vd25GZWF0dXJlcy5sZW5ndGgpOwpAQCAtMTAxLDY1ICs4MSw0OSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBDb2xsZWN0IGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWUuCi0gICAqLworICAvLy8gQ29sbGVjdCBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgogICB2b2lkIGFkZEludChpbnQgaSkgewogICAgIF9tYWtlUm9vbSg0KTsKICAgICBfZGF0YS5zZXRVaW50MzIoX29mZnNldCwgaSwgRW5kaWFuLmxpdHRsZSk7CiAgICAgX29mZnNldCArPSA0OwogICB9CiAKLSAgLyoqCi0gICAqIENvbGxlY3QgYSBsYW5ndWFnZSB2ZXJzaW9uLgotICAgKi8KKyAgLy8vIENvbGxlY3QgYSBsYW5ndWFnZSB2ZXJzaW9uLgogICB2b2lkIGFkZExhbmd1YWdlVmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKICAgICBhZGRJbnQodmVyc2lvbi5tYWpvcik7CiAgICAgYWRkSW50KHZlcnNpb24ubWlub3IpOwogICB9CiAKLSAgLyoqCi0gICAqIENvbGxlY3QgYSBzdHJpbmcuCi0gICAqLworICAvLy8gQ29sbGVjdCBhIHN0cmluZy4KICAgdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHMpIHsKICAgICBMaXN0PGludD4gYnl0ZXMgPSB1dGY4LmVuY29kZShzKTsKICAgICBhZGRJbnQoYnl0ZXMubGVuZ3RoKTsKICAgICBhZGRCeXRlcyhieXRlcyk7CiAgIH0KIAotICAvKioKLSAgICogQ29sbGVjdCB0aGUgZ2l2ZW4gW1VpbnQzMkxpc3RdLgotICAgKi8KKyAgLy8vIENvbGxlY3QgdGhlIGdpdmVuIFtVaW50MzJMaXN0XS4KICAgdm9pZCBhZGRVaW50MzJMaXN0KFVpbnQzMkxpc3QgZGF0YSkgewogICAgIGFkZEJ5dGVzKGRhdGEuYnVmZmVyLmFzVWludDhMaXN0KCkpOwogICB9CiAKLSAgLyoqCi0gICAqIEZvciB0ZXN0aW5nIG9ubHk6IHJldHJpZXZlIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSB0aGF0Ci0gICAqIGhhcyBiZWVuIGNvbGxlY3RlZC4KLSAgICovCisgIC8vLyBGb3IgdGVzdGluZyBvbmx5OiByZXRyaWV2ZSB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgdGhhdAorICAvLy8gaGFzIGJlZW4gY29sbGVjdGVkLgogICBMaXN0PGludD4gZ2V0Qnl0ZXNfZm9yRGVidWcoKSB7CiAgICAgcmV0dXJuIFVpbnQ4TGlzdC52aWV3KF9kYXRhLmJ1ZmZlciwgMCwgX29mZnNldCkudG9MaXN0KCk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBieXRlcyBvZiB0aGUgTUQ1IGhhc2ggb2YgdGhlIGRhdGEgY29sbGVjdGVkIHNvIGZhci4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGJ5dGVzIG9mIHRoZSBNRDUgaGFzaCBvZiB0aGUgZGF0YSBjb2xsZWN0ZWQgc28gZmFyLgogICBMaXN0PGludD4gdG9CeXRlTGlzdCgpIHsKICAgICByZXR1cm4gbWQ1LmNvbnZlcnQoVWludDhMaXN0LnZpZXcoX2RhdGEuYnVmZmVyLCAwLCBfb2Zmc2V0KSkuYnl0ZXM7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgaGV4LWVuY29kZWQgTUQ1IHNpZ25hdHVyZSBvZiB0aGUgZGF0YSBjb2xsZWN0ZWQgc28gZmFyLgotICAgKi8KKyAgLy8vIFJldHVybiBhIGhleC1lbmNvZGVkIE1ENSBzaWduYXR1cmUgb2YgdGhlIGRhdGEgY29sbGVjdGVkIHNvIGZhci4KICAgU3RyaW5nIHRvSGV4KCkgewogICAgIHJldHVybiBoZXguZW5jb2RlKHRvQnl0ZUxpc3QoKSk7CiAgIH0KIAotICAvKioKLSAgICogRW5zdXJlIHRoYXQgW3NwYWNlTmVlZGVkXSBieXRlcyBjYW4gYmUgYWRkZWQgdG8gW19kYXRhXSBhdCBbX29mZnNldF0KLSAgICogKGNvcHlpbmcgaXQgdG8gYSBsYXJnZXIgb2JqZWN0IGlmIG5lY2Vzc2FyeSkuCi0gICAqLworICAvLy8gRW5zdXJlIHRoYXQgW3NwYWNlTmVlZGVkXSBieXRlcyBjYW4gYmUgYWRkZWQgdG8gW19kYXRhXSBhdCBbX29mZnNldF0KKyAgLy8vIChjb3B5aW5nIGl0IHRvIGEgbGFyZ2VyIG9iamVjdCBpZiBuZWNlc3NhcnkpLgogICB2b2lkIF9tYWtlUm9vbShpbnQgc3BhY2VOZWVkZWQpIHsKICAgICBpbnQgb2xkTGVuZ3RoID0gX2RhdGEubGVuZ3RoSW5CeXRlczsKICAgICBpZiAoX29mZnNldCArIHNwYWNlTmVlZGVkID4gb2xkTGVuZ3RoKSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2Jhc2UuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYmFzZS5kYXJ0CmluZGV4IDkzMjE1Y2YuLjAxNzRmZWQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYmFzZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvYmFzZS5kYXJ0CkBAIC0yLDg2ICsyLDY4IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLyoqCi0gKiBCYXNlIGZ1bmN0aW9uYWxpdHkgd2hpY2ggY29kZSBnZW5lcmF0ZWQgc3VtbWFyeSBjbGFzc2VzIGFyZSBidWlsdCB1cG9uLgotICovCisvLy8gQmFzZSBmdW5jdGlvbmFsaXR5IHdoaWNoIGNvZGUgZ2VuZXJhdGVkIHN1bW1hcnkgY2xhc3NlcyBhcmUgYnVpbHQgdXBvbi4KIGxpYnJhcnkgYW5hbHl6ZXIuc3JjLnN1bW1hcnkuYmFzZTsKIAotLyoqCi0gKiBBbm5vdGF0aW9uIHVzZWQgaW4gdGhlIHN1bW1hcnkgSURMIHRvIGluZGljYXRlIHRoZSBpZCBvZiBhIGZpZWxkLiAgVGhlIHNldAotICogb2YgaWRzIHVzZWQgYnkgYSBjbGFzcyBtdXN0IGNvdmVyIHRoZSBjb250aWd1b3VzIHJhbmdlIGZyb20gMCB0byBOLTEsIHdoZXJlCi0gKiBOIGlzIHRoZSBudW1iZXIgb2YgZmllbGRzLgotICoKLSAqIEluIG9yZGVyIHRvIHByZXNlcnZlIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWQgbnVtYmVycyBtdXN0Ci0gKiBiZSBzdGFibGUgYmV0d2VlbiByZWxlYXNlcy4gIFNvIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdGhleSBzaG91bGQgdGFrZQotICogdGhlIG5leHQgYXZhaWxhYmxlIGlkIHdpdGhvdXQgcmVudW1iZXJpbmcgb3RoZXIgZmllbGRzLgotICovCisvLy8gQW5ub3RhdGlvbiB1c2VkIGluIHRoZSBzdW1tYXJ5IElETCB0byBpbmRpY2F0ZSB0aGUgaWQgb2YgYSBmaWVsZC4gIFRoZSBzZXQKKy8vLyBvZiBpZHMgdXNlZCBieSBhIGNsYXNzIG11c3QgY292ZXIgdGhlIGNvbnRpZ3VvdXMgcmFuZ2UgZnJvbSAwIHRvIE4tMSwgd2hlcmUKKy8vLyBOIGlzIHRoZSBudW1iZXIgb2YgZmllbGRzLgorLy8vCisvLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpZCBudW1iZXJzIG11c3QKKy8vLyBiZSBzdGFibGUgYmV0d2VlbiByZWxlYXNlcy4gIFNvIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdGhleSBzaG91bGQgdGFrZQorLy8vIHRoZSBuZXh0IGF2YWlsYWJsZSBpZCB3aXRob3V0IHJlbnVtYmVyaW5nIG90aGVyIGZpZWxkcy4KIGNsYXNzIElkIHsKICAgZmluYWwgaW50IHZhbHVlOwogCiAgIGNvbnN0IElkKHRoaXMudmFsdWUpOwogfQogCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tIGEgc3VtbWFyeS4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tIGEgc3VtbWFyeS4KIGFic3RyYWN0IGNsYXNzIFN1bW1hcnlDbGFzcyB7Ci0gIC8qKgotICAgKiBUcmFuc2xhdGUgdGhlIGRhdGEgaW4gdGhpcyBjbGFzcyBpbnRvIGEgSlNPTiBtYXAsIHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcwotICAgKiBvZiBmaWVsZHMgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIGRhdGEgc3RvcmVkIGluIHRob3NlIGZpZWxkcywKLSAgICogcmVjdXJzaXZlbHkgY29udmVydGVkIGludG8gSlNPTi4KLSAgICoKLSAgICogRmllbGRzIGNvbnRhaW5pbmcgdGhlaXIgZGVmYXVsdCB2YWx1ZSBhcmUgZWxpZGVkLgotICAgKgotICAgKiBJbnRlbmRlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIG9ubHkuCi0gICAqLworICAvLy8gVHJhbnNsYXRlIHRoZSBkYXRhIGluIHRoaXMgY2xhc3MgaW50byBhIEpTT04gbWFwLCB3aG9zZSBrZXlzIGFyZSB0aGUgbmFtZXMKKyAgLy8vIG9mIGZpZWxkcyBhbmQgd2hvc2UgdmFsdWVzIGFyZSB0aGUgZGF0YSBzdG9yZWQgaW4gdGhvc2UgZmllbGRzLAorICAvLy8gcmVjdXJzaXZlbHkgY29udmVydGVkIGludG8gSlNPTi4KKyAgLy8vCisgIC8vLyBGaWVsZHMgY29udGFpbmluZyB0aGVpciBkZWZhdWx0IHZhbHVlIGFyZSBlbGlkZWQuCisgIC8vLworICAvLy8gSW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBvbmx5LgogICBNYXA8U3RyaW5nLCBPYmplY3Q+IHRvSnNvbigpOwogCi0gIC8qKgotICAgKiBUcmFuc2xhdGUgdGhlIGRhdGEgaW4gdGhpcyBjbGFzcyBpbnRvIGEgbWFwIHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcyBvZgotICAgKiBmaWVsZHMgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIGRhdGEgc3RvcmVkIGluIHRob3NlIGZpZWxkcy4KLSAgICoKLSAgICogSW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBvbmx5LgotICAgKi8KKyAgLy8vIFRyYW5zbGF0ZSB0aGUgZGF0YSBpbiB0aGlzIGNsYXNzIGludG8gYSBtYXAgd2hvc2Uga2V5cyBhcmUgdGhlIG5hbWVzIG9mCisgIC8vLyBmaWVsZHMgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIGRhdGEgc3RvcmVkIGluIHRob3NlIGZpZWxkcy4KKyAgLy8vCisgIC8vLyBJbnRlbmRlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIG9ubHkuCiAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdG9NYXAoKTsKIH0KIAotLyoqCi0gKiBBbm5vdGF0aW9uIHVzZWQgaW4gdGhlIHN1bW1hcnkgSURMIHRvIGluZGljYXRlIHRoYXQgYSBzdW1tYXJ5IGNsYXNzIGNhbiBiZQotICogdGhlIHRvcCBsZXZlbCBvYmplY3QgaW4gYW4gZW5jb2RlZCBzdW1tYXJ5LgotICovCisvLy8gQW5ub3RhdGlvbiB1c2VkIGluIHRoZSBzdW1tYXJ5IElETCB0byBpbmRpY2F0ZSB0aGF0IGEgc3VtbWFyeSBjbGFzcyBjYW4gYmUKKy8vLyB0aGUgdG9wIGxldmVsIG9iamVjdCBpbiBhbiBlbmNvZGVkIHN1bW1hcnkuCiBjbGFzcyBUb3BMZXZlbCB7Ci0gIC8qKgotICAgKiBJZiBub24tbnVsbCwgaWRlbnRpZmllciB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIGJ5dGVzIDQtNyBvZiB0aGUgZmlsZSwKLSAgICogcHJpb3IgYWxsIG90aGVyIGZpbGUgZGF0YS4gIE11c3QgYmUgZXhhY3RseSA0IExhdGluMSBjaGFyYWN0ZXJzLgotICAgKi8KKyAgLy8vIElmIG5vbi1udWxsLCBpZGVudGlmaWVyIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gYnl0ZXMgNC03IG9mIHRoZSBmaWxlLAorICAvLy8gcHJpb3IgYWxsIG90aGVyIGZpbGUgZGF0YS4gIE11c3QgYmUgZXhhY3RseSA0IExhdGluMSBjaGFyYWN0ZXJzLgogICBmaW5hbCBTdHJpbmcgZmlsZUlkZW50aWZpZXI7CiAKICAgY29uc3QgVG9wTGV2ZWwoW3RoaXMuZmlsZUlkZW50aWZpZXJdKTsKIH0KIAotLyoqCi0gKiBBbm5vdGF0aW9uIHVzZWQgaW4gdGhlIHN1bW1hcnkgSURMIHRvIGluZGljYXRlIHRoZSBmaWVsZCBuYW1lIHRoYXQgaXMgdXNlZAotICogdG8gZGlzdGluZ3Vpc2ggdmFyaWFudHMsIG9yIGxvZ2ljYWwgdmlld3Mgb24gdGhlIHNhbWUgcGh5c2ljYWwgbGF5b3V0IG9mCi0gKiBmaWVsZHMuCi0gKi8KKy8vLyBBbm5vdGF0aW9uIHVzZWQgaW4gdGhlIHN1bW1hcnkgSURMIHRvIGluZGljYXRlIHRoZSBmaWVsZCBuYW1lIHRoYXQgaXMgdXNlZAorLy8vIHRvIGRpc3Rpbmd1aXNoIHZhcmlhbnRzLCBvciBsb2dpY2FsIHZpZXdzIG9uIHRoZSBzYW1lIHBoeXNpY2FsIGxheW91dCBvZgorLy8vIGZpZWxkcy4KIGNsYXNzIFZhcmlhbnQgewogICBmaW5hbCBTdHJpbmcgZmllbGROYW1lOwogCiAgIGNvbnN0IFZhcmlhbnQodGhpcy5maWVsZE5hbWUpOwogfQogCi0vKioKLSAqIEFubm90YXRpb24gdXNlZCBpbiB0aGUgc3VtbWFyeSBJREwgdG8gaW5kaWNhdGUgdGhlIGlkIG9mIGEgZmllbGQgdGhhdAotICogcmVwcmVzZW50cyBhIGxvZ2ljYWwgZmllbGQuICBUaGUgc2V0IG9mIGlkcyB1c2VkIGJ5IGEgY2xhc3MgbXVzdCBjb3ZlciB0aGUKLSAqIGNvbnRpZ3VvdXMgcmFuZ2UgZnJvbSAwIHRvIE4tMSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGZpZWxkcy4gIEFsbCBsb2dpY2FsCi0gKiBmaWVsZHMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUsIHdoaWNoIHdpbGwgYmVjb21lIHRoZSB0eXBlIG9mIHRoZSBhY3R1YWwKLSAqIGZpZWxkLgotICoKLSAqIEluIG9yZGVyIHRvIHByZXNlcnZlIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWQgbnVtYmVycyBtdXN0Ci0gKiBiZSBzdGFibGUgYmV0d2VlbiByZWxlYXNlcy4gIFNvIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdGhleSBzaG91bGQgdGFrZQotICogdGhlIG5leHQgYXZhaWxhYmxlIGlkIHdpdGhvdXQgcmVudW1iZXJpbmcgb3RoZXIgZmllbGRzLgotICovCisvLy8gQW5ub3RhdGlvbiB1c2VkIGluIHRoZSBzdW1tYXJ5IElETCB0byBpbmRpY2F0ZSB0aGUgaWQgb2YgYSBmaWVsZCB0aGF0CisvLy8gcmVwcmVzZW50cyBhIGxvZ2ljYWwgZmllbGQuICBUaGUgc2V0IG9mIGlkcyB1c2VkIGJ5IGEgY2xhc3MgbXVzdCBjb3ZlciB0aGUKKy8vLyBjb250aWd1b3VzIHJhbmdlIGZyb20gMCB0byBOLTEsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBmaWVsZHMuICBBbGwKKy8vLyBsb2dpY2FsIGZpZWxkcyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSwgd2hpY2ggd2lsbCBiZWNvbWUgdGhlIHR5cGUgb2YgdGhlCisvLy8gYWN0dWFsIGZpZWxkLgorLy8vCisvLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpZCBudW1iZXJzIG11c3QKKy8vLyBiZSBzdGFibGUgYmV0d2VlbiByZWxlYXNlcy4gIFNvIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdGhleSBzaG91bGQgdGFrZQorLy8vIHRoZSBuZXh0IGF2YWlsYWJsZSBpZCB3aXRob3V0IHJlbnVtYmVyaW5nIG90aGVyIGZpZWxkcy4KIGNsYXNzIFZhcmlhbnRJZCB7CiAgIC8vLyBUaGUgSUQgb2YgdGhlIGFjdHVhbCBmaWVsZC4KICAgZmluYWwgaW50IHZhbHVlOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9mbGF0X2J1ZmZlcnMuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvZmxhdF9idWZmZXJzLmRhcnQKaW5kZXggNDAxOTRkYy4uYjkzOWJiOSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9mbGF0X2J1ZmZlcnMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2ZsYXRfYnVmZmVycy5kYXJ0CkBAIC03LDExICs3LDkgQEAKIGltcG9ydCAnZGFydDptYXRoJzsKIGltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKIAotLyoqCi0gKiBSZWFkZXIgb2YgbGlzdHMgb2YgYm9vbGVhbiB2YWx1ZXMuCi0gKgotICogVGhlIHJldHVybmVkIHVubW9kaWZpYWJsZSBsaXN0cyBsYXppbHkgcmVhZCB2YWx1ZXMgb24gYWNjZXNzLgotICovCisvLy8gUmVhZGVyIG9mIGxpc3RzIG9mIGJvb2xlYW4gdmFsdWVzLgorLy8vCisvLy8gVGhlIHJldHVybmVkIHVubW9kaWZpYWJsZSBsaXN0cyBsYXppbHkgcmVhZCB2YWx1ZXMgb24gYWNjZXNzLgogY2xhc3MgQm9vbExpc3RSZWFkZXIgZXh0ZW5kcyBSZWFkZXI8TGlzdDxib29sPj4gewogICBjb25zdCBCb29sTGlzdFJlYWRlcigpOwogCkBAIC0yMyw5ICsyMSw3IEBACiAgICAgICBfRmJCb29sTGlzdChiYywgYmMuZGVyZWZPYmplY3Qob2Zmc2V0KSk7CiB9CiAKLS8qKgotICogVGhlIHJlYWRlciBvZiBib29sZWFucy4KLSAqLworLy8vIFRoZSByZWFkZXIgb2YgYm9vbGVhbnMuCiBjbGFzcyBCb29sUmVhZGVyIGV4dGVuZHMgUmVhZGVyPGJvb2w+IHsKICAgY29uc3QgQm9vbFJlYWRlcigpIDogc3VwZXIoKTsKIApAQCAtMzYsOSArMzIsNyBAQAogICBib29sIHJlYWQoQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4gYmMuX2dldEludDgob2Zmc2V0KSAhPSAwOwogfQogCi0vKioKLSAqIEJ1ZmZlciB3aXRoIGRhdGEgYW5kIHNvbWUgY29udGV4dCBhYm91dCBpdC4KLSAqLworLy8vIEJ1ZmZlciB3aXRoIGRhdGEgYW5kIHNvbWUgY29udGV4dCBhYm91dCBpdC4KIGNsYXNzIEJ1ZmZlckNvbnRleHQgewogICBmaW5hbCBCeXRlRGF0YSBfYnVmZmVyOwogCkBAIC02OSwxMCArNjMsOCBAQAogCiAgIGludCBfZ2V0VWludDgoaW50IG9mZnNldCkgPT4gX2J1ZmZlci5nZXRVaW50OChvZmZzZXQpOwogCi0gIC8qKgotICAgKiBJZiB0aGUgW2J5dGVMaXN0XSBpcyBhbHJlYWR5IGEgW1VpbnQ4TGlzdF0gcmV0dXJuIGl0LgotICAgKiBPdGhlcndpc2UgcmV0dXJuIGEgW1VpbnQ4TGlzdF0gY29weSBvZiB0aGUgW2J5dGVMaXN0XS4KLSAgICovCisgIC8vLyBJZiB0aGUgW2J5dGVMaXN0XSBpcyBhbHJlYWR5IGEgW1VpbnQ4TGlzdF0gcmV0dXJuIGl0LgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBhIFtVaW50OExpc3RdIGNvcHkgb2YgdGhlIFtieXRlTGlzdF0uCiAgIHN0YXRpYyBVaW50OExpc3QgX2FzVWludDhMaXN0KExpc3Q8aW50PiBieXRlTGlzdCkgewogICAgIGlmIChieXRlTGlzdCBpcyBVaW50OExpc3QpIHsKICAgICAgIHJldHVybiBieXRlTGlzdDsKQEAgLTgyLDQ2ICs3NCwzMiBAQAogICB9CiB9CiAKLS8qKgotICogQ2xhc3MgdGhhdCBoZWxwcyBidWlsZGluZyBmbGF0IGJ1ZmZlcnMuCi0gKi8KKy8vLyBDbGFzcyB0aGF0IGhlbHBzIGJ1aWxkaW5nIGZsYXQgYnVmZmVycy4KIGNsYXNzIEJ1aWxkZXIgewogICBmaW5hbCBpbnQgaW5pdGlhbFNpemU7CiAKLSAgLyoqCi0gICAqIFRoZSBsaXN0IG9mIGZpZWxkIHRhaWxzLCByZXVzZWQgYnkgW19WVGFibGVdIGluc3RhbmNlcy4KLSAgICovCisgIC8vLyBUaGUgbGlzdCBvZiBmaWVsZCB0YWlscywgcmV1c2VkIGJ5IFtfVlRhYmxlXSBpbnN0YW5jZXMuCiAgIGZpbmFsIEludDMyTGlzdCBfcmV1c2VkRmllbGRUYWlscyA9IEludDMyTGlzdCgxMDI0KTsKIAotICAvKioKLSAgICogVGhlIGxpc3Qgb2YgZmllbGQgb2Zmc2V0cywgcmV1c2VkIGJ5IFtfVlRhYmxlXSBpbnN0YW5jZXMuCi0gICAqLworICAvLy8gVGhlIGxpc3Qgb2YgZmllbGQgb2Zmc2V0cywgcmV1c2VkIGJ5IFtfVlRhYmxlXSBpbnN0YW5jZXMuCiAgIGZpbmFsIEludDMyTGlzdCBfcmV1c2VkRmllbGRPZmZzZXRzID0gSW50MzJMaXN0KDEwMjQpOwogCi0gIC8qKgotICAgKiBUaGUgbGlzdCBvZiBleGlzdGluZyBWVGFibGUocykuCi0gICAqLworICAvLy8gVGhlIGxpc3Qgb2YgZXhpc3RpbmcgVlRhYmxlKHMpLgogICBmaW5hbCBMaXN0PF9WVGFibGU+IF92VGFibGVzID0gPF9WVGFibGU+W107CiAKICAgQnl0ZURhdGEgX2J1ZjsKIAotICAvKioKLSAgICogVGhlIG1heGltdW0gYWxpZ25tZW50IHRoYXQgaGFzIGJlZW4gc2VlbiBzbyBmYXIuICBJZiBbX2J1Zl0gaGFzIHRvIGJlCi0gICAqIHJlYWxsb2NhdGVkIGluIHRoZSBmdXR1cmUgKHRvIGluc2VydCByb29tIGF0IGl0cyBzdGFydCBmb3IgbW9yZSBieXRlcykgdGhlCi0gICAqIHJlYWxsb2NhdGlvbiB3aWxsIG5lZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGlzIG1hbnkgYnl0ZXMuCi0gICAqLworICAvLy8gVGhlIG1heGltdW0gYWxpZ25tZW50IHRoYXQgaGFzIGJlZW4gc2VlbiBzbyBmYXIuICBJZiBbX2J1Zl0gaGFzIHRvIGJlCisgIC8vLyByZWFsbG9jYXRlZCBpbiB0aGUgZnV0dXJlICh0byBpbnNlcnQgcm9vbSBhdCBpdHMgc3RhcnQgZm9yIG1vcmUgYnl0ZXMpIHRoZQorICAvLy8gcmVhbGxvY2F0aW9uIHdpbGwgbmVlZCB0byBiZSBhIG11bHRpcGxlIG9mIHRoaXMgbWFueSBieXRlcy4KICAgaW50IF9tYXhBbGlnbjsKIAotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBidWZmZXIgc28gZmFyLiAgVGhlCi0gICAqIG1vc3QgcmVjZW50bHkgd3JpdHRlbiBieXRlIGlzIHRoaXMgbWFueSBieXRlcyBmcm9tIHRoZSBlbmQgb2YgW19idWZdLgotICAgKi8KKyAgLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgYnVmZmVyIHNvIGZhci4gIFRoZQorICAvLy8gbW9zdCByZWNlbnRseSB3cml0dGVuIGJ5dGUgaXMgdGhpcyBtYW55IGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBbX2J1Zl0uCiAgIGludCBfdGFpbDsKIAotICAvKioKLSAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFibGUsIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20gdGhlCi0gICAqIGVuZCBvZiBbX2J1Zl0sIG9yIGBudWxsYCBpZiBhIHRhYmxlIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgYnVpbHQuCi0gICAqLworICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFibGUsIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20gdGhlCisgIC8vLyBlbmQgb2YgW19idWZdLCBvciBgbnVsbGAgaWYgYSB0YWJsZSBpcyBub3QgY3VycmVudGx5IGJlaW5nIGJ1aWx0LgogICBpbnQgX2N1cnJlbnRUYWJsZUVuZFRhaWw7CiAKICAgX1ZUYWJsZSBfY3VycmVudFZUYWJsZTsKQEAgLTEzNCwxMSArMTEyLDkgQEAKICAgICByZXNldCgpOwogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgW2ZpZWxkXSB3aXRoIHRoZSBnaXZlbiBib29sZWFuIFt2YWx1ZV0uICBUaGUgZmllbGQgaXMgbm90IGFkZGVkIGlmCi0gICAqIHRoZSBbdmFsdWVdIGlzIGVxdWFsIHRvIFtkZWZdLiAgQm9vbGVhbnMgYXJlIHN0b3JlZCBhcyA4LWJpdCBmaWVsZHMgd2l0aAotICAgKiBgMGAgZm9yIGBmYWxzZWAgYW5kIGAxYCBmb3IgYHRydWVgLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgW2ZpZWxkXSB3aXRoIHRoZSBnaXZlbiBib29sZWFuIFt2YWx1ZV0uICBUaGUgZmllbGQgaXMgbm90IGFkZGVkIGlmCisgIC8vLyB0aGUgW3ZhbHVlXSBpcyBlcXVhbCB0byBbZGVmXS4gIEJvb2xlYW5zIGFyZSBzdG9yZWQgYXMgOC1iaXQgZmllbGRzIHdpdGgKKyAgLy8vIGAwYCBmb3IgYGZhbHNlYCBhbmQgYDFgIGZvciBgdHJ1ZWAuCiAgIHZvaWQgYWRkQm9vbChpbnQgZmllbGQsIGJvb2wgdmFsdWUsIFtib29sIGRlZl0pIHsKICAgICBfZW5zdXJlQ3VycmVudFZUYWJsZSgpOwogICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9IGRlZikgewpAQCAtMTQ5LDkgKzEyNSw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgW2ZpZWxkXSB3aXRoIHRoZSBnaXZlbiA2NC1iaXQgZmxvYXQgW3ZhbHVlXS4KLSAgICovCisgIC8vLyBBZGQgdGhlIFtmaWVsZF0gd2l0aCB0aGUgZ2l2ZW4gNjQtYml0IGZsb2F0IFt2YWx1ZV0uCiAgIHZvaWQgYWRkRmxvYXQ2NChpbnQgZmllbGQsIGRvdWJsZSB2YWx1ZSwgW2RvdWJsZSBkZWZdKSB7CiAgICAgX2Vuc3VyZUN1cnJlbnRWVGFibGUoKTsKICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBkZWYpIHsKQEAgLTE2MiwxMCArMTM2LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRoZSBbZmllbGRdIHdpdGggdGhlIGdpdmVuIDMyLWJpdCBzaWduZWQgaW50ZWdlciBbdmFsdWVdLiAgVGhlIGZpZWxkIGlzCi0gICAqIG5vdCBhZGRlZCBpZiB0aGUgW3ZhbHVlXSBpcyBlcXVhbCB0byBbZGVmXS4KLSAgICovCisgIC8vLyBBZGQgdGhlIFtmaWVsZF0gd2l0aCB0aGUgZ2l2ZW4gMzItYml0IHNpZ25lZCBpbnRlZ2VyIFt2YWx1ZV0uICBUaGUgZmllbGQKKyAgLy8vIGlzIG5vdCBhZGRlZCBpZiB0aGUgW3ZhbHVlXSBpcyBlcXVhbCB0byBbZGVmXS4KICAgdm9pZCBhZGRJbnQzMihpbnQgZmllbGQsIGludCB2YWx1ZSwgW2ludCBkZWZdKSB7CiAgICAgX2Vuc3VyZUN1cnJlbnRWVGFibGUoKTsKICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBkZWYpIHsKQEAgLTE3NiwxMCArMTQ4LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRoZSBbZmllbGRdIHdpdGggdGhlIGdpdmVuIDgtYml0IHNpZ25lZCBpbnRlZ2VyIFt2YWx1ZV0uICBUaGUgZmllbGQgaXMKLSAgICogbm90IGFkZGVkIGlmIHRoZSBbdmFsdWVdIGlzIGVxdWFsIHRvIFtkZWZdLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgW2ZpZWxkXSB3aXRoIHRoZSBnaXZlbiA4LWJpdCBzaWduZWQgaW50ZWdlciBbdmFsdWVdLiAgVGhlIGZpZWxkIGlzCisgIC8vLyBub3QgYWRkZWQgaWYgdGhlIFt2YWx1ZV0gaXMgZXF1YWwgdG8gW2RlZl0uCiAgIHZvaWQgYWRkSW50OChpbnQgZmllbGQsIGludCB2YWx1ZSwgW2ludCBkZWZdKSB7CiAgICAgX2Vuc3VyZUN1cnJlbnRWVGFibGUoKTsKICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBkZWYpIHsKQEAgLTE5MCw5ICsxNjAsNyBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBZGQgdGhlIFtmaWVsZF0gcmVmZXJlbmNpbmcgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIFtvZmZzZXRdLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgW2ZpZWxkXSByZWZlcmVuY2luZyBhbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gW29mZnNldF0uCiAgIHZvaWQgYWRkT2Zmc2V0KGludCBmaWVsZCwgT2Zmc2V0IG9mZnNldCkgewogICAgIF9lbnN1cmVDdXJyZW50VlRhYmxlKCk7CiAgICAgaWYgKG9mZnNldCAhPSBudWxsKSB7CkBAIC0yMDIsMTAgKzE3MCw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgW2ZpZWxkXSB3aXRoIHRoZSBnaXZlbiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBbdmFsdWVdLiAgVGhlIGZpZWxkCi0gICAqIGlzIG5vdCBhZGRlZCBpZiB0aGUgW3ZhbHVlXSBpcyBlcXVhbCB0byBbZGVmXS4KLSAgICovCisgIC8vLyBBZGQgdGhlIFtmaWVsZF0gd2l0aCB0aGUgZ2l2ZW4gMzItYml0IHVuc2lnbmVkIGludGVnZXIgW3ZhbHVlXS4gIFRoZSBmaWVsZAorICAvLy8gaXMgbm90IGFkZGVkIGlmIHRoZSBbdmFsdWVdIGlzIGVxdWFsIHRvIFtkZWZdLgogICB2b2lkIGFkZFVpbnQzMihpbnQgZmllbGQsIGludCB2YWx1ZSwgW2ludCBkZWZdKSB7CiAgICAgX2Vuc3VyZUN1cnJlbnRWVGFibGUoKTsKICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBkZWYpIHsKQEAgLTIxNiwxMCArMTgyLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQWRkIHRoZSBbZmllbGRdIHdpdGggdGhlIGdpdmVuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgW3ZhbHVlXS4gIFRoZSBmaWVsZAotICAgKiBpcyBub3QgYWRkZWQgaWYgdGhlIFt2YWx1ZV0gaXMgZXF1YWwgdG8gW2RlZl0uCi0gICAqLworICAvLy8gQWRkIHRoZSBbZmllbGRdIHdpdGggdGhlIGdpdmVuIDgtYml0IHVuc2lnbmVkIGludGVnZXIgW3ZhbHVlXS4gIFRoZSBmaWVsZAorICAvLy8gaXMgbm90IGFkZGVkIGlmIHRoZSBbdmFsdWVdIGlzIGVxdWFsIHRvIFtkZWZdLgogICB2b2lkIGFkZFVpbnQ4KGludCBmaWVsZCwgaW50IHZhbHVlLCBbaW50IGRlZl0pIHsKICAgICBfZW5zdXJlQ3VycmVudFZUYWJsZSgpOwogICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9IGRlZikgewpAQCAtMjMwLDkgKzE5NCw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEVuZCB0aGUgY3VycmVudCB0YWJsZSBhbmQgcmV0dXJuIGl0cyBvZmZzZXQuCi0gICAqLworICAvLy8gRW5kIHRoZSBjdXJyZW50IHRhYmxlIGFuZCByZXR1cm4gaXRzIG9mZnNldC4KICAgT2Zmc2V0IGVuZFRhYmxlKCkgewogICAgIGlmIChfY3VycmVudFZUYWJsZSA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCdTdGFydCBhIHRhYmxlIGJlZm9yZSBlbmRpbmcgaXQuJyk7CkBAIC0yNzEsMTMgKzIzMywxMSBAQAogICAgIHJldHVybiBPZmZzZXQodGFibGVUYWlsKTsKICAgfQogCi0gIC8qKgotICAgKiBGaW5pc2ggb2ZmIHRoZSBjcmVhdGlvbiBvZiB0aGUgYnVmZmVyLiAgVGhlIGdpdmVuIFtvZmZzZXRdIGlzIHVzZWQgYXMgdGhlCi0gICAqIHJvb3Qgb2JqZWN0IG9mZnNldCwgYW5kIHVzdWFsbHkgcmVmZXJlbmNlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGV2ZXJ5Ci0gICAqIHdyaXR0ZW4gb2JqZWN0LiAgSWYgW2ZpbGVJZGVudGlmaWVyXSBpcyBzcGVjaWZpZWQgKGFuZCBub3QgYG51bGxgKSwgaXQgaXMKLSAgICogaW50ZXJwcmV0ZWQgYXMgYSA0LWJ5dGUgTGF0aW4tMSBlbmNvZGVkIHN0cmluZyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgYXQKLSAgICogYnl0ZXMgNC03IG9mIHRoZSBmaWxlLgotICAgKi8KKyAgLy8vIEZpbmlzaCBvZmYgdGhlIGNyZWF0aW9uIG9mIHRoZSBidWZmZXIuICBUaGUgZ2l2ZW4gW29mZnNldF0gaXMgdXNlZCBhcyB0aGUKKyAgLy8vIHJvb3Qgb2JqZWN0IG9mZnNldCwgYW5kIHVzdWFsbHkgcmVmZXJlbmNlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGV2ZXJ5CisgIC8vLyB3cml0dGVuIG9iamVjdC4gIElmIFtmaWxlSWRlbnRpZmllcl0gaXMgc3BlY2lmaWVkIChhbmQgbm90IGBudWxsYCksIGl0IGlzCisgIC8vLyBpbnRlcnByZXRlZCBhcyBhIDQtYnl0ZSBMYXRpbi0xIGVuY29kZWQgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBhdAorICAvLy8gYnl0ZXMgNC03IG9mIHRoZSBmaWxlLgogICBVaW50OExpc3QgZmluaXNoKE9mZnNldCBvZmZzZXQsIFtTdHJpbmcgZmlsZUlkZW50aWZpZXJdKSB7CiAgICAgX3ByZXBhcmUobWF4KDQsIF9tYXhBbGlnbiksIGZpbGVJZGVudGlmaWVyID09IG51bGwgPyAxIDogMik7CiAgICAgaW50IGFsaWduZWRUYWlsID0gX3RhaWwgKyAoKC1fdGFpbCkgJSBfbWF4QWxpZ24pOwpAQCAtMjkxLDQyICsyNTEsMzIgQEAKICAgICByZXR1cm4gX2J1Zi5idWZmZXIuYXNVaW50OExpc3QoX2J1Zi5sZW5ndGhJbkJ5dGVzIC0gYWxpZ25lZFRhaWwpOwogICB9CiAKLSAgLyoqCi0gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgbWV0aG9kLCBpdCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLSAgICovCisgIC8vLyBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCiAgIFVpbnQ4TGlzdCBsb3dGaW5pc2goKSB7CiAgICAgaW50IGFsaWduZWRUYWlsID0gX3RhaWwgKyAoKC1fdGFpbCkgJSBfbWF4QWxpZ24pOwogICAgIHJldHVybiBfYnVmLmJ1ZmZlci5hc1VpbnQ4TGlzdChfYnVmLmxlbmd0aEluQnl0ZXMgLSBhbGlnbmVkVGFpbCk7CiAgIH0KIAotICAvKioKLSAgICogVGhpcyBpcyBhIGxvdy1sZXZlbCBtZXRob2QsIGl0IHNob3VsZCBub3QgYmUgaW52b2tlZCBieSBjbGllbnRzLgotICAgKi8KKyAgLy8vIFRoaXMgaXMgYSBsb3ctbGV2ZWwgbWV0aG9kLCBpdCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KICAgdm9pZCBsb3dSZXNldCgpIHsKICAgICBfYnVmID0gQnl0ZURhdGEoaW5pdGlhbFNpemUpOwogICAgIF9tYXhBbGlnbiA9IDE7CiAgICAgX3RhaWwgPSAwOwogICB9CiAKLSAgLyoqCi0gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgbWV0aG9kLCBpdCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLSAgICovCisgIC8vLyBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCiAgIHZvaWQgbG93V3JpdGVVaW50MzIoaW50IHZhbHVlKSB7CiAgICAgX3ByZXBhcmUoNCwgMSk7CiAgICAgX3NldFVpbnQzMkF0VGFpbChfYnVmLCBfdGFpbCwgdmFsdWUpOwogICB9CiAKLSAgLyoqCi0gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgbWV0aG9kLCBpdCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLSAgICovCisgIC8vLyBUaGlzIGlzIGEgbG93LWxldmVsIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCiAgIHZvaWQgbG93V3JpdGVVaW50OChpbnQgdmFsdWUpIHsKICAgICBfcHJlcGFyZSgxLCAxKTsKICAgICBfYnVmLnNldFVpbnQ4KF9idWYubGVuZ3RoSW5CeXRlcyAtIF90YWlsLCB2YWx1ZSk7CiAgIH0KIAotICAvKioKLSAgICogUmVzZXQgdGhlIGJ1aWxkZXIgYW5kIG1ha2UgaXQgcmVhZHkgZm9yIGZpbGxpbmcgYSBuZXcgYnVmZmVyLgotICAgKi8KKyAgLy8vIFJlc2V0IHRoZSBidWlsZGVyIGFuZCBtYWtlIGl0IHJlYWR5IGZvciBmaWxsaW5nIGEgbmV3IGJ1ZmZlci4KICAgdm9pZCByZXNldCgpIHsKICAgICBfYnVmID0gQnl0ZURhdGEoaW5pdGlhbFNpemUpOwogICAgIF9tYXhBbGlnbiA9IDE7CkBAIC0zMzQsOSArMjg0LDcgQEAKICAgICBfY3VycmVudFZUYWJsZSA9IG51bGw7CiAgIH0KIAotICAvKioKLSAgICogU3RhcnQgYSBuZXcgdGFibGUuICBNdXN0IGJlIGZpbmlzaGVkIHdpdGggW2VuZFRhYmxlXSBpbnZvY2F0aW9uLgotICAgKi8KKyAgLy8vIFN0YXJ0IGEgbmV3IHRhYmxlLiAgTXVzdCBiZSBmaW5pc2hlZCB3aXRoIFtlbmRUYWJsZV0gaW52b2NhdGlvbi4KICAgdm9pZCBzdGFydFRhYmxlKCkgewogICAgIGlmIChfY3VycmVudFZUYWJsZSAhPSBudWxsKSB7CiAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCdJbmxpbmUgdGFibGVzIGFyZSBub3Qgc3VwcG9ydGVkLicpOwpAQCAtMzQ1LDkgKzI5Myw3IEBACiAgICAgX2N1cnJlbnRUYWJsZUVuZFRhaWwgPSBfdGFpbDsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiBbdmFsdWVzXS4KLSAgICovCisgIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiBbdmFsdWVzXS4KICAgT2Zmc2V0IHdyaXRlTGlzdChMaXN0PE9mZnNldD4gdmFsdWVzKSB7CiAgICAgX2Vuc3VyZU5vVlRhYmxlKCk7CiAgICAgX3ByZXBhcmUoNCwgMSArIHZhbHVlcy5sZW5ndGgpOwpAQCAtMzYyLDkgKzMwOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiBib29sZWFuIFt2YWx1ZXNdLgotICAgKi8KKyAgLy8vIFdyaXRlIHRoZSBnaXZlbiBsaXN0IG9mIGJvb2xlYW4gW3ZhbHVlc10uCiAgIE9mZnNldCB3cml0ZUxpc3RCb29sKExpc3Q8Ym9vbD4gdmFsdWVzKSB7CiAgICAgaW50IGJpdExlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CiAgICAgaW50IHBhZGRpbmcgPSAoLWJpdExlbmd0aCkgJSA4OwpAQCAtMzk0LDkgKzMzOCw3IEBACiAgICAgcmV0dXJuIHdyaXRlTGlzdFVpbnQ4KGJ5dGVzKTsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiA2NC1iaXQgZmxvYXQgW3ZhbHVlc10uCi0gICAqLworICAvLy8gV3JpdGUgdGhlIGdpdmVuIGxpc3Qgb2YgNjQtYml0IGZsb2F0IFt2YWx1ZXNdLgogICBPZmZzZXQgd3JpdGVMaXN0RmxvYXQ2NChMaXN0PGRvdWJsZT4gdmFsdWVzKSB7CiAgICAgX2Vuc3VyZU5vVlRhYmxlKCk7CiAgICAgX3ByZXBhcmUoOCwgMSArIHZhbHVlcy5sZW5ndGgpOwpAQCAtNDExLDkgKzM1Myw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiBzaWduZWQgMzItYml0IGludGVnZXIgW3ZhbHVlc10uCi0gICAqLworICAvLy8gV3JpdGUgdGhlIGdpdmVuIGxpc3Qgb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIFt2YWx1ZXNdLgogICBPZmZzZXQgd3JpdGVMaXN0SW50MzIoTGlzdDxpbnQ+IHZhbHVlcykgewogICAgIF9lbnN1cmVOb1ZUYWJsZSgpOwogICAgIF9wcmVwYXJlKDQsIDEgKyB2YWx1ZXMubGVuZ3RoKTsKQEAgLTQyOCw5ICszNjgsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICAvKioKLSAgICogV3JpdGUgdGhlIGdpdmVuIGxpc3Qgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgW3ZhbHVlc10uCi0gICAqLworICAvLy8gV3JpdGUgdGhlIGdpdmVuIGxpc3Qgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgW3ZhbHVlc10uCiAgIE9mZnNldCB3cml0ZUxpc3RVaW50MzIoTGlzdDxpbnQ+IHZhbHVlcykgewogICAgIF9lbnN1cmVOb1ZUYWJsZSgpOwogICAgIF9wcmVwYXJlKDQsIDEgKyB2YWx1ZXMubGVuZ3RoKTsKQEAgLTQ0NSw5ICszODMsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICAvKioKLSAgICogV3JpdGUgdGhlIGdpdmVuIGxpc3Qgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciBbdmFsdWVzXS4KLSAgICovCisgIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gbGlzdCBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIFt2YWx1ZXNdLgogICBPZmZzZXQgd3JpdGVMaXN0VWludDgoTGlzdDxpbnQ+IHZhbHVlcykgewogICAgIF9lbnN1cmVOb1ZUYWJsZSgpOwogICAgIF9wcmVwYXJlKDQsIDEsIGFkZGl0aW9uYWxCeXRlczogdmFsdWVzLmxlbmd0aCk7CkBAIC00NjIsMTAgKzM5OCw4IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZ2l2ZW4gc3RyaW5nIFt2YWx1ZV0gYW5kIHJldHVybiBpdHMgW09mZnNldF0sIG9yIGBudWxsYCBpZgotICAgKiB0aGUgW3ZhbHVlXSBpcyBlcXVhbCB0byBbZGVmXS4KLSAgICovCisgIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gc3RyaW5nIFt2YWx1ZV0gYW5kIHJldHVybiBpdHMgW09mZnNldF0sIG9yIGBudWxsYCBpZgorICAvLy8gdGhlIFt2YWx1ZV0gaXMgZXF1YWwgdG8gW2RlZl0uCiAgIE9mZnNldDxTdHJpbmc+IHdyaXRlU3RyaW5nKFN0cmluZyB2YWx1ZSwgW1N0cmluZyBkZWZdKSB7CiAgICAgX2Vuc3VyZU5vVlRhYmxlKCk7CiAgICAgaWYgKHZhbHVlICE9IGRlZikgewpAQCAtNDg2LDE4ICs0MjAsMTQgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIC8qKgotICAgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgbm90IGN1cnJlbnRseSBhIHZ0YWJsZS4KLSAgICovCisgIC8vLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgbm90IGN1cnJlbnRseSBhIHZ0YWJsZS4KICAgdm9pZCBfZW5zdXJlQ3VycmVudFZUYWJsZSgpIHsKICAgICBpZiAoX2N1cnJlbnRWVGFibGUgPT0gbnVsbCkgewogICAgICAgdGhyb3cgU3RhdGVFcnJvcignU3RhcnQgYSB0YWJsZSBiZWZvcmUgYWRkaW5nIHZhbHVlcy4nKTsKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGN1cnJlbnRseSBhIHZ0YWJsZS4KLSAgICovCisgIC8vLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgdnRhYmxlLgogICB2b2lkIF9lbnN1cmVOb1ZUYWJsZSgpIHsKICAgICBpZiAoX2N1cnJlbnRWVGFibGUgIT0gbnVsbCkgewogICAgICAgdGhyb3cgU3RhdGVFcnJvcigKQEAgLTUwNSwxMSArNDM1LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUHJlcGFyZSBmb3Igd3JpdGluZyB0aGUgZ2l2ZW4gW2NvdW50XSBvZiBzY2FsYXJzIG9mIHRoZSBnaXZlbiBbc2l6ZV0uCi0gICAqIEFkZGl0aW9uYWxseSBhbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIFthZGRpdGlvbmFsQnl0ZXNdLiBVcGRhdGUgdGhlIGN1cnJlbnQKLSAgICogdGFpbCBwb2ludGVyIHRvIHBvaW50IGF0IHRoZSBhbGxvY2F0ZWQgc3BhY2UuCi0gICAqLworICAvLy8gUHJlcGFyZSBmb3Igd3JpdGluZyB0aGUgZ2l2ZW4gW2NvdW50XSBvZiBzY2FsYXJzIG9mIHRoZSBnaXZlbiBbc2l6ZV0uCisgIC8vLyBBZGRpdGlvbmFsbHkgYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBbYWRkaXRpb25hbEJ5dGVzXS4gVXBkYXRlIHRoZSBjdXJyZW50CisgIC8vLyB0YWlsIHBvaW50ZXIgdG8gcG9pbnQgYXQgdGhlIGFsbG9jYXRlZCBzcGFjZS4KICAgdm9pZCBfcHJlcGFyZShpbnQgc2l6ZSwgaW50IGNvdW50LCB7aW50IGFkZGl0aW9uYWxCeXRlcyA9IDB9KSB7CiAgICAgLy8gVXBkYXRlIHRoZSBhbGlnbm1lbnQuCiAgICAgaWYgKF9tYXhBbGlnbiA8IHNpemUpIHsKQEAgLTUzOCw5ICs0NjYsNyBAQAogICAgIF90YWlsICs9IGJ1ZlNpemU7CiAgIH0KIAotICAvKioKLSAgICogUmVjb3JkIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIFtmaWVsZF0uCi0gICAqLworICAvLy8gUmVjb3JkIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIFtmaWVsZF0uCiAgIHZvaWQgX3RyYWNrRmllbGQoaW50IGZpZWxkKSB7CiAgICAgX2N1cnJlbnRWVGFibGUuYWRkRmllbGQoZmllbGQsIF90YWlsKTsKICAgfQpAQCAtNTYyLDExICs0ODgsOSBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIHJlYWRlciBvZiBsaXN0cyBvZiA2NC1iaXQgZmxvYXQgdmFsdWVzLgotICoKLSAqIFRoZSByZXR1cm5lZCB1bm1vZGlmaWFibGUgbGlzdHMgbGF6aWx5IHJlYWQgdmFsdWVzIG9uIGFjY2Vzcy4KLSAqLworLy8vIFRoZSByZWFkZXIgb2YgbGlzdHMgb2YgNjQtYml0IGZsb2F0IHZhbHVlcy4KKy8vLworLy8vIFRoZSByZXR1cm5lZCB1bm1vZGlmaWFibGUgbGlzdHMgbGF6aWx5IHJlYWQgdmFsdWVzIG9uIGFjY2Vzcy4KIGNsYXNzIEZsb2F0NjRMaXN0UmVhZGVyIGV4dGVuZHMgUmVhZGVyPExpc3Q8ZG91YmxlPj4gewogICBjb25zdCBGbG9hdDY0TGlzdFJlYWRlcigpOwogCkBAIC01NzgsOSArNTAyLDcgQEAKICAgICAgIF9GYkZsb2F0NjRMaXN0KGJjLCBiYy5kZXJlZk9iamVjdChvZmZzZXQpKTsKIH0KIAotLyoqCi0gKiBUaGUgcmVhZGVyIG9mIDY0LWJpdCBmbG9hdHMuCi0gKi8KKy8vLyBUaGUgcmVhZGVyIG9mIDY0LWJpdCBmbG9hdHMuCiBjbGFzcyBGbG9hdDY0UmVhZGVyIGV4dGVuZHMgUmVhZGVyPGRvdWJsZT4gewogICBjb25zdCBGbG9hdDY0UmVhZGVyKCkgOiBzdXBlcigpOwogCkBAIC01OTEsOSArNTEzLDcgQEAKICAgZG91YmxlIHJlYWQoQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4gYmMuX2dldEZsb2F0NjQob2Zmc2V0KTsKIH0KIAotLyoqCi0gKiBUaGUgcmVhZGVyIG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuCi0gKi8KKy8vLyBUaGUgcmVhZGVyIG9mIHNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuCiBjbGFzcyBJbnQzMlJlYWRlciBleHRlbmRzIFJlYWRlcjxpbnQ+IHsKICAgY29uc3QgSW50MzJSZWFkZXIoKSA6IHN1cGVyKCk7CiAKQEAgLTYwNCw5ICs1MjQsNyBAQAogICBpbnQgcmVhZChCdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PiBiYy5fZ2V0SW50MzIob2Zmc2V0KTsKIH0KIAotLyoqCi0gKiBUaGUgcmVhZGVyIG9mIDgtYml0IHNpZ25lZCBpbnRlZ2Vycy4KLSAqLworLy8vIFRoZSByZWFkZXIgb2YgOC1iaXQgc2lnbmVkIGludGVnZXJzLgogY2xhc3MgSW50OFJlYWRlciBleHRlbmRzIFJlYWRlcjxpbnQ+IHsKICAgY29uc3QgSW50OFJlYWRlcigpIDogc3VwZXIoKTsKIApAQCAtNjE3LDExICs1MzUsOSBAQAogICBpbnQgcmVhZChCdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA9PiBiYy5fZ2V0SW50OChvZmZzZXQpOwogfQogCi0vKioKLSAqIFRoZSByZWFkZXIgb2YgbGlzdHMgb2Ygb2JqZWN0cy4KLSAqCi0gKiBUaGUgcmV0dXJuZWQgdW5tb2RpZmlhYmxlIGxpc3RzIGxhemlseSByZWFkIG9iamVjdHMgb24gYWNjZXNzLgotICovCisvLy8gVGhlIHJlYWRlciBvZiBsaXN0cyBvZiBvYmplY3RzLgorLy8vCisvLy8gVGhlIHJldHVybmVkIHVubW9kaWZpYWJsZSBsaXN0cyBsYXppbHkgcmVhZCBvYmplY3RzIG9uIGFjY2Vzcy4KIGNsYXNzIExpc3RSZWFkZXI8RT4gZXh0ZW5kcyBSZWFkZXI8TGlzdDxFPj4gewogICBmaW5hbCBSZWFkZXI8RT4gX2VsZW1lbnRSZWFkZXI7CiAKQEAgLTYzNSwzNCArNTUxLDI1IEBACiAgICAgICBfRmJHZW5lcmljTGlzdDxFPihfZWxlbWVudFJlYWRlciwgYmMsIGJjLmRlcmVmT2JqZWN0KG9mZnNldCkpOwogfQogCi0vKioKLSAqIFRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdG8gYSBzZXJpYWxpemVkIG9iamVjdCBvZiB0aGUgdHlwZSBbVF0uCi0gKi8KKy8vLyBUaGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHRvIGEgc2VyaWFsaXplZCBvYmplY3Qgb2YgdGhlIHR5cGUKKy8vLyBbVF0uCiBjbGFzcyBPZmZzZXQ8VD4gewogICBmaW5hbCBpbnQgX3RhaWw7CiAKICAgT2Zmc2V0KHRoaXMuX3RhaWwpOwogfQogCi0vKioKLSAqIE9iamVjdCB0aGF0IGNhbiByZWFkIGEgdmFsdWUgYXQgYSBbQnVmZmVyQ29udGV4dF0uCi0gKi8KKy8vLyBPYmplY3QgdGhhdCBjYW4gcmVhZCBhIHZhbHVlIGF0IGEgW0J1ZmZlckNvbnRleHRdLgogYWJzdHJhY3QgY2xhc3MgUmVhZGVyPFQ+IHsKICAgY29uc3QgUmVhZGVyKCk7CiAKLSAgLyoqCi0gICAqIFRoZSBzaXplIG9mIHRoZSB2YWx1ZSBpbiBieXRlcy4KLSAgICovCisgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgdmFsdWUgaW4gYnl0ZXMuCiAgIGludCBnZXQgc2l6ZTsKIAotICAvKioKLSAgICogUmVhZCB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIFtvZmZzZXRdIGluIFtiY10uCi0gICAqLworICAvLy8gUmVhZCB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIFtvZmZzZXRdIGluIFtiY10uCiAgIFQgcmVhZChCdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KTsKIAotICAvKioKLSAgICogUmVhZCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFtmaWVsZF0gaW4gdGhlIGdpdmVuIFtvYmplY3RdLgotICAgKi8KKyAgLy8vIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBbZmllbGRdIGluIHRoZSBnaXZlbiBbb2JqZWN0XS4KICAgVCB2VGFibGVHZXQoQnVmZmVyQ29udGV4dCBvYmplY3QsIGludCBvZmZzZXQsIGludCBmaWVsZCwgW1QgZGVmYXVsdFZhbHVlXSkgewogICAgIGludCB2VGFibGVTT2Zmc2V0ID0gb2JqZWN0Ll9nZXRJbnQzMihvZmZzZXQpOwogICAgIGludCB2VGFibGVPZmZzZXQgPSBvZmZzZXQgLSB2VGFibGVTT2Zmc2V0OwpAQCAtNjc5LDkgKzU4Niw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgcmVhZGVyIG9mIHN0cmluZyB2YWx1ZXMuCi0gKi8KKy8vLyBUaGUgcmVhZGVyIG9mIHN0cmluZyB2YWx1ZXMuCiBjbGFzcyBTdHJpbmdSZWFkZXIgZXh0ZW5kcyBSZWFkZXI8U3RyaW5nPiB7CiAgIGNvbnN0IFN0cmluZ1JlYWRlcigpIDogc3VwZXIoKTsKIApAQCAtNzEwLDE4ICs2MTUsMTQgQEAKICAgfQogfQogCi0vKioKLSAqIEFuIGFic3RyYWN0IHJlYWRlciBmb3IgdGFibGVzLgotICovCisvLy8gQW4gYWJzdHJhY3QgcmVhZGVyIGZvciB0YWJsZXMuCiBhYnN0cmFjdCBjbGFzcyBUYWJsZVJlYWRlcjxUPiBleHRlbmRzIFJlYWRlcjxUPiB7CiAgIGNvbnN0IFRhYmxlUmVhZGVyKCk7CiAKICAgQG92ZXJyaWRlCiAgIGludCBnZXQgc2l6ZSA9PiA0OwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9iamVjdCBhdCBbb2Zmc2V0XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIG9iamVjdCBhdCBbb2Zmc2V0XS4KICAgVCBjcmVhdGVPYmplY3QoQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCk7CiAKICAgQG92ZXJyaWRlCkBAIC03MzEsMTEgKzYzMiw5IEBACiAgIH0KIH0KIAotLyoqCi0gKiBSZWFkZXIgb2YgbGlzdHMgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXIgdmFsdWVzLgotICoKLSAqIFRoZSByZXR1cm5lZCB1bm1vZGlmaWFibGUgbGlzdHMgbGF6aWx5IHJlYWQgdmFsdWVzIG9uIGFjY2Vzcy4KLSAqLworLy8vIFJlYWRlciBvZiBsaXN0cyBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB2YWx1ZXMuCisvLy8KKy8vLyBUaGUgcmV0dXJuZWQgdW5tb2RpZmlhYmxlIGxpc3RzIGxhemlseSByZWFkIHZhbHVlcyBvbiBhY2Nlc3MuCiBjbGFzcyBVaW50MzJMaXN0UmVhZGVyIGV4dGVuZHMgUmVhZGVyPExpc3Q8aW50Pj4gewogICBjb25zdCBVaW50MzJMaXN0UmVhZGVyKCk7CiAKQEAgLTc0Nyw5ICs2NDYsNyBAQAogICAgICAgX0ZiVWludDMyTGlzdChiYywgYmMuZGVyZWZPYmplY3Qob2Zmc2V0KSk7CiB9CiAKLS8qKgotICogVGhlIHJlYWRlciBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMuCi0gKi8KKy8vLyBUaGUgcmVhZGVyIG9mIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy4KIGNsYXNzIFVpbnQzMlJlYWRlciBleHRlbmRzIFJlYWRlcjxpbnQ+IHsKICAgY29uc3QgVWludDMyUmVhZGVyKCkgOiBzdXBlcigpOwogCkBAIC03NjAsMTEgKzY1Nyw5IEBACiAgIGludCByZWFkKEJ1ZmZlckNvbnRleHQgYmMsIGludCBvZmZzZXQpID0+IGJjLl9nZXRVaW50MzIob2Zmc2V0KTsKIH0KIAotLyoqCi0gKiBSZWFkZXIgb2YgbGlzdHMgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMuCi0gKgotICogVGhlIHJldHVybmVkIHVubW9kaWZpYWJsZSBsaXN0cyBsYXppbHkgcmVhZCB2YWx1ZXMgb24gYWNjZXNzLgotICovCisvLy8gUmVhZGVyIG9mIGxpc3RzIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXIgdmFsdWVzLgorLy8vCisvLy8gVGhlIHJldHVybmVkIHVubW9kaWZpYWJsZSBsaXN0cyBsYXppbHkgcmVhZCB2YWx1ZXMgb24gYWNjZXNzLgogY2xhc3MgVWludDhMaXN0UmVhZGVyIGV4dGVuZHMgUmVhZGVyPExpc3Q8aW50Pj4gewogICBjb25zdCBVaW50OExpc3RSZWFkZXIoKTsKIApAQCAtNzc2LDkgKzY3MSw3IEBACiAgICAgICBfRmJVaW50OExpc3QoYmMsIGJjLmRlcmVmT2JqZWN0KG9mZnNldCkpOwogfQogCi0vKioKLSAqIFRoZSByZWFkZXIgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMuCi0gKi8KKy8vLyBUaGUgcmVhZGVyIG9mIHVuc2lnbmVkIDgtYml0IGludGVnZXJzLgogY2xhc3MgVWludDhSZWFkZXIgZXh0ZW5kcyBSZWFkZXI8aW50PiB7CiAgIGNvbnN0IFVpbnQ4UmVhZGVyKCkgOiBzdXBlcigpOwogCkBAIC03ODksOSArNjgyLDcgQEAKICAgaW50IHJlYWQoQnVmZmVyQ29udGV4dCBiYywgaW50IG9mZnNldCkgPT4gYmMuX2dldFVpbnQ4KG9mZnNldCk7CiB9CiAKLS8qKgotICogTGlzdCBvZiBib29sZWFucyBiYWNrZWQgYnkgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCi0gKi8KKy8vLyBMaXN0IG9mIGJvb2xlYW5zIGJhY2tlZCBieSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KIGNsYXNzIF9GYkJvb2xMaXN0IHdpdGggTGlzdE1peGluPGJvb2w+IGltcGxlbWVudHMgTGlzdDxib29sPiB7CiAgIGZpbmFsIEJ1ZmZlckNvbnRleHQgYmM7CiAgIGZpbmFsIGludCBvZmZzZXQ7CkBAIC04MjUsOSArNzE2LDcgQEAKICAgaW50IF9nZXRCeXRlKGludCBpbmRleCkgPT4gYmMuX2dldFVpbnQ4KG9mZnNldCArIDQgKyBpbmRleCk7CiB9CiAKLS8qKgotICogVGhlIGxpc3QgYmFja2VkIGJ5IDY0LWJpdCB2YWx1ZXMgLSBVaW50NjQgbGVuZ3RoIGFuZCBGbG9hdDY0LgotICovCisvLy8gVGhlIGxpc3QgYmFja2VkIGJ5IDY0LWJpdCB2YWx1ZXMgLSBVaW50NjQgbGVuZ3RoIGFuZCBGbG9hdDY0LgogY2xhc3MgX0ZiRmxvYXQ2NExpc3QgZXh0ZW5kcyBfRmJMaXN0PGRvdWJsZT4gewogICBfRmJGbG9hdDY0TGlzdChCdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA6IHN1cGVyKGJjLCBvZmZzZXQpOwogCkBAIC04MzcsOSArNzI2LDcgQEAKICAgfQogfQogCi0vKioKLSAqIExpc3QgYmFja2VkIGJ5IGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggbWF5IGhhdmUgYW55IHNpemUuCi0gKi8KKy8vLyBMaXN0IGJhY2tlZCBieSBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG1heSBoYXZlIGFueSBzaXplLgogY2xhc3MgX0ZiR2VuZXJpY0xpc3Q8RT4gZXh0ZW5kcyBfRmJMaXN0PEU+IHsKICAgZmluYWwgUmVhZGVyPEU+IGVsZW1lbnRSZWFkZXI7CiAKQEAgLTg2MCw5ICs3NDcsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGltbXV0YWJsZSBsaXN0cyByZWFkIGZyb20gZmxhdCBidWZmZXJzLgotICovCisvLy8gVGhlIGJhc2UgY2xhc3MgZm9yIGltbXV0YWJsZSBsaXN0cyByZWFkIGZyb20gZmxhdCBidWZmZXJzLgogYWJzdHJhY3QgY2xhc3MgX0ZiTGlzdDxFPiB3aXRoIExpc3RNaXhpbjxFPiBpbXBsZW1lbnRzIExpc3Q8RT4gewogICBmaW5hbCBCdWZmZXJDb250ZXh0IGJjOwogICBmaW5hbCBpbnQgb2Zmc2V0OwpAQCAtODg0LDkgKzc2OSw3IEBACiAgICAgICB0aHJvdyBTdGF0ZUVycm9yKCdBdHRlbXB0IHRvIG1vZGlmeSBpbW11dGFibGUgbGlzdCcpOwogfQogCi0vKioKLSAqIExpc3QgYmFja2VkIGJ5IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KLSAqLworLy8vIExpc3QgYmFja2VkIGJ5IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KIGNsYXNzIF9GYlVpbnQzMkxpc3QgZXh0ZW5kcyBfRmJMaXN0PGludD4gewogICBfRmJVaW50MzJMaXN0KEJ1ZmZlckNvbnRleHQgYmMsIGludCBvZmZzZXQpIDogc3VwZXIoYmMsIG9mZnNldCk7CiAKQEAgLTg5Niw5ICs3NzksNyBAQAogICB9CiB9CiAKLS8qKgotICogTGlzdCBiYWNrZWQgYnkgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCi0gKi8KKy8vLyBMaXN0IGJhY2tlZCBieSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KIGNsYXNzIF9GYlVpbnQ4TGlzdCBleHRlbmRzIF9GYkxpc3Q8aW50PiB7CiAgIF9GYlVpbnQ4TGlzdChCdWZmZXJDb250ZXh0IGJjLCBpbnQgb2Zmc2V0KSA6IHN1cGVyKGJjLCBvZmZzZXQpOwogCkBAIC05MDgsMzMgKzc4OSwyMyBAQAogICB9CiB9CiAKLS8qKgotICogQ2xhc3MgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhIHRhYmxlLgotICovCisvLy8gQ2xhc3MgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhIHRhYmxlLgogY2xhc3MgX1ZUYWJsZSB7CiAgIGZpbmFsIEludDMyTGlzdCBfcmV1c2VkRmllbGRUYWlsczsKICAgZmluYWwgSW50MzJMaXN0IF9yZXVzZWRGaWVsZE9mZnNldHM7CiAKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgZmllbGRzIGluIFtfcmV1c2VkRmllbGRUYWlsc10uCi0gICAqLworICAvLy8gVGhlIG51bWJlciBvZiBmaWVsZHMgaW4gW19yZXVzZWRGaWVsZFRhaWxzXS4KICAgaW50IF9maWVsZENvdW50ID0gMDsKIAotICAvKioKLSAgICogVGhlIHByaXZhdGUgY29weSBvZiBbX3JldXNlZEZpZWxkT2Zmc2V0c10sIHdoaWNoIGlzIG1hZGUgb25seSB3aGVuIHdlCi0gICAqIGZpbmQgdGhhdCB0aGlzIHRhYmxlIGlzIHVuaXF1ZS4KLSAgICovCisgIC8vLyBUaGUgcHJpdmF0ZSBjb3B5IG9mIFtfcmV1c2VkRmllbGRPZmZzZXRzXSwgd2hpY2ggaXMgbWFkZSBvbmx5IHdoZW4gd2UKKyAgLy8vIGZpbmQgdGhhdCB0aGlzIHRhYmxlIGlzIHVuaXF1ZS4KICAgSW50MzJMaXN0IF9maWVsZE9mZnNldHM7CiAKLSAgLyoqCi0gICAqIFRoZSBzaXplIG9mIHRoZSB0YWJsZSB0aGF0IHVzZXMgdGhpcyBWVGFibGUuCi0gICAqLworICAvLy8gVGhlIHNpemUgb2YgdGhlIHRhYmxlIHRoYXQgdXNlcyB0aGlzIFZUYWJsZS4KICAgaW50IHRhYmxlU2l6ZTsKIAotICAvKioKLSAgICogVGhlIHRhaWwgb2YgdGhpcyBWVGFibGUuICBJdCBpcyB1c2VkIHRvIHNoYXJlIHRoZSBzYW1lIFZUYWJsZSBiZXR3ZWVuCi0gICAqIG11bHRpcGxlIHRhYmxlcyBvZiBpZGVudGljYWwgc3RydWN0dXJlLgotICAgKi8KKyAgLy8vIFRoZSB0YWlsIG9mIHRoaXMgVlRhYmxlLiAgSXQgaXMgdXNlZCB0byBzaGFyZSB0aGUgc2FtZSBWVGFibGUgYmV0d2VlbgorICAvLy8gbXVsdGlwbGUgdGFibGVzIG9mIGlkZW50aWNhbCBzdHJ1Y3R1cmUuCiAgIGludCB0YWlsOwogCiAgIF9WVGFibGUodGhpcy5fcmV1c2VkRmllbGRUYWlscywgdGhpcy5fcmV1c2VkRmllbGRPZmZzZXRzKTsKQEAgLTk0OCw5ICs4MTksNyBAQAogICAgIF9yZXVzZWRGaWVsZFRhaWxzW2ZpZWxkXSA9IG9mZnNldDsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBbZXhpc3RpbmddIFZUYWJsZSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoaXMuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW2V4aXN0aW5nXSBWVGFibGUgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzLgogICBib29sIGNhblVzZUV4aXN0aW5nVlRhYmxlKF9WVGFibGUgZXhpc3RpbmcpIHsKICAgICBhc3NlcnQodGFpbCA9PSBudWxsKTsKICAgICBhc3NlcnQoZXhpc3RpbmcudGFpbCAhPSBudWxsKTsKQEAgLTk2Niw5ICs4MzUsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8qKgotICAgKiBGaWxsIHRoZSBbX3JldXNlZEZpZWxkT2Zmc2V0c10gZmllbGQuCi0gICAqLworICAvLy8gRmlsbCB0aGUgW19yZXVzZWRGaWVsZE9mZnNldHNdIGZpZWxkLgogICB2b2lkIGNvbXB1dGVGaWVsZE9mZnNldHMoaW50IHRhYmxlVGFpbCkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2ZpZWxkQ291bnQ7ICsraSkgewogICAgICAgaW50IGZpZWxkVGFpbCA9IF9yZXVzZWRGaWVsZFRhaWxzW2ldOwpAQCAtOTc2LDEwICs4NDMsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBPdXRwdXRzIHRoaXMgVlRhYmxlIHRvIFtidWZdLCB3aGljaCBpcyBpcyBleHBlY3RlZCB0byBiZSBhbGlnbmVkIHRvIDE2LWJpdAotICAgKiBhbmQgaGF2ZSBhdCBsZWFzdCBbbnVtT2ZVaW50MTZdIDE2LWJpdCB3b3JkcyBhdmFpbGFibGUuCi0gICAqLworICAvLy8gT3V0cHV0cyB0aGlzIFZUYWJsZSB0byBbYnVmXSwgd2hpY2ggaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYWxpZ25lZCB0byAxNi1iaXQKKyAgLy8vIGFuZCBoYXZlIGF0IGxlYXN0IFtudW1PZlVpbnQxNl0gMTYtYml0IHdvcmRzIGF2YWlsYWJsZS4KICAgdm9pZCBvdXRwdXQoQnl0ZURhdGEgYnVmLCBpbnQgYnVmT2Zmc2V0KSB7CiAgICAgLy8gVlRhYmxlIHNpemUuCiAgICAgYnVmLnNldFVpbnQxNihidWZPZmZzZXQsIG51bU9mVWludDE2ICogMiwgRW5kaWFuLmxpdHRsZSk7CkBAIC05OTQsOSArODU5LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogRmlsbCB0aGUgW19maWVsZE9mZnNldHNdIGZpZWxkLgotICAgKi8KKyAgLy8vIEZpbGwgdGhlIFtfZmllbGRPZmZzZXRzXSBmaWVsZC4KICAgdm9pZCB0YWtlRmllbGRPZmZzZXRzKCkgewogICAgIGFzc2VydChfZmllbGRPZmZzZXRzID09IG51bGwpOwogICAgIF9maWVsZE9mZnNldHMgPSBJbnQzMkxpc3QoX2ZpZWxkQ291bnQpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9saW5rLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2xpbmsuZGFydAppbmRleCBkMGJkMjQ1Li4wZDQ5MmQyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2xpbmsuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L2xpbmsuZGFydApAQCAtMiwzMyArMiwyNSBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgW0RlcGVuZGVuY3lXYWxrZXJdIGNvbnRhaW5zIHRoZSBjb3JlIGFsZ29yaXRobXMgZm9yCi0gKiB3YWxraW5nIGEgZGVwZW5kZW5jeSBncmFwaCBhbmQgZXZhbHVhdGluZyBub2RlcyBpbiBhIHNhZmUgb3JkZXIuCi0gKi8KKy8vLyBBbiBpbnN0YW5jZSBvZiBbRGVwZW5kZW5jeVdhbGtlcl0gY29udGFpbnMgdGhlIGNvcmUgYWxnb3JpdGhtcyBmb3IKKy8vLyB3YWxraW5nIGEgZGVwZW5kZW5jeSBncmFwaCBhbmQgZXZhbHVhdGluZyBub2RlcyBpbiBhIHNhZmUgb3JkZXIuCiBhYnN0cmFjdCBjbGFzcyBEZXBlbmRlbmN5V2Fsa2VyPE5vZGVUeXBlIGV4dGVuZHMgTm9kZTxOb2RlVHlwZT4+IHsKLSAgLyoqCi0gICAqIENhbGxlZCBieSBbd2Fsa10gdG8gZXZhbHVhdGUgYSBzaW5nbGUgbm9uLWN5Y2xpY2FsIG5vZGUsIGFmdGVyCi0gICAqIGFsbCB0aGF0IG5vZGUncyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGV2YWx1YXRlZC4KLSAgICovCisgIC8vLyBDYWxsZWQgYnkgW3dhbGtdIHRvIGV2YWx1YXRlIGEgc2luZ2xlIG5vbi1jeWNsaWNhbCBub2RlLCBhZnRlcgorICAvLy8gYWxsIHRoYXQgbm9kZSdzIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gZXZhbHVhdGVkLgogICB2b2lkIGV2YWx1YXRlKE5vZGVUeXBlIHYpOwogCi0gIC8qKgotICAgKiBDYWxsZWQgYnkgW3dhbGtdIHRvIGV2YWx1YXRlIGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudAotICAgKiBjb250YWluaW5nIG9uZSBvciBtb3JlIG5vZGVzLiAgQWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgc3Ryb25nbHkKLSAgICogY29ubmVjdGVkIGNvbXBvbmVudCBoYXZlIGJlZW4gZXZhbHVhdGVkLgotICAgKi8KKyAgLy8vIENhbGxlZCBieSBbd2Fsa10gdG8gZXZhbHVhdGUgYSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50CisgIC8vLyBjb250YWluaW5nIG9uZSBvciBtb3JlIG5vZGVzLiAgQWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgc3Ryb25nbHkKKyAgLy8vIGNvbm5lY3RlZCBjb21wb25lbnQgaGF2ZSBiZWVuIGV2YWx1YXRlZC4KICAgdm9pZCBldmFsdWF0ZVNjYyhMaXN0PE5vZGVUeXBlPiBzY2MpOwogCi0gIC8qKgotICAgKiBXYWxrIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHN0YXJ0aW5nIGF0IFtzdGFydGluZ1BvaW50XSwgZmluZGluZwotICAgKiBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBhbmQgZXZhbHVhdGluZyB0aGVtIGluIGEgc2FmZSBvcmRlcgotICAgKiBieSBjYWxsaW5nIFtldmFsdWF0ZV0gYW5kIFtldmFsdWF0ZVNjY10uCi0gICAqCi0gICAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgVGFyamFuJ3Mgc3Ryb25nbHkgY29ubmVjdGVkCi0gICAqIGNvbXBvbmVudHMgYWxnb3JpdGhtCi0gICAqIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobSkuCi0gICAqLworICAvLy8gV2FsayB0aGUgZGVwZW5kZW5jeSBncmFwaCBzdGFydGluZyBhdCBbc3RhcnRpbmdQb2ludF0sIGZpbmRpbmcKKyAgLy8vIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBldmFsdWF0aW5nIHRoZW0gaW4gYSBzYWZlIG9yZGVyCisgIC8vLyBieSBjYWxsaW5nIFtldmFsdWF0ZV0gYW5kIFtldmFsdWF0ZVNjY10uCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBUYXJqYW4ncyBzdHJvbmdseSBjb25uZWN0ZWQKKyAgLy8vIGNvbXBvbmVudHMgYWxnb3JpdGhtCisgIC8vLyAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGFyamFuJTI3c19zdHJvbmdseV9jb25uZWN0ZWRfY29tcG9uZW50c19hbGdvcml0aG0pLgogICB2b2lkIHdhbGsoTm9kZVR5cGUgc3RhcnRpbmdQb2ludCkgewogICAgIC8vIFRPRE8ocGF1bGJlcnJ5KTogY29uc2lkZXIgcmV3cml0aW5nIGluIGEgbm9uLXJlY3Vyc2l2ZSB3YXkgc28KICAgICAvLyB0aGF0IGxvbmcgZGVwZW5kZW5jeSBjaGFpbnMgZG9uJ3QgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cuCkBAIC0xMjgsNDIgKzEyMCwzMCBAQAogICB9CiB9CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIFtOb2RlXSByZXByZXNlbnQgbm9kZXMgaW4gYSBkZXBlbmRlbmN5IGdyYXBoLiAgVGhlCi0gKiB0eXBlIHBhcmFtZXRlciwgW05vZGVUeXBlXSwgaXMgdGhlIGRlcml2ZWQgdHlwZSAodGhpcyBhZmZvcmRzIHNvbWUKLSAqIGV4dHJhIHR5cGUgc2FmZXR5IGJ5IG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gYWNjaWRlbnRhbGx5IGNvbnN0cnVjdAotICogYnJpZGdlcyBiZXR3ZWVuIHVucmVsYXRlZCBkZXBlbmRlbmN5IGdyYXBocykuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgW05vZGVdIHJlcHJlc2VudCBub2RlcyBpbiBhIGRlcGVuZGVuY3kgZ3JhcGguICBUaGUKKy8vLyB0eXBlIHBhcmFtZXRlciwgW05vZGVUeXBlXSwgaXMgdGhlIGRlcml2ZWQgdHlwZSAodGhpcyBhZmZvcmRzIHNvbWUKKy8vLyBleHRyYSB0eXBlIHNhZmV0eSBieSBtYWtpbmcgaXQgZGlmZmljdWx0IHRvIGFjY2lkZW50YWxseSBjb25zdHJ1Y3QKKy8vLyBicmlkZ2VzIGJldHdlZW4gdW5yZWxhdGVkIGRlcGVuZGVuY3kgZ3JhcGhzKS4KIGFic3RyYWN0IGNsYXNzIE5vZGU8Tm9kZVR5cGU+IHsKLSAgLyoqCi0gICAqIEluZGV4IHVzZWQgYnkgVGFyamFuJ3Mgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgYWxnb3JpdGhtLgotICAgKiBaZXJvIG1lYW5zIHRoZSBub2RlIGhhcyBub3QgYmVlbiB2aXNpdGVkIHlldDsgYSBub256ZXJvIHZhbHVlCi0gICAqIGNvdW50cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG5vZGUgd2FzIHZpc2l0ZWQuCi0gICAqLworICAvLy8gSW5kZXggdXNlZCBieSBUYXJqYW4ncyBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cyBhbGdvcml0aG0uCisgIC8vLyBaZXJvIG1lYW5zIHRoZSBub2RlIGhhcyBub3QgYmVlbiB2aXNpdGVkIHlldDsgYSBub256ZXJvIHZhbHVlCisgIC8vLyBjb3VudHMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBub2RlIHdhcyB2aXNpdGVkLgogICBpbnQgX2luZGV4ID0gMDsKIAotICAvKioKLSAgICogTG93IGxpbmsgdXNlZCBieSBUYXJqYW4ncyBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cwotICAgKiBhbGdvcml0aG0uICBUaGlzIHJlcHJlc2VudHMgdGhlIHNtYWxsZXN0IFtfaW5kZXhdIG9mIGFsbCB0aGUgbm9kZXMKLSAgICogaW4gdGhlIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnQgdG8gd2hpY2ggdGhpcyBub2RlIGJlbG9uZ3MuCi0gICAqLworICAvLy8gTG93IGxpbmsgdXNlZCBieSBUYXJqYW4ncyBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50cworICAvLy8gYWxnb3JpdGhtLiAgVGhpcyByZXByZXNlbnRzIHRoZSBzbWFsbGVzdCBbX2luZGV4XSBvZiBhbGwgdGhlIG5vZGVzCisgIC8vLyBpbiB0aGUgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudCB0byB3aGljaCB0aGlzIG5vZGUgYmVsb25ncy4KICAgaW50IF9sb3dMaW5rID0gMDsKIAogICBMaXN0PE5vZGVUeXBlPiBfZGVwZW5kZW5jaWVzOwogCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgaGFzIGJlZW4gZXZhbHVhdGVkIHlldC4KLSAgICovCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgaGFzIGJlZW4gZXZhbHVhdGVkIHlldC4KICAgYm9vbCBnZXQgaXNFdmFsdWF0ZWQ7CiAKLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGlzIG5vZGUuCi0gICAqLworICAvLy8gQ29tcHV0ZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgbm9kZS4KICAgTGlzdDxOb2RlVHlwZT4gY29tcHV0ZURlcGVuZGVuY2llcygpOwogCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIG5vZGUsIGNvbXB1dGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4KLSAgICovCisgIC8vLyBHZXRzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIG5vZGUsIGNvbXB1dGluZyB0aGVtIGlmIG5lY2Vzc2FyeS4KICAgc3RhdGljIExpc3Q8Tm9kZVR5cGU+IGdldERlcGVuZGVuY2llczxOb2RlVHlwZT4oTm9kZTxOb2RlVHlwZT4gbm9kZSkgewogICAgIHJldHVybiBub2RlLl9kZXBlbmRlbmNpZXMgPz89IG5vZGUuY29tcHV0ZURlcGVuZGVuY2llcygpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3BhY2thZ2VfYnVuZGxlX3JlYWRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9wYWNrYWdlX2J1bmRsZV9yZWFkZXIuZGFydAppbmRleCBkMTI1ZjcyLi4wYWEzMGNkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3BhY2thZ2VfYnVuZGxlX3JlYWRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvcGFja2FnZV9idW5kbGVfcmVhZGVyLmRhcnQKQEAgLTExLDEwICsxMSw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2VfaW8uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkvaWRsLmRhcnQnOwogCi0vKioKLSAqIEEgW0NvbmZsaWN0aW5nU3VtbWFyeUV4Y2VwdGlvbl0gaW5kaWNhdGVzIHRoYXQgdHdvIGRpZmZlcmVudCBzdW1tYXJpZXMKLSAqIHByb3ZpZGVkIHRvIGEgW1N1bW1hcnlEYXRhU3RvcmVdIGNvbmZsaWN0LgotICovCisvLy8gQSBbQ29uZmxpY3RpbmdTdW1tYXJ5RXhjZXB0aW9uXSBpbmRpY2F0ZXMgdGhhdCB0d28gZGlmZmVyZW50IHN1bW1hcmllcworLy8vIHByb3ZpZGVkIHRvIGEgW1N1bW1hcnlEYXRhU3RvcmVdIGNvbmZsaWN0LgogY2xhc3MgQ29uZmxpY3RpbmdTdW1tYXJ5RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAgZmluYWwgU3RyaW5nIGR1cGxpY2F0ZWRVcmk7CiAgIGZpbmFsIFN0cmluZyBzdW1tYXJ5MVVyaTsKQEAgLTYyLDE1ICs2MCwxMSBAQAogICB9CiB9CiAKLS8qKgotICogQSBwbGFjZWhvbGRlciBvZiBhIHNvdXJjZSB0aGF0IGlzIHBhcnQgb2YgYSBwYWNrYWdlIHdob3NlIGFuYWx5c2lzIHJlc3VsdHMKLSAqIGFyZSBzZXJ2ZWQgZnJvbSBpdHMgc3VtbWFyeS4gIFRoaXMgc291cmNlIHVzZXMgaXRzIFVSSSBhcyBbZnVsbE5hbWVdIGFuZCBoYXMKLSAqIGVtcHR5IGNvbnRlbnRzLgotICovCisvLy8gQSBwbGFjZWhvbGRlciBvZiBhIHNvdXJjZSB0aGF0IGlzIHBhcnQgb2YgYSBwYWNrYWdlIHdob3NlIGFuYWx5c2lzIHJlc3VsdHMKKy8vLyBhcmUgc2VydmVkIGZyb20gaXRzIHN1bW1hcnkuICBUaGlzIHNvdXJjZSB1c2VzIGl0cyBVUkkgYXMgW2Z1bGxOYW1lXSBhbmQgaGFzCisvLy8gZW1wdHkgY29udGVudHMuCiBjbGFzcyBJblN1bW1hcnlTb3VyY2UgZXh0ZW5kcyBCYXNpY1NvdXJjZSB7Ci0gIC8qKgotICAgKiBUaGUgc3VtbWFyeSBmaWxlIHdoZXJlIHRoaXMgc291cmNlIHdhcyBkZWZpbmVkLgotICAgKi8KKyAgLy8vIFRoZSBzdW1tYXJ5IGZpbGUgd2hlcmUgdGhpcyBzb3VyY2Ugd2FzIGRlZmluZWQuCiAgIGZpbmFsIFN0cmluZyBzdW1tYXJ5UGF0aDsKIAogICBJblN1bW1hcnlTb3VyY2UoVXJpIHVyaSwgdGhpcy5zdW1tYXJ5UGF0aCkgOiBzdXBlcih1cmkpOwpAQCAtOTEsMTAgKzg1LDggQEAKICAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gdXJpLnRvU3RyaW5nKCk7CiB9CiAKLS8qKgotICogVGhlIFtVcmlSZXNvbHZlcl0gdGhhdCBrbm93cyBhYm91dCBzb3VyY2VzIHRoYXQgYXJlIHNlcnZlZCBmcm9tIHRoZWlyCi0gKiBzdW1tYXJpZXMuCi0gKi8KKy8vLyBUaGUgW1VyaVJlc29sdmVyXSB0aGF0IGtub3dzIGFib3V0IHNvdXJjZXMgdGhhdCBhcmUgc2VydmVkIGZyb20gdGhlaXIKKy8vLyBzdW1tYXJpZXMuCiBjbGFzcyBJblN1bW1hcnlVcmlSZXNvbHZlciBleHRlbmRzIFVyaVJlc29sdmVyIHsKICAgUmVzb3VyY2VQcm92aWRlciByZXNvdXJjZVByb3ZpZGVyOwogICBmaW5hbCBTdW1tYXJ5RGF0YVN0b3JlIF9kYXRhU3RvcmU7CkBAIC0xMTMsMzcgKzEwNSwyNyBAQAogICB9CiB9CiAKLS8qKgotICogQSBbU3VtbWFyeURhdGFTdG9yZV0gaXMgYSBjb250YWluZXIgZm9yIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgc2V0IG9mCi0gKiBzdW1tYXJ5IHBhY2thZ2UgYnVuZGxlcy4gIEl0IGNvbnRhaW5zIG1hcHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZmluZCBsaW5rZWQKLSAqIGFuZCB1bmxpbmtlZCBzdW1tYXJpZXMgYnkgVVJJLgotICovCisvLy8gQSBbU3VtbWFyeURhdGFTdG9yZV0gaXMgYSBjb250YWluZXIgZm9yIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgc2V0IG9mCisvLy8gc3VtbWFyeSBwYWNrYWdlIGJ1bmRsZXMuICBJdCBjb250YWlucyBtYXBzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmQgbGlua2VkCisvLy8gYW5kIHVubGlua2VkIHN1bW1hcmllcyBieSBVUkkuCiBjbGFzcyBTdW1tYXJ5RGF0YVN0b3JlIHsKLSAgLyoqCi0gICAqIExpc3Qgb2YgYWxsIFtQYWNrYWdlQnVuZGxlXXMuCi0gICAqLworICAvLy8gTGlzdCBvZiBhbGwgW1BhY2thZ2VCdW5kbGVdcy4KICAgZmluYWwgTGlzdDxQYWNrYWdlQnVuZGxlPiBidW5kbGVzID0gPFBhY2thZ2VCdW5kbGU+W107CiAKLSAgLyoqCi0gICAqIE1hcCBmcm9tIHRoZSBVUkkgb2YgYSB1bml0IHRvIHRoZSBzdW1tYXJ5IHBhdGggdGhhdCBjb250YWluZWQgaXQuCi0gICAqLworICAvLy8gTWFwIGZyb20gdGhlIFVSSSBvZiBhIHVuaXQgdG8gdGhlIHN1bW1hcnkgcGF0aCB0aGF0IGNvbnRhaW5lZCBpdC4KICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB1cmlUb1N1bW1hcnlQYXRoID0gPFN0cmluZywgU3RyaW5nPnt9OwogCiAgIGZpbmFsIFNldDxTdHJpbmc+IF9saWJyYXJ5VXJpcyA9IDxTdHJpbmc+e307CiAgIGZpbmFsIFNldDxTdHJpbmc+IF9wYXJ0VXJpcyA9IDxTdHJpbmc+e307CiAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIFtTdW1tYXJ5RGF0YVN0b3JlXSBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgc3VtbWFyaWVzIGluCi0gICAqIFtzdW1tYXJ5UGF0aHNdLgotICAgKi8KKyAgLy8vIENyZWF0ZSBhIFtTdW1tYXJ5RGF0YVN0b3JlXSBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgc3VtbWFyaWVzIGluCisgIC8vLyBbc3VtbWFyeVBhdGhzXS4KICAgU3VtbWFyeURhdGFTdG9yZShJdGVyYWJsZTxTdHJpbmc+IHN1bW1hcnlQYXRocywKICAgICAgIHtSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXJ9KSB7CiAgICAgc3VtbWFyeVBhdGhzLmZvckVhY2goKFN0cmluZyBwYXRoKSA9PiBfZmlsbE1hcHMocGF0aCwgcmVzb3VyY2VQcm92aWRlcikpOwogICB9CiAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gW2J1bmRsZV0gbG9hZGVkIGZyb20gdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW3BhdGhdLgotICAgKi8KKyAgLy8vIEFkZCB0aGUgZ2l2ZW4gW2J1bmRsZV0gbG9hZGVkIGZyb20gdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW3BhdGhdLgogICB2b2lkIGFkZEJ1bmRsZShTdHJpbmcgcGF0aCwgUGFja2FnZUJ1bmRsZSBidW5kbGUpIHsKICAgICBidW5kbGVzLmFkZChidW5kbGUpOwogCkBAIC0xNjIsMjUgKzE0NCwxOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBzdG9yZSBjb250YWlucyB0aGUgbGlua2VkIHN1bW1hcnkgZm9yIHRoZSBsaWJyYXJ5Ci0gICAqIHdpdGggdGhlIGdpdmVuIGFic29sdXRlIFt1cmldLgotICAgKi8KKyAgLy8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHN0b3JlIGNvbnRhaW5zIHRoZSBsaW5rZWQgc3VtbWFyeSBmb3IgdGhlIGxpYnJhcnkKKyAgLy8vIHdpdGggdGhlIGdpdmVuIGFic29sdXRlIFt1cmldLgogICBib29sIGhhc0xpbmtlZExpYnJhcnkoU3RyaW5nIHVyaSkgewogICAgIHJldHVybiBfbGlicmFyeVVyaXMuY29udGFpbnModXJpKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBzdG9yZSBjb250YWlucyB0aGUgdW5saW5rZWQgc3VtbWFyeSBmb3IgdGhlIHVuaXQKLSAgICogd2l0aCB0aGUgZ2l2ZW4gYWJzb2x1dGUgW3VyaV0uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgc3RvcmUgY29udGFpbnMgdGhlIHVubGlua2VkIHN1bW1hcnkgZm9yIHRoZSB1bml0CisgIC8vLyB3aXRoIHRoZSBnaXZlbiBhYnNvbHV0ZSBbdXJpXS4KICAgYm9vbCBoYXNVbmxpbmtlZFVuaXQoU3RyaW5nIHVyaSkgewogICAgIHJldHVybiB1cmlUb1N1bW1hcnlQYXRoLmNvbnRhaW5zS2V5KHVyaSk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgdW5pdCB3aXRoIHRoZSBbdXJpXSBpcyBhIHBhcnQgdW5pdCBpbiB0aGUgc3RvcmUuCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgdW5pdCB3aXRoIHRoZSBbdXJpXSBpcyBhIHBhcnQgdW5pdCBpbiB0aGUgc3RvcmUuCiAgIGJvb2wgaXNQYXJ0VW5pdChTdHJpbmcgdXJpKSB7CiAgICAgcmV0dXJuIF9wYXJ0VXJpcy5jb250YWlucyh1cmkpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3N1bW1hcml6ZV9lbGVtZW50cy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9zdW1tYXJpemVfZWxlbWVudHMuZGFydAppbmRleCAyMGIwNDU2Li41MDg3NDNkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3N1bW1hcml6ZV9lbGVtZW50cy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvc3VtbWFyaXplX2VsZW1lbnRzLmRhcnQKQEAgLTQsMTYgKzQsMTIgQEAKIAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2Zvcm1hdC5kYXJ0JzsKIAotLyoqCi0gKiBPYmplY3QgdGhhdCBnYXRoZXJzIGluZm9ybWF0aW9uIHVzZXMgaXQgdG8gYXNzZW1ibGUgYSBuZXcKLSAqIFtQYWNrYWdlQnVuZGxlQnVpbGRlcl0uCi0gKi8KKy8vLyBPYmplY3QgdGhhdCBnYXRoZXJzIGluZm9ybWF0aW9uIHVzZXMgaXQgdG8gYXNzZW1ibGUgYSBuZXcKKy8vLyBbUGFja2FnZUJ1bmRsZUJ1aWxkZXJdLgogY2xhc3MgUGFja2FnZUJ1bmRsZUFzc2VtYmxlciB7CiAgIExpbmtlZE5vZGVCdW5kbGVCdWlsZGVyIF9idW5kbGUyOwogCi0gIC8qKgotICAgKiBBc3NlbWJsZSBhIG5ldyBbUGFja2FnZUJ1bmRsZUJ1aWxkZXJdIHVzaW5nIHRoZSBnYXRoZXJlZCBpbmZvcm1hdGlvbi4KLSAgICovCisgIC8vLyBBc3NlbWJsZSBhIG5ldyBbUGFja2FnZUJ1bmRsZUJ1aWxkZXJdIHVzaW5nIHRoZSBnYXRoZXJlZCBpbmZvcm1hdGlvbi4KICAgUGFja2FnZUJ1bmRsZUJ1aWxkZXIgYXNzZW1ibGUoKSB7CiAgICAgcmV0dXJuIFBhY2thZ2VCdW5kbGVCdWlsZGVyKGJ1bmRsZTI6IF9idW5kbGUyKTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9zdW1tYXJ5X2ZpbGVfYnVpbGRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9zdW1tYXJ5X2ZpbGVfYnVpbGRlci5kYXJ0CmluZGV4IDQzMWZmNTAuLjkyYjU3N2YgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvc3VtbWFyeV9maWxlX2J1aWxkZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3N1bW1hcnlfZmlsZV9idWlsZGVyLmRhcnQKQEAgLTIsMjYgKzIsMTIgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi1pbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2RrL2FsbG93ZWRfZXhwZXJpbWVudHMuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hbmFseXNpcy9mZWF0dXJlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FuYWx5c2lzL3V0aWxpdGllcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC9hc3QuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CitARGVwcmVjYXRlZCgnVXNlIHBhY2thZ2U6YW5hbHl6ZXIvZGFydC9zZGsvYnVpbGRfc2RrX3N1bW1hcnkuZGFydCBpbnN0ZWFkJykKK2xpYnJhcnkgc3VtbWFyeV9maWxlX2J1aWxkZXI7CisKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L3Nkay9idWlsZF9zZGtfc3VtbWFyeS5kYXJ0JyBhcyBhcGk7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW0uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZmlsZV9zeXN0ZW0vcGh5c2ljYWxfZmlsZV9zeXN0ZW0uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHMuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvc2Vzc2lvbi5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvYXN0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Nkay9zZGsuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkvZm9ybWF0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L3N1bW1hcml6ZV9lbGVtZW50cy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvbGluay5kYXJ0JyBhcyBzdW1tYXJ5MjsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvbGlua2VkX2VsZW1lbnRfZmFjdG9yeS5kYXJ0JyBhcyBzdW1tYXJ5MjsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvcmVmZXJlbmNlLmRhcnQnIGFzIHN1bW1hcnkyOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTp5YW1sL3lhbWwuZGFydCc7CiAKIC8vLyBCdWlsZCBzdW1tYXJ5IGZvciBTREsgdGhlIGF0IHRoZSBnaXZlbiBbc2RrUGF0aF0uCiAvLy8KQEAgLTMyLDIzNSArMTgsOSBAQAogICBAcmVxdWlyZWQgU3RyaW5nIHNka1BhdGgsCiAgIFN0cmluZyBlbWJlZGRlcllhbWxQYXRoLAogfSkgewotICB2YXIgc2RrID0gRm9sZGVyQmFzZWREYXJ0U2RrKAotICAgIHJlc291cmNlUHJvdmlkZXIsCi0gICAgcmVzb3VyY2VQcm92aWRlci5nZXRGb2xkZXIoc2RrUGF0aCksCisgIHJldHVybiBhcGkuYnVpbGRTZGtTdW1tYXJ5KAorICAgIHJlc291cmNlUHJvdmlkZXI6IHJlc291cmNlUHJvdmlkZXIsCisgICAgc2RrUGF0aDogc2RrUGF0aCwKKyAgICBlbWJlZGRlcllhbWxQYXRoOiBlbWJlZGRlcllhbWxQYXRoLAogICApOwotICBzZGsudXNlU3VtbWFyeSA9IGZhbHNlOwotICBzZGsuYW5hbHlzaXNPcHRpb25zID0gQW5hbHlzaXNPcHRpb25zSW1wbCgpOwotCi0gIC8vIEFwcGVuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZW1iZWRkZXIuCi0gIGlmIChlbWJlZGRlcllhbWxQYXRoICE9IG51bGwpIHsKLSAgICB2YXIgZmlsZSA9IHJlc291cmNlUHJvdmlkZXIuZ2V0RmlsZShlbWJlZGRlcllhbWxQYXRoKTsKLSAgICB2YXIgY29udGVudCA9IGZpbGUucmVhZEFzU3RyaW5nU3luYygpOwotICAgIHZhciBtYXAgPSBsb2FkWWFtbChjb250ZW50KSBhcyBZYW1sTWFwOwotICAgIHZhciBlbWJlZGRlclNkayA9IEVtYmVkZGVyU2RrKHJlc291cmNlUHJvdmlkZXIsIHtmaWxlLnBhcmVudDogbWFwfSk7Ci0gICAgZm9yICh2YXIgbGlicmFyeSBpbiBlbWJlZGRlclNkay5zZGtMaWJyYXJpZXMpIHsKLSAgICAgIHZhciB1cmlTdHIgPSBsaWJyYXJ5LnNob3J0TmFtZTsKLSAgICAgIGlmIChzZGsubGlicmFyeU1hcC5nZXRMaWJyYXJ5KHVyaVN0cikgPT0gbnVsbCkgewotICAgICAgICBzZGsubGlicmFyeU1hcC5zZXRMaWJyYXJ5KHVyaVN0ciwgbGlicmFyeSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdmFyIGxpYnJhcnlTb3VyY2VzID0gc2RrLnNka0xpYnJhcmllcy5tYXAoKGUpIHsKLSAgICByZXR1cm4gc2RrLm1hcERhcnRVcmkoZS5zaG9ydE5hbWUpOwotICB9KS50b0xpc3QoKTsKLQotICByZXR1cm4gX0J1aWxkZXIoCi0gICAgc2RrLmNvbnRleHQsCi0gICAgc2RrLmFsbG93ZWRFeHBlcmltZW50c0pzb24sCi0gICAgbGlicmFyeVNvdXJjZXMsCi0gICkuYnVpbGQoKTsKLX0KLQotQERlcHJlY2F0ZWQoJ1VzZSBidWlsZFNka1N1bW1hcnkoKScpCi1jbGFzcyBTdW1tYXJ5QnVpbGRlciB7Ci0gIGZpbmFsIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcjsKLSAgZmluYWwgU3RyaW5nIHNka1BhdGg7Ci0KLSAgLy8vIFRoZSBsaXN0IG9mIFNESyBzdW1tYXJpZXMsIG1pZ2h0IGFsc28gaW5jbHVkZSBGbHV0dGVyIGxpYnJhcmllcy4KLSAgLy8vIFVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBgYnVpbGRfcmVzb2x2ZXJzYC4KLSAgLy8vIFRPRE8oc2NoZWdsb3YpIENyZWF0ZSBhIGJldHRlciBBUEkgZm9yIHRoaXMsIGFuZCByZW1vdmUgaXQuCi0gIEl0ZXJhYmxlPFNvdXJjZT4gX2xpYnJhcnlTb3VyY2VzOwotCi0gIC8vLyBUaGUgZm9ybWFsIGFuYWx5c2lzIGNvbnRleHQuCi0gIC8vLyBVc2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggYGJ1aWxkX3Jlc29sdmVyc2AuCi0gIC8vLyBUT0RPKHNjaGVnbG92KSBSZW1vdmUgaXQuCi0gIEFuYWx5c2lzQ29udGV4dCBfY29udGV4dDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgc3VtbWFyeSBidWlsZGVyIGZvciB0aGVzZSBbbGlicmFyeVNvdXJjZXNdIGFuZCBbY29udGV4dF0uCi0gICAqLwotICBTdW1tYXJ5QnVpbGRlcihJdGVyYWJsZTxTb3VyY2U+IGxpYnJhcnlTb3VyY2VzLCBBbmFseXNpc0NvbnRleHQgY29udGV4dCkKLSAgICAgIDogX2xpYnJhcnlTb3VyY2VzID0gbGlicmFyeVNvdXJjZXMsCi0gICAgICAgIF9jb250ZXh0ID0gY29udGV4dCwKLSAgICAgICAgcmVzb3VyY2VQcm92aWRlciA9IFBoeXNpY2FsUmVzb3VyY2VQcm92aWRlci5JTlNUQU5DRSwKLSAgICAgICAgc2RrUGF0aCA9IG51bGw7Ci0KLSAgZmFjdG9yeSBTdW1tYXJ5QnVpbGRlci5mb3JTZGsoU3RyaW5nIHNka1BhdGgpIHsKLSAgICByZXR1cm4gU3VtbWFyeUJ1aWxkZXIuZm9yU2RrMigKLSAgICAgIHJlc291cmNlUHJvdmlkZXI6IFBoeXNpY2FsUmVzb3VyY2VQcm92aWRlci5JTlNUQU5DRSwKLSAgICAgIHNka1BhdGg6IHNka1BhdGgsCi0gICAgKTsKLSAgfQotCi0gIFN1bW1hcnlCdWlsZGVyLmZvclNkazIoewotICAgIEByZXF1aXJlZCB0aGlzLnJlc291cmNlUHJvdmlkZXIsCi0gICAgQHJlcXVpcmVkIHRoaXMuc2RrUGF0aCwKLSAgfSk7Ci0KLSAgLyoqCi0gICAqIEJ1aWxkIHRoZSBsaW5rZWQgYnVuZGxlIGFuZCByZXR1cm4gaXRzIGJ5dGVzLgotICAgKi8KLSAgTGlzdDxpbnQ+IGJ1aWxkKHtAZGVwcmVjYXRlZCBGZWF0dXJlU2V0IGZlYXR1cmVTZXR9KSB7Ci0gICAgaWYgKF9saWJyYXJ5U291cmNlcyAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gX2J1aWxkKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkU2RrU3VtbWFyeSgKLSAgICAgIHJlc291cmNlUHJvdmlkZXI6IHJlc291cmNlUHJvdmlkZXIsCi0gICAgICBzZGtQYXRoOiBzZGtQYXRoLAotICAgICk7Ci0gIH0KLQotICAvLy8gVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgcHJvdmlkZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IKLSAgLy8vIGBidWlsZF9yZXNvbHZlcnNgLgotICBMaXN0PGludD4gX2J1aWxkKCkgewotICAgIHZhciBkYXJ0Q29yZVBhdGggPSBfbGlicmFyeVNvdXJjZXMKLSAgICAgICAgLnNpbmdsZVdoZXJlKChlbGVtZW50KSA9PiAnJHtlbGVtZW50LnVyaX0nID09ICdkYXJ0OmNvcmUnKQotICAgICAgICAuZnVsbE5hbWU7Ci0gICAgdmFyIHNka0xpYiA9IHJlc291cmNlUHJvdmlkZXIuZ2V0RmlsZShkYXJ0Q29yZVBhdGgpLnBhcmVudC5wYXJlbnQ7Ci0KLSAgICBTdHJpbmcgYWxsb3dlZEV4cGVyaW1lbnRzSnNvbjsKLSAgICB0cnkgewotICAgICAgYWxsb3dlZEV4cGVyaW1lbnRzSnNvbiA9IHNka0xpYgotICAgICAgICAgIC5nZXRDaGlsZEFzc3VtaW5nRm9sZGVyKCdfaW50ZXJuYWwnKQotICAgICAgICAgIC5nZXRDaGlsZEFzc3VtaW5nRmlsZSgnYWxsb3dlZF9leHBlcmltZW50cy5qc29uJykKLSAgICAgICAgICAucmVhZEFzU3RyaW5nU3luYygpOwotICAgIH0gY2F0Y2ggKF8pIHt9Ci0KLSAgICByZXR1cm4gX0J1aWxkZXIoCi0gICAgICBfY29udGV4dCwKLSAgICAgIGFsbG93ZWRFeHBlcmltZW50c0pzb24sCi0gICAgICBfbGlicmFyeVNvdXJjZXMsCi0gICAgKS5idWlsZCgpOwotICB9Ci19Ci0KLWNsYXNzIF9CdWlsZGVyIHsKLSAgZmluYWwgQW5hbHlzaXNDb250ZXh0IGNvbnRleHQ7Ci0gIGZpbmFsIFN0cmluZyBhbGxvd2VkRXhwZXJpbWVudHNKc29uOwotICBmaW5hbCBJdGVyYWJsZTxTb3VyY2U+IGxpYnJhcnlTb3VyY2VzOwotCi0gIGZpbmFsIFNldDxTdHJpbmc+IGxpYnJhcnlVcmlzID0gPFN0cmluZz57fTsKLSAgZmluYWwgTGlzdDxzdW1tYXJ5Mi5MaW5rSW5wdXRMaWJyYXJ5PiBpbnB1dExpYnJhcmllcyA9IFtdOwotCi0gIEFsbG93ZWRFeHBlcmltZW50cyBhbGxvd2VkRXhwZXJpbWVudHM7Ci0gIGZpbmFsIFBhY2thZ2VCdW5kbGVBc3NlbWJsZXIgYnVuZGxlQXNzZW1ibGVyID0gUGFja2FnZUJ1bmRsZUFzc2VtYmxlcigpOwotCi0gIF9CdWlsZGVyKAotICAgIHRoaXMuY29udGV4dCwKLSAgICB0aGlzLmFsbG93ZWRFeHBlcmltZW50c0pzb24sCi0gICAgdGhpcy5saWJyYXJ5U291cmNlcywKLSAgKSB7Ci0gICAgYWxsb3dlZEV4cGVyaW1lbnRzID0gX3BhcnNlQWxsb3dlZEV4cGVyaW1lbnRzKGFsbG93ZWRFeHBlcmltZW50c0pzb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIEJ1aWxkIHRoZSBsaW5rZWQgYnVuZGxlIGFuZCByZXR1cm4gaXRzIGJ5dGVzLgotICAgKi8KLSAgTGlzdDxpbnQ+IGJ1aWxkKCkgewotICAgIGxpYnJhcnlTb3VyY2VzLmZvckVhY2goX2FkZExpYnJhcnkpOwotCi0gICAgdmFyIGVsZW1lbnRGYWN0b3J5ID0gc3VtbWFyeTIuTGlua2VkRWxlbWVudEZhY3RvcnkoCi0gICAgICBjb250ZXh0LAotICAgICAgQW5hbHlzaXNTZXNzaW9uSW1wbChudWxsKSwKLSAgICAgIHN1bW1hcnkyLlJlZmVyZW5jZS5yb290KCksCi0gICAgKTsKLQotICAgIHZhciBsaW5rUmVzdWx0ID0gc3VtbWFyeTIubGluayhlbGVtZW50RmFjdG9yeSwgaW5wdXRMaWJyYXJpZXMpOwotICAgIGJ1bmRsZUFzc2VtYmxlci5zZXRCdW5kbGUyKGxpbmtSZXN1bHQuYnVuZGxlKTsKLQotICAgIHJldHVybiBQYWNrYWdlQnVuZGxlQnVpbGRlcigKLSAgICAgIGJ1bmRsZTI6IGxpbmtSZXN1bHQuYnVuZGxlLAotICAgICAgc2RrOiBQYWNrYWdlQnVuZGxlU2RrQnVpbGRlcigKLSAgICAgICAgYWxsb3dlZEV4cGVyaW1lbnRzSnNvbjogYWxsb3dlZEV4cGVyaW1lbnRzSnNvbiwKLSAgICAgICksCi0gICAgKS50b0J1ZmZlcigpOwotICB9Ci0KLSAgdm9pZCBfYWRkTGlicmFyeShTb3VyY2Ugc291cmNlKSB7Ci0gICAgU3RyaW5nIHVyaVN0ciA9IHNvdXJjZS51cmkudG9TdHJpbmcoKTsKLSAgICBpZiAoIWxpYnJhcnlVcmlzLmFkZCh1cmlTdHIpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFyIGlucHV0VW5pdHMgPSA8c3VtbWFyeTIuTGlua0lucHV0VW5pdD5bXTsKLQotICAgIENvbXBpbGF0aW9uVW5pdCBkZWZpbmluZ1VuaXQgPSBfcGFyc2Uoc291cmNlKTsKLSAgICBpbnB1dFVuaXRzLmFkZCgKLSAgICAgIHN1bW1hcnkyLkxpbmtJbnB1dFVuaXQobnVsbCwgc291cmNlLCBmYWxzZSwgZGVmaW5pbmdVbml0KSwKLSAgICApOwotCi0gICAgZm9yIChEaXJlY3RpdmUgZGlyZWN0aXZlIGluIGRlZmluaW5nVW5pdC5kaXJlY3RpdmVzKSB7Ci0gICAgICBpZiAoZGlyZWN0aXZlIGlzIE5hbWVzcGFjZURpcmVjdGl2ZSkgewotICAgICAgICBTdHJpbmcgbGliVXJpID0gZGlyZWN0aXZlLnVyaS5zdHJpbmdWYWx1ZTsKLSAgICAgICAgU291cmNlIGxpYlNvdXJjZSA9IGNvbnRleHQuc291cmNlRmFjdG9yeS5yZXNvbHZlVXJpKHNvdXJjZSwgbGliVXJpKTsKLSAgICAgICAgX2FkZExpYnJhcnkobGliU291cmNlKTsKLSAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlIGlzIFBhcnREaXJlY3RpdmUpIHsKLSAgICAgICAgU3RyaW5nIHBhcnRVcmkgPSBkaXJlY3RpdmUudXJpLnN0cmluZ1ZhbHVlOwotICAgICAgICBTb3VyY2UgcGFydFNvdXJjZSA9IGNvbnRleHQuc291cmNlRmFjdG9yeS5yZXNvbHZlVXJpKHNvdXJjZSwgcGFydFVyaSk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBwYXJ0VW5pdCA9IF9wYXJzZShwYXJ0U291cmNlKTsKLSAgICAgICAgaW5wdXRVbml0cy5hZGQoCi0gICAgICAgICAgc3VtbWFyeTIuTGlua0lucHV0VW5pdChwYXJ0VXJpLCBwYXJ0U291cmNlLCBmYWxzZSwgcGFydFVuaXQpLAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlucHV0TGlicmFyaWVzLmFkZCgKLSAgICAgIHN1bW1hcnkyLkxpbmtJbnB1dExpYnJhcnkoc291cmNlLCBpbnB1dFVuaXRzKSwKLSAgICApOwotICB9Ci0KLSAgLy8vIFJldHVybiB0aGUgW0ZlYXR1cmVTZXRdIGZvciB0aGUgZ2l2ZW4gW3VyaV0sIG11c3QgYmUgYSBgZGFydDpgIFVSSS4KLSAgRmVhdHVyZVNldCBfZmVhdHVyZVNldChVcmkgdXJpKSB7Ci0gICAgaWYgKHVyaS5pc1NjaGVtZSgnZGFydCcpKSB7Ci0gICAgICB2YXIgcGF0aFNlZ21lbnRzID0gdXJpLnBhdGhTZWdtZW50czsKLSAgICAgIGlmIChwYXRoU2VnbWVudHMuaXNOb3RFbXB0eSkgewotICAgICAgICB2YXIgbGlicmFyeU5hbWUgPSBwYXRoU2VnbWVudHMuZmlyc3Q7Ci0gICAgICAgIHZhciBleHBlcmltZW50cyA9IGFsbG93ZWRFeHBlcmltZW50cy5mb3JTZGtMaWJyYXJ5KGxpYnJhcnlOYW1lKTsKLSAgICAgICAgcmV0dXJuIEZlYXR1cmVTZXQuZnJvbUVuYWJsZUZsYWdzKGV4cGVyaW1lbnRzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgU3RhdGVFcnJvcignRXhwZWN0ZWQgYSB2YWxpZCBkYXJ0OiBVUkk6ICR1cmknKTsKLSAgfQotCi0gIENvbXBpbGF0aW9uVW5pdCBfcGFyc2UoU291cmNlIHNvdXJjZSkgewotICAgIHZhciByZXN1bHQgPSBwYXJzZVN0cmluZygKLSAgICAgIGNvbnRlbnQ6IHNvdXJjZS5jb250ZW50cy5kYXRhLAotICAgICAgZmVhdHVyZVNldDogX2ZlYXR1cmVTZXQoc291cmNlLnVyaSksCi0gICAgICB0aHJvd0lmRGlhZ25vc3RpY3M6IGZhbHNlLAotICAgICk7Ci0KLSAgICBpZiAocmVzdWx0LmVycm9ycy5pc05vdEVtcHR5KSB7Ci0gICAgICB2YXIgZXJyb3JzU3RyID0gcmVzdWx0LmVycm9ycy5tYXAoKGUpIHsKLSAgICAgICAgdmFyIGxvY2F0aW9uID0gcmVzdWx0LmxpbmVJbmZvLmdldExvY2F0aW9uKGUub2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuICcke3NvdXJjZS5mdWxsTmFtZX06JGxvY2F0aW9uIC0gJHtlLm1lc3NhZ2V9JzsKLSAgICAgIH0pLmpvaW4oJ1xuJyk7Ci0gICAgICB0aHJvdyBTdGF0ZUVycm9yKAotICAgICAgICAnVW5leHBlY3RlZCBkaWFnbm9zdGljczpcbiRlcnJvcnNTdHInLAotICAgICAgKTsKLSAgICB9Ci0KLSAgICB2YXIgdW5pdCA9IHJlc3VsdC51bml0IGFzIENvbXBpbGF0aW9uVW5pdEltcGw7Ci0gICAgdW5pdC5sYW5ndWFnZVZlcnNpb24gPSBMaWJyYXJ5TGFuZ3VhZ2VWZXJzaW9uKAotICAgICAgcGFja2FnZTogRXhwZXJpbWVudFN0YXR1cy5jdXJyZW50VmVyc2lvbiwKLSAgICAgIG92ZXJyaWRlOiBudWxsLAotICAgICk7Ci0KLSAgICByZXR1cm4gcmVzdWx0LnVuaXQ7Ci0gIH0KLQotICBzdGF0aWMgQWxsb3dlZEV4cGVyaW1lbnRzIF9wYXJzZUFsbG93ZWRFeHBlcmltZW50cyhTdHJpbmcgY29udGVudCkgewotICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgIHJldHVybiBBbGxvd2VkRXhwZXJpbWVudHMoCi0gICAgICAgIHNka0RlZmF1bHRFeHBlcmltZW50czogW10sCi0gICAgICAgIHNka0xpYnJhcnlFeHBlcmltZW50czoge30sCi0gICAgICAgIHBhY2thZ2VFeHBlcmltZW50czoge30sCi0gICAgICApOwotICAgIH0KLQotICAgIHJldHVybiBwYXJzZUFsbG93ZWRFeHBlcmltZW50cyhjb250ZW50KTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9zdW1tYXJ5X3Nkay5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeS9zdW1tYXJ5X3Nkay5kYXJ0CmluZGV4IDE1NzQzZDUuLjMzMTVhODggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkvc3VtbWFyeV9zZGsuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5L3N1bW1hcnlfc2RrLmRhcnQKQEAgLTExLDIxICsxMSwxNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2lkbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9wYWNrYWdlX2J1bmRsZV9yZWFkZXIuZGFydCc7CiAKLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgW0RhcnRTZGtdIHdoaWNoIHByb3ZpZGVzIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGBkYXJ0OmAKLSAqIGxpYnJhcmllcyBmcm9tIHRoZSBnaXZlbiBzdW1tYXJ5IGZpbGUuICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGxpbWl0ZWQgYW5kCi0gKiBzdWl0YWJsZSBvbmx5IGZvciBjb21tYW5kLWxpbmUgdG9vbHMsIGJ1dCBub3QgZm9yIElERXMgLSBpdCBkb2VzIG5vdAotICogaW1wbGVtZW50IFtzZGtMaWJyYXJpZXNdLCBbc2RrVmVyc2lvbl0sIFt1cmlzXSBhbmQgW2Zyb21GaWxlVXJpXS4KLSAqLworLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFtEYXJ0U2RrXSB3aGljaCBwcm92aWRlcyBhbmFseXNpcyByZXN1bHRzIGZvciBgZGFydDpgCisvLy8gbGlicmFyaWVzIGZyb20gdGhlIGdpdmVuIHN1bW1hcnkgZmlsZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbGltaXRlZCBhbmQKKy8vLyBzdWl0YWJsZSBvbmx5IGZvciBjb21tYW5kLWxpbmUgdG9vbHMsIGJ1dCBub3QgZm9yIElERXMgLSBpdCBkb2VzIG5vdAorLy8vIGltcGxlbWVudCBbc2RrTGlicmFyaWVzXSwgW3Nka1ZlcnNpb25dLCBbdXJpc10gYW5kIFtmcm9tRmlsZVVyaV0uCiBjbGFzcyBTdW1tYXJ5QmFzZWREYXJ0U2RrIGltcGxlbWVudHMgRGFydFNkayB7CiAgIFN1bW1hcnlEYXRhU3RvcmUgX2RhdGFTdG9yZTsKICAgSW5TdW1tYXJ5VXJpUmVzb2x2ZXIgX3VyaVJlc29sdmVyOwogICBQYWNrYWdlQnVuZGxlIF9idW5kbGU7CiAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcjsKIAotICAvKioKLSAgICogVGhlIFtBbmFseXNpc0NvbnRleHRdIHdoaWNoIGlzIHVzZWQgZm9yIGFsbCBvZiB0aGUgc291cmNlcyBpbiB0aGlzIHNkay4KLSAgICovCisgIC8vLyBUaGUgW0FuYWx5c2lzQ29udGV4dF0gd2hpY2ggaXMgdXNlZCBmb3IgYWxsIG9mIHRoZSBzb3VyY2VzIGluIHRoaXMgc2RrLgogICBTZGtBbmFseXNpc0NvbnRleHQgX2FuYWx5c2lzQ29udGV4dDsKIAogICBTdW1tYXJ5QmFzZWREYXJ0U2RrKFN0cmluZyBzdW1tYXJ5UGF0aCwgYm9vbCBfLCB7dGhpcy5yZXNvdXJjZVByb3ZpZGVyfSkgewpAQCAtNDgsOSArNDQsNyBAQAogICAgIHJldHVybiBfYnVuZGxlLnNkaz8uYWxsb3dlZEV4cGVyaW1lbnRzSnNvbjsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIFtQYWNrYWdlQnVuZGxlXSBmb3IgdGhpcyBTREssIG5vdCBgbnVsbGAuCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBbUGFja2FnZUJ1bmRsZV0gZm9yIHRoaXMgU0RLLCBub3QgYG51bGxgLgogICBQYWNrYWdlQnVuZGxlIGdldCBidW5kbGUgPT4gX2J1bmRsZTsKIAogICBAb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL2FzdF9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvYXN0X3Jlc29sdmVyLmRhcnQKaW5kZXggNDg4M2FmOS4uMDZiMGY0MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvYXN0X3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvYXN0X3Jlc29sdmVyLmRhcnQKQEAgLTcsNiArNyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZXJyb3IvbGlzdGVuZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZmxvd19hbmFseXNpc192aXNpdG9yLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Jlc29sdXRpb25fdmlzaXRvci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5rLmRhcnQnOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9hc3RfdGV4dF9wcmludGVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9hc3RfdGV4dF9wcmludGVyLmRhcnQKaW5kZXggZmQ3YjExMS4uMGNkOGZhNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvYXN0X3RleHRfcHJpbnRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL2FzdF90ZXh0X3ByaW50ZXIuZGFydApAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKICAgICBfdG9rZW4obWF5YmUpOwogICB9CiAKLSAgX3R5cGVkTGl0ZXJhbChUeXBlZExpdGVyYWwgbm9kZSkgeworICB2b2lkIF90eXBlZExpdGVyYWwoVHlwZWRMaXRlcmFsIG5vZGUpIHsKICAgICBfdG9rZW4obm9kZS5jb25zdEtleXdvcmQpOwogICAgIG5vZGUudHlwZUFyZ3VtZW50cz8uYWNjZXB0KHRoaXMpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9jb25zdHJ1Y3Rvcl9pbml0aWFsaXplcl9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvY29uc3RydWN0b3JfaW5pdGlhbGl6ZXJfcmVzb2x2ZXIuZGFydAppbmRleCAyZjdkNjJlLi43YTg1OGE4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9jb25zdHJ1Y3Rvcl9pbml0aWFsaXplcl9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL2NvbnN0cnVjdG9yX2luaXRpYWxpemVyX3Jlc29sdmVyLmRhcnQKQEAgLTYsNyArNiw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYXN0L2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvYXN0X3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5rLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5raW5nX25vZGVfc2NvcGUuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9kZWZhdWx0X3ZhbHVlX3Jlc29sdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9kZWZhdWx0X3ZhbHVlX3Jlc29sdmVyLmRhcnQKaW5kZXggM2E2OGY5ZS4uZjNjZWU5MSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvZGVmYXVsdF92YWx1ZV9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL2RlZmF1bHRfdmFsdWVfcmVzb2x2ZXIuZGFydApAQCAtNSwxMCArNSw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcKLSAgICBzaG93IEluZmVyZW5jZUNvbnRleHQsIFNjb3BlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IEluZmVyZW5jZUNvbnRleHQ7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2FzdF9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvbGluay5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvbGlua2luZ19ub2RlX3Njb3BlLmRhcnQnOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvbGlua2luZ19idW5kbGVfY29udGV4dC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvbGlua2luZ19idW5kbGVfY29udGV4dC5kYXJ0CmluZGV4IGNjMjdlNDQuLmYyZmE5NGQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL2xpbmtpbmdfYnVuZGxlX2NvbnRleHQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9saW5raW5nX2J1bmRsZV9jb250ZXh0LmRhcnQKQEAgLTcsNyArNyw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9mb3JtYXQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkvaWRsLmRhcnQnOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvbGlua2luZ19ub2RlX3Njb3BlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9saW5raW5nX25vZGVfc2NvcGUuZGFydAppbmRleCA3NjE3MTI1Li44YzhlNmU5IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9saW5raW5nX25vZGVfc2NvcGUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9saW5raW5nX25vZGVfc2NvcGUuZGFydApAQCAtMyw3ICszLDcgQEAKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FzdC9hc3QuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIAogLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIFtTY29wZV1zIGNvcnJlc3BvbmRpbmcgdG8gW0FzdE5vZGVdcy4KIGNsYXNzIExpbmtpbmdOb2RlQ29udGV4dCB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9tZXRhZGF0YV9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvbWV0YWRhdGFfcmVzb2x2ZXIuZGFydAppbmRleCA3ZjNhMDRiLi4yMTlhMWU2IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9tZXRhZGF0YV9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL21ldGFkYXRhX3Jlc29sdmVyLmRhcnQKQEAgLTYsNyArNiw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvdmlzaXRvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvYXN0X3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5rLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9saW5raW5nX25vZGVfc2NvcGUuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi9uYW1lZF90eXBlX2J1aWxkZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0CmluZGV4IDY1NGRhMGEuLjBlZGVhNzIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL25hbWVkX3R5cGVfYnVpbGRlci5kYXJ0CkBAIC05LDcgKzksNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2FsZ2VicmEuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9sYXp5X2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvdHlwZV9idWlsZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL3JlZmVyZW5jZV9yZXNvbHZlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvcmVmZXJlbmNlX3Jlc29sdmVyLmRhcnQKaW5kZXggMDdmNGZjOS4uM2U5M2M3MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvcmVmZXJlbmNlX3Jlc29sdmVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvcmVmZXJlbmNlX3Jlc29sdmVyLmRhcnQKQEAgLTEwLDggKzEwLDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hc3QvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci9zY29wZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2lkbC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvZnVuY3Rpb25fdHlwZV9idWlsZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5Mi9sYXp5X2FzdC5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL3RvcF9sZXZlbF9pbmZlcmVuY2UuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL3RvcF9sZXZlbF9pbmZlcmVuY2UuZGFydAppbmRleCA1YmJjY2U5Li4yMGFiNGEzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi90b3BfbGV2ZWxfaW5mZXJlbmNlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvdG9wX2xldmVsX2luZmVyZW5jZS5kYXJ0CkBAIC05LDYgKzksNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX2RlbW90aW9uLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbGVtZW50X3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JzsKQEAgLTIxOCw3ICsyMTksNyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKKyAgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CiB9CiAKIGNsYXNzIF9JbmZlcmVuY2VEZXBlbmRlbmNpZXNDb2xsZWN0b3IgZXh0ZW5kcyBSZWN1cnNpdmVBc3RWaXNpdG9yPHZvaWQ+IHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL3R5cGVfYnVpbGRlci5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvdHlwZV9idWlsZGVyLmRhcnQKaW5kZXggMDA1MDI0Ny4uYjlhMGI5MyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvdHlwZV9idWlsZGVyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvdHlwZV9idWlsZGVyLmRhcnQKQEAgLTE0LDcgKzE0LDUgQEAKICAgRGFydFR5cGUgYnVpbGQoKTsKIAogICBAb3ZlcnJpZGUKLSAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgewotICAgIHJldHVybiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Ci0gIH0KKyAgZHluYW1pYyBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi90eXBlc19idWlsZGVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zdW1tYXJ5Mi90eXBlc19idWlsZGVyLmRhcnQKaW5kZXggMTZhZjk1Yy4uNTE3Zjk3NiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc3VtbWFyeTIvdHlwZXNfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3N1bW1hcnkyL3R5cGVzX2J1aWxkZXIuZGFydApAQCAtMTAsNyArMTAsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3Nlc3Npb24uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2RlZmF1bHRfdHlwZXNfYnVpbGRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeTIvbGF6eV9hc3QuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL3R5cGVfYnVpbGRlci5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svYXBpL21vZGVsLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL2FwaS9tb2RlbC5kYXJ0CmluZGV4IGRhMGQzZGIuLmQzZDFmYWMgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svYXBpL21vZGVsLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdGFzay9hcGkvbW9kZWwuZGFydApAQCAtNCwyMyArNCwxNyBAQAogCiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiAKLS8qKgotICogQW4gb2JqZWN0IHdpdGggd2hpY2ggYW4gYW5hbHlzaXMgcmVzdWx0IGNhbiBiZSBhc3NvY2lhdGVkLgotICoKLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGNsYXNzIHdoZW4gY3JlYXRpbmcgbmV3IGtpbmRzIG9mIHRhcmdldHMuCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIGFyZSB1c2VkIGluIGhhc2hlZCBkYXRhIHN0cnVjdHVyZXMsIHNvIHN1YnR5cGVzIGFyZQotICogcmVxdWlyZWQgdG8gY29ycmVjdGx5IGltcGxlbWVudCBbPT1dIGFuZCBbaGFzaENvZGVdLgotICovCisvLy8gQW4gb2JqZWN0IHdpdGggd2hpY2ggYW4gYW5hbHlzaXMgcmVzdWx0IGNhbiBiZSBhc3NvY2lhdGVkLgorLy8vCisvLy8gQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgY2xhc3Mgd2hlbiBjcmVhdGluZyBuZXcga2luZHMgb2YgdGFyZ2V0cy4KKy8vLyBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIGFyZSB1c2VkIGluIGhhc2hlZCBkYXRhIHN0cnVjdHVyZXMsIHNvIHN1YnR5cGVzIGFyZQorLy8vIHJlcXVpcmVkIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgWz09XSBhbmQgW2hhc2hDb2RlXS4KIGFic3RyYWN0IGNsYXNzIEFuYWx5c2lzVGFyZ2V0IHsKLSAgLyoqCi0gICAqIElmIHRoaXMgdGFyZ2V0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIGxpYnJhcnksIHJldHVybiB0aGUgc291cmNlIG9mIHRoZQotICAgKiBsaWJyYXJ5J3MgZGVmaW5pbmcgY29tcGlsYXRpb24gdW5pdDsgb3RoZXJ3aXNlIHJldHVybiBgbnVsbGAuCi0gICAqLworICAvLy8gSWYgdGhpcyB0YXJnZXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbGlicmFyeSwgcmV0dXJuIHRoZSBzb3VyY2Ugb2YgdGhlCisgIC8vLyBsaWJyYXJ5J3MgZGVmaW5pbmcgY29tcGlsYXRpb24gdW5pdDsgb3RoZXJ3aXNlIHJldHVybiBgbnVsbGAuCiAgIFNvdXJjZSBnZXQgbGlicmFyeVNvdXJjZTsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFyZ2V0LCBvciBgbnVsbGAgaWYgdGhpcyB0YXJnZXQgaXMKLSAgICogbm90IGFzc29jaWF0ZWQgd2l0aCBhIHNvdXJjZS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXJnZXQsIG9yIGBudWxsYCBpZiB0aGlzIHRhcmdldCBpcworICAvLy8gbm90IGFzc29jaWF0ZWQgd2l0aCBhIHNvdXJjZS4KICAgU291cmNlIGdldCBzb3VyY2U7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL29wdGlvbnMuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svb3B0aW9ucy5kYXJ0CmluZGV4IGRkYWYxOGEuLjk2ZDYzM2ZiIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL29wdGlvbnMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL29wdGlvbnMuZGFydApAQCAtNTc3LDkgKzU3Nyw4IEBACiB9CiAKIGNsYXNzIF9PcHRpb25zUHJvY2Vzc29yIHsKLSAgLyoqCi0gICAqIEFwcGx5IHRoZSBvcHRpb25zIGluIHRoZSBnaXZlbiBbb3B0aW9uTWFwXSB0byB0aGUgZ2l2ZW4gYW5hbHlzaXMgW29wdGlvbnNdLgotICAgKi8KKyAgLy8vIEFwcGx5IHRoZSBvcHRpb25zIGluIHRoZSBnaXZlbiBbb3B0aW9uTWFwXSB0byB0aGUgZ2l2ZW4gYW5hbHlzaXMKKyAgLy8vIFtvcHRpb25zXS4KICAgdm9pZCBhcHBseVRvQW5hbHlzaXNPcHRpb25zKEFuYWx5c2lzT3B0aW9uc0ltcGwgb3B0aW9ucywgWWFtbE1hcCBvcHRpb25NYXApIHsKICAgICBpZiAob3B0aW9uTWFwID09IG51bGwpIHsKICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svc3Ryb25nL2NoZWNrZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svc3Ryb25nL2NoZWNrZXIuZGFydAppbmRleCBjMDg3YjhlLi4wZDFkNWIzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL3N0cm9uZy9jaGVja2VyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdGFzay9zdHJvbmcvY2hlY2tlci5kYXJ0CkBAIC0xNiw4ICsxNiw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvaW5oZXJpdGFuY2VfbWFuYWdlcjMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnIHNob3cgU3Ryb25nTW9kZUNvZGU7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9pZGwuZGFydCc7CiAKIC8vLyBHaXZlbiBhbiBbZXhwcmVzc2lvbl0gYW5kIGEgY29ycmVzcG9uZGluZyBbdHlwZVN5c3RlbV0gYW5kIFt0eXBlUHJvdmlkZXJdLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdGFzay9zdHJvbmdfbW9kZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdGFzay9zdHJvbmdfbW9kZS5kYXJ0CmluZGV4IDE2ZTA4MTAuLmQ0ZjliYzkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3Rhc2svc3Ryb25nX21vZGUuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy90YXNrL3N0cm9uZ19tb2RlLmRhcnQKQEAgLTExLDE1ICsxMSwxMyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfZGVtb3Rpb24uZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L2Zvcm1hdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9pZGwuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkyL2xhenlfYXN0LmRhcnQnOwogCi0vKioKLSAqIEFuIG9iamVjdCB1c2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIGluc3RhbmNlIGZpZWxkcyBhbmQgdGhlIHJldHVybiB0eXBlcyBvZgotICogaW5zdGFuY2UgbWV0aG9kcyB3aXRoaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4KLSAqLworLy8vIEFuIG9iamVjdCB1c2VkIHRvIGluZmVyIHRoZSB0eXBlIG9mIGluc3RhbmNlIGZpZWxkcyBhbmQgdGhlIHJldHVybiB0eXBlcyBvZgorLy8vIGluc3RhbmNlIG1ldGhvZHMgd2l0aGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuCiBjbGFzcyBJbnN0YW5jZU1lbWJlckluZmVycmVyIHsKICAgZmluYWwgSW5oZXJpdGFuY2VNYW5hZ2VyMyBpbmhlcml0YW5jZTsKICAgZmluYWwgU2V0PENsYXNzRWxlbWVudD4gZWxlbWVudHNCZWluZ0luZmVycmVkID0gSGFzaFNldDxDbGFzc0VsZW1lbnQ+KCk7CkBAIC0yOCwxNyArMjYsMTMgQEAKICAgYm9vbCBpc05vbk51bGxhYmxlQnlEZWZhdWx0OwogICBDbGFzc0VsZW1lbnQgY3VycmVudENsYXNzRWxlbWVudDsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZSBpbmZlcnJlci4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlIGluZmVycmVyLgogICBJbnN0YW5jZU1lbWJlckluZmVycmVyKHRoaXMuaW5oZXJpdGFuY2UpOwogCiAgIERhcnRUeXBlIGdldCBfZHluYW1pY1R5cGUgPT4gRHluYW1pY1R5cGVJbXBsLmluc3RhbmNlOwogCi0gIC8qKgotICAgKiBJbmZlciB0eXBlIGluZm9ybWF0aW9uIGZvciBhbGwgb2YgdGhlIGluc3RhbmNlIG1lbWJlcnMgaW4gdGhlIGdpdmVuCi0gICAqIGNvbXBpbGF0aW9uIFt1bml0XS4KLSAgICovCisgIC8vLyBJbmZlciB0eXBlIGluZm9ybWF0aW9uIGZvciBhbGwgb2YgdGhlIGluc3RhbmNlIG1lbWJlcnMgaW4gdGhlIGdpdmVuCisgIC8vLyBjb21waWxhdGlvbiBbdW5pdF0uCiAgIHZvaWQgaW5mZXJDb21waWxhdGlvblVuaXQoQ29tcGlsYXRpb25Vbml0RWxlbWVudCB1bml0KSB7CiAgICAgdHlwZVN5c3RlbSA9IHVuaXQubGlicmFyeS50eXBlU3lzdGVtOwogICAgIGlzTm9uTnVsbGFibGVCeURlZmF1bHQgPSB0eXBlU3lzdGVtLmlzTm9uTnVsbGFibGVCeURlZmF1bHQ7CkBAIC00NiwxMCArNDAsOCBAQAogICAgIF9pbmZlckNsYXNzZXModW5pdC50eXBlcyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgW2VsZW1lbnRzXSBoYXZlIHRoZSBzYW1lCi0gICAqIGtpbmQgYXMgdGhlIFtlbGVtZW50XS4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBbZWxlbWVudHNdIGhhdmUgdGhlCisgIC8vLyBzYW1lIGtpbmQgYXMgdGhlIFtlbGVtZW50XS4KICAgYm9vbCBfYWxsU2FtZUVsZW1lbnRLaW5kKAogICAgICAgRXhlY3V0YWJsZUVsZW1lbnQgZWxlbWVudCwgTGlzdDxFeGVjdXRhYmxlRWxlbWVudD4gZWxlbWVudHMpIHsKICAgICB2YXIgZWxlbWVudEtpbmQgPSBlbGVtZW50LmtpbmQ7CkBAIC02MSwxMiArNTMsOSBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIGEgbWV0aG9kLCByZXR1cm4gdGhlIHBhcmFtZXRlciBpbiB0aGUgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAqIGdpdmVuIFtwYXJhbWV0ZXJdLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHBvc2l0aW9uYWwsIHRoZW4KLSAgICogaXQgYXBwZWFycyBhdCB0aGUgZ2l2ZW4gW2luZGV4XSBpbiBpdHMgZW5jbG9zaW5nIGVsZW1lbnQncyBsaXN0IG9mCi0gICAqIHBhcmFtZXRlcnMuCi0gICAqLworICAvLy8gR2l2ZW4gYSBtZXRob2QsIHJldHVybiB0aGUgcGFyYW1ldGVyIGluIHRoZSBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgLy8vIGdpdmVuIFtwYXJhbWV0ZXJdLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHBvc2l0aW9uYWwsIHRoZW4gaXQgYXBwZWFycyBhdCB0aGUKKyAgLy8vIGdpdmVuIFtpbmRleF0gaW4gaXRzIGVuY2xvc2luZyBlbGVtZW50J3MgbGlzdCBvZiBwYXJhbWV0ZXJzLgogICBQYXJhbWV0ZXJFbGVtZW50IF9nZXRDb3JyZXNwb25kaW5nUGFyYW1ldGVyKFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyLAogICAgICAgaW50IGluZGV4LCBMaXN0PFBhcmFtZXRlckVsZW1lbnQ+IG1ldGhvZFBhcmFtZXRlcnMpIHsKICAgICAvLwpAQCAtOTUsMTMgKzg0LDExIEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICAvKioKLSAgICogSWYgdGhlIGdpdmVuIFthY2Nlc3Nvcl0gcmVwcmVzZW50cyBhIG5vbi1zeW50aGV0aWMgaW5zdGFuY2UgcHJvcGVydHkKLSAgICogYWNjZXNzb3IgZm9yIHdoaWNoIG5vIHR5cGUgd2FzIHByb3ZpZGVkLCBpbmZlciBpdHMgdHlwZXMuCi0gICAqCi0gICAqIElmIHRoZSBnaXZlbiBbZmllbGRdIHJlcHJlc2VudHMgYSBub24tc3ludGhldGljIGluc3RhbmNlIGZpZWxkIGZvcgotICAgKiB3aGljaCBubyB0eXBlIHdhcyBwcm92aWRlZCwgaW5mZXIgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgotICAgKi8KKyAgLy8vIElmIHRoZSBnaXZlbiBbYWNjZXNzb3JdIHJlcHJlc2VudHMgYSBub24tc3ludGhldGljIGluc3RhbmNlIHByb3BlcnR5CisgIC8vLyBhY2Nlc3NvciBmb3Igd2hpY2ggbm8gdHlwZSB3YXMgcHJvdmlkZWQsIGluZmVyIGl0cyB0eXBlcy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZ2l2ZW4gW2ZpZWxkXSByZXByZXNlbnRzIGEgbm9uLXN5bnRoZXRpYyBpbnN0YW5jZSBmaWVsZCBmb3IKKyAgLy8vIHdoaWNoIG5vIHR5cGUgd2FzIHByb3ZpZGVkLCBpbmZlciB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCiAgIHZvaWQgX2luZmVyQWNjZXNzb3JPckZpZWxkKHsKICAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudEltcGwgYWNjZXNzb3IsCiAgICAgRmllbGRFbGVtZW50SW1wbCBmaWVsZCwKQEAgLTMxOSwxMCArMzA2LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogSW5mZXIgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYWxsIG9mIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGluIHRoZSBnaXZlbgotICAgKiBbY2xhc3NFbGVtZW50XS4KLSAgICovCisgIC8vLyBJbmZlciB0eXBlIGluZm9ybWF0aW9uIGZvciBhbGwgb2YgdGhlIGluc3RhbmNlIG1lbWJlcnMgaW4gdGhlIGdpdmVuCisgIC8vLyBbY2xhc3NFbGVtZW50XS4KICAgdm9pZCBfaW5mZXJDbGFzcyhDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50KSB7CiAgICAgaWYgKGNsYXNzRWxlbWVudCBpcyBDbGFzc0VsZW1lbnRJbXBsKSB7CiAgICAgICBpZiAoY2xhc3NFbGVtZW50Lmhhc0JlZW5JbmZlcnJlZCkgewpAQCAtMzkzLDExICszNzgsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBJZiB0aGUgZ2l2ZW4gW2VsZW1lbnRdIHJlcHJlc2VudHMgYSBub24tc3ludGhldGljIGluc3RhbmNlIG1ldGhvZCwKLSAgICogZ2V0dGVyIG9yIHNldHRlciwgaW5mZXIgdGhlIHJldHVybiB0eXBlIGFuZCBhbnkgcGFyYW1ldGVyIHR5cGUocykgd2hlcmUKLSAgICogdGhleSB3ZXJlIG5vdCBwcm92aWRlZC4KLSAgICovCisgIC8vLyBJZiB0aGUgZ2l2ZW4gW2VsZW1lbnRdIHJlcHJlc2VudHMgYSBub24tc3ludGhldGljIGluc3RhbmNlIG1ldGhvZCwKKyAgLy8vIGdldHRlciBvciBzZXR0ZXIsIGluZmVyIHRoZSByZXR1cm4gdHlwZSBhbmQgYW55IHBhcmFtZXRlciB0eXBlKHMpIHdoZXJlCisgIC8vLyB0aGV5IHdlcmUgbm90IHByb3ZpZGVkLgogICB2b2lkIF9pbmZlckV4ZWN1dGFibGUoTWV0aG9kRWxlbWVudEltcGwgZWxlbWVudCkgewogICAgIGlmIChlbGVtZW50LmlzU3ludGhldGljIHx8IGVsZW1lbnQuaXNTdGF0aWMpIHsKICAgICAgIHJldHVybjsKQEAgLTQ4Nyw5ICs0NzAsNyBAQAogICAgIF9yZXNldE9wZXJhdG9yRXF1YWxQYXJhbWV0ZXJUeXBlVG9EeW5hbWljKGVsZW1lbnQsIG92ZXJyaWRkZW5FbGVtZW50cyk7CiAgIH0KIAotICAvKioKLSAgICogSWYgYSBwYXJhbWV0ZXIgaXMgY292YXJpYW50LCBhbnkgcGFyYW1ldGVycyB0aGF0IG92ZXJyaWRlIGl0IGFyZSB0b28uCi0gICAqLworICAvLy8gSWYgYSBwYXJhbWV0ZXIgaXMgY292YXJpYW50LCBhbnkgcGFyYW1ldGVycyB0aGF0IG92ZXJyaWRlIGl0IGFyZSB0b28uCiAgIHZvaWQgX2luZmVyUGFyYW1ldGVyQ292YXJpYW5jZShQYXJhbWV0ZXJFbGVtZW50SW1wbCBwYXJhbWV0ZXIsIGludCBpbmRleCwKICAgICAgIEl0ZXJhYmxlPEV4ZWN1dGFibGVFbGVtZW50PiBvdmVycmlkZGVuKSB7CiAgICAgcGFyYW1ldGVyLmluaGVyaXRzQ292YXJpYW50ID0gb3ZlcnJpZGRlbi5hbnkoKGYpIHsKQEAgLTQ5OCwxMSArNDc5LDkgQEAKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBTZXQgdGhlIHR5cGUgZm9yIHRoZSBbcGFyYW1ldGVyXSBhdCB0aGUgZ2l2ZW4gW2luZGV4XSBmcm9tIHRoZSBnaXZlbgotICAgKiBbY29tYmluZWRTaWduYXR1cmVUeXBlXSwgd2hpY2ggbWlnaHQgYmUgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHZhbGlkCi0gICAqIGNvbWJpbmVkIHNpZ25hdHVyZSBmb3Igc2lnbmF0dXJlcyBmcm9tIGRpcmVjdCBzdXBlcmludGVyZmFjZXMuCi0gICAqLworICAvLy8gU2V0IHRoZSB0eXBlIGZvciB0aGUgW3BhcmFtZXRlcl0gYXQgdGhlIGdpdmVuIFtpbmRleF0gZnJvbSB0aGUgZ2l2ZW4KKyAgLy8vIFtjb21iaW5lZFNpZ25hdHVyZVR5cGVdLCB3aGljaCBtaWdodCBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gdmFsaWQKKyAgLy8vIGNvbWJpbmVkIHNpZ25hdHVyZSBmb3Igc2lnbmF0dXJlcyBmcm9tIGRpcmVjdCBzdXBlcmludGVyZmFjZXMuCiAgIHZvaWQgX2luZmVyUGFyYW1ldGVyVHlwZShQYXJhbWV0ZXJFbGVtZW50SW1wbCBwYXJhbWV0ZXIsIGludCBpbmRleCwKICAgICAgIEZ1bmN0aW9uVHlwZSBjb21iaW5lZFNpZ25hdHVyZVR5cGUpIHsKICAgICBpZiAoY29tYmluZWRTaWduYXR1cmVUeXBlICE9IG51bGwpIHsKQEAgLTUyMywxMCArNTAyLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogSW5mZXIgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYWxsIG9mIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGluIHRoZSBnaXZlbgotICAgKiBpbnRlcmZhY2UgW3R5cGVdLgotICAgKi8KKyAgLy8vIEluZmVyIHR5cGUgaW5mb3JtYXRpb24gZm9yIGFsbCBvZiB0aGUgaW5zdGFuY2UgbWVtYmVycyBpbiB0aGUgZ2l2ZW4KKyAgLy8vIGludGVyZmFjZSBbdHlwZV0uCiAgIHZvaWQgX2luZmVyVHlwZShJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgICBDbGFzc0VsZW1lbnQgZWxlbWVudCA9IHR5cGUuZWxlbWVudDsKQEAgLTU4NiwxOCArNTYzLDE2IEBACiAgICAgZWxlbWVudC5pc09wZXJhdG9yRXF1YWxXaXRoUGFyYW1ldGVyVHlwZUZyb21PYmplY3QgPSB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgW0Z1bmN0aW9uVHlwZV0gb2YgdGhlIFtvdmVycmlkZGVuRWxlbWVudF0gdGhhdCBbZWxlbWVudF0KLSAgICogb3ZlcnJpZGVzLiBSZXR1cm4gYG51bGxgLCBpbiBjYXNlIG9mIHR5cGUgcGFyYW1ldGVycyBpbmNvbnNpc3RlbmN5LgotICAgKgotICAgKiBUaGUgb3ZlcnJpZGRlbiBlbGVtZW50IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZ2VuZXJpYyB0eXBlCi0gICAqIHBhcmFtZXRlcnMgYXMgdGhlIHRhcmdldCBlbGVtZW50LCBvciBub25lLgotICAgKgotICAgKiBJZiB3ZSBkbyBoYXZlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIG9uIHRoZSBlbGVtZW50IHdlJ3JlIGluZmVycmluZywKLSAgICogd2UgbXVzdCBleHByZXNzIGl0cyBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlcyBpbiB0ZXJtcyBvZiBpdHMgb3duCi0gICAqIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlLCBnaXZlbiBgbTxUPih0KWAgb3ZlcnJpZGluZyBgbTxTPihTIHMpYCB3ZQotICAgKiBzaG91bGQgaW5mZXIgdGhpcyBhcyBgbTxUPihUIHQpYC4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIFtGdW5jdGlvblR5cGVdIG9mIHRoZSBbb3ZlcnJpZGRlbkVsZW1lbnRdIHRoYXQgW2VsZW1lbnRdCisgIC8vLyBvdmVycmlkZXMuIFJldHVybiBgbnVsbGAsIGluIGNhc2Ugb2YgdHlwZSBwYXJhbWV0ZXJzIGluY29uc2lzdGVuY3kuCisgIC8vLworICAvLy8gVGhlIG92ZXJyaWRkZW4gZWxlbWVudCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGdlbmVyaWMgdHlwZQorICAvLy8gcGFyYW1ldGVycyBhcyB0aGUgdGFyZ2V0IGVsZW1lbnQsIG9yIG5vbmUuCisgIC8vLworICAvLy8gSWYgd2UgZG8gaGF2ZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyBvbiB0aGUgZWxlbWVudCB3ZSdyZSBpbmZlcnJpbmcsCisgIC8vLyB3ZSBtdXN0IGV4cHJlc3MgaXRzIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzIGluIHRlcm1zIG9mIGl0cyBvd24KKyAgLy8vIHBhcmFtZXRlcnMuIEZvciBleGFtcGxlLCBnaXZlbiBgbTxUPih0KWAgb3ZlcnJpZGluZyBgbTxTPihTIHMpYCB3ZQorICAvLy8gc2hvdWxkIGluZmVyIHRoaXMgYXMgYG08VD4oVCB0KWAuCiAgIEZ1bmN0aW9uVHlwZSBfdG9PdmVycmlkZGVuRnVuY3Rpb25UeXBlKAogICAgICAgRXhlY3V0YWJsZUVsZW1lbnQgZWxlbWVudCwgRXhlY3V0YWJsZUVsZW1lbnQgb3ZlcnJpZGRlbkVsZW1lbnQpIHsKICAgICB2YXIgZWxlbWVudFR5cGVQYXJhbWV0ZXJzID0gZWxlbWVudC50eXBlUGFyYW1ldGVyczsKQEAgLTYyNCw3ICs1OTksNSBAQAogICB9CiB9CiAKLS8qKgotICogQSBjbGFzcyBvZiBleGNlcHRpb24gdGhhdCBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlLgotICovCisvLy8gQSBjbGFzcyBvZiBleGNlcHRpb24gdGhhdCBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlLgogY2xhc3MgX0N5Y2xlRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uIHt9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy90ZXN0X3V0aWxpdGllcy9yZXNvdXJjZV9wcm92aWRlcl9taXhpbi5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdGVzdF91dGlsaXRpZXMvcmVzb3VyY2VfcHJvdmlkZXJfbWl4aW4uZGFydAppbmRleCA5N2IxYzUwLi5iMDJkZmFmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy90ZXN0X3V0aWxpdGllcy9yZXNvdXJjZV9wcm92aWRlcl9taXhpbi5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3Rlc3RfdXRpbGl0aWVzL3Jlc291cmNlX3Byb3ZpZGVyX21peGluLmRhcnQKQEAgLTYsMTEgKzYsOSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2ZpbGVfc3lzdGVtL21lbW9yeV9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hbmFseXNpcy9jb250ZXh0X2xvY2F0b3IuZGFydCc7CiAKLS8qKgotICogQSBtaXhpbiBmb3IgdGVzdCBjbGFzc2VzIHRoYXQgYWRkcyBhIFtSZXNvdXJjZVByb3ZpZGVyXSBhbmQgdXRpbGl0eSBtZXRob2RzCi0gKiBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIHN5c3RlbS4gVGhlIHV0aWxpdHkgbWV0aG9kcyBhbGwgdGFrZSBhIHBvc2l4IHN0eWxlCi0gKiBwYXRoIGFuZCBjb252ZXJ0IGl0IGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgYWN0dWFsIHBsYXRmb3JtLgotICovCisvLy8gQSBtaXhpbiBmb3IgdGVzdCBjbGFzc2VzIHRoYXQgYWRkcyBhIFtSZXNvdXJjZVByb3ZpZGVyXSBhbmQgdXRpbGl0eSBtZXRob2RzCisvLy8gZm9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBzeXN0ZW0uIFRoZSB1dGlsaXR5IG1ldGhvZHMgYWxsIHRha2UgYSBwb3NpeCBzdHlsZQorLy8vIHBhdGggYW5kIGNvbnZlcnQgaXQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBhY3R1YWwgcGxhdGZvcm0uCiBtaXhpbiBSZXNvdXJjZVByb3ZpZGVyTWl4aW4gewogICBNZW1vcnlSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXIgPSBNZW1vcnlSZXNvdXJjZVByb3ZpZGVyKCk7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvYXNzZXJ0cy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9hc3NlcnRzLmRhcnQKaW5kZXggYjVhMjE1OC4uM2MyNTFkMyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9hc3NlcnRzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9hc3NlcnRzLmRhcnQKQEAgLTIsMTEgKzIsOSBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBbdmFsdWVdIGlzIG5vdCBudWxsLgotICogT3RoZXJ3aXNlIHRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0uCi0gKiBBbiBvcHRpb25hbCBbZGVzY3JpcHRpb25dIGlzIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0gKi8KKy8vLyBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIFt2YWx1ZV0gaXMgbm90IG51bGwuCisvLy8gT3RoZXJ3aXNlIHRocm93cyBhbiBbQXJndW1lbnRFcnJvcl0uCisvLy8gQW4gb3B0aW9uYWwgW2Rlc2NyaXB0aW9uXSBpcyB1c2VkIGluIHRoZSBlcnJvciBtZXNzYWdlLgogdm9pZCBub3ROdWxsKE9iamVjdCB2YWx1ZSwgW1N0cmluZyBkZXNjcmlwdGlvbl0pIHsKICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9hc3RfZGF0YV9leHRyYWN0b3IuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvYXN0X2RhdGFfZXh0cmFjdG9yLmRhcnQKaW5kZXggODY4MmM2NS4uMDZmZGFiOSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9hc3RfZGF0YV9leHRyYWN0b3IuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy91dGlsL2FzdF9kYXRhX2V4dHJhY3Rvci5kYXJ0CkBAIC05LDkgKzksNyBAQAogCiAvLy8gQWJzdHJhY3QgSVIgdmlzaXRvciBmb3IgY29tcHV0aW5nIGRhdGEgY29ycmVzcG9uZGluZyB0byBhIG5vZGUgb3IgZWxlbWVudCwKIC8vLyBhbmQgcmVjb3JkIGl0IHdpdGggYSBnZW5lcmljIFtJZF0KLS8vLyBUT0RPKHBhdWxiZXJyeSk6IGlmIEkgdHJ5IHRvIGV4dGVuZCBHZW5lcmFsaXppbmdBc3RWaXNpdG9yPHZvaWQ+LCB0aGUgVk0KLS8vLyBjcmFzaGVzLgotYWJzdHJhY3QgY2xhc3MgQXN0RGF0YUV4dHJhY3RvcjxUPiBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3I8ZHluYW1pYz4KK2Fic3RyYWN0IGNsYXNzIEFzdERhdGFFeHRyYWN0b3I8VD4gZXh0ZW5kcyBHZW5lcmFsaXppbmdBc3RWaXNpdG9yPHZvaWQ+CiAgICAgd2l0aCBEYXRhUmVnaXN0cnk8VD4gewogICBmaW5hbCBVcmkgdXJpOwogCkBAIC0xMTAsNDYgKzEwOCw0NiBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q2xhc3NEZWNsYXJhdGlvbihDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgY29tcHV0ZUZvckNsYXNzKG5vZGUsIGNyZWF0ZUNsYXNzSWQobm9kZSkpOwotICAgIHJldHVybiBzdXBlci52aXNpdENsYXNzRGVjbGFyYXRpb24obm9kZSk7CisgICAgc3VwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q29sbGVjdGlvbkVsZW1lbnQoQ29sbGVjdGlvbkVsZW1lbnQgbm9kZSkgeworICB2b2lkIHZpc2l0Q29sbGVjdGlvbkVsZW1lbnQoQ29sbGVjdGlvbkVsZW1lbnQgbm9kZSkgewogICAgIGNvbXB1dGVGb3JDb2xsZWN0aW9uRWxlbWVudChub2RlLCBjb21wdXRlRGVmYXVsdE5vZGVJZChub2RlKSk7CiAgICAgc3VwZXIudmlzaXRDb2xsZWN0aW9uRWxlbWVudChub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdENvbXBpbGF0aW9uVW5pdChDb21waWxhdGlvblVuaXQgbm9kZSkgeworICB2b2lkIHZpc2l0Q29tcGlsYXRpb25Vbml0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7CiAgICAgdmFyIGxpYnJhcnkgPSBub2RlLmRlY2xhcmVkRWxlbWVudC5saWJyYXJ5OwogICAgIGNvbXB1dGVGb3JMaWJyYXJ5KGxpYnJhcnksIGNyZWF0ZUxpYnJhcnlJZChsaWJyYXJ5KSk7Ci0gICAgcmV0dXJuIHN1cGVyLnZpc2l0Q29tcGlsYXRpb25Vbml0KG5vZGUpOworICAgIHN1cGVyLnZpc2l0Q29tcGlsYXRpb25Vbml0KG5vZGUpOwogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgY29tcHV0ZUZvck1lbWJlcihub2RlLCBjcmVhdGVNZW1iZXJJZChub2RlKSk7Ci0gICAgcmV0dXJuIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihub2RlKTsKKyAgICBzdXBlci52aXNpdENvbnN0cnVjdG9yRGVjbGFyYXRpb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbGFyYXRpb24gbm9kZSkgeworICB2b2lkIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihGdW5jdGlvbkRlY2xhcmF0aW9uIG5vZGUpIHsKICAgICBpZiAobm9kZS5wYXJlbnQgaXMgQ29tcGlsYXRpb25Vbml0KSB7CiAgICAgICBjb21wdXRlRm9yTWVtYmVyKG5vZGUsIGNyZWF0ZU1lbWJlcklkKG5vZGUpKTsKICAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKTsKKyAgICBzdXBlci52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CisgIHZvaWQgdmlzaXRNZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgY29tcHV0ZUZvck1lbWJlcihub2RlLCBjcmVhdGVNZW1iZXJJZChub2RlKSk7Ci0gICAgcmV0dXJuIHN1cGVyLnZpc2l0TWV0aG9kRGVjbGFyYXRpb24obm9kZSk7CisgICAgc3VwZXIudmlzaXRNZXRob2REZWNsYXJhdGlvbihub2RlKTsKICAgfQogCiAgIEBvdmVycmlkZQotICB2aXNpdFN0YXRlbWVudChTdGF0ZW1lbnQgbm9kZSkgeworICB2b2lkIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBub2RlKSB7CiAgICAgY29tcHV0ZUZvclN0YXRlbWVudCgKICAgICAgICAgbm9kZSwKICAgICAgICAgbm9kZSBpcyBFeHByZXNzaW9uU3RhdGVtZW50CkBAIC0xNTksMTMgKzE1NywxMyBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKKyAgdm9pZCB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7CiAgICAgaWYgKG5vZGUucGFyZW50LnBhcmVudCBpcyBUb3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgIGNvbXB1dGVGb3JNZW1iZXIobm9kZSwgY3JlYXRlTWVtYmVySWQobm9kZSkpOwogICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQucGFyZW50IGlzIEZpZWxkRGVjbGFyYXRpb24pIHsKICAgICAgIGNvbXB1dGVGb3JNZW1iZXIobm9kZSwgY3JlYXRlTWVtYmVySWQobm9kZSkpOwogICAgIH0KLSAgICByZXR1cm4gc3VwZXIudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpOworICAgIHN1cGVyLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTsKICAgfQogCiAgIGludCBfbm9kZU9mZnNldChBc3ROb2RlIG5vZGUpIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvZ2xvYi5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9nbG9iLmRhcnQKaW5kZXggNWFmOGY0Ni4uMmVkZmQ4OSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9nbG9iLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9nbG9iLmRhcnQKQEAgLTIsMzIgKzIsMjQgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0vKioKLSAqIEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgYWdhaW5zdCBmaWxlc3lzdGVtIHBhdGgtbGlrZSBzdHJpbmdzIHdpdGggd2lsZGNhcmRzLgotICoKLSAqIFRoZSBwYXR0ZXJuIG1hdGNoZXMgc3RyaW5ncyBhcyBmb2xsb3dzOgotICogICAqIFRoZSBwYXR0ZXJuIG11c3QgdXNlIGAvYCBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuCi0gKiAgICogVGhlIHdob2xlIHN0cmluZyBtdXN0IG1hdGNoLCBub3QgYSBzdWJzdHJpbmcuCi0gKiAgICogQW55IG5vbiB3aWxkY2FyZCBpcyBtYXRjaGVkIGFzIGEgbGl0ZXJhbC4KLSAqICAgKiAnKicgbWF0Y2hlcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGV4Y2VwdCAnLycuCi0gKiAgICogJz8nIG1hdGNoZXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGV4Y2VwdCAnLycuCi0gKiAgICogJyoqJyBtYXRjaGVzIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgaW5jbHVkaW5nICcvJy4KLSAqLworLy8vIEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgYWdhaW5zdCBmaWxlc3lzdGVtIHBhdGgtbGlrZSBzdHJpbmdzIHdpdGggd2lsZGNhcmRzLgorLy8vCisvLy8gVGhlIHBhdHRlcm4gbWF0Y2hlcyBzdHJpbmdzIGFzIGZvbGxvd3M6CisvLy8gICAqIFRoZSBwYXR0ZXJuIG11c3QgdXNlIGAvYCBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuCisvLy8gICAqIFRoZSB3aG9sZSBzdHJpbmcgbXVzdCBtYXRjaCwgbm90IGEgc3Vic3RyaW5nLgorLy8vICAgKiBBbnkgbm9uIHdpbGRjYXJkIGlzIG1hdGNoZWQgYXMgYSBsaXRlcmFsLgorLy8vICAgKiAnKicgbWF0Y2hlcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGV4Y2VwdCAnLycuCisvLy8gICAqICc/JyBtYXRjaGVzIGV4YWN0bHkgb25lIGNoYXJhY3RlciBleGNlcHQgJy8nLgorLy8vICAgKiAnKionIG1hdGNoZXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBpbmNsdWRpbmcgJy8nLgogY2xhc3MgR2xvYiB7Ci0gIC8qKgotICAgKiBUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZTogXCBeICQgLiB8ICsgWyBdICggKSB7IH0KLSAgICogYXMgZGVmaW5lZCBoZXJlOiBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS4xMAotICAgKi8KKyAgLy8vIFRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlOiBcIF4gJCAuIHwgKyBbIF0gKCApIHsgfQorICAvLy8gYXMgZGVmaW5lZCBoZXJlOiBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS4xMAogICBzdGF0aWMgZmluYWwgUmVnRXhwIF9zcGVjaWFsQ2hhcnMgPSBSZWdFeHAocicoW1xcXF5cJFwuXHxcK1xbXF1cKFwpXHtcfV0pJyk7CiAKLSAgLyoqCi0gICAqIFRoZSBwYXRoIHNlcGFyYXRvciB1c2VkIHRvIHNlcGFyYXRlIGNvbXBvbmVudHMgaW4gZmlsZSBwYXRocy4KLSAgICovCisgIC8vLyBUaGUgcGF0aCBzZXBhcmF0b3IgdXNlZCB0byBzZXBhcmF0ZSBjb21wb25lbnRzIGluIGZpbGUgcGF0aHMuCiAgIGZpbmFsIFN0cmluZyBfc2VwYXJhdG9yOwogCi0gIC8qKgotICAgKiBUaGUgcGF0dGVybiBzdHJpbmcuCi0gICAqLworICAvLy8gVGhlIHBhdHRlcm4gc3RyaW5nLgogICBmaW5hbCBTdHJpbmcgX3BhdHRlcm47CiAKICAgU3RyaW5nIF9zdWZmaXg7CkBAIC00OSwxMCArNDEsOCBAQAogICBAb3ZlcnJpZGUKICAgYm9vbCBvcGVyYXRvciA9PShvdGhlcikgPT4gb3RoZXIgaXMgR2xvYiAmJiBfcGF0dGVybiA9PSBvdGhlci5fcGF0dGVybjsKIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gW3BhdGhdIG1hdGNoZXMgdGhpcyBnbG9iLgotICAgKiBUaGUgZ2l2ZW4gW3BhdGhdIG11c3QgdXNlIHRoZSBzYW1lIFtfc2VwYXJhdG9yXSBhcyB0aGUgZ2xvYi4KLSAgICovCisgIC8vLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBbcGF0aF0gbWF0Y2hlcyB0aGlzIGdsb2IuCisgIC8vLyBUaGUgZ2l2ZW4gW3BhdGhdIG11c3QgdXNlIHRoZSBzYW1lIFtfc2VwYXJhdG9yXSBhcyB0aGUgZ2xvYi4KICAgYm9vbCBtYXRjaGVzKFN0cmluZyBwYXRoKSB7CiAgICAgU3RyaW5nIHBvc2l4UGF0aCA9IF90b1Bvc2l4UGF0aChwYXRoKTsKICAgICBpZiAoX3N1ZmZpeCAhPSBudWxsKSB7CkBAIC02NCw5ICs1NCw3IEBACiAgIEBvdmVycmlkZQogICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBfcGF0dGVybjsKIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBQb3NpeCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBbcGF0aF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBQb3NpeCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBbcGF0aF0uCiAgIFN0cmluZyBfdG9Qb3NpeFBhdGgoU3RyaW5nIHBhdGgpIHsKICAgICBpZiAoX3NlcGFyYXRvciA9PSAnLycpIHsKICAgICAgIHJldHVybiBwYXRoOwpAQCAtNzQsMTAgKzYyLDggQEAKICAgICByZXR1cm4gcGF0aC5yZXBsYWNlQWxsKF9zZXBhcmF0b3IsICcvJyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgW3BhdHRlcm5dIHN0YXJ0IHdpdGggdGhlIGdpdmVuIFtwcmVmaXhdIGFuZCBkb2VzCi0gICAqIG5vdCBoYXZlIGAqYCBvciBgP2AgY2hhcmFjdGVycyBhZnRlciB0aGUgW3ByZWZpeF0uCi0gICAqLworICAvLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgW3BhdHRlcm5dIHN0YXJ0IHdpdGggdGhlIGdpdmVuIFtwcmVmaXhdIGFuZCBkb2VzCisgIC8vLyBub3QgaGF2ZSBgKmAgb3IgYD9gIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIFtwcmVmaXhdLgogICBzdGF0aWMgYm9vbCBfaGFzSnVzdFByZWZpeChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHByZWZpeCkgewogICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgocHJlZml4KSkgewogICAgICAgaW50IHByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy91dGlsL2xydV9tYXAuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvbHJ1X21hcC5kYXJ0CmluZGV4IDdhYzY5ZTcuLjAwNmIwMmMgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvbHJ1X21hcC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvbHJ1X21hcC5kYXJ0CkBAIC03LDEyICs3LDEwIEBACiAvLy8gVGhpcyBoYW5kbGVyIGlzIG5vdGlmaWVkIHdoZW4gYW4gaXRlbSBpcyBldmljdGVkIGZyb20gdGhlIGNhY2hlLgogdHlwZWRlZiBFdmljdGlvbkhhbmRsZXI8SywgVj4gPSBGdW5jdGlvbihLIGtleSwgViB2YWx1ZSk7CiAKLS8qKgotICogQSBoYXNoLXRhYmxlIGJhc2VkIGNhY2hlIGltcGxlbWVudGF0aW9uLgotICoKLSAqIFdoZW4gaXQgcmVhY2hlcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcywgdGhlIGl0ZW0gdGhhdCBoYXMgbm90IGJlZW4KLSAqIGFjY2Vzc2VkIChib3RoIGdldCBhbmQgcHV0KSByZWNlbnRseSBpcyBldmljdGVkLgotICovCisvLy8gQSBoYXNoLXRhYmxlIGJhc2VkIGNhY2hlIGltcGxlbWVudGF0aW9uLgorLy8vCisvLy8gV2hlbiBpdCByZWFjaGVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGl0ZW1zLCB0aGUgaXRlbSB0aGF0IGhhcyBub3QgYmVlbgorLy8vIGFjY2Vzc2VkIChib3RoIGdldCBhbmQgcHV0KSByZWNlbnRseSBpcyBldmljdGVkLgogY2xhc3MgTFJVTWFwPEssIFY+IHsKICAgZmluYWwgTGlua2VkSGFzaE1hcDxLLCBWPiBfbWFwID0gTGlua2VkSGFzaE1hcDxLLCBWPigpOwogICBmaW5hbCBpbnQgX21heFNpemU7CkBAIC0yMCwxMCArMTgsOCBAQAogCiAgIExSVU1hcCh0aGlzLl9tYXhTaXplLCBbdGhpcy5faGFuZGxlcl0pOwogCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIFtrZXldIG9yIG51bGwgaWYgW2tleV0gaXMgbm90Ci0gICAqIGluIHRoZSBjYWNoZS4KLSAgICovCisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIFtrZXldIG9yIG51bGwgaWYgW2tleV0gaXMgbm90CisgIC8vLyBpbiB0aGUgY2FjaGUuCiAgIFYgZ2V0KEsga2V5KSB7CiAgICAgViB2YWx1ZSA9IF9tYXAucmVtb3ZlKGtleSk7CiAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKQEAgLTMyLDEyICsyOCwxMCBAQAogICAgIHJldHVybiB2YWx1ZTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NvY2lhdGVzIHRoZSBba2V5XSB3aXRoIHRoZSBnaXZlbiBbdmFsdWVdLgotICAgKgotICAgKiBJZiB0aGUgY2FjaGUgaXMgZnVsbCwgYW4gaXRlbSB0aGF0IGhhcyBub3QgYmVlbiBhY2Nlc3NlZCByZWNlbnRseSBpcwotICAgKiBldmljdGVkLgotICAgKi8KKyAgLy8vIEFzc29jaWF0ZXMgdGhlIFtrZXldIHdpdGggdGhlIGdpdmVuIFt2YWx1ZV0uCisgIC8vLworICAvLy8gSWYgdGhlIGNhY2hlIGlzIGZ1bGwsIGFuIGl0ZW0gdGhhdCBoYXMgbm90IGJlZW4gYWNjZXNzZWQgcmVjZW50bHkgaXMKKyAgLy8vIGV2aWN0ZWQuCiAgIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKSB7CiAgICAgX21hcC5yZW1vdmUoa2V5KTsKICAgICBfbWFwW2tleV0gPSB2YWx1ZTsKQEAgLTUwLDkgKzQ0LDcgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gZm9yIHRoZSBnaXZlbiBba2V5XS4KLSAgICovCisgIC8vLyBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBmb3IgdGhlIGdpdmVuIFtrZXldLgogICB2b2lkIHJlbW92ZShLIGtleSkgewogICAgIF9tYXAucmVtb3ZlKGtleSk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvcGVyZm9ybWFuY2Uvb3BlcmF0aW9uX3BlcmZvcm1hbmNlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjQ1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy91dGlsL3BlcmZvcm1hbmNlL29wZXJhdGlvbl9wZXJmb3JtYW5jZS5kYXJ0CkBAIC0wLDAgKzEsMTMyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKKworLy8vIFRoZSBwZXJmb3JtYW5jZSBvZiBhbiBvcGVyYXRpb24uCithYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25QZXJmb3JtYW5jZSB7CisgIC8vLyBUaGUgY2hpbGQgb3BlcmF0aW9ucywgbWlnaHQgYmUgZW1wdHkuCisgIExpc3Q8T3BlcmF0aW9uUGVyZm9ybWFuY2U+IGdldCBjaGlsZHJlbjsKKworICAvLy8gVGhlIGR1cmF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgaXRzIGNoaWxkcmVuLgorICBEdXJhdGlvbiBnZXQgZWxhcHNlZDsKKworICAvLy8gVGhlIGR1cmF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uLCBleGNsdWRpbmcgaXRzIGNoaWxkcmVuLgorICBEdXJhdGlvbiBnZXQgZWxhcHNlZFNlbGY7CisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCisgIFN0cmluZyBnZXQgbmFtZTsKKworICBPcGVyYXRpb25QZXJmb3JtYW5jZSBnZXRDaGlsZChTdHJpbmcgbmFtZSk7CisKKyAgLy8vIFdyaXRlIHRoaXMgb3BlcmF0aW9uIGFuZCBpdHMgY2hpbGRyZW4gaW50byB0aGUgW2J1ZmZlcl0uCisgIHZvaWQgd3JpdGUoeworICAgIEByZXF1aXJlZCBTdHJpbmdCdWZmZXIgYnVmZmVyLAorICAgIFN0cmluZyBpbmRlbnQgPSAnJywKKyAgfSk7Cit9CisKK2NsYXNzIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBpbXBsZW1lbnRzIE9wZXJhdGlvblBlcmZvcm1hbmNlIHsKKyAgQG92ZXJyaWRlCisgIGZpbmFsIFN0cmluZyBuYW1lOworCisgIGZpbmFsIFN0b3B3YXRjaCBfdGltZXIgPSBTdG9wd2F0Y2goKTsKKyAgZmluYWwgTGlzdDxPcGVyYXRpb25QZXJmb3JtYW5jZT4gX2NoaWxkcmVuID0gW107CisKKyAgT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKHRoaXMubmFtZSk7CisKKyAgQG92ZXJyaWRlCisgIExpc3Q8T3BlcmF0aW9uUGVyZm9ybWFuY2U+IGdldCBjaGlsZHJlbiB7CisgICAgcmV0dXJuIF9jaGlsZHJlbjsKKyAgfQorCisgIEBvdmVycmlkZQorICBEdXJhdGlvbiBnZXQgZWxhcHNlZCB7CisgICAgcmV0dXJuIF90aW1lci5lbGFwc2VkOworICB9CisKKyAgQG92ZXJyaWRlCisgIER1cmF0aW9uIGdldCBlbGFwc2VkU2VsZiB7CisgICAgcmV0dXJuIGVsYXBzZWQgLSBfZWxhcHNlZENoaWxkcmVuOworICB9CisKKyAgRHVyYXRpb24gZ2V0IF9lbGFwc2VkQ2hpbGRyZW4geworICAgIHJldHVybiBjaGlsZHJlbi5mb2xkPER1cmF0aW9uPigKKyAgICAgIER1cmF0aW9uLnplcm8sCisgICAgICAoc3VtLCBjaGlsZCkgPT4gc3VtICsgY2hpbGQuZWxhcHNlZCwKKyAgICApOworICB9CisKKyAgQG92ZXJyaWRlCisgIE9wZXJhdGlvblBlcmZvcm1hbmNlIGdldENoaWxkKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGNoaWxkcmVuLmZpcnN0V2hlcmUoCisgICAgICAoY2hpbGQpID0+IGNoaWxkLm5hbWUgPT0gbmFtZSwKKyAgICAgIG9yRWxzZTogKCkgPT4gbnVsbCwKKyAgICApOworICB9CisKKyAgLy8vIFJ1biB0aGUgW29wZXJhdGlvbl0gYXMgYSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCisgIC8vLworICAvLy8gSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGlsZCwgYSBuZXcgb25lIGlzIGNyZWF0ZWQsIHdpdGggYSBuZXcgdGltZXIuCisgIC8vLworICAvLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNoaWxkIHdpdGggdGhhdCBuYW1lLCBpdHMgdGltZXIgd2lsbCByZXN1bWUgYW5kCisgIC8vLyB0aGVuIHN0b3AuIFNvLCBpdCB3aWxsIGFjY3VtdWxhdGUgdGltZSBhY3Jvc3MgYWxsIHJ1bnMuCisgIFQgcnVuPFQ+KAorICAgIFN0cmluZyBuYW1lLAorICAgIFQgRnVuY3Rpb24oT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKSBvcGVyYXRpb24sCisgICkgeworICAgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBjaGlsZCA9IF9leGlzdGluZ09yTmV3Q2hpbGQobmFtZSk7CisgICAgY2hpbGQuX3RpbWVyLnN0YXJ0KCk7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG9wZXJhdGlvbihjaGlsZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNoaWxkLl90aW1lci5zdG9wKCk7CisgICAgfQorICB9CisKKyAgLy8vIFJ1biB0aGUgW29wZXJhdGlvbl0gYXMgYSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCisgIC8vLworICAvLy8gSWYgdGhlcmUgaXMgbm8gc3VjaCBjaGlsZCwgYSBuZXcgb25lIGlzIGNyZWF0ZWQsIHdpdGggYSBuZXcgdGltZXIuCisgIC8vLworICAvLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNoaWxkIHdpdGggdGhhdCBuYW1lLCBpdHMgdGltZXIgd2lsbCByZXN1bWUgYW5kCisgIC8vLyB0aGVuIHN0b3AuIFNvLCBpdCB3aWxsIGFjY3VtdWxhdGUgdGltZSBhY3Jvc3MgYWxsIHJ1bnMuCisgIEZ1dHVyZTxUPiBydW5Bc3luYzxUPigKKyAgICBTdHJpbmcgbmFtZSwKKyAgICBGdXR1cmU8VD4gRnVuY3Rpb24oT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKSBvcGVyYXRpb24sCisgICkgYXN5bmMgeworICAgIHZhciBjaGlsZCA9IF9leGlzdGluZ09yTmV3Q2hpbGQobmFtZSk7CisgICAgY2hpbGQuX3RpbWVyLnN0YXJ0KCk7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbihjaGlsZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNoaWxkLl90aW1lci5zdG9wKCk7CisgICAgfQorICB9CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJyhuYW1lOiAkbmFtZSwgZWxhcHNlZDogJGVsYXBzZWQsIGVsYXBzZWRTZWxmOiAkZWxhcHNlZFNlbGYpJzsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHdyaXRlKHtTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgaW5kZW50ID0gJyd9KSB7CisgICAgYnVmZmVyLndyaXRlbG4oJyRpbmRlbnQke3RvU3RyaW5nKCl9Jyk7CisKKyAgICB2YXIgY2hpbGRJbmRlbnQgPSAnJGluZGVudCAgJzsKKyAgICBmb3IgKHZhciBjaGlsZCBpbiBjaGlsZHJlbikgeworICAgICAgY2hpbGQud3JpdGUoYnVmZmVyOiBidWZmZXIsIGluZGVudDogY2hpbGRJbmRlbnQpOworICAgIH0KKyAgfQorCisgIE9wZXJhdGlvblBlcmZvcm1hbmNlSW1wbCBfZXhpc3RpbmdPck5ld0NoaWxkKFN0cmluZyBuYW1lKSB7CisgICAgdmFyIGNoaWxkID0gZ2V0Q2hpbGQobmFtZSk7CisgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgIGNoaWxkID0gT3BlcmF0aW9uUGVyZm9ybWFuY2VJbXBsKG5hbWUpOworICAgICAgX2NoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBjaGlsZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9wZXJmb3JtYW5jZS91dGlsaXRpZXNfdGltaW5nLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy91dGlsL3BlcmZvcm1hbmNlL3V0aWxpdGllc190aW1pbmcuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE5YTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC9wZXJmb3JtYW5jZS91dGlsaXRpZXNfdGltaW5nLmRhcnQKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vLyBBIGBDb3VudGVkU3RvcHdhdGNoYCBpcyBhIFtTdG9wd2F0Y2hdIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCisvLy8gc3RvcCBtZXRob2QgaGFzIGJlZW4gaW52b2tlZC4KK2NsYXNzIENvdW50ZWRTdG9wd2F0Y2ggZXh0ZW5kcyBTdG9wd2F0Y2ggeworICAvLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgW3N0b3BdIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLgorICBpbnQgc3RvcENvdW50ID0gMDsKKworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc3RvcHdhdGNoLgorICBDb3VudGVkU3RvcHdhdGNoKCk7CisKKyAgLy8vIFRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZCB0aGF0IHdlcmUgcmVjb3JkZWQgZWFjaCB0aW1lIHRoZSBbc3RhcnRdCisgIC8vLyBhbmQgW3N0b3BdIG1ldGhvZHMgd2VyZSBpbnZva2VkLgorICBpbnQgZ2V0IGF2ZXJhZ2VNaWxsaXNlY29uZHMgPT4gZWxhcHNlZE1pbGxpc2Vjb25kcyB+LyBzdG9wQ291bnQ7CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICBzdG9wQ291bnQgPSAwOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgc3RvcCgpIHsKKyAgICBzdXBlci5zdG9wKCk7CisgICAgc3RvcENvdW50Kys7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3V0aWwvdXRpbGl0aWVzX3RpbWluZy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC91dGlsaXRpZXNfdGltaW5nLmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGU0NTIuLjAwMDAwMDAKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvdXRpbC91dGlsaXRpZXNfdGltaW5nLmRhcnQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi0vLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQotLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLyoqCi0gKiBBIGBDb3VudGVkU3RvcHdhdGNoYCBpcyBhIFtTdG9wd2F0Y2hdIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi0gKiBzdG9wIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLgotICovCi1jbGFzcyBDb3VudGVkU3RvcHdhdGNoIGV4dGVuZHMgU3RvcHdhdGNoIHsKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIFtzdG9wXSBtZXRob2QgaGFzIGJlZW4gaW52b2tlZC4KLSAgICovCi0gIGludCBzdG9wQ291bnQgPSAwOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzdG9wd2F0Y2guCi0gICAqLwotICBDb3VudGVkU3RvcHdhdGNoKCk7Ci0KLSAgLyoqCi0gICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZCB0aGF0IHdlcmUgcmVjb3JkZWQgZWFjaCB0aW1lIHRoZSBbc3RhcnRdCi0gICAqIGFuZCBbc3RvcF0gbWV0aG9kcyB3ZXJlIGludm9rZWQuCi0gICAqLwotICBpbnQgZ2V0IGF2ZXJhZ2VNaWxsaXNlY29uZHMgPT4gZWxhcHNlZE1pbGxpc2Vjb25kcyB+LyBzdG9wQ291bnQ7Ci0KLSAgQG92ZXJyaWRlCi0gIHZvaWQgcmVzZXQoKSB7Ci0gICAgc3VwZXIucmVzZXQoKTsKLSAgICBzdG9wQ291bnQgPSAwOwotICB9Ci0KLSAgQG92ZXJyaWRlCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdXBlci5zdG9wKCk7Ci0gICAgc3RvcENvdW50Kys7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9iYXNpYy5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2Jhc2ljLmRhcnQKaW5kZXggZjVlZjgwNS4uOGIzZTNjOCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2Jhc2ljLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2Jhc2ljLmRhcnQKQEAgLTgsMTcgKzgsMTMgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvd29ya3NwYWNlL3NpbXBsZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvd29ya3NwYWNlL3dvcmtzcGFjZS5kYXJ0JzsKIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIGRlZmF1bHQgRGFydCB3b3Jrc3BhY2UuCi0gKgotICogQSBCYXNpY1dvcmtzcGFjZSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm8gb3RoZXIgd29ya3NwYWNlIHR5cGUgaXMgdmFsaWQuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIGRlZmF1bHQgRGFydCB3b3Jrc3BhY2UuCisvLy8KKy8vLyBBIEJhc2ljV29ya3NwYWNlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBubyBvdGhlciB3b3Jrc3BhY2UgdHlwZSBpcyB2YWxpZC4KIGNsYXNzIEJhc2ljV29ya3NwYWNlIGV4dGVuZHMgU2ltcGxlV29ya3NwYWNlIHsKLSAgLyoqCi0gICAqIFRoZSBzaW5ndWxhciBwYWNrYWdlIGluIHRoaXMgd29ya3NwYWNlLgotICAgKgotICAgKiBFYWNoIGJhc2ljIHdvcmtzcGFjZSBpcyBpdHNlbGYgb25lIHBhY2thZ2UuCi0gICAqLworICAvLy8gVGhlIHNpbmd1bGFyIHBhY2thZ2UgaW4gdGhpcyB3b3Jrc3BhY2UuCisgIC8vLworICAvLy8gRWFjaCBiYXNpYyB3b3Jrc3BhY2UgaXMgaXRzZWxmIG9uZSBwYWNrYWdlLgogICBCYXNpY1dvcmtzcGFjZVBhY2thZ2UgX3RoZU9ubHlQYWNrYWdlOwogCiAgIEJhc2ljV29ya3NwYWNlLl8oCkBAIC0zOCwxMyArMzQsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogRmluZCB0aGUgYmFzaWMgd29ya3NwYWNlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFtwYXRoXS4KLSAgICoKLSAgICogQXMgYSBbQmFzaWNXb3Jrc3BhY2VdIGlzIG5vdCBkZWZpbmVkIGJ5IGFueSBtYXJrZXIgZmlsZXMgb3IgYnVpbGQKLSAgICogYXJ0aWZhY3RzLCB0aGlzIHNpbXBseSBjcmVhdGVzIGEgQmFzaWNXb3Jrc3BhY2Ugd2l0aCBbcGF0aF0gYXMgdGhlIFtyb290XQotICAgKiAob3IgW3BhdGhdJ3MgcGFyZW50IGlmIFtwYXRoXSBwb2ludHMgdG8gYSBmaWxlKS4KLSAgICovCisgIC8vLyBGaW5kIHRoZSBiYXNpYyB3b3Jrc3BhY2UgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gW3BhdGhdLgorICAvLy8KKyAgLy8vIEFzIGEgW0Jhc2ljV29ya3NwYWNlXSBpcyBub3QgZGVmaW5lZCBieSBhbnkgbWFya2VyIGZpbGVzIG9yIGJ1aWxkCisgIC8vLyBhcnRpZmFjdHMsIHRoaXMgc2ltcGx5IGNyZWF0ZXMgYSBCYXNpY1dvcmtzcGFjZSB3aXRoIFtwYXRoXSBhcyB0aGUgW3Jvb3RdCisgIC8vLyAob3IgW3BhdGhdJ3MgcGFyZW50IGlmIFtwYXRoXSBwb2ludHMgdG8gYSBmaWxlKS4KICAgc3RhdGljIEJhc2ljV29ya3NwYWNlIGZpbmQoCiAgICAgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwKICAgICBNYXA8U3RyaW5nLCBMaXN0PEZvbGRlcj4+IHBhY2thZ2VNYXAsCkBAIC01OCwxMyArNTIsMTEgQEAKICAgfQogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZSBkZWZpbmVkIGluIGEgW0Jhc2ljV29ya3NwYWNlXS4KLSAqCi0gKiBTZXBhcmF0ZSBmcm9tIFtQYWNrYWdlc10gb3IgcGFja2FnZSBtYXBzLCB0aGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHNpbXBseQotICogdW5kZXJzdGFuZCB3aGV0aGVyIGFyYml0cmFyeSBmaWxlIHBhdGhzIHJlcHJlc2VudCBsaWJyYXJpZXMgZGVjbGFyZWQgd2l0aGluCi0gKiBhIGdpdmVuIHBhY2thZ2UgaW4gYSBbQmFzaWNXb3Jrc3BhY2VdLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBwYWNrYWdlIGRlZmluZWQgaW4gYSBbQmFzaWNXb3Jrc3BhY2VdLgorLy8vCisvLy8gU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKKy8vLyB1bmRlcnN0YW5kIHdoZXRoZXIgYXJiaXRyYXJ5IGZpbGUgcGF0aHMgcmVwcmVzZW50IGxpYnJhcmllcyBkZWNsYXJlZCB3aXRoaW4KKy8vLyBhIGdpdmVuIHBhY2thZ2UgaW4gYSBbQmFzaWNXb3Jrc3BhY2VdLgogY2xhc3MgQmFzaWNXb3Jrc3BhY2VQYWNrYWdlIGV4dGVuZHMgV29ya3NwYWNlUGFja2FnZSB7CiAgIEBvdmVycmlkZQogICBmaW5hbCBTdHJpbmcgcm9vdDsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9iYXplbC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2JhemVsLmRhcnQKaW5kZXggMmIwMDliOC4uNWI2YmQ5MiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2JhemVsLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL2JhemVsLmRhcnQKQEAgLTE1LDExICsxNSw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3dvcmtzcGFjZS93b3Jrc3BhY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgQmF6ZWxGaWxlVXJpUmVzb2x2ZXJgIHJlc29sdmUgYGZpbGVgIFVSSSdzIGJ5IGZpcnN0Ci0gKiByZXNvbHZpbmcgZmlsZSB1cmkncyBpbiB0aGUgZXhwZWN0ZWQgd2F5LCBhbmQgdGhlbiBieSBsb29raW5nIGluIHRoZQotICogY29ycmVzcG9uZGluZyBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMuCi0gKi8KKy8vLyBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBCYXplbEZpbGVVcmlSZXNvbHZlcmAgcmVzb2x2ZSBgZmlsZWAgVVJJJ3MgYnkgZmlyc3QKKy8vLyByZXNvbHZpbmcgZmlsZSB1cmkncyBpbiB0aGUgZXhwZWN0ZWQgd2F5LCBhbmQgdGhlbiBieSBsb29raW5nIGluIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzLgogY2xhc3MgQmF6ZWxGaWxlVXJpUmVzb2x2ZXIgZXh0ZW5kcyBSZXNvdXJjZVVyaVJlc29sdmVyIHsKICAgZmluYWwgQmF6ZWxXb3Jrc3BhY2Ugd29ya3NwYWNlOwogCkBAIC00MSwxNiArMzksMTIgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBbVXJpUmVzb2x2ZXJdIHRoYXQgY2FuIHJlc29sdmUgYHBhY2thZ2VgIFVSSXMgaW4gW0JhemVsV29ya3NwYWNlXS4KLSAqLworLy8vIFRoZSBbVXJpUmVzb2x2ZXJdIHRoYXQgY2FuIHJlc29sdmUgYHBhY2thZ2VgIFVSSXMgaW4gW0JhemVsV29ya3NwYWNlXS4KIGNsYXNzIEJhemVsUGFja2FnZVVyaVJlc29sdmVyIGV4dGVuZHMgVXJpUmVzb2x2ZXIgewogICBmaW5hbCBCYXplbFdvcmtzcGFjZSBfd29ya3NwYWNlOwogICBmaW5hbCBwYXRoLkNvbnRleHQgX2NvbnRleHQ7CiAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZSBvZiBhYnNvbHV0ZSBbVXJpXXMgdG8gW1NvdXJjZV1zIG1hcHBpbmdzLgotICAgKi8KKyAgLy8vIFRoZSBjYWNoZSBvZiBhYnNvbHV0ZSBbVXJpXXMgdG8gW1NvdXJjZV1zIG1hcHBpbmdzLgogICBmaW5hbCBNYXA8VXJpLCBTb3VyY2U+IF9zb3VyY2VDYWNoZSA9IEhhc2hNYXA8VXJpLCBTb3VyY2U+KCk7CiAKICAgQmF6ZWxQYWNrYWdlVXJpUmVzb2x2ZXIoQmF6ZWxXb3Jrc3BhY2Ugd29ya3NwYWNlKQpAQCAtMTQ1LDQyICsxMzksMzIgQEAKICAgfQogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgQmF6ZWwgd29ya3NwYWNlLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBCYXplbCB3b3Jrc3BhY2UuCiBjbGFzcyBCYXplbFdvcmtzcGFjZSBleHRlbmRzIFdvcmtzcGFjZQogICAgIGltcGxlbWVudHMgV29ya3NwYWNlV2l0aERlZmF1bHRBbmFseXNpc09wdGlvbnMgewogICBzdGF0aWMgY29uc3QgU3RyaW5nIF9XT1JLU1BBQ0UgPSAnV09SS1NQQUNFJzsKICAgc3RhdGljIGNvbnN0IFN0cmluZyBfUkVBRE9OTFkgPSAnUkVBRE9OTFknOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlkZW50aWZpZXMgYSBzZXQgb2YgQmF6ZWwgVGFyZ2V0cy4KLSAgICoKLSAgICogRm9yIERhcnQgcGFja2FnZSBwdXJwb3NlcywgYSBCVUlMRCBmaWxlIGlkZW50aWZpZXMgYSBwYWNrYWdlLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaWRlbnRpZmllcyBhIHNldCBvZiBCYXplbCBUYXJnZXRzLgorICAvLy8KKyAgLy8vIEZvciBEYXJ0IHBhY2thZ2UgcHVycG9zZXMsIGEgQlVJTEQgZmlsZSBpZGVudGlmaWVzIGEgcGFja2FnZS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBfYnVpbGRGaWxlTmFtZSA9ICdCVUlMRCc7CiAKLSAgLyoqCi0gICAqIERlZmF1bHQgcHJlZml4IGZvciAiLWdlbmZpbGVzIiBhbmQgIi1iaW4iIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGlmIG5vIGJ1aWxkCi0gICAqIG91dHB1dCBzeW1saW5rcyBhcmUgZm91bmQuCi0gICAqLworICAvLy8gRGVmYXVsdCBwcmVmaXggZm9yICItZ2VuZmlsZXMiIGFuZCAiLWJpbiIgdGhhdCB3aWxsIGJlIGFzc3VtZWQgaWYgbm8gYnVpbGQKKyAgLy8vIG91dHB1dCBzeW1saW5rcyBhcmUgZm91bmQuCiAgIHN0YXRpYyBjb25zdCBkZWZhdWx0U3ltbGlua1ByZWZpeCA9ICdiYXplbCc7CiAKICAgZmluYWwgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlcjsKIAotICAvKioKLSAgICogVGhlIGFic29sdXRlIHdvcmtzcGFjZSByb290IHBhdGguCi0gICAqCi0gICAqIEl0IGNvbnRhaW5zIHRoZSBgV09SS1NQQUNFYCBmaWxlIG9yIGl0cyBwYXJlbnQgY29udGFpbnMgdGhlIGBSRUFET05MWWAKLSAgICogZm9sZGVyLgotICAgKi8KKyAgLy8vIFRoZSBhYnNvbHV0ZSB3b3Jrc3BhY2Ugcm9vdCBwYXRoLgorICAvLy8KKyAgLy8vIEl0IGNvbnRhaW5zIHRoZSBgV09SS1NQQUNFYCBmaWxlIG9yIGl0cyBwYXJlbnQgY29udGFpbnMgdGhlIGBSRUFET05MWWAKKyAgLy8vIGZvbGRlci4KICAgQG92ZXJyaWRlCiAgIGZpbmFsIFN0cmluZyByb290OwogCi0gIC8qKgotICAgKiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgb3B0aW9uYWwgcmVhZCBvbmx5IHdvcmtzcGFjZSByb290LCBpbiB0aGUKLSAgICogYFJFQURPTkxZYCBmb2xkZXIgaWYgYSBnaXQtYmFzZWQgd29ya3NwYWNlLCBvciBgbnVsbGAuCi0gICAqLworICAvLy8gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG9wdGlvbmFsIHJlYWQgb25seSB3b3Jrc3BhY2Ugcm9vdCwgaW4gdGhlCisgIC8vLyBgUkVBRE9OTFlgIGZvbGRlciBpZiBhIGdpdC1iYXNlZCB3b3Jrc3BhY2UsIG9yIGBudWxsYC4KICAgZmluYWwgU3RyaW5nIHJlYWRvbmx5OwogCiAgIC8vLyBUaGUgYWJzb2x1dGUgcGF0aHMgdG8gYWxsIGBiYXplbC1iaW5gIGZvbGRlcnMuCkBAIC0xODksOSArMTczLDcgQEAKICAgLy8vIG9uIGRpc3RyaWJ1dGVkIGJ1aWxkIHN5c3RlbXMuIEl0IGlzIHZlcnkgcmFyZSB0byBoYXZlIG1vcmUgdGhhbiB0d28uCiAgIGZpbmFsIExpc3Q8U3RyaW5nPiBiaW5QYXRoczsKIAotICAvKioKLSAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGBiYXplbC1nZW5maWxlc2AgZm9sZGVyLgotICAgKi8KKyAgLy8vIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBgYmF6ZWwtZ2VuZmlsZXNgIGZvbGRlci4KICAgZmluYWwgU3RyaW5nIGdlbmZpbGVzOwogCiAgIEJhemVsV29ya3NwYWNlLl8oCkBAIC0yMTcsMTMgKzE5OSwxMSBAQAogICAgIHJldHVybiBTb3VyY2VGYWN0b3J5KHJlc29sdmVycyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFthYnNvbHV0ZVBhdGhdLCBsb29raW5nIGZpcnN0IGludG8KLSAgICogZGlyZWN0b3JpZXMgZm9yIGdlbmVyYXRlZCBmaWxlczogYGJhemVsLWJpbmAgYW5kIGBiYXplbC1nZW5maWxlc2AsIGFuZAotICAgKiB0aGVuIGludG8gdGhlIHdvcmtzcGFjZSByb290LiBUaGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIHJvb3QgaXMgcmV0dXJuZWQKLSAgICogZXZlbiBpZiBpdCBkb2VzIG5vdCBleGlzdC4gUmV0dXJuIGBudWxsYCBpZiB0aGUgZ2l2ZW4gW2Fic29sdXRlUGF0aF0gaXMKLSAgICogbm90IGluIHRoZSB3b3Jrc3BhY2UgW3Jvb3RdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbYWJzb2x1dGVQYXRoXSwgbG9va2luZyBmaXJzdCBpbnRvCisgIC8vLyBkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkIGZpbGVzOiBgYmF6ZWwtYmluYCBhbmQgYGJhemVsLWdlbmZpbGVzYCwgYW5kCisgIC8vLyB0aGVuIGludG8gdGhlIHdvcmtzcGFjZSByb290LiBUaGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIHJvb3QgaXMgcmV0dXJuZWQKKyAgLy8vIGV2ZW4gaWYgaXQgZG9lcyBub3QgZXhpc3QuIFJldHVybiBgbnVsbGAgaWYgdGhlIGdpdmVuIFthYnNvbHV0ZVBhdGhdIGlzCisgIC8vLyBub3QgaW4gdGhlIHdvcmtzcGFjZSBbcm9vdF0uCiAgIEZpbGUgZmluZEZpbGUoU3RyaW5nIGFic29sdXRlUGF0aCkgewogICAgIHBhdGguQ29udGV4dCBjb250ZXh0ID0gcHJvdmlkZXIucGF0aENvbnRleHQ7CiAgICAgdHJ5IHsKQEAgLTQ1NSwxMyArNDM1LDExIEBACiAgICAgICAuZmlyc3RXaGVyZSgoZm9sZGVyKSA9PiBmb2xkZXIuZXhpc3RzLCBvckVsc2U6ICgpID0+IG51bGwpOwogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZSBkZWZpbmVkIGluIGEgQmF6ZWxXb3Jrc3BhY2UuCi0gKgotICogU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKLSAqIHVuZGVyc3RhbmQgd2hldGhlciBhcmJpdHJhcnkgZmlsZSBwYXRocyByZXByZXNlbnQgbGlicmFyaWVzIGRlY2xhcmVkIHdpdGhpbgotICogYSBnaXZlbiBwYWNrYWdlIGluIGEgQmF6ZWxXb3Jrc3BhY2UuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHBhY2thZ2UgZGVmaW5lZCBpbiBhIEJhemVsV29ya3NwYWNlLgorLy8vCisvLy8gU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKKy8vLyB1bmRlcnN0YW5kIHdoZXRoZXIgYXJiaXRyYXJ5IGZpbGUgcGF0aHMgcmVwcmVzZW50IGxpYnJhcmllcyBkZWNsYXJlZCB3aXRoaW4KKy8vLyBhIGdpdmVuIHBhY2thZ2UgaW4gYSBCYXplbFdvcmtzcGFjZS4KIGNsYXNzIEJhemVsV29ya3NwYWNlUGFja2FnZSBleHRlbmRzIFdvcmtzcGFjZVBhY2thZ2UgewogICAvLy8gQSBwcmVmaXggZm9yIGFueSBVUkkgb2YgYSBwYXRoIGluIHRoaXMgcGFja2FnZS4KICAgZmluYWwgU3RyaW5nIF91cmlQcmVmaXg7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy93b3Jrc3BhY2UvZ24uZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9nbi5kYXJ0CmluZGV4IDYyNDgyYmQuLjIzNTQxOGUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9nbi5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9nbi5kYXJ0CkBAIC0xNiwzNyArMTYsMjUgQEAKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBHbiB3b3Jrc3BhY2UuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIEduIHdvcmtzcGFjZS4KIGNsYXNzIEduV29ya3NwYWNlIGV4dGVuZHMgV29ya3NwYWNlIHsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBpZGVudGlmaWVzIHRoZSByb290IG9mIHRoZSB3b3Jrc3BhY2UuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGlkZW50aWZpZXMgdGhlIHJvb3Qgb2YgdGhlIHdvcmtzcGFjZS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBfamlyaVJvb3ROYW1lID0gJy5qaXJpX3Jvb3QnOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGlkZW50aWZpZXMgYSBzZXQgb2YgR04gVGFyZ2V0cy4KLSAgICoKLSAgICogRm9yIERhcnQgcGFja2FnZSBwdXJwb3NlcywgYSBCVUlMRC5nbiBmaWxlIGlkZW50aWZpZXMgYSBwYWNrYWdlLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaWRlbnRpZmllcyBhIHNldCBvZiBHTiBUYXJnZXRzLgorICAvLy8KKyAgLy8vIEZvciBEYXJ0IHBhY2thZ2UgcHVycG9zZXMsIGEgQlVJTEQuZ24gZmlsZSBpZGVudGlmaWVzIGEgcGFja2FnZS4KICAgc3RhdGljIGNvbnN0IFN0cmluZyBfYnVpbGRGaWxlTmFtZSA9ICdCVUlMRC5nbic7CiAKLSAgLyoqCi0gICAqIFRoZSByZXNvdXJjZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0uCi0gICAqLworICAvLy8gVGhlIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4KICAgZmluYWwgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlcjsKIAotICAvKioKLSAgICogVGhlIGFic29sdXRlIHdvcmtzcGFjZSByb290IHBhdGggKHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgYC5qaXJpX3Jvb3RgCi0gICAqIGRpcmVjdG9yeSkuCi0gICAqLworICAvLy8gVGhlIGFic29sdXRlIHdvcmtzcGFjZSByb290IHBhdGggKHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKKyAgLy8vIGAuamlyaV9yb290YCBkaXJlY3RvcnkpLgogICBAb3ZlcnJpZGUKICAgZmluYWwgU3RyaW5nIHJvb3Q7CiAKLSAgLyoqCi0gICAqIFRoZSBtYXAgZnJvbSBhIHBhY2thZ2UgbmFtZSB0byB0aGUgbGlzdCBvZiBpdHMgYGxpYi9gIGZvbGRlcnMuCi0gICAqLworICAvLy8gVGhlIG1hcCBmcm9tIGEgcGFja2FnZSBuYW1lIHRvIHRoZSBsaXN0IG9mIGl0cyBgbGliL2AgZm9sZGVycy4KICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxGb2xkZXI+PiBfcGFja2FnZU1hcDsKIAogICBHbldvcmtzcGFjZS5fKHRoaXMucHJvdmlkZXIsIHRoaXMucm9vdCwgdGhpcy5fcGFja2FnZU1hcCk7CkBAIC03MywxMSArNjEsOSBAQAogICAgIHJldHVybiBTb3VyY2VGYWN0b3J5KHJlc29sdmVycyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFthYnNvbHV0ZVBhdGhdLgotICAgKgotICAgKiBSZXR1cm4gYG51bGxgIGlmIHRoZSBnaXZlbiBbYWJzb2x1dGVQYXRoXSBpcyBub3QgaW4gdGhlIHdvcmtzcGFjZSBbcm9vdF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIFthYnNvbHV0ZVBhdGhdLgorICAvLy8KKyAgLy8vIFJldHVybiBgbnVsbGAgaWYgdGhlIGdpdmVuIFthYnNvbHV0ZVBhdGhdIGlzIG5vdCBpbiB0aGUgd29ya3NwYWNlIFtyb290XS4KICAgRmlsZSBmaW5kRmlsZShTdHJpbmcgYWJzb2x1dGVQYXRoKSB7CiAgICAgdHJ5IHsKICAgICAgIEZpbGUgd3JpdGFibGVGaWxlID0gcHJvdmlkZXIuZ2V0RmlsZShhYnNvbHV0ZVBhdGgpOwpAQCAtMTEyLDEzICs5OCwxMSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBGaW5kIHRoZSBHTiB3b3Jrc3BhY2UgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXS4KLSAgICoKLSAgICogUmV0dXJuIGBudWxsYCBpZiBhIHdvcmtzcGFjZSBjb3VsZCBub3QgYmUgZm91bmQuIEZvciBhIHdvcmtzcGFjZSB0byBiZQotICAgKiBmb3VuZCwgYm90aCBhIGAuamlyaV9yb290YCBmaWxlIG11c3QgYmUgZm91bmQsIGFuZCBhdCBsZWFzdCBvbmUgInBhY2thZ2VzIgotICAgKiBmaWxlIG11c3QgYmUgZm91bmQgaW4gW2ZpbGVQYXRoXSdzIG91dHB1dCBkaXJlY3RvcnkuCi0gICAqLworICAvLy8gRmluZCB0aGUgR04gd29ya3NwYWNlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFtmaWxlUGF0aF0uCisgIC8vLworICAvLy8gUmV0dXJuIGBudWxsYCBpZiBhIHdvcmtzcGFjZSBjb3VsZCBub3QgYmUgZm91bmQuIEZvciBhIHdvcmtzcGFjZSB0byBiZQorICAvLy8gZm91bmQsIGJvdGggYSBgLmppcmlfcm9vdGAgZmlsZSBtdXN0IGJlIGZvdW5kLCBhbmQgYXQgbGVhc3Qgb25lICJwYWNrYWdlcyIKKyAgLy8vIGZpbGUgbXVzdCBiZSBmb3VuZCBpbiBbZmlsZVBhdGhdJ3Mgb3V0cHV0IGRpcmVjdG9yeS4KICAgc3RhdGljIEduV29ya3NwYWNlIGZpbmQoUmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwgU3RyaW5nIGZpbGVQYXRoKSB7CiAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm92aWRlci5nZXRSZXNvdXJjZShmaWxlUGF0aCk7CiAgICAgaWYgKHJlc291cmNlIGlzIEZpbGUpIHsKQEAgLTE1NiwxNSArMTQwLDEzIEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEZvciBhIHNvdXJjZSBhdCBgJHJvb3QvZm9vL2JhcmAsIHRoZSBwYWNrYWdlcyBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluCi0gICAqIGAkcm9vdC9vdXQvPGRlYnVnfHJlbGVhc2U+LVhZWi9kYXJ0bGFuZy9nZW4vZm9vL2JhcmAuCi0gICAqCi0gICAqIE5vdGUgdGhhdCBpbiBzb21lIGNhc2VzIG11bHRpcGxlIC5wYWNrYWdlcyBmaWxlcyBjYW4gYmUgZm91bmQgYXQgdGhhdAotICAgKiBsb2NhdGlvbiwgZm9yIGV4YW1wbGUgaWYgdGhlIHBhY2thZ2UgY29udGFpbnMgYm90aCBhIGxpYnJhcnkgYW5kIGEgYmluYXJ5Ci0gICAqIHRhcmdldC4gRm9yIGEgY29tcGxldGUgdmlldyBvZiB0aGUgcGFja2FnZSwgYWxsIG9mIHRoZXNlIGZpbGVzIG5lZWQgdG8gYmUKLSAgICogdGFrZW4gaW50byBhY2NvdW50LgotICAgKi8KKyAgLy8vIEZvciBhIHNvdXJjZSBhdCBgJHJvb3QvZm9vL2JhcmAsIHRoZSBwYWNrYWdlcyBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluCisgIC8vLyBgJHJvb3Qvb3V0LzxkZWJ1Z3xyZWxlYXNlPi1YWVovZGFydGxhbmcvZ2VuL2Zvby9iYXJgLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpbiBzb21lIGNhc2VzIG11bHRpcGxlIC5wYWNrYWdlcyBmaWxlcyBjYW4gYmUgZm91bmQgYXQgdGhhdAorICAvLy8gbG9jYXRpb24sIGZvciBleGFtcGxlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5zIGJvdGggYSBsaWJyYXJ5IGFuZCBhIGJpbmFyeQorICAvLy8gdGFyZ2V0LiBGb3IgYSBjb21wbGV0ZSB2aWV3IG9mIHRoZSBwYWNrYWdlLCBhbGwgb2YgdGhlc2UgZmlsZXMgbmVlZCB0byBiZQorICAvLy8gdGFrZW4gaW50byBhY2NvdW50LgogICBzdGF0aWMgTGlzdDxGaWxlPiBfZmluZFBhY2thZ2VzRmlsZSgKICAgICBSZXNvdXJjZVByb3ZpZGVyIHByb3ZpZGVyLAogICAgIFN0cmluZyByb290LApAQCAtMTg4LDEzICsxNzAsMTEgQEAKICAgICAgICAgLnRvTGlzdCgpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWxkLCBvciBgbnVsbGAgaWYgaXQgY291bGQgbm90IGJlCi0gICAqIGZvdW5kLgotICAgKgotICAgKiBGaXJzdCBhdHRlbXB0cyB0byByZWFkIGEgY29uZmlnIGZpbGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLiBJZgotICAgKiB0aGF0IGZpbGUgY2Fubm90IGJlIGZvdW5kLCBsb29rcyBmb3Igc3RhbmRhcmQgb3V0cHV0IGRpcmVjdG9yeSBsb2NhdGlvbnMuCi0gICAqLworICAvLy8gUmV0dXJucyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiB0aGUgYnVpbGQsIG9yIGBudWxsYCBpZiBpdCBjb3VsZCBub3QgYmUKKyAgLy8vIGZvdW5kLgorICAvLy8KKyAgLy8vIEZpcnN0IGF0dGVtcHRzIHRvIHJlYWQgYSBjb25maWcgZmlsZSBhdCB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuIElmCisgIC8vLyB0aGF0IGZpbGUgY2Fubm90IGJlIGZvdW5kLCBsb29rcyBmb3Igc3RhbmRhcmQgb3V0cHV0IGRpcmVjdG9yeSBsb2NhdGlvbnMuCiAgIHN0YXRpYyBGb2xkZXIgX2dldE91dERpcmVjdG9yeShTdHJpbmcgcm9vdCwgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlcikgewogICAgIGNvbnN0IFN0cmluZyBmdWNoc2lhRGlyQ29uZmlnRmlsZSA9ICcuZngtYnVpbGQtZGlyJzsKIApAQCAtMjIzLDEzICsyMDMsMTEgQEAKICAgfQogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZSBkZWZpbmVkIGluIGEgR25Xb3Jrc3BhY2UuCi0gKgotICogU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKLSAqIHVuZGVyc3RhbmQgd2hldGhlciBhcmJpdHJhcnkgZmlsZSBwYXRocyByZXByZXNlbnQgbGlicmFyaWVzIGRlY2xhcmVkIHdpdGhpbgotICogYSBnaXZlbiBwYWNrYWdlIGluIGEgR25Xb3Jrc3BhY2UuCi0gKi8KKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHBhY2thZ2UgZGVmaW5lZCBpbiBhIEduV29ya3NwYWNlLgorLy8vCisvLy8gU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKKy8vLyB1bmRlcnN0YW5kIHdoZXRoZXIgYXJiaXRyYXJ5IGZpbGUgcGF0aHMgcmVwcmVzZW50IGxpYnJhcmllcyBkZWNsYXJlZCB3aXRoaW4KKy8vLyBhIGdpdmVuIHBhY2thZ2UgaW4gYSBHbldvcmtzcGFjZS4KIGNsYXNzIEduV29ya3NwYWNlUGFja2FnZSBleHRlbmRzIFdvcmtzcGFjZVBhY2thZ2UgewogICBAb3ZlcnJpZGUKICAgZmluYWwgU3RyaW5nIHJvb3Q7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy93b3Jrc3BhY2UvcGFja2FnZV9idWlsZC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL3BhY2thZ2VfYnVpbGQuZGFydAppbmRleCBlZmZjNzg0Li5kMjc0Y2NiIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy93b3Jrc3BhY2UvcGFja2FnZV9idWlsZC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS9wYWNrYWdlX2J1aWxkLmRhcnQKQEAgLTE3LDExICsxNyw5IEBACiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CiBpbXBvcnQgJ3BhY2thZ2U6eWFtbC95YW1sLmRhcnQnOwogCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYFBhY2thZ2VCdWlsZEZpbGVVcmlSZXNvbHZlcmAgcmVzb2x2ZSBgZmlsZWAgVVJJJ3MgYnkKLSAqIGZpcnN0IHJlc29sdmluZyBmaWxlIHVyaSdzIGluIHRoZSBleHBlY3RlZCB3YXksIGFuZCB0aGVuIGJ5IGxvb2tpbmcgaW4gdGhlCi0gKiBjb3JyZXNwb25kaW5nIGdlbmVyYXRlZCBkaXJlY3Rvcmllcy4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYFBhY2thZ2VCdWlsZEZpbGVVcmlSZXNvbHZlcmAgcmVzb2x2ZSBgZmlsZWAgVVJJJ3MgYnkKKy8vLyBmaXJzdCByZXNvbHZpbmcgZmlsZSB1cmkncyBpbiB0aGUgZXhwZWN0ZWQgd2F5LCBhbmQgdGhlbiBieSBsb29raW5nIGluIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzLgogY2xhc3MgUGFja2FnZUJ1aWxkRmlsZVVyaVJlc29sdmVyIGV4dGVuZHMgUmVzb3VyY2VVcmlSZXNvbHZlciB7CiAgIGZpbmFsIFBhY2thZ2VCdWlsZFdvcmtzcGFjZSB3b3Jrc3BhY2U7CiAKQEAgLTQ3LDkgKzQ1LDggQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBbVXJpUmVzb2x2ZXJdIHRoYXQgY2FuIHJlc29sdmUgYHBhY2thZ2VgIFVSSXMgaW4gW1BhY2thZ2VCdWlsZFdvcmtzcGFjZV0uCi0gKi8KKy8vLyBUaGUgW1VyaVJlc29sdmVyXSB0aGF0IGNhbiByZXNvbHZlIGBwYWNrYWdlYCBVUklzIGluCisvLy8gW1BhY2thZ2VCdWlsZFdvcmtzcGFjZV0uCiBjbGFzcyBQYWNrYWdlQnVpbGRQYWNrYWdlVXJpUmVzb2x2ZXIgZXh0ZW5kcyBVcmlSZXNvbHZlciB7CiAgIGZpbmFsIFBhY2thZ2VCdWlsZFdvcmtzcGFjZSBfd29ya3NwYWNlOwogICBmaW5hbCBVcmlSZXNvbHZlciBfbm9ybWFsVXJpUmVzb2x2ZXI7CkBAIC0xMjQsNTggKzEyMSw0MCBAQAogICB9CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBwYWNrYWdlOmJ1aWxkIHdvcmtzcGFjZS4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZTpidWlsZCB3b3Jrc3BhY2UuCiBjbGFzcyBQYWNrYWdlQnVpbGRXb3Jrc3BhY2UgZXh0ZW5kcyBXb3Jrc3BhY2UgewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGlkZW50aWZpZXMgdGhlIHJvb3Qgb2YgdGhlIHdvcmtzcGFjZS4gTm90ZSwKLSAgICogdGhlIHByZXNlbmNlIG9mIHRoaXMgZmlsZSBkb2VzIG5vdCBzaG93IHBhY2thZ2U6YnVpbGQgaXMgdXNlZC4gRm9yIHRoYXQsCi0gICAqIHRoZSBzdWJkaXJlY3RvcnkgW19kYXJ0VG9vbEJ1aWxkTmFtZV0gbXVzdCBleGlzdC4gQSBgcHViYCBzdWJkaXJlY3RvcnkKLSAgICogd2lsbCB1c3VhbGx5IGV4aXN0IGluIG5vbi1wYWNrYWdlOmJ1aWxkIHByb2plY3RzIHRvby4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9vdCBvZiB0aGUgd29ya3NwYWNlLiBOb3RlLAorICAvLy8gdGhlIHByZXNlbmNlIG9mIHRoaXMgZmlsZSBkb2VzIG5vdCBzaG93IHBhY2thZ2U6YnVpbGQgaXMgdXNlZC4gRm9yIHRoYXQsCisgIC8vLyB0aGUgc3ViZGlyZWN0b3J5IFtfZGFydFRvb2xCdWlsZE5hbWVdIG11c3QgZXhpc3QuIEEgYHB1YmAgc3ViZGlyZWN0b3J5CisgIC8vLyB3aWxsIHVzdWFsbHkgZXhpc3QgaW4gbm9uLXBhY2thZ2U6YnVpbGQgcHJvamVjdHMgdG9vLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIF9kYXJ0VG9vbFJvb3ROYW1lID0gJy5kYXJ0X3Rvb2wnOwogCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgc3ViZGlyZWN0b3J5IGluIFtfZGFydFRvb2xOYW1lXSB0aGF0IGRpc3Rpbmd1aXNoZXMgcHJvamVjdHMKLSAgICogYnVpbHQgd2l0aCBwYWNrYWdlOmJ1aWxkLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBzdWJkaXJlY3RvcnkgaW4gW19kYXJ0VG9vbE5hbWVdIHRoYXQgZGlzdGluZ3Vpc2hlcworICAvLy8gcHJvamVjdHMgYnVpbHQgd2l0aCBwYWNrYWdlOmJ1aWxkLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIF9kYXJ0VG9vbEJ1aWxkTmFtZSA9ICdidWlsZCc7CiAKLSAgLyoqCi0gICAqIFdlIHVzZSBwdWJzcGVjLnlhbWwgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgY29uc2lzdGVudCB3aXRoIGhvdwotICAgKiBwYWNrYWdlOmJ1aWxkIGRvZXMgaXQuCi0gICAqLworICAvLy8gV2UgdXNlIHB1YnNwZWMueWFtbCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSB0byBiZSBjb25zaXN0ZW50IHdpdGggaG93CisgIC8vLyBwYWNrYWdlOmJ1aWxkIGRvZXMgaXQuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgX3B1YnNwZWNOYW1lID0gJ3B1YnNwZWMueWFtbCc7CiAKLSAgLyoqCi0gICAqIFRoZSByZXNvdXJjZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgZmlsZSBzeXN0ZW0uCi0gICAqLworICAvLy8gVGhlIHJlc291cmNlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSBmaWxlIHN5c3RlbS4KICAgZmluYWwgUmVzb3VyY2VQcm92aWRlciBwcm92aWRlcjsKIAotICAvKioKLSAgICogVGhlIG1hcCBmcm9tIGEgcGFja2FnZSBuYW1lIHRvIHRoZSBsaXN0IG9mIGl0cyBgbGliL2AgZm9sZGVycy4KLSAgICovCisgIC8vLyBUaGUgbWFwIGZyb20gYSBwYWNrYWdlIG5hbWUgdG8gdGhlIGxpc3Qgb2YgaXRzIGBsaWIvYCBmb2xkZXJzLgogICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PEZvbGRlcj4+IF9wYWNrYWdlTWFwOwogCi0gIC8qKgotICAgKiBUaGUgYWJzb2x1dGUgd29ya3NwYWNlIHJvb3QgcGF0aCAodGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBgLmRhcnRfdG9vbGAKLSAgICogZGlyZWN0b3J5KS4KLSAgICovCisgIC8vLyBUaGUgYWJzb2x1dGUgd29ya3NwYWNlIHJvb3QgcGF0aCAodGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAvLy8gYC5kYXJ0X3Rvb2xgIGRpcmVjdG9yeSkuCiAgIEBvdmVycmlkZQogICBmaW5hbCBTdHJpbmcgcm9vdDsKIAotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdW5kZXIgZGV2ZWxvcG1lbnQgYXMgZGVmaW5lZCBpbiBwdWJzcGVjLnlhbWwuIFRoaXMKLSAgICogbWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YgcGFja2FnZTpidWlsZC4KLSAgICovCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB1bmRlciBkZXZlbG9wbWVudCBhcyBkZWZpbmVkIGluIHB1YnNwZWMueWFtbC4gVGhpcworICAvLy8gbWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YgcGFja2FnZTpidWlsZC4KICAgZmluYWwgU3RyaW5nIHByb2plY3RQYWNrYWdlTmFtZTsKIAotICAvKioKLSAgICogVGhlIHNpbmd1bGFyIHBhY2thZ2UgaW4gdGhpcyB3b3Jrc3BhY2UuCi0gICAqCi0gICAqIEVhY2ggInBhY2thZ2U6YnVpbGQiIHdvcmtzcGFjZSBpcyBpdHNlbGYgb25lIHBhY2thZ2UuCi0gICAqLworICAvLy8gVGhlIHNpbmd1bGFyIHBhY2thZ2UgaW4gdGhpcyB3b3Jrc3BhY2UuCisgIC8vLworICAvLy8gRWFjaCAicGFja2FnZTpidWlsZCIgd29ya3NwYWNlIGlzIGl0c2VsZiBvbmUgcGFja2FnZS4KICAgUGFja2FnZUJ1aWxkV29ya3NwYWNlUGFja2FnZSBfdGhlT25seVBhY2thZ2U7CiAKICAgUGFja2FnZUJ1aWxkV29ya3NwYWNlLl8oCkBAIC0xODUsMTUgKzE2NCwxMyBAQAogICBVcmlSZXNvbHZlciBnZXQgcGFja2FnZVVyaVJlc29sdmVyID0+IFBhY2thZ2VCdWlsZFBhY2thZ2VVcmlSZXNvbHZlcigKICAgICAgIHRoaXMsIFBhY2thZ2VNYXBVcmlSZXNvbHZlcihwcm92aWRlciwgX3BhY2thZ2VNYXApKTsKIAotICAvKioKLSAgICogRm9yIHNvbWUgcGFja2FnZSBmaWxlLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBhIHBhY2thZ2Ugc291cmNlIChpdCBjb3VsZAotICAgKiBiZSBpbiBgYmluL2AsIGB3ZWIvYCwgZXRjKSwgZmluZCB3aGVyZSBpdHMgYnVpbHQgY291bnRlcnBhcnQgd2lsbCBleGlzdCBpZgotICAgKiBpdHMgYSBnZW5lcmF0ZWQgc291cmNlLgotICAgKgotICAgKiBUbyBnZXQgYSBbYnVpbHRQYXRoXSBmb3IgYSBwYWNrYWdlIHNvdXJjZSBmaWxlIHRvIHVzZSBpbiB0aGlzIG1ldGhvZCwKLSAgICogdXNlIFtidWlsdFBhY2thZ2VTb3VyY2VQYXRoXS4gRm9yIGBiaW4vYCwgYHdlYi9gLCBldGMsIGl0IG11c3QgYmUgcmVsYXRpdmUKLSAgICogdG8gdGhlIHByb2plY3Qgcm9vdC4KLSAgICovCisgIC8vLyBGb3Igc29tZSBwYWNrYWdlIGZpbGUsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGEgcGFja2FnZSBzb3VyY2UgKGl0IGNvdWxkCisgIC8vLyBiZSBpbiBgYmluL2AsIGB3ZWIvYCwgZXRjKSwgZmluZCB3aGVyZSBpdHMgYnVpbHQgY291bnRlcnBhcnQgd2lsbCBleGlzdCBpZgorICAvLy8gaXRzIGEgZ2VuZXJhdGVkIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBUbyBnZXQgYSBbYnVpbHRQYXRoXSBmb3IgYSBwYWNrYWdlIHNvdXJjZSBmaWxlIHRvIHVzZSBpbiB0aGlzIG1ldGhvZCwKKyAgLy8vIHVzZSBbYnVpbHRQYWNrYWdlU291cmNlUGF0aF0uIEZvciBgYmluL2AsIGB3ZWIvYCwgZXRjLCBpdCBtdXN0IGJlIHJlbGF0aXZlCisgIC8vLyB0byB0aGUgcHJvamVjdCByb290LgogICBGaWxlIGJ1aWx0RmlsZShTdHJpbmcgYnVpbHRQYXRoLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICBpZiAoIV9wYWNrYWdlTWFwLmNvbnRhaW5zS2V5KHBhY2thZ2VOYW1lKSkgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC0yMDQsMTMgKzE4MSwxMSBAQAogICAgIHJldHVybiBwcm92aWRlci5nZXRGaWxlKGZ1bGxCdWlsdFBhdGgpOwogICB9CiAKLSAgLyoqCi0gICAqIFVubGlrZSB0aGUgd2F5IHRoYXQgc291cmNlcyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCBgLnBhY2thZ2VzYCAoaWYgZm9vIHBvaW50cwotICAgKiB0byBmb2xkZXIgYmFyLCB0aGVuIGBmb286YmF6LmRhcnRgIGlzIGZvdW5kIGF0IGBiYXIvYmF6LmRhcnRgKSwgdGhlIGJ1aWx0Ci0gICAqIHNvdXJjZXMgZm9yIGEgcGFja2FnZSByZXF1aXJlIHRoZSBgbGliL2AgcHJlZml4IGZpcnN0LiBUaGlzIGlzIGJlY2F1c2UKLSAgICogYGJpbi9gLCBgd2ViL2AsIGFuZCBgdGVzdC9gIGV0YyBjYW4gYWxsIGJlIGJ1aWx0IGFzIHdlbGwuIFRoaXMgbWV0aG9kCi0gICAqIGV4aXN0cyB0byBnaXZlIGEgbmFtZSB0byB0aGF0IHByZWZpeCBwcm9jZXNzaW5nIHN0ZXAuCi0gICAqLworICAvLy8gVW5saWtlIHRoZSB3YXkgdGhhdCBzb3VyY2VzIGFyZSByZXNvbHZlZCBhZ2FpbnN0IGAucGFja2FnZXNgIChpZiBmb28KKyAgLy8vIHBvaW50cyB0byBmb2xkZXIgYmFyLCB0aGVuIGBmb286YmF6LmRhcnRgIGlzIGZvdW5kIGF0IGBiYXIvYmF6LmRhcnRgKSwgdGhlCisgIC8vLyBidWlsdCBzb3VyY2VzIGZvciBhIHBhY2thZ2UgcmVxdWlyZSB0aGUgYGxpYi9gIHByZWZpeCBmaXJzdC4gVGhpcyBpcworICAvLy8gYmVjYXVzZSBgYmluL2AsIGB3ZWIvYCwgYW5kIGB0ZXN0L2AgZXRjIGNhbiBhbGwgYmUgYnVpbHQgYXMgd2VsbC4gVGhpcworICAvLy8gbWV0aG9kIGV4aXN0cyB0byBnaXZlIGEgbmFtZSB0byB0aGF0IHByZWZpeCBwcm9jZXNzaW5nIHN0ZXAuCiAgIFN0cmluZyBidWlsdFBhY2thZ2VTb3VyY2VQYXRoKFN0cmluZyBmaWxlUGF0aCkgewogICAgIHBhdGguQ29udGV4dCBjb250ZXh0ID0gcHJvdmlkZXIucGF0aENvbnRleHQ7CiAgICAgYXNzZXJ0KGNvbnRleHQuaXNSZWxhdGl2ZShmaWxlUGF0aCksICdOb3QgYSByZWxhdGl2ZSBwYXRoOiAkZmlsZVBhdGgnKTsKQEAgLTIzMiwxNCArMjA3LDEyIEBACiAgICAgcmV0dXJuIFNvdXJjZUZhY3RvcnkocmVzb2x2ZXJzKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSwgbG9va2luZyBmaXJzdCBpbiB0aGUgZ2VuZXJhdGVkCi0gICAqIGRpcmVjdG9yeSBgLmRhcnRfdG9vbC9idWlsZC9nZW5lcmF0ZWQvJHByb2plY3RQYWNrYWdlTmFtZS9gLCB0aGVuIGluCi0gICAqIHNvdXJjZSBkaXJlY3Rvcmllcy4KLSAgICoKLSAgICogVGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBbcm9vdF0gaXMgcmV0dXJuZWQgZXZlbiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICogUmV0dXJuIGBudWxsYCBpZiB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSBpcyBub3QgaW4gdGhlIHdvcmtzcGFjZSByb290LgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBbZmlsZVBhdGhdLCBsb29raW5nIGZpcnN0IGluIHRoZSBnZW5lcmF0ZWQKKyAgLy8vIGRpcmVjdG9yeSBgLmRhcnRfdG9vbC9idWlsZC9nZW5lcmF0ZWQvJHByb2plY3RQYWNrYWdlTmFtZS9gLCB0aGVuIGluCisgIC8vLyBzb3VyY2UgZGlyZWN0b3JpZXMuCisgIC8vLworICAvLy8gVGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBbcm9vdF0gaXMgcmV0dXJuZWQgZXZlbiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgLy8vIFJldHVybiBgbnVsbGAgaWYgdGhlIGdpdmVuIFtmaWxlUGF0aF0gaXMgbm90IGluIHRoZSB3b3Jrc3BhY2Ugcm9vdC4KICAgRmlsZSBmaW5kRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKICAgICBwYXRoLkNvbnRleHQgY29udGV4dCA9IHByb3ZpZGVyLnBhdGhDb250ZXh0OwogICAgIGFzc2VydChjb250ZXh0LmlzQWJzb2x1dGUoZmlsZVBhdGgpLCAnTm90IGFuIGFic29sdXRlIHBhdGg6ICRmaWxlUGF0aCcpOwpAQCAtMjY5LDExICsyNDIsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBGaW5kIHRoZSBwYWNrYWdlOmJ1aWxkIHdvcmtzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBbZmlsZVBhdGhdLgotICAgKgotICAgKiBSZXR1cm4gYG51bGxgIGlmIHRoZSBmaWxlUGF0aCBpcyBub3QgaW4gYSBwYWNrYWdlOmJ1aWxkIHdvcmtzcGFjZS4KLSAgICovCisgIC8vLyBGaW5kIHRoZSBwYWNrYWdlOmJ1aWxkIHdvcmtzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBbZmlsZVBhdGhdLgorICAvLy8KKyAgLy8vIFJldHVybiBgbnVsbGAgaWYgdGhlIGZpbGVQYXRoIGlzIG5vdCBpbiBhIHBhY2thZ2U6YnVpbGQgd29ya3NwYWNlLgogICBzdGF0aWMgUGFja2FnZUJ1aWxkV29ya3NwYWNlIGZpbmQoUmVzb3VyY2VQcm92aWRlciBwcm92aWRlciwKICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Rm9sZGVyPj4gcGFja2FnZU1hcCwgU3RyaW5nIGZpbGVQYXRoKSB7CiAgICAgRm9sZGVyIGZvbGRlciA9IHByb3ZpZGVyLmdldEZvbGRlcihmaWxlUGF0aCk7CkBAIC0zMDUsMTMgKzI3NiwxMSBAQAogICB9CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBwYWNrYWdlIGRlZmluZWQgaW4gYSBQYWNrYWdlQnVpbGRXb3Jrc3BhY2UuCi0gKgotICogU2VwYXJhdGUgZnJvbSBbUGFja2FnZXNdIG9yIHBhY2thZ2UgbWFwcywgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBzaW1wbHkKLSAqIHVuZGVyc3RhbmQgd2hldGhlciBhcmJpdHJhcnkgZmlsZSBwYXRocyByZXByZXNlbnQgbGlicmFyaWVzIGRlY2xhcmVkIHdpdGhpbgotICogYSBnaXZlbiBwYWNrYWdlIGluIGEgUGFja2FnZUJ1aWxkV29ya3NwYWNlLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBwYWNrYWdlIGRlZmluZWQgaW4gYSBQYWNrYWdlQnVpbGRXb3Jrc3BhY2UuCisvLy8KKy8vLyBTZXBhcmF0ZSBmcm9tIFtQYWNrYWdlc10gb3IgcGFja2FnZSBtYXBzLCB0aGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHNpbXBseQorLy8vIHVuZGVyc3RhbmQgd2hldGhlciBhcmJpdHJhcnkgZmlsZSBwYXRocyByZXByZXNlbnQgbGlicmFyaWVzIGRlY2xhcmVkIHdpdGhpbgorLy8vIGEgZ2l2ZW4gcGFja2FnZSBpbiBhIFBhY2thZ2VCdWlsZFdvcmtzcGFjZS4KIGNsYXNzIFBhY2thZ2VCdWlsZFdvcmtzcGFjZVBhY2thZ2UgZXh0ZW5kcyBXb3Jrc3BhY2VQYWNrYWdlIHsKICAgQG92ZXJyaWRlCiAgIGZpbmFsIFN0cmluZyByb290OwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL3dvcmtzcGFjZS5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvd29ya3NwYWNlL3dvcmtzcGFjZS5kYXJ0CmluZGV4IDUxYjY3YjMuLjViNjRlMTAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL3dvcmtzcGFjZS93b3Jrc3BhY2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy93b3Jrc3BhY2Uvd29ya3NwYWNlLmRhcnQKQEAgLTcsNTAgKzcsMzYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9wYWNrYWdlX2J1bmRsZV9yZWFkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3dvcmtzcGFjZS9iYXplbC5kYXJ0JzsKIAotLyoqCi0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3Jrc3BhY2UKLSAqIGluIHdoaWNoIGFuYWx5c2lzIGlzIGJlaW5nIHBlcmZvcm1lZC4KLSAqLworLy8vIEFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyB0aGF0IHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcmtzcGFjZQorLy8vIGluIHdoaWNoIGFuYWx5c2lzIGlzIGJlaW5nIHBlcmZvcm1lZC4KIGFic3RyYWN0IGNsYXNzIFdvcmtzcGFjZSB7Ci0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZmYgdGhpcyBbV29ya3NwYWNlXSBpcyBhIFtCYXplbFdvcmtzcGFjZV0uCi0gICAqLworICAvLy8gUmV0dXJuIHRydWUgaWZmIHRoaXMgW1dvcmtzcGFjZV0gaXMgYSBbQmF6ZWxXb3Jrc3BhY2VdLgogICBib29sIGdldCBpc0JhemVsID0+IGZhbHNlOwogCi0gIC8qKgotICAgKiBUaGUgW1VyaVJlc29sdmVyXSB0aGF0IGNhbiByZXNvbHZlIGBwYWNrYWdlYCBVUklzLgotICAgKi8KKyAgLy8vIFRoZSBbVXJpUmVzb2x2ZXJdIHRoYXQgY2FuIHJlc29sdmUgYHBhY2thZ2VgIFVSSXMuCiAgIFVyaVJlc29sdmVyIGdldCBwYWNrYWdlVXJpUmVzb2x2ZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBhYnNvbHV0ZSB3b3Jrc3BhY2Ugcm9vdCBwYXRoLgotICAgKi8KKyAgLy8vIFRoZSBhYnNvbHV0ZSB3b3Jrc3BhY2Ugcm9vdCBwYXRoLgogICBTdHJpbmcgZ2V0IHJvb3Q7CiAKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgc291cmNlIGZhY3RvcnkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXNvbHZlIFVyaXMgdG8gW1NvdXJjZV1zLgotICAgKiBUaGUgW3Nka10gbWF5IGJlIGBudWxsYC4gVGhlIFtzdW1tYXJ5RGF0YV0gY2FuIGFsc28gYmUgYG51bGxgLgotICAgKi8KKyAgLy8vIENyZWF0ZSB0aGUgc291cmNlIGZhY3RvcnkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXNvbHZlIFVyaXMgdG8KKyAgLy8vIFtTb3VyY2Vdcy4gVGhlIFtzZGtdIG1heSBiZSBgbnVsbGAuIFRoZSBbc3VtbWFyeURhdGFdIGNhbiBhbHNvIGJlIGBudWxsYC4KICAgU291cmNlRmFjdG9yeSBjcmVhdGVTb3VyY2VGYWN0b3J5KERhcnRTZGsgc2RrLCBTdW1tYXJ5RGF0YVN0b3JlIHN1bW1hcnlEYXRhKTsKIAotICAvKioKLSAgICogRmluZCB0aGUgW1dvcmtzcGFjZVBhY2thZ2VdIHdoZXJlIHRoZSBsaWJyYXJ5IGF0IFtwYXRoXSBpcyBkZWZpbmVkLgotICAgKgotICAgKiBTZXBhcmF0ZSBmcm9tIFtQYWNrYWdlc10gb3IgW3BhY2thZ2VNYXBdLCB0aGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBmaW5kCi0gICAqIHRoZSBwYWNrYWdlLCBieSBpdHMgcm9vdCwgaW4gd2hpY2ggYSBsaWJyYXJ5IGF0IGFuIGFyYml0cmFyeSBwYXRoIGlzCi0gICAqIGRlZmluZWQuCi0gICAqLworICAvLy8gRmluZCB0aGUgW1dvcmtzcGFjZVBhY2thZ2VdIHdoZXJlIHRoZSBsaWJyYXJ5IGF0IFtwYXRoXSBpcyBkZWZpbmVkLgorICAvLy8KKyAgLy8vIFNlcGFyYXRlIGZyb20gW1BhY2thZ2VzXSBvciBbcGFja2FnZU1hcF0sIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGZpbmQKKyAgLy8vIHRoZSBwYWNrYWdlLCBieSBpdHMgcm9vdCwgaW4gd2hpY2ggYSBsaWJyYXJ5IGF0IGFuIGFyYml0cmFyeSBwYXRoIGlzCisgIC8vLyBkZWZpbmVkLgogICBXb3Jrc3BhY2VQYWNrYWdlIGZpbmRQYWNrYWdlRm9yKFN0cmluZyBwYXRoKTsKIH0KIAotLyoqCi0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZQotICogZGVmaW5lZCBpbiBhIFdvcmtzcGFjZS4KLSAqCi0gKiBTZXBhcmF0ZSBmcm9tIFtQYWNrYWdlc10gb3IgcGFja2FnZSBtYXBzLCB0aGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHNpbXBseQotICogdW5kZXJzdGFuZCB3aGV0aGVyIGFyYml0cmFyeSBmaWxlIHBhdGhzIHJlcHJlc2VudCBsaWJyYXJpZXMgZGVjbGFyZWQgd2l0aGluCi0gKiBhIGdpdmVuIHBhY2thZ2UgaW4gYSBXb3Jrc3BhY2UuCi0gKi8KKy8vLyBBYnN0cmFjdCBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZQorLy8vIGRlZmluZWQgaW4gYSBXb3Jrc3BhY2UuCisvLy8KKy8vLyBTZXBhcmF0ZSBmcm9tIFtQYWNrYWdlc10gb3IgcGFja2FnZSBtYXBzLCB0aGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHNpbXBseQorLy8vIHVuZGVyc3RhbmQgd2hldGhlciBhcmJpdHJhcnkgZmlsZSBwYXRocyByZXByZXNlbnQgbGlicmFyaWVzIGRlY2xhcmVkIHdpdGhpbgorLy8vIGEgZ2l2ZW4gcGFja2FnZSBpbiBhIFdvcmtzcGFjZS4KIGFic3RyYWN0IGNsYXNzIFdvcmtzcGFjZVBhY2thZ2UgewogICBTdHJpbmcgZ2V0IHJvb3Q7CiAKQEAgLTcyLDIwICs1OCwxNCBAQAogICB9CiB9CiAKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHdvcmtzcGFjZSB0aGF0IGNvbnRhaW5zIGEgZGVmYXVsdCBhbmFseXNpcyBvcHRpb25zIGZpbGUuCi0gKiBDbGFzc2VzIHRoYXQgcHJvdmlkZSBpbmZvcm1hdGlvbiBvZiBzdWNoIGEgd29ya3NwYWNlIHNob3VsZCBpbXBsZW1lbnQgdGhpcwotICogaW50ZXJmYWNlLgotICovCisvLy8gQW4gaW50ZXJmYWNlIGZvciBhIHdvcmtzcGFjZSB0aGF0IGNvbnRhaW5zIGEgZGVmYXVsdCBhbmFseXNpcyBvcHRpb25zIGZpbGUuCisvLy8gQ2xhc3NlcyB0aGF0IHByb3ZpZGUgaW5mb3JtYXRpb24gb2Ygc3VjaCBhIHdvcmtzcGFjZSBzaG91bGQgaW1wbGVtZW50IHRoaXMKKy8vLyBpbnRlcmZhY2UuCiBjbGFzcyBXb3Jrc3BhY2VXaXRoRGVmYXVsdEFuYWx5c2lzT3B0aW9ucyB7Ci0gIC8qKgotICAgKiBUaGUgdXJpIGZvciB0aGUgZGVmYXVsdCBhbmFseXNpcyBvcHRpb25zIGZpbGUuCi0gICAqLworICAvLy8gVGhlIHVyaSBmb3IgdGhlIGRlZmF1bHQgYW5hbHlzaXMgb3B0aW9ucyBmaWxlLgogICBzdGF0aWMgY29uc3QgU3RyaW5nIHVyaSA9ICdwYWNrYWdlOmRhcnQuYW5hbHlzaXNfb3B0aW9ucy9kZWZhdWx0LnlhbWwnOwogCi0gIC8qKgotICAgKiAgVGhlIHVyaSBmb3IgdGhpcmRfcGFydHkgYW5hbHlzaXMgb3B0aW9ucyBmaWxlLgotICAgKi8KKyAgLy8vICBUaGUgdXJpIGZvciB0aGlyZF9wYXJ0eSBhbmFseXNpcyBvcHRpb25zIGZpbGUuCiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgdGhpcmRQYXJ0eVVyaSA9CiAgICAgICAncGFja2FnZTpkYXJ0LmFuYWx5c2lzX29wdGlvbnMvdGhpcmRfcGFydHkueWFtbCc7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvcHVic3BlYy55YW1sIGIvcGtnL2FuYWx5emVyL3B1YnNwZWMueWFtbAppbmRleCA1MzNjNzVkLi40MDQ0ZmY4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvcHVic3BlYy55YW1sCisrKyBiL3BrZy9hbmFseXplci9wdWJzcGVjLnlhbWwKQEAgLTEsNSArMSw1IEBACiBuYW1lOiBhbmFseXplcgotdmVyc2lvbjogMC4zOS4xMS1kZXYKK3ZlcnNpb246IDAuMzkuMTMtZGV2CiBkZXNjcmlwdGlvbjogVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgbGlicmFyeSB0aGF0IHBlcmZvcm1zIHN0YXRpYyBhbmFseXNpcyBvZiBEYXJ0IGNvZGUuCiBob21lcGFnZTogaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvdHJlZS9tYXN0ZXIvcGtnL2FuYWx5emVyCiAKQEAgLTcsNyArNyw3IEBACiAgIHNkazogJz49Mi42LjAgPDMuMC4wJwogCiBkZXBlbmRlbmNpZXM6Ci0gIF9mZV9hbmFseXplcl9zaGFyZWQ6IF40LjAuMAorICBfZmVfYW5hbHl6ZXJfc2hhcmVkOiBeNS4wLjAKICAgYXJnczogXjEuMC4wCiAgIGNoYXJjb2RlOiBeMS4xLjAKICAgY29sbGVjdGlvbjogXjEuMTAuMQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hbmFseXNpcy9mcm9tX2Vudmlyb25tZW50X2V2YWx1YXRvcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9kYXJ0L2FuYWx5c2lzL2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yX3Rlc3QuZGFydAppbmRleCA1ZmYxMDQyLi44ZmYyNzgzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9kYXJ0L2FuYWx5c2lzL2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9kYXJ0L2FuYWx5c2lzL2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yX3Rlc3QuZGFydApAQCAtNiwxNCArNiwxNCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2NvbnN0YW50L2Zyb21fZW52aXJvbm1lbnRfZXZhbHVhdG9yLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKIGltcG9ydCAnLi4vLi4vZ2VuZXJhdGVkL3Rlc3RfYW5hbHlzaXNfY29udGV4dC5kYXJ0JzsKIAotbWFpbigpIHsKK3ZvaWQgbWFpbigpIHsKICAgZGVmaW5lUmVmbGVjdGl2ZVN1aXRlKCgpIHsKICAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoRnJvbUVudmlyb25tZW50RXZhbHVhdG9yVGVzdCk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hc3QvYXN0X3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2RhcnQvYXN0L2FzdF90ZXN0LmRhcnQKaW5kZXggYzI0M2EwOC4uM2ZkZmFiMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hc3QvYXN0X3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9kYXJ0L2FzdC9hc3RfdGVzdC5kYXJ0CkBAIC0xMDUzLDEyICsxMDUzLDExIEBACiAgICAgcmV0dXJuIGlkZW50aWZpZXI7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB0b3AtbW9zdCBub2RlIGluIHRoZSBBU1Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGlkZW50aWZpZXIuCi0gICAqCi0gICAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBpZGVudGlmaWVyIGluIHRoZSBBU1Qgc3RydWN0dXJlIGJlaW5nIHRyYXZlcnNlZAotICAgKiBAcmV0dXJuIHRoZSByb290IG9mIHRoZSBBU1Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGlkZW50aWZpZXIKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHRvcC1tb3N0IG5vZGUgaW4gdGhlIEFTVCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZ2l2ZW4KKyAgLy8vIGlkZW50aWZpZXIuCisgIC8vLworICAvLy8gQHBhcmFtIGlkZW50aWZpZXIgdGhlIGlkZW50aWZpZXIgaW4gdGhlIEFTVCBzdHJ1Y3R1cmUgYmVpbmcgdHJhdmVyc2VkCisgIC8vLyBAcmV0dXJuIHRoZSByb290IG9mIHRoZSBBU1Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGlkZW50aWZpZXIKICAgQXN0Tm9kZSBfdG9wTW9zdE5vZGUoU2ltcGxlSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CiAgICAgQXN0Tm9kZSBjaGlsZCA9IGlkZW50aWZpZXI7CiAgICAgQXN0Tm9kZSBwYXJlbnQgPSBpZGVudGlmaWVyLnBhcmVudDsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2RhcnQvYXN0L3Zpc2l0b3JfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hc3QvdmlzaXRvcl90ZXN0LmRhcnQKaW5kZXggNmI1MjRmZS4uOWExNDczMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hc3QvdmlzaXRvcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZGFydC9hc3QvdmlzaXRvcl90ZXN0LmRhcnQKQEAgLTUyLDEwICs1Miw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyB1c2VkIHRvIGNvbGxlY3QgdGhlIG5vZGVzIHRoYXQgd2VyZSB2aXNpdGVkIGFuZCB0byBwcmVzZXJ2ZQotICogdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSB2aXNpdGVkLgotICovCisvLy8gQSBoZWxwZXIgY2xhc3MgdXNlZCB0byBjb2xsZWN0IHRoZSBub2RlcyB0aGF0IHdlcmUgdmlzaXRlZCBhbmQgdG8gcHJlc2VydmUKKy8vLyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHZpc2l0ZWQuCiBjbGFzcyBfQnJlYWR0aEZpcnN0VmlzaXRvclRlc3RIZWxwZXIgZXh0ZW5kcyBCcmVhZHRoRmlyc3RWaXNpdG9yPHZvaWQ+IHsKICAgTGlzdDxBc3ROb2RlPiBub2RlczsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZmlsZV9zeXN0ZW0vZmlsZV9zeXN0ZW1fdGVzdF9zdXBwb3J0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV90ZXN0X3N1cHBvcnQuZGFydAppbmRleCAxOWVjMjAxLi45ZmNiMzExIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV90ZXN0X3N1cHBvcnQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9maWxlX3N5c3RlbV90ZXN0X3N1cHBvcnQuZGFydApAQCAtNjE3LDkgKzYxNyw3IEBACiAgICAgZXhwZWN0KGZvbGRlci50b1VyaSgpLCBVcmkuZGlyZWN0b3J5KGRlZmF1bHRGb2xkZXJQYXRoKSk7CiAgIH0KIAotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIFtjb3B5XSBoYXMgdGhlIHNhbWUgbmFtZSBhbmQgY29udGVudCBhcyB0aGUgW3NvdXJjZV0uCi0gICAqLworICAvLy8gVmVyaWZ5IHRoYXQgdGhlIFtjb3B5XSBoYXMgdGhlIHNhbWUgbmFtZSBhbmQgY29udGVudCBhcyB0aGUgW3NvdXJjZV0uCiAgIHZvaWQgX3ZlcmlmeVN0cnVjdHVyZShGb2xkZXIgY29weSwgRm9sZGVyIHNvdXJjZSkgewogICAgIGV4cGVjdChjb3B5LnNob3J0TmFtZSwgc291cmNlLnNob3J0TmFtZSk7CiAgICAgTWFwPFN0cmluZywgRmlsZT4gc291cmNlRmlsZXMgPSA8U3RyaW5nLCBGaWxlPnt9OwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZmlsZV9zeXN0ZW0vb3ZlcmxheV9maWxlX3N5c3RlbV90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9vdmVybGF5X2ZpbGVfc3lzdGVtX3Rlc3QuZGFydAppbmRleCA5NTJmNWYzLi5lM2JiNzNkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9vdmVybGF5X2ZpbGVfc3lzdGVtX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9maWxlX3N5c3RlbS9vdmVybGF5X2ZpbGVfc3lzdGVtX3Rlc3QuZGFydApAQCAtNjMxLDkgKzYzMSw3IEBACiAgICAgZXhwZWN0KGZvbGRlci5yZXNvbHZlU3ltYm9saWNMaW5rc1N5bmMoKSwgZm9sZGVyKTsKICAgfQogCi0gIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgW2NvcHldIGhhcyB0aGUgc2FtZSBuYW1lIGFuZCBjb250ZW50IGFzIHRoZSBbc291cmNlXS4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgW2NvcHldIGhhcyB0aGUgc2FtZSBuYW1lIGFuZCBjb250ZW50IGFzIHRoZSBbc291cmNlXS4KICAgdm9pZCBfdmVyaWZ5U3RydWN0dXJlKEZvbGRlciBjb3B5LCBGb2xkZXIgc291cmNlKSB7CiAgICAgZXhwZWN0KGNvcHkuc2hvcnROYW1lLCBzb3VyY2Uuc2hvcnROYW1lKTsKICAgICBNYXA8U3RyaW5nLCBGaWxlPiBzb3VyY2VGaWxlcyA9IDxTdHJpbmcsIEZpbGU+e307CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvZWxlbWVudF9yZXNvbHZlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvZWxlbWVudF9yZXNvbHZlcl90ZXN0LmRhcnQKaW5kZXggMmRmMjUyOS4uMDYzNjM5NyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2VsZW1lbnRfcmVzb2x2ZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9lbGVtZW50X3Jlc29sdmVyX3Rlc3QuZGFydApAQCAtMTMsNiArMTMsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF9yZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOwpAQCAtMjk3LDI5ICsyOTgsMTkgQEAKIAogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBFbGVtZW50UmVzb2x2ZXJUZXN0IHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluLCBFbGVtZW50c1R5cGVzTWl4aW4gewotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkLgotICAgKi8KKyAgLy8vIFRoZSBlcnJvciBsaXN0ZW5lciB0byB3aGljaCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KICAgR2F0aGVyaW5nRXJyb3JMaXN0ZW5lciBfbGlzdGVuZXI7CiAKLSAgLyoqCi0gICAqIFRoZSB0eXBlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIHRoZSB0eXBlcy4KLSAgICovCisgIC8vLyBUaGUgdHlwZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgdHlwZXMuCiAgIFR5cGVQcm92aWRlciBfdHlwZVByb3ZpZGVyOwogCi0gIC8qKgotICAgKiBUaGUgbGlicmFyeSBjb250YWluaW5nIHRoZSBjb2RlIGJlaW5nIHJlc29sdmVkLgotICAgKi8KKyAgLy8vIFRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGNvZGUgYmVpbmcgcmVzb2x2ZWQuCiAgIExpYnJhcnlFbGVtZW50SW1wbCBfZGVmaW5pbmdMaWJyYXJ5OwogCi0gIC8qKgotICAgKiBUaGUgcmVzb2x2ZXIgdmlzaXRvciB0aGF0IG1haW50YWlucyB0aGUgc3RhdGUgZm9yIHRoZSByZXNvbHZlci4KLSAgICovCisgIC8vLyBUaGUgcmVzb2x2ZXIgdmlzaXRvciB0aGF0IG1haW50YWlucyB0aGUgc3RhdGUgZm9yIHRoZSByZXNvbHZlci4KICAgUmVzb2x2ZXJWaXNpdG9yIF92aXNpdG9yOwogCi0gIC8qKgotICAgKiBUaGUgcmVzb2x2ZXIgYmVpbmcgdXNlZCB0byByZXNvbHZlIHRoZSB0ZXN0IGNhc2VzLgotICAgKi8KKyAgLy8vIFRoZSByZXNvbHZlciBiZWluZyB1c2VkIHRvIHJlc29sdmUgdGhlIHRlc3QgY2FzZXMuCiAgIEVsZW1lbnRSZXNvbHZlciBfcmVzb2x2ZXI7CiAKICAgQG92ZXJyaWRlCkBAIC05NjAsOSArOTUxLDcgQEAKICAgICBfbGlzdGVuZXIuYXNzZXJ0Tm9FcnJvcnMoKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgYW5kIHJldHVybiB0aGUgcmVzb2x2ZXIgdXNlZCBieSB0aGUgdGVzdHMuCi0gICAqLworICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHJlc29sdmVyIHVzZWQgYnkgdGhlIHRlc3RzLgogICB2b2lkIF9jcmVhdGVSZXNvbHZlcigpIHsKICAgICB2YXIgY29udGV4dCA9IFRlc3RBbmFseXNpc0NvbnRleHQoKTsKICAgICBfdHlwZVByb3ZpZGVyID0gY29udGV4dC50eXBlUHJvdmlkZXJMZWdhY3k7CkBAIC05OTEsNTYgKzk4MCw1MCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYWJlbCBvZiBbc3RhdGVtZW50XSBhZnRlciB0aGUKLSAgICogcmVzb2x2ZXIgaGFzIHJlc29sdmVkIGl0LiAgW2xhYmVsRWxlbWVudF0gaXMgdGhlIGxhYmVsIGVsZW1lbnQgdG8gYmUKLSAgICogZGVmaW5lZCBpbiB0aGUgc3RhdGVtZW50J3MgbGFiZWwgc2NvcGUsIGFuZCBbbGFiZWxUYXJnZXRdIGlzIHRoZSBzdGF0ZW1lbnQKLSAgICogdGhlIGxhYmVsIHJlc29sdmVzIHRvLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsIG9mIFtzdGF0ZW1lbnRdIGFmdGVyIHRoZQorICAvLy8gcmVzb2x2ZXIgaGFzIHJlc29sdmVkIGl0LiAgW2xhYmVsRWxlbWVudF0gaXMgdGhlIGxhYmVsIGVsZW1lbnQgdG8gYmUKKyAgLy8vIGRlZmluZWQgaW4gdGhlIHN0YXRlbWVudCdzIGxhYmVsIHNjb3BlLCBhbmQgW2xhYmVsVGFyZ2V0XSBpcyB0aGUgc3RhdGVtZW50CisgIC8vLyB0aGUgbGFiZWwgcmVzb2x2ZXMgdG8uCiAgIEVsZW1lbnQgX3Jlc29sdmVCcmVhayhCcmVha1N0YXRlbWVudCBzdGF0ZW1lbnQsIExhYmVsRWxlbWVudEltcGwgbGFiZWxFbGVtZW50LAogICAgICAgU3RhdGVtZW50IGxhYmVsVGFyZ2V0KSB7CiAgICAgX3Jlc29sdmVTdGF0ZW1lbnQoc3RhdGVtZW50LCBsYWJlbEVsZW1lbnQsIGxhYmVsVGFyZ2V0KTsKICAgICByZXR1cm4gc3RhdGVtZW50LmxhYmVsLnN0YXRpY0VsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFiZWwgW3N0YXRlbWVudF0gYWZ0ZXIgdGhlCi0gICAqIHJlc29sdmVyIGhhcyByZXNvbHZlZCBpdC4gIFtsYWJlbEVsZW1lbnRdIGlzIHRoZSBsYWJlbCBlbGVtZW50IHRvIGJlCi0gICAqIGRlZmluZWQgaW4gdGhlIHN0YXRlbWVudCdzIGxhYmVsIHNjb3BlLCBhbmQgW2xhYmVsVGFyZ2V0XSBpcyB0aGUgQVNUIG5vZGUKLSAgICogdGhlIGxhYmVsIHJlc29sdmVzIHRvLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSBzdGF0ZW1lbnQgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIGxhYmVsRWxlbWVudCB0aGUgbGFiZWwgZWxlbWVudCB0byBiZSBkZWZpbmVkIGluIHRoZSBzdGF0ZW1lbnQncyBsYWJlbCBzY29wZQotICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGF0ZW1lbnQncyBsYWJlbCB3YXMgcmVzb2x2ZWQKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYWJlbCBbc3RhdGVtZW50XSBhZnRlciB0aGUKKyAgLy8vIHJlc29sdmVyIGhhcyByZXNvbHZlZCBpdC4gIFtsYWJlbEVsZW1lbnRdIGlzIHRoZSBsYWJlbCBlbGVtZW50IHRvIGJlCisgIC8vLyBkZWZpbmVkIGluIHRoZSBzdGF0ZW1lbnQncyBsYWJlbCBzY29wZSwgYW5kIFtsYWJlbFRhcmdldF0gaXMgdGhlIEFTVCBub2RlCisgIC8vLyB0aGUgbGFiZWwgcmVzb2x2ZXMgdG8uCisgIC8vLworICAvLy8gQHBhcmFtIHN0YXRlbWVudCB0aGUgc3RhdGVtZW50IHRvIGJlIHJlc29sdmVkCisgIC8vLyBAcGFyYW0gbGFiZWxFbGVtZW50IHRoZSBsYWJlbCBlbGVtZW50IHRvIGJlIGRlZmluZWQgaW4gdGhlIHN0YXRlbWVudCdzCisgIC8vLyAgICAgICAgICBsYWJlbCBzY29wZQorICAvLy8gQHJldHVybiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc3RhdGVtZW50J3MgbGFiZWwgd2FzIHJlc29sdmVkCiAgIEVsZW1lbnQgX3Jlc29sdmVDb250aW51ZShDb250aW51ZVN0YXRlbWVudCBzdGF0ZW1lbnQsCiAgICAgICBMYWJlbEVsZW1lbnRJbXBsIGxhYmVsRWxlbWVudCwgQXN0Tm9kZSBsYWJlbFRhcmdldCkgewogICAgIF9yZXNvbHZlU3RhdGVtZW50KHN0YXRlbWVudCwgbGFiZWxFbGVtZW50LCBsYWJlbFRhcmdldCk7CiAgICAgcmV0dXJuIHN0YXRlbWVudC5sYWJlbC5zdGF0aWNFbGVtZW50OwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIHJlc29sdmVyIGhhcyByZXNvbHZlZCB0aGUKLSAgICogaWRlbnRpZmllci4KLSAgICoKLSAgICogQHBhcmFtIG5vZGUgdGhlIGV4cHJlc3Npb24gdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIGRlZmluZWRFbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgdG8gYmUgZGVmaW5lZCBpbiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhlIGVsZW1lbnQgaXMKLSAgICogICAgICAgICAgYmVpbmcgcmVzb2x2ZWQKLSAgICogQHJldHVybiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiB3YXMgcmVzb2x2ZWQKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFmdGVyIHRoZSByZXNvbHZlcgorICAvLy8gaGFzIHJlc29sdmVkIHRoZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIEBwYXJhbSBub2RlIHRoZSBleHByZXNzaW9uIHRvIGJlIHJlc29sdmVkCisgIC8vLyBAcGFyYW0gZGVmaW5lZEVsZW1lbnRzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBkZWZpbmVkIGluIHRoZSBzY29wZSBpbgorICAvLy8gICAgICAgICAgd2hpY2ggdGhlIGVsZW1lbnQgaXMgYmVpbmcgcmVzb2x2ZWQKKyAgLy8vIEByZXR1cm4gdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gd2FzIHJlc29sdmVkCiAgIEVsZW1lbnQgX3Jlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXIgbm9kZSwgW0xpc3Q8RWxlbWVudD4gZGVmaW5lZEVsZW1lbnRzXSkgewogICAgIF9yZXNvbHZlTm9kZShub2RlLCBkZWZpbmVkRWxlbWVudHMpOwogICAgIHJldHVybiBub2RlLnN0YXRpY0VsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllciBhZnRlciB0aGUgcmVzb2x2ZXIgaGFzIHJlc29sdmVkIHRoZQotICAgKiBpZGVudGlmaWVyLgotICAgKgotICAgKiBAcGFyYW0gbm9kZSB0aGUgZXhwcmVzc2lvbiB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gZW5jbG9zaW5nQ2xhc3MgdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBlbmNsb3NpbmcgdGhlIGlkZW50aWZpZXIKLSAgICogQHJldHVybiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiB3YXMgcmVzb2x2ZWQKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFmdGVyIHRoZSByZXNvbHZlcgorICAvLy8gaGFzIHJlc29sdmVkIHRoZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIEBwYXJhbSBub2RlIHRoZSBleHByZXNzaW9uIHRvIGJlIHJlc29sdmVkCisgIC8vLyBAcGFyYW0gZW5jbG9zaW5nQ2xhc3MgdGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBlbmNsb3NpbmcgdGhlCisgIC8vLyAgICAgICAgICBpZGVudGlmaWVyCisgIC8vLyBAcmV0dXJuIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHdhcyByZXNvbHZlZAogICB2b2lkIF9yZXNvbHZlSW5DbGFzcyhBc3ROb2RlIG5vZGUsIENsYXNzRWxlbWVudCBlbmNsb3NpbmdDbGFzcykgewogICAgIFNjb3BlIG91dGVyU2NvcGUgPSBfdmlzaXRvci5uYW1lU2NvcGU7CiAgICAgdHJ5IHsKQEAgLTEwNTUsMzAgKzEwMzgsMjYgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhZnRlciB0aGUgcmVzb2x2ZXIgaGFzIHJlc29sdmVkIHRoZQotICAgKiBleHByZXNzaW9uLgotICAgKgotICAgKiBAcGFyYW0gbm9kZSB0aGUgZXhwcmVzc2lvbiB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gZGVmaW5lZEVsZW1lbnRzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBkZWZpbmVkIGluIHRoZSBzY29wZSBpbiB3aGljaCB0aGUgZWxlbWVudCBpcwotICAgKiAgICAgICAgICBiZWluZyByZXNvbHZlZAotICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHdhcyByZXNvbHZlZAotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlc29sdmVyCisgIC8vLyBoYXMgcmVzb2x2ZWQgdGhlIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gQHBhcmFtIG5vZGUgdGhlIGV4cHJlc3Npb24gdG8gYmUgcmVzb2x2ZWQKKyAgLy8vIEBwYXJhbSBkZWZpbmVkRWxlbWVudHMgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHRvIGJlIGRlZmluZWQgaW4gdGhlIHNjb3BlIGluCisgIC8vLyAgICAgICAgICB3aGljaCB0aGUgZWxlbWVudCBpcyBiZWluZyByZXNvbHZlZAorICAvLy8gQHJldHVybiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiB3YXMgcmVzb2x2ZWQKICAgRWxlbWVudCBfcmVzb2x2ZUluZGV4RXhwcmVzc2lvbihJbmRleEV4cHJlc3Npb24gbm9kZSwKICAgICAgIFtMaXN0PEVsZW1lbnQ+IGRlZmluZWRFbGVtZW50c10pIHsKICAgICBfcmVzb2x2ZU5vZGUobm9kZSwgZGVmaW5lZEVsZW1lbnRzKTsKICAgICByZXR1cm4gbm9kZS5zdGF0aWNFbGVtZW50OwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIHJlc29sdmVyIGhhcyByZXNvbHZlZCB0aGUKLSAgICogaWRlbnRpZmllci4KLSAgICoKLSAgICogQHBhcmFtIG5vZGUgdGhlIGV4cHJlc3Npb24gdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIGRlZmluZWRFbGVtZW50cyB0aGUgZWxlbWVudHMgdGhhdCBhcmUgdG8gYmUgZGVmaW5lZCBpbiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhlIGVsZW1lbnQgaXMKLSAgICogICAgICAgICAgYmVpbmcgcmVzb2x2ZWQKLSAgICogQHJldHVybiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiB3YXMgcmVzb2x2ZWQKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyIGFmdGVyIHRoZSByZXNvbHZlcgorICAvLy8gaGFzIHJlc29sdmVkIHRoZSBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIEBwYXJhbSBub2RlIHRoZSBleHByZXNzaW9uIHRvIGJlIHJlc29sdmVkCisgIC8vLyBAcGFyYW0gZGVmaW5lZEVsZW1lbnRzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBiZSBkZWZpbmVkIGluIHRoZSBzY29wZSBpbgorICAvLy8gICAgICAgICAgd2hpY2ggdGhlIGVsZW1lbnQgaXMgYmVpbmcgcmVzb2x2ZWQKKyAgLy8vIEByZXR1cm4gdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gd2FzIHJlc29sdmVkCiAgIHZvaWQgX3Jlc29sdmVOb2RlKEFzdE5vZGUgbm9kZSwgW0xpc3Q8RWxlbWVudD4gZGVmaW5lZEVsZW1lbnRzXSkgewogICAgIFNjb3BlIG91dGVyU2NvcGUgPSBfdmlzaXRvci5uYW1lU2NvcGU7CiAgICAgdHJ5IHsKQEAgLTEwOTUsMTQgKzEwNzQsMTMgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIHN0YXRlbWVudCBhZnRlciB0aGUgcmVzb2x2ZXIgaGFzCi0gICAqIHJlc29sdmVkIHRoZSBzdGF0ZW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIHN0YXRlbWVudCB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gbGFiZWxFbGVtZW50IHRoZSBsYWJlbCBlbGVtZW50IHRvIGJlIGRlZmluZWQgaW4gdGhlIHN0YXRlbWVudCdzIGxhYmVsIHNjb3BlCi0gICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0YXRlbWVudCdzIGxhYmVsIHdhcyByZXNvbHZlZAotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBzdGF0ZW1lbnQgYWZ0ZXIKKyAgLy8vIHRoZSByZXNvbHZlciBoYXMgcmVzb2x2ZWQgdGhlIHN0YXRlbWVudC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gc3RhdGVtZW50IHRoZSBzdGF0ZW1lbnQgdG8gYmUgcmVzb2x2ZWQKKyAgLy8vIEBwYXJhbSBsYWJlbEVsZW1lbnQgdGhlIGxhYmVsIGVsZW1lbnQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgc3RhdGVtZW50J3MKKyAgLy8vICAgICAgICAgIGxhYmVsIHNjb3BlCisgIC8vLyBAcmV0dXJuIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGF0ZW1lbnQncyBsYWJlbCB3YXMgcmVzb2x2ZWQKICAgdm9pZCBfcmVzb2x2ZVN0YXRlbWVudCgKICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQsIExhYmVsRWxlbWVudEltcGwgbGFiZWxFbGVtZW50LCBBc3ROb2RlIGxhYmVsVGFyZ2V0KSB7CiAgICAgTGFiZWxTY29wZSBvdXRlclNjb3BlID0gX3Zpc2l0b3IubGFiZWxTY29wZTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9lbGVtZW50c190eXBlc19taXhpbi5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2VsZW1lbnRzX3R5cGVzX21peGluLmRhcnQKaW5kZXggMzRiY2I0Ny4uZTQwMTBiMiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2VsZW1lbnRzX3R5cGVzX21peGluLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2VsZW1lbnRzX3R5cGVzX21peGluLmRhcnQKQEAgLTksMTAgKzksMTAgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9yZXNvbHZlci92YXJpYW5jZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdXRpbGl0aWVzX2RhcnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcGFyc2VyX2Zhc3RhX2xpc3RlbmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcGFyc2VyX2Zhc3RhX2xpc3RlbmVyLmRhcnQKaW5kZXggOGZjMzgyOC4uYjc1NDE2ZCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3BhcnNlcl9mYXN0YV9saXN0ZW5lci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfZmFzdGFfbGlzdGVuZXIuZGFydApAQCAtOCwyNyArOCwyNSBAQAogaW1wb3J0ICdwYWNrYWdlOl9mZV9hbmFseXplcl9zaGFyZWQvc3JjL3NjYW5uZXIvdG9rZW4uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogCi0vKioKLSAqIFByb3h5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmYXN0YSBwYXJzZXIgbGlzdGVuZXIgdGhhdAotICogYXNzZXJ0cyBiZWdpbi9lbmQgcGFpcnMgb2YgZXZlbnRzIGFuZCBmb3J3YXJkcyBhbGwgZXZlbnRzCi0gKiB0byB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotICoKLSAqIFdoZW4gYHBhcnNlVW5pdGAgaXMgY2FsbGVkLCB0aGVuIGFsbCBldmVudHMgYXJlIGdlbmVyYXRlZCBhcyBleHBlY3RlZC4KLSAqIFdoZW4gImxvd2VyIGxldmVsIiBwYXJzZSBtZXRob2RzIGFyZSBjYWxsZWQsIHRoZW4gc29tZSAiaGlnaGVyIGxldmVsIgotICogYmVnaW4vZW5kIGV2ZW50IHBhaXJzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gSW4gdGhpcyBjYXNlLAotICogY29uc3RydWN0IGEgbmV3IGxpc3RlbmVyIGFuZCBjYWxsIGBiZWdpbignaGlnaGVyLWxldmVsLWV2ZW50JylgCi0gKiBiZWZvcmUgY2FsbGluZyB0aGUgImxvd2VyIGxldmVsIiBwYXJzZSBtZXRob2QuIE9uY2UgdGhlIHBhcnNlIG1ldGhvZCByZXR1cm5zLAotICogY2FsbCBgZW5kKCdoaWdoZXItbGV2ZWwtZXZlbnQnKWAgdG8gYXNzZXJ0IHRoYXQgdGhlIHN0YWNrIGlzIGluIHRoZQotICogZXhwZWN0ZWQgc3RhdGUuCi0gKgotICogRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyBgcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uYCwgdGhlCi0gKiBbYmVnaW5Db21waWxhdGlvblVuaXRdIGFuZCBbZW5kQ29tcGlsYXRpb25Vbml0XSBldmVudCBwYWlyIGlzIG5vdCBnZW5lcmF0ZWQuCi0gKiBJbiB0aGlzIGNhc2UsIGNhbGwgYGJlZ2luKCdDb21waWxhdGlvblVuaXQnKWAgYmVmb3JlIGNhbGxpbmcKLSAqIGBwYXJzZVRvcExldmVsRGVjbGFyYXRpb25gLCBhbmQgY2FsbCBgZW5kKCdDb21waWxhdGlvblVuaXQnKWAgYWZ0ZXJ3YXJkLgotICoKLSAqIFdoZW4gY2FsbGluZyBgcGFyc2VVbml0YCwgZG8gbm90IGNhbGwgYGJlZ2luYCBvciBgZW5kYCwKLSAqIGJ1dCBjYWxsIGBleHBlY3RFbXB0eWAgYWZ0ZXIgYHBhcnNlVW5pdGAgcmV0dXJucy4KLSAqLworLy8vIFByb3h5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmYXN0YSBwYXJzZXIgbGlzdGVuZXIgdGhhdAorLy8vIGFzc2VydHMgYmVnaW4vZW5kIHBhaXJzIG9mIGV2ZW50cyBhbmQgZm9yd2FyZHMgYWxsIGV2ZW50cworLy8vIHRvIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIuCisvLy8KKy8vLyBXaGVuIGBwYXJzZVVuaXRgIGlzIGNhbGxlZCwgdGhlbiBhbGwgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgYXMgZXhwZWN0ZWQuCisvLy8gV2hlbiAibG93ZXIgbGV2ZWwiIHBhcnNlIG1ldGhvZHMgYXJlIGNhbGxlZCwgdGhlbiBzb21lICJoaWdoZXIgbGV2ZWwiCisvLy8gYmVnaW4vZW5kIGV2ZW50IHBhaXJzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gSW4gdGhpcyBjYXNlLAorLy8vIGNvbnN0cnVjdCBhIG5ldyBsaXN0ZW5lciBhbmQgY2FsbCBgYmVnaW4oJ2hpZ2hlci1sZXZlbC1ldmVudCcpYAorLy8vIGJlZm9yZSBjYWxsaW5nIHRoZSAibG93ZXIgbGV2ZWwiIHBhcnNlIG1ldGhvZC4gT25jZSB0aGUgcGFyc2UgbWV0aG9kCisvLy8gcmV0dXJucywgY2FsbCBgZW5kKCdoaWdoZXItbGV2ZWwtZXZlbnQnKWAgdG8gYXNzZXJ0IHRoYXQgdGhlIHN0YWNrIGlzIGluIHRoZQorLy8vIGV4cGVjdGVkIHN0YXRlLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyBgcGFyc2VUb3BMZXZlbERlY2xhcmF0aW9uYCwgdGhlCisvLy8gW2JlZ2luQ29tcGlsYXRpb25Vbml0XSBhbmQgW2VuZENvbXBpbGF0aW9uVW5pdF0gZXZlbnQgcGFpciBpcyBub3QgZ2VuZXJhdGVkLgorLy8vIEluIHRoaXMgY2FzZSwgY2FsbCBgYmVnaW4oJ0NvbXBpbGF0aW9uVW5pdCcpYCBiZWZvcmUgY2FsbGluZworLy8vIGBwYXJzZVRvcExldmVsRGVjbGFyYXRpb25gLCBhbmQgY2FsbCBgZW5kKCdDb21waWxhdGlvblVuaXQnKWAgYWZ0ZXJ3YXJkLgorLy8vCisvLy8gV2hlbiBjYWxsaW5nIGBwYXJzZVVuaXRgLCBkbyBub3QgY2FsbCBgYmVnaW5gIG9yIGBlbmRgLAorLy8vIGJ1dCBjYWxsIGBleHBlY3RFbXB0eWAgYWZ0ZXIgYHBhcnNlVW5pdGAgcmV0dXJucy4KIGNsYXNzIEZvcndhcmRpbmdUZXN0TGlzdGVuZXIgZXh0ZW5kcyBGb3J3YXJkaW5nTGlzdGVuZXIgewogICBmaW5hbCBfc3RhY2sgPSA8U3RyaW5nPltdOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcGFyc2VyX2Zhc3RhX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfZmFzdGFfdGVzdC5kYXJ0CmluZGV4IDNhYzYzYmEuLjliZDMwYTggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfZmFzdGFfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfZmFzdGFfdGVzdC5kYXJ0CkBAIC0zNDgsOSArMzQ4LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIG9mIHRoZSBmYXN0YSBwYXJzZXIgYmFzZWQgb24gW0V4cHJlc3Npb25QYXJzZXJUZXN0TWl4aW5dLgotICovCisvLy8gVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbRXhwcmVzc2lvblBhcnNlclRlc3RNaXhpbl0uCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIENvbGxlY3Rpb25MaXRlcmFsUGFyc2VyVGVzdCBleHRlbmRzIEZhc3RhUGFyc2VyVGVzdENhc2UgewogICBFeHByZXNzaW9uIHBhcnNlQ29sbGVjdGlvbkxpdGVyYWwoU3RyaW5nIHNvdXJjZSwKQEAgLTk3Niw5ICs5NzQsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbQ29tcGxleFBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtDb21wbGV4UGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQ29tcGxleFBhcnNlclRlc3RfRmFzdGEgZXh0ZW5kcyBGYXN0YVBhcnNlclRlc3RDYXNlCiAgICAgd2l0aCBDb21wbGV4UGFyc2VyVGVzdE1peGluIHsKQEAgLTEwNDQsOSArMTA0MCw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtFcnJvclBhcnNlclRlc3RdLgotICovCisvLy8gVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbRXJyb3JQYXJzZXJUZXN0XS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRXJyb3JQYXJzZXJUZXN0X0Zhc3RhIGV4dGVuZHMgRmFzdGFQYXJzZXJUZXN0Q2FzZQogICAgIHdpdGggRXJyb3JQYXJzZXJUZXN0TWl4aW4gewpAQCAtMTI1Miw5ICsxMjQ2LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIG9mIHRoZSBmYXN0YSBwYXJzZXIgYmFzZWQgb24gW0V4cHJlc3Npb25QYXJzZXJUZXN0TWl4aW5dLgotICovCisvLy8gVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbRXhwcmVzc2lvblBhcnNlclRlc3RNaXhpbl0uCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIEV4cHJlc3Npb25QYXJzZXJUZXN0X0Zhc3RhIGV4dGVuZHMgRmFzdGFQYXJzZXJUZXN0Q2FzZQogICAgIHdpdGggRXhwcmVzc2lvblBhcnNlclRlc3RNaXhpbiB7CkBAIC0xODgyLDEwICsxODc0LDggQEAKICAgfQogfQogCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFtBYnN0cmFjdFBhcnNlclRlc3RDYXNlXSBzcGVjaWFsaXplZCBmb3IgdGVzdGluZyB0aGUKLSAqIEZhc3RhIHBhcnNlci4KLSAqLworLy8vIEltcGxlbWVudGF0aW9uIG9mIFtBYnN0cmFjdFBhcnNlclRlc3RDYXNlXSBzcGVjaWFsaXplZCBmb3IgdGVzdGluZyB0aGUKKy8vLyBGYXN0YSBwYXJzZXIuCiBjbGFzcyBGYXN0YVBhcnNlclRlc3RDYXNlCiAgICAgd2l0aCBQYXJzZXJUZXN0SGVscGVycwogICAgIGltcGxlbWVudHMgQWJzdHJhY3RQYXJzZXJUZXN0Q2FzZSB7CkBAIC0yNDExLDkgKzI0MDEsNyBAQAogICAgICAgZXhwZWN0ZWRFcnJvckNvZGVzLm1hcChfdG9GYXN0YUdlbmVyYXRlZEFuYWx5emVyRXJyb3JDb2RlKS50b0xpc3QoKTsKIH0KIAotLyoqCi0gKiBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtGb3JtYWxQYXJhbWV0ZXJQYXJzZXJUZXN0TWl4aW5dLgotICovCisvLy8gVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbRm9ybWFsUGFyYW1ldGVyUGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRm9ybWFsUGFyYW1ldGVyUGFyc2VyVGVzdF9GYXN0YSBleHRlbmRzIEZhc3RhUGFyc2VyVGVzdENhc2UKICAgICB3aXRoIEZvcm1hbFBhcmFtZXRlclBhcnNlclRlc3RNaXhpbiB7CkBAIC0yNjc3LDkgKzI2NjUsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdHMgb2YgdGhlIGZhc3RhIHBhcnNlciBiYXNlZCBvbiBbQ29tcGxleFBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtDb21wbGV4UGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgTk5CRFBhcnNlclRlc3RfRmFzdGEgZXh0ZW5kcyBGYXN0YVBhcnNlclRlc3RDYXNlIHsKICAgQG92ZXJyaWRlCkBAIC0zNTE0LDI3ICszNTAwLDIxIEBACiAgIH0KIH0KIAotLyoqCi0gKiBQcm94eSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyLCBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKLSAqIEZhc3RhIHBhcnNlci4KLSAqCi0gKiBUaGlzIGFsbG93cyBtYW55IG9mIHRoZSBhbmFseXplciBwYXJzZXIgdGVzdHMgdG8gYmUgcnVuIG9uIEZhc3RhLCBldmVuIGlmCi0gKiB0aGV5IGNhbGwgaW50byB0aGUgYW5hbHl6ZXIgcGFyc2VyIGNsYXNzIGRpcmVjdGx5LgotICovCisvLy8gUHJveHkgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFuYWx5emVyIHBhcnNlciwgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlCisvLy8gRmFzdGEgcGFyc2VyLgorLy8vCisvLy8gVGhpcyBhbGxvd3MgbWFueSBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyIHRlc3RzIHRvIGJlIHJ1biBvbiBGYXN0YSwgZXZlbiBpZgorLy8vIHRoZXkgY2FsbCBpbnRvIHRoZSBhbmFseXplciBwYXJzZXIgY2xhc3MgZGlyZWN0bHkuCiBjbGFzcyBQYXJzZXJQcm94eSBleHRlbmRzIGFuYWx5emVyLlBhcnNlckFkYXB0ZXIgewotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIHNjYW5uZXIgYW5kIHBhcnNlciBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KLSAgICovCisgIC8vLyBUaGUgZXJyb3IgbGlzdGVuZXIgdG8gd2hpY2ggc2Nhbm5lciBhbmQgcGFyc2VyIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkLgogICBmaW5hbCBHYXRoZXJpbmdFcnJvckxpc3RlbmVyIF9lcnJvckxpc3RlbmVyOwogCiAgIEZvcndhcmRpbmdUZXN0TGlzdGVuZXIgX2V2ZW50TGlzdGVuZXI7CiAKICAgZmluYWwgaW50IGV4cGVjdGVkRW5kT2Zmc2V0OwogCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1BhcnNlclByb3h5XSB3aGljaCBpcyBwcmVwYXJlZCB0byBiZWdpbiBwYXJzaW5nIGF0IHRoZSBnaXZlbgotICAgKiBGYXN0YSB0b2tlbi4KLSAgICovCisgIC8vLyBDcmVhdGVzIGEgW1BhcnNlclByb3h5XSB3aGljaCBpcyBwcmVwYXJlZCB0byBiZWdpbiBwYXJzaW5nIGF0IHRoZSBnaXZlbgorICAvLy8gRmFzdGEgdG9rZW4uCiAgIGZhY3RvcnkgUGFyc2VyUHJveHkoYW5hbHl6ZXIuVG9rZW4gZmlyc3RUb2tlbiwgRmVhdHVyZVNldCBmZWF0dXJlU2V0LAogICAgICAge2Jvb2wgYWxsb3dOYXRpdmVDbGF1c2UgPSBmYWxzZSwgaW50IGV4cGVjdGVkRW5kT2Zmc2V0fSkgewogICAgIFRlc3RTb3VyY2Ugc291cmNlID0gVGVzdFNvdXJjZSgpOwpAQCAtMzkxNiw5ICszODk2LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIG9mIHRoZSBmYXN0YSBwYXJzZXIgYmFzZWQgb24gW1N0YXRlbWVudFBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtTdGF0ZW1lbnRQYXJzZXJUZXN0TWl4aW5dLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBTdGF0ZW1lbnRQYXJzZXJUZXN0X0Zhc3RhIGV4dGVuZHMgRmFzdGFQYXJzZXJUZXN0Q2FzZQogICAgIHdpdGggU3RhdGVtZW50UGFyc2VyVGVzdE1peGluIHsKQEAgLTQzMjMsOSArNDMwMSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtUb3BMZXZlbFBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgZmFzdGEgcGFyc2VyIGJhc2VkIG9uIFtUb3BMZXZlbFBhcnNlclRlc3RNaXhpbl0uCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIFRvcExldmVsUGFyc2VyVGVzdF9GYXN0YSBleHRlbmRzIEZhc3RhUGFyc2VyVGVzdENhc2UKICAgICB3aXRoIFRvcExldmVsUGFyc2VyVGVzdE1peGluIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3BhcnNlcl90ZXN0LmRhcnQKaW5kZXggNzA1NDQ3Yi4uOGJiNWE3MyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3BhcnNlcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3BhcnNlcl90ZXN0LmRhcnQKQEAgLTQ5LDY4ICs0OSw1MCBAQAogICB9KTsKIH0KIAotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwYXJzZXIgdGVzdHMsIHdoaWNoIGRvZXMgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQKLSAqIHdoaWNoIHBhcnNlciBpcyB1c2VkLgotICovCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcGFyc2VyIHRlc3RzLCB3aGljaCBkb2VzIG5vdCBtYWtlIGFzc3VtcHRpb25zIGFib3V0CisvLy8gd2hpY2ggcGFyc2VyIGlzIHVzZWQuCiBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcnNlclRlc3RDYXNlIGltcGxlbWVudHMgUGFyc2VyVGVzdEhlbHBlcnMgewogICBib29sIGdldCBhbGxvd05hdGl2ZUNsYXVzZTsKIAogICBzZXQgYWxsb3dOYXRpdmVDbGF1c2UoYm9vbCB2YWx1ZSk7CiAKLSAgLyoqCi0gICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXJzZXIgc2hvdWxkIHBhcnNlIGluc3RhbmNlIGNyZWF0aW9uCi0gICAqIGV4cHJlc3Npb25zIHRoYXQgbGFjayBlaXRoZXIgdGhlIGBuZXdgIG9yIGBjb25zdGAga2V5d29yZC4KLSAgICovCisgIC8vLyBTZXQgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFyc2VyIHNob3VsZCBwYXJzZSBpbnN0YW5jZSBjcmVhdGlvbgorICAvLy8gZXhwcmVzc2lvbnMgdGhhdCBsYWNrIGVpdGhlciB0aGUgYG5ld2Agb3IgYGNvbnN0YCBrZXl3b3JkLgogICBzZXQgZW5hYmxlT3B0aW9uYWxOZXdBbmRDb25zdChib29sIHZhbHVlKTsKIAotICAvKioKLSAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBpcyB0byBwYXJzZSBwYXJ0LW9mIGRpcmVjdGl2ZXMKLSAgICogdGhhdCBzcGVjaWZ5IGEgVVJJIHJhdGhlciB0aGFuIGEgbGlicmFyeSBuYW1lLgotICAgKi8KKyAgLy8vIFNldCBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXJzZXIgaXMgdG8gcGFyc2UgcGFydC1vZiBkaXJlY3RpdmVzCisgIC8vLyB0aGF0IHNwZWNpZnkgYSBVUkkgcmF0aGVyIHRoYW4gYSBsaWJyYXJ5IG5hbWUuCiAgIHNldCBlbmFibGVVcmlJblBhcnRPZihib29sIHZhbHVlKTsKIAotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIHNjYW5uZXIgYW5kIHBhcnNlciBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KLSAgICoKLSAgICogVGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgaW5pdGlhbGl6ZWQgYnkgaW52b2tpbmcgW2NyZWF0ZVBhcnNlcl0uCi0gICAqLworICAvLy8gVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIHNjYW5uZXIgYW5kIHBhcnNlciBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZpZWxkIGlzIHR5cGljYWxseSBpbml0aWFsaXplZCBieSBpbnZva2luZyBbY3JlYXRlUGFyc2VyXS4KICAgR2F0aGVyaW5nRXJyb3JMaXN0ZW5lciBnZXQgbGlzdGVuZXI7CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgcGFyc2VyIHVzZWQgYnkgdGhlIHRlc3QuCi0gICAqCi0gICAqIENhbGxlciBtdXN0IGZpcnN0IGludm9rZSBbY3JlYXRlUGFyc2VyXS4KLSAgICovCisgIC8vLyBHZXQgdGhlIHBhcnNlciB1c2VkIGJ5IHRoZSB0ZXN0LgorICAvLy8KKyAgLy8vIENhbGxlciBtdXN0IGZpcnN0IGludm9rZSBbY3JlYXRlUGFyc2VyXS4KICAgUGFyc2VyIGdldCBwYXJzZXI7CiAKLSAgLyoqCi0gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmYXN0YSBwYXJzZXIgaXMgYmVpbmcgdXNlZC4KLSAgICovCisgIC8vLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmFzdGEgcGFyc2VyIGlzIGJlaW5nIHVzZWQuCiAgIGJvb2wgZ2V0IHVzaW5nRmFzdGFQYXJzZXI7CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSBudW1iZXIgYW5kIGNvZGVzIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBpcyB0aGUKLSAgICogc2FtZSBhcyB0aGUgW2V4cGVjdGVkRXJyb3JDb2Rlc10uCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIG51bWJlciBhbmQgY29kZXMgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nIGlzIHRoZQorICAvLy8gc2FtZSBhcyB0aGUgW2V4cGVjdGVkRXJyb3JDb2Rlc10uCiAgIHZvaWQgYXNzZXJ0RXJyb3JzV2l0aENvZGVzKExpc3Q8RXJyb3JDb2RlPiBleHBlY3RlZEVycm9yQ29kZXMpOwogCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgbm8gZXJyb3JzIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nLgotICAgKi8KKyAgLy8vIEFzc2VydHMgdGhhdCBubyBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcuCiAgIHZvaWQgYXNzZXJ0Tm9FcnJvcnMoKTsKIAotICAvKioKLSAgICogUHJlcGFyZXMgdG8gcGFyc2UgdXNpbmcgdG9rZW5zIHNjYW5uZWQgZnJvbSB0aGUgZ2l2ZW4gW2NvbnRlbnRdIHN0cmluZy4KLSAgICoKLSAgICogW2V4cGVjdGVkRW5kT2Zmc2V0XSBpcyB0aGUgZXhwZWN0ZWQgb2Zmc2V0IG9mIHRoZSBuZXh0IHRva2VuIHRvIGJlIHBhcnNlZAotICAgKiBhZnRlciB0aGUgcGFyc2VyIGhhcyBmaW5pc2hlZCBwYXJzaW5nLAotICAgKiBvciBgbnVsbGAgKHRoZSBkZWZhdWx0KSBpZiBFT0YgaXMgZXhwZWN0ZWQuCi0gICAqIEluIGdlbmVyYWwsIHRoZSBhbmFseXplciB0ZXN0cyBkbyBub3QgYXNzZXJ0IHRoYXQgdGhlIGxhc3QgdG9rZW4gaXMgRU9GLAotICAgKiBidXQgdGhlIGZhc3RhIHBhcnNlciBhZGFwdGVyIHRlc3RzIGRvIGFzc2VydCB0aGlzLgotICAgKiBGb3IgYW55IGFuYWx5emVyIHRlc3Qgd2hlcmUgdGhlIGxhc3QgdG9rZW4gaXMgbm90IEVPRiwgc2V0IHRoaXMgdmFsdWUuCi0gICAqIEl0IGlzIGlnbm9yZWQgd2hlbiBub3QgdXNpbmcgdGhlIGZhc3RhIHBhcnNlci4KLSAgICovCisgIC8vLyBQcmVwYXJlcyB0byBwYXJzZSB1c2luZyB0b2tlbnMgc2Nhbm5lZCBmcm9tIHRoZSBnaXZlbiBbY29udGVudF0gc3RyaW5nLgorICAvLy8KKyAgLy8vIFtleHBlY3RlZEVuZE9mZnNldF0gaXMgdGhlIGV4cGVjdGVkIG9mZnNldCBvZiB0aGUgbmV4dCB0b2tlbiB0byBiZSBwYXJzZWQKKyAgLy8vIGFmdGVyIHRoZSBwYXJzZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcsCisgIC8vLyBvciBgbnVsbGAgKHRoZSBkZWZhdWx0KSBpZiBFT0YgaXMgZXhwZWN0ZWQuCisgIC8vLyBJbiBnZW5lcmFsLCB0aGUgYW5hbHl6ZXIgdGVzdHMgZG8gbm90IGFzc2VydCB0aGF0IHRoZSBsYXN0IHRva2VuIGlzIEVPRiwKKyAgLy8vIGJ1dCB0aGUgZmFzdGEgcGFyc2VyIGFkYXB0ZXIgdGVzdHMgZG8gYXNzZXJ0IHRoaXMuCisgIC8vLyBGb3IgYW55IGFuYWx5emVyIHRlc3Qgd2hlcmUgdGhlIGxhc3QgdG9rZW4gaXMgbm90IEVPRiwgc2V0IHRoaXMgdmFsdWUuCisgIC8vLyBJdCBpcyBpZ25vcmVkIHdoZW4gbm90IHVzaW5nIHRoZSBmYXN0YSBwYXJzZXIuCiAgIHZvaWQgY3JlYXRlUGFyc2VyKAogICAgIFN0cmluZyBjb250ZW50LCB7CiAgICAgaW50IGV4cGVjdGVkRW5kT2Zmc2V0LApAQCAtMTUwLDE1ICsxMzIsMTUgQEAKIAogICBDb25zdHJ1Y3RvckluaXRpYWxpemVyIHBhcnNlQ29uc3RydWN0b3JJbml0aWFsaXplcihTdHJpbmcgY29kZSk7CiAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBnaXZlbiBzb3VyY2UgYXMgYSBjb21waWxhdGlvbiB1bml0LgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgdG8gYmUgcGFyc2VkCi0gICAqIEBwYXJhbSBlcnJvckNvZGVzIHRoZSBlcnJvciBjb2RlcyBvZiB0aGUgZXJyb3JzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kCi0gICAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3YXMgcGFyc2VkCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY291bGQgbm90IGJlIHBhcnNlZCwgaWYgdGhlIGNvbXBpbGF0aW9uIGVycm9ycyBpbiB0aGUgc291cmNlIGRvCi0gICAqICAgICAgICAgICBub3QgbWF0Y2ggdGhvc2UgdGhhdCBhcmUgZXhwZWN0ZWQsIG9yIGlmIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIGBudWxsYAotICAgKi8KKyAgLy8vIFBhcnNlIHRoZSBnaXZlbiBzb3VyY2UgYXMgYSBjb21waWxhdGlvbiB1bml0LgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBwYXJzZWQKKyAgLy8vIEBwYXJhbSBlcnJvckNvZGVzIHRoZSBlcnJvciBjb2RlcyBvZiB0aGUgZXJyb3JzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlCisgIC8vLyAgICAgICAgICBmb3VuZAorICAvLy8gQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGF0IHdhcyBwYXJzZWQKKyAgLy8vIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY291bGQgbm90IGJlIHBhcnNlZCwgaWYgdGhlIGNvbXBpbGF0aW9uCisgIC8vLyAgICAgICAgICAgZXJyb3JzIGluIHRoZSBzb3VyY2UgZG8gbm90IG1hdGNoIHRob3NlIHRoYXQgYXJlIGV4cGVjdGVkLCBvciBpZgorICAvLy8gICAgICAgICAgIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIGBudWxsYAogICBDb21waWxhdGlvblVuaXQgcGFyc2VEaXJlY3RpdmVzKFN0cmluZyBzb3VyY2UsCiAgICAgICBbTGlzdDxFcnJvckNvZGU+IGVycm9yQ29kZXMgPSBjb25zdCA8RXJyb3JDb2RlPltdXSk7CiAKQEAgLTE4MSwxNiArMTYzLDEyIEBACiAgICAgICBMaXN0PEVycm9yQ29kZT4gZXJyb3JDb2RlcyA9IGNvbnN0IDxFcnJvckNvZGU+W10sCiAgICAgICBMaXN0PEV4cGVjdGVkRXJyb3I+IGVycm9yc30pOwogCi0gIC8qKgotICAgKiBQYXJzZXMgYSBzaW5nbGUgdG9wIGxldmVsIG1lbWJlciBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgKG90aGVyIHRoYW4gYQotICAgKiBkaXJlY3RpdmUpLCBpbmNsdWRpbmcgYW55IGNvbW1lbnQgYW5kL29yIG1ldGFkYXRhIHRoYXQgcHJlY2VkZXMgaXQuCi0gICAqLworICAvLy8gUGFyc2VzIGEgc2luZ2xlIHRvcCBsZXZlbCBtZW1iZXIgb2YgYSBjb21waWxhdGlvbiB1bml0IChvdGhlciB0aGFuIGEKKyAgLy8vIGRpcmVjdGl2ZSksIGluY2x1ZGluZyBhbnkgY29tbWVudCBhbmQvb3IgbWV0YWRhdGEgdGhhdCBwcmVjZWRlcyBpdC4KICAgQ29tcGlsYXRpb25Vbml0TWVtYmVyIHBhcnNlRnVsbENvbXBpbGF0aW9uVW5pdE1lbWJlcigpOwogCi0gIC8qKgotICAgKiBQYXJzZXMgYSBzaW5nbGUgdG9wIGxldmVsIGRpcmVjdGl2ZSwgaW5jbHVkaW5nIGFueSBjb21tZW50IGFuZC9vciBtZXRhZGF0YQotICAgKiB0aGF0IHByZWNlZGVzIGl0LgotICAgKi8KKyAgLy8vIFBhcnNlcyBhIHNpbmdsZSB0b3AgbGV2ZWwgZGlyZWN0aXZlLCBpbmNsdWRpbmcgYW55IGNvbW1lbnQgYW5kL29yIG1ldGFkYXRhCisgIC8vLyB0aGF0IHByZWNlZGVzIGl0LgogICBEaXJlY3RpdmUgcGFyc2VGdWxsRGlyZWN0aXZlKCk7CiAKICAgRnVuY3Rpb25FeHByZXNzaW9uIHBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKFN0cmluZyBjb2RlKTsKQEAgLTI1MCwxMCArMjI4LDggQEAKICAgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QgcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChTdHJpbmcgc291cmNlKTsKIH0KIAotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBBc3RWYWxpZGF0b3JgIGFyZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb3JyZWN0IGNvbnN0cnVjdGlvbiBvZiBhbgotICogQVNUIHN0cnVjdHVyZS4KLSAqLworLy8vIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYEFzdFZhbGlkYXRvcmAgYXJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvcnJlY3QKKy8vLyBjb25zdHJ1Y3Rpb24gb2YgYW4gQVNUIHN0cnVjdHVyZS4KIGNsYXNzIEFzdFZhbGlkYXRvciBleHRlbmRzIFVuaWZ5aW5nQXN0VmlzaXRvcjx2b2lkPiB7CiAgIC8vLyBBIGxpc3QgY29udGFpbmluZyB0aGUgZXJyb3JzIGZvdW5kIHdoaWxlIHRyYXZlcnNpbmcgdGhlIEFTVCBzdHJ1Y3R1cmUuCiAgIGZpbmFsIExpc3Q8U3RyaW5nPiBfZXJyb3JzID0gPFN0cmluZz5bXTsKQEAgLTI3OCwxMSArMjU0LDkgQEAKICAgICBzdXBlci52aXNpdE5vZGUobm9kZSk7CiAgIH0KIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gQVNUIG5vZGUgaXMgY29ycmVjdGx5IGNvbnN0cnVjdGVkLgotICAgKgotICAgKiBAcGFyYW0gbm9kZSB0aGUgQVNUIG5vZGUgYmVpbmcgdmFsaWRhdGVkCi0gICAqLworICAvLy8gVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gQVNUIG5vZGUgaXMgY29ycmVjdGx5IGNvbnN0cnVjdGVkLgorICAvLy8KKyAgLy8vIEBwYXJhbSBub2RlIHRoZSBBU1Qgbm9kZSBiZWluZyB2YWxpZGF0ZWQKICAgdm9pZCBfdmFsaWRhdGUoQXN0Tm9kZSBub2RlKSB7CiAgICAgQXN0Tm9kZSBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICBpZiAobm9kZSBpcyBDb21waWxhdGlvblVuaXQpIHsKQEAgLTMzMSw5ICszMDUsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdHMgd2hpY2ggZXhlcmNpc2UgdGhlIHBhcnNlciB1c2luZyBhIGNsYXNzIG1lbWJlci4KLSAqLworLy8vIFRlc3RzIHdoaWNoIGV4ZXJjaXNlIHRoZSBwYXJzZXIgdXNpbmcgYSBjbGFzcyBtZW1iZXIuCiBtaXhpbiBDbGFzc01lbWJlclBhcnNlclRlc3RNaXhpbiBpbXBsZW1lbnRzIEFic3RyYWN0UGFyc2VyVGVzdENhc2UgewogICB2b2lkIHRlc3RfcGFyc2VBd2FpdEV4cHJlc3Npb25fYXNTdGF0ZW1lbnRfaW5Bc3luYygpIHsKICAgICBjcmVhdGVQYXJzZXIoJ20oKSBhc3luYyB7IGF3YWl0IHg7IH0nKTsKQEAgLTE4MzMsOSArMTgwNSw3IEBACiAgICAgZXhwZWN0Q29tbWVudFRleHQocGFyYW1ldGVyLmRvY3VtZW50YXRpb25Db21tZW50LCAnLy8vIERvYycpOwogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBbbmFtZV0gaXMgaW4gZGVjbGFyYXRpb24gY29udGV4dC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gW25hbWVdIGlzIGluIGRlY2xhcmF0aW9uIGNvbnRleHQuCiAgIHZvaWQgX2Fzc2VydElzRGVjbGFyYXRpb25OYW1lKFNpbXBsZUlkZW50aWZpZXIgbmFtZSwgW2Jvb2wgZXhwZWN0ZWQgPSB0cnVlXSkgewogICAgIGV4cGVjdChuYW1lLmluRGVjbGFyYXRpb25Db250ZXh0KCksIGV4cGVjdGVkKTsKICAgfQpAQCAtMTg2NSwxOSArMTgzNSwxNiBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdHMgb2YgdGhlIGFuYWx5emVyIHBhcnNlciBiYXNlZCBvbiBbQ29tcGxleFBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyIGJhc2VkIG9uIFtDb21wbGV4UGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQ29tcGxleFBhcnNlclRlc3QgZXh0ZW5kcyBQYXJzZXJUZXN0Q2FzZSB3aXRoIENvbXBsZXhQYXJzZXJUZXN0TWl4aW4ge30KIAotLyoqCi0gKiBUaGUgY2xhc3MgYENvbXBsZXhQYXJzZXJUZXN0YCBkZWZpbmVzIHBhcnNlciB0ZXN0cyB0aGF0IHRlc3QgdGhlIHBhcnNpbmcgb2YgbW9yZSBjb21wbGV4Ci0gKiBjb2RlIGZyYWdtZW50cyBvciB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gbXVsdGlwbGUgcGFyc2luZyBtZXRob2RzLiBGb3IgZXhhbXBsZSwgdGVzdHMgdG8gZW5zdXJlCi0gKiB0aGF0IHRoZSBwcmVjZWRlbmNlIG9mIG9wZXJhdGlvbnMgaXMgYmVpbmcgaGFuZGxlZCBjb3JyZWN0bHkgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLSAqCi0gKiBTaW1wbGVyIHRlc3RzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBbU2ltcGxlUGFyc2VyVGVzdF0uCi0gKi8KKy8vLyBUaGUgY2xhc3MgYENvbXBsZXhQYXJzZXJUZXN0YCBkZWZpbmVzIHBhcnNlciB0ZXN0cyB0aGF0IHRlc3QgdGhlIHBhcnNpbmcgb2YKKy8vLyBtb3JlIGNvbXBsZXggY29kZSBmcmFnbWVudHMgb3IgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIG11bHRpcGxlIHBhcnNpbmcKKy8vLyBtZXRob2RzLiBGb3IgZXhhbXBsZSwgdGVzdHMgdG8gZW5zdXJlIHRoYXQgdGhlIHByZWNlZGVuY2Ugb2Ygb3BlcmF0aW9ucyBpcworLy8vIGJlaW5nIGhhbmRsZWQgY29ycmVjdGx5IHNob3VsZCBiZSBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCisvLy8KKy8vLyBTaW1wbGVyIHRlc3RzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBbU2ltcGxlUGFyc2VyVGVzdF0uCiBtaXhpbiBDb21wbGV4UGFyc2VyVGVzdE1peGluIGltcGxlbWVudHMgQWJzdHJhY3RQYXJzZXJUZXN0Q2FzZSB7CiAgIHZvaWQgdGVzdF9hZGRpdGl2ZUV4cHJlc3Npb25fbm9ybWFsKCkgewogICAgIEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbigieCArIHkgLSB6Iik7CkBAIC0yMzU2LDExICsyMzIzLDkgQEAKICAgfQogfQogCi0vKioKLSAqIFRoZSBjbGFzcyBgRXJyb3JQYXJzZXJUZXN0YCBkZWZpbmVzIHBhcnNlciB0ZXN0cyB0aGF0IHRlc3QgdGhlIHBhcnNpbmcKLSAqIG9mIGNvZGUgdG8gZW5zdXJlIHRoYXQgZXJyb3JzIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQsCi0gKiBhbmQgaW4gc29tZSBjYXNlcywgbm90IHJlcG9ydGVkLgotICovCisvLy8gVGhlIGNsYXNzIGBFcnJvclBhcnNlclRlc3RgIGRlZmluZXMgcGFyc2VyIHRlc3RzIHRoYXQgdGVzdCB0aGUgcGFyc2luZworLy8vIG9mIGNvZGUgdG8gZW5zdXJlIHRoYXQgZXJyb3JzIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQsCisvLy8gYW5kIGluIHNvbWUgY2FzZXMsIG5vdCByZXBvcnRlZC4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRXJyb3JQYXJzZXJUZXN0IGV4dGVuZHMgUGFyc2VyVGVzdENhc2Ugd2l0aCBFcnJvclBhcnNlclRlc3RNaXhpbiB7CiAgIHZvaWQgdGVzdF9taXNzaW5nSWRlbnRpZmllcl9udW1iZXIoKSB7CkBAIC04MjMxLDE3ICs4MTk2LDEzIEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0cyBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyIGJhc2VkIG9uIFtGb3JtYWxQYXJhbWV0ZXJQYXJzZXJUZXN0TWl4aW5dLgotICovCisvLy8gVGVzdHMgb2YgdGhlIGFuYWx5emVyIHBhcnNlciBiYXNlZCBvbiBbRm9ybWFsUGFyYW1ldGVyUGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRm9ybWFsUGFyYW1ldGVyUGFyc2VyVGVzdCBleHRlbmRzIFBhcnNlclRlc3RDYXNlCiAgICAgd2l0aCBGb3JtYWxQYXJhbWV0ZXJQYXJzZXJUZXN0TWl4aW4ge30KIAotLyoqCi0gKiBUaGUgY2xhc3MgW0Zvcm1hbFBhcmFtZXRlclBhcnNlclRlc3RNaXhpbl0gZGVmaW5lcyBwYXJzZXIgdGVzdHMgdGhhdCB0ZXN0Ci0gKiB0aGUgcGFyc2luZyBvZiBmb3JtYWwgcGFyYW1ldGVycy4KLSAqLworLy8vIFRoZSBjbGFzcyBbRm9ybWFsUGFyYW1ldGVyUGFyc2VyVGVzdE1peGluXSBkZWZpbmVzIHBhcnNlciB0ZXN0cyB0aGF0IHRlc3QKKy8vLyB0aGUgcGFyc2luZyBvZiBmb3JtYWwgcGFyYW1ldGVycy4KIG1peGluIEZvcm1hbFBhcmFtZXRlclBhcnNlclRlc3RNaXhpbiBpbXBsZW1lbnRzIEFic3RyYWN0UGFyc2VyVGVzdENhc2UgewogICB2b2lkIHRlc3RfcGFyc2VDb25zdHJ1Y3RvclBhcmFtZXRlcl90aGlzKCkgewogICAgIHBhcnNlQ29tcGlsYXRpb25Vbml0KCcnJwpAQCAtOTQxOSw1MCArOTM4MCwzNiBAQAogICB9CiB9CiAKLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgW0Fic3RyYWN0UGFyc2VyVGVzdENhc2VdIHNwZWNpYWxpemVkIGZvciB0ZXN0aW5nIHRoZQotICogYW5hbHl6ZXIgcGFyc2VyLgotICovCisvLy8gSW1wbGVtZW50YXRpb24gb2YgW0Fic3RyYWN0UGFyc2VyVGVzdENhc2VdIHNwZWNpYWxpemVkIGZvciB0ZXN0aW5nIHRoZQorLy8vIGFuYWx5emVyIHBhcnNlci4KIGNsYXNzIFBhcnNlclRlc3RDYXNlIHdpdGggUGFyc2VyVGVzdEhlbHBlcnMgaW1wbGVtZW50cyBBYnN0cmFjdFBhcnNlclRlc3RDYXNlIHsKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFyc2VyIGlzIHRvIHBhcnNlIGZ1bmN0aW9uIGJvZGllcy4KLSAgICovCisgIC8vLyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnNlciBpcyB0byBwYXJzZSBmdW5jdGlvbiBib2RpZXMuCiAgIHN0YXRpYyBib29sIHBhcnNlRnVuY3Rpb25Cb2RpZXMgPSB0cnVlOwogCiAgIEBvdmVycmlkZQogICBib29sIGFsbG93TmF0aXZlQ2xhdXNlID0gdHJ1ZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBwYXJzZXIgaXMgdG8gcGFyc2UgYXN5bmMuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBwYXJzZXIgaXMgdG8gcGFyc2UgYXN5bmMuCiAgIGJvb2wgcGFyc2VBc3luYyA9IHRydWU7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgcGFyc2UgaW5zdGFuY2UgY3JlYXRpb24KLSAgICogZXhwcmVzc2lvbnMgdGhhdCBsYWNrIGVpdGhlciB0aGUgYG5ld2Agb3IgYGNvbnN0YCBrZXl3b3JkLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgcGFyc2UgaW5zdGFuY2UgY3JlYXRpb24KKyAgLy8vIGV4cHJlc3Npb25zIHRoYXQgbGFjayBlaXRoZXIgdGhlIGBuZXdgIG9yIGBjb25zdGAga2V5d29yZC4KICAgYm9vbCBlbmFibGVPcHRpb25hbE5ld0FuZENvbnN0ID0gZmFsc2U7CiAKLSAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgcGFyc2UgbWl4aW4gZGVjbGFyYXRpb25zLgotICAgKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2xhbmd1YWdlL2lzc3Vlcy8xMgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgcGFyc2UgbWl4aW4gZGVjbGFyYXRpb25zLgorICAvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9sYW5ndWFnZS9pc3N1ZXMvMTIKICAgYm9vbCBpc01peGluU3VwcG9ydEVuYWJsZWQgPSBmYWxzZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvIHBhcnNlIHBhcnQtb2YgZGlyZWN0aXZlcyB0aGF0Ci0gICAqIHNwZWNpZnkgYSBVUkkgcmF0aGVyIHRoYW4gYSBsaWJyYXJ5IG5hbWUuCi0gICAqLworICAvLy8gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvIHBhcnNlIHBhcnQtb2YgZGlyZWN0aXZlcyB0aGF0CisgIC8vLyBzcGVjaWZ5IGEgVVJJIHJhdGhlciB0aGFuIGEgbGlicmFyeSBuYW1lLgogICBib29sIGVuYWJsZVVyaUluUGFydE9mID0gZmFsc2U7CiAKICAgQG92ZXJyaWRlCiAgIEdhdGhlcmluZ0Vycm9yTGlzdGVuZXIgbGlzdGVuZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBwYXJzZXIgdXNlZCBieSB0aGUgdGVzdC4KLSAgICoKLSAgICogVGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgaW5pdGlhbGl6ZWQgYnkgaW52b2tpbmcgW2NyZWF0ZVBhcnNlcl0uCi0gICAqLworICAvLy8gVGhlIHBhcnNlciB1c2VkIGJ5IHRoZSB0ZXN0LgorICAvLy8KKyAgLy8vIFRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IGluaXRpYWxpemVkIGJ5IGludm9raW5nIFtjcmVhdGVQYXJzZXJdLgogICBAb3ZlcnJpZGUKICAgUGFyc2VyIHBhcnNlcjsKIApAQCAtOTQ3OSwxMCArOTQyNiw4IEBACiAgICAgbGlzdGVuZXIuYXNzZXJ0Tm9FcnJvcnMoKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgdGhlIFtwYXJzZXJdIGFuZCBbbGlzdGVuZXJdIHVzZWQgYnkgYSB0ZXN0LiBUaGUgW3BhcnNlcl0gd2lsbCBiZQotICAgKiBwcmVwYXJlZCB0byBwYXJzZSB0aGUgdG9rZW5zIHNjYW5uZWQgZnJvbSB0aGUgZ2l2ZW4gW2NvbnRlbnRdLgotICAgKi8KKyAgLy8vIENyZWF0ZSB0aGUgW3BhcnNlcl0gYW5kIFtsaXN0ZW5lcl0gdXNlZCBieSBhIHRlc3QuIFRoZSBbcGFyc2VyXSB3aWxsIGJlCisgIC8vLyBwcmVwYXJlZCB0byBwYXJzZSB0aGUgdG9rZW5zIHNjYW5uZWQgZnJvbSB0aGUgZ2l2ZW4gW2NvbnRlbnRdLgogICBAb3ZlcnJpZGUKICAgdm9pZCBjcmVhdGVQYXJzZXIoCiAgICAgU3RyaW5nIGNvbnRlbnQsIHsKQEAgLTk2MTIsMTUgKzk1NTcsMTUgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUGFyc2UgdGhlIGdpdmVuIHNvdXJjZSBhcyBhIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBwYXJzZWQKLSAgICogQHBhcmFtIGVycm9yQ29kZXMgdGhlIGVycm9yIGNvZGVzIG9mIHRoZSBlcnJvcnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQKLSAgICogQHJldHVybiB0aGUgY29tcGlsYXRpb24gdW5pdCB0aGF0IHdhcyBwYXJzZWQKLSAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb3VsZCBub3QgYmUgcGFyc2VkLCBpZiB0aGUgY29tcGlsYXRpb24gZXJyb3JzIGluIHRoZSBzb3VyY2UgZG8KLSAgICogICAgICAgICAgIG5vdCBtYXRjaCB0aG9zZSB0aGF0IGFyZSBleHBlY3RlZCwgb3IgaWYgdGhlIHJlc3VsdCB3b3VsZCBoYXZlIGJlZW4gYG51bGxgCi0gICAqLworICAvLy8gUGFyc2UgdGhlIGdpdmVuIHNvdXJjZSBhcyBhIGNvbXBpbGF0aW9uIHVuaXQuCisgIC8vLworICAvLy8gQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHRvIGJlIHBhcnNlZAorICAvLy8gQHBhcmFtIGVycm9yQ29kZXMgdGhlIGVycm9yIGNvZGVzIG9mIHRoZSBlcnJvcnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUKKyAgLy8vICAgICAgICAgIGZvdW5kCisgIC8vLyBAcmV0dXJuIHRoZSBjb21waWxhdGlvbiB1bml0IHRoYXQgd2FzIHBhcnNlZAorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb3VsZCBub3QgYmUgcGFyc2VkLCBpZiB0aGUgY29tcGlsYXRpb24KKyAgLy8vICAgICAgICAgICBlcnJvcnMgaW4gdGhlIHNvdXJjZSBkbyBub3QgbWF0Y2ggdGhvc2UgdGhhdCBhcmUgZXhwZWN0ZWQsIG9yIGlmCisgIC8vLyAgICAgICAgICAgdGhlIHJlc3VsdCB3b3VsZCBoYXZlIGJlZW4gYG51bGxgCiAgIEBvdmVycmlkZQogICBDb21waWxhdGlvblVuaXQgcGFyc2VDb21waWxhdGlvblVuaXQoU3RyaW5nIGNvbnRlbnQsCiAgICAgICB7TGlzdDxFcnJvckNvZGU+IGNvZGVzLCBMaXN0PEV4cGVjdGVkRXJyb3I+IGVycm9yc30pIHsKQEAgLTk2NDgsOSArOTU5Myw3IEBACiAgICAgcmV0dXJuIHVuaXQ7CiAgIH0KIAotICAvKioKLSAgICogUGFyc2UgdGhlIGdpdmVuIFtjb250ZW50XSBhcyBhIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAqLworICAvLy8gUGFyc2UgdGhlIGdpdmVuIFtjb250ZW50XSBhcyBhIGNvbXBpbGF0aW9uIHVuaXQuCiAgIENvbXBpbGF0aW9uVW5pdCBwYXJzZUNvbXBpbGF0aW9uVW5pdDIoU3RyaW5nIGNvbnRlbnQsCiAgICAgICB7QW5hbHlzaXNFcnJvckxpc3RlbmVyIGxpc3RlbmVyfSkgewogICAgIFNvdXJjZSBzb3VyY2UgPSBOb25FeGlzdGluZ1NvdXJjZS51bmtub3duOwpAQCAtOTcwNywxMiArOTY1MCwxMCBAQAogICAgIHJldHVybiBwYXJzZXIucGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsKICAgfQogCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgZ2l2ZW4gW3NvdXJjZV0gYXMgYW4gZXhwcmVzc2lvbi4gSWYgYSBsaXN0IG9mIGVycm9yIFtjb2Rlc10gaXMKLSAgICogcHJvdmlkZWQsIHRoZW4gYXNzZXJ0IHRoYXQgdGhlIHByb2R1Y2VkIGVycm9ycyBtYXRjaGVzIHRoZSBsaXN0LiBPdGhlcndpc2UsCi0gICAqIGlmIGEgbGlzdCBvZiBbZXJyb3JzXSBpcyBwcm92aWRlZCwgdGhlIGFzc2VydCB0aGF0IHRoZSBwcm9kdWNlZCBlcnJvcnMKLSAgICogbWF0Y2hlcyB0aGUgbGlzdC4gT3RoZXJ3aXNlLCBhc3NlcnQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzLgotICAgKi8KKyAgLy8vIFBhcnNlIHRoZSBnaXZlbiBbc291cmNlXSBhcyBhbiBleHByZXNzaW9uLiBJZiBhIGxpc3Qgb2YgZXJyb3IgW2NvZGVzXSBpcworICAvLy8gcHJvdmlkZWQsIHRoZW4gYXNzZXJ0IHRoYXQgdGhlIHByb2R1Y2VkIGVycm9ycyBtYXRjaGVzIHRoZSBsaXN0LgorICAvLy8gT3RoZXJ3aXNlLCBpZiBhIGxpc3Qgb2YgW2Vycm9yc10gaXMgcHJvdmlkZWQsIHRoZSBhc3NlcnQgdGhhdCB0aGUgcHJvZHVjZWQKKyAgLy8vIGVycm9ycyBtYXRjaGVzIHRoZSBsaXN0LiBPdGhlcndpc2UsIGFzc2VydCB0aGF0IHRoZXJlIGFyZSBubyBlcnJvcnMuCiAgIEBvdmVycmlkZQogICBFeHByZXNzaW9uIHBhcnNlRXhwcmVzc2lvbihTdHJpbmcgc291cmNlLAogICAgICAge0xpc3Q8RXJyb3JDb2RlPiBjb2RlcywKQEAgLTk3OTEsMTAgKzk3MzIsOCBAQAogICAgIHJldHVybiBsaXN0OwogICB9CiAKLSAgLyoqCi0gICAqIFBhcnNlcyBhIHNpbmdsZSB0b3AgbGV2ZWwgbWVtYmVyIG9mIGEgY29tcGlsYXRpb24gdW5pdCAob3RoZXIgdGhhbiBhCi0gICAqIGRpcmVjdGl2ZSksIGluY2x1ZGluZyBhbnkgY29tbWVudCBhbmQvb3IgbWV0YWRhdGEgdGhhdCBwcmVjZWRlcyBpdC4KLSAgICovCisgIC8vLyBQYXJzZXMgYSBzaW5nbGUgdG9wIGxldmVsIG1lbWJlciBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgKG90aGVyIHRoYW4gYQorICAvLy8gZGlyZWN0aXZlKSwgaW5jbHVkaW5nIGFueSBjb21tZW50IGFuZC9vciBtZXRhZGF0YSB0aGF0IHByZWNlZGVzIGl0LgogICBAb3ZlcnJpZGUKICAgQ29tcGlsYXRpb25Vbml0TWVtYmVyIHBhcnNlRnVsbENvbXBpbGF0aW9uVW5pdE1lbWJlcigpID0+IHVzaW5nRmFzdGFQYXJzZXIKICAgICAgID8gcGFyc2VyLnBhcnNlQ29tcGlsYXRpb25Vbml0MigpLmRlY2xhcmF0aW9ucy5maXJzdApAQCAtOTk4NiwxMCArOTkyNSw5IEBACiAgICAgcmV0dXJuIHBhcnNlci5wYXJzZVNpbXBsZUlkZW50aWZpZXIoKTsKICAgfQogCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgZ2l2ZW4gW2NvbnRlbnRdIGFzIGEgc3RhdGVtZW50LiBJZiBbZW5hYmxlTGF6eUFzc2lnbm1lbnRPcGVyYXRvcnNdCi0gICAqIGlzIGB0cnVlYCwgdGhlbiBsYXp5IGFzc2lnbm1lbnQgb3BlcmF0b3JzIHNob3VsZCBiZSBlbmFibGVkLgotICAgKi8KKyAgLy8vIFBhcnNlIHRoZSBnaXZlbiBbY29udGVudF0gYXMgYSBzdGF0ZW1lbnQuIElmCisgIC8vLyBbZW5hYmxlTGF6eUFzc2lnbm1lbnRPcGVyYXRvcnNdIGlzIGB0cnVlYCwgdGhlbiBsYXp5IGFzc2lnbm1lbnQgb3BlcmF0b3JzCisgIC8vLyBzaG91bGQgYmUgZW5hYmxlZC4KICAgQG92ZXJyaWRlCiAgIFN0YXRlbWVudCBwYXJzZVN0YXRlbWVudChTdHJpbmcgY29udGVudCwge2ludCBleHBlY3RlZEVuZE9mZnNldH0pIHsKICAgICBTb3VyY2Ugc291cmNlID0gVGVzdFNvdXJjZSgpOwpAQCAtMTAwMDksMTcgKzk5NDcsMTcgQEAKICAgICByZXR1cm4gc3RhdGVtZW50OwogICB9CiAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBnaXZlbiBzb3VyY2UgYXMgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgdG8gYmUgcGFyc2VkCi0gICAqIEBwYXJhbSBleHBlY3RlZENvdW50IHRoZSBudW1iZXIgb2Ygc3RhdGVtZW50cyB0aGF0IGFyZSBleHBlY3RlZAotICAgKiBAcGFyYW0gZXJyb3JDb2RlcyB0aGUgZXJyb3IgY29kZXMgb2YgdGhlIGVycm9ycyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBzdGF0ZW1lbnRzIHRoYXQgd2VyZSBwYXJzZWQKLSAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb3VsZCBub3QgYmUgcGFyc2VkLCBpZiB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgZG9lcyBub3QgbWF0Y2gKLSAgICogICAgICAgICAgIHRoZSBleHBlY3RlZCBjb3VudCwgaWYgdGhlIGNvbXBpbGF0aW9uIGVycm9ycyBpbiB0aGUgc291cmNlIGRvIG5vdCBtYXRjaCB0aG9zZSB0aGF0Ci0gICAqICAgICAgICAgICBhcmUgZXhwZWN0ZWQsIG9yIGlmIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIGBudWxsYAotICAgKi8KKyAgLy8vIFBhcnNlIHRoZSBnaXZlbiBzb3VyY2UgYXMgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBwYXJzZWQKKyAgLy8vIEBwYXJhbSBleHBlY3RlZENvdW50IHRoZSBudW1iZXIgb2Ygc3RhdGVtZW50cyB0aGF0IGFyZSBleHBlY3RlZAorICAvLy8gQHBhcmFtIGVycm9yQ29kZXMgdGhlIGVycm9yIGNvZGVzIG9mIHRoZSBlcnJvcnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUKKyAgLy8vICAgICAgICAgIGZvdW5kCisgIC8vLyBAcmV0dXJuIHRoZSBzdGF0ZW1lbnRzIHRoYXQgd2VyZSBwYXJzZWQKKyAgLy8vIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY291bGQgbm90IGJlIHBhcnNlZCwgaWYgdGhlIG51bWJlciBvZgorICAvLy8gICAgICAgICAgIHN0YXRlbWVudHMgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGNvdW50LCBpZiB0aGUgY29tcGlsYXRpb24KKyAgLy8vICAgICAgICAgICBlcnJvcnMgaW4gdGhlIHNvdXJjZSBkbyBub3QgbWF0Y2ggdGhvc2UgdGhhdCBhcmUgZXhwZWN0ZWQsIG9yIGlmCisgIC8vLyAgICAgICAgICAgdGhlIHJlc3VsdCB3b3VsZCBoYXZlIGJlZW4gYG51bGxgCiAgIExpc3Q8U3RhdGVtZW50PiBwYXJzZVN0YXRlbWVudHMoU3RyaW5nIGNvbnRlbnQsIGludCBleHBlY3RlZENvdW50LAogICAgICAgW0xpc3Q8RXJyb3JDb2RlPiBlcnJvckNvZGVzID0gY29uc3QgPEVycm9yQ29kZT5bXV0pIHsKICAgICBTb3VyY2Ugc291cmNlID0gVGVzdFNvdXJjZSgpOwpAQCAtMTAwODgsMTEgKzEwMDI2LDkgQEAKICAgfQogfQogCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIHRoYXQgYWlkIGluIHBhcnNlciB0ZXN0cy4KLSAqCi0gKiBJbnRlbmRlZCB0byBiZSBtaXhlZCBpbiB0byBwYXJzZXIgdGVzdCBjYXNlIGNsYXNzZXMuCi0gKi8KKy8vLyBIZWxwZXIgbWV0aG9kcyB0aGF0IGFpZCBpbiBwYXJzZXIgdGVzdHMuCisvLy8KKy8vLyBJbnRlbmRlZCB0byBiZSBtaXhlZCBpbiB0byBwYXJzZXIgdGVzdCBjYXNlIGNsYXNzZXMuCiBtaXhpbiBQYXJzZXJUZXN0SGVscGVycyB7CiAgIHZvaWQgZXhwZWN0Q29tbWVudFRleHQoQ29tbWVudCBjb21tZW50LCBTdHJpbmcgZXhwZWN0ZWRUZXh0KSB7CiAgICAgZXhwZWN0KGNvbW1lbnQuYmVnaW5Ub2tlbiwgc2FtZShjb21tZW50LmVuZFRva2VuKSk7CkBAIC0xMDExMSwxNyArMTAwNDcsMTMgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIG9mIHRoZSBhbmFseXplciBwYXJzZXIgYmFzZWQgb24gW1JlY292ZXJ5UGFyc2VyVGVzdE1peGluXS4KLSAqLworLy8vIFRlc3RzIG9mIHRoZSBhbmFseXplciBwYXJzZXIgYmFzZWQgb24gW1JlY292ZXJ5UGFyc2VyVGVzdE1peGluXS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgUmVjb3ZlcnlQYXJzZXJUZXN0IGV4dGVuZHMgUGFyc2VyVGVzdENhc2Ugd2l0aCBSZWNvdmVyeVBhcnNlclRlc3RNaXhpbiB7fQogCi0vKioKLSAqIFRoZSBjbGFzcyBgUmVjb3ZlcnlQYXJzZXJUZXN0YCBkZWZpbmVzIHBhcnNlciB0ZXN0cyB0aGF0IHRlc3QgdGhlIHBhcnNpbmcgb2YKLSAqIGludmFsaWQgY29kZSBzZXF1ZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgcmVjb3Zlcnkgc3RlcHMgYXJlIHRha2VuIGluCi0gKiB0aGUgcGFyc2VyLgotICovCisvLy8gVGhlIGNsYXNzIGBSZWNvdmVyeVBhcnNlclRlc3RgIGRlZmluZXMgcGFyc2VyIHRlc3RzIHRoYXQgdGVzdCB0aGUgcGFyc2luZyBvZgorLy8vIGludmFsaWQgY29kZSBzZXF1ZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgcmVjb3Zlcnkgc3RlcHMgYXJlIHRha2VuCisvLy8gaW4gdGhlIHBhcnNlci4KIG1peGluIFJlY292ZXJ5UGFyc2VyVGVzdE1peGluIGltcGxlbWVudHMgQWJzdHJhY3RQYXJzZXJUZXN0Q2FzZSB7CiAgIHZvaWQgdGVzdF9hZGRpdGl2ZUV4cHJlc3Npb25fbWlzc2luZ19MSFMoKSB7CiAgICAgQmluYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uID0KQEAgLTExODQxLDkgKzExNzczLDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIG9mIHRoZSBhbmFseXplciBwYXJzZXIgYmFzZWQgb24gW1NpbXBsZVBhcnNlclRlc3RNaXhpbl0uCi0gKi8KKy8vLyBUZXN0cyBvZiB0aGUgYW5hbHl6ZXIgcGFyc2VyIGJhc2VkIG9uIFtTaW1wbGVQYXJzZXJUZXN0TWl4aW5dLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBTaW1wbGVQYXJzZXJUZXN0IGV4dGVuZHMgUGFyc2VyVGVzdENhc2Ugd2l0aCBTaW1wbGVQYXJzZXJUZXN0TWl4aW4gewogICB2b2lkIHRlc3RfY29tcHV0ZVN0cmluZ1ZhbHVlX2VtcHR5SW50ZXJwb2xhdGlvblByZWZpeCgpIHsKQEAgLTEyNTc3LDE1ICsxMjUwNywxNCBAQAogICAgIGV4cGVjdChmb2xsb3dpbmcudHlwZSwgVG9rZW5UeXBlLlBMVVMpOwogICB9CiAKLSAgLyoqCi0gICAqIEludm9rZSB0aGUgbWV0aG9kIFtQYXJzZXIuY29tcHV0ZVN0cmluZ1ZhbHVlXSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGxleGVtZSB0aGUgYXJndW1lbnQgdG8gdGhlIG1ldGhvZAotICAgKiBAcGFyYW0gZmlyc3QgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRva2VuIGluIGEgc3RyaW5nIGxpdGVyYWwKLSAgICogQHBhcmFtIGxhc3QgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gaW4gYSBzdHJpbmcgbGl0ZXJhbAotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGNvdWxkIG5vdCBiZSBpbnZva2VkIG9yIHRocm93cyBhbiBleGNlcHRpb24KLSAgICovCisgIC8vLyBJbnZva2UgdGhlIG1ldGhvZCBbUGFyc2VyLmNvbXB1dGVTdHJpbmdWYWx1ZV0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQuCisgIC8vLworICAvLy8gQHBhcmFtIGxleGVtZSB0aGUgYXJndW1lbnQgdG8gdGhlIG1ldGhvZAorICAvLy8gQHBhcmFtIGZpcnN0IGB0cnVlYCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0b2tlbiBpbiBhIHN0cmluZyBsaXRlcmFsCisgIC8vLyBAcGFyYW0gbGFzdCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBpbiBhIHN0cmluZyBsaXRlcmFsCisgIC8vLyBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4KKyAgLy8vICAgICAgICAgICBleGNlcHRpb24KICAgU3RyaW5nIF9jb21wdXRlU3RyaW5nVmFsdWUoU3RyaW5nIGxleGVtZSwgYm9vbCBmaXJzdCwgYm9vbCBsYXN0KSB7CiAgICAgY3JlYXRlUGFyc2VyKCcnKTsKICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIuY29tcHV0ZVN0cmluZ1ZhbHVlKGxleGVtZSwgZmlyc3QsIGxhc3QpOwpAQCAtMTI1OTMsMTQgKzEyNTIyLDE0IEBACiAgICAgcmV0dXJuIHZhbHVlOwogICB9CiAKLSAgLyoqCi0gICAqIEludm9rZSB0aGUgbWV0aG9kIFtQYXJzZXIuaXNGdW5jdGlvbkRlY2xhcmF0aW9uXSB3aXRoIHRoZSBwYXJzZXIgc2V0IHRvIHRoZSB0b2tlbgotICAgKiBzdHJlYW0gcHJvZHVjZWQgYnkgc2Nhbm5pbmcgdGhlIGdpdmVuIHNvdXJjZS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIHRvIGJlIHNjYW5uZWQgdG8gcHJvZHVjZSB0aGUgdG9rZW4gc3RyZWFtIGJlaW5nIHRlc3RlZAotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGNvdWxkIG5vdCBiZSBpbnZva2VkIG9yIHRocm93cyBhbiBleGNlcHRpb24KLSAgICovCisgIC8vLyBJbnZva2UgdGhlIG1ldGhvZCBbUGFyc2VyLmlzRnVuY3Rpb25EZWNsYXJhdGlvbl0gd2l0aCB0aGUgcGFyc2VyIHNldCB0bworICAvLy8gdGhlIHRva2VuIHN0cmVhbSBwcm9kdWNlZCBieSBzY2FubmluZyB0aGUgZ2l2ZW4gc291cmNlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBzY2FubmVkIHRvIHByb2R1Y2UgdGhlIHRva2VuIHN0cmVhbSBiZWluZworICAvLy8gICAgICAgICAgdGVzdGVkCisgIC8vLyBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4KKyAgLy8vICAgICAgICAgICBleGNlcHRpb24KICAgYm9vbCBfaXNGdW5jdGlvbkRlY2xhcmF0aW9uKFN0cmluZyBzb3VyY2UpIHsKICAgICBjcmVhdGVQYXJzZXIoc291cmNlKTsKICAgICBib29sIHJlc3VsdCA9IHBhcnNlci5pc0Z1bmN0aW9uRGVjbGFyYXRpb24oKTsKQEAgLTEyNjA4LDI3ICsxMjUzNywyNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICAvKioKLSAgICogSW52b2tlIHRoZSBtZXRob2QgW1BhcnNlci5pc0Z1bmN0aW9uRXhwcmVzc2lvbl0gd2l0aCB0aGUgcGFyc2VyIHNldCB0byB0aGUgdG9rZW4gc3RyZWFtCi0gICAqIHByb2R1Y2VkIGJ5IHNjYW5uaW5nIHRoZSBnaXZlbiBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBzY2FubmVkIHRvIHByb2R1Y2UgdGhlIHRva2VuIHN0cmVhbSBiZWluZyB0ZXN0ZWQKLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBtZXRob2QKLSAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAqLworICAvLy8gSW52b2tlIHRoZSBtZXRob2QgW1BhcnNlci5pc0Z1bmN0aW9uRXhwcmVzc2lvbl0gd2l0aCB0aGUgcGFyc2VyIHNldCB0byB0aGUKKyAgLy8vIHRva2VuIHN0cmVhbSBwcm9kdWNlZCBieSBzY2FubmluZyB0aGUgZ2l2ZW4gc291cmNlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBzY2FubmVkIHRvIHByb2R1Y2UgdGhlIHRva2VuIHN0cmVhbSBiZWluZworICAvLy8gICAgICAgICAgdGVzdGVkCisgIC8vLyBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4KKyAgLy8vICAgICAgICAgICBleGNlcHRpb24KICAgYm9vbCBfaXNGdW5jdGlvbkV4cHJlc3Npb24oU3RyaW5nIHNvdXJjZSkgewogICAgIGNyZWF0ZVBhcnNlcihzb3VyY2UpOwogICAgIHJldHVybiBwYXJzZXIuaXNGdW5jdGlvbkV4cHJlc3Npb24ocGFyc2VyLmN1cnJlbnRUb2tlbik7CiAgIH0KIAotICAvKioKLSAgICogSW52b2tlIHRoZSBtZXRob2QgW1BhcnNlci5pc0luaXRpYWxpemVkVmFyaWFibGVEZWNsYXJhdGlvbl0gd2l0aCB0aGUgcGFyc2VyIHNldCB0byB0aGUKLSAgICogdG9rZW4gc3RyZWFtIHByb2R1Y2VkIGJ5IHNjYW5uaW5nIHRoZSBnaXZlbiBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBzY2FubmVkIHRvIHByb2R1Y2UgdGhlIHRva2VuIHN0cmVhbSBiZWluZyB0ZXN0ZWQKLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBtZXRob2QKLSAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAqLworICAvLy8gSW52b2tlIHRoZSBtZXRob2QgW1BhcnNlci5pc0luaXRpYWxpemVkVmFyaWFibGVEZWNsYXJhdGlvbl0gd2l0aCB0aGUKKyAgLy8vIHBhcnNlciBzZXQgdG8gdGhlIHRva2VuIHN0cmVhbSBwcm9kdWNlZCBieSBzY2FubmluZyB0aGUgZ2l2ZW4gc291cmNlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBiZSBzY2FubmVkIHRvIHByb2R1Y2UgdGhlIHRva2VuIHN0cmVhbSBiZWluZworICAvLy8gICAgICAgICAgdGVzdGVkCisgIC8vLyBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIG1ldGhvZAorICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBjb3VsZCBub3QgYmUgaW52b2tlZCBvciB0aHJvd3MgYW4KKyAgLy8vICAgICAgICAgICBleGNlcHRpb24KICAgYm9vbCBfaXNJbml0aWFsaXplZFZhcmlhYmxlRGVjbGFyYXRpb24oU3RyaW5nIHNvdXJjZSkgewogICAgIGNyZWF0ZVBhcnNlcihzb3VyY2UpOwogICAgIGJvb2wgcmVzdWx0ID0gcGFyc2VyLmlzSW5pdGlhbGl6ZWRWYXJpYWJsZURlY2xhcmF0aW9uKCk7CkBAIC0xMjYzNiwxNCArMTI1NjUsMTQgQEAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKLSAgLyoqCi0gICAqIEludm9rZSB0aGUgbWV0aG9kIFtQYXJzZXIuaXNTd2l0Y2hNZW1iZXJdIHdpdGggdGhlIHBhcnNlciBzZXQgdG8gdGhlIHRva2VuIHN0cmVhbQotICAgKiBwcm9kdWNlZCBieSBzY2FubmluZyB0aGUgZ2l2ZW4gc291cmNlLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgdG8gYmUgc2Nhbm5lZCB0byBwcm9kdWNlIHRoZSB0b2tlbiBzdHJlYW0gYmVpbmcgdGVzdGVkCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnZva2luZyB0aGUgbWV0aG9kCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgY291bGQgbm90IGJlIGludm9rZWQgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbgotICAgKi8KKyAgLy8vIEludm9rZSB0aGUgbWV0aG9kIFtQYXJzZXIuaXNTd2l0Y2hNZW1iZXJdIHdpdGggdGhlIHBhcnNlciBzZXQgdG8gdGhlIHRva2VuCisgIC8vLyBzdHJlYW0gcHJvZHVjZWQgYnkgc2Nhbm5pbmcgdGhlIGdpdmVuIHNvdXJjZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgdG8gYmUgc2Nhbm5lZCB0byBwcm9kdWNlIHRoZSB0b2tlbiBzdHJlYW0gYmVpbmcKKyAgLy8vICAgICAgICAgIHRlc3RlZAorICAvLy8gQHJldHVybiB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBtZXRob2QKKyAgLy8vIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgY291bGQgbm90IGJlIGludm9rZWQgb3IgdGhyb3dzIGFuCisgIC8vLyAgICAgICAgICAgZXhjZXB0aW9uCiAgIGJvb2wgX2lzU3dpdGNoTWVtYmVyKFN0cmluZyBzb3VyY2UpIHsKICAgICBjcmVhdGVQYXJzZXIoc291cmNlKTsKICAgICBib29sIHJlc3VsdCA9IHBhcnNlci5pc1N3aXRjaE1lbWJlcigpOwpAQCAtMTI2NTIsMTMgKzEyNTgxLDExIEBACiAgIH0KIH0KIAotLyoqCi0gKiBQYXJzZXIgdGVzdHMgdGhhdCB0ZXN0IGluZGl2aWR1YWwgcGFyc2luZyBtZXRob2RzLiBUaGUgY29kZSBmcmFnbWVudHMgc2hvdWxkCi0gKiBiZSBhcyBtaW5pbWFsIGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIHRlc3QgdGhlIG1ldGhvZCwgYnV0IHNob3VsZCBub3QgdGVzdAotICogdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBtZXRob2QgdW5kZXIgdGVzdCBhbmQgb3RoZXIgbWV0aG9kcy4KLSAqCi0gKiBNb3JlIGNvbXBsZXggdGVzdHMgc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGNsYXNzIFtDb21wbGV4UGFyc2VyVGVzdF0uCi0gKi8KKy8vLyBQYXJzZXIgdGVzdHMgdGhhdCB0ZXN0IGluZGl2aWR1YWwgcGFyc2luZyBtZXRob2RzLiBUaGUgY29kZSBmcmFnbWVudHMgc2hvdWxkCisvLy8gYmUgYXMgbWluaW1hbCBhcyBwb3NzaWJsZSBpbiBvcmRlciB0byB0ZXN0IHRoZSBtZXRob2QsIGJ1dCBzaG91bGQgbm90IHRlc3QKKy8vLyB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIG1ldGhvZCB1bmRlciB0ZXN0IGFuZCBvdGhlciBtZXRob2RzLgorLy8vCisvLy8gTW9yZSBjb21wbGV4IHRlc3RzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBbQ29tcGxleFBhcnNlclRlc3RdLgogbWl4aW4gU2ltcGxlUGFyc2VyVGVzdE1peGluIGltcGxlbWVudHMgQWJzdHJhY3RQYXJzZXJUZXN0Q2FzZSB7CiAgIENvbnN0cnVjdG9yTmFtZSBwYXJzZUNvbnN0cnVjdG9yTmFtZShTdHJpbmcgbmFtZSkgewogICAgIGNyZWF0ZVBhcnNlcignbmV3ICRuYW1lKCk7Jyk7CkBAIC0xMjcwNSwxMiArMTI2MzIsMTAgQEAKICAgICByZXR1cm4gZGlyZWN0aXZlLm5hbWU7CiAgIH0KIAotICAvKioKLSAgICogUGFyc2UgdGhlIGdpdmVuIFtjb250ZW50XSBhcyBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYnkgZW5jbG9zaW5nIGl0IGluIGEKLSAgICogYmxvY2suIFRoZSBbZXhwZWN0ZWRDb3VudF0gaXMgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvCi0gICAqIGJlIHBhcnNlZC4gSWYgW2Vycm9yQ29kZXNdIGFyZSBwcm92aWRlZCwgdmVyaWZ5IHRoYXQgdGhlIGVycm9yIGNvZGVzIG9mIHRoZQotICAgKiBlcnJvcnMgdGhhdCBhcmUgZXhwZWN0ZWQgYXJlIGZvdW5kLgotICAgKi8KKyAgLy8vIFBhcnNlIHRoZSBnaXZlbiBbY29udGVudF0gYXMgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGJ5IGVuY2xvc2luZyBpdCBpbiBhCisgIC8vLyBibG9jay4gVGhlIFtleHBlY3RlZENvdW50XSBpcyB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgdGhhdCBhcmUgZXhwZWN0ZWQKKyAgLy8vIHRvIGJlIHBhcnNlZC4gSWYgW2Vycm9yQ29kZXNdIGFyZSBwcm92aWRlZCwgdmVyaWZ5IHRoYXQgdGhlIGVycm9yIGNvZGVzIG9mCisgIC8vLyB0aGUgZXJyb3JzIHRoYXQgYXJlIGV4cGVjdGVkIGFyZSBmb3VuZC4KICAgdm9pZCBwYXJzZVN0YXRlbWVudExpc3QoU3RyaW5nIGNvbnRlbnQsIGludCBleHBlY3RlZENvdW50KSB7CiAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCd7JGNvbnRlbnR9Jyk7CiAgICAgZXhwZWN0KHN0YXRlbWVudCwgaXNCbG9jayk7CkBAIC0xNDYwNSwxMCArMTQ1MzAsOCBAQAogY2xhc3MgU3RhdGVtZW50UGFyc2VyVGVzdCBleHRlbmRzIFBhcnNlclRlc3RDYXNlIHdpdGggU3RhdGVtZW50UGFyc2VyVGVzdE1peGluIHsKIH0KIAotLyoqCi0gKiBUaGUgY2xhc3MgW0Zvcm1hbFBhcmFtZXRlclBhcnNlclRlc3RNaXhpbl0gZGVmaW5lcyBwYXJzZXIgdGVzdHMgdGhhdCB0ZXN0Ci0gKiB0aGUgcGFyc2luZyBzdGF0ZW1lbnRzLgotICovCisvLy8gVGhlIGNsYXNzIFtGb3JtYWxQYXJhbWV0ZXJQYXJzZXJUZXN0TWl4aW5dIGRlZmluZXMgcGFyc2VyIHRlc3RzIHRoYXQgdGVzdAorLy8vIHRoZSBwYXJzaW5nIHN0YXRlbWVudHMuCiBtaXhpbiBTdGF0ZW1lbnRQYXJzZXJUZXN0TWl4aW4gaW1wbGVtZW50cyBBYnN0cmFjdFBhcnNlclRlc3RDYXNlIHsKICAgdm9pZCB0ZXN0X2ludmFsaWRfdHlwZVBhcmFtQW5ub3RhdGlvbigpIHsKICAgICBwYXJzZUNvbXBpbGF0aW9uVW5pdCgnbWFpbigpIHsgQzxARm9vIFQ+IHY7IH0nLApAQCAtMTYwMTIsMTAgKzE1OTM1LDggQEAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgVG9wTGV2ZWxQYXJzZXJUZXN0IGV4dGVuZHMgUGFyc2VyVGVzdENhc2Ugd2l0aCBUb3BMZXZlbFBhcnNlclRlc3RNaXhpbiB7fQogCi0vKioKLSAqIFRlc3RzIHdoaWNoIGV4ZXJjaXNlIHRoZSBwYXJzZXIgdXNpbmcgYSBjb21wbGV0ZSBjb21waWxhdGlvbiB1bml0IG9yCi0gKiBjb21waWxhdGlvbiB1bml0IG1lbWJlci4KLSAqLworLy8vIFRlc3RzIHdoaWNoIGV4ZXJjaXNlIHRoZSBwYXJzZXIgdXNpbmcgYSBjb21wbGV0ZSBjb21waWxhdGlvbiB1bml0IG9yCisvLy8gY29tcGlsYXRpb24gdW5pdCBtZW1iZXIuCiBtaXhpbiBUb3BMZXZlbFBhcnNlclRlc3RNaXhpbiBpbXBsZW1lbnRzIEFic3RyYWN0UGFyc2VyVGVzdENhc2UgewogICB2b2lkIHRlc3RfZnVuY3Rpb25fbGl0ZXJhbF9hbGxvd2VkX2F0X3RvcGxldmVsKCkgewogICAgIHBhcnNlQ29tcGlsYXRpb25Vbml0KCJ2YXIgeCA9ICgpIHt9OyIpOwpAQCAtMTgxMTQsOSArMTgwMzUsNyBAQAogICAgIGV4cGVjdENvbW1lbnRUZXh0KHR5cGVWYXJpYWJsZS5kb2N1bWVudGF0aW9uQ29tbWVudCwgJy8vLyBEb2MnKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gW25hbWVdIGlzIGluIGRlY2xhcmF0aW9uIGNvbnRleHQuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIFtuYW1lXSBpcyBpbiBkZWNsYXJhdGlvbiBjb250ZXh0LgogICB2b2lkIF9hc3NlcnRJc0RlY2xhcmF0aW9uTmFtZShTaW1wbGVJZGVudGlmaWVyIG5hbWUpIHsKICAgICBleHBlY3QobmFtZS5pbkRlY2xhcmF0aW9uQ29udGV4dCgpLCBpc1RydWUpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcmVzb2x2ZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Jlc29sdmVyX3Rlc3QuZGFydAppbmRleCBiMTgyNjQwLi5mYzdhYjU4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcmVzb2x2ZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9yZXNvbHZlcl90ZXN0LmRhcnQKQEAgLTksMTAgKzksMTAgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvc2NvcGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcGFyc2VyLmRhcnQnIHNob3cgUGFyc2VyRXJyb3JDb2RlOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2FzdF90ZXN0X2ZhY3RvcnkuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2VsZW1lbnRfZmFjdG9yeS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CkBAIC0xMDAsOSArMTAwLDggQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3RzIGZvciBnZW5lcmljIG1ldGhvZCBhbmQgZnVuY3Rpb24gcmVzb2x1dGlvbiB0aGF0IGRvIG5vdCB1c2Ugc3Ryb25nIG1vZGUuCi0gKi8KKy8vLyBUZXN0cyBmb3IgZ2VuZXJpYyBtZXRob2QgYW5kIGZ1bmN0aW9uIHJlc29sdXRpb24gdGhhdCBkbyBub3QgdXNlIHN0cm9uZworLy8vIG1vZGUuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIEdlbmVyaWNNZXRob2RSZXNvbHZlclRlc3QgZXh0ZW5kcyBTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdFNoYXJlZCB7CiAgIHRlc3RfZ2VuZXJpY01ldGhvZF9wcm9wYWdhdGVkVHlwZV9wcm9tb3Rpb24oKSBhc3luYyB7CkBAIC00NzAsMTQgKzQ2OSwxMCBAQAogICAvLy8gVGhlIFR5cGVBbm5vdGF0aW9uIG5vZGVzIHRoYXQgd2VyZSBub3QgcmVzb2x2ZWQuCiAgIGZpbmFsIExpc3Q8VHlwZUFubm90YXRpb24+IF91bnJlc29sdmVkVHlwZXMgPSA8VHlwZUFubm90YXRpb24+W107CiAKLSAgLyoqCi0gICAqIENvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgRXhwcmVzc2lvbiBub2RlcyB2aXNpdGVkIHRoYXQgYXJlIHJlc29sdmVkLgotICAgKi8KKyAgLy8vIENvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgRXhwcmVzc2lvbiBub2RlcyB2aXNpdGVkIHRoYXQgYXJlIHJlc29sdmVkLgogICBpbnQgX3Jlc29sdmVkRXhwcmVzc2lvbkNvdW50ID0gMDsKIAotICAvKioKLSAgICogQ291bnRlciBmb3IgdGhlIG51bWJlciBvZiBUeXBlTmFtZSBub2RlcyB2aXNpdGVkIHRoYXQgYXJlIHJlc29sdmVkLgotICAgKi8KKyAgLy8vIENvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgVHlwZU5hbWUgbm9kZXMgdmlzaXRlZCB0aGF0IGFyZSByZXNvbHZlZC4KICAgaW50IF9yZXNvbHZlZFR5cGVDb3VudCA9IDA7CiAKICAgLy8vIEFzc2VydCB0aGF0IGFsbCBvZiB0aGUgdmlzaXRlZCBub2RlcyBoYXZlIGEgc3RhdGljIHR5cGUgYXNzb2NpYXRlZCB3aXRoCkBAIC02MzMsMTAgKzYyOCw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUaGUgY2xhc3MgYFN0cmljdE1vZGVUZXN0YCBjb250YWlucyB0ZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBlcnJvcnMKLSAqIGFuZCB3YXJuaW5ncyBhcmUgcmVwb3J0ZWQgd2hlbiB0aGUgYW5hbHlzaXMgZW5naW5lIGlzIHJ1biBpbiBzdHJpY3QgbW9kZS4KLSAqLworLy8vIFRoZSBjbGFzcyBgU3RyaWN0TW9kZVRlc3RgIGNvbnRhaW5zIHRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGVycm9ycworLy8vIGFuZCB3YXJuaW5ncyBhcmUgcmVwb3J0ZWQgd2hlbiB0aGUgYW5hbHlzaXMgZW5naW5lIGlzIHJ1biBpbiBzdHJpY3QgbW9kZS4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgU3RyaWN0TW9kZVRlc3QgZXh0ZW5kcyBEcml2ZXJSZXNvbHV0aW9uVGVzdCB7CiAgIHRlc3RfYXNzZXJ0X2lzKCkgYXN5bmMgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Jlc29sdmVyX3Rlc3RfY2FzZS5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Jlc29sdmVyX3Rlc3RfY2FzZS5kYXJ0CmluZGV4IDA2YjE1ZGQuLmNiMTgwZmUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9yZXNvbHZlcl90ZXN0X2Nhc2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcmVzb2x2ZXJfdGVzdF9jYXNlLmRhcnQKQEAgLTIwLDExICsyMCwxMSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL3BlcmZvcm1hbmNlX2xvZ2dlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2Vycm9yL2NvZGVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2phdmFfZW5naW5lLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Nkay5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZV9pby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvZWxlbWVudF9mYWN0b3J5LmRhcnQnOwpAQCAtMzksMTUgKzM5LDExIEBACiAKIGNvbnN0IFN0cmluZyBfZGVmYXVsdFNvdXJjZU5hbWUgPSAiL3Rlc3QuZGFydCI7CiAKLS8qKgotICogQW4gQVNUIHZpc2l0b3IgdXNlZCB0byB2ZXJpZnkgdGhhdCBhbGwgb2YgdGhlIG5vZGVzIGluIGFuIEFTVCBzdHJ1Y3R1cmUgdGhhdAotICogc2hvdWxkIGhhdmUgYmVlbiByZXNvbHZlZCB3ZXJlIHJlc29sdmVkLgotICovCisvLy8gQW4gQVNUIHZpc2l0b3IgdXNlZCB0byB2ZXJpZnkgdGhhdCBhbGwgb2YgdGhlIG5vZGVzIGluIGFuIEFTVCBzdHJ1Y3R1cmUgdGhhdAorLy8vIHNob3VsZCBoYXZlIGJlZW4gcmVzb2x2ZWQgd2VyZSByZXNvbHZlZC4KIGNsYXNzIFJlc29sdXRpb25WZXJpZmllciBleHRlbmRzIFJlY3Vyc2l2ZUFzdFZpc2l0b3I8dm9pZD4gewotICAvKioKLSAgICogQSBzZXQgY29udGFpbmluZyBub2RlcyB0aGF0IGFyZSBrbm93biB0byBub3QgYmUgcmVzb2x2YWJsZSBhbmQgc2hvdWxkCi0gICAqIHRoZXJlZm9yZSBub3QgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbC4KLSAgICovCisgIC8vLyBBIHNldCBjb250YWluaW5nIG5vZGVzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBiZSByZXNvbHZhYmxlIGFuZCBzaG91bGQKKyAgLy8vIHRoZXJlZm9yZSBub3QgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbC4KICAgZmluYWwgU2V0PEFzdE5vZGU+IF9rbm93bkV4Y2VwdGlvbnM7CiAKICAgLy8vIEEgbGlzdCBjb250YWluaW5nIGFsbCBvZiB0aGUgQVNUIG5vZGVzIHRoYXQgd2VyZSBub3QgcmVzb2x2ZWQuCkBAIC01NywxOCArNTMsMTQgQEAKICAgLy8vIHRoZSB3cm9uZyB0eXBlLgogICBmaW5hbCBMaXN0PEFzdE5vZGU+IF93cm9uZ1R5cGVkTm9kZXMgPSA8QXN0Tm9kZT5bXTsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdmVyaWZpZXIgdG8gdmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBpZGVudGlmaWVycwotICAgKiBpbiB0aGUgdmlzaXRlZCBBU1Qgc3RydWN0dXJlcyB0aGF0IGFyZSBleHBlY3RlZCB0byBoYXZlIGJlZW4gcmVzb2x2ZWQgaGF2ZQotICAgKiBhbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGVtLiBOb2RlcyBpbiB0aGUgc2V0IG9mIFtfa25vd25FeGNlcHRpb25zXSBhcmUKLSAgICogbm90IGV4cGVjdGVkIHRvIGhhdmUgYmVlbiByZXNvbHZlZCwgZXZlbiBpZiB0aGV5IG5vcm1hbGx5IHdvdWxkIGhhdmUgYmVlbgotICAgKiBleHBlY3RlZCB0byBoYXZlIGJlZW4gcmVzb2x2ZWQuCi0gICAqLworICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdmVyaWZpZXIgdG8gdmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBpZGVudGlmaWVycworICAvLy8gaW4gdGhlIHZpc2l0ZWQgQVNUIHN0cnVjdHVyZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSBiZWVuIHJlc29sdmVkIGhhdmUKKyAgLy8vIGFuIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZW0uIE5vZGVzIGluIHRoZSBzZXQgb2YgW19rbm93bkV4Y2VwdGlvbnNdCisgIC8vLyBhcmUgbm90IGV4cGVjdGVkIHRvIGhhdmUgYmVlbiByZXNvbHZlZCwgZXZlbiBpZiB0aGV5IG5vcm1hbGx5IHdvdWxkIGhhdmUKKyAgLy8vIGJlZW4gZXhwZWN0ZWQgdG8gaGF2ZSBiZWVuIHJlc29sdmVkLgogICBSZXNvbHV0aW9uVmVyaWZpZXIoW3RoaXMuX2tub3duRXhjZXB0aW9uc10pOwogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCBhbGwgb2YgdGhlIHZpc2l0ZWQgaWRlbnRpZmllcnMgd2VyZSByZXNvbHZlZC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCBhbGwgb2YgdGhlIHZpc2l0ZWQgaWRlbnRpZmllcnMgd2VyZSByZXNvbHZlZC4KICAgdm9pZCBhc3NlcnRSZXNvbHZlZCgpIHsKICAgICBpZiAoX3VucmVzb2x2ZWROb2Rlcy5pc05vdEVtcHR5IHx8IF93cm9uZ1R5cGVkTm9kZXMuaXNOb3RFbXB0eSkgewogICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwpAQCAtMzA3LDEwICsyOTksOCBAQAogfQogCiBjbGFzcyBSZXNvbHZlclRlc3RDYXNlIHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluIHsKLSAgLyoqCi0gICAqIFNwZWNpZmllcyBpZiBbYXNzZXJ0RXJyb3JzXSBzaG91bGQgY2hlY2sgZm9yIFtIaW50Q29kZS5VTlVTRURfRUxFTUVOVF0gYW5kCi0gICAqIFtIaW50Q29kZS5VTlVTRURfRklFTERdLgotICAgKi8KKyAgLy8vIFNwZWNpZmllcyBpZiBbYXNzZXJ0RXJyb3JzXSBzaG91bGQgY2hlY2sgZm9yIFtIaW50Q29kZS5VTlVTRURfRUxFTUVOVF0gYW5kCisgIC8vLyBbSGludENvZGUuVU5VU0VEX0ZJRUxEXS4KICAgYm9vbCBlbmFibGVVbnVzZWRFbGVtZW50ID0gZmFsc2U7CiAKICAgLy8vIFNwZWNpZmllcyBpZiBbYXNzZXJ0RXJyb3JzXSBzaG91bGQgY2hlY2sgZm9yCkBAIC0zMjUsMjIgKzMxNSwxNiBAQAogCiAgIEFuYWx5c2lzT3B0aW9ucyBnZXQgYW5hbHlzaXNPcHRpb25zID0+IGRyaXZlcj8uYW5hbHlzaXNPcHRpb25zOwogCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBbQW5hbHlzaXNPcHRpb25zXSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IFtyZXNldF0uCi0gICAqLworICAvLy8gVGhlIGRlZmF1bHQgW0FuYWx5c2lzT3B0aW9uc10gdGhhdCBzaG91bGQgYmUgdXNlZCBieSBbcmVzZXRdLgogICBBbmFseXNpc09wdGlvbnMgZ2V0IGRlZmF1bHRBbmFseXNpc09wdGlvbnMgPT4gQW5hbHlzaXNPcHRpb25zSW1wbCgpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZXhwZXJpbWVudHMgdGhhdCBhcmUgdG8gYmUgZW5hYmxlZCBmb3IgdGVzdHMgaW4gdGhpcwotICAgKiBjbGFzcy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgZXhwZXJpbWVudHMgdGhhdCBhcmUgdG8gYmUgZW5hYmxlZCBmb3IgdGVzdHMgaW4gdGhpcworICAvLy8gY2xhc3MuCiAgIExpc3Q8U3RyaW5nPiBnZXQgZW5hYmxlZEV4cGVyaW1lbnRzID0+IG51bGw7CiAKLSAgLyoqCi0gICAqIFJldHVybiBhIHR5cGUgcHJvdmlkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0IHRoZSByZXN1bHRzIG9mIHJlc29sdXRpb24uCi0gICAqCi0gICAqIFRocm93cyBhbiBbQW5hbHlzaXNFeGNlcHRpb25dIGlmIGBkYXJ0OmNvcmVgIGNhbm5vdCBiZSByZXNvbHZlZC4KLSAgICovCisgIC8vLyBSZXR1cm4gYSB0eXBlIHByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVzdCB0aGUgcmVzdWx0cyBvZiByZXNvbHV0aW9uLgorICAvLy8KKyAgLy8vIFRocm93cyBhbiBbQW5hbHlzaXNFeGNlcHRpb25dIGlmIGBkYXJ0OmNvcmVgIGNhbm5vdCBiZSByZXNvbHZlZC4KICAgVHlwZVByb3ZpZGVyIGdldCB0eXBlUHJvdmlkZXIgewogICAgIGlmIChhbmFseXNpc1Jlc3VsdHMuaXNFbXB0eSkgewogICAgICAgZmFpbCgndHlwZVByb3ZpZGVyIGNhbGxlZCBiZWZvcmUgY29tcHV0aW5nIGFuIGFuYWx5c2lzIHJlc3VsdC4nKTsKQEAgLTM0OCw5ICszMzIsNyBAQAogICAgIHJldHVybiBhbmFseXNpc1Jlc3VsdHMudmFsdWVzLmZpcnN0LnR5cGVQcm92aWRlcjsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gYSB0eXBlIHN5c3RlbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRlc3QgdGhlIHJlc3VsdHMgb2YgcmVzb2x1dGlvbi4KLSAgICovCisgIC8vLyBSZXR1cm4gYSB0eXBlIHN5c3RlbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHRlc3QgdGhlIHJlc3VsdHMgb2YgcmVzb2x1dGlvbi4KICAgVHlwZVN5c3RlbUltcGwgZ2V0IHR5cGVTeXN0ZW0gewogICAgIGlmIChhbmFseXNpc1Jlc3VsdHMuaXNFbXB0eSkgewogICAgICAgZmFpbCgndHlwZVN5c3RlbSBjYWxsZWQgYmVmb3JlIGNvbXB1dGluZyBhbiBhbmFseXNpcyByZXN1bHQuJyk7CkBAIC0zNTgsMTEgKzM0MCwxMCBAQAogICAgIHJldHVybiBhbmFseXNpc1Jlc3VsdHMudmFsdWVzLmZpcnN0LnR5cGVTeXN0ZW07CiAgIH0KIAotICAvKioKLSAgICogQWRkIGEgc291cmNlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uCi0gICAqIFRoZSBmaWxlIHBhdGggc2hvdWxkIGJlIGFic29sdXRlLiBUaGUgZmlsZSB3aWxsIGhhdmUgdGhlIGdpdmVuIFtjb250ZW50c10KLSAgICogc2V0IGluIHRoZSBjb250ZW50IHByb3ZpZGVyLiBSZXR1cm4gdGhlIHNvdXJjZSByZXByZXNlbnRpbmcgdGhlIGFkZGVkIGZpbGUuCi0gICAqLworICAvLy8gQWRkIGEgc291cmNlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gW2ZpbGVQYXRoXSBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZQorICAvLy8gc3lzdGVtLiBUaGUgZmlsZSBwYXRoIHNob3VsZCBiZSBhYnNvbHV0ZS4gVGhlIGZpbGUgd2lsbCBoYXZlIHRoZSBnaXZlbgorICAvLy8gW2NvbnRlbnRzXSBzZXQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIuIFJldHVybiB0aGUgc291cmNlIHJlcHJlc2VudGluZyB0aGUKKyAgLy8vIGFkZGVkIGZpbGUuCiAgIFNvdXJjZSBhZGROYW1lZFNvdXJjZShTdHJpbmcgZmlsZVBhdGgsIFN0cmluZyBjb250ZW50cykgewogICAgIGZpbGVQYXRoID0gY29udmVydFBhdGgoZmlsZVBhdGgpOwogICAgIEZpbGUgZmlsZSA9IG5ld0ZpbGUoZmlsZVBhdGgsIGNvbnRlbnQ6IGNvbnRlbnRzKTsKQEAgLTM3MSwyMCArMzUyLDE2IEBACiAgICAgcmV0dXJuIHNvdXJjZTsKICAgfQogCi0gIC8qKgotICAgKiBBZGQgYSBzb3VyY2UgZmlsZSBuYW1lZCAndGVzdC5kYXJ0JyBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uIFRoZQotICAgKiBmaWxlIHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gW2NvbnRlbnRzXSBzZXQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIuIFJldHVybiB0aGUKLSAgICogc291cmNlIHJlcHJlc2VudGluZyB0aGUgYWRkZWQgZmlsZS4KLSAgICovCisgIC8vLyBBZGQgYSBzb3VyY2UgZmlsZSBuYW1lZCAndGVzdC5kYXJ0JyBpbiB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uIFRoZQorICAvLy8gZmlsZSB3aWxsIGhhdmUgdGhlIGdpdmVuIFtjb250ZW50c10gc2V0IGluIHRoZSBjb250ZW50IHByb3ZpZGVyLiBSZXR1cm4KKyAgLy8vIHRoZSBzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBhZGRlZCBmaWxlLgogICBTb3VyY2UgYWRkU291cmNlKFN0cmluZyBjb250ZW50cykgPT4KICAgICAgIGFkZE5hbWVkU291cmNlKF9kZWZhdWx0U291cmNlTmFtZSwgY29udGVudHMpOwogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgbnVtYmVyIG9mIGVycm9ycyByZXBvcnRlZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgKiBbc291cmNlXSBtYXRjaGVzIHRoZSBudW1iZXIgb2YgZXJyb3JzIHRoYXQgYXJlIGdpdmVuIGFuZCB0aGF0IHRoZXkgaGF2ZQotICAgKiB0aGUgZXhwZWN0ZWQgZXJyb3IgY29kZXMuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZXJyb3JzIHdlcmUgZ2F0aGVyZWQgaXMKLSAgICogaWdub3JlZC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgbnVtYmVyIG9mIGVycm9ycyByZXBvcnRlZCBhZ2FpbnN0IHRoZSBnaXZlbgorICAvLy8gW3NvdXJjZV0gbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGVycm9ycyB0aGF0IGFyZSBnaXZlbiBhbmQgdGhhdCB0aGV5IGhhdmUKKyAgLy8vIHRoZSBleHBlY3RlZCBlcnJvciBjb2Rlcy4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBlcnJvcnMgd2VyZSBnYXRoZXJlZCBpcworICAvLy8gaWdub3JlZC4KICAgdm9pZCBhc3NlcnRFcnJvcnMoU291cmNlIHNvdXJjZSwKICAgICAgIFtMaXN0PEVycm9yQ29kZT4gZXhwZWN0ZWRFcnJvckNvZGVzID0gY29uc3QgPEVycm9yQ29kZT5bXV0pIHsKICAgICBUZXN0QW5hbHlzaXNSZXN1bHQgcmVzdWx0ID0gYW5hbHlzaXNSZXN1bHRzW3NvdXJjZV07CkBAIC00MTAsMTEgKzM4Nyw5IEBACiAgICAgZXJyb3JMaXN0ZW5lci5hc3NlcnRFcnJvcnNXaXRoQ29kZXMoZXhwZWN0ZWRFcnJvckNvZGVzKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgW2NvZGVdIHZlcmlmaWVzLCBidXQgaGFzIGVycm9ycyB3aXRoIHRoZSBnaXZlbiBlcnJvciBjb2Rlcy4KLSAgICoKLSAgICogTGlrZSBbYXNzZXJ0RXJyb3JzXSwgYnV0IHRha2VzIGEgc3RyaW5nIG9mIHNvdXJjZSBjb2RlLgotICAgKi8KKyAgLy8vIEFzc2VydHMgdGhhdCBbY29kZV0gdmVyaWZpZXMsIGJ1dCBoYXMgZXJyb3JzIHdpdGggdGhlIGdpdmVuIGVycm9yIGNvZGVzLgorICAvLy8KKyAgLy8vIExpa2UgW2Fzc2VydEVycm9yc10sIGJ1dCB0YWtlcyBhIHN0cmluZyBvZiBzb3VyY2UgY29kZS4KICAgLy8gVE9ETyhybnlzdHJvbSk6IFVzZSB0aGlzIGluIG1vcmUgdGVzdHMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZS4KICAgRnV0dXJlPHZvaWQ+IGFzc2VydEVycm9yc0luQ29kZShTdHJpbmcgY29kZSwgTGlzdDxFcnJvckNvZGU+IGVycm9ycywKICAgICAgIHtib29sIHZlcmlmeSA9IHRydWUsIFN0cmluZyBzb3VyY2VOYW1lID0gX2RlZmF1bHRTb3VyY2VOYW1lfSkgYXN5bmMgewpAQCAtNDI2LDExICs0MDEsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgW2NvZGVdIGhhcyBlcnJvcnMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgY29kZXMuCi0gICAqCi0gICAqIExpa2UgW2Fzc2VydEVycm9yc10sIGJ1dCB0YWtlcyBhIHN0cmluZyBvZiBzb3VyY2UgY29kZS4KLSAgICovCisgIC8vLyBBc3NlcnRzIHRoYXQgW2NvZGVdIGhhcyBlcnJvcnMgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgY29kZXMuCisgIC8vLworICAvLy8gTGlrZSBbYXNzZXJ0RXJyb3JzXSwgYnV0IHRha2VzIGEgc3RyaW5nIG9mIHNvdXJjZSBjb2RlLgogICBGdXR1cmU8dm9pZD4gYXNzZXJ0RXJyb3JzSW5VbnZlcmlmaWVkQ29kZSgKICAgICAgIFN0cmluZyBjb2RlLCBMaXN0PEVycm9yQ29kZT4gZXJyb3JzKSBhc3luYyB7CiAgICAgU291cmNlIHNvdXJjZSA9IGFkZFNvdXJjZShjb2RlKTsKQEAgLTQzOCwyMCArNDExLDE2IEBACiAgICAgYXNzZXJ0RXJyb3JzKHNvdXJjZSwgZXJyb3JzKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCBubyBlcnJvcnMgaGF2ZSBiZWVuIHJlcG9ydGVkIGFnYWluc3QgdGhlIGdpdmVuIHNvdXJjZS4KLSAgICoKLSAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGFnYWluc3Qgd2hpY2ggbm8gZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKLSAgICogQHRocm93cyBBbmFseXNpc0V4Y2VwdGlvbiBpZiB0aGUgcmVwb3J0ZWQgZXJyb3JzIGNvdWxkIG5vdCBiZSBjb21wdXRlZAotICAgKiBAdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIGlmIGFueSBlcnJvcnMgaGF2ZSBiZWVuIHJlcG9ydGVkCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgbm8gZXJyb3JzIGhhdmUgYmVlbiByZXBvcnRlZCBhZ2FpbnN0IHRoZSBnaXZlbiBzb3VyY2UuCisgIC8vLworICAvLy8gQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGFnYWluc3Qgd2hpY2ggbm8gZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKKyAgLy8vIEB0aHJvd3MgQW5hbHlzaXNFeGNlcHRpb24gaWYgdGhlIHJlcG9ydGVkIGVycm9ycyBjb3VsZCBub3QgYmUgY29tcHV0ZWQKKyAgLy8vIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaWYgYW55IGVycm9ycyBoYXZlIGJlZW4gcmVwb3J0ZWQKICAgdm9pZCBhc3NlcnROb0Vycm9ycyhTb3VyY2Ugc291cmNlKSB7CiAgICAgYXNzZXJ0RXJyb3JzKHNvdXJjZSk7CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0cyB0aGF0IFtjb2RlXSBoYXMgbm8gZXJyb3JzIG9yIHdhcm5pbmdzLgotICAgKi8KKyAgLy8vIEFzc2VydHMgdGhhdCBbY29kZV0gaGFzIG5vIGVycm9ycyBvciB3YXJuaW5ncy4KICAgLy8gVE9ETyhybnlzdHJvbSk6IFVzZSB0aGlzIGluIG1vcmUgdGVzdHMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZS4KICAgRnV0dXJlPHZvaWQ+IGFzc2VydE5vRXJyb3JzSW5Db2RlKFN0cmluZyBjb2RlKSBhc3luYyB7CiAgICAgU291cmNlIHNvdXJjZSA9IGFkZFNvdXJjZShjb2RlKTsKQEAgLTQ2OCwzNyArNDM3LDI5IEBACiAgICAgcmV0dXJuIGFuYWx5c2lzUmVzdWx0OwogICB9CiAKLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGFuYWx5c2lzIHJlc3VsdCB0byB0aGUgZ2l2ZW4gW2NvZGVdIGluICcvdGVzdC5kYXJ0Jy4KLSAgICovCisgIC8vLyBDb21wdXRlIHRoZSBhbmFseXNpcyByZXN1bHQgdG8gdGhlIGdpdmVuIFtjb2RlXSBpbiAnL3Rlc3QuZGFydCcuCiAgIEZ1dHVyZTxUZXN0QW5hbHlzaXNSZXN1bHQ+IGNvbXB1dGVUZXN0QW5hbHlzaXNSZXN1bHQoU3RyaW5nIGNvZGUpIGFzeW5jIHsKICAgICBTb3VyY2Ugc291cmNlID0gYWRkU291cmNlKGNvZGUpOwogICAgIHJldHVybiBhd2FpdCBjb21wdXRlQW5hbHlzaXNSZXN1bHQoc291cmNlKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsaWJyYXJ5IGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgbGlicmFyeSBuYW1lZCBgInRlc3QiYCBjb250YWluaW5nIGEgc2luZ2xlCi0gICAqIGVtcHR5IGNvbXBpbGF0aW9uIHVuaXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGxpYnJhcnkgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkCi0gICAqLworICAvLy8gQ3JlYXRlIGEgbGlicmFyeSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGxpYnJhcnkgbmFtZWQgYCJ0ZXN0ImAKKyAgLy8vIGNvbnRhaW5pbmcgYSBzaW5nbGUgZW1wdHkgY29tcGlsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIHRoZSBsaWJyYXJ5IGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZAogICBMaWJyYXJ5RWxlbWVudEltcGwgY3JlYXRlRGVmYXVsdFRlc3RMaWJyYXJ5KCkgPT4KICAgICAgIGNyZWF0ZVRlc3RMaWJyYXJ5KFRlc3RBbmFseXNpc0NvbnRleHQoKSwgInRlc3QiKTsKIAotICAvKioKLSAgICogUmV0dXJuIGEgc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIHdpdGggdGhlIGdpdmVuIFtmaWxlTmFtZV0uCi0gICAqLworICAvLy8gUmV0dXJuIGEgc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIHdpdGggdGhlIGdpdmVuIFtmaWxlTmFtZV0uCiAgIFNvdXJjZSBjcmVhdGVOYW1lZFNvdXJjZShTdHJpbmcgZmlsZU5hbWUpIHsKICAgICByZXR1cm4gZ2V0RmlsZShmaWxlTmFtZSkuY3JlYXRlU291cmNlKCk7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIGEgbGlicmFyeSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBjb250YWluaW5nIGEgc2luZ2xlCi0gICAqIGVtcHR5IGNvbXBpbGF0aW9uIHVuaXQuCi0gICAqCi0gICAqIEBwYXJhbSBsaWJyYXJ5TmFtZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBiZSBjcmVhdGVkCi0gICAqIEByZXR1cm4gdGhlIGxpYnJhcnkgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkCi0gICAqLworICAvLy8gQ3JlYXRlIGEgbGlicmFyeSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAvLy8gY29udGFpbmluZyBhIHNpbmdsZSBlbXB0eSBjb21waWxhdGlvbiB1bml0LgorICAvLy8KKyAgLy8vIEBwYXJhbSBsaWJyYXJ5TmFtZSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBiZSBjcmVhdGVkCisgIC8vLyBAcmV0dXJuIHRoZSBsaWJyYXJ5IGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZAogICBMaWJyYXJ5RWxlbWVudEltcGwgY3JlYXRlVGVzdExpYnJhcnkoCiAgICAgICBBbmFseXNpc0NvbnRleHQgY29udGV4dCwgU3RyaW5nIGxpYnJhcnlOYW1lLAogICAgICAgW0xpc3Q8U3RyaW5nPiB0eXBlTmFtZXNdKSB7CkBAIC01NTcsMTcgKzUxOCwxMyBAQAogICAgIC8vIE5vdCBmb3VuZAogICB9CiAKLSAgLyoqCi0gICAqIFJlLWNyZWF0ZSB0aGUgYW5hbHlzaXMgY29udGV4dCBiZWluZyB1c2VkIGJ5IHRoZSB0ZXN0IGNhc2UuCi0gICAqLworICAvLy8gUmUtY3JlYXRlIHRoZSBhbmFseXNpcyBjb250ZXh0IGJlaW5nIHVzZWQgYnkgdGhlIHRlc3QgY2FzZS4KICAgdm9pZCByZXNldCgpIHsKICAgICByZXNldFdpdGgoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZS1jcmVhdGUgdGhlIGFuYWx5c2lzIGNvbnRleHQgYmVpbmcgdXNlZCBieSB0aGUgdGVzdCB3aXRoIHRoZSBlaXRoZXIgZ2l2ZW4KLSAgICogW29wdGlvbnNdIG9yIFtwYWNrYWdlc10uCi0gICAqLworICAvLy8gUmUtY3JlYXRlIHRoZSBhbmFseXNpcyBjb250ZXh0IGJlaW5nIHVzZWQgYnkgdGhlIHRlc3Qgd2l0aCB0aGUgZWl0aGVyCisgIC8vLyBnaXZlbiBbb3B0aW9uc10gb3IgW3BhY2thZ2VzXS4KICAgdm9pZCByZXNldFdpdGgoe0FuYWx5c2lzT3B0aW9ucyBvcHRpb25zLCBMaXN0PExpc3Q8U3RyaW5nPj4gcGFja2FnZXN9KSB7CiAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBwYWNrYWdlcyAhPSBudWxsKSB7CiAgICAgICBmYWlsKCdPbmx5IHBhY2thZ2VzIG9yIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZC4nKTsKQEAgLTY2NywxMCArNjI0LDggQEAKICAgICBBbmFseXNpc0VuZ2luZS5pbnN0YW5jZS5jbGVhckNhY2hlcygpOwogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IGFsbCBvZiB0aGUgaWRlbnRpZmllcnMgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXRzIGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGUgZ2l2ZW4gW3NvdXJjZXNdIGhhdmUgYmVlbiByZXNvbHZlZC4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIGluIHRoZSBjb21waWxhdGlvbiB1bml0cyBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoZSBnaXZlbiBbc291cmNlc10gaGF2ZSBiZWVuIHJlc29sdmVkLgogICB2b2lkIHZlcmlmeShMaXN0PFNvdXJjZT4gc291cmNlcykgewogICAgIFJlc29sdXRpb25WZXJpZmllciB2ZXJpZmllciA9IFJlc29sdXRpb25WZXJpZmllcigpOwogICAgIGZvciAoU291cmNlIHNvdXJjZSBpbiBzb3VyY2VzKSB7CkBAIC02ODIsMjkgKzYzNywyMyBAQAogICB9CiB9CiAKLS8qKgotICogU2hhcmVkIGluZnJhc3RydWN0dXJlIGZvciBbU3RhdGljVHlwZUFuYWx5emVyMlRlc3RdIGFuZAotICogW1N0cm9uZ01vZGVTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdF0uCi0gKi8KKy8vLyBTaGFyZWQgaW5mcmFzdHJ1Y3R1cmUgZm9yIFtTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdF0gYW5kCisvLy8gW1N0cm9uZ01vZGVTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdF0uCiBjbGFzcyBTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdFNoYXJlZCBleHRlbmRzIERyaXZlclJlc29sdXRpb25UZXN0IHsKLSAgLyoqCi0gICAqIEZpbmQgdGhlIGV4cHJlc3Npb24gdGhhdCBzdGFydHMgYXQgdGhlIG9mZnNldCBvZiBbc2VhcmNoXSBhbmQgdmFsaWRhdGUgaXRzCi0gICAqIHRoYXQgaXRzIHN0YXRpYyB0eXBlIG1hdGNoZXMgdGhlIGdpdmVuIFt0eXBlXS4KLSAgICoKLSAgICogSWYgW3R5cGVdIGlzIGEgc3RyaW5nLCB2YWxpZGF0ZXMgdGhhdCB0aGUgZXhwcmVzc2lvbidzIHN0YXRpYyB0eXBlCi0gICAqIHN0cmluZ2lmaWVzIHRvIHRoYXQgdGV4dC4gT3RoZXJ3aXNlLCBbdHlwZV0gaXMgdXNlZCBkaXJlY3RseSBhIFtNYXRjaGVyXQotICAgKiB0byBtYXRjaCB0aGUgdHlwZS4KLSAgICovCisgIC8vLyBGaW5kIHRoZSBleHByZXNzaW9uIHRoYXQgc3RhcnRzIGF0IHRoZSBvZmZzZXQgb2YgW3NlYXJjaF0gYW5kIHZhbGlkYXRlIGl0cworICAvLy8gdGhhdCBpdHMgc3RhdGljIHR5cGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gW3R5cGVdLgorICAvLy8KKyAgLy8vIElmIFt0eXBlXSBpcyBhIHN0cmluZywgdmFsaWRhdGVzIHRoYXQgdGhlIGV4cHJlc3Npb24ncyBzdGF0aWMgdHlwZQorICAvLy8gc3RyaW5naWZpZXMgdG8gdGhhdCB0ZXh0LiBPdGhlcndpc2UsIFt0eXBlXSBpcyB1c2VkIGRpcmVjdGx5IGEgW01hdGNoZXJdCisgIC8vLyB0byBtYXRjaCB0aGUgdHlwZS4KICAgdm9pZCBleHBlY3RFeHByZXNzaW9uVHlwZShTdHJpbmcgc2VhcmNoLCB0eXBlKSB7CiAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZmluZE5vZGUuZXhwcmVzc2lvbihzZWFyY2gpOwogICAgIF9leHBlY3RUeXBlKGV4cHJlc3Npb24uc3RhdGljVHlwZSwgdHlwZSk7CiAgIH0KIAotICAvKioKLSAgICogTG9va3MgdXAgdGhlIGlkZW50aWZpZXIgd2l0aCBbbmFtZV0gYW5kIHZhbGlkYXRlcyB0aGF0IGl0cyB0eXBlIHR5cGUKLSAgICogc3RyaW5naWZpZXMgdG8gW3R5cGVdIGFuZCB0aGF0IGl0cyBnZW5lcmljcyBtYXRjaCB0aGUgZ2l2ZW4gc3RyaW5naWZpZWQKLSAgICogb3V0cHV0LgotICAgKi8KKyAgLy8vIExvb2tzIHVwIHRoZSBpZGVudGlmaWVyIHdpdGggW25hbWVdIGFuZCB2YWxpZGF0ZXMgdGhhdCBpdHMgdHlwZSB0eXBlCisgIC8vLyBzdHJpbmdpZmllcyB0byBbdHlwZV0gYW5kIHRoYXQgaXRzIGdlbmVyaWNzIG1hdGNoIHRoZSBnaXZlbiBzdHJpbmdpZmllZAorICAvLy8gb3V0cHV0LgogICBGdW5jdGlvblR5cGVJbXBsIGV4cGVjdEZ1bmN0aW9uVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsCiAgICAgICB7U3RyaW5nIHR5cGVQYXJhbXMgPSAnW10nLAogICAgICAgU3RyaW5nIHR5cGVBcmdzID0gJ1tdJywKQEAgLTcyOCwxMSArNjc3LDkgQEAKICAgICByZXR1cm4gZnVuY3Rpb25UeXBlOwogICB9CiAKLSAgLyoqCi0gICAqIExvb2tzIHVwIHRoZSBpZGVudGlmaWVyIHdpdGggW25hbWVdIGFuZCB2YWxpZGF0ZXMgdGhhdCBpdHMgZWxlbWVudCB0eXBlCi0gICAqIHN0cmluZ2lmaWVzIHRvIFt0eXBlXSBhbmQgdGhhdCBpdHMgZ2VuZXJpY3MgbWF0Y2ggdGhlIGdpdmVuIHN0cmluZ2lmaWVkCi0gICAqIG91dHB1dC4KLSAgICovCisgIC8vLyBMb29rcyB1cCB0aGUgaWRlbnRpZmllciB3aXRoIFtuYW1lXSBhbmQgdmFsaWRhdGVzIHRoYXQgaXRzIGVsZW1lbnQgdHlwZQorICAvLy8gc3RyaW5naWZpZXMgdG8gW3R5cGVdIGFuZCB0aGF0IGl0cyBnZW5lcmljcyBtYXRjaCB0aGUgZ2l2ZW4gc3RyaW5naWZpZWQKKyAgLy8vIG91dHB1dC4KICAgRnVuY3Rpb25UeXBlSW1wbCBleHBlY3RGdW5jdGlvblR5cGUyKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgewogICAgIHZhciBpZGVudGlmaWVyID0gZmluZE5vZGUuc2ltcGxlKG5hbWUpOwogICAgIHZhciBmdW5jdGlvblR5cGUgPSBfZ2V0RnVuY3Rpb25UeXBlZEVsZW1lbnRUeXBlKGlkZW50aWZpZXIpOwpAQCAtNzQwLDI2ICs2ODcsMjIgQEAKICAgICByZXR1cm4gZnVuY3Rpb25UeXBlOwogICB9CiAKLSAgLyoqCi0gICAqIExvb2tzIHVwIHRoZSBpZGVudGlmaWVyIHdpdGggW25hbWVdIGFuZCB2YWxpZGF0ZXMgaXRzIHN0YXRpYyBbdHlwZV0uCi0gICAqCi0gICAqIElmIFt0eXBlXSBpcyBhIHN0cmluZywgdmFsaWRhdGVzIHRoYXQgdGhlIGlkZW50aWZpZXIncyBzdGF0aWMgdHlwZQotICAgKiBzdHJpbmdpZmllcyB0byB0aGF0IHRleHQuIE90aGVyd2lzZSwgW3R5cGVdIGlzIHVzZWQgZGlyZWN0bHkgYSBbTWF0Y2hlcl0KLSAgICogdG8gbWF0Y2ggdGhlIHR5cGUuCi0gICAqLworICAvLy8gTG9va3MgdXAgdGhlIGlkZW50aWZpZXIgd2l0aCBbbmFtZV0gYW5kIHZhbGlkYXRlcyBpdHMgc3RhdGljIFt0eXBlXS4KKyAgLy8vCisgIC8vLyBJZiBbdHlwZV0gaXMgYSBzdHJpbmcsIHZhbGlkYXRlcyB0aGF0IHRoZSBpZGVudGlmaWVyJ3Mgc3RhdGljIHR5cGUKKyAgLy8vIHN0cmluZ2lmaWVzIHRvIHRoYXQgdGV4dC4gT3RoZXJ3aXNlLCBbdHlwZV0gaXMgdXNlZCBkaXJlY3RseSBhIFtNYXRjaGVyXQorICAvLy8gdG8gbWF0Y2ggdGhlIHR5cGUuCiAgIHZvaWQgZXhwZWN0SWRlbnRpZmllclR5cGUoU3RyaW5nIG5hbWUsIHR5cGUpIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBmaW5kTm9kZS5zaW1wbGUobmFtZSk7CiAgICAgX2V4cGVjdFR5cGUoaWRlbnRpZmllci5zdGF0aWNUeXBlLCB0eXBlKTsKICAgfQogCi0gIC8qKgotICAgKiBMb29rcyB1cCB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBkZWNsYXJhdGlvbiBjb250YWluaW5nIFtpZGVudGlmaWVyXSBhbmQKLSAgICogdmFsaWRhdGVzIGl0cyBzdGF0aWMgW3R5cGVdLgotICAgKgotICAgKiBJZiBbdHlwZV0gaXMgYSBzdHJpbmcsIHZhbGlkYXRlcyB0aGF0IHRoZSBpZGVudGlmaWVyJ3Mgc3RhdGljIHR5cGUKLSAgICogc3RyaW5naWZpZXMgdG8gdGhhdCB0ZXh0LiBPdGhlcndpc2UsIFt0eXBlXSBpcyB1c2VkIGRpcmVjdGx5IGEgW01hdGNoZXJdCi0gICAqIHRvIG1hdGNoIHRoZSB0eXBlLgotICAgKi8KKyAgLy8vIExvb2tzIHVwIHRoZSBpbml0aWFsaXplciBmb3IgdGhlIGRlY2xhcmF0aW9uIGNvbnRhaW5pbmcgW2lkZW50aWZpZXJdIGFuZAorICAvLy8gdmFsaWRhdGVzIGl0cyBzdGF0aWMgW3R5cGVdLgorICAvLy8KKyAgLy8vIElmIFt0eXBlXSBpcyBhIHN0cmluZywgdmFsaWRhdGVzIHRoYXQgdGhlIGlkZW50aWZpZXIncyBzdGF0aWMgdHlwZQorICAvLy8gc3RyaW5naWZpZXMgdG8gdGhhdCB0ZXh0LiBPdGhlcndpc2UsIFt0eXBlXSBpcyB1c2VkIGRpcmVjdGx5IGEgW01hdGNoZXJdCisgIC8vLyB0byBtYXRjaCB0aGUgdHlwZS4KICAgdm9pZCBleHBlY3RJbml0aWFsaXplclR5cGUoU3RyaW5nIG5hbWUsIHR5cGUpIHsKICAgICBTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBmaW5kTm9kZS5zaW1wbGUobmFtZSk7CiAgICAgVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9CkBAIC03NjgsMTIgKzcxMSwxMSBAQAogICAgIF9leHBlY3RUeXBlKGluaXRpYWxpemVyLnN0YXRpY1R5cGUsIHR5cGUpOwogICB9CiAKLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGF0IFt0eXBlXSBtYXRjaGVzIFtleHBlY3RlZF0uCi0gICAqCi0gICAqIElmIFtleHBlY3RlZF0gaXMgYSBzdHJpbmcsIHZhbGlkYXRlcyB0aGF0IHRoZSB0eXBlIHN0cmluZ2lmaWVzIHRvIHRoYXQKLSAgICogdGV4dC4gT3RoZXJ3aXNlLCBbZXhwZWN0ZWRdIGlzIHVzZWQgZGlyZWN0bHkgYSBbTWF0Y2hlcl0gdG8gbWF0Y2ggdGhlIHR5cGUuCi0gICAqLworICAvLy8gVmFsaWRhdGVzIHRoYXQgW3R5cGVdIG1hdGNoZXMgW2V4cGVjdGVkXS4KKyAgLy8vCisgIC8vLyBJZiBbZXhwZWN0ZWRdIGlzIGEgc3RyaW5nLCB2YWxpZGF0ZXMgdGhhdCB0aGUgdHlwZSBzdHJpbmdpZmllcyB0byB0aGF0CisgIC8vLyB0ZXh0LiBPdGhlcndpc2UsIFtleHBlY3RlZF0gaXMgdXNlZCBkaXJlY3RseSBhIFtNYXRjaGVyXSB0byBtYXRjaCB0aGUKKyAgLy8vIHR5cGUuCiAgIF9leHBlY3RUeXBlKERhcnRUeXBlIHR5cGUsIGV4cGVjdGVkKSB7CiAgICAgaWYgKGV4cGVjdGVkIGlzIFN0cmluZykgewogICAgICAgYXNzZXJ0VHlwZSh0eXBlLCBleHBlY3RlZCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc2Nhbm5lcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc2Nhbm5lcl90ZXN0LmRhcnQKaW5kZXggN2E2MTJmMi4uODI0OTU5YyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3NjYW5uZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9zY2FubmVyX3Rlc3QuZGFydApAQCAtMjUwLDEwICsyNTAsOCBAQAogICB9CiB9CiAKLS8qKgotICogQW4gYEV4cGVjdGVkTG9jYXRpb25gIGVuY29kZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4cGVjdGVkIGxvY2F0aW9uIG9mIGEKLSAqIGdpdmVuIG9mZnNldCBpbiBzb3VyY2UgY29kZS4KLSAqLworLy8vIEFuIGBFeHBlY3RlZExvY2F0aW9uYCBlbmNvZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHBlY3RlZCBsb2NhdGlvbiBvZiBhCisvLy8gZ2l2ZW4gb2Zmc2V0IGluIHNvdXJjZSBjb2RlLgogY2xhc3MgU2Nhbm5lclRlc3RfRXhwZWN0ZWRMb2NhdGlvbiB7CiAgIGZpbmFsIGludCBfb2Zmc2V0OwogCkBAIC0yNjUsMTUgKzI2MywxMSBAQAogICAgICAgdGhpcy5fb2Zmc2V0LCB0aGlzLl9saW5lTnVtYmVyLCB0aGlzLl9jb2x1bW5OdW1iZXIpOwogfQogCi0vKioKLSAqIEEgYFRva2VuU3RyZWFtVmFsaWRhdG9yYCBpcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb3JyZWN0IGNvbnN0cnVjdGlvbiBvZiBhCi0gKiBzdHJlYW0gb2YgdG9rZW5zLgotICovCisvLy8gQSBgVG9rZW5TdHJlYW1WYWxpZGF0b3JgIGlzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvcnJlY3QgY29uc3RydWN0aW9uIG9mIGEKKy8vLyBzdHJlYW0gb2YgdG9rZW5zLgogY2xhc3MgVG9rZW5TdHJlYW1WYWxpZGF0b3IgewotICAvKioKLSAgICogVmFsaWRhdGUgdGhhdCB0aGUgc3RyZWFtIG9mIHRva2VucyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBbdG9rZW5dIGlzCi0gICAqIGNvcnJlY3QuCi0gICAqLworICAvLy8gVmFsaWRhdGUgdGhhdCB0aGUgc3RyZWFtIG9mIHRva2VucyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBbdG9rZW5dIGlzCisgIC8vLyBjb3JyZWN0LgogICB2b2lkIHZhbGlkYXRlKFRva2VuIHRva2VuKSB7CiAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgIF92YWxpZGF0ZVN0cmVhbShidWZmZXIsIHRva2VuKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9zZGtfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Nka190ZXN0LmRhcnQKaW5kZXggMzBjYmI1NC4uYTViM2ZlZiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Nka190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Nka190ZXN0LmRhcnQKQEAgLTIsNyArMiw2IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc2RrLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90ZXN0X3V0aWxpdGllcy9tb2NrX3Nkay5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGVzdF91dGlsaXRpZXMvcmVzb3VyY2VfcHJvdmlkZXJfbWl4aW4uZGFydCc7CkBAIC0xOSwyNCArMTgsMjUgQEAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRGFydFNka01hbmFnZXJUZXN0IHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluIHsKICAgdm9pZCB0ZXN0X2FueVNkaygpIHsKLSAgICBEYXJ0U2RrTWFuYWdlciBtYW5hZ2VyID0gRGFydFNka01hbmFnZXIoJy9hL2IvYycsIGZhbHNlKTsKKyAgICBEYXJ0U2RrTWFuYWdlciBtYW5hZ2VyID0gRGFydFNka01hbmFnZXIoJy9hL2IvYycpOwogICAgIGV4cGVjdChtYW5hZ2VyLmFueVNkaywgaXNOdWxsKTsKIAotICAgIEFuYWx5c2lzT3B0aW9ucyBvcHRpb25zID0gQW5hbHlzaXNPcHRpb25zSW1wbCgpOwotICAgIFNka0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bJy9jL2QnXSwgb3B0aW9ucyk7CisgICAgU2RrRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBTZGtEZXNjcmlwdGlvbignL2MvZCcpOwogICAgIERhcnRTZGsgc2RrID0gTW9ja1NkayhyZXNvdXJjZVByb3ZpZGVyOiByZXNvdXJjZVByb3ZpZGVyKTsKICAgICBtYW5hZ2VyLmdldFNkayhkZXNjcmlwdGlvbiwgKCkgPT4gc2RrKTsKKwogICAgIGV4cGVjdChtYW5hZ2VyLmFueVNkaywgc2FtZShzZGspKTsKICAgfQogCiAgIHZvaWQgdGVzdF9nZXRTZGtfZGlmZmVyZW50RGVzY3JpcHRvcnMoKSB7Ci0gICAgRGFydFNka01hbmFnZXIgbWFuYWdlciA9IERhcnRTZGtNYW5hZ2VyKCcvYS9iL2MnLCBmYWxzZSk7Ci0gICAgQW5hbHlzaXNPcHRpb25zIG9wdGlvbnMgPSBBbmFseXNpc09wdGlvbnNJbXBsKCk7Ci0gICAgU2RrRGVzY3JpcHRpb24gZGVzY3JpcHRpb24xID0gU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bJy9jL2QnXSwgb3B0aW9ucyk7CisgICAgRGFydFNka01hbmFnZXIgbWFuYWdlciA9IERhcnRTZGtNYW5hZ2VyKCcvYS9iL2MnKTsKKworICAgIFNka0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uMSA9IFNka0Rlc2NyaXB0aW9uKCcvYy9kJyk7CiAgICAgRGFydFNkayBzZGsxID0gTW9ja1NkayhyZXNvdXJjZVByb3ZpZGVyOiByZXNvdXJjZVByb3ZpZGVyKTsKICAgICBEYXJ0U2RrIHJlc3VsdDEgPSBtYW5hZ2VyLmdldFNkayhkZXNjcmlwdGlvbjEsICgpID0+IHNkazEpOwogICAgIGV4cGVjdChyZXN1bHQxLCBzYW1lKHNkazEpKTsKLSAgICBTZGtEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjIgPSBTZGtEZXNjcmlwdGlvbig8U3RyaW5nPlsnL2UvZiddLCBvcHRpb25zKTsKKworICAgIFNka0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uMiA9IFNka0Rlc2NyaXB0aW9uKCcvZS9mJyk7CiAgICAgRGFydFNkayBzZGsyID0gTW9ja1NkayhyZXNvdXJjZVByb3ZpZGVyOiByZXNvdXJjZVByb3ZpZGVyKTsKICAgICBEYXJ0U2RrIHJlc3VsdDIgPSBtYW5hZ2VyLmdldFNkayhkZXNjcmlwdGlvbjIsICgpID0+IHNkazIpOwogICAgIGV4cGVjdChyZXN1bHQyLCBzYW1lKHNkazIpKTsKQEAgLTQ2LDEyICs0NiwxMyBAQAogICB9CiAKICAgdm9pZCB0ZXN0X2dldFNka19zYW1lRGVzY3JpcHRvcigpIHsKLSAgICBEYXJ0U2RrTWFuYWdlciBtYW5hZ2VyID0gRGFydFNka01hbmFnZXIoJy9hL2IvYycsIGZhbHNlKTsKLSAgICBBbmFseXNpc09wdGlvbnMgb3B0aW9ucyA9IEFuYWx5c2lzT3B0aW9uc0ltcGwoKTsKLSAgICBTZGtEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFNka0Rlc2NyaXB0aW9uKDxTdHJpbmc+WycvYy9kJ10sIG9wdGlvbnMpOworICAgIERhcnRTZGtNYW5hZ2VyIG1hbmFnZXIgPSBEYXJ0U2RrTWFuYWdlcignL2EvYi9jJyk7CisKKyAgICBTZGtEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFNka0Rlc2NyaXB0aW9uKCcvYy9kJyk7CiAgICAgRGFydFNkayBzZGsgPSBNb2NrU2RrKHJlc291cmNlUHJvdmlkZXI6IHJlc291cmNlUHJvdmlkZXIpOwogICAgIERhcnRTZGsgcmVzdWx0ID0gbWFuYWdlci5nZXRTZGsoZGVzY3JpcHRpb24sICgpID0+IHNkayk7CiAgICAgZXhwZWN0KHJlc3VsdCwgc2FtZShzZGspKTsKKwogICAgIG1hbmFnZXIuZ2V0U2RrKGRlc2NyaXB0aW9uLCBfZmFpbElmQWJzZW50KTsKICAgfQogCkBAIC02Myw1MyArNjQsMjEgQEAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgU2RrRGVzY3JpcHRpb25UZXN0IHsKICAgdm9pZCB0ZXN0X2VxdWFsc19kaWZmZXJlbnRQYXRoc19uZXN0ZWQoKSB7Ci0gICAgQW5hbHlzaXNPcHRpb25zIG9wdGlvbnMgPSBBbmFseXNpc09wdGlvbnNJbXBsKCk7Ci0gICAgU2RrRGVzY3JpcHRpb24gbGVmdCA9IFNka0Rlc2NyaXB0aW9uKDxTdHJpbmc+WycvYS9iL2MnXSwgb3B0aW9ucyk7Ci0gICAgU2RrRGVzY3JpcHRpb24gcmlnaHQgPSBTZGtEZXNjcmlwdGlvbig8U3RyaW5nPlsnL2EvYiddLCBvcHRpb25zKTsKKyAgICBTZGtEZXNjcmlwdGlvbiBsZWZ0ID0gU2RrRGVzY3JpcHRpb24oJy9hL2IvYycpOworICAgIFNka0Rlc2NyaXB0aW9uIHJpZ2h0ID0gU2RrRGVzY3JpcHRpb24oJy9hL2InKTsKICAgICBleHBlY3QobGVmdCA9PSByaWdodCwgaXNGYWxzZSk7CiAgIH0KIAogICB2b2lkIHRlc3RfZXF1YWxzX2RpZmZlcmVudFBhdGhzX3VucmVsYXRlZCgpIHsKLSAgICBBbmFseXNpc09wdGlvbnMgb3B0aW9ucyA9IEFuYWx5c2lzT3B0aW9uc0ltcGwoKTsKLSAgICBTZGtEZXNjcmlwdGlvbiBsZWZ0ID0gU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bJy9hL2IvYyddLCBvcHRpb25zKTsKLSAgICBTZGtEZXNjcmlwdGlvbiByaWdodCA9IFNka0Rlc2NyaXB0aW9uKDxTdHJpbmc+WycvZC9lJ10sIG9wdGlvbnMpOworICAgIFNka0Rlc2NyaXB0aW9uIGxlZnQgPSBTZGtEZXNjcmlwdGlvbignL2EvYi9jJyk7CisgICAgU2RrRGVzY3JpcHRpb24gcmlnaHQgPSBTZGtEZXNjcmlwdGlvbignL2QvZScpOwogICAgIGV4cGVjdChsZWZ0ID09IHJpZ2h0LCBpc0ZhbHNlKTsKICAgfQogCi0gIHZvaWQgdGVzdF9lcXVhbHNfbm9QYXRocygpIHsKLSAgICBBbmFseXNpc09wdGlvbnMgb3B0aW9ucyA9IEFuYWx5c2lzT3B0aW9uc0ltcGwoKTsKLSAgICBTZGtEZXNjcmlwdGlvbiBsZWZ0ID0gU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bXSwgb3B0aW9ucyk7Ci0gICAgU2RrRGVzY3JpcHRpb24gcmlnaHQgPSBTZGtEZXNjcmlwdGlvbig8U3RyaW5nPltdLCBvcHRpb25zKTsKLSAgICBleHBlY3QobGVmdCA9PSByaWdodCwgaXNUcnVlKTsKLSAgfQotCi0gIHZvaWQgdGVzdF9lcXVhbHNfc2FtZVBhdGhzX2RpZmZlcmVudE9wdGlvbnMoKSB7Ci0gICAgU3RyaW5nIHBhdGggPSAnL2EvYi9jJzsKLSAgICBBbmFseXNpc09wdGlvbnNJbXBsIGxlZnRPcHRpb25zID0gQW5hbHlzaXNPcHRpb25zSW1wbCgpCi0gICAgICAuLnVzZUZhc3RhUGFyc2VyID0gZmFsc2U7Ci0gICAgQW5hbHlzaXNPcHRpb25zSW1wbCByaWdodE9wdGlvbnMgPSBBbmFseXNpc09wdGlvbnNJbXBsKCkKLSAgICAgIC4udXNlRmFzdGFQYXJzZXIgPSB0cnVlOwotICAgIFNka0Rlc2NyaXB0aW9uIGxlZnQgPSBTZGtEZXNjcmlwdGlvbig8U3RyaW5nPltwYXRoXSwgbGVmdE9wdGlvbnMpOwotICAgIFNka0Rlc2NyaXB0aW9uIHJpZ2h0ID0gU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bcGF0aF0sIHJpZ2h0T3B0aW9ucyk7Ci0gICAgZXhwZWN0KGxlZnQgPT0gcmlnaHQsIGlzRmFsc2UpOwotICB9Ci0KLSAgdm9pZCB0ZXN0X2VxdWFsc19zYW1lUGF0aHNfc2FtZU9wdGlvbnNfbXVsdGlwbGUoKSB7Ci0gICAgU3RyaW5nIGxlZnRQYXRoID0gJy9hL2IvYyc7Ci0gICAgU3RyaW5nIHJpZ2h0UGF0aCA9ICcvZC9lJzsKLSAgICBBbmFseXNpc09wdGlvbnMgb3B0aW9ucyA9IEFuYWx5c2lzT3B0aW9uc0ltcGwoKTsKLSAgICBTZGtEZXNjcmlwdGlvbiBsZWZ0ID0KLSAgICAgICAgU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bbGVmdFBhdGgsIHJpZ2h0UGF0aF0sIG9wdGlvbnMpOwotICAgIFNka0Rlc2NyaXB0aW9uIHJpZ2h0ID0KLSAgICAgICAgU2RrRGVzY3JpcHRpb24oPFN0cmluZz5bbGVmdFBhdGgsIHJpZ2h0UGF0aF0sIG9wdGlvbnMpOwotICAgIGV4cGVjdChsZWZ0ID09IHJpZ2h0LCBpc1RydWUpOwotICB9Ci0KICAgdm9pZCB0ZXN0X2VxdWFsc19zYW1lUGF0aHNfc2FtZU9wdGlvbnNfc2luZ2xlKCkgewogICAgIFN0cmluZyBwYXRoID0gJy9hL2IvYyc7Ci0gICAgQW5hbHlzaXNPcHRpb25zIG9wdGlvbnMgPSBBbmFseXNpc09wdGlvbnNJbXBsKCk7Ci0gICAgU2RrRGVzY3JpcHRpb24gbGVmdCA9IFNka0Rlc2NyaXB0aW9uKDxTdHJpbmc+W3BhdGhdLCBvcHRpb25zKTsKLSAgICBTZGtEZXNjcmlwdGlvbiByaWdodCA9IFNka0Rlc2NyaXB0aW9uKDxTdHJpbmc+W3BhdGhdLCBvcHRpb25zKTsKKyAgICBTZGtEZXNjcmlwdGlvbiBsZWZ0ID0gU2RrRGVzY3JpcHRpb24ocGF0aCk7CisgICAgU2RrRGVzY3JpcHRpb24gcmlnaHQgPSBTZGtEZXNjcmlwdGlvbihwYXRoKTsKICAgICBleHBlY3QobGVmdCA9PSByaWdodCwgaXNUcnVlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3NpbXBsZV9yZXNvbHZlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc2ltcGxlX3Jlc29sdmVyX3Rlc3QuZGFydAppbmRleCA5NzU0ZjI0Li40ZmY1MTUxIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc2ltcGxlX3Jlc29sdmVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc2ltcGxlX3Jlc29sdmVyX3Rlc3QuZGFydApAQCAtMTI0NCwzNCArMTI0NCwzMyBAQAogICAgIHZlcmlmeVRlc3RSZXNvbHZlZCgpOwogICB9CiAKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IGFsbCBvZiB0aGUgaWRlbnRpZmllcnMgaW4gdGhlIFtyZXN1bHRdIGhhdmUgYmVlbiByZXNvbHZlZC4KLSAgICovCisgIC8vLyBWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIGlkZW50aWZpZXJzIGluIHRoZSBbcmVzdWx0XSBoYXZlIGJlZW4gcmVzb2x2ZWQuCiAgIHZvaWQgdmVyaWZ5VGVzdFJlc29sdmVkKCkgewogICAgIHZhciB2ZXJpZmllciA9IFJlc29sdXRpb25WZXJpZmllcigpOwogICAgIHJlc3VsdC51bml0LmFjY2VwdCh2ZXJpZmllcik7CiAgICAgdmVyaWZpZXIuYXNzZXJ0UmVzb2x2ZWQoKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSB0ZXN0IGZpbGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBhcmd1bWVudHMgaW4gYSBzcGVjaWZpYyBtZXRob2QKLSAgICogaW52b2NhdGlvbiB3ZXJlIGNvcnJlY3RseSByZXNvbHZlZC4KLSAgICoKLSAgICogVGhlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIGEgbWV0aG9kIG5hbWVkIGBnYCwgYW5kIGhhcyBleGFjdGx5IG9uZQotICAgKiBbTWV0aG9kSW52b2NhdGlvbl0gaW4gYSBzdGF0ZW1lbnQgZW5kaW5nIHdpdGggYCk7YC4gSXQgaXMgdGhlIGFyZ3VtZW50cyB0bwotICAgKiB0aGF0IG1ldGhvZCBpbnZvY2F0aW9uIHRoYXQgYXJlIHRlc3RlZC4gVGhlIG1ldGhvZCBpbnZvY2F0aW9uIGNhbiBjb250YWluCi0gICAqIGVycm9ycy4KLSAgICoKLSAgICogVGhlIGFyZ3VtZW50cyB3ZXJlIHJlc29sdmVkIGNvcnJlY3RseSBpZiB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0IG1hdGNoZXMgdGhlCi0gICAqIGxlbmd0aCBvZiB0aGUgYXJyYXkgb2YgaW5kaWNlcyBhbmQgaWYsIGZvciBlYWNoIGluZGV4IGluIHRoZSBhcnJheSBvZiBpbmRpY2VzLCB0aGUgcGFyYW1ldGVyIHRvCi0gICAqIHdoaWNoIHRoZSBhcmd1bWVudCBleHByZXNzaW9uIHdhcyByZXNvbHZlZCBpcyB0aGUgcGFyYW1ldGVyIGluIHRoZSBpbnZva2VkIG1ldGhvZCdzIGxpc3Qgb2YKLSAgICogcGFyYW1ldGVycyBhdCB0aGF0IGluZGV4LiBBcmd1bWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlc29sdmVkIHRvIGEgcGFyYW1ldGVyIGJlY2F1c2Ugb2YgYW4KLSAgICogZXJyb3IgY2FuIGJlIGRlbm90ZWQgYnkgaW5jbHVkaW5nIGEgbmVnYXRpdmUgaW5kZXggaW4gdGhlIGFycmF5IG9mIGluZGljZXMuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRpY2VzIHRoZSBhcnJheSBvZiBpbmRpY2VzIHVzZWQgdG8gYXNzb2NpYXRlIGFyZ3VtZW50cyB3aXRoIHBhcmFtZXRlcnMKLSAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgb3IgaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIGlzIG5vdAotICAgKiAgICAgICAgICAgdmFsaWQKLSAgICovCisgIC8vLyBSZXNvbHZlIHRoZSB0ZXN0IGZpbGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBhcmd1bWVudHMgaW4gYSBzcGVjaWZpYyBtZXRob2QKKyAgLy8vIGludm9jYXRpb24gd2VyZSBjb3JyZWN0bHkgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gVGhlIGZpbGUgaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIGEgbWV0aG9kIG5hbWVkIGBnYCwgYW5kIGhhcyBleGFjdGx5IG9uZQorICAvLy8gW01ldGhvZEludm9jYXRpb25dIGluIGEgc3RhdGVtZW50IGVuZGluZyB3aXRoIGApO2AuIEl0IGlzIHRoZSBhcmd1bWVudHMgdG8KKyAgLy8vIHRoYXQgbWV0aG9kIGludm9jYXRpb24gdGhhdCBhcmUgdGVzdGVkLiBUaGUgbWV0aG9kIGludm9jYXRpb24gY2FuIGNvbnRhaW4KKyAgLy8vIGVycm9ycy4KKyAgLy8vCisgIC8vLyBUaGUgYXJndW1lbnRzIHdlcmUgcmVzb2x2ZWQgY29ycmVjdGx5IGlmIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlCisgIC8vLyBsaXN0IG1hdGNoZXMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgb2YgaW5kaWNlcyBhbmQgaWYsIGZvciBlYWNoIGluZGV4IGluCisgIC8vLyB0aGUgYXJyYXkgb2YgaW5kaWNlcywgdGhlIHBhcmFtZXRlciB0byB3aGljaCB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbiB3YXMKKyAgLy8vIHJlc29sdmVkIGlzIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIGludm9rZWQgbWV0aG9kJ3MgbGlzdCBvZiBwYXJhbWV0ZXJzIGF0CisgIC8vLyB0aGF0IGluZGV4LiBBcmd1bWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlc29sdmVkIHRvIGEgcGFyYW1ldGVyIGJlY2F1c2UKKyAgLy8vIG9mIGFuIGVycm9yIGNhbiBiZSBkZW5vdGVkIGJ5IGluY2x1ZGluZyBhIG5lZ2F0aXZlIGluZGV4IGluIHRoZSBhcnJheSBvZgorICAvLy8gaW5kaWNlcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gaW5kaWNlcyB0aGUgYXJyYXkgb2YgaW5kaWNlcyB1c2VkIHRvIGFzc29jaWF0ZSBhcmd1bWVudHMgd2l0aAorICAvLy8gICAgICAgICAgcGFyYW1ldGVycworICAvLy8gQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgb3IgaWYgdGhlIHN0cnVjdHVyZQorICAvLy8gICAgICAgICAgIG9mIHRoZSBzb3VyY2UgaXMgbm90IHZhbGlkCiAgIEZ1dHVyZTx2b2lkPiBfdmFsaWRhdGVBcmd1bWVudFJlc29sdXRpb24oTGlzdDxpbnQ+IGluZGljZXMpIGFzeW5jIHsKICAgICB2YXIgZyA9IGZpbmRFbGVtZW50Lm1ldGhvZCgnZycpOwogICAgIHZhciBwYXJhbWV0ZXJzID0gZy5wYXJhbWV0ZXJzOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3N0YXRpY190eXBlX2FuYWx5emVyX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9zdGF0aWNfdHlwZV9hbmFseXplcl90ZXN0LmRhcnQKaW5kZXggNGUxODNjMy4uZTQ3ZTNhYSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3N0YXRpY190eXBlX2FuYWx5emVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvc3RhdGljX3R5cGVfYW5hbHl6ZXJfdGVzdC5kYXJ0CkBAIC0xMCw5ICsxMCwxMCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3Njb3BlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnCi0gICAgc2hvdyBMaWJyYXJ5U2NvcGUsIFJlc29sdmVyVmlzaXRvciwgVHlwZVN5c3RlbUltcGw7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFJlc29sdmVyVmlzaXRvcjsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3N0YXRpY190eXBlX2FuYWx5emVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9hc3RfdGVzdF9mYWN0b3J5LmRhcnQnOwpAQCAtNjAsOSArNjEsNyBAQAogICB9CiB9CiAKLS8qKgotICogTGlrZSBbU3RhdGljVHlwZUFuYWx5emVyVGVzdF0sIGJ1dCBhcyBlbmQtdG8tZW5kIHRlc3RzLgotICovCisvLy8gTGlrZSBbU3RhdGljVHlwZUFuYWx5emVyVGVzdF0sIGJ1dCBhcyBlbmQtdG8tZW5kIHRlc3RzLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBTdGF0aWNUeXBlQW5hbHl6ZXIyVGVzdCBleHRlbmRzIFN0YXRpY1R5cGVBbmFseXplcjJUZXN0U2hhcmVkIHsKICAgdGVzdF9GdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9uX2Jsb2NrKCkgYXN5bmMgewpAQCAtMTcwLDkgKzE2OSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBFbmQtdG8tZW5kIHRlc3RzIG9mIHRoZSBzdGF0aWMgdHlwZSBhbmFseXplciB0aGF0IHVzZSB0aGUgbmV3IGRyaXZlci4KLSAqLworLy8vIEVuZC10by1lbmQgdGVzdHMgb2YgdGhlIHN0YXRpYyB0eXBlIGFuYWx5emVyIHRoYXQgdXNlIHRoZSBuZXcgZHJpdmVyLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBTdGF0aWNUeXBlQW5hbHl6ZXIzVGVzdCBleHRlbmRzIFN0YXRpY1R5cGVBbmFseXplcjJUZXN0U2hhcmVkIHsKICAgdGVzdF9lbXB0eU1hcExpdGVyYWxfaW5pdGlhbGl6ZXJfdmFyKCkgYXN5bmMgewpAQCAtMjAwLDM3ICsxOTcsMjUgQEAKIAogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBTdGF0aWNUeXBlQW5hbHl6ZXJUZXN0IHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluLCBFbGVtZW50c1R5cGVzTWl4aW4gewotICAvKioKLSAgICogVGhlIGVycm9yIGxpc3RlbmVyIHRvIHdoaWNoIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkLgotICAgKi8KKyAgLy8vIFRoZSBlcnJvciBsaXN0ZW5lciB0byB3aGljaCBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZC4KICAgR2F0aGVyaW5nRXJyb3JMaXN0ZW5lciBfbGlzdGVuZXI7CiAKLSAgLyoqCi0gICAqIFRoZSByZXNvbHZlciB2aXNpdG9yIHVzZWQgdG8gY3JlYXRlIHRoZSBhbmFseXplci4KLSAgICovCisgIC8vLyBUaGUgcmVzb2x2ZXIgdmlzaXRvciB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5hbHl6ZXIuCiAgIFJlc29sdmVyVmlzaXRvciBfdmlzaXRvcjsKIAotICAvKioKLSAgICogVGhlIGxpYnJhcnkgY29udGFpbmluZyB0aGUgY29kZSBiZWluZyByZXNvbHZlZC4KLSAgICovCisgIC8vLyBUaGUgbGlicmFyeSBjb250YWluaW5nIHRoZSBjb2RlIGJlaW5nIHJlc29sdmVkLgogICBMaWJyYXJ5RWxlbWVudEltcGwgX2RlZmluaW5nTGlicmFyeTsKIAotICAvKioKLSAgICogVGhlIGFuYWx5emVyIGJlaW5nIHVzZWQgdG8gYW5hbHl6ZSB0aGUgdGVzdCBjYXNlcy4KLSAgICovCisgIC8vLyBUaGUgYW5hbHl6ZXIgYmVpbmcgdXNlZCB0byBhbmFseXplIHRoZSB0ZXN0IGNhc2VzLgogICBTdGF0aWNUeXBlQW5hbHl6ZXIgX2FuYWx5emVyOwogCi0gIC8qKgotICAgKiBUaGUgdHlwZSBwcm92aWRlciB1c2VkIHRvIGFjY2VzcyB0aGUgdHlwZXMuCi0gICAqLworICAvLy8gVGhlIHR5cGUgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIHR5cGVzLgogICBUeXBlUHJvdmlkZXIgX3R5cGVQcm92aWRlcjsKIAogICBAb3ZlcnJpZGUKICAgVHlwZVByb3ZpZGVyIGdldCB0eXBlUHJvdmlkZXIgPT4gX2RlZmluaW5nTGlicmFyeS50eXBlUHJvdmlkZXI7CiAKLSAgLyoqCi0gICAqIFRoZSB0eXBlIHN5c3RlbSB1c2VkIHRvIGFuYWx5emUgdGhlIHRlc3QgY2FzZXMuCi0gICAqLworICAvLy8gVGhlIHR5cGUgc3lzdGVtIHVzZWQgdG8gYW5hbHl6ZSB0aGUgdGVzdCBjYXNlcy4KICAgVHlwZVN5c3RlbUltcGwgZ2V0IF90eXBlU3lzdGVtID0+IF9kZWZpbmluZ0xpYnJhcnkudHlwZVN5c3RlbTsKIAogICB2b2lkIGZhaWxfdmlzaXRGdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9uKCkgewpAQCAtNjgyLDExICs2NjcsOSBAQAogICAgIF9saXN0ZW5lci5hc3NlcnROb0Vycm9ycygpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFtub2RlXSBhZnRlciB0aGUgc3RhdGljIHR5cGUKLSAgICogYW5hbHl6ZXIgaGFzIGNvbXB1dGVkIGEgdHlwZSBmb3IgaXQuIElmIFt0aGlzVHlwZV0gaXMgcHJvdmlkZWQsIGl0IGlzIHRoZQotICAgKiB0eXBlIG9mICd0aGlzJy4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBbbm9kZV0gYWZ0ZXIgdGhlIHN0YXRpYyB0eXBlCisgIC8vLyBhbmFseXplciBoYXMgY29tcHV0ZWQgYSB0eXBlIGZvciBpdC4gSWYgW3RoaXNUeXBlXSBpcyBwcm92aWRlZCwgaXQgaXMgdGhlCisgIC8vLyB0eXBlIG9mICd0aGlzJy4KICAgRGFydFR5cGUgX2FuYWx5emUoRXhwcmVzc2lvbiBub2RlLCBbSW50ZXJmYWNlVHlwZSB0aGlzVHlwZV0pIHsKICAgICBfdmlzaXRvci5zZXRUaGlzSW50ZXJmYWNlVHlwZSh0aGlzVHlwZSk7CiAgICAgbm9kZS5hY2NlcHQoX2FuYWx5emVyKTsKQEAgLTcxNCw5ICs2OTcsNyBAQAogICAgIC8vIHV0aWxpdHkgbWV0aG9kLgogICB9CiAKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgYW5hbHl6ZXIgdXNlZCBieSB0aGUgdGVzdHMuCi0gICAqLworICAvLy8gQ3JlYXRlIHRoZSBhbmFseXplciB1c2VkIGJ5IHRoZSB0ZXN0cy4KICAgdm9pZCBfY3JlYXRlQW5hbHl6ZXIoKSB7CiAgICAgdmFyIGNvbnRleHQgPSBUZXN0QW5hbHlzaXNDb250ZXh0KCk7CiAgICAgdmFyIGluaGVyaXRhbmNlID0gSW5oZXJpdGFuY2VNYW5hZ2VyMygpOwpAQCAtNzQzLDQ5ICs3MjQsNDMgQEAKIAogICBEYXJ0VHlwZSBfZmxhdHRlbihEYXJ0VHlwZSB0eXBlKSA9PiBfdHlwZVN5c3RlbS5mbGF0dGVuKHR5cGUpOwogCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gaW50ZWdlciBsaXRlcmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGNvcnJlY3QgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbAotICAgKiBAcmV0dXJuIGFuIGludGVnZXIgbGl0ZXJhbCB0aGF0IGhhcyBiZWVuIHJlc29sdmVkIHRvIHRoZSBjb3JyZWN0IHR5cGUKLSAgICovCisgIC8vLyBSZXR1cm4gYW4gaW50ZWdlciBsaXRlcmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGNvcnJlY3QgdHlwZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsCisgIC8vLyBAcmV0dXJuIGFuIGludGVnZXIgbGl0ZXJhbCB0aGF0IGhhcyBiZWVuIHJlc29sdmVkIHRvIHRoZSBjb3JyZWN0IHR5cGUKICAgRG91YmxlTGl0ZXJhbCBfcmVzb2x2ZWREb3VibGUoZG91YmxlIHZhbHVlKSB7CiAgICAgRG91YmxlTGl0ZXJhbCBsaXRlcmFsID0gQXN0VGVzdEZhY3RvcnkuZG91YmxlTGl0ZXJhbCh2YWx1ZSk7CiAgICAgbGl0ZXJhbC5zdGF0aWNUeXBlID0gX3R5cGVQcm92aWRlci5kb3VibGVUeXBlOwogICAgIHJldHVybiBsaXRlcmFsOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiBhbiBpbnRlZ2VyIGxpdGVyYWwgdGhhdCBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgY29ycmVjdCB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsCi0gICAqIEByZXR1cm4gYW4gaW50ZWdlciBsaXRlcmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGNvcnJlY3QgdHlwZQotICAgKi8KKyAgLy8vIFJldHVybiBhbiBpbnRlZ2VyIGxpdGVyYWwgdGhhdCBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgY29ycmVjdCB0eXBlLgorICAvLy8KKyAgLy8vIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGxpdGVyYWwKKyAgLy8vIEByZXR1cm4gYW4gaW50ZWdlciBsaXRlcmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGNvcnJlY3QgdHlwZQogICBJbnRlZ2VyTGl0ZXJhbCBfcmVzb2x2ZWRJbnRlZ2VyKGludCB2YWx1ZSkgewogICAgIEludGVnZXJMaXRlcmFsIGxpdGVyYWwgPSBBc3RUZXN0RmFjdG9yeS5pbnRlZ2VyKHZhbHVlKTsKICAgICBsaXRlcmFsLnN0YXRpY1R5cGUgPSBfdHlwZVByb3ZpZGVyLmludFR5cGU7CiAgICAgcmV0dXJuIGxpdGVyYWw7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgc3RyaW5nIGxpdGVyYWwgdGhhdCBoYXMgYmVlbiByZXNvbHZlZCB0byB0aGUgY29ycmVjdCB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsCi0gICAqIEByZXR1cm4gYSBzdHJpbmcgbGl0ZXJhbCB0aGF0IGhhcyBiZWVuIHJlc29sdmVkIHRvIHRoZSBjb3JyZWN0IHR5cGUKLSAgICovCisgIC8vLyBSZXR1cm4gYSBzdHJpbmcgbGl0ZXJhbCB0aGF0IGhhcyBiZWVuIHJlc29sdmVkIHRvIHRoZSBjb3JyZWN0IHR5cGUuCisgIC8vLworICAvLy8gQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbAorICAvLy8gQHJldHVybiBhIHN0cmluZyBsaXRlcmFsIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gdGhlIGNvcnJlY3QgdHlwZQogICBTaW1wbGVTdHJpbmdMaXRlcmFsIF9yZXNvbHZlZFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKICAgICBTaW1wbGVTdHJpbmdMaXRlcmFsIHN0cmluZyA9IEFzdFRlc3RGYWN0b3J5LnN0cmluZzIodmFsdWUpOwogICAgIHN0cmluZy5zdGF0aWNUeXBlID0gX3R5cGVQcm92aWRlci5zdHJpbmdUeXBlOwogICAgIHJldHVybiBzdHJpbmc7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGEgc2ltcGxlIGlkZW50aWZpZXIgdGhhdCBoYXMgYmVlbiByZXNvbHZlZCB0byBhIHZhcmlhYmxlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIHJlcHJlc2VudGVkCi0gICAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCi0gICAqIEByZXR1cm4gYSBzaW1wbGUgaWRlbnRpZmllciB0aGF0IGhhcyBiZWVuIHJlc29sdmVkIHRvIGEgdmFyaWFibGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0eXBlCi0gICAqLworICAvLy8gUmV0dXJuIGEgc2ltcGxlIGlkZW50aWZpZXIgdGhhdCBoYXMgYmVlbiByZXNvbHZlZCB0byBhIHZhcmlhYmxlIGVsZW1lbnQKKyAgLy8vIHdpdGggdGhlIGdpdmVuIHR5cGUuCisgIC8vLworICAvLy8gQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIHJlcHJlc2VudGVkCisgIC8vLyBAcGFyYW0gdmFyaWFibGVOYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQorICAvLy8gQHJldHVybiBhIHNpbXBsZSBpZGVudGlmaWVyIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQgdG8gYSB2YXJpYWJsZSBlbGVtZW50CisgIC8vLyAgICAgICAgICAgd2l0aCB0aGUgZ2l2ZW4gdHlwZQogICBTaW1wbGVJZGVudGlmaWVyIF9yZXNvbHZlZFZhcmlhYmxlKEludGVyZmFjZVR5cGUgdHlwZSwgU3RyaW5nIHZhcmlhYmxlTmFtZSkgewogICAgIFNpbXBsZUlkZW50aWZpZXIgaWRlbnRpZmllciA9IEFzdFRlc3RGYWN0b3J5LmlkZW50aWZpZXIzKHZhcmlhYmxlTmFtZSk7CiAgICAgVmFyaWFibGVFbGVtZW50SW1wbCBlbGVtZW50ID0KQEAgLTc5NywxMCArNzcyLDggQEAKICAgfQogfQogCi0vKioKLSAqIEVuZC10by1lbmQgdGVzdHMgb2YgdGhlIHN0YXRpYyB0eXBlIGFuYWx5emVyIHRoYXQgdXNlIHRoZSBuZXcgZHJpdmVyIGFuZAotICogZW5hYmxlIHRoZSBzZXQtbGl0ZXJhbHMgZXhwZXJpbWVudC4KLSAqLworLy8vIEVuZC10by1lbmQgdGVzdHMgb2YgdGhlIHN0YXRpYyB0eXBlIGFuYWx5emVyIHRoYXQgdXNlIHRoZSBuZXcgZHJpdmVyIGFuZAorLy8vIGVuYWJsZSB0aGUgc2V0LWxpdGVyYWxzIGV4cGVyaW1lbnQuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIFN0YXRpY1R5cGVBbmFseXplcldpdGhTZXRMaXRlcmFsc1Rlc3QKICAgICBleHRlbmRzIFN0YXRpY1R5cGVBbmFseXplcjJUZXN0U2hhcmVkIHsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9zdGF0aWNfdHlwZV93YXJuaW5nX2NvZGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3N0YXRpY190eXBlX3dhcm5pbmdfY29kZV90ZXN0LmRhcnQKaW5kZXggMDEzZWYwOC4uNmQ2NTlhNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3N0YXRpY190eXBlX3dhcm5pbmdfY29kZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3N0YXRpY190eXBlX3dhcm5pbmdfY29kZV90ZXN0LmRhcnQKQEAgLTQ5MiwyMjggKzQ5Miw2IEBACiAgICAgXSk7CiAgIH0KIAotICB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2NvbXBvdW5kQXNzaWdubWVudCgpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotY2xhc3MgYnl0ZSB7Ci0gIGludCBfdmFsdWU7Ci0gIGJ5dGUodGhpcy5fdmFsdWUpOwotICBpbnQgb3BlcmF0b3IgKyhpbnQgdmFsKSB7IHJldHVybiAwOyB9Ci19Ci0KLXZvaWQgbWFpbigpIHsKLSAgYnl0ZSBiID0gbmV3IGJ5dGUoNTIpOwotICBiICs9IDM7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKEhpbnRDb2RlLlVOVVNFRF9GSUVMRCwgMTksIDYpLAotICAgICAgZXJyb3IoSGludENvZGUuVU5VU0VEX0xPQ0FMX1ZBUklBQkxFLCAxMTIsIDEpLAotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMTM3LCAxKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfZGVmYXVsdFZhbHVlX25hbWVkKCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1mKHtTdHJpbmcgeDogMH0pIHsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMTMsIDEpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF9kZWZhdWx0VmFsdWVfb3B0aW9uYWwoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWYoW1N0cmluZyB4ID0gMF0pIHsKLX0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDE0LCAxKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfZHluYW1pYygpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotbWFpbigpIHsKLSAgZHluYW1pYyA9IDE7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDIxLCAxKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfZnVuY3Rpb25FeHByZXNzaW9uSW52b2NhdGlvbigpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUoJycnCi1tYWluKCkgewotICBTdHJpbmcgeCA9ICgoKSA9PiA1KSgpOwotfQotJycnLCBbCi0gICAgICBlcnJvcihIaW50Q29kZS5VTlVTRURfTE9DQUxfVkFSSUFCTEUsIDE4LCAxKSwKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDIyLCAxMSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2lmTnVsbEFzc2lnbm1lbnQoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKCcnJwotdm9pZCBmKGludCBpKSB7Ci0gIGRvdWJsZSBkOwotICBkID8/PSBpOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCAzNiwgMSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2luc3RhbmNlVmFyaWFibGUoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWNsYXNzIEEgewotICBpbnQgeDsKLX0KLWYoKSB7Ci0gIEEgYTsKLSAgYS54ID0gJzAnOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCA0MiwgMyksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2xvY2FsVmFyaWFibGUoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWYoKSB7Ci0gIGludCB4OwotICB4ID0gJzAnOwotfQotJycnLCBbCi0gICAgICBlcnJvcihIaW50Q29kZS5VTlVTRURfTE9DQUxfVkFSSUFCTEUsIDEyLCAxKSwKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDIxLCAzKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfcG9zdGZpeEV4cHJlc3Npb25fbG9jYWxWYXJpYWJsZSgpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotY2xhc3MgQSB7Ci0gIEIgb3BlcmF0b3IrKF8pID0+IG5ldyBCKCk7Ci19Ci0KLWNsYXNzIEIge30KLQotZihBIGEpIHsKLSAgYSsrOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCA2NSwgMyksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X3Bvc3RmaXhFeHByZXNzaW9uX3Byb3BlcnR5KCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1jbGFzcyBBIHsKLSAgQiBvcGVyYXRvcisoXykgPT4gbmV3IEIoKTsKLX0KLQotY2xhc3MgQiB7fQotCi1jbGFzcyBDIHsKLSAgQSBhOwotfQotCi1mKEMgYykgewotICBjLmErKzsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgODUsIDUpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF9wcmVmaXhFeHByZXNzaW9uX2xvY2FsVmFyaWFibGUoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWNsYXNzIEEgewotICBCIG9wZXJhdG9yKyhfKSA9PiBuZXcgQigpOwotfQotCi1jbGFzcyBCIHt9Ci0KLWYoQSBhKSB7Ci0gICsrYTsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgNjUsIDMpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF9wcmVmaXhFeHByZXNzaW9uX3Byb3BlcnR5KCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1jbGFzcyBBIHsKLSAgQiBvcGVyYXRvcisoXykgPT4gbmV3IEIoKTsKLX0KLQotY2xhc3MgQiB7fQotCi1jbGFzcyBDIHsKLSAgQSBhOwotfQotCi1mKEMgYykgewotICArK2MuYTsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgODUsIDUpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF9yZWdyZXNzaW9uSW5Jc3N1ZTE4NDY4Rml4KCkgYXN5bmMgewotICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE4NjI4Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWNsYXNzIEM8VD4gewotICBUIHQgPSBpbnQ7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDIxLCAzKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfc3RhdGljVmFyaWFibGUoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWNsYXNzIEEgewotICBzdGF0aWMgaW50IHg7Ci19Ci1mKCkgewotICBBLnggPSAnMCc7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDQyLCAzKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfdG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uKCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKLWludCB4ID0gJ3N0cmluZyc7Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDgsIDgpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF90eXBlUGFyYW1ldGVyKCkgYXN5bmMgewotICAgIC8vIDE0MjIxCi0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWNsYXNzIEI8VD4gewotICBUIHZhbHVlOwotICB2b2lkIHRlc3QobnVtIG4pIHsKLSAgICB2YWx1ZSA9IG47Ci0gIH0KLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgNTcsIDEpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9pbnZhbGlkQXNzaWdubWVudF92YXJpYWJsZURlY2xhcmF0aW9uKCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1jbGFzcyBBIHsKLSAgaW50IHggPSAnc3RyaW5nJzsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMjAsIDgpLAotICAgIF0pOwotICB9Ci0KICAgdGVzdF9pbnZvY2F0aW9uT2ZOb25GdW5jdGlvbkV4cHJlc3Npb25fbGl0ZXJhbCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwogZigpIHsKQEAgLTcyNCwxMzcgKzUwMiw2IEBACiAgICAgXSk7CiAgIH0KIAotICB0ZXN0X25vbkJvb2xDb25kaXRpb25fY29uZGl0aW9uYWwoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKCcnJwotZigpIHsgcmV0dXJuIDMgPyAyIDogMTsgfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfQ09ORElUSU9OLCAxMywgMSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X25vbkJvb2xDb25kaXRpb25fZG8oKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWYoKSB7Ci0gIGRvIHt9IHdoaWxlICgzKTsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX0NPTkRJVElPTiwgMjEsIDEpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9ub25Cb29sQ29uZGl0aW9uX2ZvcigpIGFzeW5jIHsKLSAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMjQ3MTMKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotZigpIHsKLSAgZm9yICg7MzspIHt9Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9DT05ESVRJT04sIDE0LCAxKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbENvbmRpdGlvbl9pZigpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotZigpIHsKLSAgaWYgKDMpIHJldHVybiAyOyBlbHNlIHJldHVybiAxOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfQ09ORElUSU9OLCAxMiwgMSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X25vbkJvb2xDb25kaXRpb25fd2hpbGUoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWYoKSB7Ci0gIHdoaWxlICgzKSB7fQotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfQ09ORElUSU9OLCAxNSwgMSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X25vbkJvb2xFeHByZXNzaW9uX2Z1bmN0aW9uVHlwZV9ib29sKCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1ib29sIG1ha2VBc3NlcnRpb24oKSA9PiB0cnVlOwotZigpIHsKLSAgYXNzZXJ0KG1ha2VBc3NlcnRpb24pOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgNDUsIDEzKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbEV4cHJlc3Npb25fZnVuY3Rpb25UeXBlX2ludCgpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotaW50IG1ha2VBc3NlcnRpb24oKSA9PiAxOwotZigpIHsKLSAgYXNzZXJ0KG1ha2VBc3NlcnRpb24pOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgNDEsIDEzKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbEV4cHJlc3Npb25faW50ZXJmYWNlVHlwZSgpIGFzeW5jIHsKLSAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwotZigpIHsKLSAgYXNzZXJ0KDApOwotfQotJycnLCBbCi0gICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgMTUsIDEpLAotICAgIF0pOwotICB9Ci0KLSAgdGVzdF9ub25Cb29sTmVnYXRpb25FeHByZXNzaW9uKCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1mKCkgewotICAhNDI7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9ORUdBVElPTl9FWFBSRVNTSU9OLCA5LCAyKSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbE9wZXJhbmRfYW5kX2xlZnQoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWJvb2wgZihpbnQgbGVmdCwgYm9vbCByaWdodCkgewotICByZXR1cm4gbGVmdCAmJiByaWdodDsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX09QRVJBTkQsIDQwLCA0KSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbE9wZXJhbmRfYW5kX3JpZ2h0KCkgYXN5bmMgewotICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCi1ib29sIGYoYm9vbCBsZWZ0LCBTdHJpbmcgcmlnaHQpIHsKLSAgcmV0dXJuIGxlZnQgJiYgcmlnaHQ7Ci19Ci0nJycsIFsKLSAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9PUEVSQU5ELCA1MSwgNSksCi0gICAgXSk7Ci0gIH0KLQotICB0ZXN0X25vbkJvb2xPcGVyYW5kX29yX2xlZnQoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWJvb2wgZihMaXN0PGludD4gbGVmdCwgYm9vbCByaWdodCkgewotICByZXR1cm4gbGVmdCB8fCByaWdodDsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX09QRVJBTkQsIDQ2LCA0KSwKLSAgICBdKTsKLSAgfQotCi0gIHRlc3Rfbm9uQm9vbE9wZXJhbmRfb3JfcmlnaHQoKSBhc3luYyB7Ci0gICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKLWJvb2wgZihib29sIGxlZnQsIGRvdWJsZSByaWdodCkgewotICByZXR1cm4gbGVmdCB8fCByaWdodDsKLX0KLScnJywgWwotICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX09QRVJBTkQsIDUxLCA1KSwKLSAgICBdKTsKLSAgfQotCiAgIHRlc3Rfbm9uVHlwZUFzVHlwZUFyZ3VtZW50X25vdEFUeXBlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCiBpbnQgQTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC90ZXN0X2FuYWx5c2lzX2NvbnRleHQuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC90ZXN0X2FuYWx5c2lzX2NvbnRleHQuZGFydAppbmRleCAyZjdmOTI2Li5iNjg4MDZhIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvdGVzdF9hbmFseXNpc19jb250ZXh0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Rlc3RfYW5hbHlzaXNfY29udGV4dC5kYXJ0CkBAIC05LDggKzksOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2luaGVyaXRhbmNlX21hbmFnZXIzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZV9pby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGVzdF91dGlsaXRpZXMvbW9ja19zZGtfZWxlbWVudHMuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC90eXBlX3N5c3RlbV90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW1fdGVzdC5kYXJ0CmluZGV4IDg1NjFlM2MuLjM5MjlhNDkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC90eXBlX3N5c3RlbV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtX3Rlc3QuZGFydApAQCAtMTAsOCArMTAsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2xlYXN0X3VwcGVyX2JvdW5kLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L3Jlc29sdmVyL3ZhcmlhbmNlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApAQCAtNDQxLDkgKzQ0MSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0ZXN0aW5nIExVQiBhbmQgR0xCIGluIHNwZWMgYW5kIHN0cm9uZyBtb2RlLgotICovCisvLy8gQmFzZSBjbGFzcyBmb3IgdGVzdGluZyBMVUIgYW5kIEdMQiBpbiBzcGVjIGFuZCBzdHJvbmcgbW9kZS4KIGFic3RyYWN0IGNsYXNzIEJvdW5kVGVzdEJhc2UgZXh0ZW5kcyBBYnN0cmFjdFR5cGVTeXN0ZW1UZXN0IHsKICAgdm9pZCBfY2hlY2tMZWFzdFVwcGVyQm91bmQoRGFydFR5cGUgVDEsIERhcnRUeXBlIFQyLCBEYXJ0VHlwZSBleHBlY3RlZCkgewogICAgIHZhciBleHBlY3RlZFN0ciA9IF90eXBlU3RyaW5nKGV4cGVjdGVkKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC91dGlsaXRpZXNfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3V0aWxpdGllc190ZXN0LmRhcnQKaW5kZXggZTkxNmI2OS4uYWJmMDEwNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3V0aWxpdGllc190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3V0aWxpdGllc190ZXN0LmRhcnQKQEAgLTExMTgsMTMgKzExMTgsMTIgQEAKICAgICBfYXNzZXJ0Q2xvbmVVbml0TWVtYmVyKCdtYWluKCkgYXN5bmMqIHsgeWllbGQgNDI7IH0nKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCBhbiBgQXN0Q2xvbmVyYCB3aWxsIHByb2R1Y2UgdGhlIGV4cGVjdGVkIEFTVCBzdHJ1Y3R1cmUgd2hlbgotICAgKiB2aXNpdGluZyB0aGUgZ2l2ZW4gW25vZGVdLgotICAgKgotICAgKiBAcGFyYW0gbm9kZSB0aGUgQVNUIG5vZGUgYmVpbmcgdmlzaXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgc3RydWN0dXJlCi0gICAqIEB0aHJvd3MgQUZFIGlmIHRoZSB2aXNpdG9yIGRvZXMgbm90IHByb2R1Y2UgdGhlIGV4cGVjdGVkIHNvdXJjZSBmb3IgdGhlIGdpdmVuIG5vZGUKLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCBhbiBgQXN0Q2xvbmVyYCB3aWxsIHByb2R1Y2UgdGhlIGV4cGVjdGVkIEFTVCBzdHJ1Y3R1cmUgd2hlbgorICAvLy8gdmlzaXRpbmcgdGhlIGdpdmVuIFtub2RlXS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gbm9kZSB0aGUgQVNUIG5vZGUgYmVpbmcgdmlzaXRlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgc3RydWN0dXJlCisgIC8vLyBAdGhyb3dzIEFGRSBpZiB0aGUgdmlzaXRvciBkb2VzIG5vdCBwcm9kdWNlIHRoZSBleHBlY3RlZCBzb3VyY2UgZm9yIHRoZQorICAvLy8gICAgICAgICAgIGdpdmVuIG5vZGUKICAgdm9pZCBfYXNzZXJ0Q2xvbmUoQXN0Tm9kZSBub2RlKSB7CiAgICAgewogICAgICAgQXN0Tm9kZSBjbG9uZSA9IG5vZGUuYWNjZXB0KEFzdENsb25lcigpKTsKQEAgLTEyNTUsMTAgKzEyNTQsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgW3Rva2VuXSBoYXMgYHByZXZpb3VzYCBzZXQsIGFuZCBpZiBpdCBgRU9GYCwgdGhlbiBpdAotICAgKiBwb2ludHMgaXRzZWxmLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSBbdG9rZW5dIGhhcyBgcHJldmlvdXNgIHNldCwgYW5kIGlmIGl0IGBFT0ZgLCB0aGVuIGl0CisgIC8vLyBwb2ludHMgaXRzZWxmLgogICBzdGF0aWMgdm9pZCBfYXNzZXJ0SGFzUHJldmlvdXMoVG9rZW4gdG9rZW4pIHsKICAgICBleHBlY3QodG9rZW4sIGlzTm90TnVsbCk7CiAgICAgaWYgKHRva2VuLnR5cGUgPT0gVG9rZW5UeXBlLkVPRikgewpAQCAtMjYwOSw5ICsyNjA2LDcgQEAKIAogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBOb2RlUmVwbGFjZXJUZXN0IHsKLSAgLyoqCi0gICAqIEFuIGVtcHR5IGxpc3Qgb2YgdG9rZW5zLgotICAgKi8KKyAgLy8vIEFuIGVtcHR5IGxpc3Qgb2YgdG9rZW5zLgogICBzdGF0aWMgY29uc3QgTGlzdDxUb2tlbj4gRU1QVFlfVE9LRU5fTElTVCA9IDxUb2tlbj5bXTsKIAogICB2b2lkIHRlc3RfYWRqYWNlbnRTdHJpbmdzKCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvaWRfdGVzdHMvcmVhY2hhYmlsaXR5X3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2lkX3Rlc3RzL3JlYWNoYWJpbGl0eV90ZXN0LmRhcnQKaW5kZXggODMzZjEzMS4uYzg3NTFmZiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvaWRfdGVzdHMvcmVhY2hhYmlsaXR5X3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9pZF90ZXN0cy9yZWFjaGFiaWxpdHlfdGVzdC5kYXJ0CkBAIC0xMTYsNyArMTE2LDggQEAKICAgY29uc3QgX1JlYWNoYWJpbGl0eURhdGFJbnRlcnByZXRlcigpOwogCiAgIEBvdmVycmlkZQotICBTdHJpbmcgZ2V0VGV4dChTZXQ8X1JlYWNoYWJpbGl0eUFzc2VydGlvbj4gYWN0dWFsRGF0YSwgW1N0cmluZyBpbmRlbnRhdGlvbl0pID0+CisgIFN0cmluZyBnZXRUZXh0KFNldDxfUmVhY2hhYmlsaXR5QXNzZXJ0aW9uPiBhY3R1YWxEYXRhLAorICAgICAgICAgIFtTdHJpbmcgaW5kZW50YXRpb25dKSA9PgogICAgICAgX3NvcnRlZFJlcHJlc2VudGF0aW9uKF90b1N0cmluZ3MoYWN0dWFsRGF0YSkpOwogCiAgIEBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvcmVzb3VyY2VfdXRpbHMuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3Jlc291cmNlX3V0aWxzLmRhcnQKaW5kZXggOGJjMDU4My4uZjk5MTc2NyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvcmVzb3VyY2VfdXRpbHMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9yZXNvdXJjZV91dGlscy5kYXJ0CkBAIC0xMywzNSArMTMsMjcgQEAKIAogYm9vbCBnZXQgaXNXaW5kb3dzID0+IHBhdGguU3R5bGUucGxhdGZvcm0gPT0gcGF0aC5TdHlsZS53aW5kb3dzOwogCi0vKioKLSAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIHBvc2l4IGFuZCBhYnNvbHV0ZS4KLSAqLworLy8vIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIHBvc2l4IGFuZCBhYnNvbHV0ZS4KIHZvaWQgZXhwZWN0QWJzb2x1dGVQb3NpeFBhdGgoU3RyaW5nIHBvc2l4UGF0aCkgewogICBleHBlY3QocG9zaXhQYXRoLCBzdGFydHNXaXRoKCcvJyksCiAgICAgICByZWFzb246ICdFeHBlY3RlZCBhYnNvbHV0ZSBwb3NpeCBwYXRoLCBidXQgZm91bmQgJHBvc2l4UGF0aCcpOwogfQogCi0vKioKLSAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIHBvc2l4LgotICovCisvLy8gQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHBhdGggaXMgcG9zaXguCiB2b2lkIGV4cGVjdFBvc2l4UGF0aChTdHJpbmcgcG9zaXhQYXRoKSB7CiAgIGV4cGVjdChwb3NpeFBhdGguaW5kZXhPZignXFwnKSwgLTEsCiAgICAgICByZWFzb246ICdFeHBlY3RlZCBwb3NpeCBwYXRoLCBidXQgZm91bmQgJHBvc2l4UGF0aCcpOwogfQogCi0vKioKLSAqIFRyYW5zbGF0ZSB0aGUgZ2l2ZW4gcG9zaXhQYXRoIHRvIGEgZmlsZSBVUkkgYXBwcm9wcmlhdGUgZm9yIHRoZQotICogcGxhdGZvcm0gb24gd2hpY2ggdGhlIHRlc3RzIGFyZSBleGVjdXRpbmcuCi0gKi8KKy8vLyBUcmFuc2xhdGUgdGhlIGdpdmVuIHBvc2l4UGF0aCB0byBhIGZpbGUgVVJJIGFwcHJvcHJpYXRlIGZvciB0aGUKKy8vLyBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgdGVzdHMgYXJlIGV4ZWN1dGluZy4KIFN0cmluZyBwb3NpeFRvT1NGaWxlVXJpKFN0cmluZyBwb3NpeFBhdGgpIHsKICAgZXhwZWN0UG9zaXhQYXRoKHBvc2l4UGF0aCk7CiAgIHJldHVybiBpc1dpbmRvd3MgPyAnZmlsZTovLy9DOiRwb3NpeFBhdGgnIDogJ2ZpbGU6Ly8kcG9zaXhQYXRoJzsKIH0KIAotLyoqCi0gKiBUcmFuc2xhdGUgdGhlIGdpdmVuIHBvc2l4UGF0aCB0byBhIHBhdGggYXBwcm9wcmlhdGUgZm9yIHRoZQotICogcGxhdGZvcm0gb24gd2hpY2ggdGhlIHRlc3RzIGFyZSBleGVjdXRpbmcuCi0gKi8KKy8vLyBUcmFuc2xhdGUgdGhlIGdpdmVuIHBvc2l4UGF0aCB0byBhIHBhdGggYXBwcm9wcmlhdGUgZm9yIHRoZQorLy8vIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSB0ZXN0cyBhcmUgZXhlY3V0aW5nLgogU3RyaW5nIHBvc2l4VG9PU1BhdGgoU3RyaW5nIHBvc2l4UGF0aCkgewogICBleHBlY3RQb3NpeFBhdGgocG9zaXhQYXRoKTsKICAgaWYgKGlzV2luZG93cykgewpAQCAtNTQsMTYgKzQ2LDE0IEBACiAgIHJldHVybiBwb3NpeFBhdGg7CiB9CiAKLS8qKgotICogQSBjb252ZW5pZW5jZSB1dGlsaXR5IGZvciBzZXR0aW5nIHVwIGEgdGVzdCBbTWVtb3J5UmVzb3VyY2VQcm92aWRlcl0uCi0gKiBBbGwgc3VwcGxpZWQgcGF0aHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gW3BhdGgucG9zaXhdIGZvcm1hdAotICogYW5kIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgdG8gW3BhdGguY29udGV4dF0uCi0gKgotICogVGhpcyBjbGFzcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGltcGxlbWVudCBbUmVzb3VyY2VQcm92aWRlcl0KLSAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgc28gdGhhdCBpdCBjYW5ub3QgYmUgdXNlZCBhcyBhIHJlc291cmNlIHByb3ZpZGVyLgotICogV2UgZG8gbm90IHdhbnQgZnVuY3Rpb25hbGl0eSB1bmRlciB0ZXN0IHRvIGludGVyYWN0IHdpdGggYSByZXNvdXJjZSBwcm92aWRlcgotICogdGhhdCBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZXMgcGF0aHMuCi0gKi8KKy8vLyBBIGNvbnZlbmllbmNlIHV0aWxpdHkgZm9yIHNldHRpbmcgdXAgYSB0ZXN0IFtNZW1vcnlSZXNvdXJjZVByb3ZpZGVyXS4KKy8vLyBBbGwgc3VwcGxpZWQgcGF0aHMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gW3BhdGgucG9zaXhdIGZvcm1hdAorLy8vIGFuZCBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIHRvIFtwYXRoLmNvbnRleHRdLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGltcGxlbWVudCBbUmVzb3VyY2VQcm92aWRlcl0KKy8vLyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSByZXNvdXJjZSBwcm92aWRlci4KKy8vLyBXZSBkbyBub3Qgd2FudCBmdW5jdGlvbmFsaXR5IHVuZGVyIHRlc3QgdG8gaW50ZXJhY3Qgd2l0aCBhIHJlc291cmNlIHByb3ZpZGVyCisvLy8gdGhhdCBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZXMgcGF0aHMuCiBjbGFzcyBUZXN0UGF0aFRyYW5zbGF0b3IgewogICBmaW5hbCBNZW1vcnlSZXNvdXJjZVByb3ZpZGVyIF9wcm92aWRlcjsKIApAQCAtODIsMTAgKzcyLDggQEAKICAgICAgIF9wcm92aWRlci5uZXdGb2xkZXIocG9zaXhUb09TUGF0aChwb3NpeFBhdGgpKTsKIH0KIAotLyoqCi0gKiBBIHJlc291cmNlIHByb3ZpZGVyIGZvciB0ZXN0aW5nIHRoYXQgYXNzZXJ0cyB0aGF0IGFueSBzdXBwbGllZCBwYXRocwotICogYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgT1MgcGxhdGZvcm0gb24gd2hpY2ggdGhlIHRlc3RzIGFyZSBydW5uaW5nLgotICovCisvLy8gQSByZXNvdXJjZSBwcm92aWRlciBmb3IgdGVzdGluZyB0aGF0IGFzc2VydHMgdGhhdCBhbnkgc3VwcGxpZWQgcGF0aHMKKy8vLyBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBPUyBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgdGVzdHMgYXJlIHJ1bm5pbmcuCiBjbGFzcyBUZXN0UmVzb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFJlc291cmNlUHJvdmlkZXIgewogICBmaW5hbCBSZXNvdXJjZVByb3ZpZGVyIF9wcm92aWRlcjsKIApAQCAtMTEyLDEwICsxMDAsOCBAQAogICBGb2xkZXIgZ2V0U3RhdGVMb2NhdGlvbihTdHJpbmcgcGx1Z2luSWQpID0+CiAgICAgICBfcHJvdmlkZXIuZ2V0U3RhdGVMb2NhdGlvbihwbHVnaW5JZCk7CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIHZhbGlkIGZvciB0aGUgT1MgcGxhdGZvcm0gb24gd2hpY2ggdGhlCi0gICAqIHRlc3RzIGFyZSBydW5uaW5nLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIHZhbGlkIGZvciB0aGUgT1MgcGxhdGZvcm0gb24gd2hpY2ggdGhlCisgIC8vLyB0ZXN0cyBhcmUgcnVubmluZy4KICAgU3RyaW5nIF9hc3NlcnRQYXRoKFN0cmluZyBwYXRoKSB7CiAgICAgaWYgKGlzV2luZG93cykgewogICAgICAgaWYgKHBhdGguY29udGFpbnMoJy8nKSkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2NvbW1hbmRfbGluZS9hcmd1bWVudHNfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2NvbW1hbmRfbGluZS9hcmd1bWVudHNfdGVzdC5kYXJ0CmluZGV4IDM2MmNjNDguLjM4Y2NjN2MgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9jb21tYW5kX2xpbmUvYXJndW1lbnRzX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvY29tbWFuZF9saW5lL2FyZ3VtZW50c190ZXN0LmRhcnQKQEAgLTcxLDU1ICs3MSwyNSBAQAogICAgIGV4cGVjdChkZWZhdWx0T3B0aW9ucy5pbXBsaWNpdER5bmFtaWMsIHRydWUpOwogICB9CiAKLSAgdm9pZCB0ZXN0X2NyZWF0ZURhcnRTZGtNYW5hZ2VyX25vUGF0aF9ub1N1bW1hcmllcygpIHsKKyAgdm9pZCB0ZXN0X2NyZWF0ZURhcnRTZGtNYW5hZ2VyX25vUGF0aCgpIHsKICAgICBBcmdQYXJzZXIgcGFyc2VyID0gQXJnUGFyc2VyKCk7CiAgICAgZGVmaW5lQW5hbHlzaXNBcmd1bWVudHMocGFyc2VyKTsKICAgICBMaXN0PFN0cmluZz4gYXJncyA9IFtdOwogICAgIEFyZ1Jlc3VsdHMgcmVzdWx0ID0gcGFyc2UocmVzb3VyY2VQcm92aWRlciwgcGFyc2VyLCBhcmdzKTsKLSAgICBEYXJ0U2RrTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgY3JlYXRlRGFydFNka01hbmFnZXIocmVzb3VyY2VQcm92aWRlciwgZmFsc2UsIHJlc3VsdCk7CisgICAgRGFydFNka01hbmFnZXIgbWFuYWdlciA9IGNyZWF0ZURhcnRTZGtNYW5hZ2VyKHJlc291cmNlUHJvdmlkZXIsIHJlc3VsdCk7CiAgICAgZXhwZWN0KG1hbmFnZXIsIGlzTm90TnVsbCk7CiAgICAgZXhwZWN0KG1hbmFnZXIuZGVmYXVsdFNka0RpcmVjdG9yeSwKICAgICAgICAgRm9sZGVyQmFzZWREYXJ0U2RrLmRlZmF1bHRTZGtEaXJlY3RvcnkocmVzb3VyY2VQcm92aWRlcik/LnBhdGgpOwotICAgIGV4cGVjdChtYW5hZ2VyLmNhblVzZVN1bW1hcmllcywgZmFsc2UpOwogICB9CiAKLSAgdm9pZCB0ZXN0X2NyZWF0ZURhcnRTZGtNYW5hZ2VyX25vUGF0aF9zdW1tYXJpZXMoKSB7Ci0gICAgQXJnUGFyc2VyIHBhcnNlciA9IEFyZ1BhcnNlcigpOwotICAgIGRlZmluZUFuYWx5c2lzQXJndW1lbnRzKHBhcnNlcik7Ci0gICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBbXTsKLSAgICBBcmdSZXN1bHRzIHJlc3VsdCA9IHBhcnNlKHJlc291cmNlUHJvdmlkZXIsIHBhcnNlciwgYXJncyk7Ci0gICAgRGFydFNka01hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgIGNyZWF0ZURhcnRTZGtNYW5hZ2VyKHJlc291cmNlUHJvdmlkZXIsIHRydWUsIHJlc3VsdCk7Ci0gICAgZXhwZWN0KG1hbmFnZXIsIGlzTm90TnVsbCk7Ci0KLSAgICBleHBlY3QobWFuYWdlci5kZWZhdWx0U2RrRGlyZWN0b3J5LAotICAgICAgICBGb2xkZXJCYXNlZERhcnRTZGsuZGVmYXVsdFNka0RpcmVjdG9yeShyZXNvdXJjZVByb3ZpZGVyKT8ucGF0aCk7Ci0gICAgZXhwZWN0KG1hbmFnZXIuY2FuVXNlU3VtbWFyaWVzLCB0cnVlKTsKLSAgfQotCi0gIHZvaWQgdGVzdF9jcmVhdGVEYXJ0U2RrTWFuYWdlcl9wYXRoX25vU3VtbWFyaWVzKCkgeworICB2b2lkIHRlc3RfY3JlYXRlRGFydFNka01hbmFnZXJfcGF0aCgpIHsKICAgICBBcmdQYXJzZXIgcGFyc2VyID0gQXJnUGFyc2VyKCk7CiAgICAgZGVmaW5lQW5hbHlzaXNBcmd1bWVudHMocGFyc2VyKTsKICAgICBMaXN0PFN0cmluZz4gYXJncyA9IFsnLS1kYXJ0LXNkaz14J107CiAgICAgQXJnUmVzdWx0cyByZXN1bHQgPSBwYXJzZShyZXNvdXJjZVByb3ZpZGVyLCBwYXJzZXIsIGFyZ3MpOwotICAgIERhcnRTZGtNYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICBjcmVhdGVEYXJ0U2RrTWFuYWdlcihyZXNvdXJjZVByb3ZpZGVyLCBmYWxzZSwgcmVzdWx0KTsKKyAgICBEYXJ0U2RrTWFuYWdlciBtYW5hZ2VyID0gY3JlYXRlRGFydFNka01hbmFnZXIocmVzb3VyY2VQcm92aWRlciwgcmVzdWx0KTsKICAgICBleHBlY3QobWFuYWdlciwgaXNOb3ROdWxsKTsKICAgICBleHBlY3QobWFuYWdlci5kZWZhdWx0U2RrRGlyZWN0b3J5LCAneCcpOwotICAgIGV4cGVjdChtYW5hZ2VyLmNhblVzZVN1bW1hcmllcywgZmFsc2UpOwotICB9Ci0KLSAgdm9pZCB0ZXN0X2NyZWF0ZURhcnRTZGtNYW5hZ2VyX3BhdGhfc3VtbWFyaWVzKCkgewotICAgIEFyZ1BhcnNlciBwYXJzZXIgPSBBcmdQYXJzZXIoKTsKLSAgICBkZWZpbmVBbmFseXNpc0FyZ3VtZW50cyhwYXJzZXIpOwotICAgIExpc3Q8U3RyaW5nPiBhcmdzID0gWyctLWRhcnQtc2RrPXknXTsKLSAgICBBcmdSZXN1bHRzIHJlc3VsdCA9IHBhcnNlKHJlc291cmNlUHJvdmlkZXIsIHBhcnNlciwgYXJncyk7Ci0gICAgRGFydFNka01hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgIGNyZWF0ZURhcnRTZGtNYW5hZ2VyKHJlc291cmNlUHJvdmlkZXIsIHRydWUsIHJlc3VsdCk7Ci0gICAgZXhwZWN0KG1hbmFnZXIsIGlzTm90TnVsbCk7Ci0gICAgZXhwZWN0KG1hbmFnZXIuZGVmYXVsdFNka0RpcmVjdG9yeSwgJ3knKTsKLSAgICBleHBlY3QobWFuYWdlci5jYW5Vc2VTdW1tYXJpZXMsIHRydWUpOwogICB9CiAKICAgdm9pZCB0ZXN0X2RlZmluZUFuYWx5c2lzQXJndW1lbnRzKCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2NvbnRleHQvYnVpbGRlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvY29udGV4dC9idWlsZGVyX3Rlc3QuZGFydAppbmRleCAyMjc4NjJmLi42M2M4OGVjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvY29udGV4dC9idWlsZGVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvY29udGV4dC9idWlsZGVyX3Rlc3QuZGFydApAQCAtNDAsMzAgKzQwLDIwIEBACiAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQ29udGV4dEJ1aWxkZXJUZXN0IHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluIHsKLSAgLyoqCi0gICAqIFRoZSBTREsgbWFuYWdlciB1c2VkIGJ5IHRoZSB0ZXN0czsKLSAgICovCisgIC8vLyBUaGUgU0RLIG1hbmFnZXIgdXNlZCBieSB0aGUgdGVzdHM7CiAgIERhcnRTZGtNYW5hZ2VyIHNka01hbmFnZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBjb250ZW50IGNhY2hlIHVzZWQgYnkgdGhlIHRlc3RzLgotICAgKi8KKyAgLy8vIFRoZSBjb250ZW50IGNhY2hlIHVzZWQgYnkgdGhlIHRlc3RzLgogICBDb250ZW50Q2FjaGUgY29udGVudENhY2hlOwogCi0gIC8qKgotICAgKiBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNvbnRleHQgYnVpbGRlci4KLSAgICovCisgIC8vLyBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGNvbnRleHQgYnVpbGRlci4KICAgQ29udGV4dEJ1aWxkZXJPcHRpb25zIGJ1aWxkZXJPcHRpb25zID0gQ29udGV4dEJ1aWxkZXJPcHRpb25zKCk7CiAKLSAgLyoqCi0gICAqIFRoZSBjb250ZXh0IGJ1aWxkZXIgdG8gYmUgdXNlZCBpbiB0aGUgdGVzdC4KLSAgICovCisgIC8vLyBUaGUgY29udGV4dCBidWlsZGVyIHRvIGJlIHVzZWQgaW4gdGhlIHRlc3QuCiAgIENvbnRleHRCdWlsZGVyIGJ1aWxkZXI7CiAKLSAgLyoqCi0gICAqIFRoZSBwYXRoIHRvIHRoZSBkZWZhdWx0IFNESywgb3IgYG51bGxgIGlmIHRoZSB0ZXN0IGhhcyBub3QgZXhwbGljaXRseQotICAgKiBpbnZva2VkIFtjcmVhdGVEZWZhdWx0U2RrXS4KLSAgICovCisgIC8vLyBUaGUgcGF0aCB0byB0aGUgZGVmYXVsdCBTREssIG9yIGBudWxsYCBpZiB0aGUgdGVzdCBoYXMgbm90IGV4cGxpY2l0bHkKKyAgLy8vIGludm9rZWQgW2NyZWF0ZURlZmF1bHRTZGtdLgogICBTdHJpbmcgZGVmYXVsdFNka1BhdGg7CiAKICAgX01vY2tMaW50UnVsZSBfbW9ja0xpbnRSdWxlOwpAQCAtODYsMTQgKzc2LDE0IEBACiAgICJjb3JlIjogY29uc3QgTGlicmFyeUluZm8oImNvcmUvY29yZS5kYXJ0IiksCiB9OwogJycnKTsKLSAgICBzZGtNYW5hZ2VyID0gRGFydFNka01hbmFnZXIoZGVmYXVsdFNka1BhdGgsIGZhbHNlKTsKKyAgICBzZGtNYW5hZ2VyID0gRGFydFNka01hbmFnZXIoZGVmYXVsdFNka1BhdGgpOwogICAgIGJ1aWxkZXIgPSBDb250ZXh0QnVpbGRlcihyZXNvdXJjZVByb3ZpZGVyLCBzZGtNYW5hZ2VyLCBjb250ZW50Q2FjaGUsCiAgICAgICAgIG9wdGlvbnM6IGJ1aWxkZXJPcHRpb25zKTsKICAgfQogCiAgIHZvaWQgc2V0VXAoKSB7CiAgICAgTW9ja1NkayhyZXNvdXJjZVByb3ZpZGVyOiByZXNvdXJjZVByb3ZpZGVyKTsKLSAgICBzZGtNYW5hZ2VyID0gRGFydFNka01hbmFnZXIoY29udmVydFBhdGgoJy9zZGsnKSwgZmFsc2UpOworICAgIHNka01hbmFnZXIgPSBEYXJ0U2RrTWFuYWdlcihjb252ZXJ0UGF0aCgnL3NkaycpKTsKICAgICBjb250ZW50Q2FjaGUgPSBDb250ZW50Q2FjaGUoKTsKICAgICBidWlsZGVyID0gQ29udGV4dEJ1aWxkZXIoCiAgICAgICByZXNvdXJjZVByb3ZpZGVyLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvYmFzZS5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvYmFzZS5kYXJ0CmluZGV4IDc5NjE4MzUuLjVmMmY1YjcgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL2Jhc2UuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9iYXNlLmRhcnQKQEAgLTI0LDkgKzI0LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGVzdF91dGlsaXRpZXMvcmVzb3VyY2VfcHJvdmlkZXJfbWl4aW4uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogCi0vKioKLSAqIEZpbmRzIGFuIFtFbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCi0gKi8KKy8vLyBGaW5kcyBhbiBbRWxlbWVudF0gd2l0aCB0aGUgZ2l2ZW4gW25hbWVdLgogRWxlbWVudCBmaW5kQ2hpbGRFbGVtZW50KEVsZW1lbnQgcm9vdCwgU3RyaW5nIG5hbWUsIFtFbGVtZW50S2luZCBraW5kXSkgewogICBFbGVtZW50IHJlc3VsdDsKICAgcm9vdC5hY2NlcHQoX0VsZW1lbnRWaXNpdG9yRnVuY3Rpb25XcmFwcGVyKChFbGVtZW50IGVsZW1lbnQpIHsKQEAgLTY4LDggKzY2LDYgQEAKIAogICBMaXN0PFN0cmluZz4gZW5hYmxlZEV4cGVyaW1lbnRzID0gW107CiAKLSAgYm9vbCBnZXQgZGlzYWJsZUNoYW5nZXNBbmRDYWNoZUFsbFJlc3VsdHMgPT4gZmFsc2U7Ci0KICAgdm9pZCBhZGRUZXN0RmlsZShTdHJpbmcgY29udGVudCwge2Jvb2wgcHJpb3JpdHkgPSBmYWxzZX0pIHsKICAgICB0ZXN0Q29kZSA9IGNvbnRlbnQ7CiAgICAgbmV3RmlsZSh0ZXN0RmlsZSwgY29udGVudDogY29udGVudCk7CkBAIC0xMDIsNyArOTgsNiBAQAogICAgICAgICBdKSwKICAgICAgICAgY3JlYXRlQW5hbHlzaXNPcHRpb25zKCksCiAgICAgICAgIHBhY2thZ2VzOiBQYWNrYWdlcy5lbXB0eSwKLSAgICAgICAgZGlzYWJsZUNoYW5nZXNBbmRDYWNoZUFsbFJlc3VsdHM6IGRpc2FibGVDaGFuZ2VzQW5kQ2FjaGVBbGxSZXN1bHRzLAogICAgICAgICBlbmFibGVJbmRleDogdHJ1ZSwKICAgICAgICAgZXh0ZXJuYWxTdW1tYXJpZXM6IGV4dGVybmFsU3VtbWFyaWVzKTsKICAgfQpAQCAtMTU2LDkgKzE1MSw3IEBACiAgIHZvaWQgdGVhckRvd24oKSB7fQogfQogCi0vKioKLSAqIFdyYXBzIGFuIFtfRWxlbWVudFZpc2l0b3JGdW5jdGlvbl0gaW50byBhIFtHZW5lcmFsaXppbmdFbGVtZW50VmlzaXRvcl0uCi0gKi8KKy8vLyBXcmFwcyBhbiBbX0VsZW1lbnRWaXNpdG9yRnVuY3Rpb25dIGludG8gYSBbR2VuZXJhbGl6aW5nRWxlbWVudFZpc2l0b3JdLgogY2xhc3MgX0VsZW1lbnRWaXNpdG9yRnVuY3Rpb25XcmFwcGVyIGV4dGVuZHMgR2VuZXJhbGl6aW5nRWxlbWVudFZpc2l0b3IgewogICBmaW5hbCBfRWxlbWVudFZpc2l0b3JGdW5jdGlvbiBmdW5jdGlvbjsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX2NhY2hpbmdfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX2NhY2hpbmdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWFmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfY2FjaGluZ190ZXN0LmRhcnQKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lcnJvci9saW50X2NvZGVzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9saW50L3JlZ2lzdHJ5LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmxpbnRlci9zcmMvcnVsZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKKworaW1wb3J0ICcuLi9yZXNvbHV0aW9uL2RyaXZlcl9yZXNvbHV0aW9uLmRhcnQnOworCittYWluKCkgeworICBkZWZpbmVSZWZsZWN0aXZlU3VpdGUoKCkgeworICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhBbmFseXNpc0RyaXZlckNhY2hpbmdUZXN0KTsKKyAgfSk7Cit9CisKK0ByZWZsZWN0aXZlVGVzdAorY2xhc3MgQW5hbHlzaXNEcml2ZXJDYWNoaW5nVGVzdCBleHRlbmRzIERyaXZlclJlc29sdXRpb25UZXN0IHsKKyAgTGlzdDxTZXQ8U3RyaW5nPj4gZ2V0IF9saW5rZWRDeWNsZXMgeworICAgIHJldHVybiBkcml2ZXIudGVzdC5saWJyYXJ5Q29udGV4dC5saW5rZWRDeWNsZXM7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpOworICAgIHJlZ2lzdGVyTGludFJ1bGVzKCk7CisgIH0KKworICB0ZXN0X2xpbnRzKCkgYXN5bmMgeworICAgIHZhciBwYXRoID0gY29udmVydFBhdGgoJy90ZXN0L2xpYi90ZXN0LmRhcnQnKTsKKworICAgIG5ld0ZpbGUocGF0aCwgY29udGVudDogcicnJwordm9pZCBmKCkgeworICAhWzBdLmlzRW1wdHk7Cit9CisnJycpOworCisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgbGludHMgY29uZmlndXJlZCwgc28gbm8gZXJyb3JzLgorICAgIGFzc2VydEVycm9yc0luTGlzdCgKKyAgICAgIChhd2FpdCBkcml2ZXIuZ2V0RXJyb3JzKHBhdGgpKS5lcnJvcnMsCisgICAgICBbXSwKKyAgICApOworCisgICAgLy8gVGhlIHN1bW1hcnkgZm9yIHRoZSBsaWJyYXJ5IHdhcyBsaW5rZWQuCisgICAgX2Fzc2VydEhhc0xpbmtlZEN5Y2xlKHtwYXRofSwgYW5kQ2xlYXI6IHRydWUpOworCisgICAgLy8gQ29uZmlndXJlIHRvIHJ1biBhIGxpbnQuCisgICAgZHJpdmVyLmNvbmZpZ3VyZSgKKyAgICAgIGFuYWx5c2lzT3B0aW9uczogQW5hbHlzaXNPcHRpb25zSW1wbCgpCisgICAgICAgIC4ubGludCA9IHRydWUKKyAgICAgICAgLi5saW50UnVsZXMgPSBbCisgICAgICAgICAgUmVnaXN0cnkucnVsZVJlZ2lzdHJ5LmdldFJ1bGUoJ3ByZWZlcl9pc19ub3RfZW1wdHknKSwKKyAgICAgICAgXSwKKyAgICApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbGludCB3YXMgcnVuLCBhbmQgcmVwb3J0ZWQuCisgICAgX2Fzc2VydEhhc0xpbnRSZXBvcnRlZCgKKyAgICAgIChhd2FpdCBkcml2ZXIuZ2V0RXJyb3JzKHBhdGgpKS5lcnJvcnMsCisgICAgICAncHJlZmVyX2lzX25vdF9lbXB0eScsCisgICAgKTsKKworICAgIC8vIExpbnRzIGRvbid0IGFmZmVjdCBzdW1tYXJpZXMsIG5vdGhpbmcgc2hvdWxkIGJlIGxpbmtlZC4KKyAgICBfYXNzZXJ0Tm9MaW5rZWRDeWNsZXMoKTsKKyAgfQorCisgIHZvaWQgX2Fzc2VydEhhc0xpbmtlZEN5Y2xlKFNldDxTdHJpbmc+IGV4cGVjdGVkLCB7Ym9vbCBhbmRDbGVhciA9IGZhbHNlfSkgeworICAgIGV4cGVjdChfbGlua2VkQ3ljbGVzLCBjb250YWlucyh1bm9yZGVyZWRFcXVhbHMoZXhwZWN0ZWQpKSk7CisgICAgaWYgKGFuZENsZWFyKSB7CisgICAgICBfbGlua2VkQ3ljbGVzLmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBfYXNzZXJ0SGFzTGludFJlcG9ydGVkKExpc3Q8QW5hbHlzaXNFcnJvcj4gZXJyb3JzLCBTdHJpbmcgbmFtZSkgeworICAgIHZhciBtYXRjaGluZyA9IGVycm9ycy53aGVyZSgoZWxlbWVudCkgeworICAgICAgdmFyIGVycm9yQ29kZSA9IGVsZW1lbnQuZXJyb3JDb2RlOworICAgICAgcmV0dXJuIGVycm9yQ29kZSBpcyBMaW50Q29kZSAmJiBlcnJvckNvZGUubmFtZSA9PSBuYW1lOworICAgIH0pLnRvTGlzdCgpOworICAgIGV4cGVjdChtYXRjaGluZywgaGFzTGVuZ3RoKDEpKTsKKyAgfQorCisgIHZvaWQgX2Fzc2VydE5vTGlua2VkQ3ljbGVzKCkgeworICAgIGV4cGVjdChfbGlua2VkQ3ljbGVzLCBpc0VtcHR5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX3Jlc29sdXRpb25fdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX3Jlc29sdXRpb25fdGVzdC5kYXJ0CmluZGV4IGU0YTgzNDguLjk5ODQ2NTkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlcl9yZXNvbHV0aW9uX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfcmVzb2x1dGlvbl90ZXN0LmRhcnQKQEAgLTM2LDkgKzM2LDcgQEAKIAogZmluYWwgaXNWb2lkVHlwZSA9IFR5cGVNYXRjaGVyPFZvaWRUeXBlSW1wbD4oKTsKIAotLyoqCi0gKiBJbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgcmVzb2x1dGlvbi4KLSAqLworLy8vIEludGVncmF0aW9uIHRlc3RzIGZvciByZXNvbHV0aW9uLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBBbmFseXNpc0RyaXZlclJlc29sdXRpb25UZXN0IGV4dGVuZHMgRHJpdmVyUmVzb2x1dGlvblRlc3QKICAgICB3aXRoIEVsZW1lbnRzVHlwZXNNaXhpbiB7CkBAIC04NjEwLDkgKzg2MDgsNyBAQAogICB9CiB9CiAKLS8qKgotICogUmVzb2x1dGlvbiB0ZXN0cyB0aGF0IGFyZSBydW4gd2l0aCBhbGwgb2YgdGhlIGV4cGVyaW1lbnRzIGVuYWJsZWQuCi0gKi8KKy8vLyBSZXNvbHV0aW9uIHRlc3RzIHRoYXQgYXJlIHJ1biB3aXRoIGFsbCBvZiB0aGUgZXhwZXJpbWVudHMgZW5hYmxlZC4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgRHJpdmVyUmVzb2x1dGlvbldpdGhFeHBlcmltZW50c1Rlc3QgZXh0ZW5kcyBCYXNlQW5hbHlzaXNEcml2ZXJUZXN0IHsKICAgQG92ZXJyaWRlCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZHJpdmVyX3Rlc3QuZGFydAppbmRleCBjOWQyNmE0Li40ZTMwOTA4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9kcml2ZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL2RyaXZlcl90ZXN0LmRhcnQKQEAgLTM2LDE1ICszNiwxMiBAQAogICBkZWZpbmVSZWZsZWN0aXZlU3VpdGUoKCkgewogICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhBbmFseXNpc0RyaXZlclNjaGVkdWxlclRlc3QpOwogICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhBbmFseXNpc0RyaXZlclRlc3QpOwotICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhDYWNoZUFsbEFuYWx5c2lzRHJpdmVyVGVzdCk7CiAgIH0pOwogfQogCi0vKioKLSAqIFJldHVybnMgYSBbRnV0dXJlXSB0aGF0IGNvbXBsZXRlcyBhZnRlciBwdW1waW5nIHRoZSBldmVudCBxdWV1ZSBbdGltZXNdCi0gKiB0aW1lcy4gQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgcHVtcCB0aGUgZXZlbnQgcXVldWUgZW5vdWdoIHRpbWVzIHRvIGFsbG93Ci0gKiBhbnkgY29kZSB0byBydW4sIGFzIGxvbmcgYXMgaXQncyBub3Qgd2FpdGluZyBvbiBzb21lIGV4dGVybmFsIGV2ZW50LgotICovCisvLy8gUmV0dXJucyBhIFtGdXR1cmVdIHRoYXQgY29tcGxldGVzIGFmdGVyIHB1bXBpbmcgdGhlIGV2ZW50IHF1ZXVlIFt0aW1lc10KKy8vLyB0aW1lcy4gQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgcHVtcCB0aGUgZXZlbnQgcXVldWUgZW5vdWdoIHRpbWVzIHRvIGFsbG93CisvLy8gYW55IGNvZGUgdG8gcnVuLCBhcyBsb25nIGFzIGl0J3Mgbm90IHdhaXRpbmcgb24gc29tZSBleHRlcm5hbCBldmVudC4KIEZ1dHVyZSBwdW1wRXZlbnRRdWV1ZShbaW50IHRpbWVzID0gNTAwMF0pIHsKICAgaWYgKHRpbWVzID09IDApIHJldHVybiBGdXR1cmUudmFsdWUoKTsKICAgLy8gV2UgdXNlIGEgZGVsYXllZCBmdXR1cmUgdG8gYWxsb3cgbWljcm90YXNrIGV2ZW50cyB0byBmaW5pc2guIFRoZQpAQCAtMzE3MCw5NiArMzE2Nyw2IEBACiAgIH0KIH0KIAotQHJlZmxlY3RpdmVUZXN0Ci1jbGFzcyBDYWNoZUFsbEFuYWx5c2lzRHJpdmVyVGVzdCBleHRlbmRzIEJhc2VBbmFseXNpc0RyaXZlclRlc3QgewotICBAb3ZlcnJpZGUKLSAgYm9vbCBnZXQgZGlzYWJsZUNoYW5nZXNBbmRDYWNoZUFsbFJlc3VsdHMgPT4gdHJ1ZTsKLQotICB0ZXN0X2FkZEZpbGUoKSBhc3luYyB7Ci0gICAgdmFyIGEgPSBjb252ZXJ0UGF0aCgnL3Rlc3QvbGliL2EuZGFydCcpOwotICAgIHZhciBiID0gY29udmVydFBhdGgoJy90ZXN0L2xpYi9iLmRhcnQnKTsKLSAgICBkcml2ZXIuYWRkRmlsZShhKTsKLSAgICBkcml2ZXIuYWRkRmlsZShiKTsKLSAgfQotCi0gIHRlc3RfY2hhbmdlRmlsZSgpIGFzeW5jIHsKLSAgICB2YXIgcGF0aCA9IGNvbnZlcnRQYXRoKCcvdGVzdC5kYXJ0Jyk7Ci0gICAgZXhwZWN0KCgpIHsKLSAgICAgIGRyaXZlci5jaGFuZ2VGaWxlKHBhdGgpOwotICAgIH0sIHRocm93c1N0YXRlRXJyb3IpOwotICB9Ci0KLSAgdGVzdF9nZXRSZXN1bHRfbGlicmFyeVVuaXRzKCkgYXN5bmMgewotICAgIHZhciBsaWIgPSBjb252ZXJ0UGF0aCgnL2xpYi5kYXJ0Jyk7Ci0gICAgdmFyIHBhcnQxID0gY29udmVydFBhdGgoJy9wYXJ0MS5kYXJ0Jyk7Ci0gICAgdmFyIHBhcnQyID0gY29udmVydFBhdGgoJy9wYXJ0Mi5kYXJ0Jyk7Ci0KLSAgICBuZXdGaWxlKGxpYiwgY29udGVudDogcicnJwotbGlicmFyeSB0ZXN0OwotcGFydCAncGFydDEuZGFydCc7Ci1wYXJ0ICdwYXJ0Mi5kYXJ0JzsKLScnJyk7Ci0gICAgbmV3RmlsZShwYXJ0MSwgY29udGVudDogJ3BhcnQgb2YgdGVzdDsgY2xhc3MgQSB7fScpOwotICAgIG5ld0ZpbGUocGFydDIsIGNvbnRlbnQ6ICdwYXJ0IG9mIHRlc3Q7IGNsYXNzIEIge30nKTsKLQotICAgIGRyaXZlci5hZGRGaWxlKGxpYik7Ci0gICAgZHJpdmVyLmFkZEZpbGUocGFydDEpOwotICAgIGRyaXZlci5hZGRGaWxlKHBhcnQyKTsKLQotICAgIC8vIE5vIGFuYWx5emVkIGxpYnJhcmllcyBpbml0aWFsbHkuCi0gICAgZXhwZWN0KGRyaXZlci50ZXN0Lm51bU9mQW5hbHl6ZWRMaWJyYXJpZXMsIDApOwotCi0gICAgUmVzb2x2ZWRVbml0UmVzdWx0IGxpYlJlc3VsdCA9IGF3YWl0IGRyaXZlci5nZXRSZXN1bHQobGliKTsKLSAgICBSZXNvbHZlZFVuaXRSZXN1bHQgcGFydFJlc3VsdDEgPSBhd2FpdCBkcml2ZXIuZ2V0UmVzdWx0KHBhcnQxKTsKLSAgICBSZXNvbHZlZFVuaXRSZXN1bHQgcGFydFJlc3VsdDIgPSBhd2FpdCBkcml2ZXIuZ2V0UmVzdWx0KHBhcnQyKTsKLQotICAgIC8vIEp1c3Qgb25lIGxpYnJhcnkgd2FzIGFuYWx5emVkLCByZXN1bHRzIGZvciBwYXJ0cyBhcmUgY2FjaGVkLgotICAgIGV4cGVjdChkcml2ZXIudGVzdC5udW1PZkFuYWx5emVkTGlicmFyaWVzLCAxKTsKLQotICAgIGV4cGVjdChsaWJSZXN1bHQucGF0aCwgbGliKTsKLSAgICBleHBlY3QocGFydFJlc3VsdDEucGF0aCwgcGFydDEpOwotICAgIGV4cGVjdChwYXJ0UmVzdWx0Mi5wYXRoLCBwYXJ0Mik7Ci0KLSAgICBleHBlY3QobGliUmVzdWx0LnVuaXQsIGlzTm90TnVsbCk7Ci0gICAgZXhwZWN0KHBhcnRSZXN1bHQxLnVuaXQsIGlzTm90TnVsbCk7Ci0gICAgZXhwZWN0KHBhcnRSZXN1bHQyLnVuaXQsIGlzTm90TnVsbCk7Ci0KLSAgICAvLyBUaGUgcGFydHMgdXNlcyB0aGUgc2FtZSByZXN5bnRoZXNpemVkIGxpYnJhcnkgZWxlbWVudC4KLSAgICB2YXIgbGliTGlicmFyeSA9IGxpYlJlc3VsdC51bml0LmRlY2xhcmVkRWxlbWVudC5saWJyYXJ5OwotICAgIHZhciBwYXJ0TGlicmFyeTEgPSBwYXJ0UmVzdWx0MS51bml0LmRlY2xhcmVkRWxlbWVudC5saWJyYXJ5OwotICAgIHZhciBwYXJ0TGlicmFyeTIgPSBwYXJ0UmVzdWx0Mi51bml0LmRlY2xhcmVkRWxlbWVudC5saWJyYXJ5OwotICAgIGV4cGVjdChwYXJ0TGlicmFyeTEsIHNhbWUobGliTGlicmFyeSkpOwotICAgIGV4cGVjdChwYXJ0TGlicmFyeTIsIHNhbWUobGliTGlicmFyeSkpOwotICB9Ci0KLSAgdGVzdF9nZXRSZXN1bHRfc2luZ2xlRmlsZSgpIGFzeW5jIHsKLSAgICB2YXIgcGF0aCA9IGNvbnZlcnRQYXRoKCcvdGVzdC5kYXJ0Jyk7Ci0gICAgbmV3RmlsZShwYXRoLCBjb250ZW50OiAnbWFpbigpIHt9Jyk7Ci0gICAgZHJpdmVyLmFkZEZpbGUocGF0aCk7Ci0KLSAgICBSZXNvbHZlZFVuaXRSZXN1bHQgcmVzdWx0MSA9IGF3YWl0IGRyaXZlci5nZXRSZXN1bHQocGF0aCk7Ci0gICAgZXhwZWN0KGRyaXZlci50ZXN0Lm51bU9mQW5hbHl6ZWRMaWJyYXJpZXMsIDEpOwotICAgIHZhciB1bml0MSA9IHJlc3VsdDEudW5pdDsKLSAgICB2YXIgdW5pdEVsZW1lbnQxID0gdW5pdDEuZGVjbGFyZWRFbGVtZW50OwotICAgIGV4cGVjdChyZXN1bHQxLnBhdGgsIHBhdGgpOwotICAgIGV4cGVjdCh1bml0MSwgaXNOb3ROdWxsKTsKLSAgICBleHBlY3QodW5pdEVsZW1lbnQxLCBpc05vdE51bGwpOwotCi0gICAgUmVzb2x2ZWRVbml0UmVzdWx0IHJlc3VsdDIgPSBhd2FpdCBkcml2ZXIuZ2V0UmVzdWx0KHBhdGgpOwotICAgIGV4cGVjdChkcml2ZXIudGVzdC5udW1PZkFuYWx5emVkTGlicmFyaWVzLCAxKTsKLSAgICBleHBlY3QocmVzdWx0Mi5wYXRoLCBwYXRoKTsKLSAgICBleHBlY3QocmVzdWx0Mi51bml0LCBzYW1lKHVuaXQxKSk7Ci0gICAgZXhwZWN0KHJlc3VsdDIudW5pdC5kZWNsYXJlZEVsZW1lbnQsIHNhbWUodW5pdEVsZW1lbnQxKSk7Ci0gIH0KLQotICB0ZXN0X3JlbW92ZUZpbGUoKSBhc3luYyB7Ci0gICAgdmFyIHBhdGggPSBjb252ZXJ0UGF0aCgnL3Rlc3QuZGFydCcpOwotICAgIGV4cGVjdCgoKSB7Ci0gICAgICBkcml2ZXIucmVtb3ZlRmlsZShwYXRoKTsKLSAgICB9LCB0aHJvd3NTdGF0ZUVycm9yKTsKLSAgfQotfQotCiBjbGFzcyBfU291cmNlTW9jayBpbXBsZW1lbnRzIFNvdXJjZSB7CiAgIEBvdmVycmlkZQogICBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50c190ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9leHBlcmltZW50c190ZXN0LmRhcnQKaW5kZXggZmY0NjI3Yi4uZGVlNzMyNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHNfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzX3Rlc3QuZGFydApAQCAtNDgsNjggKzQ4LDE0NyBAQAogCiAgIHRlc3RfZnJvbVN0cmluZ3NfY29uZmxpY3RpbmdfZmxhZ3NfZGlzYWJsZV90aGVuX2VuYWJsZSgpIHsKICAgICAvLyBFbmFibGUgdGFrZXMgcHJlY2VkZW5jZSBiZWNhdXNlIGl0J3MgbGFzdAotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgZmFsc2UsICdhJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOwogICAgIGV4cGVjdChnZXRGbGFncyhmcm9tU3RyaW5ncyhbJ25vLWEnLCAnYSddKSksIFt0cnVlXSk7CiAgIH0KIAogICB0ZXN0X2Zyb21TdHJpbmdzX2NvbmZsaWN0aW5nX2ZsYWdzX2VuYWJsZV90aGVuX2Rpc2FibGUoKSB7CiAgICAgLy8gRGlzYWJsZSB0YWtlcyBwcmVjZWRlbmNlIGJlY2F1c2UgaXQncyBsYXN0Ci0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIGZhbHNlLCBmYWxzZSwgJ2EnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICAgICk7CiAgICAgZXhwZWN0KGdldEZsYWdzKGZyb21TdHJpbmdzKFsnYScsICduby1hJ10pKSwgW2ZhbHNlXSk7CiAgIH0KIAogICB0ZXN0X2Zyb21TdHJpbmdzX2RlZmF1bHRfdmFsdWVzKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgZmFsc2UsICdhJyk7Ci0gICAga25vd25GZWF0dXJlc1snYiddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgxLCAnYicsIHRydWUsIGZhbHNlLCAnYicsCi0gICAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOworICAgIGtub3duRmVhdHVyZXNbJ2InXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMSwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2InLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiB0cnVlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdiJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJywKKyAgICApOwogICAgIGV4cGVjdChnZXRGbGFncyhmcm9tU3RyaW5ncyhbXSkpLCBbZmFsc2UsIHRydWVdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfZGlzYWJsZV9kaXNhYmxlZF9mZWF0dXJlKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgZmFsc2UsICdhJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOwogICAgIGV4cGVjdChnZXRGbGFncyhmcm9tU3RyaW5ncyhbJ25vLWEnXSkpLCBbZmFsc2VdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfZGlzYWJsZV9lbmFibGVkX2ZlYXR1cmUoKSB7Ci0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIHRydWUsIGZhbHNlLCAnYScsCi0gICAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IHRydWUsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnLAorICAgICk7CiAgICAgZXhwZWN0KGdldEZsYWdzKGZyb21TdHJpbmdzKFsnbm8tYSddKSksIFtmYWxzZV0pOwogICB9CiAKICAgdGVzdF9mcm9tU3RyaW5nc19lbmFibGVfZGlzYWJsZWRfZmVhdHVyZSgpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgZmFsc2UsIGZhbHNlLCAnYScpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICBleHBlY3QoZ2V0RmxhZ3MoZnJvbVN0cmluZ3MoWydhJ10pKSwgW3RydWVdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfZW5hYmxlX2VuYWJsZWRfZmVhdHVyZSgpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgdHJ1ZSwgZmFsc2UsICdhJywKLSAgICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogdHJ1ZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcxLjAuMCcsCisgICAgKTsKICAgICBleHBlY3QoZ2V0RmxhZ3MoZnJvbVN0cmluZ3MoWydhJ10pKSwgW3RydWVdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfaWxsZWdhbF91c2Vfb2ZfZXhwaXJlZF9mbGFnX2Rpc2FibGUoKSB7CiAgICAgLy8gRXhwaXJlZCBmbGFncyBhcmUgaWdub3JlZCBldmVuIGlmIHRoZXkgd291bGQgZmFpbCB2YWxpZGF0aW9uLgotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCB0cnVlLCB0cnVlLCAnYScsCi0gICAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IHRydWUsCisgICAgICBpc0V4cGlyZWQ6IHRydWUsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcxLjAuMCcsCisgICAgKTsKICAgICBleHBlY3QoZ2V0RmxhZ3MoZnJvbVN0cmluZ3MoWyduby1hJ10pKSwgW3RydWVdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfaWxsZWdhbF91c2Vfb2ZfZXhwaXJlZF9mbGFnX2VuYWJsZSgpIHsKICAgICAvLyBFeHBpcmVkIGZsYWdzIGFyZSBpZ25vcmVkIGV2ZW4gaWYgdGhleSB3b3VsZCBmYWlsIHZhbGlkYXRpb24uCi0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIGZhbHNlLCB0cnVlLCAnYScpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogdHJ1ZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOwogICAgIGV4cGVjdChnZXRGbGFncyhmcm9tU3RyaW5ncyhbJ2EnXSkpLCBbZmFsc2VdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfdW5uZWNlc3NhcnlfdXNlX29mX2V4cGlyZWRfZmxhZ19kaXNhYmxlKCkgewogICAgIC8vIEV4cGlyZWQgZmxhZ3MgYXJlIGlnbm9yZWQuCi0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIGZhbHNlLCB0cnVlLCAnYScpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogdHJ1ZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOwogICAgIGV4cGVjdChnZXRGbGFncyhmcm9tU3RyaW5ncyhbJ25vLWEnXSkpLCBbZmFsc2VdKTsKICAgfQogCiAgIHRlc3RfZnJvbVN0cmluZ3NfdW5uZWNlc3NhcnlfdXNlX29mX2V4cGlyZWRfZmxhZ19lbmFibGUoKSB7CiAgICAgLy8gRXhwaXJlZCBmbGFncyBhcmUgaWdub3JlZC4KLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgdHJ1ZSwgdHJ1ZSwgJ2EnLAotICAgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcxLjAuMCcpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiB0cnVlLAorICAgICAgaXNFeHBpcmVkOiB0cnVlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnLAorICAgICk7CiAgICAgZXhwZWN0KGdldEZsYWdzKGZyb21TdHJpbmdzKFsnYSddKSksIFt0cnVlXSk7CiAgIH0KIApAQCAtMTE5LDkgKzE5OCwzMCBAQAogICB9CiAKICAgdGVzdF92YWxpZGF0ZUZsYWdDb21iaW5hdGlvbl9kaXNhYmxlX3RoZW5fZW5hYmxlKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgZmFsc2UsICdhJyk7Ci0gICAga25vd25GZWF0dXJlc1snYiddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgxLCAnYicsIGZhbHNlLCBmYWxzZSwgJ2InKTsKLSAgICBrbm93bkZlYXR1cmVzWydjJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDIsICdjJywgZmFsc2UsIGZhbHNlLCAnYycpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKKyAgICBrbm93bkZlYXR1cmVzWydiJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDEsCisgICAgICBlbmFibGVTdHJpbmc6ICdiJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2InLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICAgICk7CisgICAga25vd25GZWF0dXJlc1snYyddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAyLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYycsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdjJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOwogICAgIHZhciB2YWxpZGF0aW9uUmVzdWx0ID0KICAgICAgICAgZ2V0VmFsaWRhdGVDb21iaW5hdGlvblJlc3VsdChbJ2EnLCAnbm8tYyddLCBbJ25vLWInLCAnYyddKTsKICAgICBleHBlY3QodmFsaWRhdGlvblJlc3VsdCwgaGFzTGVuZ3RoKDEpKTsKQEAgLTEzMSw5ICsyMzEsMzAgQEAKICAgfQogCiAgIHRlc3RfdmFsaWRhdGVGbGFnQ29tYmluYXRpb25fZW5hYmxlX3RoZW5fZGlzYWJsZSgpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgZmFsc2UsIGZhbHNlLCAnYScpOwotICAgIGtub3duRmVhdHVyZXNbJ2InXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMSwgJ2InLCBmYWxzZSwgZmFsc2UsICdiJyk7Ci0gICAga25vd25GZWF0dXJlc1snYyddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgyLCAnYycsIGZhbHNlLCBmYWxzZSwgJ2MnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICAgICk7CisgICAga25vd25GZWF0dXJlc1snYiddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAxLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYicsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdiJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOworICAgIGtub3duRmVhdHVyZXNbJ2MnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMiwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2MnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYycsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9CiAgICAgICAgIGdldFZhbGlkYXRlQ29tYmluYXRpb25SZXN1bHQoWydhJywgJ2MnXSwgWyduby1iJywgJ25vLWMnXSk7CiAgICAgZXhwZWN0KHZhbGlkYXRpb25SZXN1bHQsIGhhc0xlbmd0aCgxKSk7CkBAIC0xNDMsMTQgKzI2NCw0MiBAQAogICB9CiAKICAgdGVzdF92YWxpZGF0ZUZsYWdDb21iaW5hdGlvbl9vaygpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgZmFsc2UsIGZhbHNlLCAnYScpOwotICAgIGtub3duRmVhdHVyZXNbJ2InXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMSwgJ2InLCBmYWxzZSwgZmFsc2UsICdiJyk7Ci0gICAga25vd25GZWF0dXJlc1snYyddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgyLCAnYycsIGZhbHNlLCBmYWxzZSwgJ2MnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICAgICk7CisgICAga25vd25GZWF0dXJlc1snYiddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAxLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYicsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGZhbHNlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdiJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICApOworICAgIGtub3duRmVhdHVyZXNbJ2MnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMiwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2MnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYycsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICBleHBlY3QoZ2V0VmFsaWRhdGVDb21iaW5hdGlvblJlc3VsdChbJ2EnLCAnYyddLCBbJ25vLWInLCAnYyddKSwgaXNFbXB0eSk7CiAgIH0KIAogICB0ZXN0X3ZhbGlkYXRlRmxhZ3NfY29uZmxpY3RpbmdfZmxhZ3NfZGlzYWJsZV90aGVuX2VuYWJsZSgpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgZmFsc2UsIGZhbHNlLCAnYScpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IGdldFZhbGlkYXRpb25SZXN1bHQoWyduby1hJywgJ2EnXSk7CiAgICAgZXhwZWN0KHZhbGlkYXRpb25SZXN1bHQsIGhhc0xlbmd0aCgxKSk7CiAgICAgdmFyIGVycm9yID0gdmFsaWRhdGlvblJlc3VsdFswXSBhcyBDb25mbGljdGluZ0ZsYWdzOwpAQCAtMTYzLDcgKzMxMiwxNCBAQAogICB9CiAKICAgdGVzdF92YWxpZGF0ZUZsYWdzX2NvbmZsaWN0aW5nX2ZsYWdzX2VuYWJsZV90aGVuX2Rpc2FibGUoKSB7Ci0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIGZhbHNlLCBmYWxzZSwgJ2EnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IGZhbHNlLAorICAgICAgZG9jdW1lbnRhdGlvbjogJ2EnLAorICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLAorICAgICk7CiAgICAgdmFyIHZhbGlkYXRpb25SZXN1bHQgPSBnZXRWYWxpZGF0aW9uUmVzdWx0KFsnYScsICduby1hJ10pOwogICAgIGV4cGVjdCh2YWxpZGF0aW9uUmVzdWx0LCBoYXNMZW5ndGgoMSkpOwogICAgIHZhciBlcnJvciA9IHZhbGlkYXRpb25SZXN1bHRbMF0gYXMgQ29uZmxpY3RpbmdGbGFnczsKQEAgLTE3NiwxOSArMzMyLDM4IEBACiAgIH0KIAogICB0ZXN0X3ZhbGlkYXRlRmxhZ3NfaWdub3JlX3JlZHVuZGFudF9kaXNhYmxlX2ZsYWdzKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCB0cnVlLCBmYWxzZSwgJ2EnLAotICAgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcxLjAuMCcpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiB0cnVlLAorICAgICAgaXNFeHBpcmVkOiBmYWxzZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJywKKyAgICApOwogICAgIGV4cGVjdChnZXRWYWxpZGF0aW9uUmVzdWx0KFsnbm8tYScsICduby1hJ10pLCBpc0VtcHR5KTsKICAgfQogCiAgIHRlc3RfdmFsaWRhdGVGbGFnc19pZ25vcmVfcmVkdW5kYW50X2VuYWJsZV9mbGFncygpIHsKLSAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKDAsICdhJywgZmFsc2UsIGZhbHNlLCAnYScpOworICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICBpbmRleDogMCwKKyAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICBleHBlY3QoZ2V0VmFsaWRhdGlvblJlc3VsdChbJ2EnLCAnYSddKSwgaXNFbXB0eSk7CiAgIH0KIAogICB0ZXN0X3ZhbGlkYXRlRmxhZ3NfaWxsZWdhbF91c2Vfb2ZfZXhwaXJlZF9mbGFnX2Rpc2FibGUoKSB7Ci0gICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgwLCAnYScsIHRydWUsIHRydWUsICdhJywKLSAgICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogdHJ1ZSwKKyAgICAgIGlzRXhwaXJlZDogdHJ1ZSwKKyAgICAgIGRvY3VtZW50YXRpb246ICdhJywKKyAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJywKKyAgICApOwogICAgIHZhciB2YWxpZGF0aW9uUmVzdWx0ID0gZ2V0VmFsaWRhdGlvblJlc3VsdChbJ25vLWEnXSk7CiAgICAgZXhwZWN0KHZhbGlkYXRpb25SZXN1bHQsIGhhc0xlbmd0aCgxKSk7CiAgICAgdmFyIGVycm9yID0gdmFsaWRhdGlvblJlc3VsdFswXSBhcyBJbGxlZ2FsVXNlT2ZFeHBpcmVkRmxhZzsKQEAgLTE5OSw3ICszNzQsMTQgQEAKICAgfQogCiAgIHRlc3RfdmFsaWRhdGVGbGFnc19pbGxlZ2FsX3VzZV9vZl9leHBpcmVkX2ZsYWdfZW5hYmxlKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgdHJ1ZSwgJ2EnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IHRydWUsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IGdldFZhbGlkYXRpb25SZXN1bHQoWydhJ10pOwogICAgIGV4cGVjdCh2YWxpZGF0aW9uUmVzdWx0LCBoYXNMZW5ndGgoMSkpOwogICAgIHZhciBlcnJvciA9IHZhbGlkYXRpb25SZXN1bHRbMF0gYXMgSWxsZWdhbFVzZU9mRXhwaXJlZEZsYWc7CkBAIC0yMTAsNyArMzkyLDE0IEBACiAgIH0KIAogICB0ZXN0X3ZhbGlkYXRlRmxhZ3NfdW5uZWNlc3NhcnlfdXNlX29mX2V4cGlyZWRfZmxhZ19kaXNhYmxlKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgdHJ1ZSwgJ2EnKTsKKyAgICBrbm93bkZlYXR1cmVzWydhJ10gPSBFeHBlcmltZW50YWxGZWF0dXJlKAorICAgICAgaW5kZXg6IDAsCisgICAgICBlbmFibGVTdHJpbmc6ICdhJywKKyAgICAgIGlzRW5hYmxlZEJ5RGVmYXVsdDogZmFsc2UsCisgICAgICBpc0V4cGlyZWQ6IHRydWUsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgKTsKICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IGdldFZhbGlkYXRpb25SZXN1bHQoWyduby1hJ10pOwogICAgIGV4cGVjdCh2YWxpZGF0aW9uUmVzdWx0LCBoYXNMZW5ndGgoMSkpOwogICAgIHZhciBlcnJvciA9IHZhbGlkYXRpb25SZXN1bHRbMF0gYXMgVW5uZWNlc3NhcnlVc2VPZkV4cGlyZWRGbGFnOwpAQCAtMjIxLDggKzQxMCwxNCBAQAogICB9CiAKICAgdGVzdF92YWxpZGF0ZUZsYWdzX3VubmVjZXNzYXJ5X3VzZV9vZl9leHBpcmVkX2ZsYWdfZW5hYmxlKCkgewotICAgIGtub3duRmVhdHVyZXNbJ2EnXSA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCB0cnVlLCB0cnVlLCAnYScsCi0gICAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogJzEuMC4wJyk7CisgICAga25vd25GZWF0dXJlc1snYSddID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKKyAgICAgIGluZGV4OiAwLAorICAgICAgZW5hYmxlU3RyaW5nOiAnYScsCisgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IHRydWUsCisgICAgICBpc0V4cGlyZWQ6IHRydWUsCisgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246ICcxLjAuMCcsCisgICAgKTsKICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IGdldFZhbGlkYXRpb25SZXN1bHQoWydhJ10pOwogICAgIGV4cGVjdCh2YWxpZGF0aW9uUmVzdWx0LCBoYXNMZW5ndGgoMSkpOwogICAgIHZhciBlcnJvciA9IHZhbGlkYXRpb25SZXN1bHRbMF0gYXMgVW5uZWNlc3NhcnlVc2VPZkV4cGlyZWRGbGFnOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvaW5kZXhfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvaW5kZXhfdGVzdC5kYXJ0CmluZGV4IGZjNjBmZjBkLi42ZjMxNjgzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9pbmRleF90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvaW5kZXhfdGVzdC5kYXJ0CkBAIC05MTEsMTMgKzkxMSwxMSBAQAogICAgIGFzc2VydFRoYXQoZWxlbWVudCkuLmlzUmVmZXJlbmNlZEF0KCdBIHApIHsnLCBmYWxzZSk7CiAgIH0KIAotICAvKioKLSAgICogVGhlcmUgd2FzIGEgYnVnIGluIHRoZSBBU1Qgc3RydWN0dXJlLCB3aGVuIHNpbmdsZSBbQ29tbWVudF0gd2FzIGNsb25lZCBhbmQKLSAgICogYXNzaWduZWQgdG8gYm90aCBbRmllbGREZWNsYXJhdGlvbl0gYW5kIFtWYXJpYWJsZURlY2xhcmF0aW9uXS4KLSAgICoKLSAgICogVGhpcyBjYXVzZWQgZHVwbGljYXRlIGluZGV4aW5nLgotICAgKiBIZXJlIHdlIHRlc3QgdGhhdCB0aGUgcHJvYmxlbSBpcyBmaXhlZCBvbmUgd2F5IG9yIGFub3RoZXIuCi0gICAqLworICAvLy8gVGhlcmUgd2FzIGEgYnVnIGluIHRoZSBBU1Qgc3RydWN0dXJlLCB3aGVuIHNpbmdsZSBbQ29tbWVudF0gd2FzIGNsb25lZCBhbmQKKyAgLy8vIGFzc2lnbmVkIHRvIGJvdGggW0ZpZWxkRGVjbGFyYXRpb25dIGFuZCBbVmFyaWFibGVEZWNsYXJhdGlvbl0uCisgIC8vLworICAvLy8gVGhpcyBjYXVzZWQgZHVwbGljYXRlIGluZGV4aW5nLgorICAvLy8gSGVyZSB3ZSB0ZXN0IHRoYXQgdGhlIHByb2JsZW0gaXMgZml4ZWQgb25lIHdheSBvciBhbm90aGVyLgogICB0ZXN0X2lzUmVmZXJlbmNlZEJ5X2lkZW50aWZpZXJJbkNvbW1lbnQoKSBhc3luYyB7CiAgICAgYXdhaXQgX2luZGV4VGVzdFVuaXQoJycnCiBjbGFzcyBBIHt9CkBAIC0xNDA5LDkgKzE0MDcsNyBAQAogICAgICAgLi5pc1VzZWQoJ3goKTsnLCBJbmRleFJlbGF0aW9uS2luZC5JU19JTlZPS0VEX0JZKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgW2luZGV4XSBoYXMgYW4gaXRlbSB3aXRoIHRoZSBleHBlY3RlZCBwcm9wZXJ0aWVzLgotICAgKi8KKyAgLy8vIEFzc2VydHMgdGhhdCBbaW5kZXhdIGhhcyBhbiBpdGVtIHdpdGggdGhlIGV4cGVjdGVkIHByb3BlcnRpZXMuCiAgIHZvaWQgX2Fzc2VydEhhc1JlbGF0aW9uKAogICAgICAgRWxlbWVudCBlbGVtZW50LAogICAgICAgTGlzdDxfUmVsYXRpb24+IHJlbGF0aW9ucywKQEAgLTE0NzQsOSArMTQ3MCw3IEBACiAgICAgZmFpbCgnJG1zZyBpblxuJyArIHBhY2thZ2VJbmRleEpzb25TdHJpbmcpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgW2VsZW1lbnRdIGlkZW50aWZpZXIgaW4gW2luZGV4XSBvciBmYWlsLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgW2VsZW1lbnRdIGlkZW50aWZpZXIgaW4gW2luZGV4XSBvciBmYWlsLgogICBpbnQgX2ZpbmRFbGVtZW50SWQoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgdmFyIHVuaXRJZCA9IF9nZXRVbml0SWQoZWxlbWVudCk7CiAKQEAgLTE1MDYsOSArMTUwMCw3IEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIGFsbCByZWxhdGlvbnMgd2l0aCBbZWxlbWVudF0gaW4gW2luZGV4XS4KLSAgICovCisgIC8vLyBSZXR1cm4gYWxsIHJlbGF0aW9ucyB3aXRoIFtlbGVtZW50XSBpbiBbaW5kZXhdLgogICBMaXN0PF9SZWxhdGlvbj4gX2dldEVsZW1lbnRSZWxhdGlvbnMoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgaW50IGVsZW1lbnRJZCA9IF9maW5kRWxlbWVudElkKGVsZW1lbnQpOwogICAgIExpc3Q8X1JlbGF0aW9uPiByZWxhdGlvbnMgPSA8X1JlbGF0aW9uPltdOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvc2VhcmNoX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL3NlYXJjaF90ZXN0LmRhcnQKaW5kZXggZWM3ZmU5Zi4uY2UxZGQxOCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvc2VhcmNoX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy9zZWFyY2hfdGVzdC5kYXJ0CkBAIC0xNzUyLDE4ICsxNzUyLDE0IEBACiAgICAgICAgIGlzUmVzb2x2ZWQ6IGlzUmVzb2x2ZWQsIGlzUXVhbGlmaWVkOiBpc1F1YWxpZmllZCk7CiAgIH0KIAotICAvKioKLSAgICogQ3JlYXRlIFtFeHBlY3RlZFJlc3VsdF0gZm9yIGEgcXVhbGlmaWVkIGFuZCByZXNvbHZlZCBtYXRjaC4KLSAgICovCisgIC8vLyBDcmVhdGUgW0V4cGVjdGVkUmVzdWx0XSBmb3IgYSBxdWFsaWZpZWQgYW5kIHJlc29sdmVkIG1hdGNoLgogICBFeHBlY3RlZFJlc3VsdCBfZXhwZWN0SWRRKAogICAgICAgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXN1bHRLaW5kIGtpbmQsIFN0cmluZyBzZWFyY2gsCiAgICAgICB7aW50IGxlbmd0aCwgYm9vbCBpc1Jlc29sdmVkID0gdHJ1ZX0pIHsKICAgICByZXR1cm4gX2V4cGVjdElkKGVsZW1lbnQsIGtpbmQsIHNlYXJjaCwgaXNRdWFsaWZpZWQ6IHRydWUsIGxlbmd0aDogbGVuZ3RoKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgW0V4cGVjdGVkUmVzdWx0XSBmb3IgYSBxdWFsaWZpZWQgYW5kIHVucmVzb2x2ZWQgbWF0Y2guCi0gICAqLworICAvLy8gQ3JlYXRlIFtFeHBlY3RlZFJlc3VsdF0gZm9yIGEgcXVhbGlmaWVkIGFuZCB1bnJlc29sdmVkIG1hdGNoLgogICBFeHBlY3RlZFJlc3VsdCBfZXhwZWN0SWRRVSgKICAgICAgIEVsZW1lbnQgZWxlbWVudCwgU2VhcmNoUmVzdWx0S2luZCBraW5kLCBTdHJpbmcgc2VhcmNoLAogICAgICAge2ludCBsZW5ndGh9KSB7CkBAIC0xNzcxLDkgKzE3NjcsNyBAQAogICAgICAgICBpc1F1YWxpZmllZDogdHJ1ZSwgaXNSZXNvbHZlZDogZmFsc2UsIGxlbmd0aDogbGVuZ3RoKTsKICAgfQogCi0gIC8qKgotICAgKiBDcmVhdGUgW0V4cGVjdGVkUmVzdWx0XSBmb3IgYSB1bnF1YWxpZmllZCBhbmQgdW5yZXNvbHZlZCBtYXRjaC4KLSAgICovCisgIC8vLyBDcmVhdGUgW0V4cGVjdGVkUmVzdWx0XSBmb3IgYSB1bnF1YWxpZmllZCBhbmQgdW5yZXNvbHZlZCBtYXRjaC4KICAgRXhwZWN0ZWRSZXN1bHQgX2V4cGVjdElkVSgKICAgICAgIEVsZW1lbnQgZWxlbWVudCwgU2VhcmNoUmVzdWx0S2luZCBraW5kLCBTdHJpbmcgc2VhcmNoLAogICAgICAge2ludCBsZW5ndGh9KSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy90ZXN0X2FsbC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYW5hbHlzaXMvdGVzdF9hbGwuZGFydAppbmRleCBiNGYwMWVjLi5mYmJkOGQ1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hbmFseXNpcy90ZXN0X2FsbC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FuYWx5c2lzL3Rlc3RfYWxsLmRhcnQKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCAnY3JjMzJfdGVzdC5kYXJ0JyBhcyBjcmMzMl90ZXN0OwogaW1wb3J0ICdkZWZpbmVkX25hbWVzX3Rlc3QuZGFydCcgYXMgZGVmaW5lZF9uYW1lczsKIGltcG9ydCAnZGVwZW5kZW5jeS90ZXN0X2FsbC5kYXJ0JyBhcyBkZXBlbmRlbmN5X3Rlc3Q7CitpbXBvcnQgJ2RyaXZlcl9jYWNoaW5nX3Rlc3QuZGFydCcgYXMgZHJpdmVyX2NhY2hpbmc7CiBpbXBvcnQgJ2RyaXZlcl9yZXNvbHV0aW9uX3Rlc3QuZGFydCcgYXMgZHJpdmVyX3Jlc29sdXRpb247CiBpbXBvcnQgJ2RyaXZlcl90ZXN0LmRhcnQnIGFzIGRyaXZlcjsKIGltcG9ydCAnZXhwZXJpbWVudHNfdGVzdC5kYXJ0JyBhcyBleHBlcmltZW50c190ZXN0OwpAQCAtNDIsNiArNDMsNyBAQAogICAgIGRlZmluZWRfbmFtZXMubWFpbigpOwogICAgIGRlcGVuZGVuY3lfdGVzdC5tYWluKCk7CiAgICAgZHJpdmVyLm1haW4oKTsKKyAgICBkcml2ZXJfY2FjaGluZy5tYWluKCk7CiAgICAgZHJpdmVyX3Jlc29sdXRpb24ubWFpbigpOwogICAgIGV4cGVyaW1lbnRzX3Rlc3QubWFpbigpOwogICAgIGZlYXR1cmVfc2V0X3Byb3ZpZGVyLm1haW4oKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FzdC90b19zb3VyY2VfdmlzaXRvcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9hc3QvdG9fc291cmNlX3Zpc2l0b3JfdGVzdC5kYXJ0CmluZGV4IDMxMWFlZDguLjgyMDdmNGUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2FzdC90b19zb3VyY2VfdmlzaXRvcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvYXN0L3RvX3NvdXJjZV92aXNpdG9yX3Rlc3QuZGFydApAQCAtMjgzNCwxMCArMjgzNCw4IEBACiAgICAgICAgIEFzdFRlc3RGYWN0b3J5LnlpZWxkRWFjaFN0YXRlbWVudChBc3RUZXN0RmFjdG9yeS5pZGVudGlmaWVyMygiZSIpKSk7CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgYSBgVG9Tb3VyY2VWaXNpdG9yMmAgd2lsbCBwcm9kdWNlIHRoZSBbZXhwZWN0ZWRTb3VyY2VdIHdoZW4KLSAgICogdmlzaXRpbmcgdGhlIGdpdmVuIFtub2RlXS4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCBhIGBUb1NvdXJjZVZpc2l0b3IyYCB3aWxsIHByb2R1Y2UgdGhlIFtleHBlY3RlZFNvdXJjZV0gd2hlbgorICAvLy8gdmlzaXRpbmcgdGhlIGdpdmVuIFtub2RlXS4KICAgdm9pZCBfYXNzZXJ0U291cmNlKFN0cmluZyBleHBlY3RlZFNvdXJjZSwgQXN0Tm9kZSBub2RlKSB7CiAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IFN0cmluZ0J1ZmZlcigpOwogICAgIG5vZGUuYWNjZXB0KFRvU291cmNlVmlzaXRvcihidWZmZXIpKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2NvbnN0YW50L3V0aWxpdGllc190ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9jb25zdGFudC91dGlsaXRpZXNfdGVzdC5kYXJ0CmluZGV4IDMwZTA0Y2EuLmNjODE5OWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2NvbnN0YW50L3V0aWxpdGllc190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvY29uc3RhbnQvdXRpbGl0aWVzX3Rlc3QuZGFydApAQCAtNDAsMTAgKzQwLDggQEAKICAgICBfc291cmNlID0gVGVzdFNvdXJjZSgpOwogICB9CiAKLSAgLyoqCi0gICAqIFRlc3QgYW4gYW5ub3RhdGlvbiB0aGF0IGNvbnNpc3RzIHNvbGVseSBvZiBhbiBpZGVudGlmaWVyIChhbmQgaGVuY2UKLSAgICogcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZSkuCi0gICAqLworICAvLy8gVGVzdCBhbiBhbm5vdGF0aW9uIHRoYXQgY29uc2lzdHMgc29sZWx5IG9mIGFuIGlkZW50aWZpZXIgKGFuZCBoZW5jZQorICAvLy8gcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB2YXJpYWJsZSkuCiAgIHZvaWQgdGVzdF92aXNpdEFubm90YXRpb25fY29uc3RhbnRWYXJpYWJsZSgpIHsKICAgICBDb21waWxhdGlvblVuaXRFbGVtZW50IGNvbXBpbGF0aW9uVW5pdEVsZW1lbnQgPQogICAgICAgICBFbGVtZW50RmFjdG9yeS5jb21waWxhdGlvblVuaXQoJy90ZXN0LmRhcnQnLCBfc291cmNlKS4uc291cmNlID0gX3NvdXJjZTsKQEAgLTY2LDEwICs2NCw4IEBACiAgICAgZXhwZWN0KF9maW5kQ29uc3RhbnRzKCksIGlzRW1wdHkpOwogICB9CiAKLSAgLyoqCi0gICAqIFRlc3QgYW4gYW5ub3RhdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGludm9jYXRpb24gb2YgYSBjb25zdGFudAotICAgKiBjb25zdHJ1Y3Rvci4KLSAgICovCisgIC8vLyBUZXN0IGFuIGFubm90YXRpb24gdGhhdCByZXByZXNlbnRzIHRoZSBpbnZvY2F0aW9uIG9mIGEgY29uc3RhbnQKKyAgLy8vIGNvbnN0cnVjdG9yLgogICB2b2lkIHRlc3RfdmlzaXRBbm5vdGF0aW9uX2ludm9jYXRpb24oKSB7CiAgICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBjb21waWxhdGlvblVuaXRFbGVtZW50ID0KICAgICAgICAgRWxlbWVudEZhY3RvcnkuY29tcGlsYXRpb25Vbml0KCcvdGVzdC5kYXJ0JywgX3NvdXJjZSkuLnNvdXJjZSA9IF9zb3VyY2U7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9jb25zdGFudC92YWx1ZV90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9jb25zdGFudC92YWx1ZV90ZXN0LmRhcnQKaW5kZXggM2I5MDYwNC4uN2MzYWUxYSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvY29uc3RhbnQvdmFsdWVfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2NvbnN0YW50L3ZhbHVlX3Rlc3QuZGFydApAQCAtNSw4ICs1LDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvbnVsbGFiaWxpdHlfc3VmZml4LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvZWxlbWVudC90eXBlX3Byb3ZpZGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKQEAgLTE1NzUsMTEgKzE1NzUsOSBAQAogICAgIF9hc3NlcnRUaW1lcyhfaW50VmFsdWUobnVsbCksIF9pbnRWYWx1ZShudWxsKSwgX2ludFZhbHVlKDMpKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQotICAgKiBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQKLSAgICogdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMgdGhlCisgIC8vLyBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0QWRkKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE1OTMsMTAgKzE1OTEsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgYml0LW5vdCBvZiB0aGUgW29wZXJhbmRdIGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0Ci0gICAqIHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSBiaXQtbm90IG9mIHRoZSBbb3BlcmFuZF0gaXMgdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQKKyAgLy8vIHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRCaXROb3QoRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIG9wZXJhbmQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewogICAgICAgZXhwZWN0KCgpIHsKQEAgLTE2MDksMTEgKzE2MDUsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcwotICAgKiB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi0gICAqIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcworICAvLy8gdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRDb25jYXRlbmF0ZSgKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xNjI3LDExICsxNjIxLDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQotICAgKiBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQKLSAgICogdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcyB0aGUKKyAgLy8vIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnREaXZpZGUoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTY0NSwxMSArMTYzNyw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgYml0LWFuZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQotICAgKiBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQKLSAgICogdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgYml0LWFuZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzCisgIC8vLyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydEVhZ2VyQW5kKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE2NjMsMTEgKzE2NTMsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGJpdC1vcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQotICAgKiBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQKLSAgICogdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgYml0LW9yaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMgdGhlCisgIC8vLyBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0RWFnZXJPcigKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xNjgxLDExICsxNjY5LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBiaXQteG9yaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMgdGhlCi0gICAqIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZAotICAgKiB2YWx1ZSBpcyBgbnVsbGAuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBiaXQteG9yaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMKKyAgLy8vIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0RWFnZXJYb3IoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTY5OSwxMSArMTY4NSw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgZm9yCi0gICAqIGVxdWFsaXR5IGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbgotICAgKiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgZm9yCisgIC8vLyBlcXVhbGl0eSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbgorICAvLy8gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydEVxdWFsRXF1YWwoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTcxNywxMSArMTcwMSw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMgdGhlCi0gICAqIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZAotICAgKiB2YWx1ZSBpcyBgbnVsbGAuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcyB0aGUKKyAgLy8vIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRHcmVhdGVyVGhhbigKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xNzM1LDExICsxNzE3LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcyB0aGUKLSAgICogW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkCi0gICAqIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQorICAvLy8gW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydEdyZWF0ZXJUaGFuT3JFcXVhbCgKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xNzUzLDEwICsxNzMzLDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyB1c2luZwotICAgKiBpZGVudGljYWwoKSBpcyB0aGUgZXhwZWN0ZWQgdmFsdWUuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyB1c2luZworICAvLy8gaWRlbnRpY2FsKCkgaXMgdGhlIGV4cGVjdGVkIHZhbHVlLgogICB2b2lkIF9hc3NlcnRJZGVudGljYWwoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBEYXJ0T2JqZWN0SW1wbCByZXN1bHQgPSBsZWZ0LmlzSWRlbnRpY2FsMihfdHlwZVN5c3RlbSwgcmlnaHQpOwpAQCAtMTc2OCwxMSArMTc0Niw5IEBACiAgICAgLy8gVE9ETyhzY2hlZ2xvdikgaW1wbGVtZW50CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGFzCi0gICAqIGludGVnZXJzIGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbgotICAgKiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBhcworICAvLy8gaW50ZWdlcnMgaXMgdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4KKyAgLy8vIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRJbnRlZ2VyRGl2aWRlKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE3ODYsMTEgKzE3NjIsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGxvZ2ljYWwtYW5kaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMKLSAgICogdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQotICAgKiBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBsb2dpY2FsLWFuZGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzCisgIC8vLyBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydExhenlBbmQoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTgwNCwxMSArMTc3OCw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgbG9naWNhbC1vcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzCi0gICAqIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLSAgICogZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgbG9naWNhbC1vcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzCisgIC8vLyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydExhenlPcigKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xODIyLDExICsxNzk0LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcyB0aGUKLSAgICogW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkCi0gICAqIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQorICAvLy8gW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydExlc3NUaGFuKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE4NDAsMTEgKzE4MTAsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzIHRoZQotICAgKiBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQKLSAgICogdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMgdGhlCisgIC8vLyBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0TGVzc1RoYW5PckVxdWFsKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE4NTgsMTAgKzE4MjYsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgbG9naWNhbC1ub3Qgb2YgdGhlIFtvcGVyYW5kXSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IKLSAgICogdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgbG9naWNhbC1ub3Qgb2YgdGhlIFtvcGVyYW5kXSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IKKyAgLy8vIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydExvZ2ljYWxOb3QoRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIG9wZXJhbmQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewogICAgICAgZXhwZWN0KCgpIHsKQEAgLTE4NzQsMTEgKzE4NDAsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMKLSAgICogdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQotICAgKiBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzCisgIC8vLyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydE1pbnVzKAogICAgICAgRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIGxlZnQsIERhcnRPYmplY3RJbXBsIHJpZ2h0KSB7CiAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKQEAgLTE4OTIsMTAgKzE4NTYsOCBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgbmVnYXRpb24gb2YgdGhlIFtvcGVyYW5kXSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdAotICAgKiB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgbmVnYXRpb24gb2YgdGhlIFtvcGVyYW5kXSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdAorICAvLy8gdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydE5lZ2F0ZWQoRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIG9wZXJhbmQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewogICAgICAgZXhwZWN0KCgpIHsKQEAgLTE5MDgsMTEgKzE4NzAsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGZvcgotICAgKiBpbmVxdWFsaXR5IGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuCi0gICAqIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgZm9yCisgIC8vLyBpbmVxdWFsaXR5IGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuCisgIC8vLyBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0Tm90RXF1YWwoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTkyNiwxMCArMTg4Niw4IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IGNvbnZlcnRpbmcgdGhlIFtvcGVyYW5kXSB0byBhIHN0cmluZyBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwKLSAgICogb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCBjb252ZXJ0aW5nIHRoZSBbb3BlcmFuZF0gdG8gYSBzdHJpbmcgaXMgdGhlIFtleHBlY3RlZF0gdmFsdWUsCisgIC8vLyBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRQZXJmb3JtVG9TdHJpbmcoRGFydE9iamVjdEltcGwgZXhwZWN0ZWQsIERhcnRPYmplY3RJbXBsIG9wZXJhbmQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewogICAgICAgZXhwZWN0KCgpIHsKQEAgLTE5NDIsMTEgKzE5MDAsOSBAQAogICAgIH0KICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIHRha2luZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0KLSAgICogb3BlcmFuZHMgaXMgdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAqIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiB0YWtpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdCisgIC8vLyBvcGVyYW5kcyBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbgorICAvLy8gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydFJlbWFpbmRlcigKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xOTYwLDExICsxOTE2LDkgQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0aGUgW2xlZnRdIGFuZCBbcmlnaHRdIG9wZXJhbmRzIGlzCi0gICAqIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKLSAgICogZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcworICAvLy8gdGhlIFtleHBlY3RlZF0gdmFsdWUsIG9yIHRoYXQgdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZQorICAvLy8gZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgogICB2b2lkIF9hc3NlcnRTaGlmdExlZnQoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpAQCAtMTk3OCwxMSArMTkzMiw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcwotICAgKiB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi0gICAqIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMKKyAgLy8vIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0U2hpZnRSaWdodCgKICAgICAgIERhcnRPYmplY3RJbXBsIGV4cGVjdGVkLCBEYXJ0T2JqZWN0SW1wbCBsZWZ0LCBEYXJ0T2JqZWN0SW1wbCByaWdodCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CkBAIC0xOTk2LDEwICsxOTQ4LDggQEAKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgW29wZXJhbmRdIGlzIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0Ci0gICAqIHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYG51bGxgLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIFtvcGVyYW5kXSBpcyB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdAorICAvLy8gdGhlIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBgbnVsbGAuCiAgIHZvaWQgX2Fzc2VydFN0cmluZ0xlbmd0aChEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgb3BlcmFuZCkgewogICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7CiAgICAgICBleHBlY3QoKCkgewpAQCAtMjAxMiwxMSArMTk2Miw5IEBACiAgICAgfQogICB9CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIFtsZWZ0XSBhbmQgW3JpZ2h0XSBvcGVyYW5kcyBpcwotICAgKiB0aGUgW2V4cGVjdGVkXSB2YWx1ZSwgb3IgdGhhdCB0aGUgb3BlcmF0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlCi0gICAqIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KLSAgICovCisgIC8vLyBBc3NlcnQgdGhhdCB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBbbGVmdF0gYW5kIFtyaWdodF0gb3BlcmFuZHMgaXMKKyAgLy8vIHRoZSBbZXhwZWN0ZWRdIHZhbHVlLCBvciB0aGF0IHRoZSBvcGVyYXRpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGV4cGVjdGVkIHZhbHVlIGlzIGBudWxsYC4KICAgdm9pZCBfYXNzZXJ0VGltZXMoCiAgICAgICBEYXJ0T2JqZWN0SW1wbCBleHBlY3RlZCwgRGFydE9iamVjdEltcGwgbGVmdCwgRGFydE9iamVjdEltcGwgcmlnaHQpIHsKICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50X3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvZWxlbWVudF90ZXN0LmRhcnQKaW5kZXggMDZlNGJiNi4uZTRkMGFjNCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50X3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnRfdGVzdC5kYXJ0CkBAIC0xMCwxMCArMTAsMTAgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZV9wcm92aWRlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L2VsZW1lbnQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydCcgc2hvdyBBbmFseXNpc0NvbnRleHQ7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2VsZW1lbnRfZmFjdG9yeS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvdGVzdF90eXBlX3Byb3ZpZGVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApAQCAtOTgyLDkgKzk4Miw3IEBACiAgICAgZXhwZWN0KGxvY2F0aW9uLmVuY29kaW5nLCBlbmNvZGluZyk7CiAgIH0KIAotICAvKioKLSAgICogRm9yIGV4YW1wbGUgdW5uYW1lZCBjb25zdHJ1Y3Rvci4KLSAgICovCisgIC8vLyBGb3IgZXhhbXBsZSB1bm5hbWVkIGNvbnN0cnVjdG9yLgogICB2b2lkIHRlc3RfY3JlYXRlX2VuY29kaW5nX2VtcHR5TGFzdCgpIHsKICAgICBTdHJpbmcgZW5jb2RpbmcgPSAiYTtiO2M7IjsKICAgICBFbGVtZW50TG9jYXRpb25JbXBsIGxvY2F0aW9uID0gRWxlbWVudExvY2F0aW9uSW1wbC5jb24yKGVuY29kaW5nKTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvZmFjdG9yX3R5cGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9mYWN0b3JfdHlwZV90ZXN0LmRhcnQKaW5kZXggZjNhZDdjYy4uY2ZkMTQyMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9mYWN0b3JfdHlwZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9mYWN0b3JfdHlwZV90ZXN0LmRhcnQKQEAgLTcsNyArNyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JyBhcyB0ZXN0OwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9mbGF0dGVuX3R5cGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9mbGF0dGVuX3R5cGVfdGVzdC5kYXJ0CmluZGV4IDY4NWM3NzEuLjg3OGJjYjAgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvZmxhdHRlbl90eXBlX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L2ZsYXR0ZW5fdHlwZV90ZXN0LmRhcnQKQEAgLTYsOCArNiw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvbm9ybWFsaXplX3R5cGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9ub3JtYWxpemVfdHlwZV90ZXN0LmRhcnQKaW5kZXggODc0OGJmMS4uYTY4NzU5MyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9ub3JtYWxpemVfdHlwZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9ub3JtYWxpemVfdHlwZV90ZXN0LmRhcnQKQEAgLTgsOCArOCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3Zpc2l0b3IuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFR5cGVTeXN0ZW1JbXBsOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvbnVsbGFibGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9udWxsYWJsZV90ZXN0LmRhcnQKaW5kZXggOTRlODgxNC4uNmM5OGY1NCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9udWxsYWJsZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9udWxsYWJsZV90ZXN0LmRhcnQKQEAgLTgsNyArOCw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdF9yZWZsZWN0aXZlX2xvYWRlci90ZXN0X3JlZmxlY3RpdmVfbG9hZGVyLmRhcnQnOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9ydW50aW1lX3R5cGVfZXF1YWxpdHlfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC9ydW50aW1lX3R5cGVfZXF1YWxpdHlfdGVzdC5kYXJ0CmluZGV4IDhhMWIxNmYuLjYwMDAxOWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvcnVudGltZV90eXBlX2VxdWFsaXR5X3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L3J1bnRpbWVfdHlwZV9lcXVhbGl0eV90ZXN0LmRhcnQKQEAgLTcsNyArNyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvdG9wX21lcmdlX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L2VsZW1lbnQvdG9wX21lcmdlX3Rlc3QuZGFydAppbmRleCAwMDhlZDE3Li44ZGVjMDg0IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L3RvcF9tZXJnZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC90b3BfbWVyZ2VfdGVzdC5kYXJ0CkBAIC01LDcgKzUsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYW5hbHlzaXMvZmVhdHVyZXMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7Ci1pbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0JyBzaG93IFR5cGVTeXN0ZW1JbXBsOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvZWxlbWVudC91cHBlcl9sb3dlcl9ib3VuZF90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L3VwcGVyX2xvd2VyX2JvdW5kX3Rlc3QuZGFydAppbmRleCBjNDFhODQwLi4wNzJlM2VmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L3VwcGVyX2xvd2VyX2JvdW5kX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9lbGVtZW50L3VwcGVyX2xvd2VyX2JvdW5kX3Rlc3QuZGFydApAQCAtOCw5ICs4LDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlX3NjaGVtYS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV92aXNpdG9yLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCcgc2hvdyBUeXBlU3lzdGVtSW1wbDsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Jlc29sdXRpb24vbm9uX251bGxhYmxlX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Jlc29sdXRpb24vbm9uX251bGxhYmxlX3Rlc3QuZGFydAppbmRleCA0MzY4OTE4Li5hMzEyYzE3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9yZXNvbHV0aW9uL25vbl9udWxsYWJsZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvcmVzb2x1dGlvbi9ub25fbnVsbGFibGVfdGVzdC5kYXJ0CkBAIC00LDEwICs0LDEwIEBACiAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L2FuYWx5c2lzL2ZlYXR1cmVzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZXJyb3IvaGludF9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lcnJvci9zeW50YWN0aWNfZXJyb3JzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3RfcmVmbGVjdGl2ZV9sb2FkZXIvdGVzdF9yZWZsZWN0aXZlX2xvYWRlci5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvcmVzb2x1dGlvbi9yZXNvbHV0aW9uLmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9yZXNvbHV0aW9uL3Jlc29sdXRpb24uZGFydAppbmRleCBjZjAzNTgxLi42M2M2ZTZkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9yZXNvbHV0aW9uL3Jlc29sdXRpb24uZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9yZXNvbHV0aW9uL3Jlc29sdXRpb24uZGFydApAQCAtMTcsNyArMTcsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvbWVtYmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9lbGVtZW50L3R5cGVfYWxnZWJyYS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3R5cGVfc3lzdGVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3Rlc3RfdXRpbGl0aWVzL2ZpbmRfZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGVzdF91dGlsaXRpZXMvZmluZF9ub2RlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy90ZXN0X3V0aWxpdGllcy9yZXNvdXJjZV9wcm92aWRlcl9taXhpbi5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Jlc29sdmVyL2V4aXRfZGV0ZWN0b3JfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvcmVzb2x2ZXIvZXhpdF9kZXRlY3Rvcl90ZXN0LmRhcnQKaW5kZXggNDZjMGQ4ZC4uZDliN2MxYiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvcmVzb2x2ZXIvZXhpdF9kZXRlY3Rvcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RhcnQvcmVzb2x2ZXIvZXhpdF9kZXRlY3Rvcl90ZXN0LmRhcnQKQEAgLTMsNyArMyw3IEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9hc3QvYXN0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvcmVzb2x2ZXIvZXhpdF9kZXRlY3Rvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGVzdF91dGlsaXRpZXMvZmluZF9ub2RlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGFydC9zZGsvc2RrX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Nkay9zZGtfdGVzdC5kYXJ0CmluZGV4IDIzMzMwMWIuLjA2ZDY3MWQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Nkay9zZGtfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kYXJ0L3Nkay9zZGtfdGVzdC5kYXJ0CkBAIC0yMjAsMTAgKzIyMCw4IEBACiAgICAgZXhwZWN0KHZlcnNpb24uaXNOb3RFbXB0eSwgaXNUcnVlKTsKICAgfQogCi0gIC8qKgotICAgKiBUaGUgInBhcnQiIGZvcm1hdCBzaG91bGQgcmVzdWx0IGluIHRoZSBzYW1lIHNvdXJjZSBhcyB0aGUgbm9uLXBhcnQgZm9ybWF0Ci0gICAqIHdoZW4gdGhlIGZpbGUgaXMgdGhlIGxpYnJhcnkgZmlsZS4KLSAgICovCisgIC8vLyBUaGUgInBhcnQiIGZvcm1hdCBzaG91bGQgcmVzdWx0IGluIHRoZSBzYW1lIHNvdXJjZSBhcyB0aGUgbm9uLXBhcnQgZm9ybWF0CisgIC8vLyB3aGVuIHRoZSBmaWxlIGlzIHRoZSBsaWJyYXJ5IGZpbGUuCiAgIHZvaWQgdGVzdF9tYXBEYXJ0VXJpX3BhcnRGb3JtYXRGb3JMaWJyYXJ5KCkgewogICAgIEZvbGRlckJhc2VkRGFydFNkayBzZGsgPSBfY3JlYXRlRGFydFNkaygpOwogICAgIFNvdXJjZSBub3JtYWxTb3VyY2UgPSBzZGsubWFwRGFydFVyaSgnZGFydDpjb3JlJyk7CkBAIC0yMzEsMjAgKzIyOSw2IEBACiAgICAgZXhwZWN0KHBhcnRTb3VyY2UsIG5vcm1hbFNvdXJjZSk7CiAgIH0KIAotICB2b2lkIHRlc3RfdXNlU3VtbWFyeV9hZnRlckNvbnRleHRDcmVhdGlvbigpIHsKLSAgICBGb2xkZXJCYXNlZERhcnRTZGsgc2RrID0gX2NyZWF0ZURhcnRTZGsoKTsKLSAgICBzZGsuY29udGV4dDsKLSAgICBleHBlY3QoKCkgewotICAgICAgc2RrLnVzZVN1bW1hcnkgPSB0cnVlOwotICAgIH0sIHRocm93c1N0YXRlRXJyb3IpOwotICB9Ci0KLSAgdm9pZCB0ZXN0X3VzZVN1bW1hcnlfYmVmb3JlQ29udGV4dENyZWF0aW9uKCkgewotICAgIEZvbGRlckJhc2VkRGFydFNkayBzZGsgPSBfY3JlYXRlRGFydFNkaygpOwotICAgIHNkay51c2VTdW1tYXJ5ID0gdHJ1ZTsKLSAgICBzZGsuY29udGV4dDsKLSAgfQotCiAgIEZvbGRlckJhc2VkRGFydFNkayBfY3JlYXRlRGFydFNkaygpIHsKICAgICBGb2xkZXIgc2RrRGlyZWN0b3J5ID0gZ2V0Rm9sZGVyKCcvc2RrJyk7CiAgICAgX2NyZWF0ZUZpbGUoc2RrRGlyZWN0b3J5LApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL2NvbnN0X2NvbnN0cnVjdG9yX3dpdGhfZmllbGRfaW5pdGlhbGl6ZWRfYnlfbm9uX2NvbnN0X3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9jb25zdF9jb25zdHJ1Y3Rvcl93aXRoX2ZpZWxkX2luaXRpYWxpemVkX2J5X25vbl9jb25zdF90ZXN0LmRhcnQKaW5kZXggOGFjNGRmZS4uYThhN2E3OSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL2NvbnN0X2NvbnN0cnVjdG9yX3dpdGhfZmllbGRfaW5pdGlhbGl6ZWRfYnlfbm9uX2NvbnN0X3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3MvY29uc3RfY29uc3RydWN0b3Jfd2l0aF9maWVsZF9pbml0aWFsaXplZF9ieV9ub25fY29uc3RfdGVzdC5kYXJ0CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUKICAgICAgICAgICAgICAgLkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRURfQllfTk9OX0NPTlNULAogICAgICAgICAgIDMzLAotICAgICAgICAgIDEwKSwKKyAgICAgICAgICA1KSwKICAgICBdKTsKICAgfQogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3MvZXh0ZW5kc19kaXNhbGxvd2VkX2NsYXNzX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9leHRlbmRzX2Rpc2FsbG93ZWRfY2xhc3NfdGVzdC5kYXJ0CmluZGV4IDRiNjkwNWYuLjhmN2M1OTYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9leHRlbmRzX2Rpc2FsbG93ZWRfY2xhc3NfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9leHRlbmRzX2Rpc2FsbG93ZWRfY2xhc3NfdGVzdC5kYXJ0CkBAIC0xOSw3ICsxOSw2IEBACiAgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKCcnJwogY2xhc3MgQSBleHRlbmRzIGJvb2wge30KICcnJywgWwotICAgICAgZXJyb3IoQ29tcGlsZVRpbWVFcnJvckNvZGUuTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9JTVBMSUNJVCwgNiwgMSksCiAgICAgICBlcnJvcihDb21waWxlVGltZUVycm9yQ29kZS5FWFRFTkRTX0RJU0FMTE9XRURfQ0xBU1MsIDE2LCA0KSwKICAgICBdKTsKICAgfQpAQCAtNjMsNyArNjIsNiBAQAogICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKIGNsYXNzIEEgZXh0ZW5kcyBpbnQge30KICcnJywgWwotICAgICAgZXJyb3IoQ29tcGlsZVRpbWVFcnJvckNvZGUuTk9fREVGQVVMVF9TVVBFUl9DT05TVFJVQ1RPUl9JTVBMSUNJVCwgNiwgMSksCiAgICAgICBlcnJvcihDb21waWxlVGltZUVycm9yQ29kZS5FWFRFTkRTX0RJU0FMTE9XRURfQ0xBU1MsIDE2LCAzKSwKICAgICBdKTsKICAgfQpAQCAtNzIsNyArNzAsNiBAQAogICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKIGNsYXNzIEEgZXh0ZW5kcyBOdWxsIHt9CiAnJycsIFsKLSAgICAgIGVycm9yKENvbXBpbGVUaW1lRXJyb3JDb2RlLk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVQsIDYsIDEpLAogICAgICAgZXJyb3IoQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhURU5EU19ESVNBTExPV0VEX0NMQVNTLCAxNiwgNCksCiAgICAgXSk7CiAgIH0KQEAgLTg5LDcgKzg2LDYgQEAKICAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUoJycnCiBjbGFzcyBBIGV4dGVuZHMgU3RyaW5nIHt9CiAnJycsIFsKLSAgICAgIGVycm9yKENvbXBpbGVUaW1lRXJyb3JDb2RlLk5PX0RFRkFVTFRfU1VQRVJfQ09OU1RSVUNUT1JfSU1QTElDSVQsIDYsIDEpLAogICAgICAgZXJyb3IoQ29tcGlsZVRpbWVFcnJvckNvZGUuRVhURU5EU19ESVNBTExPV0VEX0NMQVNTLCAxNiwgNiksCiAgICAgXSk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9pbnZhbGlkX2Fzc2lnbm1lbnRfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL2ludmFsaWRfYXNzaWdubWVudF90ZXN0LmRhcnQKaW5kZXggMzEyZjg5Mi4uNjEzN2QyOGYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9pbnZhbGlkX2Fzc2lnbm1lbnRfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9pbnZhbGlkX2Fzc2lnbm1lbnRfdGVzdC5kYXJ0CkBAIC0yNCw2ICsyNCwxOCBAQAogICAgICAgICBzZGtWZXJzaW9uOiAnMi43LjAnLCBhZGRpdGlvbmFsRmVhdHVyZXM6IFtGZWF0dXJlLm5vbl9udWxsYWJsZV0pOwogCiAgIEBvdmVycmlkZQorICB0ZXN0X2lmTnVsbEFzc2lnbm1lbnQoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKCcnJwordm9pZCBmKGludCBpKSB7CisgIGRvdWJsZT8gZDsKKyAgZCA/Pz0gaTsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMzcsIDEpLAorICAgIF0pOworICB9CisKKyAgQG92ZXJyaWRlCiAgIHRlc3RfaWZOdWxsQXNzaWdubWVudF9zYW1lVHlwZSgpIGFzeW5jIHsKICAgICAvLyBUaGlzIHRlc3QgaXMgb3ZlcnJpZGRlbiBzb2xlbHkgdG8gbWFrZSBbal0gbnVsbGFibGUuCiAgICAgYXdhaXQgYXNzZXJ0Tm9FcnJvcnNJbkNvZGUoJycnCkBAIC02OCw2ICs4MCwyMiBAQAogICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMzcsIDQpLAogICAgIF0pOwogICB9CisKKyAgQG92ZXJyaWRlCisgIHRlc3RfdHlwZVBhcmFtZXRlcigpIGFzeW5jIHsKKyAgICAvLyBUaGlzIHRlc3QgaXMgb3ZlcnJpZGRlbiBzb2xlbHkgdG8gbWFrZSBbdmFsdWVdIG51bGxhYmxlLgorICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8xNDIyMQorICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBCPFQ+IHsKKyAgVD8gdmFsdWU7CisgIHZvaWQgdGVzdChudW0gbikgeworICAgIHZhbHVlID0gbjsKKyAgfQorfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCA1OCwgMSksCisgICAgXSk7CisgIH0KIH0KIAogQHJlZmxlY3RpdmVUZXN0CkBAIC0xMDIsMTggKzEzMCw2NiBAQAogICB9CiAKICAgdGVzdF9kZWZhdWx0VmFsdWVfbmFtZWQoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKK2Yoe1N0cmluZyB4OiAwfSkgeworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCAxMywgMSksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2RlZmF1bHRWYWx1ZV9uYW1lZF9zYW1lVHlwZSgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnROb0Vycm9yc0luQ29kZShyJycnCiBmKHtTdHJpbmcgeDogJzAnfSkgewogfScnJyk7CiAgIH0KIAogICB0ZXN0X2RlZmF1bHRWYWx1ZV9vcHRpb25hbCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworZihbU3RyaW5nIHggPSAwXSkgeworfScnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMTQsIDEpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9kZWZhdWx0VmFsdWVfb3B0aW9uYWxfc2FtZVR5cGUoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Tm9FcnJvcnNJbkNvZGUocicnJwogZihbU3RyaW5nIHggPSAnMCddKSB7CiB9CiAnJycpOwogICB9CiAKKyAgdGVzdF9keW5hbWljKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCittYWluKCkgeworICBkeW5hbWljID0gMTsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMjEsIDEpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9mdW5jdGlvbkV4cHJlc3Npb25JbnZvY2F0aW9uKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKK2NsYXNzIEMgeworICBTdHJpbmcgeCA9ICgoKSA9PiA1KSgpOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCAyMywgMTEpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9pZk51bGxBc3NpZ25tZW50KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKK3ZvaWQgZihpbnQgaSkgeworICBkb3VibGUgZDsKKyAgZCA/Pz0gaTsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMzYsIDEpLAorICAgIF0pOworICB9CisKICAgdGVzdF9pZk51bGxBc3NpZ25tZW50X3NhbWVUeXBlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKCcnJwogdm9pZCBmKGludCBpKSB7CkBAIC0yMzksNiArMzE1LDE4IEBACiAKICAgdGVzdF9sb2NhbFZhcmlhYmxlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitmKCkgeworICBpbnQgeDsKKyAgeCA9ICcwJzsKK30KKycnJywgWworICAgICAgZXJyb3IoSGludENvZGUuVU5VU0VEX0xPQ0FMX1ZBUklBQkxFLCAxMiwgMSksCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCAyMSwgMyksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2xvY2FsVmFyaWFibGVfcHJvbW90aW9uKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCiBmKHZhciB5KSB7CiAgIGlmICh5IGlzIFN0cmluZykgewogICAgIGludCB4ID0geTsKQEAgLTI1MSw2ICszMzksMjIgQEAKICAgfQogCiAgIHRlc3RfcG9zdGZpeEV4cHJlc3Npb25fbG9jYWxWYXJpYWJsZSgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworY2xhc3MgQSB7CisgIEIgb3BlcmF0b3IrKF8pID0+IG5ldyBCKCk7Cit9CisKK2NsYXNzIEIge30KKworZihBIGEpIHsKKyAgYSsrOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCA2NSwgMyksCisgICAgXSk7CisgIH0KKworICB0ZXN0X3Bvc3RmaXhFeHByZXNzaW9uX2xvY2FsVmFyaWFibGVfc2FtZVR5cGUoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Tm9FcnJvcnNJbkNvZGUocicnJwogY2xhc3MgQSB7CiAgIEEgb3BlcmF0b3IrKF8pID0+IHRoaXM7CkBAIC0yNjMsNiArMzY3LDI2IEBACiAgIH0KIAogICB0ZXN0X3Bvc3RmaXhFeHByZXNzaW9uX3Byb3BlcnR5KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBBIHsKKyAgQiBvcGVyYXRvcisoXykgPT4gbmV3IEIoKTsKK30KKworY2xhc3MgQiB7fQorCitjbGFzcyBDIHsKKyAgQSBhID0gQSgpOworfQorCitmKEMgYykgeworICBjLmErKzsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgOTEsIDUpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9wb3N0Zml4RXhwcmVzc2lvbl9wcm9wZXJ0eV9zYW1lVHlwZSgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnROb0Vycm9yc0luQ29kZShyJycnCiBjbGFzcyBBIHsKICAgQSBvcGVyYXRvcisoXykgPT4gdGhpczsKQEAgLTI3OSw2ICs0MDMsMjIgQEAKICAgfQogCiAgIHRlc3RfcHJlZml4RXhwcmVzc2lvbl9sb2NhbFZhcmlhYmxlKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBBIHsKKyAgQiBvcGVyYXRvcisoXykgPT4gbmV3IEIoKTsKK30KKworY2xhc3MgQiB7fQorCitmKEEgYSkgeworICArK2E7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDY1LCAzKSwKKyAgICBdKTsKKyAgfQorCisgIHRlc3RfcHJlZml4RXhwcmVzc2lvbl9sb2NhbFZhcmlhYmxlX3NhbWVUeXBlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKHInJycKIGNsYXNzIEEgewogICBBIG9wZXJhdG9yKyhfKSA9PiB0aGlzOwpAQCAtMjkxLDYgKzQzMSwyNiBAQAogICB9CiAKICAgdGVzdF9wcmVmaXhFeHByZXNzaW9uX3Byb3BlcnR5KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBBIHsKKyAgQiBvcGVyYXRvcisoXykgPT4gbmV3IEIoKTsKK30KKworY2xhc3MgQiB7fQorCitjbGFzcyBDIHsKKyAgQSBhID0gQSgpOworfQorCitmKEMgYykgeworICArK2MuYTsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgOTEsIDUpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9wcmVmaXhFeHByZXNzaW9uX3Byb3BlcnR5X3NhbWVUeXBlKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKHInJycKIGNsYXNzIEEgewogICBBIG9wZXJhdG9yKyhfKSA9PiB0aGlzOwpAQCAtMzI5LDkgKzQ4OSwzMyBAQAogICAgIF0pOwogICB9CiAKKyAgdGVzdF9yZWdyZXNzaW9uSW5Jc3N1ZTE4NDY4Rml4KCkgYXN5bmMgeworICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE4NjI4CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKK2NsYXNzIEM8VD4geworICBUIHQgPSBpbnQ7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDIxLCAzKSwKKyAgICBdKTsKKyAgfQorCiAgIHRlc3Rfc3RhdGljVmFyaWFibGUoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKIGNsYXNzIEEgeworICBzdGF0aWMgaW50IHggPSAxOworfQorZigpIHsKKyAgQS54ID0gJzAnOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuSU5WQUxJRF9BU1NJR05NRU5ULCA0NiwgMyksCisgICAgXSk7CisgIH0KKworICB0ZXN0X3N0YXRpY1ZhcmlhYmxlX3Byb21vdGVkKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBBIHsKICAgc3RhdGljIGludCB4ID0gNzsKIH0KIGYodmFyIHkpIHsKQEAgLTM0NCw2ICs1MjgsMjggQEAKICAgICBdKTsKICAgfQogCisgIHRlc3RfdG9wTGV2ZWxWYXJpYWJsZURlY2xhcmF0aW9uKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKK2ludCB4ID0gJ3N0cmluZyc7CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDgsIDgpLAorICAgIF0pOworICB9CisKKyAgdGVzdF90eXBlUGFyYW1ldGVyKCkgYXN5bmMgeworICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8xNDIyMQorICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBCPFQ+IHsKKyAgVCB2YWx1ZTsKKyAgdm9pZCB0ZXN0KG51bSBuKSB7CisgICAgdmFsdWUgPSBuOworICB9Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5JTlZBTElEX0FTU0lHTk1FTlQsIDU3LCAxKSwKKyAgICBdKTsKKyAgfQorCiAgIHRlc3RfdHlwZVBhcmFtZXRlclJlY3Vyc2lvbl9yZWdyZXNzMzUzMDYoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKIGNsYXNzIEEge30KQEAgLTM2Myw3ICs1NjksMTcgQEAKICAgfQogCiAgIHRlc3RfdmFyaWFibGVEZWNsYXJhdGlvbigpIGFzeW5jIHsKLSAgICAvLyAxNzk3MQorICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitjbGFzcyBBIHsKKyAgaW50IHggPSAnc3RyaW5nJzsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLklOVkFMSURfQVNTSUdOTUVOVCwgMjAsIDgpLAorICAgIF0pOworICB9CisKKyAgdGVzdF92YXJpYWJsZURlY2xhcmF0aW9uX292ZXJyaWRkZW5PcGVyYXRvcigpIGFzeW5jIHsKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMTc5NzEKICAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwogY2xhc3MgUG9pbnQgewogICBmaW5hbCBudW0geCwgeTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9ub25fYm9vbF9jb25kaXRpb25fdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX2NvbmRpdGlvbl90ZXN0LmRhcnQKaW5kZXggNmY1NWVlMS4uZjIwOTI4MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX2NvbmRpdGlvbl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX2NvbmRpdGlvbl90ZXN0LmRhcnQKQEAgLTEzLDEzICsxMyw0MSBAQAogbWFpbigpIHsKICAgZGVmaW5lUmVmbGVjdGl2ZVN1aXRlKCgpIHsKICAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoTm9uQm9vbENvbmRpdGlvblRlc3QpOwotICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhOb25Cb29sQ29uZGl0aW9uV2l0aENvbnN0YW50c1Rlc3QpOwogICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhOb25Cb29sQ29uZGl0aW9uVGVzdF9OTkJEKTsKICAgfSk7CiB9CiAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgTm9uQm9vbENvbmRpdGlvblRlc3QgZXh0ZW5kcyBEcml2ZXJSZXNvbHV0aW9uVGVzdCB7CisgIHRlc3RfY29uZGl0aW9uYWwoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKCcnJworZigpIHsgcmV0dXJuIDMgPyAyIDogMTsgfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfQ09ORElUSU9OLCAxMywgMSksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2RvKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitmKCkgeworICBkbyB7fSB3aGlsZSAoMyk7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9DT05ESVRJT04sIDIxLCAxKSwKKyAgICBdKTsKKyAgfQorCisgIHRlc3RfZm9yKCkgYXN5bmMgeworICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yNDcxMworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitmKCkgeworICBmb3IgKDszOykge30KK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX0NPTkRJVElPTiwgMTQsIDEpLAorICAgIF0pOworICB9CisKICAgdGVzdF9mb3JFbGVtZW50KCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZSgnJycKIHZhciB2ID0gW2ZvciAoOyAwOykgMV07CkBAIC0yOCw2ICs1NiwxNiBAQAogICAgIF0pOwogICB9CiAKKyAgdGVzdF9pZigpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworZigpIHsKKyAgaWYgKDMpIHJldHVybiAyOyBlbHNlIHJldHVybiAxOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfQ09ORElUSU9OLCAxMiwgMSksCisgICAgXSk7CisgIH0KKwogICB0ZXN0X2lmRWxlbWVudCgpIGFzeW5jIHsKICAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUoJycnCiB2YXIgdiA9IFtpZiAoMykgMV07CkBAIC0zNSw2ICs3MywxNiBAQAogICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX0NPTkRJVElPTiwgMTMsIDEpLAogICAgIF0pOwogICB9CisKKyAgdGVzdF93aGlsZSgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworZigpIHsKKyAgd2hpbGUgKDMpIHt9Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9DT05ESVRJT04sIDE1LCAxKSwKKyAgICBdKTsKKyAgfQogfQogCiBAcmVmbGVjdGl2ZVRlc3QKQEAgLTY3LDEyICsxMTUsMyBAQAogICAgIF0pOwogICB9CiB9Ci0KLUByZWZsZWN0aXZlVGVzdAotY2xhc3MgTm9uQm9vbENvbmRpdGlvbldpdGhDb25zdGFudHNUZXN0IGV4dGVuZHMgTm9uQm9vbENvbmRpdGlvblRlc3QgewotICBAb3ZlcnJpZGUKLSAgQW5hbHlzaXNPcHRpb25zSW1wbCBnZXQgYW5hbHlzaXNPcHRpb25zID0+IEFuYWx5c2lzT3B0aW9uc0ltcGwoKQotICAgIC4uY29udGV4dEZlYXR1cmVzID0gRmVhdHVyZVNldC5mcm9tRW5hYmxlRmxhZ3MoCi0gICAgICBbRW5hYmxlU3RyaW5nLmNvbnN0YW50X3VwZGF0ZV8yMDE4XSwKLSAgICApOwotfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX2V4cHJlc3Npb25fdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX2V4cHJlc3Npb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGFjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3Mvbm9uX2Jvb2xfZXhwcmVzc2lvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZXJyb3IvY29kZXMuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdF9yZWZsZWN0aXZlX2xvYWRlci90ZXN0X3JlZmxlY3RpdmVfbG9hZGVyLmRhcnQnOworCitpbXBvcnQgJy4uL2RhcnQvcmVzb2x1dGlvbi9kcml2ZXJfcmVzb2x1dGlvbi5kYXJ0JzsKKworbWFpbigpIHsKKyAgZGVmaW5lUmVmbGVjdGl2ZVN1aXRlKCgpIHsKKyAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoTm9uQm9vbEV4cHJlc3Npb25UZXN0KTsKKyAgfSk7Cit9CisKK0ByZWZsZWN0aXZlVGVzdAorY2xhc3MgTm9uQm9vbEV4cHJlc3Npb25UZXN0IGV4dGVuZHMgRHJpdmVyUmVzb2x1dGlvblRlc3QgeworICB0ZXN0X2Z1bmN0aW9uVHlwZV9ib29sKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitib29sIG1ha2VBc3NlcnRpb24oKSA9PiB0cnVlOworZigpIHsKKyAgYXNzZXJ0KG1ha2VBc3NlcnRpb24pOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgNDUsIDEzKSwKKyAgICBdKTsKKyAgfQorCisgIHRlc3RfZnVuY3Rpb25UeXBlX2ludCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworaW50IG1ha2VBc3NlcnRpb24oKSA9PiAxOworZigpIHsKKyAgYXNzZXJ0KG1ha2VBc3NlcnRpb24pOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgNDEsIDEzKSwKKyAgICBdKTsKKyAgfQorCisgIHRlc3RfaW50ZXJmYWNlVHlwZSgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworZigpIHsKKyAgYXNzZXJ0KDApOworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfRVhQUkVTU0lPTiwgMTUsIDEpLAorICAgIF0pOworICB9Cit9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3Mvbm9uX2Jvb2xfbmVnYXRpb25fZXhwcmVzc2lvbl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3Mvbm9uX2Jvb2xfbmVnYXRpb25fZXhwcmVzc2lvbl90ZXN0LmRhcnQKaW5kZXggNjZkYjVlNC4uZDhkOWFmMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX25lZ2F0aW9uX2V4cHJlc3Npb25fdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9ub25fYm9vbF9uZWdhdGlvbl9leHByZXNzaW9uX3Rlc3QuZGFydApAQCAtMTIsMTEgKzEyLDI1IEBACiAKIG1haW4oKSB7CiAgIGRlZmluZVJlZmxlY3RpdmVTdWl0ZSgoKSB7CisgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKE5vbkJvb2xOZWdhdGlvbkV4cHJlc3Npb25UZXN0KTsKICAgICBkZWZpbmVSZWZsZWN0aXZlVGVzdHMoTm9uQm9vbE5lZ2F0aW9uRXhwcmVzc2lvblRlc3RfTk5CRCk7CiAgIH0pOwogfQogCiBAcmVmbGVjdGl2ZVRlc3QKK2NsYXNzIE5vbkJvb2xOZWdhdGlvbkV4cHJlc3Npb25UZXN0IGV4dGVuZHMgRHJpdmVyUmVzb2x1dGlvblRlc3QgeworICB0ZXN0X25vbkJvb2woKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKK2YoKSB7CisgICE0MjsKK30KKycnJywgWworICAgICAgZXJyb3IoU3RhdGljVHlwZVdhcm5pbmdDb2RlLk5PTl9CT09MX05FR0FUSU9OX0VYUFJFU1NJT04sIDksIDIpLAorICAgIF0pOworICB9Cit9CisKK0ByZWZsZWN0aXZlVGVzdAogY2xhc3MgTm9uQm9vbE5lZ2F0aW9uRXhwcmVzc2lvblRlc3RfTk5CRCBleHRlbmRzIERyaXZlclJlc29sdXRpb25UZXN0IHsKICAgQG92ZXJyaWRlCiAgIEFuYWx5c2lzT3B0aW9uc0ltcGwgZ2V0IGFuYWx5c2lzT3B0aW9ucyA9PiBBbmFseXNpc09wdGlvbnNJbXBsKCkKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9ub25fYm9vbF9vcGVyYW5kX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9ub25fYm9vbF9vcGVyYW5kX3Rlc3QuZGFydAppbmRleCA4ZjAxZTcxZi4uZjMyMmE1NiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL25vbl9ib29sX29wZXJhbmRfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy9ub25fYm9vbF9vcGVyYW5kX3Rlc3QuZGFydApAQCAtMTIsMTEgKzEyLDU1IEBACiAKIG1haW4oKSB7CiAgIGRlZmluZVJlZmxlY3RpdmVTdWl0ZSgoKSB7CisgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKE5vbkJvb2xPcGVyYW5kVGVzdCk7CiAgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKE5vbkJvb2xPcGVyYW5kVGVzdF9OTkJEKTsKICAgfSk7CiB9CiAKIEByZWZsZWN0aXZlVGVzdAorY2xhc3MgTm9uQm9vbE9wZXJhbmRUZXN0IGV4dGVuZHMgRHJpdmVyUmVzb2x1dGlvblRlc3QgeworICB0ZXN0X2FuZF9sZWZ0KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitib29sIGYoaW50IGxlZnQsIGJvb2wgcmlnaHQpIHsKKyAgcmV0dXJuIGxlZnQgJiYgcmlnaHQ7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9PUEVSQU5ELCA0MCwgNCksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2FuZF9yaWdodCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJworYm9vbCBmKGJvb2wgbGVmdCwgU3RyaW5nIHJpZ2h0KSB7CisgIHJldHVybiBsZWZ0ICYmIHJpZ2h0OworfQorJycnLCBbCisgICAgICBlcnJvcihTdGF0aWNUeXBlV2FybmluZ0NvZGUuTk9OX0JPT0xfT1BFUkFORCwgNTEsIDUpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9vcl9sZWZ0KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitib29sIGYoTGlzdDxpbnQ+IGxlZnQsIGJvb2wgcmlnaHQpIHsKKyAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9PUEVSQU5ELCA0NiwgNCksCisgICAgXSk7CisgIH0KKworICB0ZXN0X29yX3JpZ2h0KCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydEVycm9yc0luQ29kZShyJycnCitib29sIGYoYm9vbCBsZWZ0LCBkb3VibGUgcmlnaHQpIHsKKyAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKFN0YXRpY1R5cGVXYXJuaW5nQ29kZS5OT05fQk9PTF9PUEVSQU5ELCA1MSwgNSksCisgICAgXSk7CisgIH0KK30KKworQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBOb25Cb29sT3BlcmFuZFRlc3RfTk5CRCBleHRlbmRzIERyaXZlclJlc29sdXRpb25UZXN0IHsKICAgQG92ZXJyaWRlCiAgIEFuYWx5c2lzT3B0aW9uc0ltcGwgZ2V0IGFuYWx5c2lzT3B0aW9ucyA9PiBBbmFseXNpc09wdGlvbnNJbXBsKCkKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy90ZXN0X2FsbC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL3Rlc3RfYWxsLmRhcnQKaW5kZXggOGJlYWMwMC4uNDk2OTM3ZSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL3Rlc3RfYWxsLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL3Rlc3RfYWxsLmRhcnQKQEAgLTMyMSw2ICszMjEsNyBAQAogaW1wb3J0ICdub25fYWJzdHJhY3RfY2xhc3NfaW5oZXJpdHNfYWJzdHJhY3RfbWVtYmVyX3Rlc3QuZGFydCcKICAgICBhcyBub25fYWJzdHJhY3RfY2xhc3NfaW5oZXJpdHNfYWJzdHJhY3RfbWVtYmVyOwogaW1wb3J0ICdub25fYm9vbF9jb25kaXRpb25fdGVzdC5kYXJ0JyBhcyBub25fYm9vbF9jb25kaXRpb247CitpbXBvcnQgJ25vbl9ib29sX2V4cHJlc3Npb25fdGVzdC5kYXJ0JyBhcyBub25fYm9vbF9leHByZXNzaW9uOwogaW1wb3J0ICdub25fYm9vbF9uZWdhdGlvbl9leHByZXNzaW9uX3Rlc3QuZGFydCcgYXMgbm9uX2Jvb2xfbmVnYXRpb25fZXhwcmVzc2lvbjsKIGltcG9ydCAnbm9uX2Jvb2xfb3BlcmFuZF90ZXN0LmRhcnQnIGFzIG5vbl9ib29sX29wZXJhbmQ7CiBpbXBvcnQgJ25vbl9jb25zdGFudF9jYXNlX2V4cHJlc3Npb25fZnJvbV9kZWZlcnJlZF9saWJyYXJ5X3Rlc3QuZGFydCcKQEAgLTc1MCw2ICs3NTEsNyBAQAogICAgIG5vX2RlZmF1bHRfc3VwZXJfY29uc3RydWN0b3IubWFpbigpOwogICAgIG5vbl9hYnN0cmFjdF9jbGFzc19pbmhlcml0c19hYnN0cmFjdF9tZW1iZXIubWFpbigpOwogICAgIG5vbl9ib29sX2NvbmRpdGlvbi5tYWluKCk7CisgICAgbm9uX2Jvb2xfZXhwcmVzc2lvbi5tYWluKCk7CiAgICAgbm9uX2Jvb2xfbmVnYXRpb25fZXhwcmVzc2lvbi5tYWluKCk7CiAgICAgbm9uX2Jvb2xfb3BlcmFuZC5tYWluKCk7CiAgICAgbm9uX2NvbnN0YW50X2xpc3RfZWxlbWVudC5tYWluKCk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3MvdW5uZWNlc3NhcnlfY2FzdF90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZGlhZ25vc3RpY3MvdW5uZWNlc3NhcnlfY2FzdF90ZXN0LmRhcnQKaW5kZXggZGE3NWMwNS4uNTQ0YTA0NyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2RpYWdub3N0aWNzL3VubmVjZXNzYXJ5X2Nhc3RfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9kaWFnbm9zdGljcy91bm5lY2Vzc2FyeV9jYXN0X3Rlc3QuZGFydApAQCAtNSwxMSArNSwxMyBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9lcnJvci9jb2Rlcy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp0ZXN0X3JlZmxlY3RpdmVfbG9hZGVyL3Rlc3RfcmVmbGVjdGl2ZV9sb2FkZXIuZGFydCc7CiAKK2ltcG9ydCAnLi4vZGFydC9jb25zdGFudC9wb3RlbnRpYWxseV9jb25zdGFudF90ZXN0LmRhcnQnOwogaW1wb3J0ICcuLi9kYXJ0L3Jlc29sdXRpb24vZHJpdmVyX3Jlc29sdXRpb24uZGFydCc7CiAKIG1haW4oKSB7CiAgIGRlZmluZVJlZmxlY3RpdmVTdWl0ZSgoKSB7CiAgICAgZGVmaW5lUmVmbGVjdGl2ZVRlc3RzKFVubmVjZXNzYXJ5Q2FzdFRlc3QpOworICAgIGRlZmluZVJlZmxlY3RpdmVUZXN0cyhVbm5lY2Vzc2FyeUNhc3RUZXN0V2l0aE51bGxTYWZldHkpOwogICB9KTsKIH0KIApAQCAtOTYsMjQgKzk4LDU0IEBACiAnJycpOwogICB9CiAKLSAgdGVzdF9mdW5jdGlvbigpIGFzeW5jIHsKKyAgdGVzdF9mdW5jdGlvbl90b1N1YnR5cGVfdmlhUGFyYW1ldGVyKCkgYXN5bmMgewogICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKHInJycKLXZvaWQgZigpIHsKLSAgRnVuY3Rpb24oTnVsbCkgYSA9IChTdHJpbmcgeCkge307Ci0gIChhIGFzIEZ1bmN0aW9uKGludCkpKDMpOwordm9pZCBmKHZvaWQgRnVuY3Rpb24oaW50KSBhKSB7CisgIChhIGFzIHZvaWQgRnVuY3Rpb24obnVtKSkoMyk7CiB9CiAnJycpOwogICB9CiAKLSAgdGVzdF9mdW5jdGlvbjIoKSBhc3luYyB7CisgIHRlc3RfZnVuY3Rpb25fdG9TdWJ0eXBlX3ZpYVJldHVyblR5cGUoKSBhc3luYyB7CiAgICAgYXdhaXQgYXNzZXJ0Tm9FcnJvcnNJbkNvZGUocicnJwotY2xhc3MgQSB7fQotCi1jbGFzcyBCPFQgZXh0ZW5kcyBBPiB7Ci0gIHZvaWQgZm9vKCkgewotICAgIFQgRnVuY3Rpb24oVCkgZjsKLSAgICBmIGFzIEEgRnVuY3Rpb24oQSk7Cit2b2lkIGYobnVtIEZ1bmN0aW9uKCkgYSkgeworICAoYSBhcyBpbnQgRnVuY3Rpb24oKSkoKTsKK30KKycnJyk7CiAgIH0KKworICB0ZXN0X2Z1bmN0aW9uX3RvU3VwZXJ0eXBlX3ZpYVBhcmFtZXRlcigpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnRFcnJvcnNJbkNvZGUocicnJwordm9pZCBmKHZvaWQgRnVuY3Rpb24obnVtKSBhKSB7CisgIChhIGFzIHZvaWQgRnVuY3Rpb24oaW50KSkoMyk7Cit9CisnJycsIFsKKyAgICAgIGVycm9yKEhpbnRDb2RlLlVOTkVDRVNTQVJZX0NBU1QsIDM0LCAyMyksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2Z1bmN0aW9uX3RvU3VwZXJ0eXBlX3ZpYVJldHVyblR5cGUoKSBhc3luYyB7CisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKK3ZvaWQgZihpbnQgRnVuY3Rpb24oKSBhKSB7CisgIChhIGFzIG51bSBGdW5jdGlvbigpKSgpOworfQorJycnLCBbCisgICAgICBlcnJvcihIaW50Q29kZS5VTk5FQ0VTU0FSWV9DQVNULCAzMCwgMTkpLAorICAgIF0pOworICB9CisKKyAgdGVzdF9mdW5jdGlvbl90b1VucmVsYXRlZCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhc3NlcnROb0Vycm9yc0luQ29kZShyJycnCit2b2lkIGYobnVtIEZ1bmN0aW9uKG51bSkgYSkgeworICAoYSBhcyBpbnQgRnVuY3Rpb24oaW50KSkoMyk7Cit9CisnJycpOworICB9CisKKyAgdGVzdF9mdW5jdGlvbl90b1VucmVsYXRlZF9nZW5lcmljKCkgYXN5bmMgeworICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKHInJycKK3ZvaWQgZjxUIGV4dGVuZHMgbnVtPihUIEZ1bmN0aW9uKFQpIGEpIHsKKyAgKGEgYXMgaW50IEZ1bmN0aW9uKGludCkpKDMpOwogfQogJycnKTsKICAgfQpAQCAtMTgyLDMgKzIxNCw0MSBAQAogJycnKTsKICAgfQogfQorCitAcmVmbGVjdGl2ZVRlc3QKK2NsYXNzIFVubmVjZXNzYXJ5Q2FzdFRlc3RXaXRoTnVsbFNhZmV0eSBleHRlbmRzIFVubmVjZXNzYXJ5Q2FzdFRlc3QKKyAgICB3aXRoIFdpdGhOdWxsU2FmZXR5TWl4aW4geworICB0ZXN0X2ludGVyZmFjZVR5cGVfc3Rhcl90b05vbmUoKSBhc3luYyB7CisgICAgbmV3RmlsZSgnL3Rlc3QvbGliL2EuZGFydCcsIGNvbnRlbnQ6IHInJycKKy8vIEBkYXJ0ID0gMi43CitpbnQgYSA9IDA7CisnJycpOworCisgICAgYXdhaXQgYXNzZXJ0RXJyb3JzSW5Db2RlKHInJycKK2ltcG9ydCAnYS5kYXJ0JzsKKwordm9pZCBmKCkgeworICB2YXIgYiA9IGEgYXMgaW50OworICBiOworfQorJycnLCBbCisgICAgICBlcnJvcihIaW50Q29kZS5VTk5FQ0VTU0FSWV9DQVNULCAzOSwgOCksCisgICAgXSk7CisgIH0KKworICB0ZXN0X2ludGVyZmFjZVR5cGVfc3Rhcl90b1F1ZXN0aW9uKCkgYXN5bmMgeworICAgIG5ld0ZpbGUoJy90ZXN0L2xpYi9hLmRhcnQnLCBjb250ZW50OiByJycnCisvLyBAZGFydCA9IDIuNworaW50IGEgPSAwOworJycnKTsKKworICAgIGF3YWl0IGFzc2VydE5vRXJyb3JzSW5Db2RlKHInJycKK2ltcG9ydCAnYS5kYXJ0JzsKKwordm9pZCBmKCkgeworICB2YXIgYiA9IGEgYXMgaW50PzsKKyAgYjsKK30KKycnJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9tZXNzYWdlX2NvdmVyYWdlX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9tZXNzYWdlX2NvdmVyYWdlX3Rlc3QuZGFydAppbmRleCAxYmFjOTQwLi5hZDI4YjBlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvbWVzc2FnZV9jb3ZlcmFnZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL21lc3NhZ2VfY292ZXJhZ2VfdGVzdC5kYXJ0CkBAIC0yMiwxMiArMjIsMTAgQEAKIAogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCBleHRlbmRzIEZhc3RhUGFyc2VyVGVzdENhc2UgewotICAvKioKLSAgICogR2l2ZW4gdGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGZhc3RhIFBhcnNlciwKLSAgICogcmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZXMgYW5kIHRlbXBsYXRlcyB0aGF0Ci0gICAqIGFyZSByZWZlcmVuY2VkIChwcmVzdW1hYmx5IGJlY2F1c2UgdGhleSBhcmUgYmVpbmcgZ2VuZXJhdGVkKSB3aXRoaW4gdGhhdAotICAgKiBmaWxlLgotICAgKi8KKyAgLy8vIEdpdmVuIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmYXN0YSBQYXJzZXIsCisgIC8vLyByZXR1cm4gYSBzZXQgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBtZXNzYWdlcyBhbmQgdGVtcGxhdGVzIHRoYXQKKyAgLy8vIGFyZSByZWZlcmVuY2VkIChwcmVzdW1hYmx5IGJlY2F1c2UgdGhleSBhcmUgYmVpbmcgZ2VuZXJhdGVkKSB3aXRoaW4gdGhhdAorICAvLy8gZmlsZS4KICAgU2V0PFN0cmluZz4gZ2V0R2VuZXJhdGVkTmFtZXMoU3RyaW5nIHBhcnNlclBhdGgpIHsKICAgICBTdHJpbmcgY29udGVudCA9IGlvLkZpbGUocGFyc2VyUGF0aCkucmVhZEFzU3RyaW5nU3luYygpOwogICAgIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gcGFyc2VDb21waWxhdGlvblVuaXQoY29udGVudCk7CkBAIC0zNywxMCArMzUsOCBAQAogICAgIHJldHVybiB2aXNpdG9yLmdlbmVyYXRlZE5hbWVzOwogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIHRoZSBwYXRoIHRvIHRoZSBmaWxlICdtZXNzYWdlcy55YW1sJywgcmV0dXJuIGEgbGlzdCBvZiB0aGUgdG9wLWxldmVsCi0gICAqIGtleXMgZGVmaW5lZCBpbiB0aGF0IGZpbGUgdGhhdCBkZWZpbmUgYW4gJ2FuYWx5emVyQ29kZScuCi0gICAqLworICAvLy8gR2l2ZW4gdGhlIHBhdGggdG8gdGhlIGZpbGUgJ21lc3NhZ2VzLnlhbWwnLCByZXR1cm4gYSBsaXN0IG9mIHRoZSB0b3AtbGV2ZWwKKyAgLy8vIGtleXMgZGVmaW5lZCBpbiB0aGF0IGZpbGUgdGhhdCBkZWZpbmUgYW4gJ2FuYWx5emVyQ29kZScuCiAgIExpc3Q8U3RyaW5nPiBnZXRNYXBwZWRDb2RlcyhTdHJpbmcgbWVzc2FnZXNQYXRoKSB7CiAgICAgU3RyaW5nIGNvbnRlbnQgPSBpby5GaWxlKG1lc3NhZ2VzUGF0aCkucmVhZEFzU3RyaW5nU3luYygpOwogICAgIFlhbWxEb2N1bWVudCBkb2N1bWVudCA9IGxvYWRZYW1sRG9jdW1lbnQoY29udGVudCk7CkBAIC02MCwxMCArNTYsOCBAQAogICAgIHJldHVybiBjb2Rlcy50b0xpc3QoKTsKICAgfQogCi0gIC8qKgotICAgKiBHaXZlbiB0aGUgcGF0aCB0byB0aGUgZmlsZSAnbWVzc2FnZXMueWFtbCcsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGFuYWx5emVyCi0gICAqIGNvZGVzIGRlZmluZWQgaW4gdGhhdCBmaWxlLgotICAgKi8KKyAgLy8vIEdpdmVuIHRoZSBwYXRoIHRvIHRoZSBmaWxlICdtZXNzYWdlcy55YW1sJywgcmV0dXJuIGEgbGlzdCBvZiB0aGUgYW5hbHl6ZXIKKyAgLy8vIGNvZGVzIGRlZmluZWQgaW4gdGhhdCBmaWxlLgogICBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZENvZGVzKFN0cmluZyBtZXNzYWdlc1BhdGgpIHsKICAgICBTdHJpbmcgY29udGVudCA9IGlvLkZpbGUobWVzc2FnZXNQYXRoKS5yZWFkQXNTdHJpbmdTeW5jKCk7CiAgICAgWWFtbERvY3VtZW50IGRvY3VtZW50ID0gbG9hZFlhbWxEb2N1bWVudChjb250ZW50KTsKQEAgLTg0LDEwICs3OCw4IEBACiAgICAgcmV0dXJuIGNvZGVzLnRvTGlzdCgpOwogICB9CiAKLSAgLyoqCi0gICAqIEdpdmVuIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBBc3RCdWlsZGVyLAotICAgKiByZXR1cm4gYSBsaXN0IG9mIHRoZSBhbmFseXplciBjb2RlcyB0aGF0IGFyZSB0cmFuc2xhdGVkIGJ5IHRoZSBidWlsZGVyLgotICAgKi8KKyAgLy8vIEdpdmVuIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBBc3RCdWlsZGVyLAorICAvLy8gcmV0dXJuIGEgbGlzdCBvZiB0aGUgYW5hbHl6ZXIgY29kZXMgdGhhdCBhcmUgdHJhbnNsYXRlZCBieSB0aGUgYnVpbGRlci4KICAgTGlzdDxTdHJpbmc+IGdldFRyYW5zbGF0ZWRDb2RlcyhTdHJpbmcgYXN0QnVpbGRlclBhdGgpIHsKICAgICBTdHJpbmcgY29udGVudCA9IGlvLkZpbGUoYXN0QnVpbGRlclBhdGgpLnJlYWRBc1N0cmluZ1N5bmMoKTsKICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IHBhcnNlQ29tcGlsYXRpb25Vbml0KGNvbnRlbnQpOwpAQCAtMTkwLDE1ICsxODIsMTEgQEAKICAgfQogfQogCi0vKioKLSAqIEEgdmlzaXRvciB0aGF0IGdhdGhlcnMgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZSBjb2RlcyB0aGF0IGFyZSBnZW5lcmF0ZWQKLSAqIGluIHRoZSB2aXNpdGVkIEFTVC4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNvZGVzIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIHByZWZpeAotICogJ2Zhc3RhJy4KLSAqLworLy8vIEEgdmlzaXRvciB0aGF0IGdhdGhlcnMgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZSBjb2RlcyB0aGF0IGFyZSBnZW5lcmF0ZWQKKy8vLyBpbiB0aGUgdmlzaXRlZCBBU1QuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjb2RlcyBhcmUgYWNjZXNzZWQgdmlhIHRoZSBwcmVmaXgKKy8vLyAnZmFzdGEnLgogY2xhc3MgR2VuZXJhdGVkQ29kZXNWaXNpdG9yIGV4dGVuZHMgUmVjdXJzaXZlQXN0VmlzaXRvciB7Ci0gIC8qKgotICAgKiBUaGUgbmFtZXMgb2YgdGhlIG1lc3NhZ2UgY29kZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGluIHRoZSB2aXNpdGVkIEFTVC4KLSAgICovCisgIC8vLyBUaGUgbmFtZXMgb2YgdGhlIG1lc3NhZ2UgY29kZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGluIHRoZSB2aXNpdGVkIEFTVC4KICAgU2V0PFN0cmluZz4gZ2VuZXJhdGVkTmFtZXMgPSA8U3RyaW5nPnt9OwogCiAgIEBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L2NvZGVfb3JkZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L2NvZGVfb3JkZXJfdGVzdC5kYXJ0CmluZGV4IDA5NThmNzguLjc4YTI0NTIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9jb2RlX29yZGVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvY29kZV9vcmRlcl90ZXN0LmRhcnQKQEAgLTE5LDEwICsxOSw4IEBACiAgIH0pOwogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRoZSBjbGF1c2VzIGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYXJlCi0gKiBvdXQgb2Ygb3JkZXIuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGUgY2xhdXNlcyBpbiBhIGNsYXNzIGRlY2xhcmF0aW9uCisvLy8gYXJlIG91dCBvZiBvcmRlci4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQ2xhc3NEZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9pbXBsZW1lbnRzQmVmb3JlRXh0ZW5kcygpIHsKQEAgLTEwNiwxMCArMTA0LDggQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRoZSBtZW1iZXJzIG9mIGEgY29tcGlsYXRpb24gdW5pdCBhcmUKLSAqIG91dCBvZiBvcmRlci4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRoZSBtZW1iZXJzIG9mIGEgY29tcGlsYXRpb24gdW5pdCBhcmUKKy8vLyBvdXQgb2Ygb3JkZXIuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIENvbXBpbGF0aW9uVW5pdE1lbWJlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9kZWNsYXJhdGlvbkJlZm9yZURpcmVjdGl2ZV9leHBvcnQoKSB7CkBAIC0yMTQsMTAgKzIxMCw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGUgbWVtYmVycyBvZiBhbiBpbXBvcnQgZGlyZWN0aXZlIGFyZQotICogb3V0IG9mIG9yZGVyLgotICovCisvLy8gVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gdGhlIG1lbWJlcnMgb2YgYW4gaW1wb3J0IGRpcmVjdGl2ZQorLy8vIGFyZSBvdXQgb2Ygb3JkZXIuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIEltcG9ydERpcmVjdGl2ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9jb21iaW5hdG9yc0JlZm9yZUFuZEFmdGVyUHJlZml4KCkgewpAQCAtMjk5LDkgKzI5Myw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBtZXRhZGF0YSBhcHBlYXJzIGluIGludmFsaWQgcGxhY2VzLgotICovCisvLy8gVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gbWV0YWRhdGEgYXBwZWFycyBpbiBpbnZhbGlkIHBsYWNlcy4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgTWlzcGxhY2VkTWV0YWRhdGFUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICBAZmFpbGluZ1Rlc3QKQEAgLTMyNywxMCArMzE5LDggQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRoZSBjbGF1c2VzIGluIGEgbWl4aW4gZGVjbGFyYXRpb24gYXJlCi0gKiBvdXQgb2Ygb3JkZXIuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGUgY2xhdXNlcyBpbiBhIG1peGluIGRlY2xhcmF0aW9uCisvLy8gYXJlIG91dCBvZiBvcmRlci4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgTWl4aW5EZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9pbXBsZW1lbnRzQmVmb3JlT24oKSB7CkBAIC0zNzksMTAgKzM2OSw4IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGUgY2xhdXNlcyBpbiBhIHRyeSBzdGF0ZW1lbnQgYXJlCi0gKiBvdXQgb2Ygb3JkZXIuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGUgY2xhdXNlcyBpbiBhIHRyeSBzdGF0ZW1lbnQgYXJlCisvLy8gb3V0IG9mIG9yZGVyLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBUcnlTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICBAZmFpbGluZ1Rlc3QKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9leHRyYV9jb2RlX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9leHRyYV9jb2RlX3Rlc3QuZGFydAppbmRleCBlMTg5ZDJjLi5jMWI0OTJiIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvZXh0cmFfY29kZV90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L2V4dHJhX2NvZGVfdGVzdC5kYXJ0CkBAIC0yMSwxMCArMjEsOCBAQAogICB9KTsKIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBhbm5vdGF0aW9ucyBhcmUgaW5jbHVkZWQgaW4gcGxhY2VzCi0gKiB3aGVyZSB0aGV5IGFyZSBub3QgYWxsb3dlZC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIGFubm90YXRpb25zIGFyZSBpbmNsdWRlZCBpbiBwbGFjZXMKKy8vLyB3aGVyZSB0aGV5IGFyZSBub3QgYWxsb3dlZC4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQW5ub3RhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF90eXBlQXJndW1lbnQoKSB7CkBAIC00NCw5ICs0Miw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgaW4gb3RoZXIgY2FzZXMuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgaW4gb3RoZXIgY2FzZXMuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIE1pc2NlbGxhbmVvdXNUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICB2b2lkIHRlc3RfY2xhc3NUeXBlQWxpYXNfd2l0aEJvZHkoKSB7CkBAIC0xNTMsOSArMTQ5LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIGV4dHJhIG1vZGlmaWVycyBhcmUgcHJvdmlkZWQuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBleHRyYSBtb2RpZmllcnMgYXJlIHByb3ZpZGVkLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBNb2RpZmllcnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICBAZmFpbGluZ1Rlc3QKQEAgLTIwMCwxMCArMTk0LDggQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIG11bHRpcGxlIHR5cGUgYW5ub3RhdGlvbnMgYXJlCi0gKiBwcm92aWRlZC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIG11bHRpcGxlIHR5cGUgYW5ub3RhdGlvbnMgYXJlCisvLy8gcHJvdmlkZWQuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIE11bHRpcGxlVHlwZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIEBmYWlsaW5nVGVzdApAQCAtMjE5LDkgKzIxMSw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGVyZSBpcyBleHRyYSBwdW5jdHVhdGlvbi4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRoZXJlIGlzIGV4dHJhIHB1bmN0dWF0aW9uLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBQdW5jdHVhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIEBmYWlsaW5nVGVzdApAQCAtMzEwLDkgKzMwMCw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGVyZSBpcyBleHRyYSB2YXJpYW5jZSBtb2RpZmllcnMuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0aGVyZSBpcyBleHRyYSB2YXJpYW5jZSBtb2RpZmllcnMuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIFZhcmlhbmNlTW9kaWZpZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICB2b2lkIHRlc3RfZXh0cmFNb2RpZmllcl9pbkNsYXNzKCkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L21pc3NpbmdfY29kZV90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvbWlzc2luZ19jb2RlX3Rlc3QuZGFydAppbmRleCBiYTNhZTM4Li4zNDVlM2YyIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvbWlzc2luZ19jb2RlX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvbWlzc2luZ19jb2RlX3Rlc3QuZGFydApAQCAtMTgsOSArMTgsNyBAQAogICB9KTsKIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0b2tlbnMgYXJlIG1pc3NpbmcgaW4gYSBsaXN0IGxpdGVyYWwuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0b2tlbnMgYXJlIG1pc3NpbmcgaW4gYSBsaXN0IGxpdGVyYWwuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIExpc3RMaXRlcmFsVGVzdCBleHRlbmRzIEFic3RyYWN0UmVjb3ZlcnlUZXN0IHsKICAgdm9pZCB0ZXN0X2V4dHJhQ29tbWEoKSB7CkBAIC01Niw5ICs1NCw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiB0b2tlbnMgYXJlIG1pc3NpbmcgaW4gYSBtYXAgbGl0ZXJhbC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRva2VucyBhcmUgbWlzc2luZyBpbiBhIG1hcCBsaXRlcmFsLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBNYXBMaXRlcmFsVGVzdCBleHRlbmRzIEFic3RyYWN0UmVjb3ZlcnlUZXN0IHsKICAgZmluYWwgYmVmb3JlVWlBc0NvZGUgPSBGZWF0dXJlU2V0LmZvclRlc3Rpbmcoc2RrVmVyc2lvbjogJzIuMi4wJyk7CkBAIC0xMzIsOSArMTI4LDcgQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIG5vbi1wYWlyZWQgdG9rZW5zIGFyZSBtaXNzaW5nLgotICovCisvLy8gVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gbm9uLXBhaXJlZCB0b2tlbnMgYXJlIG1pc3NpbmcuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIE1pc3NpbmdDb2RlVGVzdCBleHRlbmRzIEFic3RyYWN0UmVjb3ZlcnlUZXN0IHsKICAgdm9pZCB0ZXN0X2FtcGVyc2FuZCgpIHsKQEAgLTUzOSwxMCArNTMzLDggQEAKICAgfQogfQogCi0vKioKLSAqIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRva2VucyBhcmUgbWlzc2luZyBpbiBhIHBhcmFtZXRlcgotICogbGlzdC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRva2VucyBhcmUgbWlzc2luZyBpbiBhIHBhcmFtZXRlcgorLy8vIGxpc3QuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIFBhcmFtZXRlckxpc3RUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICBAZmFpbGluZ1Rlc3QKQEAgLTgwNCw5ICs3OTYsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gdG9rZW5zIGFyZSBtaXNzaW5nIGluIGEgdHlwZWRlZi4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHRva2VucyBhcmUgbWlzc2luZyBpbiBhIHR5cGVkZWYuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIFR5cGVkZWZUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewogICBAZmFpbGluZ1Rlc3QKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9wYWlyZWRfdG9rZW5zX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9wYWlyZWRfdG9rZW5zX3Rlc3QuZGFydAppbmRleCAwYTIwMmVkLi42MGIwMTgzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvcGFpcmVkX3Rva2Vuc190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L3BhaXJlZF90b2tlbnNfdGVzdC5kYXJ0CkBAIC0xNywxMCArMTcsOCBAQAogICB9KTsKIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBhbmdsZSBicmFja2V0cyAoYDxgIGFuZCBgPmApIGFyZQotICogbWlzbWF0Y2hlZC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIGFuZ2xlIGJyYWNrZXRzIChgPGAgYW5kIGA+YCkgYXJlCisvLy8gbWlzbWF0Y2hlZC4KIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgQW5nbGVCcmFja2V0c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIEBmYWlsaW5nVGVzdApAQCAtMTYwLDkgKzE1OCw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBjdXJseSBicmFjZXMgYXJlIG1pc21hdGNoZWQuCi0gKi8KKy8vLyBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBjdXJseSBicmFjZXMgYXJlIG1pc21hdGNoZWQuCiBAcmVmbGVjdGl2ZVRlc3QKIGNsYXNzIEJyYWNlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9zdGF0ZW1lbnRfaWZfbGFzdCgpIHsKQEAgLTIzOCw5ICsyMzQsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gc3F1YXJlIGJyYWNrZXRzIGFyZSBtaXNtYXRjaGVkLgotICovCisvLy8gVGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIHdoZW4gc3F1YXJlIGJyYWNrZXRzIGFyZSBtaXNtYXRjaGVkLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBCcmFja2V0c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIHZvaWQgdGVzdF9pbmRleE9wZXJhdG9yKCkgewpAQCAtMjk0LDkgKzI4OCw3IEBACiAgIH0KIH0KIAotLyoqCi0gKiBUZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgd2hlbiBwYXJlbnRoZXNlcyBhcmUgbWlzbWF0Y2hlZC4KLSAqLworLy8vIFRlc3QgaG93IHdlbGwgdGhlIHBhcnNlciByZWNvdmVycyB3aGVuIHBhcmVudGhlc2VzIGFyZSBtaXNtYXRjaGVkLgogQHJlZmxlY3RpdmVUZXN0CiBjbGFzcyBQYXJlbnRoZXNlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCB7CiAgIEBmYWlsaW5nVGVzdApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L3BhcnRpYWxfY29kZS9wYXJ0aWFsX2NvZGVfc3VwcG9ydC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L3BhcnRpYWxfY29kZS9wYXJ0aWFsX2NvZGVfc3VwcG9ydC5kYXJ0CmluZGV4IDkxYjRjYzQuLjliMzU3YjQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9wYXJ0aWFsX2NvZGUvcGFydGlhbF9jb2RlX3N1cHBvcnQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvcGFydGlhbF9jb2RlL3BhcnRpYWxfY29kZV9zdXBwb3J0LmRhcnQKQEAgLTE0LDIzICsxNCwxOSBAQAogdHlwZWRlZiBBZGp1c3RWYWxpZFVuaXRCZWZvcmVDb21wYXJpc29uID0gQ29tcGlsYXRpb25Vbml0IEZ1bmN0aW9uKAogICAgIENvbXBpbGF0aW9uVW5pdCB1bml0KTsKIAotLyoqCi0gKiBBIGJhc2UgY2xhc3MgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIHRlc3RzIHRoYXQgdGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyCi0gKiByZWNvdmVycyB3aGVuIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGFuIGluY29tcGxldGUgKGJ1dCBvdGhlcndpc2UgY29ycmVjdCkKLSAqIGNvbnN0cnVjdCAoc3VjaCBhcyBhIHRvcC1sZXZlbCBkZWNsYXJhdGlvbiwgY2xhc3MgbWVtYmVyLCBvciBzdGF0ZW1lbnQpLgotICoKLSAqIEJlY2F1c2UgdXNlcnMgb2Z0ZW4gYWRkIG5ldyBjb25zdHJ1Y3RzIGJldHdlZW4gdHdvIGV4aXN0aW5nIGNvbnN0cnVjdHMsIHRoZXNlCi0gKiB0ZXN0cyBlZmZlY3RpdmVseSB0ZXN0IHdoZXRoZXIgdGhlIHBhcnNlciBpcyBhYmxlIHRvIHJlY29nbml6ZSB3aGVyZSB0aGUKLSAqIHBhcnRpYWxseSBlbnRlcmVkIGNvbnN0cnVjdCBlbmRzIGFuZCB3aGVyZSB0aGUgbmV4dCBmdWxseSBlbnRlcmVkIGNvbnN0cnVjdAotICogYmVnaW5zLiAoVGhlIHByZWNlZGluZyBjb25zdHJ1Y3QgaXMgaXJyZWxldmFudC4pIEdpdmVuIHRoZSBsYXJnZSBudW1iZXIgb2YKLSAqIGZvbGxvd2luZyBjb25zdHJ1Y3RzIHRoZSBhcmUgdmFsaWQgaW4gbW9zdCBjb250ZXh0cywgdGhlc2UgdGVzdHMgYXJlIGRlc2lnbmVkCi0gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlIHRlc3RzIGJhc2VkIG9uIGEgbGlzdCBvZiBwb3NzaWJsZSBmb2xsb3dpbmcKLSAqIGNvbnN0cnVjdHMuCi0gKi8KKy8vLyBBIGJhc2UgY2xhc3MgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIHRlc3RzIHRoYXQgdGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyCisvLy8gcmVjb3ZlcnMgd2hlbiB0aGUgdXNlciBoYXMgZW50ZXJlZCBhbiBpbmNvbXBsZXRlIChidXQgb3RoZXJ3aXNlIGNvcnJlY3QpCisvLy8gY29uc3RydWN0IChzdWNoIGFzIGEgdG9wLWxldmVsIGRlY2xhcmF0aW9uLCBjbGFzcyBtZW1iZXIsIG9yIHN0YXRlbWVudCkuCisvLy8KKy8vLyBCZWNhdXNlIHVzZXJzIG9mdGVuIGFkZCBuZXcgY29uc3RydWN0cyBiZXR3ZWVuIHR3byBleGlzdGluZyBjb25zdHJ1Y3RzLAorLy8vIHRoZXNlIHRlc3RzIGVmZmVjdGl2ZWx5IHRlc3Qgd2hldGhlciB0aGUgcGFyc2VyIGlzIGFibGUgdG8gcmVjb2duaXplIHdoZXJlCisvLy8gdGhlIHBhcnRpYWxseSBlbnRlcmVkIGNvbnN0cnVjdCBlbmRzIGFuZCB3aGVyZSB0aGUgbmV4dCBmdWxseSBlbnRlcmVkCisvLy8gY29uc3RydWN0IGJlZ2lucy4gKFRoZSBwcmVjZWRpbmcgY29uc3RydWN0IGlzIGlycmVsZXZhbnQuKSBHaXZlbiB0aGUgbGFyZ2UKKy8vLyBudW1iZXIgb2YgZm9sbG93aW5nIGNvbnN0cnVjdHMgdGhlIGFyZSB2YWxpZCBpbiBtb3N0IGNvbnRleHRzLCB0aGVzZSB0ZXN0cworLy8vIGFyZSBkZXNpZ25lZCB0byBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlIHRlc3RzIGJhc2VkIG9uIGEgbGlzdCBvZiBwb3NzaWJsZQorLy8vIGZvbGxvd2luZyBjb25zdHJ1Y3RzLgogYWJzdHJhY3QgY2xhc3MgUGFydGlhbENvZGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWNvdmVyeVRlc3QgewotICAvKioKLSAgICogQSBsaXN0IG9mIHN1ZmZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdHMgb2YgY2xhc3MgbWVtYmVycy4KLSAgICovCisgIC8vLyBBIGxpc3Qgb2Ygc3VmZml4ZXMgdGhhdCBjYW4gYmUgdXNlZCBieSB0ZXN0cyBvZiBjbGFzcyBtZW1iZXJzLgogICBzdGF0aWMgZmluYWwgTGlzdDxUZXN0U3VmZml4PiBjbGFzc01lbWJlclN1ZmZpeGVzID0gPFRlc3RTdWZmaXg+WwogICAgIFRlc3RTdWZmaXgoJ2Fubm90YXRpb24nLCAnQGFubm90YXRpb24gdmFyIGY7JyksCiAgICAgVGVzdFN1ZmZpeCgnZmllbGQnLCAndmFyIGY7JyksCkBAIC00MiwxMCArMzgsOCBAQAogICAgIFRlc3RTdWZmaXgoJ3NldHRlcicsICdzZXQgYShiKSB7fScpCiAgIF07CiAKLSAgLyoqCi0gICAqIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHRvcC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQKLSAgICogY2FuIHZhbGlkbHkgYmUgZm9sbG93ZWQgYnkgYW55IGRlY2xhcmF0aW9uLgotICAgKi8KKyAgLy8vIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHRvcC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQKKyAgLy8vIGNhbiB2YWxpZGx5IGJlIGZvbGxvd2VkIGJ5IGFueSBkZWNsYXJhdGlvbi4KICAgc3RhdGljIGZpbmFsIExpc3Q8VGVzdFN1ZmZpeD4gZGVjbGFyYXRpb25TdWZmaXhlcyA9IDxUZXN0U3VmZml4PlsKICAgICBUZXN0U3VmZml4KCdjbGFzcycsICdjbGFzcyBBIHt9JyksCiAgICAgVGVzdFN1ZmZpeCgnZW51bScsICdlbnVtIEUgeyB2IH0nKSwKQEAgLTYxLDI5ICs1NSwyMyBAQAogICAgIFRlc3RTdWZmaXgoJ3NldHRlcicsICdzZXQgYShiKSB7fScpCiAgIF07CiAKLSAgLyoqCi0gICAqIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHRvcC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQKLSAgICogY2FuIHZhbGlkbHkgYmUgZm9sbG93ZWQgYnkgYW55dGhpbmcgdGhhdCBpcyB2YWxpZCBhZnRlciBhIHBhcnQgZGlyZWN0aXZlLgotICAgKi8KKyAgLy8vIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHRvcC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQKKyAgLy8vIGNhbiB2YWxpZGx5IGJlIGZvbGxvd2VkIGJ5IGFueXRoaW5nIHRoYXQgaXMgdmFsaWQgYWZ0ZXIgYSBwYXJ0IGRpcmVjdGl2ZS4KICAgc3RhdGljIGZpbmFsIExpc3Q8VGVzdFN1ZmZpeD4gcG9zdFBhcnRTdWZmaXhlcyA9IDxUZXN0U3VmZml4PlsKICAgICBUZXN0U3VmZml4KCdwYXJ0JywgInBhcnQgJ2EuZGFydCc7IiksCiAgICAgLi4uZGVjbGFyYXRpb25TdWZmaXhlcwogICBdOwogCi0gIC8qKgotICAgKiBBIGxpc3Qgb2Ygc3VmZml4ZXMgdGhhdCBjYW4gYmUgdXNlZCBieSB0ZXN0cyBvZiB0b3AtbGV2ZWwgY29uc3RydWN0cyB0aGF0Ci0gICAqIGNhbiB2YWxpZGx5IGJlIGZvbGxvd2VkIGJ5IGFueSBkaXJlY3RpdmUgb3IgZGVjbGFyYXRpb24gb3RoZXIgdGhhbiBhCi0gICAqIGxpYnJhcnkgZGlyZWN0aXZlLgotICAgKi8KKyAgLy8vIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHRvcC1sZXZlbCBjb25zdHJ1Y3RzIHRoYXQKKyAgLy8vIGNhbiB2YWxpZGx5IGJlIGZvbGxvd2VkIGJ5IGFueSBkaXJlY3RpdmUgb3IgZGVjbGFyYXRpb24gb3RoZXIgdGhhbiBhCisgIC8vLyBsaWJyYXJ5IGRpcmVjdGl2ZS4KICAgc3RhdGljIGZpbmFsIExpc3Q8VGVzdFN1ZmZpeD4gcHJlUGFydFN1ZmZpeGVzID0gPFRlc3RTdWZmaXg+WwogICAgIFRlc3RTdWZmaXgoJ2ltcG9ydCcsICJpbXBvcnQgJ2EuZGFydCc7IiksCiAgICAgVGVzdFN1ZmZpeCgnZXhwb3J0JywgImV4cG9ydCAnYS5kYXJ0JzsiKSwKICAgICAuLi5wb3N0UGFydFN1ZmZpeGVzCiAgIF07CiAKLSAgLyoqCi0gICAqIEEgbGlzdCBvZiBzdWZmaXhlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3RzIG9mIHN0YXRlbWVudHMuCi0gICAqLworICAvLy8gQSBsaXN0IG9mIHN1ZmZpeGVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdHMgb2Ygc3RhdGVtZW50cy4KICAgc3RhdGljIGZpbmFsIExpc3Q8VGVzdFN1ZmZpeD4gc3RhdGVtZW50U3VmZml4ZXMgPSA8VGVzdFN1ZmZpeD5bCiAgICAgVGVzdFN1ZmZpeCgnYXNzZXJ0JywgImFzc2VydCAodHJ1ZSk7IiksCiAgICAgVGVzdFN1ZmZpeCgnYmxvY2snLCAie30iKSwKQEAgLTEwMiwxNCArOTAsMTIgQEAKICAgICBUZXN0U3VmZml4KCd3aGlsZScsICJ3aGlsZSAodHJ1ZSkge30iKSwKICAgXTsKIAotICAvKioKLSAgICogQnVpbGQgYSBncm91cCBvZiB0ZXN0cyB3aXRoIHRoZSBnaXZlbiBbZ3JvdXBOYW1lXS4gVGhlcmUgd2lsbCBiZSBvbmUgdGVzdAotICAgKiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2YgZWxlbWVudHMgaW4gdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhlIGxpc3RzIG9mCi0gICAqIFtkZXNjcmlwdG9yc10gYW5kIFtzdWZmaXhlc10sIGFuZCBvbmUgYWRkaXRpb25hbCB0ZXN0IGZvciBldmVyeSBkZXNjcmlwdG9yCi0gICAqIHdoZXJlIHRoZSBzdWZmaXggaXMgdGhlIGVtcHR5IHN0cmluZyAodG8gdGVzdCBwYXJ0aWFsIGRlY2xhcmF0aW9ucyBhdCB0aGUKLSAgICogZW5kIG9mIHRoZSBmaWxlKS4gSW4gdG90YWwsIHRoZXJlIHdpbGwgYmUKLSAgICogYGRlc2NyaXB0b3JzLmxlbmd0aCAqIChzdWZmaXhlcy5sZW5ndGggKyAxKWAgdGVzdHMgZ2VuZXJhdGVkLgotICAgKi8KKyAgLy8vIEJ1aWxkIGEgZ3JvdXAgb2YgdGVzdHMgd2l0aCB0aGUgZ2l2ZW4gW2dyb3VwTmFtZV0uIFRoZXJlIHdpbGwgYmUgb25lIHRlc3QKKyAgLy8vIGZvciBldmVyeSBjb21iaW5hdGlvbiBvZiBlbGVtZW50cyBpbiB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0aGUgbGlzdHMgb2YKKyAgLy8vIFtkZXNjcmlwdG9yc10gYW5kIFtzdWZmaXhlc10sIGFuZCBvbmUgYWRkaXRpb25hbCB0ZXN0IGZvciBldmVyeSBkZXNjcmlwdG9yCisgIC8vLyB3aGVyZSB0aGUgc3VmZml4IGlzIHRoZSBlbXB0eSBzdHJpbmcgKHRvIHRlc3QgcGFydGlhbCBkZWNsYXJhdGlvbnMgYXQgdGhlCisgIC8vLyBlbmQgb2YgdGhlIGZpbGUpLiBJbiB0b3RhbCwgdGhlcmUgd2lsbCBiZQorICAvLy8gYGRlc2NyaXB0b3JzLmxlbmd0aCAqIChzdWZmaXhlcy5sZW5ndGggKyAxKWAgdGVzdHMgZ2VuZXJhdGVkLgogICBidWlsZFRlc3RzKFN0cmluZyBncm91cE5hbWUsIExpc3Q8VGVzdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzLAogICAgICAgTGlzdDxUZXN0U3VmZml4PiBzdWZmaXhlcywKICAgICAgIHtGZWF0dXJlU2V0IGZlYXR1cmVTZXQsCkBAIC0xNDQsOSArMTMwLDcgQEAKICAgICB9KTsKICAgfQogCi0gIC8qKgotICAgKiBCdWlsZCBhIHNpbmdsZSB0ZXN0IGJhc2VkIG9uIHRoZSBnaXZlbiBbZGVzY3JpcHRvcl0gYW5kIFtzdWZmaXhdLgotICAgKi8KKyAgLy8vIEJ1aWxkIGEgc2luZ2xlIHRlc3QgYmFzZWQgb24gdGhlIGdpdmVuIFtkZXNjcmlwdG9yXSBhbmQgW3N1ZmZpeF0uCiAgIF9idWlsZFRlc3RGb3JEZXNjcmlwdG9yQW5kU3VmZml4KFRlc3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFRlc3RTdWZmaXggc3VmZml4LAogICAgICAgaW50IHN1ZmZpeEluZGV4LCBTdHJpbmcgaGVhZCwgU3RyaW5nIHRhaWwsCiAgICAgICB7RmVhdHVyZVNldCBmZWF0dXJlU2V0fSkgewpAQCAtMjM2LDU2ICsyMjAsMzYgQEAKICAgfQogfQogCi0vKioKLSAqIEEgZGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgdGVzdHMgdGhhdCBhcmUgdG8gYmUgYnVpbHQuCi0gKi8KKy8vLyBBIGRlc2NyaXB0aW9uIG9mIGEgc2V0IG9mIHRlc3RzIHRoYXQgYXJlIHRvIGJlIGJ1aWx0LgogY2xhc3MgVGVzdERlc2NyaXB0b3IgewotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIHRlc3QuCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHRlc3QuCiAgIGZpbmFsIFN0cmluZyBuYW1lOwogCi0gIC8qKgotICAgKiBJbnZhbGlkIGNvZGUgdGhhdCB0aGUgcGFyc2VyIGlzIGV4cGVjdGVkIHRvIHJlY292ZXIgZnJvbS4KLSAgICovCisgIC8vLyBJbnZhbGlkIGNvZGUgdGhhdCB0aGUgcGFyc2VyIGlzIGV4cGVjdGVkIHRvIHJlY292ZXIgZnJvbS4KICAgZmluYWwgU3RyaW5nIGludmFsaWQ7CiAKLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIHRoYXQgdGhlIHBhcnNlciBpcyBleHBlY3RlZCB0byBwcm9kdWNlLgotICAgKi8KKyAgLy8vIEVycm9yIGNvZGVzIHRoYXQgdGhlIHBhcnNlciBpcyBleHBlY3RlZCB0byBwcm9kdWNlLgogICBmaW5hbCBMaXN0PEVycm9yQ29kZT4gZXJyb3JDb2RlczsKIAotICAvKioKLSAgICogVmFsaWQgY29kZSB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gd2hhdCB0aGUgcGFyc2VyIHNob3VsZCBwcm9kdWNlIGFzIHBhcnQgb2YKLSAgICogcmVjb3ZlcmluZyBmcm9tIHRoZSBpbnZhbGlkIGNvZGUuCi0gICAqLworICAvLy8gVmFsaWQgY29kZSB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gd2hhdCB0aGUgcGFyc2VyIHNob3VsZCBwcm9kdWNlIGFzIHBhcnQgb2YKKyAgLy8vIHJlY292ZXJpbmcgZnJvbSB0aGUgaW52YWxpZCBjb2RlLgogICBmaW5hbCBTdHJpbmcgdmFsaWQ7CiAKLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIHRoYXQgdGhlIHBhcnNlciBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGluIHRoZSB2YWxpZCBjb2RlLgotICAgKi8KKyAgLy8vIEVycm9yIGNvZGVzIHRoYXQgdGhlIHBhcnNlciBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGluIHRoZSB2YWxpZCBjb2RlLgogICBmaW5hbCBMaXN0PEVycm9yQ29kZT4gZXhwZWN0ZWRFcnJvcnNJblZhbGlkQ29kZTsKIAotICAvKioKLSAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhbGwgb2YgdGhlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsLgotICAgKi8KKyAgLy8vIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIG9mIHRoZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbC4KICAgZmluYWwgYm9vbCBhbGxGYWlsaW5nOwogCi0gIC8qKgotICAgKiBBIGxpc3QgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIHN1ZmZpeGVzIGZvciB3aGljaCB0aGUgdGVzdCBpcyBleHBlY3RlZAotICAgKiB0byBmYWlsLgotICAgKi8KKyAgLy8vIEEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc3VmZml4ZXMgZm9yIHdoaWNoIHRoZSB0ZXN0IGlzIGV4cGVjdGVkCisgIC8vLyB0byBmYWlsLgogICBmaW5hbCBMaXN0PFN0cmluZz4gZmFpbGluZzsKIAotICAvKioKLSAgICogQSBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSB2YWxpZCBjb21waWxhdGlvbiB1bml0IGJlZm9yZSBpdCBpcyBjb21wYXJlZAotICAgKiB3aXRoIHRoZSBpbnZhbGlkIGNvbXBpbGF0aW9uIHVuaXQsIG9yIGBudWxsYCBpZiBubyBtb2RpZmljYXRpb24gbmVlZGVkLgotICAgKi8KKyAgLy8vIEEgZnVuY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgdmFsaWQgY29tcGlsYXRpb24gdW5pdCBiZWZvcmUgaXQgaXMgY29tcGFyZWQKKyAgLy8vIHdpdGggdGhlIGludmFsaWQgY29tcGlsYXRpb24gdW5pdCwgb3IgYG51bGxgIGlmIG5vIG1vZGlmaWNhdGlvbiBuZWVkZWQuCiAgIEFkanVzdFZhbGlkVW5pdEJlZm9yZUNvbXBhcmlzb24gYWRqdXN0VmFsaWRVbml0QmVmb3JlQ29tcGFyaXNvbjsKIAotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgdGVzdCBkZXNjcmlwdG9yLgotICAgKi8KKyAgLy8vIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHRlc3QgZGVzY3JpcHRvci4KICAgVGVzdERlc2NyaXB0b3IodGhpcy5uYW1lLCB0aGlzLmludmFsaWQsIHRoaXMuZXJyb3JDb2RlcywgdGhpcy52YWxpZCwKICAgICAgIHt0aGlzLmFsbEZhaWxpbmcgPSBmYWxzZSwKICAgICAgIHRoaXMuZmFpbGluZywKQEAgLTI5MywyNCArMjU3LDE2IEBACiAgICAgICB0aGlzLmFkanVzdFZhbGlkVW5pdEJlZm9yZUNvbXBhcmlzb259KTsKIH0KIAotLyoqCi0gKiBBIGRlc2NyaXB0aW9uIG9mIGEgc2V0IG9mIHN1ZmZpeGVzIHRoYXQgYXJlIHRvIGJlIHVzZWQgdG8gY29uc3RydWN0IHRlc3RzLgotICovCisvLy8gQSBkZXNjcmlwdGlvbiBvZiBhIHNldCBvZiBzdWZmaXhlcyB0aGF0IGFyZSB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCB0ZXN0cy4KIGNsYXNzIFRlc3RTdWZmaXggewogICBzdGF0aWMgZmluYWwgVGVzdFN1ZmZpeCBlb2YgPSBUZXN0U3VmZml4KCdlb2YnLCAnJyk7CiAKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBzdWZmaXguCi0gICAqLworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHN1ZmZpeC4KICAgZmluYWwgU3RyaW5nIG5hbWU7CiAKLSAgLyoqCi0gICAqIFRoZSBjb2RlIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSB0ZXN0IGNvZGUuCi0gICAqLworICAvLy8gVGhlIGNvZGUgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHRlc3QgY29kZS4KICAgZmluYWwgU3RyaW5nIHRleHQ7CiAKLSAgLyoqCi0gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHN1ZmZpeC4KLSAgICovCisgIC8vLyBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzdWZmaXguCiAgIFRlc3RTdWZmaXgodGhpcy5uYW1lLCB0aGlzLnRleHQpOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L3JlY292ZXJ5X3Rlc3Rfc3VwcG9ydC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL2Zhc3RhL3JlY292ZXJ5L3JlY292ZXJ5X3Rlc3Rfc3VwcG9ydC5kYXJ0CmluZGV4IDdlMjY0NTEuLmIwMGYzNzcgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9mYXN0YS9yZWNvdmVyeS9yZWNvdmVyeV90ZXN0X3N1cHBvcnQuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvZmFzdGEvcmVjb3ZlcnkvcmVjb3ZlcnlfdGVzdF9zdXBwb3J0LmRhcnQKQEAgLTEyLDEwICsxMiw4IEBACiBpbXBvcnQgJy4uLy4uLy4uL2dlbmVyYXRlZC9wYXJzZXJfZmFzdGFfdGVzdC5kYXJ0JzsKIGltcG9ydCAnLi4vLi4vLi4vZ2VuZXJhdGVkL3Rlc3Rfc3VwcG9ydC5kYXJ0JzsKIAotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGVzdHMgdGhhdCB0ZXN0IGhvdyB3ZWxsIHRoZSBwYXJzZXIgcmVjb3ZlcnMgZnJvbSB2YXJpb3VzCi0gKiBzeW50YWN0aWMgZXJyb3JzLgotICovCisvLy8gVGhlIGJhc2UgY2xhc3MgZm9yIHRlc3RzIHRoYXQgdGVzdCBob3cgd2VsbCB0aGUgcGFyc2VyIHJlY292ZXJzIGZyb20gdmFyaW91cworLy8vIHN5bnRhY3RpYyBlcnJvcnMuCiBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlY292ZXJ5VGVzdCBleHRlbmRzIEZhc3RhUGFyc2VyVGVzdENhc2UgewogICB2b2lkIHRlc3RSZWNvdmVyeSgKICAgICAgIFN0cmluZyBpbnZhbGlkQ29kZSwgTGlzdDxFcnJvckNvZGU+IGVycm9yQ29kZXMsIFN0cmluZyB2YWxpZENvZGUsCkBAIC03MSwxMCArNjksOCBAQAogICB9CiB9CiAKLS8qKgotICogQW4gb2JqZWN0IHVzZWQgdG8gY29tcGFyZSB0byBBU1Qgc3RydWN0dXJlcyBhbmQgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbCBpZgotICogdGhleSBkaWZmZXIgaW4gYW55IGltcG9ydGFudCB3YXlzLgotICovCisvLy8gQW4gb2JqZWN0IHVzZWQgdG8gY29tcGFyZSB0byBBU1Qgc3RydWN0dXJlcyBhbmQgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbCBpZgorLy8vIHRoZXkgZGlmZmVyIGluIGFueSBpbXBvcnRhbnQgd2F5cy4KIGNsYXNzIFJlc3VsdENvbXBhcmF0b3IgZXh0ZW5kcyBBc3RDb21wYXJhdG9yIHsKICAgQG92ZXJyaWRlCiAgIGJvb2wgZmFpbERpZmZlcmVudExlbmd0aChMaXN0IGZpcnN0LCBMaXN0IHNlY29uZCkgewpAQCAtMTI4LDEwICsxMjQsOCBAQAogICAgIGZhaWwoYnVmZmVyLnRvU3RyaW5nKCkpOwogICB9CiAKLSAgLyoqCi0gICAqIE92ZXJyaWRkZW4gdG8gYWxsb3cgdGhlIHZhbGlkIGNvZGUgdG8gY29udGFpbiBhbiBleHBsaWNpdCBpZGVudGlmaWVyIHdoZXJlCi0gICAqIGEgc3ludGhldGljIGlkZW50aWZpZXIgaXMgZXhwZWN0ZWQgdG8gYmUgaW5zZXJ0ZWQgYnkgcmVjb3ZlcnkuCi0gICAqLworICAvLy8gT3ZlcnJpZGRlbiB0byBhbGxvdyB0aGUgdmFsaWQgY29kZSB0byBjb250YWluIGFuIGV4cGxpY2l0IGlkZW50aWZpZXIgd2hlcmUKKyAgLy8vIGEgc3ludGhldGljIGlkZW50aWZpZXIgaXMgZXhwZWN0ZWQgdG8gYmUgaW5zZXJ0ZWQgYnkgcmVjb3ZlcnkuCiAgIEBvdmVycmlkZQogICBib29sIGlzRXF1YWxOb2RlcyhBc3ROb2RlIGZpcnN0LCBBc3ROb2RlIHNlY29uZCkgewogICAgIGlmIChmaXJzdCBpcyBTaW1wbGVJZGVudGlmaWVyICYmIHNlY29uZCBpcyBTaW1wbGVJZGVudGlmaWVyKSB7CkBAIC0xNDIsMTAgKzEzNiw4IEBACiAgICAgcmV0dXJuIHN1cGVyLmlzRXF1YWxOb2RlcyhmaXJzdCwgc2Vjb25kKTsKICAgfQogCi0gIC8qKgotICAgKiBPdmVycmlkZGVuIHRvIGlnbm9yZSB0aGUgb2Zmc2V0cyBvZiB0b2tlbnMgYmVjYXVzZSB0aGVzZSBjYW4gbGVnaXRpbWF0ZWx5Ci0gICAqIGJlIGRpZmZlcmVudC4KLSAgICovCisgIC8vLyBPdmVycmlkZGVuIHRvIGlnbm9yZSB0aGUgb2Zmc2V0cyBvZiB0b2tlbnMgYmVjYXVzZSB0aGVzZSBjYW4gbGVnaXRpbWF0ZWx5CisgIC8vLyBiZSBkaWZmZXJlbnQuCiAgIEBvdmVycmlkZQogICBib29sIGlzRXF1YWxUb2tlbnNOb3ROdWxsKFRva2VuIGZpcnN0LCBUb2tlbiBzZWNvbmQpID0+CiAgICAgICAoZmlyc3QuaXNTeW50aGV0aWMgJiYgZmlyc3QudHlwZSA9PSBzZWNvbmQudHlwZSkgfHwKQEAgLTE2OSwxMCArMTYxLDggQEAKICAgICBidWZmZXIud3JpdGUobm9kZS5ydW50aW1lVHlwZSk7CiAgIH0KIAotICAvKioKLSAgICogQ29tcGFyZSB0aGUgW2FjdHVhbF0gYW5kIFtleHBlY3RlZF0gbm9kZXMsIGZhaWxpbmcgdGhlIHRlc3QgaWYgdGhleSBhcmUKLSAgICogZGlmZmVyZW50LgotICAgKi8KKyAgLy8vIENvbXBhcmUgdGhlIFthY3R1YWxdIGFuZCBbZXhwZWN0ZWRdIG5vZGVzLCBmYWlsaW5nIHRoZSB0ZXN0IGlmIHRoZXkgYXJlCisgIC8vLyBkaWZmZXJlbnQuCiAgIHN0YXRpYyB2b2lkIGNvbXBhcmUoQXN0Tm9kZSBhY3R1YWwsIEFzdE5vZGUgZXhwZWN0ZWQpIHsKICAgICBSZXN1bHRDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBSZXN1bHRDb21wYXJhdG9yKCk7CiAgICAgaWYgKCFjb21wYXJhdG9yLmlzRXF1YWxOb2RlcyhhY3R1YWwsIGV4cGVjdGVkKSkgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL21hbmlmZXN0L21hbmlmZXN0X3ZhbGlkYXRvcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvbWFuaWZlc3QvbWFuaWZlc3RfdmFsaWRhdG9yX3Rlc3QuZGFydAppbmRleCAwNjRkNDg3Li43MTdjZjFmIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvbWFuaWZlc3QvbWFuaWZlc3RfdmFsaWRhdG9yX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvbWFuaWZlc3QvbWFuaWZlc3RfdmFsaWRhdG9yX3Rlc3QuZGFydApAQCAtMjIsMTAgKzIyLDggQEAKIGNsYXNzIE1hbmlmZXN0VmFsaWRhdG9yVGVzdCB3aXRoIFJlc291cmNlUHJvdmlkZXJNaXhpbiB7CiAgIE1hbmlmZXN0VmFsaWRhdG9yIHZhbGlkYXRvcjsKIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHVzZWQgb24gdGhlIGdpdmVuIFtjb250ZW50XSB0aGUKLSAgICogW2V4cGVjdGVkRXJyb3JDb2Rlc10gYXJlIHByb2R1Y2VkLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHdoZW4gdGhlIHZhbGlkYXRvciBpcyB1c2VkIG9uIHRoZSBnaXZlbiBbY29udGVudF0gdGhlCisgIC8vLyBbZXhwZWN0ZWRFcnJvckNvZGVzXSBhcmUgcHJvZHVjZWQuCiAgIHZvaWQgYXNzZXJ0RXJyb3JzKFN0cmluZyBjb250ZW50LCBMaXN0PEVycm9yQ29kZT4gZXhwZWN0ZWRFcnJvckNvZGVzKSB7CiAgICAgTGlzdDxBbmFseXNpc0Vycm9yPiBlcnJvcnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoY29udGVudCwgdHJ1ZSk7CiAgICAgR2F0aGVyaW5nRXJyb3JMaXN0ZW5lciBsaXN0ZW5lciA9IEdhdGhlcmluZ0Vycm9yTGlzdGVuZXIoKTsKQEAgLTMzLDEwICszMSw4IEBACiAgICAgbGlzdGVuZXIuYXNzZXJ0RXJyb3JzV2l0aENvZGVzKGV4cGVjdGVkRXJyb3JDb2Rlcyk7CiAgIH0KIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHVzZWQgb24gdGhlIGdpdmVuIFtjb250ZW50XSBubyBlcnJvcnMgYXJlCi0gICAqIHByb2R1Y2VkLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHdoZW4gdGhlIHZhbGlkYXRvciBpcyB1c2VkIG9uIHRoZSBnaXZlbiBbY29udGVudF0gbm8gZXJyb3JzCisgIC8vLyBhcmUgcHJvZHVjZWQuCiAgIHZvaWQgYXNzZXJ0Tm9FcnJvcnMoU3RyaW5nIGNvbnRlbnQpIHsKICAgICBhc3NlcnRFcnJvcnMoY29udGVudCwgW10pOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvb3B0aW9ucy9vcHRpb25zX3J1bGVfdmFsaWRhdG9yX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9vcHRpb25zL29wdGlvbnNfcnVsZV92YWxpZGF0b3JfdGVzdC5kYXJ0CmluZGV4IDk1ODY1MDAuLjJjMDRhNGUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9vcHRpb25zL29wdGlvbnNfcnVsZV92YWxpZGF0b3JfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9vcHRpb25zL29wdGlvbnNfcnVsZV92YWxpZGF0b3JfdGVzdC5kYXJ0CkBAIC0zMiwxMCArMzIsOCBAQAogICBMaW50ZXJSdWxlT3B0aW9uc1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBMaW50ZXJSdWxlT3B0aW9uc1ZhbGlkYXRvcigKICAgICAgIHByb3ZpZGVyOiAoKSA9PiBbRGVwcmVjYXRlZExpbnQoKSwgU3RhYmxlTGludCgpLCBSdWxlTmVnKCksIFJ1bGVQb3MoKV0pOwogCi0vKioKLSAqIEFzc2VydCB0aGF0IHdoZW4gdGhlIHZhbGlkYXRvciBpcyB1c2VkIG9uIHRoZSBnaXZlbiBbY29udGVudF0gdGhlCi0gKiBbZXhwZWN0ZWRFcnJvckNvZGVzXSBhcmUgcHJvZHVjZWQuCi0gKi8KKyAgLy8vIEFzc2VydCB0aGF0IHdoZW4gdGhlIHZhbGlkYXRvciBpcyB1c2VkIG9uIHRoZSBnaXZlbiBbY29udGVudF0gdGhlCisgIC8vLyBbZXhwZWN0ZWRFcnJvckNvZGVzXSBhcmUgcHJvZHVjZWQuCiAgIHZvaWQgYXNzZXJ0RXJyb3JzKFN0cmluZyBjb250ZW50LCBMaXN0PEVycm9yQ29kZT4gZXhwZWN0ZWRFcnJvckNvZGVzKSB7CiAgICAgR2F0aGVyaW5nRXJyb3JMaXN0ZW5lciBsaXN0ZW5lciA9IEdhdGhlcmluZ0Vycm9yTGlzdGVuZXIoKTsKICAgICBFcnJvclJlcG9ydGVyIHJlcG9ydGVyID0gRXJyb3JSZXBvcnRlcigKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9wdWJzcGVjL3B1YnNwZWNfdmFsaWRhdG9yX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9wdWJzcGVjL3B1YnNwZWNfdmFsaWRhdG9yX3Rlc3QuZGFydAppbmRleCA1MDliM2I0Li5jZjNkZGE3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvcHVic3BlYy9wdWJzcGVjX3ZhbGlkYXRvcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3B1YnNwZWMvcHVic3BlY192YWxpZGF0b3JfdGVzdC5kYXJ0CkBAIC0yMywxMCArMjMsOCBAQAogY2xhc3MgUHVic3BlY1ZhbGlkYXRvclRlc3Qgd2l0aCBSZXNvdXJjZVByb3ZpZGVyTWl4aW4gewogICBQdWJzcGVjVmFsaWRhdG9yIHZhbGlkYXRvcjsKIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHVzZWQgb24gdGhlIGdpdmVuIFtjb250ZW50XSB0aGUKLSAgICogW2V4cGVjdGVkRXJyb3JDb2Rlc10gYXJlIHByb2R1Y2VkLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IHdoZW4gdGhlIHZhbGlkYXRvciBpcyB1c2VkIG9uIHRoZSBnaXZlbiBbY29udGVudF0gdGhlCisgIC8vLyBbZXhwZWN0ZWRFcnJvckNvZGVzXSBhcmUgcHJvZHVjZWQuCiAgIHZvaWQgYXNzZXJ0RXJyb3JzKFN0cmluZyBjb250ZW50LCBMaXN0PEVycm9yQ29kZT4gZXhwZWN0ZWRFcnJvckNvZGVzKSB7CiAgICAgWWFtbE5vZGUgbm9kZSA9IGxvYWRZYW1sTm9kZShjb250ZW50KTsKICAgICBpZiAobm9kZSBpcyEgWWFtbE1hcCkgewpAQCAtMzksMTAgKzM3LDggQEAKICAgICBsaXN0ZW5lci5hc3NlcnRFcnJvcnNXaXRoQ29kZXMoZXhwZWN0ZWRFcnJvckNvZGVzKTsKICAgfQogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCB3aGVuIHRoZSB2YWxpZGF0b3IgaXMgdXNlZCBvbiB0aGUgZ2l2ZW4gW2NvbnRlbnRdIG5vIGVycm9ycyBhcmUKLSAgICogcHJvZHVjZWQuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHVzZWQgb24gdGhlIGdpdmVuIFtjb250ZW50XSBubyBlcnJvcnMKKyAgLy8vIGFyZSBwcm9kdWNlZC4KICAgdm9pZCBhc3NlcnROb0Vycm9ycyhTdHJpbmcgY29udGVudCkgewogICAgIGFzc2VydEVycm9ycyhjb250ZW50LCBbXSk7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9zdW1tYXJ5L2VsZW1lbnRfdGV4dC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3N1bW1hcnkvZWxlbWVudF90ZXh0LmRhcnQKaW5kZXggYWI1NGQzNS4uOTUxYWYwNCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3N1bW1hcnkvZWxlbWVudF90ZXh0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3N1bW1hcnkvZWxlbWVudF90ZXh0LmRhcnQKQEAgLTE2LDI1ICsxNiwxNyBAQAogCiBpbXBvcnQgJ3Jlc29sdmVkX2FzdF9wcmludGVyLmRhcnQnOwogCi0vKioKLSAqIFNldCB0aGlzIHBhdGggdG8gYXV0b21hdGljYWxseSByZXBsYWNlIGV4cGVjdGF0aW9ucyBpbiBpbnZvY2F0aW9ucyBvZgotICogW2NoZWNrRWxlbWVudFRleHRdIHdpdGggdGhlIG5ldyBhY3R1YWwgdGV4dHMuCi0gKi8KKy8vLyBTZXQgdGhpcyBwYXRoIHRvIGF1dG9tYXRpY2FsbHkgcmVwbGFjZSBleHBlY3RhdGlvbnMgaW4gaW52b2NhdGlvbnMgb2YKKy8vLyBbY2hlY2tFbGVtZW50VGV4dF0gd2l0aCB0aGUgbmV3IGFjdHVhbCB0ZXh0cy4KIGNvbnN0IFN0cmluZyBfdGVzdFBhdGggPSBudWxsOwogCi0vKioKLSAqIFRoZSBsaXN0IG9mIHJlcGxhY2VtZW50cyB0aGF0IHVwZGF0ZSBleHBlY3RhdGlvbnMuCi0gKi8KKy8vLyBUaGUgbGlzdCBvZiByZXBsYWNlbWVudHMgdGhhdCB1cGRhdGUgZXhwZWN0YXRpb25zLgogZmluYWwgTGlzdDxfUmVwbGFjZW1lbnQ+IF9yZXBsYWNlbWVudHMgPSBbXTsKIAotLyoqCi0gKiBUaGUgY2FjaGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgd2l0aCB0aGUgW190ZXN0UGF0aF0uCi0gKi8KKy8vLyBUaGUgY2FjaGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgd2l0aCB0aGUgW190ZXN0UGF0aF0uCiBTdHJpbmcgX3Rlc3RDb2RlOwogCi0vKioKLSAqIFRoZSBjYWNoZSBsaW5lIGluZm9ybWF0aW9uIGZvciB0aGUgW190ZXN0UGF0aF0gZmlsZS4KLSAqLworLy8vIFRoZSBjYWNoZSBsaW5lIGluZm9ybWF0aW9uIGZvciB0aGUgW190ZXN0UGF0aF0gZmlsZS4KIExpbmVJbmZvIF90ZXN0Q29kZUxpbmVzOwogCiB2b2lkIGFwcGx5Q2hlY2tFbGVtZW50VGV4dFJlcGxhY2VtZW50cygpIHsKQEAgLTQ5LDExICs0MSw5IEBACiAgIH0KIH0KIAotLyoqCi0gKiBXcml0ZSB0aGUgZ2l2ZW4gW2xpYnJhcnldIGVsZW1lbnRzIGludG8gdGhlIGNhbm9uaWNhbCB0ZXh0IHByZXNlbnRhdGlvbgotICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3BlY2lmaWVkICd3aXRoWCcgb3B0aW9ucy4gVGhlbiBjb21wYXJlIHRoZQotICogYWN0dWFsIHRleHQgd2l0aCB0aGUgZ2l2ZW4gW2V4cGVjdGVkXSBvbmUuCi0gKi8KKy8vLyBXcml0ZSB0aGUgZ2l2ZW4gW2xpYnJhcnldIGVsZW1lbnRzIGludG8gdGhlIGNhbm9uaWNhbCB0ZXh0IHByZXNlbnRhdGlvbgorLy8vIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHNwZWNpZmllZCAnd2l0aFgnIG9wdGlvbnMuIFRoZW4gY29tcGFyZSB0aGUKKy8vLyBhY3R1YWwgdGV4dCB3aXRoIHRoZSBnaXZlbiBbZXhwZWN0ZWRdIG9uZS4KIHZvaWQgY2hlY2tFbGVtZW50VGV4dCgKICAgTGlicmFyeUVsZW1lbnQgbGlicmFyeSwKICAgU3RyaW5nIGV4cGVjdGVkLCB7CkBAIC0xMzUsOSArMTI1LDcgQEAKICAgZXhwZWN0KGFjdHVhbFRleHQsIGV4cGVjdGVkKTsKIH0KIAotLyoqCi0gKiBXcml0ZXMgdGhlIGNhbm9uaWNhbCB0ZXh0IHByZXNlbnRhdGlvbiBvZiBlbGVtZW50cy4KLSAqLworLy8vIFdyaXRlcyB0aGUgY2Fub25pY2FsIHRleHQgcHJlc2VudGF0aW9uIG9mIGVsZW1lbnRzLgogY2xhc3MgX0VsZW1lbnRXcml0ZXIgewogICBmaW5hbCBTdHJpbmcgc2VsZlVyaVN0cjsKICAgZmluYWwgYm9vbCB3aXRoQ29kZVJhbmdlczsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90ZXN0L3NyYy9zdW1tYXJ5L3Jlc3ludGhlc2l6ZV9jb21tb24uZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3NyYy9zdW1tYXJ5L3Jlc3ludGhlc2l6ZV9jb21tb24uZGFydAppbmRleCA4ODM2NDg4Li4wMzgwZTQ1IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvc3VtbWFyeS9yZXN5bnRoZXNpemVfY29tbW9uLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3N1bW1hcnkvcmVzeW50aGVzaXplX2NvbW1vbi5kYXJ0CkBAIC0yMCwxMSArMjAsOSBAQAogaW1wb3J0ICdlbGVtZW50X3RleHQuZGFydCc7CiBpbXBvcnQgJ3Rlc3Rfc3RyYXRlZ2llcy5kYXJ0JzsKIAotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciByZXN5bnRoZXNpemluZyBhbmQgY29tcGFyaW5nIGVsZW1lbnRzLgotICoKLSAqIFRoZSByZXR1cm4gdHlwZSBzZXBhcmF0b3I6IOKGkgotICovCisvLy8gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcmVzeW50aGVzaXppbmcgYW5kIGNvbXBhcmluZyBlbGVtZW50cy4KKy8vLworLy8vIFRoZSByZXR1cm4gdHlwZSBzZXBhcmF0b3I6IOKGkgogYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXN5bnRoZXNpemVUZXN0IHdpdGggUmVzb3VyY2VQcm92aWRlck1peGluIHsKICAgRGVjbGFyZWRWYXJpYWJsZXMgZGVjbGFyZWRWYXJpYWJsZXMgPSBEZWNsYXJlZFZhcmlhYmxlcygpOwogICBTb3VyY2VGYWN0b3J5IHNvdXJjZUZhY3Rvcnk7CkBAIC0zNCwxMCArMzIsOCBAQAogICBTb3VyY2UgdGVzdFNvdXJjZTsKICAgU2V0PFNvdXJjZT4gb3RoZXJMaWJyYXJ5U291cmNlcyA9IDxTb3VyY2U+e307CiAKLSAgLyoqCi0gICAqIFRlc3RzIG1heSBzZXQgdGhpcyB0byBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBhIG1pc3NpbmcgZmlsZSBhdCB0aGUgdGltZSBvZgotICAgKiBzdW1tYXJ5IHJlc3ludGhlc2lzIHNob3VsZG4ndCB0cmlnZ2VyIGFuIGVycm9yLgotICAgKi8KKyAgLy8vIFRlc3RzIG1heSBzZXQgdGhpcyB0byBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBhIG1pc3NpbmcgZmlsZSBhdCB0aGUgdGltZQorICAvLy8gb2Ygc3VtbWFyeSByZXN5bnRoZXNpcyBzaG91bGRuJ3QgdHJpZ2dlciBhbiBlcnJvci4KICAgYm9vbCBhbGxvd01pc3NpbmdGaWxlcyA9IGZhbHNlOwogCiAgIEFic3RyYWN0UmVzeW50aGVzaXplVGVzdCgpIHsKQEAgLTY5NDEsNiArNjkzNywxNSBAQAogICAgIGV4cGVjdCh0eXBlQS5lbGVtZW50LnNvdXJjZS5zaG9ydE5hbWUsICdmb29faHRtbC5kYXJ0Jyk7CiAgIH0KIAorICB0ZXN0X2ltcG9ydF9kYXJ0Q29yZV9pbXBsaWNpdCgpIGFzeW5jIHsKKyAgICB2YXIgbGlicmFyeSA9IGF3YWl0IGNoZWNrTGlicmFyeSgnJycKK2ltcG9ydCAnZGFydDptYXRoJzsKKycnJyk7CisgICAgZXhwZWN0KGxpYnJhcnkuaW1wb3J0cywgaGFzTGVuZ3RoKDIpKTsKKyAgICBleHBlY3QobGlicmFyeS5pbXBvcnRzWzBdLnVyaSwgJ2RhcnQ6bWF0aCcpOworICAgIGV4cGVjdChsaWJyYXJ5LmltcG9ydHNbMV0udXJpLCAnZGFydDpjb3JlJyk7CisgIH0KKwogICB0ZXN0X2ltcG9ydF9kZWZlcnJlZCgpIGFzeW5jIHsKICAgICBhZGRMaWJyYXJ5U291cmNlKCcvYS5kYXJ0JywgJ2YoKSB7fScpOwogICAgIHZhciBsaWJyYXJ5ID0gYXdhaXQgY2hlY2tMaWJyYXJ5KCcnJwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3N1bW1hcnkvdG9wX2xldmVsX2luZmVyZW5jZV90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvc3VtbWFyeS90b3BfbGV2ZWxfaW5mZXJlbmNlX3Rlc3QuZGFydAppbmRleCA3YjJlN2JmLi41NzdjNzkwIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvc3VtbWFyeS90b3BfbGV2ZWxfaW5mZXJlbmNlX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvc3VtbWFyeS90b3BfbGV2ZWxfaW5mZXJlbmNlX3Rlc3QuZGFydApAQCAtNTQyLDEyICs1NDIsMTAgQEAKICcnJyk7CiAgIH0KIAotICAvKioKLSAgICogQSBzaW1wbGUgb3IgcXVhbGlmaWVkIGlkZW50aWZpZXIgcmVmZXJyaW5nIHRvIGEgdG9wIGxldmVsIGZ1bmN0aW9uLCBzdGF0aWMKLSAgICogdmFyaWFibGUsIGZpZWxkLCBnZXR0ZXI7IG9yIGEgc3RhdGljIGNsYXNzIHZhcmlhYmxlLCBzdGF0aWMgZ2V0dGVyIG9yCi0gICAqIG1ldGhvZDsgb3IgYW4gaW5zdGFuY2UgbWV0aG9kOyBoYXMgdGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIGlkZW50aWZpZXIuCi0gICAqCi0gICAqLworICAvLy8gQSBzaW1wbGUgb3IgcXVhbGlmaWVkIGlkZW50aWZpZXIgcmVmZXJyaW5nIHRvIGEgdG9wIGxldmVsIGZ1bmN0aW9uLCBzdGF0aWMKKyAgLy8vIHZhcmlhYmxlLCBmaWVsZCwgZ2V0dGVyOyBvciBhIHN0YXRpYyBjbGFzcyB2YXJpYWJsZSwgc3RhdGljIGdldHRlciBvcgorICAvLy8gbWV0aG9kOyBvciBhbiBpbnN0YW5jZSBtZXRob2Q7IGhhcyB0aGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgaWRlbnRpZmllci4KKyAgLy8vCiAgIHRlc3RfaW5pdGlhbGl6ZXJfY2xhc3NGaWVsZF91c2VJbnN0YW5jZUdldHRlcigpIGFzeW5jIHsKICAgICB2YXIgbGlicmFyeSA9IGF3YWl0IF9lbmNvZGVEZWNvZGVMaWJyYXJ5KHInJycKIGNsYXNzIEEgewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3Rhc2svc3Ryb25nL2luZmVycmVkX3R5cGVfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc3JjL3Rhc2svc3Ryb25nL2luZmVycmVkX3R5cGVfdGVzdC5kYXJ0CmluZGV4IGZkZTM4OWQuLjkwN2JiZWEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3NyYy90YXNrL3N0cm9uZy9pbmZlcnJlZF90eXBlX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zcmMvdGFzay9zdHJvbmcvaW5mZXJyZWRfdHlwZV90ZXN0LmRhcnQKQEAgLTIyLDEwICsyMiw4IEBACiAKIEByZWZsZWN0aXZlVGVzdAogY2xhc3MgSW5mZXJyZWRUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U3Ryb25nVGVzdCB7Ci0gIC8qKgotICAgKiBBZGQgdGhlIGZpbGUsIHByb2Nlc3MgaXQgKHJlc29sdmUsIHZhbGlkYXRlLCBldGMpIGFuZCByZXR1cm4gdGhlIHJlc29sdmVkCi0gICAqIHVuaXQgZWxlbWVudC4KLSAgICovCisgIC8vLyBBZGQgdGhlIGZpbGUsIHByb2Nlc3MgaXQgKHJlc29sdmUsIHZhbGlkYXRlLCBldGMpIGFuZCByZXR1cm4gdGhlIHJlc29sdmVkCisgIC8vLyB1bml0IGVsZW1lbnQuCiAgIEZ1dHVyZTxDb21waWxhdGlvblVuaXRFbGVtZW50PiBjaGVja0ZpbGVFbGVtZW50KFN0cmluZyBjb250ZW50KSBhc3luYyB7CiAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBhd2FpdCBjaGVja0ZpbGUoY29udGVudCk7CiAgICAgcmV0dXJuIHVuaXQuZGVjbGFyZWRFbGVtZW50OwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvdXRpbHMuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L3V0aWxzLmRhcnQKaW5kZXggZTc3NDNjMC4uNWRjZTg4NjIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L3V0aWxzLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvdXRpbHMuZGFydApAQCAtMTAsMTAgKzEwLDggQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvZWxlbWVudF9zZWFyY2guZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwogCi0vKioKLSAqIFNlYXJjaCB0aGUgW3VuaXRdIGZvciB0aGUgW0xvY2FsVmFyaWFibGVFbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCi0gKiBGYWlsIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBzdWNoIHZhcmlhYmxlLgotICovCisvLy8gU2VhcmNoIHRoZSBbdW5pdF0gZm9yIHRoZSBbTG9jYWxWYXJpYWJsZUVsZW1lbnRdIHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KKy8vLyBGYWlsIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBzdWNoIHZhcmlhYmxlLgogRnVuY3Rpb25FbGVtZW50IGZpbmRMb2NhbEZ1bmN0aW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgbmFtZSkgewogICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzID0gZmluZEVsZW1lbnRzQnlOYW1lKHVuaXQsIG5hbWUpOwogICBMaXN0PEVsZW1lbnQ+IGZ1bmN0aW9ucyA9IGVsZW1lbnRzLndoZXJlVHlwZTxGdW5jdGlvbkVsZW1lbnQ+KCkudG9MaXN0KCk7CkBAIC0yMSwxMCArMTksOCBAQAogICByZXR1cm4gZnVuY3Rpb25zWzBdOwogfQogCi0vKioKLSAqIFNlYXJjaCB0aGUgW3VuaXRdIGZvciB0aGUgW0xvY2FsVmFyaWFibGVFbGVtZW50XSB3aXRoIHRoZSBnaXZlbiBbbmFtZV0uCi0gKiBGYWlsIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBzdWNoIHZhcmlhYmxlLgotICovCisvLy8gU2VhcmNoIHRoZSBbdW5pdF0gZm9yIHRoZSBbTG9jYWxWYXJpYWJsZUVsZW1lbnRdIHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KKy8vLyBGYWlsIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBzdWNoIHZhcmlhYmxlLgogTG9jYWxWYXJpYWJsZUVsZW1lbnQgZmluZExvY2FsVmFyaWFibGUoQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBuYW1lKSB7CiAgIExpc3Q8RWxlbWVudD4gZWxlbWVudHMgPSBmaW5kRWxlbWVudHNCeU5hbWUodW5pdCwgbmFtZSk7CiAgIExpc3Q8RWxlbWVudD4gbG9jYWxWYXJpYWJsZXMgPQpAQCAtNDksMTAgKzQ1LDggQEAKIHR5cGVkZWYgQXNzZXJ0ZXJCdWlsZGVyQnVpbGRlcjxSLCBTLCBUPiA9IEFzc2VydGVyQnVpbGRlcjxTLCBUPiBGdW5jdGlvbihSIGFyZyk7CiAKIGNsYXNzIEFzdEZpbmRlciB7Ci0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBbY2xhc3NOYW1lXSBpbiB0aGUgZ2l2ZW4KLSAgICogY29tcGlsYXRpb24gW3VuaXRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdIGluIHRoZQorICAvLy8gZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLgogICBzdGF0aWMgQ2xhc3NEZWNsYXJhdGlvbiBnZXRDbGFzcyhDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNsYXNzTmFtZSkgewogICAgIE5vZGVMaXN0PENvbXBpbGF0aW9uVW5pdE1lbWJlcj4gdW5pdE1lbWJlcnMgPSB1bml0LmRlY2xhcmF0aW9uczsKICAgICBmb3IgKENvbXBpbGF0aW9uVW5pdE1lbWJlciB1bml0TWVtYmVyIGluIHVuaXRNZW1iZXJzKSB7CkBAIC02NCwxMSArNTgsOSBAQAogICAgIGZhaWwoJ05vIGNsYXNzIG5hbWVkICRjbGFzc05hbWUgaW4gJHNvdXJjZScpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIGdpdmVuIFtjb25zdHJ1Y3Rvck5hbWVdIGluCi0gICAqIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBbY2xhc3NOYW1lXSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLiAgSWYKLSAgICogY29uc3RydWN0b3JOYW1lIGlzIG51bGwsIHJldHVybiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcjsKLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBnaXZlbiBbY29uc3RydWN0b3JOYW1lXQorICAvLy8gaW4gdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0uCisgIC8vLyBJZiBjb25zdHJ1Y3Rvck5hbWUgaXMgbnVsbCwgcmV0dXJuIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yOwogICBzdGF0aWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBnZXRDb25zdHJ1Y3RvckluQ2xhc3MoCiAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGNvbnN0cnVjdG9yTmFtZSkgewogICAgIENsYXNzRGVjbGFyYXRpb24gdW5pdE1lbWJlciA9IGdldENsYXNzKHVuaXQsIGNsYXNzTmFtZSk7CkBAIC04MywxMCArNzUsOCBAQAogICAgIGZhaWwoJ05vIGNvbnN0cnVjdG9yIG5hbWVkICRjb25zdHJ1Y3Rvck5hbWUgaW4gJGNsYXNzTmFtZScpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGZpZWxkIHdpdGggdGhlIGdpdmVuIFtmaWVsZE5hbWVdIGluIHRoZSBjbGFzcwotICAgKiB3aXRoIHRoZSBnaXZlbiBbY2xhc3NOYW1lXSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGZpZWxkIHdpdGggdGhlIGdpdmVuIFtmaWVsZE5hbWVdIGluIHRoZQorICAvLy8gY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gW2NsYXNzTmFtZV0gaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIFt1bml0XS4KICAgc3RhdGljIFZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0RmllbGRJbkNsYXNzKAogICAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUpIHsKICAgICBDbGFzc0RlY2xhcmF0aW9uIHVuaXRNZW1iZXIgPSBnZXRDbGFzcyh1bml0LCBjbGFzc05hbWUpOwpAQCAtMTA0LDE5ICs5NCwxNSBAQAogICAgIGZhaWwoJ05vIGZpZWxkIG5hbWVkICRmaWVsZE5hbWUgaW4gJGNsYXNzTmFtZScpOwogICB9CiAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZWxlbWVudCBvZiB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gW2ZpZWxkTmFtZV0gaW4gdGhlIGNsYXNzCi0gICAqIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBlbGVtZW50IG9mIHRoZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiBbZmllbGROYW1lXSBpbiB0aGUgY2xhc3MKKyAgLy8vIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0uCiAgIHN0YXRpYyBGaWVsZEVsZW1lbnQgZ2V0RmllbGRJbkNsYXNzRWxlbWVudCgKICAgICAgIENvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7CiAgICAgcmV0dXJuIGdldEZpZWxkSW5DbGFzcyh1bml0LCBjbGFzc05hbWUsIGZpZWxkTmFtZSk/Lm5hbWU/LnN0YXRpY0VsZW1lbnQ7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIHdpdGggdGhlIGdpdmVuIFttZXRob2ROYW1lXSBpbiB0aGUKLSAgICogY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gW2NsYXNzTmFtZV0gaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIFt1bml0XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gW21ldGhvZE5hbWVdIGluIHRoZQorICAvLy8gY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gW2NsYXNzTmFtZV0gaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIFt1bml0XS4KICAgc3RhdGljIE1ldGhvZERlY2xhcmF0aW9uIGdldE1ldGhvZEluQ2xhc3MoCiAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKICAgICBDbGFzc0RlY2xhcmF0aW9uIHVuaXRNZW1iZXIgPSBnZXRDbGFzcyh1bml0LCBjbGFzc05hbWUpOwpAQCAtMTMxLDExICsxMTcsOSBAQAogICAgIGZhaWwoJ05vIG1ldGhvZCBuYW1lZCAkbWV0aG9kTmFtZSBpbiAkY2xhc3NOYW1lJyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdGF0ZW1lbnRzIGluIHRoZSBib2R5IG9mIGEgdGhlIG1ldGhvZCB3aXRoIHRoZSBnaXZlbgotICAgKiBbbWV0aG9kTmFtZV0gaW4gdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIFtjbGFzc05hbWVdIGluIHRoZSBnaXZlbgotICAgKiBjb21waWxhdGlvbiBbdW5pdF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBzdGF0ZW1lbnRzIGluIHRoZSBib2R5IG9mIGEgdGhlIG1ldGhvZCB3aXRoIHRoZSBnaXZlbgorICAvLy8gW21ldGhvZE5hbWVdIGluIHRoZSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBbY2xhc3NOYW1lXSBpbiB0aGUgZ2l2ZW4KKyAgLy8vIGNvbXBpbGF0aW9uIFt1bml0XS4KICAgc3RhdGljIExpc3Q8U3RhdGVtZW50PiBnZXRTdGF0ZW1lbnRzSW5NZXRob2QoCiAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBnZXRNZXRob2RJbkNsYXNzKHVuaXQsIGNsYXNzTmFtZSwgbWV0aG9kTmFtZSk7CkBAIC0xNDMsMTAgKzEyNyw4IEBACiAgICAgcmV0dXJuIGJvZHkuYmxvY2suc3RhdGVtZW50czsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHN0YXRlbWVudHMgaW4gdGhlIGJvZHkgb2YgdGhlIHRvcC1sZXZlbCBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbgotICAgKiBbZnVuY3Rpb25OYW1lXSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLgotICAgKi8KKyAgLy8vIFJldHVybiB0aGUgc3RhdGVtZW50cyBpbiB0aGUgYm9keSBvZiB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuCisgIC8vLyBbZnVuY3Rpb25OYW1lXSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLgogICBzdGF0aWMgTGlzdDxTdGF0ZW1lbnQ+IGdldFN0YXRlbWVudHNJblRvcExldmVsRnVuY3Rpb24oCiAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGZ1bmN0aW9uTmFtZSkgewogICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24gZnVuY3Rpb24gPSBnZXRUb3BMZXZlbEZ1bmN0aW9uKHVuaXQsIGZ1bmN0aW9uTmFtZSk7CkBAIC0xNTQsMTAgKzEzNiw4IEBACiAgICAgcmV0dXJuIGJvZHkuYmxvY2suc3RhdGVtZW50czsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KLSAgICogW2Z1bmN0aW9uTmFtZV0gaW4gdGhlIGdpdmVuIGNvbXBpbGF0aW9uIFt1bml0XS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIFtmdW5jdGlvbk5hbWVdIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0uCiAgIHN0YXRpYyBGdW5jdGlvbkRlY2xhcmF0aW9uIGdldFRvcExldmVsRnVuY3Rpb24oCiAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGZ1bmN0aW9uTmFtZSkgewogICAgIE5vZGVMaXN0PENvbXBpbGF0aW9uVW5pdE1lbWJlcj4gdW5pdE1lbWJlcnMgPSB1bml0LmRlY2xhcmF0aW9uczsKQEAgLTE3MSwxMCArMTUxLDggQEAKICAgICBmYWlsKCdObyB0b3BsZXZlbCBmdW5jdGlvbiBuYW1lZCAkZnVuY3Rpb25OYW1lIGZvdW5kJyk7CiAgIH0KIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdG9wLWxldmVsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuCi0gICAqIFt2YXJpYWJsZU5hbWVdIGluIHRoZSBnaXZlbiBjb21waWxhdGlvbiBbdW5pdF0uCi0gICAqLworICAvLy8gUmV0dXJuIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdG9wLWxldmVsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuCisgIC8vLyBbdmFyaWFibGVOYW1lXSBpbiB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gW3VuaXRdLgogICBzdGF0aWMgVmFyaWFibGVEZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFZhcmlhYmxlKAogICAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKICAgICBOb2RlTGlzdDxDb21waWxhdGlvblVuaXRNZW1iZXI+IHVuaXRNZW1iZXJzID0gdW5pdC5kZWNsYXJhdGlvbnM7CkBAIC0xOTIsNzkgKzE3MCw1MyBAQAogICAgIGZhaWwoJ05vIHRvcGxldmVsIHZhcmlhYmxlIG5hbWVkICR2YXJpYWJsZU5hbWUgZm91bmQnKTsKICAgfQogCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHRvcC1sZXZlbCB2YXJpYWJsZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KLSAgICovCisgIC8vLyBSZXR1cm4gdGhlIHRvcC1sZXZlbCB2YXJpYWJsZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIFtuYW1lXS4KICAgc3RhdGljIFRvcExldmVsVmFyaWFibGVFbGVtZW50IGdldFRvcExldmVsVmFyaWFibGVFbGVtZW50KAogICAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBuYW1lKSB7CiAgICAgcmV0dXJuIGdldFRvcExldmVsVmFyaWFibGUodW5pdCwgbmFtZSk/Lm5hbWU/LnN0YXRpY0VsZW1lbnQ7CiAgIH0KIH0KIAotLyoqCi0gKiBDbGFzcyBmb3IgY29tcG9zaXRpb25hbGx5IGJ1aWxkaW5nIHVwIGFzc2VydGlvbnMgb24gdHlwZXMKLSAqLworLy8vIENsYXNzIGZvciBjb21wb3NpdGlvbmFsbHkgYnVpbGRpbmcgdXAgYXNzZXJ0aW9ucyBvbiB0eXBlcwogY2xhc3MgVHlwZUFzc2VydGlvbnMgewogICAvLyBUT0RPKGxlYWZwKTogTWFrZSB0aGVzZSBtYXRjaGVycy4KICAgLy8gaHR0cHM6Ly9wdWIuZGV2L2RvY3VtZW50YXRpb24vbWF0Y2hlci9sYXRlc3QvbWF0Y2hlci9NYXRjaGVyLWNsYXNzLmh0bWwKIAotICAvKioKLSAgICogUHJvdmlkZXMgcHJpbWl0aXZlIHR5cGVzIGZvciBiYXNpYyB0eXBlIGFzc2VydGlvbnMuCi0gICAqLworICAvLy8gUHJvdmlkZXMgcHJpbWl0aXZlIHR5cGVzIGZvciBiYXNpYyB0eXBlIGFzc2VydGlvbnMuCiAgIGZpbmFsIFR5cGVQcm92aWRlciBfdHlwZVByb3ZpZGVyOwogCiAgIFR5cGVBc3NlcnRpb25zKHRoaXMuX3R5cGVQcm92aWRlcik7CiAKLSAgLyoqCi0gICAqIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBkeW5hbWljIHR5cGUKLSAgICovCisgIC8vLyBQcmltaXRpdmUgYXNzZXJ0aW9uIGZvciB0aGUgZHluYW1pYyB0eXBlCiAgIEFzc2VydGVyPERhcnRUeXBlPiBnZXQgaXNEeW5hbWljID0+IGlzVHlwZShfdHlwZVByb3ZpZGVyLmR5bmFtaWNUeXBlKTsKIAotICAvKioKLSAgICogUHJpbWl0aXZlIGFzc2VydGlvbiBmb3IgdGhlIGludCB0eXBlCi0gICAqLworICAvLy8gUHJpbWl0aXZlIGFzc2VydGlvbiBmb3IgdGhlIGludCB0eXBlCiAgIEFzc2VydGVyPERhcnRUeXBlPiBnZXQgaXNJbnQgPT4gaXNUeXBlKF90eXBlUHJvdmlkZXIuaW50VHlwZSk7CiAKLSAgLyoqCi0gICAqIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBsaXN0IHR5cGUKLSAgICovCisgIC8vLyBQcmltaXRpdmUgYXNzZXJ0aW9uIGZvciB0aGUgbGlzdCB0eXBlCiAgIEFzc2VydGVyPERhcnRUeXBlPiBnZXQgaXNMaXN0ID0+IGhhc0VsZW1lbnQoX3R5cGVQcm92aWRlci5saXN0RWxlbWVudCk7CiAKLSAgLyoqCi0gICAqIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBtYXAgdHlwZQotICAgKi8KKyAgLy8vIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBtYXAgdHlwZQogICBBc3NlcnRlcjxEYXJ0VHlwZT4gZ2V0IGlzTWFwID0+IGhhc0VsZW1lbnQoX3R5cGVQcm92aWRlci5tYXBFbGVtZW50KTsKIAotICAvKioKLSAgICogUHJpbWl0aXZlIGFzc2VydGlvbiBmb3IgdGhlIE51bGwgdHlwZQotICAgKi8KKyAgLy8vIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBOdWxsIHR5cGUKICAgQXNzZXJ0ZXI8RGFydFR5cGU+IGdldCBpc051bGwgPT4gaXNUeXBlKF90eXBlUHJvdmlkZXIubnVsbFR5cGUpOwogCi0gIC8qKgotICAgKiBQcmltaXRpdmUgYXNzZXJ0aW9uIGZvciB0aGUgbnVtIHR5cGUKLSAgICovCisgIC8vLyBQcmltaXRpdmUgYXNzZXJ0aW9uIGZvciB0aGUgbnVtIHR5cGUKICAgQXNzZXJ0ZXI8RGFydFR5cGU+IGdldCBpc051bSA9PiBpc1R5cGUoX3R5cGVQcm92aWRlci5udW1UeXBlKTsKIAotICAvKioKLSAgICogUHJpbWl0aXZlIGFzc2VydGlvbiBmb3IgdGhlIE9iamVjdCB0eXBlCi0gICAqLworICAvLy8gUHJpbWl0aXZlIGFzc2VydGlvbiBmb3IgdGhlIE9iamVjdCB0eXBlCiAgIEFzc2VydGVyPERhcnRUeXBlPiBnZXQgaXNPYmplY3QgPT4gaXNUeXBlKF90eXBlUHJvdmlkZXIub2JqZWN0VHlwZSk7CiAKLSAgLyoqCi0gICAqIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBzdHJpbmcgdHlwZQotICAgKi8KKyAgLy8vIFByaW1pdGl2ZSBhc3NlcnRpb24gZm9yIHRoZSBzdHJpbmcgdHlwZQogICBBc3NlcnRlcjxEYXJ0VHlwZT4gZ2V0IGlzU3RyaW5nID0+IGlzVHlwZShfdHlwZVByb3ZpZGVyLnN0cmluZ1R5cGUpOwogCi0gIC8qKgotICAgKiBBc3NlcnQgdGhhdCBhIHR5cGUgaGFzIHRoZSBlbGVtZW50IHRoYXQgaXMgZXF1YWwgdG8gdGhlIFtleHBlY3RlZF0uCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgYSB0eXBlIGhhcyB0aGUgZWxlbWVudCB0aGF0IGlzIGVxdWFsIHRvIHRoZSBbZXhwZWN0ZWRdLgogICBBc3NlcnRlcjxEYXJ0VHlwZT4gaGFzRWxlbWVudChFbGVtZW50IGV4cGVjdGVkKSA9PgogICAgICAgKERhcnRUeXBlIHR5cGUpID0+IGV4cGVjdChleHBlY3RlZCwgdHlwZS5lbGVtZW50KTsKIAotICAvKioKLSAgICogR2l2ZW4gYXNzZXJ0aW9ucyBmb3IgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMsIHByb2R1Y2UgYW4KLSAgICogIGFzc2VydGlvbiBvdmVyIHVuYXJ5IGZ1bmN0aW9uIHR5cGVzLgotICAgKi8KKyAgLy8vIEdpdmVuIGFzc2VydGlvbnMgZm9yIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzLCBwcm9kdWNlIGFuCisgIC8vLyBhc3NlcnRpb24gb3ZlciB1bmFyeSBmdW5jdGlvbiB0eXBlcy4KICAgQXNzZXJ0ZXI8RGFydFR5cGU+IGlzRnVuY3Rpb24yT2YoCiAgICAgICAgICAgQXNzZXJ0ZXI8RGFydFR5cGU+IGFyZ1R5cGUsIEFzc2VydGVyPERhcnRUeXBlPiByZXR1cm5UeXBlKSA9PgogICAgICAgKERhcnRUeXBlIHR5cGUpIHsKQEAgLTI3MywxMCArMjI1LDggQEAKICAgICAgICAgcmV0dXJuVHlwZShmVHlwZS5yZXR1cm5UeXBlKTsKICAgICAgIH07CiAKLSAgLyoqCi0gICAqIEdpdmVuIGFuIGFzc2VydGlvbiBmb3IgdGhlIGJhc2UgdHlwZSBhbmQgYXNzZXJ0aW9ucyBvdmVyIHRoZSB0eXBlCi0gICAqIHBhcmFtZXRlcnMsIHByb2R1Y2UgYW4gYXNzZXJ0aW9uIG92ZXIgaW5zdGFudGlhdGlvbnMuCi0gICAqLworICAvLy8gR2l2ZW4gYW4gYXNzZXJ0aW9uIGZvciB0aGUgYmFzZSB0eXBlIGFuZCBhc3NlcnRpb25zIG92ZXIgdGhlIHR5cGUKKyAgLy8vIHBhcmFtZXRlcnMsIHByb2R1Y2UgYW4gYXNzZXJ0aW9uIG92ZXIgaW5zdGFudGlhdGlvbnMuCiAgIEFzc2VydGVyQnVpbGRlcjxMaXN0PEFzc2VydGVyPERhcnRUeXBlPj4sIERhcnRUeXBlPiBpc0luc3RhbnRpYXRpb25PZigKICAgICAgICAgICBBc3NlcnRlcjxEYXJ0VHlwZT4gYmFzZUFzc2VydCkgPT4KICAgICAgIChMaXN0PEFzc2VydGVyPERhcnRUeXBlPj4gYXJnQXNzZXJ0cykgPT4gKERhcnRUeXBlIHR5cGUpIHsKQEAgLTI4OSwyNCArMjM5LDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfTsKIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgYSB0eXBlIGlzIHRoZSBMaXN0IHR5cGUsIGFuZCB0aGF0IHRoZSBnaXZlbiBhc3NlcnRpb24gaG9sZHMKLSAgICogb3ZlciB0aGUgdHlwZSBwYXJhbWV0ZXIuCi0gICAqLworICAvLy8gQXNzZXJ0IHRoYXQgYSB0eXBlIGlzIHRoZSBMaXN0IHR5cGUsIGFuZCB0aGF0IHRoZSBnaXZlbiBhc3NlcnRpb24gaG9sZHMKKyAgLy8vIG92ZXIgdGhlIHR5cGUgcGFyYW1ldGVyLgogICBBc3NlcnRlcjxJbnRlcmZhY2VUeXBlPiBpc0xpc3RPZihBc3NlcnRlcjxEYXJ0VHlwZT4gYXJnQXNzZXJ0KSA9PgogICAgICAgaXNJbnN0YW50aWF0aW9uT2YoaXNMaXN0KShbYXJnQXNzZXJ0XSk7CiAKLSAgLyoqCi0gICAqIEFzc2VydCB0aGF0IGEgdHlwZSBpcyB0aGUgTWFwIHR5cGUsIGFuZCB0aGF0IHRoZSBnaXZlbiBhc3NlcnRpb25zIGhvbGQKLSAgICogb3ZlciB0aGUgdHlwZSBwYXJhbWV0ZXJzLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IGEgdHlwZSBpcyB0aGUgTWFwIHR5cGUsIGFuZCB0aGF0IHRoZSBnaXZlbiBhc3NlcnRpb25zIGhvbGQKKyAgLy8vIG92ZXIgdGhlIHR5cGUgcGFyYW1ldGVycy4KICAgQXNzZXJ0ZXI8SW50ZXJmYWNlVHlwZT4gaXNNYXBPZigKICAgICAgICAgICBBc3NlcnRlcjxEYXJ0VHlwZT4gYXJnQXNzZXJ0MCwgQXNzZXJ0ZXI8RGFydFR5cGU+IGFyZ0Fzc2VydDEpID0+CiAgICAgICBpc0luc3RhbnRpYXRpb25PZihpc01hcCkoW2FyZ0Fzc2VydDAsIGFyZ0Fzc2VydDFdKTsKIAotICAvKioKLSAgICogQXNzZXJ0IHRoYXQgYSB0eXBlIGlzIGVxdWFsIHRvIHRoZSBbZXhwZWN0ZWRdLgotICAgKi8KKyAgLy8vIEFzc2VydCB0aGF0IGEgdHlwZSBpcyBlcXVhbCB0byB0aGUgW2V4cGVjdGVkXS4KICAgQXNzZXJ0ZXI8RGFydFR5cGU+IGlzVHlwZShEYXJ0VHlwZSBleHBlY3RlZCkgPT4gKERhcnRUeXBlIHQpIHsKICAgICAgICAgZXhwZWN0KHQsIGV4cGVjdGVkKTsKICAgICAgIH07CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdG9vbC9kaWFnbm9zdGljcy9kaWFnbm9zdGljcy5tZCBiL3BrZy9hbmFseXplci90b29sL2RpYWdub3N0aWNzL2RpYWdub3N0aWNzLm1kCmluZGV4IDU5YjU2NWIuLjg4YjdhZWUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90b29sL2RpYWdub3N0aWNzL2RpYWdub3N0aWNzLm1kCisrKyBiL3BrZy9hbmFseXplci90b29sL2RpYWdub3N0aWNzL2RpYWdub3N0aWNzLm1kCkBAIC00Niw3ICs0Niw3IEBACiAKICogQW5ub3RhdGlvbnMKIAotKiBUaGUgZXhwcmVzc2lvbiBpbiBhIGNhc2UgY2xhdXNlLiBFeGFtcGxlOgorKiBUaGUgZXhwcmVzc2lvbiBpbiBhIGBjYXNlYCBjbGF1c2UuIEV4YW1wbGU6CiAKICAgYGBgZGFydAogICB2b2lkIGYoaW50IGUpIHsKQEAgLTYyLDkgKzYyLDkgQEAKIEEgdHlwZSBpcyBfcG90ZW50aWFsbHkgbm9uLW51bGxhYmxlXyBpZiBpdCdzIGVpdGhlciBleHBsaWNpdGx5IG5vbi1udWxsYWJsZSBvcgogaWYgaXQncyBhIHR5cGUgcGFyYW1ldGVyLgogCi1BIHR5cGUgaXMgZXhwbGljaXRseSBub24tbnVsbGFibGUgaWYgaXQgaXMgYSB0eXBlIG5hbWUgdGhhdCBpcyBub3QgZm9sbG93ZWQgYnkgYQorQSB0eXBlIGlzIGV4cGxpY2l0bHkgbm9uLW51bGxhYmxlIGlmIGl0IGlzIGEgdHlwZSBuYW1lIHRoYXQgaXNuJ3QgZm9sbG93ZWQgYnkgYQogcXVlc3Rpb24gbWFyay4gTm90ZSB0aGF0IHRoZXJlIGFyZSBhIGZldyB0eXBlcyB0aGF0IGFyZSBhbHdheXMgbnVsbGFibGUsIHN1Y2ggYXMKLWBOdWxsYCBhbmQgYGR5bmFtaWNgLCBhbmQgdGhhdCBgRnV0dXJlT3JgIGlzIG9ubHkgbm9uLW51bGxhYmxlIGlmIGl0IGlzIG5vdAorYE51bGxgIGFuZCBgZHluYW1pY2AsIGFuZCB0aGF0IGBGdXR1cmVPcmAgaXMgb25seSBub24tbnVsbGFibGUgaWYgaXQgaXNuJ3QKIGZvbGxvd2VkIGJ5IGEgcXVlc3Rpb24gbWFyayBfYW5kXyB0aGUgdHlwZSBhcmd1bWVudCBpcyBub24tbnVsbGFibGUgKHN1Y2ggYXMKIGBGdXR1cmVPcjxTdHJpbmc+YCkuCiAKQEAgLTk0LDcgKzk0LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQmAgZG9lc24ndCBpbmhlcml0IGEKIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGBhYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEEgewogICBpbnQgZ2V0IGE7CiB9CkBAIC0xMzMsNyArMTMzLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGVyZSdzIG5vIHdheSB0bwogY2hvb3NlIGJldHdlZW4gdGhlIG1lbWJlciBpbiBgRTFgIGFuZCB0aGUgbWVtYmVyIGluIGBFMmA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRTEgb24gU3RyaW5nIHsKICAgaW50IGdldCBjaGFyQ291bnQgPT4gMTsKIH0KQEAgLTE1NCw3ICsxNTQsNyBAQAogSWYgeW91IG5lZWQgYm90aCwgdGhlbiBleHBsaWNpdGx5IHNlbGVjdCB0aGUgb25lIHlvdSB3YW50IHRvIHVzZSBieSB1c2luZwogYW4gZXh0ZW5zaW9uIG92ZXJyaWRlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUxIG9uIFN0cmluZyB7CiAgIGludCBnZXQgY2hhckNvdW50ID0+IGxlbmd0aDsKIH0KQEAgLTE4MSwyMSArMTgxLDIxIEBACiAKIEdpdmVuIGEgbGlicmFyeSAoYGEuZGFydGApIHRoYXQgZGVmaW5lcyBhIGNsYXNzIChgQ2AgaW4gdGhpcyBleGFtcGxlKToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEge30KIGNsYXNzIEMge30KIHslIGVuZHByZXR0aWZ5ICV9CiAKIEFuZCBhIGxpYnJhcnkgKGBiLmRhcnRgKSB0aGF0IGRlZmluZXMgYSBkaWZmZXJlbnQgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQiB7fQogY2xhc3MgQyB7fQogeyUgZW5kcHJldHRpZnkgJX0KIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnYS5kYXJ0JzsKIGltcG9ydCAnYi5kYXJ0JzsKIApAQCAtMjA3LDcgKzIwNyw3IEBACiBJZiBhbnkgb2YgdGhlIGxpYnJhcmllcyBhcmVuJ3QgbmVlZGVkLCB0aGVuIHJlbW92ZSB0aGUgaW1wb3J0IGRpcmVjdGl2ZXMKIGZvciB0aGVtOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdhLmRhcnQnOwogCiB2b2lkIGYoQyBjMSwgQyBjMikge30KQEAgLTIxNiw3ICsyMTYsNyBAQAogSWYgdGhlIG5hbWUgaXMgc3RpbGwgZGVmaW5lZCBieSBtb3JlIHRoYW4gb25lIGxpYnJhcnksIHRoZW4gYWRkIGEgYGhpZGVgCiBjbGF1c2UgdG8gdGhlIGltcG9ydCBkaXJlY3RpdmVzIGZvciBhbGwgZXhjZXB0IG9uZSBsaWJyYXJ5OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdhLmRhcnQnIGhpZGUgQzsKIGltcG9ydCAnYi5kYXJ0JzsKIApAQCAtMjI3LDcgKzIyNyw3IEBACiBwcmVmaXggdG8gZWFjaCBvZiB0aGUgaW1wb3J0IGRpcmVjdGl2ZXMsIGFuZCBxdWFsaWZ5IHRoZSByZWZlcmVuY2VzIHdpdGgKIHRoZSBhcHByb3ByaWF0ZSBwcmVmaXg6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ2EuZGFydCcgYXMgYTsKIGltcG9ydCAnYi5kYXJ0JyBhcyBiOwogCkBAIC0yNTgsNyArMjU4LDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gYSwgTGlzdDxTdHJpbmc+IGIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYykgPT4KICAgICBbIXsuLi5hLCAuLi5iLCAuLi5jfSFdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTI3Myw3ICsyNzMsNyBAQAogY29uc2lzdGVudC4gSW4gdGhpcyBjYXNlLCB0aGF0IGxpa2VseSBtZWFucyByZW1vdmluZyB0aGUgbGlzdCBhbmQgZGVjaWRpbmcKIHdoYXQgdG8gZG8gYWJvdXQgdGhlIG5vdyB1bnVzZWQgcGFyYW1ldGVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdW5pb24oTWFwPFN0cmluZywgU3RyaW5nPiBhLCBMaXN0PFN0cmluZz4gYiwgTWFwPFN0cmluZywgU3RyaW5nPiBjKSA9PgogICAgIHsuLi5hLCAuLi5jfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0yODIsNyArMjgyLDcgQEAKIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgZWxlbWVudHMuIEZvciBleGFtcGxlLCB5b3UgY2FuIGFkZCB0aGUgZWxlbWVudHMKIG9mIHRoZSBsaXN0IGFzIGtleXMgdGhhdCBtYXAgdG8gdGhlbXNlbHZlczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gYSwgTGlzdDxTdHJpbmc+IGIsIE1hcDxTdHJpbmcsIFN0cmluZz4gYykgPT4KICAgICB7Li4uYSwgZm9yIChTdHJpbmcgcyBpbiBiKSBzOiBzLCAuLi5jfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0zMTAsNyArMzEwLDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKGEsIGIpID0+IFshey4uLmEsIC4uLmJ9IV07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zMjMsNyArMzIzLDcgQEAKIGFyZ3VtZW50cyB0byB0aGUgbGl0ZXJhbC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBsaXRlcmFsIGlzIGludGVuZGVkIHRvIGJlIGEKIG1hcCBsaXRlcmFsLCB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKGEsIGIpID0+IDxTdHJpbmcsIFN0cmluZz57Li4uYSwgLi4uYn07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zMzEsMjEgKzMzMSwyMSBAQAogZWl0aGVyIHRoZSB0eXBlIGBJdGVyYWJsZWAgb3IgdGhlIHR5cGUgYE1hcGAuIFlvdSBjYW4gYWRkIGFuIGV4cGxpY2l0IGNhc3QKIG9yLCBpbiB0aGlzIGNhc2UsIGFkZCB0eXBlcyB0byB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSB0d28gcGFyYW1ldGVyczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKExpc3Q8aW50PiBhLCBMaXN0PGludD4gYikgPT4gey4uLmEsIC4uLmJ9OwogeyUgZW5kcHJldHRpZnkgJX0KIAogVGhlIHRoaXJkIGZpeCBpcyB0byBhZGQgY29udGV4dCBpbmZvcm1hdGlvbi4gSW4gdGhpcyBjYXNlLCB0aGF0IG1lYW5zCiBhZGRpbmcgYSByZXR1cm4gdHlwZSB0byB0aGUgZnVuY3Rpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBTZXQ8U3RyaW5nPiB1bmlvbihhLCBiKSA9PiB7Li4uYSwgLi4uYn07CiB7JSBlbmRwcmV0dGlmeSAlfQogCiBJbiBvdGhlciBjYXNlcywgeW91IG1pZ2h0IGFkZCBhIHR5cGUgc29tZXdoZXJlIGVsc2UuIEZvciBleGFtcGxlLCBzYXkgdGhlCiBvcmlnaW5hbCBjb2RlIGxvb2tzIGxpa2UgdGhpczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHVuaW9uKGEsIGIpIHsKICAgdmFyIHggPSBbIXsuLi5hLCAuLi5ifSFdOwogICByZXR1cm4geDsKQEAgLTM1NCw3ICszNTQsNyBAQAogCiBZb3UgbWlnaHQgYWRkIGEgdHlwZSBhbm5vdGF0aW9uIG9uIGB4YCwgbGlrZSB0aGlzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdW5pb24oYSwgYikgewogICBNYXA8U3RyaW5nLCBTdHJpbmc+IHggPSB7Li4uYSwgLi4uYn07CiAgIHJldHVybiB4OwpAQCAtMzc1LDcgKzM3NSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYSBgbnVtYCBjYW4ndCBiZQogYXNzaWduZWQgdG8gYSBgU3RyaW5nYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIFN0cmluZyBmKFN0cmluZyB4KSA9PiB4OwogU3RyaW5nIGcobnVtIHkpID0+IGYoWyF5IV0pOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTM4NSw3ICszODUsNyBAQAogSWYgcG9zc2libGUsIHJld3JpdGUgdGhlIGNvZGUgc28gdGhhdCB0aGUgc3RhdGljIHR5cGUgaXMgYXNzaWduYWJsZS4gSW4gdGhlCiBleGFtcGxlIGFib3ZlIHlvdSBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGB5YDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIFN0cmluZyBmKFN0cmluZyB4KSA9PiB4OwogU3RyaW5nIGcoU3RyaW5nIHkpID0+IGYoeSk7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtMzk0LDE0ICszOTQsMTQgQEAKIGFyZ3VtZW50IHZhbHVlIGlzbid0IHRoZSByZXF1aXJlZCB0eXBlLiBPbmUgYXBwcm9hY2ggaXMgdG8gY29lcmNlIG90aGVyCiB0eXBlcyB0byB0aGUgcmVxdWlyZWQgdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIFN0cmluZyBmKFN0cmluZyB4KSA9PiB4OwogU3RyaW5nIGcobnVtIHkpID0+IGYoeS50b1N0cmluZygpKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKIEFub3RoZXIgYXBwcm9hY2ggaXMgdG8gYWRkIGV4cGxpY2l0IHR5cGUgdGVzdHMgYW5kIGZhbGxiYWNrIGNvZGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBTdHJpbmcgZihTdHJpbmcgeCkgPT4geDsKIFN0cmluZyBnKG51bSB5KSA9PiBmKHkgaXMgU3RyaW5nID8geSA6ICcnKTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00MTAsNyArNDEwLDcgQEAKIHNhbWUgYXMgdGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIGFuZCB5b3UncmUgd2lsbGluZyB0byByaXNrIGhhdmluZwogYW4gZXhjZXB0aW9uIHRocm93biBhdCBydW50aW1lIGlmIHlvdSdyZSB3cm9uZywgdGhlbiBhZGQgYW4gZXhwbGljaXQgY2FzdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIFN0cmluZyBmKFN0cmluZyB4KSA9PiB4OwogU3RyaW5nIGcobnVtIHkpID0+IGYoeSBhcyBTdHJpbmcpOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQyOSw3ICs0MjksNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHZgIGlzIGZpbmFsOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZpbmFsIHYgPSAwOwogfQpAQCAtNDQ0LDcgKzQ0NCw3IEBACiBJZiB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCB0aGVuIHJlbW92ZSB0aGUKIG1vZGlmaWVyIGBmaW5hbGAgZnJvbSB0aGUgZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHYgPSAwOwogfQpAQCAtNDY4LDcgKzQ2OCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzIGZpbmFsLCBzbyBpdAogY2FuJ3QgaGF2ZSBhIHZhbHVlIGFzc2lnbmVkIHRvIGl0IGFmdGVyIGl0IHdhcyBpbml0aWFsaXplZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgZmluYWwgeCA9IDA7CiAgIFsheCFdID0gMzsKQEAgLTQ4MSw3ICs0ODEsNyBAQAogUmVtb3ZlIHRoZSBrZXl3b3JkIGBmaW5hbGAsIGFuZCByZXBsYWNlIGl0IHdpdGggYHZhcmAgaWYgdGhlcmUncyBubyB0eXBlCiBhbm5vdGF0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKCkgewogICB2YXIgeCA9IDA7CiAgIHggPSAzOwpAQCAtNTA0LDcgKzUwNCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUgaXMgbm8gc2V0dGVyCiBuYW1lZCBgeGAgaW4gYENgLCBidXQgdGhlcmUgaXMgYSBnZXR0ZXIgbmFtZWQgYHhgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCBnZXQgeCA9PiAwOwogICBzZXQgeShpbnQgcCkge30KQEAgLTUxOSw3ICs1MTksNyBAQAogCiBJZiB5b3Ugd2FudCB0byBpbnZva2UgYW4gZXhpc3Rpbmcgc2V0dGVyLCB0aGVuIGNvcnJlY3QgdGhlIG5hbWU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IGdldCB4ID0+IDA7CiAgIHNldCB5KGludCBwKSB7fQpAQCAtNTMzLDcgKzUzMyw3IEBACiBJZiB5b3Ugd2FudCB0byBpbnZva2UgdGhlIHNldHRlciBidXQgaXQganVzdCBkb2Vzbid0IGV4aXN0IHlldCwgdGhlbgogZGVjbGFyZSBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgZ2V0IHggPT4gMDsKICAgc2V0IHgoaW50IHApIHt9CkBAIC01NTksNyArNTU5LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZmAgY2FuJ3QgYmUgYXNzaWduZWQgYQogdmFsdWUgYmVjYXVzZSBpdCdzIGEgbWV0aG9kOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIHZvaWQgZigpIHt9CiAKQEAgLTU5MSw3ICs1OTEsNyBAQAogaW1wbGljaXQgcmV0dXJuIG9mIGBudWxsYCBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBtZXRob2QsIGJ1dCB0aGUgbWV0aG9kCiBpcyBkZWNsYXJlZCB0byBub3QgcmV0dXJuIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgWyFtIV0oaW50IHQpIHsKICAgICBwcmludCh0KTsKQEAgLTYwNCw3ICs2MDQsNyBAQAogdGhlIGNsYXNzIGBDYCBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGggYSBub24tbnVsbGFibGUgdHlwZSBhcmd1bWVudCwgdGhlCiBtZXRob2QgaXMgZWZmZWN0aXZlbHkgZGVjbGFyZWQgdG8gbm90IHJldHVybiBgbnVsbGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDPFQ+IHsKICAgVCBbIW0hXShUIHQpIHsKICAgICBwcmludCh0KTsKQEAgLTYxNCwxMCArNjE0LDEwIEBACiAKICMjIyMgQ29tbW9uIGZpeGVzCiAKLUlmIHRoZXJlJ3MgYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkLCB0aGVuIGFkZCBhIHJldHVybgorSWYgdGhlcmUncyBhIHJlYXNvbmFibGUgdmFsdWUgdGhhdCBjYW4gYmUgcmV0dXJuZWQsIHRoZW4gYWRkIGEgYHJldHVybmAKIHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBtZXRob2Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDPFQ+IHsKICAgVCBtKFQgdCkgewogICAgIHByaW50KHQpOwpAQCAtNjI2LDEwICs2MjYsMTAgQEAKIH0KIHslIGVuZHByZXR0aWZ5ICV9CiAKLUlmIHRoZSBtZXRob2Qgd29uJ3QgcmVhY2ggdGhlIGltcGxpY2l0IHJldHVybiwgdGhlbiBhZGQgYSB0aHJvdyBhdCB0aGUgZW5kCi1vZiB0aGUgbWV0aG9kOgorSWYgdGhlIG1ldGhvZCB3b24ndCByZWFjaCB0aGUgaW1wbGljaXQgcmV0dXJuLCB0aGVuIGFkZCBhIGB0aHJvd2AgYXQgdGhlCitlbmQgb2YgdGhlIG1ldGhvZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEM8VD4gewogICBUIG0oVCB0KSB7CiAgICAgcHJpbnQodCk7CkBAIC02NDEsNyArNjQxLDcgQEAKIElmIHRoZSBtZXRob2QgaW50ZW50aW9uYWxseSByZXR1cm5zIGBudWxsYCBhdCB0aGUgZW5kLCB0aGVuIGNoYW5nZSB0aGUKIHJldHVybiB0eXBlIHNvIHRoYXQgaXQncyB2YWxpZCB0byByZXR1cm4gYG51bGxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQzxUPiB7CiAgIFQ/IG0oVCB0KSB7CiAgICAgcHJpbnQodCk7CkBAIC02NjMsNyArNjYzLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgbWl4aW5gIGlzIGEgYnVpbHQtaW4KIGlkZW50aWZpZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gWyFtaXhpbiFdIG9uIGludCB7fQogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtNjg1LDcgKzY4NSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGltcG9ydGAgY2FuJ3QgYmUgdXNlZAogYXMgYSB0eXBlIGJlY2F1c2UgaXQncyBhIGJ1aWx0LWluIGlkZW50aWZpZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBbIWltcG9ydCFdPGludD4geDsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTY5Myw3ICs2OTMsNyBAQAogCiBSZXBsYWNlIHRoZSBidWlsdC1pbiBpZGVudGlmaWVyIHdpdGggdGhlIG5hbWUgb2YgYSB2YWxpZCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogTGlzdDxpbnQ+IHg7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC03MDQsMTYgKzcwNCwxNiBAQAogCiAjIyMjIERlc2NyaXB0aW9uCiAKLVRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gYSBjYXNlCitUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIGxhc3Qgc3RhdGVtZW50IGluIGEgYGNhc2VgCiBibG9jayBpc24ndCBvbmUgb2YgdGhlIHJlcXVpcmVkIHRlcm1pbmF0b3JzOiBgYnJlYWtgLCBgY29udGludWVgLAogYHJldGhyb3dgLCBgcmV0dXJuYCwgb3IgYHRocm93YC4KIAogIyMjIyBFeGFtcGxlcwogCi1UaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGNhc2UgYmxvY2sgZW5kcworVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBgY2FzZWAgYmxvY2sgZW5kcwogd2l0aCBhbiBhc3NpZ25tZW50OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKGludCB4KSB7CiAgIHN3aXRjaCAoeCkgewogICAgIFshY2FzZSFdIDA6CkBAIC03MjgsNyArNzI4LDcgQEAKIAogQWRkIG9uZSBvZiB0aGUgcmVxdWlyZWQgdGVybWluYXRvcnM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHgpIHsKICAgc3dpdGNoICh4KSB7CiAgICAgY2FzZSAwOgpAQCAtNzQ4LDE1ICs3NDgsMTUgQEAKICMjIyMgRGVzY3JpcHRpb24KIAogVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIHRoZSBleHByZXNzaW9uIGZvbGxvd2luZyBgY2FzZWAKLWluIGEgc3dpdGNoIHN0YXRlbWVudCBoYXMgYSBzdGF0aWMgdHlwZSB0aGF0IGlzbid0IGEgc3VidHlwZSBvZiB0aGUgc3RhdGljCi10eXBlIG9mIHRoZSBleHByZXNzaW9uIGZvbGxvd2luZyBgc3dpdGNoYC4KK2luIGEgYHN3aXRjaGAgc3RhdGVtZW50IGhhcyBhIHN0YXRpYyB0eXBlIHRoYXQgaXNuJ3QgYSBzdWJ0eXBlIG9mIHRoZQorc3RhdGljIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZm9sbG93aW5nIGBzd2l0Y2hgLgogCiAjIyMjIEV4YW1wbGUKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGAxYCBpcyBhbiBgaW50YCwgd2hpY2gKIGlzbid0IGEgc3VidHlwZSBvZiBgU3RyaW5nYCAodGhlIHR5cGUgb2YgYHNgKToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihTdHJpbmcgcykgewogICBzd2l0Y2ggKHMpIHsKICAgICBjYXNlIFshMSFdOgpAQCAtNzY3LDEwICs3NjcsMTAgQEAKIAogIyMjIyBDb21tb24gZml4ZXMKIAotSWYgdGhlIHZhbHVlIG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaXMgd3JvbmcsIHRoZW4gY2hhbmdlIHRoZSBjYXNlCitJZiB0aGUgdmFsdWUgb2YgdGhlIGBjYXNlYCBleHByZXNzaW9uIGlzIHdyb25nLCB0aGVuIGNoYW5nZSB0aGUgYGNhc2VgCiBleHByZXNzaW9uIHNvIHRoYXQgaXQgaGFzIHRoZSByZXF1aXJlZCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFN0cmluZyBzKSB7CiAgIHN3aXRjaCAocykgewogICAgIGNhc2UgJzEnOgpAQCAtNzc5LDEwICs3NzksMTAgQEAKIH0KIHslIGVuZHByZXR0aWZ5ICV9CiAKLUlmIHRoZSB2YWx1ZSBvZiB0aGUgY2FzZSBleHByZXNzaW9uIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSBzd2l0Y2gKK0lmIHRoZSB2YWx1ZSBvZiB0aGUgYGNhc2VgIGV4cHJlc3Npb24gaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlIGBzd2l0Y2hgCiBleHByZXNzaW9uIHRvIGhhdmUgdGhlIHJlcXVpcmVkIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHMpIHsKICAgc3dpdGNoIChzKSB7CiAgICAgY2FzZSAxOgpAQCAtODA1LDcgKzgwNSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzIGEgdmFyaWFibGUsIG5vdAogYSB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogbnVtIHggPSAwOwogaW50IHkgPSB4IGFzIFsheCFdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTgxNCw3ICs4MTQsNyBAQAogCiBSZXBsYWNlIHRoZSBuYW1lIHdpdGggdGhlIG5hbWUgb2YgYSB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogbnVtIHggPSAwOwogaW50IHkgPSB4IGFzIGludDsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC04MzQsNyArODM0LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgbWAgaXMgYW4gYWJzdHJhY3QKIG1ldGhvZCBidXQgYENgIGlzbid0IGFuIGFic3RyYWN0IGNsYXNzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIFshdm9pZCBtKCk7IV0KIH0KQEAgLTg0NSw3ICs4NDUsNyBAQAogSWYgaXQncyB2YWxpZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcywgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbgogZm9yIHRoZSBtZW1iZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgdm9pZCBtKCkge30KIH0KQEAgLTg1NCw3ICs4NTQsNyBAQAogSWYgaXQgaXNuJ3QgdmFsaWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MsIG1hcmsgdGhlIGNsYXNzIGFzIGJlaW5nCiBhYnN0cmFjdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEMgewogICB2b2lkIG0oKTsKIH0KQEAgLTg3NSw3ICs4NzUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBydW50aW1lIHR5cGUgb2YgYGlgCiBpcyBgaW50YCwgd2hpY2ggY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHN0YXRpYyB0eXBlIG9mIGBzYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBTdHJpbmcgczsKIApAQCAtODkzLDcgKzg5Myw3IEBACiAKIFBhc3MgYSB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlIHRvIHRoZSBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBTdHJpbmcgczsKIApAQCAtOTIyLDcgKzkyMiw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGZpZWxkIGB4YCBpc24ndAogZmluYWw6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAKQEAgLTkzNCw3ICs5MzQsNyBAQAogCiBJZiBpdCdzIHBvc3NpYmxlIHRvIG1hcmsgYWxsIG9mIHRoZSBmaWVsZHMgYXMgZmluYWwsIHRoZW4gZG8gc286CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgZmluYWwgaW50IHg7CiAKQEAgLTk0NSw3ICs5NDUsNyBAQAogSWYgaXQgaXNuJ3QgcG9zc2libGUgdG8gbWFyayBhbGwgb2YgdGhlIGZpZWxkcyBhcyBmaW5hbCwgdGhlbiByZW1vdmUgdGhlCiBrZXl3b3JkIGBjb25zdGAgZnJvbSB0aGUgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAKQEAgLTk2OCw3ICs5NjgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCBpc24ndCBkZWNsYXJlZCB0bwogYmUgYGNvbnN0YDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciB4ID0gMDsKIGNvbnN0IHkgPSBbIXghXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC05NzgsNyArOTc4LDcgQEAKIElmIHRoZSB2YWx1ZSBiZWluZyBhc3NpZ25lZCBjYW4gYmUgZGVjbGFyZWQgdG8gYmUgYGNvbnN0YCwgdGhlbiBjaGFuZ2UgdGhlCiBkZWNsYXJhdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IHggPSAwOwogY29uc3QgeSA9IHg7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtOTg2LDcgKzk4Niw3IEBACiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgZGVjbGFyZWQgdG8gYmUgYGNvbnN0YCwgdGhlbiByZW1vdmUgdGhlIGBjb25zdGAKIG1vZGlmaWVyIGZyb20gdGhlIHZhcmlhYmxlLCBwb3NzaWJseSB1c2luZyBgZmluYWxgIGluIGl0cyBwbGFjZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciB4ID0gMDsKIGZpbmFsIHkgPSB4OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTEwMDUsNyArMTAwNSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGlzIGFuIGluc3RhbmNlCiBmaWVsZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBbIWNvbnN0IV0gaW50IGYgPSAzOwogfQpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIElmIHRoZSBmaWVsZCBuZWVkcyB0byBiZSBhbiBpbnN0YW5jZSBmaWVsZCwgdGhlbiByZW1vdmUgdGhlIGtleXdvcmQKIGBjb25zdGAsIG9yIHJlcGxhY2UgaXQgd2l0aCBgZmluYWxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZpbmFsIGludCBmID0gMzsKIH0KQEAgLTEwMjQsNyArMTAyNCw3IEBACiAKIElmIHRoZSBmaWVsZCByZWFsbHkgc2hvdWxkIGJlIGEgY29uc3QgZmllbGQsIHRoZW4gbWFrZSBpdCBhIHN0YXRpYyBmaWVsZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzdGF0aWMgY29uc3QgaW50IGYgPSAzOwogfQpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBjYCBpc24ndCBpbml0aWFsaXplZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IFshYyFdOwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtMTA1MSw3ICsxMDUxLDcgQEAKIAogQWRkIGFuIGluaXRpYWxpemVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgYyA9ICdjJzsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTEwNzAsNyArMTA3MCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHZhbHVlIG9mIGBsaXN0MWAgaXMKIGBudWxsYCwgd2hpY2ggaXMgbmVpdGhlciBhIGxpc3Qgbm9yIGEgc2V0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgTGlzdDxpbnQ+IGxpc3QxID0gbnVsbDsKIGNvbnN0IExpc3Q8aW50PiBsaXN0MiA9IFsuLi5bIWxpc3QxIV1dOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTEwODAsNyArMTA4MCw3IEBACiBDaGFuZ2UgdGhlIGV4cHJlc3Npb24gdG8gc29tZXRoaW5nIHRoYXQgZXZhbHVhdGVzIHRvIGVpdGhlciBhIGNvbnN0YW50IGxpc3QKIG9yIGEgY29uc3RhbnQgc2V0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgTGlzdDxpbnQ+IGxpc3QxID0gW107CiBjb25zdCBMaXN0PGludD4gbGlzdDIgPSBbLi4ubGlzdDFdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTEwOTksNyArMTA5OSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHZhbHVlIG9mIGBtYXAxYCBpcwogYG51bGxgLCB3aGljaCBpc24ndCBhIG1hcDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IE1hcDxTdHJpbmcsIGludD4gbWFwMSA9IG51bGw7CiBjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG1hcDIgPSB7Li4uWyFtYXAxIV19OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTExMDgsNyArMTEwOCw3IEBACiAKIENoYW5nZSB0aGUgZXhwcmVzc2lvbiB0byBzb21ldGhpbmcgdGhhdCBldmFsdWF0ZXMgdG8gYSBjb25zdGFudCBtYXA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG1hcDEgPSB7fTsKIGNvbnN0IE1hcDxTdHJpbmcsIGludD4gbWFwMiA9IHsuLi5tYXAxfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0xMTI3LDcgKzExMjcsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpbiBgQWAKIGlzbid0IGEgY29uc3QgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgQSgpOwogfQpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIG1ha2luZyBhbGwgb2YgdGhlIGZpZWxkcyBvZiB0aGUgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLCBmaW5hbCksCiB0aGVuIGFkZCB0aGUga2V5d29yZCBgY29uc3RgIHRvIHRoZSBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgewogICBjb25zdCBBKCk7CiB9CkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCiBPdGhlcndpc2UsIHJlbW92ZSB0aGUga2V5d29yZCBgY29uc3RgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7CiAgIEEoKTsKIH0KQEAgLTExNzIsNyArMTE3Miw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgaWAgaXNuJ3QgYSBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBpbnQgaTsKICAgY29uc3QgQyh0aGlzLmkpOwpAQCAtMTE4NSw3ICsxMTg1LDcgQEAKIEVpdGhlciBtYWtlIGFsbCBvZiB0aGUgYXJndW1lbnRzIGNvbnN0YW50IGV4cHJlc3Npb25zLCBvciByZW1vdmUgdGhlCiBgY29uc3RgIGtleXdvcmQgdG8gdXNlIHRoZSBub24tY29uc3RhbnQgZm9ybSBvZiB0aGUgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgZmluYWwgaW50IGk7CiAgIGNvbnN0IEModGhpcy5pKTsKQEAgLTEyMDcsNyArMTIwNyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGludm9jYXRpb24gb2YKIGBwcmludGAgb2NjdXJzIGFmdGVyIHRoZSBmdW5jdGlvbiBoYXMgcmV0dXJuZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHJldHVybjsKICAgWyFwcmludCgnaGVyZScpOyFdCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCiBJZiB0aGUgY29kZSBpc24ndCBuZWVkZWQsIHRoZW4gcmVtb3ZlIGl0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKCkgewogICByZXR1cm47CiB9CkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogSWYgdGhlIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIHRoZW4gZWl0aGVyIG1vdmUgdGhlIGNvZGUgdG8gYSBwbGFjZQogd2hlcmUgaXQgd2lsbCBiZSBleGVjdXRlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgcHJpbnQoJ2hlcmUnKTsKICAgcmV0dXJuOwpAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAogT3IsIHJld3JpdGUgdGhlIGNvZGUgYmVmb3JlIGl0LCBzbyB0aGF0IGl0IGNhbiBiZSByZWFjaGVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKHtib29sIHNraXBQcmludGluZyA9IHRydWV9KSB7CiAgIGlmIChza2lwUHJpbnRpbmcpIHsKICAgICByZXR1cm47CkBAIC0xMjUyLDE3ICsxMjUyLDE3IEBACiAKICMjIyMgRGVzY3JpcHRpb24KIAotVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgY2F0Y2ggY2xhdXNlIGlzIGZvdW5kIHRoYXQKLWNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgaXTigJlzIGFmdGVyIGEgY2F0Y2ggY2xhdXNlIG9mIHRoZSBmb3JtIGBjYXRjaCAoZSlgCi1vciBgb24gT2JqZWN0IGNhdGNoIChlKWAuIFRoZSBmaXJzdCBjYXRjaCBjbGF1c2UgdGhhdCBtYXRjaGVzIHRoZSB0aHJvd24KLW9iamVjdCBpcyBzZWxlY3RlZCwgYW5kIGJvdGggb2YgdGhvc2UgZm9ybXMgd2lsbCBtYXRjaCBhbnkgb2JqZWN0LCBzbyBubwotY2F0Y2ggY2xhdXNlcyB0aGF0IGZvbGxvdyB0aGVtIHdpbGwgYmUgc2VsZWN0ZWQuCitUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBgY2F0Y2hgIGNsYXVzZSBpcyBmb3VuZCB0aGF0CitjYW4ndCBiZSBleGVjdXRlZCBiZWNhdXNlIGl04oCZcyBhZnRlciBhIGBjYXRjaGAgY2xhdXNlIG9mIHRoZSBmb3JtCitgY2F0Y2ggKGUpYCBvciBgb24gT2JqZWN0IGNhdGNoIChlKWAuIFRoZSBmaXJzdCBgY2F0Y2hgIGNsYXVzZSB0aGF0IG1hdGNoZXMKK3RoZSB0aHJvd24gb2JqZWN0IGlzIHNlbGVjdGVkLCBhbmQgYm90aCBvZiB0aG9zZSBmb3JtcyB3aWxsIG1hdGNoIGFueQorb2JqZWN0LCBzbyBubyBgY2F0Y2hgIGNsYXVzZXMgdGhhdCBmb2xsb3cgdGhlbSB3aWxsIGJlIHNlbGVjdGVkLgogCiAjIyMjIEV4YW1wbGVzCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgIH0gY2F0Y2ggKGUpIHsKQEAgLTEyNzYsNyArMTI3Niw3IEBACiBJZiB0aGUgY2xhdXNlIHNob3VsZCBiZSBzZWxlY3RhYmxlLCB0aGVuIG1vdmUgdGhlIGNsYXVzZSBiZWZvcmUgdGhlIGdlbmVyYWwKIGNsYXVzZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgfSBvbiBTdHJpbmcgewpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAogSWYgdGhlIGNsYXVzZSBkb2Vzbid0IG5lZWQgdG8gYmUgc2VsZWN0YWJsZSwgdGhlbiByZW1vdmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgIH0gY2F0Y2ggKGUpIHsKQEAgLTEzMDIsMTAgKzEzMDIsMTAgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBjYXRjaCBjbGF1c2UgaXMgZm91bmQgdGhhdAotY2FuJ3QgYmUgZXhlY3V0ZWQgYmVjYXVzZSBpdCBpcyBhZnRlciBhIGNhdGNoIGNsYXVzZSB0aGF0IGNhdGNoZXMgZWl0aGVyCi10aGUgc2FtZSB0eXBlIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSBjbGF1c2UncyB0eXBlLiBUaGUgZmlyc3QgY2F0Y2ggY2xhdXNlCi10aGF0IG1hdGNoZXMgdGhlIHRocm93biBvYmplY3QgaXMgc2VsZWN0ZWQsIGFuZCB0aGUgZWFybGllciBjbGF1c2UgbCBhbHdheXMKK1RoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGBjYXRjaGAgY2xhdXNlIGlzIGZvdW5kIHRoYXQKK2Nhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgaXQgaXMgYWZ0ZXIgYSBgY2F0Y2hgIGNsYXVzZSB0aGF0IGNhdGNoZXMgZWl0aGVyCit0aGUgc2FtZSB0eXBlIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSBjbGF1c2UncyB0eXBlLiBUaGUgZmlyc3QgYGNhdGNoYCBjbGF1c2UKK3RoYXQgbWF0Y2hlcyB0aGUgdGhyb3duIG9iamVjdCBpcyBzZWxlY3RlZCwgYW5kIHRoZSBlYXJsaWVyIGNsYXVzZSBhbHdheXMKIG1hdGNoZXMgYW55dGhpbmcgbWF0Y2hhYmxlIGJ5IHRoZSBoaWdobGlnaHRlZCBjbGF1c2UsIHNvIHRoZSBoaWdobGlnaHRlZAogY2xhdXNlIHdpbGwgbmV2ZXIgYmUgc2VsZWN0ZWQuCiAKQEAgLTEzMTMsNyArMTMxMyw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgIH0gb24gbnVtIHsKQEAgLTEzMjcsNyArMTMyNyw3IEBACiBJZiB0aGUgY2xhdXNlIHNob3VsZCBiZSBzZWxlY3RhYmxlLCB0aGVuIG1vdmUgdGhlIGNsYXVzZSBiZWZvcmUgdGhlIGdlbmVyYWwKIGNsYXVzZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgfSBvbiBpbnQgewpAQCAtMTMzOCw3ICsxMzM4LDcgQEAKIAogSWYgdGhlIGNsYXVzZSBkb2Vzbid0IG5lZWQgdG8gYmUgc2VsZWN0YWJsZSwgdGhlbiByZW1vdmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgIH0gb24gbnVtIHsKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgY2FuJ3QgYmUgYG51bGxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGYoaW50IHgpIHsKICAgcmV0dXJuIHggPz8gWyEwIV07CiB9CkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGNhbid0IGJlIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgZiA9IC0xOwogCkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogSWYgdGhlIGRpYWdub3N0aWMgaXMgcmVwb3J0ZWQgZm9yIGFuIGA/P2Agb3BlcmF0b3IsIHRoZW4gcmVtb3ZlIHRoZSBgPz9gCiBvcGVyYXRvciBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgZihpbnQgeCkgewogICByZXR1cm4geDsKIH0KQEAgLTE0MDAsNyArMTQwMCw3IEBACiBJZiB0aGUgZGlhZ25vc3RpYyBpcyByZXBvcnRlZCBmb3IgYW4gYXNzaWdubWVudCwgYW5kIHRoZSBhc3NpZ25tZW50IGlzbid0CiBuZWVkZWQsIHRoZW4gcmVtb3ZlIHRoZSBhc3NpZ25tZW50OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCBmID0gLTE7CiAKQEAgLTE0MTIsNyArMTQxMiw3IEBACiBJZiB0aGUgYXNzaWdubWVudCBpcyBuZWVkZWQsIGJ1dCBzaG91bGQgYmUgYmFzZWQgb24gYSBkaWZmZXJlbnQgY29uZGl0aW9uLAogdGhlbiByZXdyaXRlIHRoZSBjb2RlIHRvIHVzZSBgPWAgYW5kIHRoZSBkaWZmZXJlbnQgY29uZGl0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCBmID0gLTE7CiAKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAKICMjIyBkZWZhdWx0X2xpc3RfY29uc3RydWN0b3IKIAotX1RoZSBkZWZhdWx0ICdMaXN0JyBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlIHdoZW4gbnVsbCBzYWZldHkgaXMgZW5hYmxlZC5fCitfVGhlIGRlZmF1bHQgJ0xpc3QnIGNvbnN0cnVjdG9yIGlzbid0IGF2YWlsYWJsZSB3aGVuIG51bGwgc2FmZXR5IGlzIGVuYWJsZWQuXwogCiAjIyMjIERlc2NyaXB0aW9uCiAKQEAgLTE0MzgsNyArMTQzOCw3IEBACiBBc3N1bWluZyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgb3B0ZWQgaW4gdG8gbnVsbCBzYWZldHksIGl0IHByb2R1Y2VzIHRoaXMKIGRpYWdub3N0aWMgYmVjYXVzZSBpdCB1c2VzIHRoZSBkZWZhdWx0IGBMaXN0YCBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBsID0gWyFMaXN0PGludD4hXSgpOwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtMTQ0NywyMSArMTQ0NywyMSBAQAogSWYgbm8gaW5pdGlhbCBzaXplIGlzIHByb3ZpZGVkLCB0aGVuIGNvbnZlcnQgdGhlIGNvZGUgdG8gdXNlIGEgbGlzdAogbGl0ZXJhbDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBsID0gPGludD5bXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKIElmIGFuIGluaXRpYWwgc2l6ZSBuZWVkcyB0byBiZSBwcm92aWRlZCBhbmQgdGhlcmUgaXMgYSBzaW5nbGUgcmVhc29uYWJsZQogaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnRzLCB0aGVuIHVzZSBgTGlzdC5maWxsZWRgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIGwgPSBMaXN0LmZpbGxlZCgzLCAwKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKIElmIGFuIGluaXRpYWwgc2l6ZSBuZWVkcyB0byBiZSBwcm92aWRlZCBidXQgZWFjaCBlbGVtZW50IG5lZWRzIHRvIGJlCiBjb21wdXRlZCwgdGhlbiB1c2UgYExpc3QuZ2VuZXJhdGVgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIGwgPSBMaXN0LmdlbmVyYXRlKDMsIChpKSA9PiBpKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTE0NzgsMTAgKzE0NzgsMTAgQEAKIAogIyMjIyBFeGFtcGxlCiAKLVRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgd2FzIG5vdCBhc3NpZ25lZCBhCitUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIHdhc24ndCBhc3NpZ25lZCBhCiB2YWx1ZSBiZWZvcmUgYmVpbmcgcmVhZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihib29sIGIpIHsKICAgbGF0ZSBpbnQgeDsKICAgcHJpbnQoWyF4IV0pOwpAQCAtMTQ5Miw3ICsxNDkyLDcgQEAKIAogQXNzaWduIGEgdmFsdWUgdG8gdGhlIHZhcmlhYmxlIGJlZm9yZSByZWFkaW5nIGZyb20gaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoYm9vbCBiKSB7CiAgIGxhdGUgaW50IHg7CiAgIHggPSBiID8gMSA6IDA7CkBAIC0xNTE2LDcgKzE1MTYsNyBAQAogSWYgdGhlIG1ldGhvZCBgbWAgaW4gdGhlIGNsYXNzIGBDYCBpcyBhbm5vdGF0ZWQgd2l0aCBgQGRlcHJlY2F0ZWRgLCB0aGVuCiB0aGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKEMgYykgewogICBjLlshbSFdKCk7CiB9CkBAIC0xNTQyLDcgKzE1NDIsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzIGRlcHJlY2F0ZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBAZGVwcmVjYXRlZAogdmFyIHggPSAwOwogdmFyIHkgPSBbIXghXTsKQEAgLTE1NzEsNyArMTU3MSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUgYXJlIHR3bwogZGVjbGFyYXRpb25zIGZvciB0aGUgdW5uYW1lZCBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDKCk7CiAKQEAgLTE1ODIsNyArMTU4Miw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUgYXJlIHR3bwogZGVjbGFyYXRpb25zIGZvciB0aGUgY29uc3RydWN0b3IgbmFtZWQgYG1gOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIEMubSgpOwogCkBAIC0xNTk1LDcgKzE1OTUsNyBAQAogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHVubmFtZWQgY29uc3RydWN0b3JzIGFuZCBhbGwgb2YgdGhlIGNvbnN0cnVjdG9ycyBhcmUKIG5lZWRlZCwgdGhlbiBnaXZlIGFsbCBvZiB0aGVtLCBvciBhbGwgZXhjZXB0IG9uZSBvZiB0aGVtLCBhIG5hbWU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgQygpOwogCkBAIC0xNjA2LDcgKzE2MDYsNyBAQAogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHVubmFtZWQgY29uc3RydWN0b3JzIGFuZCBhbGwgZXhjZXB0IG9uZSBvZiB0aGVtIGFyZQogdW5uZWVkZWQsIHRoZW4gcmVtb3ZlIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCBhcmVuJ3QgbmVlZGVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIEMoKTsKIH0KQEAgLTE2MTUsNyArMTYxNSw3IEBACiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbmFtZWQgY29uc3RydWN0b3JzIGFuZCBhbGwgb2YgdGhlIGNvbnN0cnVjdG9ycyBhcmUKIG5lZWRlZCwgdGhlbiByZW5hbWUgYWxsIGV4Y2VwdCBvbmUgb2YgdGhlbToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDLm0oKTsKIApAQCAtMTYyNiw3ICsxNjI2LDcgQEAKIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBuYW1lZCBjb25zdHJ1Y3RvcnMgYW5kIGFsbCBleGNlcHQgb25lIG9mIHRoZW0gYXJlCiB1bm5lZWRlZCwgdGhlbiByZW1vdmUgdGhlIGNvbnN0cnVjdG9yc3RoYXQgYXJlbid0IG5lZWRlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDLm0oKTsKIH0KQEAgLTE2NDYsNyArMTY0Niw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIG5hbWUgYHhgIGlzCiBkZWNsYXJlZCB0d2ljZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCB4ID0gMDsKIGludCBbIXghXSA9IDE7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtMTY1NSw3ICsxNjU1LDcgQEAKIAogQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUgZm9yIG9uZSBvZiB0aGUgZGVjbGFyYXRpb25zLgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IHggPSAwOwogaW50IHkgPSAxOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTE2NzQsNyArMTY3NCw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogaW1wb3J0IFshJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnIV07CiAKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAKIFJlbW92ZSB0aGUgdW5uZWNlc3NhcnkgaW1wb3J0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogQHNlYWxlZCBjbGFzcyBDIHt9CkBAIC0xNzA1LDcgKzE3MDUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzCiB3aXRoIHRoZSBuYW1lIGBhYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihDIGMpIHsKICAgYy5tKGE6IDAsIFshYSFdOiAxKTsKIH0KQEAgLTE3MTksNyArMTcxOSw3IEBACiAKIElmIG9uZSBvZiB0aGUgYXJndW1lbnRzIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IG5hbWUsIHRoZW4gY2hhbmdlIHRoZSBuYW1lOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKEMgYykgewogICBjLm0oYTogMCwgYjogMSk7CiB9CkBAIC0xNzMxLDcgKzE3MzEsNyBAQAogCiBJZiBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyB3cm9uZywgdGhlbiByZW1vdmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoQyBjKSB7CiAgIGMubShhOiAxKTsKIH0KQEAgLTE3NTYsNyArMTc1Niw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHN0cmluZyBgJ2EnYCBpcwogc3BlY2lmaWVkIHR3aWNlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgU2V0PFN0cmluZz4gc2V0ID0geydhJywgWyEnYSchXX07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0xNzY0LDcgKzE3NjQsNyBAQAogCiBSZW1vdmUgb25lIG9mIHRoZSBkdXBsaWNhdGUgdmFsdWVzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgU2V0PFN0cmluZz4gc2V0ID0geydhJ307CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0xNzgwLDcgKzE3ODAsNyBAQAogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gZWxlbWVudCBpbiBhIG5vbi1jb25zdGFudCBzZXQKIGlzIHRoZSBzYW1lIGFzIGEgcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgc2FtZSBzZXQuIElmIHR3byBlbGVtZW50cyBhcmUgdGhlCi1zYW1lLCB0aGVuIHRoZSBzZWNvbmQgdmFsdWUgaXMgIGlnbm9yZWQsIHdoaWNoIG1ha2VzIGhhdmluZyBib3RoIGVsZW1lbnRzCitzYW1lLCB0aGVuIHRoZSBzZWNvbmQgdmFsdWUgaXMgaWdub3JlZCwgd2hpY2ggbWFrZXMgaGF2aW5nIGJvdGggZWxlbWVudHMKIHBvaW50bGVzcyBhbmQgbGlrZWx5IHNpZ25hbHMgYSBidWcuCiAKICMjIyMgRXhhbXBsZQpAQCAtMTc4OCw3ICsxNzg4LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgZWxlbWVudCBgMWAgYXBwZWFycwogdHdpY2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBhID0gMTsKIGNvbnN0IGIgPSAxOwogdmFyIHMgPSA8aW50PnthLCBbIWIhXX07CkBAIC0xNzk5LDcgKzE3OTksNyBAQAogSWYgYm90aCBlbGVtZW50cyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNldCwgdGhlbiBjaGFuZ2Ugb25lIG9mIHRoZQogZWxlbWVudHM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBhID0gMTsKIGNvbnN0IGIgPSAyOwogdmFyIHMgPSA8aW50PnthLCBifTsKQEAgLTE4MDgsNyArMTgwOCw3IEBACiBJZiBvbmx5IG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbmVlZGVkLCB0aGVuIHJlbW92ZSB0aGUgb25lIHRoYXQgaXNuJ3QKIG5lZWRlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IGEgPSAxOwogdmFyIHMgPSA8aW50PnthfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0xODMzLDcgKzE4MzMsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBrZXkgYDFgIGlzIHVzZWQKIHR3aWNlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgbWFwID0gPGludCwgU3RyaW5nPnsxOiAnYScsIDI6ICdiJywgWyExIV06ICdjJywgNDogJ2QnfTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTE4NDIsMTQgKzE4NDIsMTQgQEAKIElmIGJvdGggZW50cmllcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcCwgdGhlbiBjaGFuZ2Ugb25lIG9mIHRoZSBrZXlzCiB0byBiZSBkaWZmZXJlbnQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBtYXAgPSA8aW50LCBTdHJpbmc+ezE6ICdhJywgMjogJ2InLCAzOiAnYycsIDQ6ICdkJ307CiB7JSBlbmRwcmV0dGlmeSAlfQogCiBJZiBvbmx5IG9uZSBvZiB0aGUgZW50cmllcyBpcyBuZWVkZWQsIHRoZW4gcmVtb3ZlIHRoZSBvbmUgdGhhdCBpc24ndAogbmVlZGVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgbWFwID0gPGludCwgU3RyaW5nPnsxOiAnYScsIDI6ICdiJywgNDogJ2QnfTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTE4NzMsNyArMTg3Myw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGtleXMgYGFgIGFuZCBgYmAKIGhhdmUgdGhlIHNhbWUgdmFsdWU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBhID0gMTsKIGNvbnN0IGIgPSAxOwogdmFyIG0gPSA8aW50LCBTdHJpbmc+e2E6ICdhJywgWyFiIV06ICdiJ307CkBAIC0xODgzLDcgKzE4ODMsNyBAQAogCiBJZiBib3RoIGVudHJpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXAsIHRoZW4gY2hhbmdlIG9uZSBvZiB0aGUga2V5czoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IGEgPSAxOwogY29uc3QgYiA9IDI7CiB2YXIgbSA9IDxpbnQsIFN0cmluZz57YTogJ2EnLCBiOiAnYid9OwpAQCAtMTg5Miw3ICsxODkyLDcgQEAKIElmIG9ubHkgb25lIG9mIHRoZSBlbnRyaWVzIGlzIG5lZWRlZCwgdGhlbiByZW1vdmUgdGhlIG9uZSB0aGF0IGlzbid0CiBuZWVkZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBhID0gMTsKIHZhciBtID0gPGludCwgU3RyaW5nPnthOiAnYSd9OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTE5MTYsNyArMTkxNiw3IEBACiAKIEdpdmVuIGEgbGlicmFyeSB0aGF0IGlzIG9wdGVkIG91dCBvZiBudWxsIHNhZmV0eToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIC8vIEBkYXJ0ID0gMi44CiBTdHJpbmcgczsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0xOTI0LDcgKzE5MjQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGl0J3MgZXhwb3J0aW5nIHN5bWJvbHMKIGZyb20gYW4gb3B0ZWQtb3V0IGxpYnJhcnk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHBvcnQgWyEnb3B0ZWRPdXQuZGFydCchXTsKIAogY2xhc3MgQyB7fQpAQCAtMTkzNSwxMyArMTkzNSwxMyBAQAogSWYgeW91J3JlIGFibGUgdG8gZG8gc28sIG1pZ3JhdGUgdGhlIGV4cG9ydGVkIGxpYnJhcnkgc28gdGhhdCBpdCBkb2Vzbid0CiBuZWVkIHRvIG9wdCBvdXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBTdHJpbmc/IHM7CiB7JSBlbmRwcmV0dGlmeSAlfQogCiBJZiB5b3UgY2FuJ3QgbWlncmF0ZSB0aGUgbGlicmFyeSwgdGhlbiByZW1vdmUgdGhlIGV4cG9ydDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMge30KIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTE5NjQsNyArMTk2NCw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgbWFwID0gPFN0cmluZywgaW50PnsnYSc6IDAsICdiJzogMSwgWyEnYychXX07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0xOTc0LDcgKzE5NzQsNyBAQAogZW50cnksIGZpeCB0aGUgaXNzdWUgYnkgcmVwbGFjaW5nIHRoZSBleHByZXNzaW9uIHdpdGggdGhlIGtleSBvciB0aGUgdmFsdWUuCiBGb3IgZXhhbXBsZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtYXAgPSA8U3RyaW5nLCBpbnQ+eydhJzogMCwgJ2InOiAxLCAnYyc6IDJ9OwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtMTk4NCw3ICsxOTg0LDcgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gZXh0ZW5kcyBjbGF1c2UgY29udGFpbnMgYQorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGBleHRlbmRzYCBjbGF1c2UgY29udGFpbnMgYQogbmFtZSB0aGF0IGlzIGRlY2xhcmVkIHRvIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY2xhc3MuCiAKICMjIyMgRXhhbXBsZXMKQEAgLTE5OTIsNyArMTk5Miw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGlzIGRlY2xhcmVkIHRvIGJlIGEKIGZ1bmN0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKCkge30KIAogY2xhc3MgQyBleHRlbmRzIFshZiFdIHt9CkBAIC0yMDAxLDkgKzIwMDEsOSBAQAogIyMjIyBDb21tb24gZml4ZXMKIAogSWYgeW91IHdhbnQgdGhlIGNsYXNzIHRvIGV4dGVuZCBhIGNsYXNzIG90aGVyIHRoYW4gYE9iamVjdGAsIHRoZW4gcmVwbGFjZQotdGhlIG5hbWUgaW4gdGhlIGV4dGVuZHMgY2xhdXNlIHdpdGggdGhlIG5hbWUgb2YgdGhhdCBjbGFzczoKK3RoZSBuYW1lIGluIHRoZSBgZXh0ZW5kc2AgY2xhdXNlIHdpdGggdGhlIG5hbWUgb2YgdGhhdCBjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHt9CiAKIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CkBAIC0yMDExLDkgKzIwMTEsOSBAQAogY2xhc3MgQiB7fQogeyUgZW5kcHJldHRpZnkgJX0KIAotSWYgeW91IHdhbnQgdGhlIGNsYXNzIHRvIGV4dGVuZCBgT2JqZWN0YCwgdGhlbiByZW1vdmUgdGhlIGV4dGVuZHMgY2xhdXNlOgorSWYgeW91IHdhbnQgdGhlIGNsYXNzIHRvIGV4dGVuZCBgT2JqZWN0YCwgdGhlbiByZW1vdmUgdGhlIGBleHRlbmRzYCBjbGF1c2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7fQogCiBjbGFzcyBDIHt9CkBAIC0yMDM2LDcgKzIwMzYsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYEVgIGlzIGFuIGV4dGVuc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIGludCB7CiAgIHN0YXRpYyBTdHJpbmcgbSgpID0+ICcnOwogfQpAQCAtMjA0OSw3ICsyMDQ5LDcgQEAKIFJlcGxhY2UgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB3aXRoIGEgbmFtZSB0aGF0IGNhbiBiZSByZWZlcmVuY2VkLCBzdWNoCiBhcyBhIHN0YXRpYyBtZW1iZXIgZGVmaW5lZCBvbiB0aGUgZXh0ZW5zaW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gaW50IHsKICAgc3RhdGljIFN0cmluZyBtKCkgPT4gJyc7CiB9CkBAIC0yMDc1LDcgKzIwNzUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBuYW1lIGBhYCBpcyBiZWluZwogdXNlZCBmb3IgdHdvIGRpZmZlcmVudCBtZW1iZXJzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gT2JqZWN0IHsKICAgaW50IGdldCBhID0+IDA7CiAgIHN0YXRpYyBpbnQgWyFhIV0oKSA9PiAwOwpAQCAtMjA4Niw3ICsyMDg2LDcgQEAKIAogUmVuYW1lIG9yIHJlbW92ZSBvbmUgb2YgdGhlIG1lbWJlcnM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBPYmplY3QgewogICBpbnQgZ2V0IGEgPT4gMDsKICAgc3RhdGljIGludCBiKCkgPT4gMDsKQEAgLTIxMDcsNyArMjEwNyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIG1ldGhvZCBgYWAgZG9lc24ndAogaGF2ZSBhIGJvZHk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBpbnQgWyFhIV0oKTsKIH0KQEAgLTIxMzMsNyArMjEzMyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUgaXMgYSBjb25zdHJ1Y3RvcgogZGVjbGFyYXRpb24gaW4gYEVgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgWyFFIV0oKSA6IHN1cGVyKCk7CiB9CkBAIC0yMTU4LDcgKzIxNTgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBzYCBpcyBhbiBpbnN0YW5jZQogZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBTdHJpbmcgWyFzIV07CiB9CkBAIC0yMTg2LDcgKzIxODYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB0b1N0cmluZ2AgaXMgZGVmaW5lZAogYnkgYE9iamVjdGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBTdHJpbmcgWyF0b1N0cmluZyFdKCkgPT4gdGhpczsKIH0KQEAgLTIxOTcsNyArMjE5Nyw3IEBACiBSZW1vdmUgdGhlIG1lbWJlciBvciByZW5hbWUgaXQgc28gdGhhdCB0aGUgbmFtZSBkb2Vzbid0IGNvbmZsaWN0IHdpdGggdGhlCiBtZW1iZXIgaW4gYE9iamVjdGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBTdHJpbmcgZGlzcGxheVN0cmluZygpID0+IHRoaXM7CiB9CkBAIC0yMjE5LDcgKzIyMTksNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYG1gIGlzIHN0YXRpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIHN0YXRpYyB2b2lkIG0oKSB7fQogfQpAQCAtMjIzMyw3ICsyMjMzLDcgQEAKIAogUmVwbGFjZSB0aGUgZXh0ZW5zaW9uIG92ZXJyaWRlIHdpdGggdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIHN0YXRpYyB2b2lkIG0oKSB7fQogfQpAQCAtMjI1Nyw3ICsyMjU3LDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGAzYCBpc24ndCBhIGBTdHJpbmdgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgdm9pZCBtZXRob2QoKSB7fQogfQpAQCAtMjI3Miw3ICsyMjcyLDcgQEAKIElmIHlvdSdyZSB1c2luZyB0aGUgY29ycmVjdCBleHRlbnNpb24sIHRoZW4gdXBkYXRlIHRoZSBhcmd1bWVudCB0byBoYXZlIHRoZQogY29ycmVjdCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgdm9pZCBtZXRob2QoKSB7fQogfQpAQCAtMjMwMiw3ICsyMzAyLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgRShpKWAgaXNuJ3QgYW4KIGV4cHJlc3Npb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBpbnQgewogICBpbnQgZ2V0IGEgPT4gMDsKIH0KQEAgLTIzMTcsNyArMjMxNyw3IEBACiBJZiB5b3Ugd2FudCB0byBpbnZva2Ugb25lIG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBleHRlbnNpb24sIHRoZW4gYWRkIHRoZQogaW52b2NhdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIGludCB7CiAgIGludCBnZXQgYSA9PiAwOwogfQpAQCAtMjMyOSw3ICsyMzI5LDcgQEAKIAogSWYgeW91IGRvbid0IHdhbnQgdG8gaW52b2tlIGEgbWVtYmVyLCB0aGVuIHVud3JhcCB0aGUgdGFyZ2V0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gaW50IHsKICAgaW50IGdldCBhID0+IDA7CiB9CkBAIC0yMzQ4LDcgKzIzNDgsNyBAQAogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gZXh0ZW5zaW9uIG92ZXJyaWRlIGlzIHVzZWQgYXMKIHRoZSB0YXJnZXQgb2YgYSBjYXNjYWRlIGV4cHJlc3Npb24uIFRoZSB2YWx1ZSBvZiBhIGNhc2NhZGUgZXhwcmVzc2lvbgotYGUuLm1gIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGBlYCwgYnV0IGV4dGVuc2lvbiBvdmVycmlkZXMgYXJlIG5vdAorYGUuLm1gIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGBlYCwgYnV0IGV4dGVuc2lvbiBvdmVycmlkZXMgYXJlbid0CiBleHByZXNzaW9ucyBhbmQgZG9uJ3QgaGF2ZSBhIHZhbHVlLgogCiAjIyMjIEV4YW1wbGVzCkBAIC0yMzU2LDcgKzIzNTYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBFKDMpYCBpc24ndCBhbgogZXhwcmVzc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIGludCB7CiAgIHZvaWQgbSgpIHt9CiB9CkBAIC0yMzY5LDcgKzIzNjksNyBAQAogCiBVc2UgJy4nIHJhdGhlciB0aGFuICcuLic6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBpbnQgewogICB2b2lkIG0oKSB7fQogfQpAQCAtMjM5NSw3ICsyMzk1LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZmAgZGVmaW5lcyAyCiBwYXJhbWV0ZXJzIGJ1dCBpcyBpbnZva2VkIHdpdGggMyBhcmd1bWVudHM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGEsIGludCBiKSB7fQogdm9pZCBnKCkgewogICBmWyEoMSwgMiwgMykhXTsKQEAgLTI0MDYsNyArMjQwNiw3IEBACiAKIFJlbW92ZSB0aGUgYXJndW1lbnRzIHRoYXQgZG9uJ3QgY29ycmVzcG9uZCB0byBwYXJhbWV0ZXJzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKGludCBhLCBpbnQgYikge30KIHZvaWQgZygpIHsKICAgZigxLCAyKTsKQEAgLTI0MjksNyArMjQyOSw3IEBACiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgYnV0IGhhcyBhIG5hbWVkIHBhcmFtZXRlciB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHRoZQogdGhpcmQgYXJndW1lbnQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGEsIGludCBiLCB7aW50IGN9KSB7fQogdm9pZCBnKCkgewogICBmWyEoMSwgMiwgMykhXTsKQEAgLTI0NDEsNyArMjQ0MSw3IEBACiBJZiBzb21lIG9mIHRoZSBhcmd1bWVudHMgc2hvdWxkIGJlIHZhbHVlcyBmb3IgbmFtZWQgcGFyYW1ldGVycywgdGhlbiBhZGQKIHRoZSBuYW1lcyBiZWZvcmUgdGhlIGFyZ3VtZW50czoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgYSwgaW50IGIsIHtpbnQgY30pIHt9CiB2b2lkIGcoKSB7CiAgIGYoMSwgMiwgYzogMyk7CkBAIC0yNDUxLDcgKzI0NTEsNyBAQAogT3RoZXJ3aXNlLCByZW1vdmUgdGhlIGFyZ3VtZW50cyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgdG8gcG9zaXRpb25hbAogcGFyYW1ldGVyczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgYSwgaW50IGIsIHtpbnQgY30pIHt9CiB2b2lkIGcoKSB7CiAgIGYoMSwgMik7CkBAIC0yNDc0LDcgKzI0NzQsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGlzIDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBpbnQgZiA9IDA7CiAgIEMoKSA6IFshZiFdID0gMTsKQEAgLTI0ODcsNyArMjQ4Nyw3IEBACiBjb25zdHJ1Y3RvciwgYW5kIGlmIGFsbCBvZiB0aGUgY29uc3RydWN0b3JzIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgdG8KIHRoZSBzYW1lIHZhbHVlLCB0aGVuIHJlbW92ZSB0aGUgaW5pdGlhbGl6ZXIgZnJvbSB0aGUgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgZmluYWwgaW50IGYgPSAwOwogICBDKCk7CkBAIC0yNDk4LDcgKzI0OTgsNyBAQAogZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkIGRpZmZlcmVudGx5LCB0aGVuCiByZW1vdmUgdGhlIGluaXRpYWxpemVyIGluIHRoZSBmaWVsZCdzIGRlY2xhcmF0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZpbmFsIGludCBmOwogICBDKCkgOiBmID0gMTsKQEAgLTI1MjAsNyArMjUyMCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYDBgIGhhcyB0aGUgdHlwZSBgaW50YCwKIGFuZCBhbiBgaW50YCBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIGZpZWxkIG9mIHR5cGUgYFN0cmluZ2A6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgU3RyaW5nIHM7CiAKQEAgLTI1MzMsNyArMjUzMyw3IEBACiBJZiB0aGUgdHlwZSBvZiB0aGUgZmllbGQgaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlIHZhbHVlIGFzc2lnbmVkIHRvIGl0CiBzbyB0aGF0IHRoZSB2YWx1ZSBoYXMgYSB2YWxpZCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIFN0cmluZyBzOwogCkBAIC0yNTQ0LDcgKzI1NDQsNyBAQAogSWYgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCB0bwogYWxsb3cgdGhlIGFzc2lnbm1lbnQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHM7CiAKQEAgLTI1NjYsNyArMjU2Niw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGRvZXNuJ3QgaGF2ZSBhbgogaW5pdGlhbGl6ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBmaW5hbCBbIXghXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTI1NzQsNyArMjU3NCw3IEBACiAKIEZvciB2YXJpYWJsZXMgYW5kIHN0YXRpYyBmaWVsZHMsIHlvdSBjYW4gYWRkIGFuIGluaXRpYWxpemVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZmluYWwgeCA9IDA7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0yNTgyLDcgKzI1ODIsNyBAQAogZXhhbXBsZSwgb3IgeW91IGNhbiBpbml0aWFsaXplIHRoZSBmaWVsZCBpbiBldmVyeSBjb25zdHJ1Y3Rvci4gWW91IGNhbgogaW5pdGlhbGl6ZSB0aGUgZmllbGQgYnkgdXNpbmcgYSBmaWVsZCBmb3JtYWwgcGFyYW1ldGVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZpbmFsIGludCB4OwogICBDKHRoaXMueCk7CkBAIC0yNTkyLDcgKzI1OTIsNyBAQAogWW91IGNhbiBhbHNvIGluaXRpYWxpemUgdGhlIGZpZWxkIGJ5IHVzaW5nIGFuIGluaXRpYWxpemVyIGluIHRoZQogY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgZmluYWwgaW50IHg7CiAgIEMoaW50IHkpIDogeCA9IHkgKiAyOwpAQCAtMjYwMSwxMiArMjYwMSwxMiBAQAogCiAjIyMgZmluYWxfbm90X2luaXRpYWxpemVkX2NvbnN0cnVjdG9yCiAKLV9BbGwgZmluYWwgdmFyaWFibGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIGJ1dCAnezB9JyBhbmQgJ3sxfScgYXJlIG5vdC5fCitfQWxsIGZpbmFsIHZhcmlhYmxlcyBtdXN0IGJlIGluaXRpYWxpemVkLCBidXQgJ3swfScgYW5kICd7MX0nIGFyZW4ndC5fCiAKLV9BbGwgZmluYWwgdmFyaWFibGVzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIGJ1dCAnezB9JyBpcyBub3QuXworX0FsbCBmaW5hbCB2YXJpYWJsZXMgbXVzdCBiZSBpbml0aWFsaXplZCwgYnV0ICd7MH0nIGlzbid0Ll8KIAotX0FsbCBmaW5hbCB2YXJpYWJsZXMgbXVzdCBiZSBpbml0aWFsaXplZCwgYnV0ICd7MH0nLCAnezF9JywgYW5kIHsyfSBvdGhlcnMgYXJlCi1ub3QuXworX0FsbCBmaW5hbCB2YXJpYWJsZXMgbXVzdCBiZSBpbml0aWFsaXplZCwgYnV0ICd7MH0nLCAnezF9JywgYW5kIHsyfSBvdGhlcnMKK2FyZW4ndC5fCiAKICMjIyMgRGVzY3JpcHRpb24KIApAQCAtMjYyMCw3ICsyNjIwLDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBTdHJpbmcgdmFsdWU7CiAKQEAgLTI2MzMsNyArMjYzMyw3IEBACiBJZiB0aGUgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHRoZW4gdXNlIGEKIGZpZWxkIGZvcm1hbCBwYXJhbWV0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQgYHZhbHVlYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBTdHJpbmcgdmFsdWU7CiAKQEAgLTI2NDQsNyArMjY0NCw3IEBACiBJZiB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvbXB1dGVkIGluZGlyZWN0bHkgZnJvbSBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZQogY2FsbGVyLCB0aGVuIGFkZCBhIHBhcmFtZXRlciBhbmQgaW5jbHVkZSBhbiBpbml0aWFsaXplcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBmaW5hbCBTdHJpbmcgdmFsdWU7CiAKQEAgLTI2NTYsNyArMjY1Niw3IEBACiB0aGUgY29uc3RydWN0b3IsIHRoZW4gYWRkIGFuIGluaXRpYWxpemVyIGZvciB0aGUgZmllbGQgYXMgcGFydCBvZiB0aGUgZmllbGQKIGRlY2xhcmF0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9ICcnOwogCkBAIC0yNjY5LDcgKzI2NjksNyBAQAogZGlmZmVyZW50IHZhbHVlcywgdGhlbiBhZGQgYW4gaW5pdGlhbGl6ZXIgZm9yIHRoZSBmaWVsZCBpbiB0aGUgaW5pdGlhbGl6ZXIKIGxpc3Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgZmluYWwgU3RyaW5nIHZhbHVlOwogCkBAIC0yNjgyLDcgKzI2ODIsNyBAQAogSG93ZXZlciwgaWYgdGhlIHZhbHVlIGlzIHRoZSBzYW1lIGZvciBhbGwgaW5zdGFuY2VzLCB0aGVuIGNvbnNpZGVyIHVzaW5nIGEKIHN0YXRpYyBmaWVsZCBpbnN0ZWFkIG9mIGFuIGluc3RhbmNlIGZpZWxkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIHN0YXRpYyBjb25zdCBTdHJpbmcgdmFsdWUgPSAnJzsKIApAQCAtMjcwNCw3ICsyNzA0LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgbWAgaXMgYSBgTWFwYCwgYW5kCiBgTWFwYCBpc24ndCBhIHN1YmNsYXNzIG9mIGBJdGVyYWJsZWA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoTWFwPFN0cmluZywgU3RyaW5nPiBtKSB7CiAgIGZvciAoU3RyaW5nIHMgaW4gWyFtIV0pIHsKICAgICBwcmludChzKTsKQEAgLTI3MTYsNyArMjcxNiw3IEBACiAKIFJlcGxhY2UgdGhlIGV4cHJlc3Npb24gd2l0aCBvbmUgdGhhdCBwcm9kdWNlcyBhbiBpdGVyYWJsZSB2YWx1ZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihNYXA8U3RyaW5nLCBTdHJpbmc+IG0pIHsKICAgZm9yIChTdHJpbmcgcyBpbiBtLnZhbHVlcykgewogICAgIHByaW50KHMpOwpAQCAtMjc0MCw3ICsyNzQwLDcgQEAKIGZ1bmN0aW9uIGBmYCBoYXMgdGhlIGBhc3luY2AgbW9kaWZpZXIgZXZlbiB0aG91Z2ggdGhlIHJldHVybiB0eXBlIGlzbid0CiBhc3NpZ25hYmxlIHRvIGBGdXR1cmVgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogWyFpbnQhXSBmKCkgYXN5bmMgewogICByZXR1cm4gMDsKIH0KQEAgLTI3NTEsNyArMjc1MSw3IEBACiBJZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGFzeW5jaHJvbm91cywgdGhlbiBjaGFuZ2UgdGhlIHJldHVybiB0eXBlIHRvIGJlCiBhc3NpZ25hYmxlIHRvIGBGdXR1cmVgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogRnV0dXJlPGludD4gZigpIGFzeW5jIHsKICAgcmV0dXJuIDA7CiB9CkBAIC0yNzU5LDcgKzI3NTksNyBAQAogCiBJZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIHN5bmNocm9ub3VzLCB0aGVuIHJlbW92ZSB0aGUgYGFzeW5jYCBtb2RpZmllcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKCkgewogICByZXR1cm4gMDsKIH0KQEAgLTI3NzEsNyArMjc3MSw3IEBACiAKICMjIyMgRGVzY3JpcHRpb24KIAotVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgbmFtZSB1c2VkIGluIHRoZSBpbXBsZW1lbnRzCitUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBuYW1lIHVzZWQgaW4gdGhlIGBpbXBsZW1lbnRzYAogY2xhdXNlIG9mIGEgY2xhc3Mgb3IgbWl4aW4gZGVjbGFyYXRpb24gaXMgZGVmaW5lZCB0byBiZSBzb21ldGhpbmcgb3RoZXIKIHRoYW4gYSBjbGFzcyBvciBtaXhpbi4KIApAQCAtMjc4MCw3ICsyNzgwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgaXMgYSB2YXJpYWJsZQogcmF0aGVyIHRoYW4gYSBjbGFzcyBvciBtaXhpbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciB4OwogY2xhc3MgQyBpbXBsZW1lbnRzIFsheCFdIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtMjc5NSw4ICsyNzk1LDggQEAKIGltcG9ydGVkLCB0aGVuIGFkZCBhbiBpbXBvcnQsIHdpdGggYSBwcmVmaXgsIGZvciB0aGUgbGlicmFyeSBpbiB3aGljaCBpdOKAmXMKIGRlY2xhcmVkLgogCi1PdGhlcndpc2UsIGVpdGhlciByZXBsYWNlIHRoZSBuYW1lIGluIHRoZSBpbXBsZW1lbnRzIGNsYXVzZSB3aXRoIHRoZSBuYW1lCi1vZiBhbiBleGlzdGluZyBjbGFzcyBvciBtaXhpbiwgb3IgcmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIGltcGxlbWVudHMKK090aGVyd2lzZSwgZWl0aGVyIHJlcGxhY2UgdGhlIG5hbWUgaW4gdGhlIGBpbXBsZW1lbnRzYCBjbGF1c2Ugd2l0aCB0aGUgbmFtZQorb2YgYW4gZXhpc3RpbmcgY2xhc3Mgb3IgbWl4aW4sIG9yIHJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBgaW1wbGVtZW50c2AKIGNsYXVzZS4KIAogIyMjIGltcGxlbWVudHNfcmVwZWF0ZWQKQEAgLTI4MDYsMTQgKzI4MDYsMTQgQEAKICMjIyMgRGVzY3JpcHRpb24KIAogVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgc2luZ2xlIGNsYXNzIGlzIHNwZWNpZmllZCBtb3JlCi10aGFuIG9uY2UgaW4gYW4gaW1wbGVtZW50cyBjbGF1c2UuCit0aGFuIG9uY2UgaW4gYW4gYGltcGxlbWVudHNgIGNsYXVzZS4KIAogIyMjIyBFeGFtcGxlcwogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYEFgIGlzIGluIHRoZSBsaXN0CiB0d2ljZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEge30KIGNsYXNzIEIgaW1wbGVtZW50cyBBLCBbIUEhXSB7fQogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTI4MjIsNyArMjgyMiw3IEBACiAKIFJlbW92ZSBhbGwgZXhjZXB0IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBjbGFzcyBuYW1lOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7fQogY2xhc3MgQiBpbXBsZW1lbnRzIEEge30KIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0yODQxLDcgKzI4NDEsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBkZWZhdWx0WGAgaXMgYW4KIGluc3RhbmNlIG1lbWJlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeDsKIApAQCAtMjg1NSw3ICsyODU1LDcgQEAKIAogSWYgdGhlIG1lbWJlciBjYW4gYmUgbWFkZSBzdGF0aWMsIHRoZW4gZG8gc286CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAKQEAgLTI4NjgsNyArMjg2OCw3IEBACiBJZiBub3QsIHRoZW4gcmVwbGFjZSB0aGUgcmVmZXJlbmNlIGluIHRoZSBpbml0aWFsaXplciB3aXRoIGEgZGlmZmVyZW50CiBleHByZXNzaW9uIHRoYXQgZG9lc24ndCB1c2UgYW4gaW5zdGFuY2UgbWVtYmVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCB4OwogCkBAIC0yODkyLDcgKzI4OTIsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBfaW50ZXJjZXB0b3JzYCBpcyBhbgogaW50ZXJuYWwgbGlicmFyeToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCBbISdkYXJ0Ol9pbnRlcmNlcHRvcnMnIV07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0yOTE2LDcgKzI5MTYsNyBAQAogZGVjbGFyYXRpb24gb2YgYG1gIGZyb20gYEFgLCBhbmQgdGhhdCBpbXBsZW1lbnRhdGlvbiBpc24ndCBjb25zaXN0ZW50IHdpdGgKIHRoZSBzaWduYXR1cmUgb2YgYG1gIHRoYXQncyBpbmhlcml0ZWQgZnJvbSBgQmA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgdm9pZCBtKHtpbnQgYX0pIHt9CiB9CkBAIC0yOTM0LDcgKzI5MzQsNyBAQAogQWRkIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgdGhhdCBzYXRpc2ZpZXMgYWxsIHRoZSBpbmhlcml0ZWQKIHNpZ25hdHVyZXM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgdm9pZCBtKHtpbnQgYX0pIHt9CiB9CkBAIC0yOTY0LDcgKzI5NjQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBpbml0aWFsaXplciBpcwogaW5pdGlhbGl6aW5nIGB4YCwgYnV0IGB4YCBpc24ndCBhIGZpZWxkIGluIHRoZSBjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeTsKIApAQCAtMjk3Nyw3ICsyOTc3LDcgQEAKIElmIGEgZGlmZmVyZW50IGZpZWxkIHNob3VsZCBiZSBpbml0aWFsaXplZCwgdGhlbiBjaGFuZ2UgdGhlIG5hbWUgdG8gdGhlCiBuYW1lIG9mIHRoZSBmaWVsZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeTsKIApAQCAtMjk4Nyw3ICsyOTg3LDcgQEAKIAogSWYgdGhlIGZpZWxkIG11c3QgYmUgZGVjbGFyZWQsIHRoZW4gYWRkIGEgZGVjbGFyYXRpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAgIGludCB5OwpAQCAtMzAxMiw3ICszMDEyLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgZmllbGQgYHhgIGlzbid0CiBkZWZpbmVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCB5OwogCkBAIC0zMDI1LDcgKzMwMjUsNyBAQAogSWYgdGhlIGZpZWxkIG5hbWUgd2FzIHdyb25nLCB0aGVuIGNoYW5nZSBpdCB0byB0aGUgbmFtZSBvZiBhbiBleGlzdGluZwogZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHk7CiAKQEAgLTMwMzYsNyArMzAzNiw3IEBACiBJZiB0aGUgZmllbGQgbmFtZSBpcyBjb3JyZWN0IGJ1dCBoYXNuJ3QgeWV0IGJlZW4gZGVmaW5lZCwgdGhlbiBkZWNsYXJlIHRoZQogZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAgIGludCB5OwpAQCAtMzA0OCw3ICszMDQ4LDcgQEAKIElmIHRoZSBwYXJhbWV0ZXIgaXMgbmVlZGVkIGJ1dCBzaG91bGRuJ3QgaW5pdGlhbGl6ZSBhIGZpZWxkLCB0aGVuIGNvbnZlcnQKIGl0IHRvIGEgbm9ybWFsIHBhcmFtZXRlciBhbmQgdXNlIGl0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCB5OwogCkBAIC0zMDU4LDcgKzMwNTgsNyBAQAogCiBJZiB0aGUgcGFyYW1ldGVyIGlzbid0IG5lZWRlZCwgdGhlbiByZW1vdmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHk7CiAKQEAgLTMwODAsNyArMzA4MCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHplcm9gIGlzIGEgc3RhdGljCiBmaWVsZCwgYnV0IGl04oCZcyBiZWluZyBhY2Nlc3NlZCBhcyBpZiBpdCB3ZXJlIGFuIGluc3RhbmNlIGZpZWxkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKEMgYykgewogICBjLlshemVybyFdOwogfQpAQCAtMzA5NCw3ICszMDk0LDcgQEAKIAogVXNlIHRoZSBjbGFzcyB0byBhY2Nlc3MgdGhlIHN0YXRpYyBtZW1iZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoQyBjKSB7CiAgIEMuemVybzsKIH0KQEAgLTMxMjMsNyArMzEyMyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzbid0IGluIHNjb3BlIGluCiB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeDsKICAgZmFjdG9yeSBDKCkgewpAQCAtMzEzNyw3ICszMTM3LDcgQEAKIAogUmV3cml0ZSB0aGUgY29kZSBzbyB0aGF0IGl0IGRvZXNuJ3QgcmVmZXJlbmNlIHRoZSBpbnN0YW5jZSBtZW1iZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAgIGZhY3RvcnkgQygpIHsKQEAgLTMxNjEsNyArMzE2MSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGluc3RhbmNlIGZpZWxkIGB4YAogaXMgYmVpbmcgcmVmZXJlbmNlZCBpbiBhIHN0YXRpYyBtZXRob2Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAKQEAgLTMxNzYsNyArMzE3Niw3IEBACiBJZiB0aGUgbWV0aG9kIG11c3QgcmVmZXJlbmNlIHRoZSBpbnN0YW5jZSBtZW1iZXIsIHRoZW4gaXQgY2FuJ3QgYmUgc3RhdGljLAogc28gcmVtb3ZlIHRoZSBrZXl3b3JkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCB4OwogCkBAIC0zMTg5LDcgKzMxODksNyBAQAogSWYgdGhlIG1ldGhvZCBjYW4ndCBiZSBtYWRlIGFuIGluc3RhbmNlIG1ldGhvZCwgdGhlbiBhZGQgYSBwYXJhbWV0ZXIgc28KIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGNhbiBiZSBwYXNzZWQgaW46CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHg7CiAKQEAgLTMyMTUsNyArMzIxNSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYENgIGlzIGFuIGFic3RyYWN0CiBjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEMge30KIAogdmFyIGMgPSBuZXcgWyFDIV0oKTsKQEAgLTMyNDIsNyArMzI0Miw3IEBACiBpbml0aWFsaXplciAoYGludGApIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlCiAoYFN0cmluZ2ApOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGkgPSAwOwogU3RyaW5nIHMgPSBbIWkhXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0zMjU1LDcgKzMyNTUsNyBAQAogT3RoZXJ3aXNlLCBjaGFuZ2UgdGhlIHZhbHVlIGJlaW5nIGFzc2lnbmVkIHNvIHRoYXQgaXQgaGFzIHRoZSBleHBlY3RlZAogdHlwZS4gSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoaXMgbWlnaHQgbG9vayBsaWtlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGkgPSAwOwogU3RyaW5nIHMgPSBpLnRvU3RyaW5nKCk7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtMzI2Myw3ICszMjYzLDcgQEAKIElmIHlvdSBjYW7igJl0IGNoYW5nZSB0aGUgdmFsdWUsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZSB0byBiZQogY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBiZWluZyBhc3NpZ25lZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBpID0gMDsKIGludCBzID0gaTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC0zMjg0LDcgKzMyODQsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGFyZ3VtZW50czoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBqb2luKFN0cmluZyBvdGhlcikgPT4gJyR0aGlzICRvdGhlcic7CiB9CkBAIC0zMjk3LDcgKzMyOTcsNyBAQAogQW5kLCB0aGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlcmUncyBtb3JlIHRoYW4KIG9uZSBhcmd1bWVudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBqb2luKFN0cmluZyBvdGhlcikgPT4gJyR0aGlzICRvdGhlcic7CiB9CkBAIC0zMzExLDcgKzMzMTEsNyBAQAogCiBQcm92aWRlIG9uZSBhcmd1bWVudCBmb3IgdGhlIGV4dGVuc2lvbiBvdmVycmlkZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBqb2luKFN0cmluZyBvdGhlcikgPT4gJyR0aGlzICRvdGhlcic7CiB9CkBAIC0zMzM2LDcgKzMzMzYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBmYWN0b3J5CiBjb25zdHJ1Y3RvciAoYEFgKSBpc24ndCB0aGUgc2FtZSBhcyB0aGUgc3Vycm91bmRpbmcgY2xhc3MgKGBDYCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiAKIGNsYXNzIEMgewpAQCAtMzM0OSw3ICszMzQ5LDcgQEAKIElmIHRoZSBmYWN0b3J5IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cnJvdW5kaW5nIGNsYXNzLCB0aGVuIHJlbmFtZQogdGhlIGZhY3Rvcnk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiAKIGNsYXNzIEMgewpAQCAtMzM2MCw3ICszMzYwLDcgQEAKIElmIHRoZSBmYWN0b3J5IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBkaWZmZXJlbnQgY2xhc3MsIHRoZW4gbW92ZSB0aGUKIGZhY3RvcnkgdG8gdGhhdCBjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgewogICBmYWN0b3J5IEEoKSA9PiB0aHJvdyAwOwogfQpAQCAtMzM3Miw3ICszMzcyLDcgQEAKIG1vZGlmeSB0aGF0IGNsYXNzIG9yIGRvbid0IHdhbnQgdG8gbW92ZSB0aGUgZmFjdG9yeSwgdGhlbiBjb252ZXJ0IGl0IHRvIGJlCiBhIHN0YXRpYyBtZXRob2Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiAKIGNsYXNzIEMgewpAQCAtMzM5MSwxMCArMzM5MSwxMCBAQAogCiAjIyMjIEV4YW1wbGVzCiAKLVRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgaXMgbm90CitUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGlzbid0CiBhIGBjb25zdGAgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBjbGFzcyBDIHsKQEAgLTM0MDYsNyArMzQwNiw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzbid0IGEKIGNvbnN0cnVjdG9yOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogWyFAbGl0ZXJhbCFdCkBAIC0zNDE5LDcgKzM0MTksNyBAQAogaW52b2tlZCB3aXRoIGBjb25zdGAsIHdoZW4gcG9zc2libGUsIHRoZW4gbWFyayB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUKIGBjb25zdGAga2V5d29yZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIGNsYXNzIEMgewpAQCAtMzQzMyw3ICszNDMzLDcgQEAKIElmIHRoZSBhbm5vdGF0aW9uIGlzIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBjb25zdHJ1Y3RvciwgdGhlbiByZW1vdmUgdGhlCiBhbm5vdGF0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIHg7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zNDUyLDcgKzM0NTIsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHNgIGNhbid0IGJlIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludD8gZ2V0TGVuZ3RoKFN0cmluZyBzKSB7CiAgIHJldHVybiBzWyE/LiFdbGVuZ3RoOwogfQpAQCAtMzQ2MCwxNyArMzQ2MCwxNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGFgIGNhbid0IGJlIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBhID0gW107CiB2YXIgYiA9IFtbIS4uLj8hXWFdOwogeyUgZW5kcHJldHRpZnkgJX0KIAogIyMjIyBDb21tb24gZml4ZXMKIAotUmVwbGFjZSB0aGUgbnVsbC1hd2FyZSBvcGVyYXRvciB3aXRoIGEgbm9uLW51bGwtYXdhcmUgZXF1aXZhbGVudCwgc3VjaCBhcwotcmVwbGFjaW5nICc/Licgd2l0aCAgJy4nOgorUmVwbGFjZSB0aGUgbnVsbC1hd2FyZSBvcGVyYXRvciB3aXRoIGEgbm9uLW51bGwtYXdhcmUgZXF1aXZhbGVudDsgZm9yCitleGFtcGxlLCBjaGFuZ2UgYD8uYCB0byAgYC5gOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGdldExlbmd0aChTdHJpbmcgcykgewogICByZXR1cm4gcy5sZW5ndGg7CiB9CkBAIC0zNTAyLDcgKzM1MDIsNyBAQAogcGFyYW1ldGVyIGBzYCAoYFN0cmluZ2ApIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBgaWAKIChgaW50YCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgdm9pZCBtKGludCBpKSB7fQogfQpAQCAtMzUxNyw3ICszNTE3LDcgQEAKIElmIHRoZSBpbnZhbGlkIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBvdmVycmlkZSB0aGUgbWV0aG9kIGZyb20gdGhlCiBzdXBlcmNsYXNzLCB0aGVuIGNoYW5nZSBpdCB0byBjb25mb3JtOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7CiAgIHZvaWQgbShpbnQgaSkge30KIH0KQEAgLTM1MzAsNyArMzUzMCw3IEBACiBJZiBpdCBpc24ndCBpbnRlbmRlZCB0byBvdmVycmlkZSB0aGUgbWV0aG9kIGZyb20gdGhlIHN1cGVyY2xhc3MsIHRoZW4KIHJlbmFtZSBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgewogICB2b2lkIG0oaW50IGkpIHt9CiB9CkBAIC0zNTU2LDcgKzM1NTYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB2YCBpcyBhIHRvcC1sZXZlbAogdmFyaWFibGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBDIGYoKSA9PiBbIXRoaXMhXTsKIAogY2xhc3MgQyB7fQpAQCAtMzU2Nyw3ICszNTY3LDcgQEAKIFVzZSBhIHZhcmlhYmxlIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGluIHBsYWNlIG9mIGB0aGlzYCwgZGVjbGFyaW5nIGl0IGlmCiBuZWNlc3Nhcnk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBDIGYoQyBjKSA9PiBjOwogCiBjbGFzcyBDIHt9CkBAIC0zNTg3LDcgKzM1ODcsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGAnIydgIGlzbid0IGEgdmFsaWQKIFVSSToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCBbIScjJyFdOwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtMzYxMSw3ICszNjExLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgaWAgaXMgbWFya2VkIGFzIGJlaW5nCiBjb3ZhcmlhbnQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICB2b2lkIGEoWyFjb3ZhcmlhbnQhXSBpbnQgaSkge30KIH0KQEAgLTM2MjEsNyArMzYyMSw3IEBACiAKIFJlbW92ZSB0aGUgJ2NvdmFyaWFudCcga2V5d29yZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIHZvaWQgYShpbnQgaSkge30KIH0KQEAgLTM2NDEsNyArMzY0MSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIHdpbGwgYWx3YXlzIGJlCiBgbnVsbGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgZihOdWxsIHgpIHsKICAgcmV0dXJuIFsheCFdLmxlbmd0aDsKIH0KQEAgLTM2NTIsNyArMzY1Miw3IEBACiBJZiB0aGUgdmFsdWUgaXMgYWxsb3dlZCB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBgbnVsbGAsIHRoZW4gY2hhbmdlIHRoZQogdHlwZSBvZiB0aGUgZXhwcmVzc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKFN0cmluZz8geCkgewogICByZXR1cm4geCEubGVuZ3RoOwogfQpAQCAtMzY3Miw3ICszNjcyLDcgQEAKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIFshQHZpc2libGVGb3JUZXN0aW5nIV0KQEAgLTM2ODYsNyArMzY4Niw3IEBACiBJZiB0aGUgZGVjbGFyYXRpb24gZG9lc24ndCBuZWVkIHRvIGJlIHVzZWQgYnkgdGVzdCBjb2RlLCB0aGVuIHJlbW92ZSB0aGUKIGFubm90YXRpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIF9zb21lRnVuY3Rpb24oKSB7fQogCiB2b2lkIGYoKSA9PiBfc29tZUZ1bmN0aW9uKCk7CkBAIC0zNjk0LDcgKzM2OTQsNyBAQAogCiBJZiBpdCBkb2VzLCB0aGVuIG1ha2UgaXQgcHVibGljOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogQHZpc2libGVGb3JUZXN0aW5nCkBAIC0zNzE4LDcgKzM3MTgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBleHRlbnNpb24gYEVgCiBkb2Vzbid0IGRlZmluZSBhIGBjYWxsYCBtZXRob2Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcge30KIAogdm9pZCBmKCkgewpAQCAtMzczMCw3ICszNzMwLDcgQEAKIAogSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnRlbmRlZCB0byBkZWZpbmUgYSBgY2FsbGAgbWV0aG9kLCB0aGVuIGRlY2xhcmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBpbnQgY2FsbCgpID0+IDA7CiB9CkBAIC0zNzYxLDcgKzM3NjEsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBCaW5hcnlgIGlzIHRoZSBuYW1lIG9mCiBhIGZ1bmN0aW9uIHR5cGUsIG5vdCBhIGZ1bmN0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdHlwZWRlZiBCaW5hcnkgPSBpbnQgRnVuY3Rpb24oaW50LCBpbnQpOwogCiBpbnQgZigpIHsKQEAgLTM3ODcsNyArMzc4Nyw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgaXNuJ3QgYSBmdW5jdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCB4ID0gMDsKIAogaW50IGYoKSA9PiB4OwpAQCAtMzc5OCw3ICszNzk4LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZigpYCBkb2Vzbid0IHJldHVybiBhCiBmdW5jdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCB4ID0gMDsKIAogaW50IGYoKSA9PiB4OwpAQCAtMzgxMiw3ICszODEyLDcgQEAKIGxpc3Qgd2l0aCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIG9yIHdpdGggYW4gZXhwcmVzc2lvbiB0aGF0IGNvbXB1dGVzIGEKIGZ1bmN0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IHggPSAwOwogCiBpbnQgZigpID0+IHg7CkBAIC0zODM0LDcgKzM4MzQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGAyLjVgIGlzIGEgZG91YmxlLCBhbmQKIHRoZSBsaXN0IGNhbiBob2xkIG9ubHkgaW50ZWdlcnM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBMaXN0PGludD4geCA9IFsxLCBbITIuNSFdLCAzXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTM4NDMsMjAgKzM4NDMsMjAgQEAKIElmIHlvdSBpbnRlbmRlZCB0byBhZGQgYSBkaWZmZXJlbnQgb2JqZWN0IHRvIHRoZSBsaXN0LCB0aGVuIHJlcGxhY2UgdGhlCiBlbGVtZW50IHdpdGggYW4gZXhwcmVzc2lvbiB0aGF0IGNvbXB1dGVzIHRoZSBpbnRlbmRlZCBvYmplY3Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBMaXN0PGludD4geCA9IFsxLCAyLCAzXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKIElmIHRoZSBvYmplY3Qgc2hvdWxkbid0IGJlIGluIHRoZSBsaXN0LCB0aGVuIHJlbW92ZSB0aGUgZWxlbWVudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIExpc3Q8aW50PiB4ID0gWzEsIDNdOwogeyUgZW5kcHJldHRpZnkgJX0KIAogSWYgdGhlIG9iamVjdCBiZWluZyBjb21wdXRlZCBpcyBjb3JyZWN0LCB0aGVuIHdpZGVuIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlCiBsaXN0IHRvIGFsbG93IGFsbCBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMgaXQgbmVlZHMgdG8gY29udGFpbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIExpc3Q8bnVtPiB4ID0gWzEsIDIuNSwgM107CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zODc0LDcgKzM4NzQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBsaXRlcmFsIGhhcyBhIG1hcAogZW50cnkgZXZlbiB0aG91Z2ggaXQncyBhIHNldCBsaXRlcmFsOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgY29sbGVjdGlvbiA9IDxTdHJpbmc+e1shJ2EnIDogJ2InIV19OwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtMzg4NCw3ICszODg0LDcgQEAKIHRoYXQgaXQgaXMgYSBtYXAuIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB5b3UgY291bGQgZG8gdGhpcyBieSBhZGRpbmcKIGFub3RoZXIgdHlwZSBhcmd1bWVudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IGNvbGxlY3Rpb24gPSA8U3RyaW5nLCBTdHJpbmc+eydhJyA6ICdiJ307CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zODk1LDcgKzM4OTUsNyBAQAogcG9zc2libHkgYnkgcmVwbGFjaW5nIHRoZSBjb2xvbiB3aXRoIGEgY29tbWEgaWYgYm90aCB2YWx1ZXMgc2hvdWxkIGJlCiBpbmNsdWRlZCBpbiB0aGUgc2V0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgY29sbGVjdGlvbiA9IDxTdHJpbmc+eydhJywgJ2InfTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTM5MTMsNyArMzkxMyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYDJgIGlzIGFuIGBpbnRgLCBidXQKIHRoZSBrZXlzIG9mIHRoZSBtYXAgYXJlIHJlcXVpcmVkIHRvIGJlIGBTdHJpbmdgczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtID0gPFN0cmluZywgU3RyaW5nPntbITIhXSA6ICdhJ307CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zOTIyLDEzICszOTIyLDEzIEBACiBJZiB0aGUgdHlwZSBvZiB0aGUgbWFwIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSBrZXkgdG8gaGF2ZSB0aGUgY29ycmVjdAogdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtID0gPFN0cmluZywgU3RyaW5nPnsnMicgOiAnYSd9OwogeyUgZW5kcHJldHRpZnkgJX0KIAogSWYgdGhlIHR5cGUgb2YgdGhlIGtleSBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUga2V5IHR5cGUgb2YgdGhlIG1hcDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtID0gPGludCwgU3RyaW5nPnsyIDogJ2EnfTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTM5NDcsNyArMzk0Nyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYDJgIGlzIGFuIGBpbnRgLCBidXQvCiB0aGUgdmFsdWVzIG9mIHRoZSBtYXAgYXJlIHJlcXVpcmVkIHRvIGJlIGBTdHJpbmdgczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtID0gPFN0cmluZywgU3RyaW5nPnsnYScgOiBbITIhXX07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC0zOTU2LDEzICszOTU2LDEzIEBACiBJZiB0aGUgdHlwZSBvZiB0aGUgbWFwIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSB2YWx1ZSB0byBoYXZlIHRoZQogY29ycmVjdCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIG0gPSA8U3RyaW5nLCBTdHJpbmc+eydhJyA6ICcyJ307CiB7JSBlbmRwcmV0dGlmeSAlfQogCiBJZiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlIHZhbHVlIHR5cGUgb2YgdGhlIG1hcDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBtID0gPFN0cmluZywgaW50PnsnYScgOiAyfTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTM5ODUsMTMgKzM5ODUsMTMgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgY2FuJ3QgYmUgYG51bGxgLAogYW5kIG5vIG5vbi1gbnVsbGAgZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoW2ludCBbIXghXV0pIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQogCiBBcyBkb2VzIHRoaXM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGcoe2ludCBbIXghXX0pIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC00MDAwLDIxICs0MDAwLDIxIEBACiBJZiB5b3Ugd2FudCB0byB1c2UgYG51bGxgIHRvIGluZGljYXRlIHRoYXQgbm8gdmFsdWUgd2FzIHByb3ZpZGVkLCB0aGVuIHlvdQogbmVlZCB0byBtYWtlIHRoZSB0eXBlIG51bGxhYmxlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFtpbnQ/IHhdKSB7fQogdm9pZCBnKHtpbnQ/IHh9KSB7fQogeyUgZW5kcHJldHRpZnkgJX0KIAogSWYgdGhlIHBhcmFtZXRlciBjYW4ndCBiZSBudWxsLCB0aGVuIGVpdGhlciBwcm92aWRlIGEgZGVmYXVsdCB2YWx1ZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihbaW50IHggPSAxXSkge30KIHZvaWQgZyh7aW50IHggPSAyfSkge30KIHslIGVuZHByZXR0aWZ5ICV9CiAKIG9yIG1ha2UgdGhlIHBhcmFtZXRlciBhIHJlcXVpcmVkIHBhcmFtZXRlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgeCkge30KIHZvaWQgZyh7cmVxdWlyZWQgaW50IHh9KSB7fQogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQwMjUsNyArNDAyNSw3IEBACiAKICMjIyMgRGVzY3JpcHRpb24KIAotVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgc3dpdGNoIHN0YXRlbWVudCBmb3IgYW4gZW51bQorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgYHN3aXRjaGAgc3RhdGVtZW50IGZvciBhbiBlbnVtCiBkb2Vzbid0IGluY2x1ZGUgYW4gb3B0aW9uIGZvciBvbmUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZW51bWVyYXRpb24uCiAKIE5vdGUgdGhhdCBgbnVsbGAgaXMgYWx3YXlzIGEgcG9zc2libGUgdmFsdWUgZm9yIGFuIGVudW0gYW5kIHRoZXJlZm9yZSBhbHNvCkBAIC00MDM2LDcgKzQwMzYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBlbnVtIGNvbnN0YW50IGBlMmAKIGlzbid0IGhhbmRsZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBlbnVtIEUgeyBlMSwgZTIgfQogCiB2b2lkIGYoRSBlKSB7CkBAIC00MDQ5LDEwICs0MDQ5LDEwIEBACiAKICMjIyMgQ29tbW9uIGZpeGVzCiAKLUlmIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIG1pc3NpbmcgdmFsdWVzLCB0aGVuIGFkZCBhIGNhc2UgY2xhdXNlCi1mb3IgZWFjaCBvZiB0aGUgbWlzc2luZyB2YWx1ZXM6CitJZiB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBtaXNzaW5nIHZhbHVlcywgdGhlbiBhZGQgYSBgY2FzZWAKK2NsYXVzZSBmb3IgZWFjaCBvZiB0aGUgbWlzc2luZyB2YWx1ZXM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBlbnVtIEUgeyBlMSwgZTIgfQogCiB2b2lkIGYoRSBlKSB7CkBAIC00MDY1LDEwICs0MDY1LDEwIEBACiB9CiB7JSBlbmRwcmV0dGlmeSAlfQogCi1JZiB0aGUgbWlzc2luZyB2YWx1ZXMgc2hvdWxkIGJlIGhhbmRsZWQgdGhlIHNhbWUgd2F5LCB0aGVuIGFkZCBhIGRlZmF1bHQKK0lmIHRoZSBtaXNzaW5nIHZhbHVlcyBzaG91bGQgYmUgaGFuZGxlZCB0aGUgc2FtZSB3YXksIHRoZW4gYWRkIGEgYGRlZmF1bHRgCiBjbGF1c2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBlbnVtIEUgeyBlMSwgZTIgfQogCiB2b2lkIGYoRSBlKSB7CkBAIC00MDk1LDcgKzQwOTUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBpbnZvY2F0aW9uIG9mIGBmYAogZG9lc24ndCBpbmNsdWRlIGEgdmFsdWUgZm9yIHRoZSByZXF1aXJlZCBuYW1lZCBwYXJhbWV0ZXIgYGVuZGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHN0YXJ0LCB7cmVxdWlyZWQgaW50IGVuZH0pIHt9CiB2b2lkIGcoKSB7CiAgIFshZiFdKDMpOwpAQCAtNDEwNiw3ICs0MTA2LDcgQEAKIAogQWRkIGEgbmFtZWQgYXJndW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHN0YXJ0LCB7cmVxdWlyZWQgaW50IGVuZH0pIHt9CiB2b2lkIGcoKSB7CiAgIGYoMywgZW5kOiA1KTsKQEAgLTQxMzAsNyArNDEzMCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIG5hbWVkIHBhcmFtZXRlciBgeGAKIGlzIHJlcXVpcmVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogdm9pZCBmKHtAcmVxdWlyZWQgaW50IHh9KSB7fQpAQCAtNDE0NCw3ICs0MTQ0LDcgQEAKIAogUHJvdmlkZSB0aGUgcmVxdWlyZWQgdmFsdWU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiB2b2lkIGYoe0ByZXF1aXJlZCBpbnQgeH0pIHt9CkBAIC00MTcwLDcgKzQxNzAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBmYCBkb2Vzbid0IGVuZCB3aXRoIGEKIHJldHVybjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBbIWYhXShpbnQgeCkgewogICBpZiAoeCA8IDApIHsKICAgICByZXR1cm4gMDsKQEAgLTQxODAsOCArNDE4MCw4IEBACiAKICMjIyMgQ29tbW9uIGZpeGVzCiAKLUFkZCBhIHJldHVybiBzdGF0ZW1lbnQgdGhhdCBtYWtlcyB0aGUgcmV0dXJuIHZhbHVlIGV4cGxpY2l0LCBldmVuIGlmIGBudWxsYAotaXMgdGhlIGFwcHJvcHJpYXRlIHZhbHVlLgorQWRkIGEgYHJldHVybmAgc3RhdGVtZW50IHRoYXQgbWFrZXMgdGhlIHJldHVybiB2YWx1ZSBleHBsaWNpdCwgZXZlbiBpZgorYG51bGxgIGlzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4KIAogIyMjIG1peGluX29mX25vbl9jbGFzcwogCkBAIC00MTg5LDcgKzQxODksNyBAQAogCiAjIyMjIERlc2NyaXB0aW9uCiAKLVRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIG5hbWUgaW4gYSBtaXhpbiBjbGF1c2UgaXMKK1RoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIG5hbWUgaW4gYSBgd2l0aGAgY2xhdXNlIGlzCiBkZWZpbmVkIHRvIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgbWl4aW4gb3IgYSBjbGFzcy4KIAogIyMjIyBFeGFtcGxlcwpAQCAtNDE5Nyw3ICs0MTk3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgRmAgaXMgZGVmaW5lZCB0byBiZSBhCiBmdW5jdGlvbiB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdHlwZWRlZiBGID0gaW50IEZ1bmN0aW9uKFN0cmluZyk7CiAKIGNsYXNzIEMgd2l0aCBbIUYhXSB7fQpAQCAtNDIwNSw5ICs0MjA1LDEwIEBACiAKICMjIyMgQ29tbW9uIGZpeGVzCiAKLVJlbW92ZSB0aGUgaW52YWxpZCBuYW1lIGZyb20gdGhlIGxpc3QsIHBvc3NpYmx5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBpbnRlbmRlZCBtaXhpbiBvciBjbGFzczoKK1JlbW92ZSB0aGUgaW52YWxpZCBuYW1lIGZyb20gdGhlIGxpc3QsIHBvc3NpYmx5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuYW1lCitvZiB0aGUgaW50ZW5kZWQgbWl4aW4gb3IgY2xhc3M6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB0eXBlZGVmIEYgPSBpbnQgRnVuY3Rpb24oU3RyaW5nKTsKIAogY2xhc3MgQyB7fQpAQCAtNDIyOSw3ICs0MjMwLDcgQEAKIAogSWYgdGhlIHBhY2thZ2UgJ3AnIGRlZmluZXMgYSBzZWFsZWQgY2xhc3M6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBAc2VhbGVkCkBAIC00MjM5LDcgKzQyNDAsNyBAQAogVGhlbiwgdGhlIGZvbGxvd2luZyBjb2RlLCB3aGVuIGluIGEgcGFja2FnZSBvdGhlciB0aGFuICdwJywgcHJvZHVjZXMgdGhpcwogZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAncGFja2FnZTpwL3AuZGFydCc7CiAKIFshbWl4aW4gTSBvbiBDIHt9IV0KQEAgLTQyNjUsNyArNDI2Niw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYEZgIGlzIG5laXRoZXIgYSBjbGFzcwogbm9yIGEgbWl4aW46CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB0eXBlZGVmIEYgPSB2b2lkIEZ1bmN0aW9uKCk7CiAKIG1peGluIE0gb24gWyFGIV0ge30KQEAgLTQyNzYsNyArNDI3Nyw3IEBACiBJZiB0aGUgdHlwZSB3YXMgaW50ZW5kZWQgdG8gYmUgYSBjbGFzcyBidXQgd2FzIG1pc3R5cGVkLCB0aGVuIHJlcGxhY2UgdGhlCiBuYW1lLgogCi1PdGhlcndpc2UsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSBvbiBjbGF1c2UuCitPdGhlcndpc2UsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSBgb25gIGNsYXVzZS4KIAogIyMjIG11c3RfYmVfaW1tdXRhYmxlCiAKQEAgLTQyOTUsNyArNDI5Niw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGZpZWxkIGB4YCBpc24ndAogZmluYWw6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBAaW1tdXRhYmxlCkBAIC00MzExLDcgKzQzMTIsNyBAQAogSWYgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgaW1tdXRhYmxlLCB0aGVuIGFkZCB0aGUga2V5d29yZCBgZmluYWxgCiB0byBhbGwgbm9uLWZpbmFsIGZpZWxkIGRlY2xhcmF0aW9uczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIEBpbW11dGFibGUKQEAgLTQzMjQsNyArNDMyNSw3IEBACiAKIElmIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSBtdXRhYmxlLCB0aGVuIHJlbW92ZSB0aGUKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeDsKIApAQCAtNDM0OCw3ICs0MzQ5LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgbWV0aG9kIGBtYCBpbiBgQmAKIGRvZXNuJ3QgaW52b2tlIHRoZSBvdmVycmlkZGVuIG1ldGhvZCBgbWAgaW4gYEFgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogY2xhc3MgQSB7CkBAIC00MzY2LDcgKzQzNjcsNyBAQAogCiBBZGQgYW4gaW52b2NhdGlvbiBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QgaW4gdGhlIG92ZXJyaWRpbmcgbWV0aG9kOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIAogY2xhc3MgQSB7CkBAIC00Mzk3LDcgKzQzOTgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBBYCBkb2Vzbid0IGRlZmluZSBhbgogdW5uYW1lZCBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgewogICBBLmEoKTsKIH0KQEAgLTQ0MDksNyArNDQxMCw3IEBACiAKIElmIG9uZSBvZiB0aGUgbmFtZWQgY29uc3RydWN0b3JzIGRvZXMgd2hhdCB5b3UgbmVlZCwgdGhlbiB1c2UgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgQS5hKCk7CiB9CkBAIC00NDIwLDcgKzQ0MjEsNyBAQAogSWYgbm9uZSBvZiB0aGUgbmFtZWQgY29uc3RydWN0b3JzIGRvZXMgd2hhdCB5b3UgbmVlZCwgYW5kIHlvdSdyZSBhYmxlIHRvCiBhZGQgYW4gdW5uYW1lZCBjb25zdHJ1Y3RvciwgdGhlbiBhZGQgdGhlIGNvbnN0cnVjdG9yOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7CiAgIEEoKTsKICAgQS5hKCk7CkBAIC00NDUyLDcgKzQ0NTMsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjbGFzcyBgQmAgZG9lc24ndAogaGF2ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGBtYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEEgewogICB2b2lkIG0oKTsKIH0KQEAgLTQ0NjUsNyArNDQ2Niw3IEBACiBJZiB0aGUgc3ViY2xhc3MgY2FuIHByb3ZpZGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBvciBhbGwgb2YKIHRoZSBhYnN0cmFjdCBpbmhlcml0ZWQgbWVtYmVycywgdGhlbiBhZGQgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEEgewogICB2b2lkIG0oKTsKIH0KQEAgLTQ0NzgsNyArNDQ3OSw3IEBACiBJZiB0aGVyZSBpcyBhIG1peGluIHRoYXQgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGluaGVyaXRlZAogbWV0aG9kcywgdGhlbiBhcHBseSB0aGUgbWl4aW4gdG8gdGhlIHN1YmNsYXNzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogYWJzdHJhY3QgY2xhc3MgQSB7CiAgIHZvaWQgbSgpOwogfQpAQCAtNDQ5Myw3ICs0NDk0LDcgQEAKIElmIHRoZSBzdWJjbGFzcyBjYW4ndCBwcm92aWRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBvZiB0aGUKIGFic3RyYWN0IGluaGVyaXRlZCBtZW1iZXJzLCB0aGVuIG1hcmsgdGhlIHN1YmNsYXNzIGFzIGJlaW5nIGFic3RyYWN0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogYWJzdHJhY3QgY2xhc3MgQSB7CiAgIHZvaWQgbSgpOwogfQpAQCAtNDUxNSw3ICs0NTE2LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgaGFzIHRoZSBzdGF0aWMgdHlwZQogYGludGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHgpIHsKICAgaWYgKFsheCFdKSB7CiAgICAgLy8gLi4uCkBAIC00NTI3LDcgKzQ1MjgsNyBAQAogCiBDaGFuZ2UgdGhlIGNvbmRpdGlvbiBzbyB0aGF0IGl0IHByb2R1Y2VzIGEgQm9vbGVhbiB2YWx1ZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgeCkgewogICBpZiAoeCA9PSAwKSB7CiAgICAgLy8gLi4uCkBAIC00NTQ5LDcgKzQ1NTAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSB0eXBlIG9mIGBwYCBpcwogYGludGAsIGJ1dCBhIGBib29sYCBpcyByZXF1aXJlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgcCkgewogICBhc3NlcnQoWyFwIV0pOwogfQpAQCAtNDU1OSw3ICs0NTYwLDcgQEAKIAogQ2hhbmdlIHRoZSBleHByZXNzaW9uIHNvIHRoYXQgaXQgaGFzIHRoZSB0eXBlIGBib29sYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgcCkgewogICBhc3NlcnQocCA+IDApOwogfQpAQCAtNDU3OSw3ICs0NTgwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgaXMgYW4gYGludGAgd2hlbiBpdAogbXVzdCBiZSBhIGBib29sYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCB4ID0gMDsKIGJvb2wgeSA9ICFbIXghXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00NTg4LDcgKzQ1ODksNyBAQAogCiBSZXBsYWNlIHRoZSBvcGVyYW5kIHdpdGggYW4gZXhwcmVzc2lvbiB0aGF0IGhhcyB0aGUgdHlwZSBgYm9vbGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgeCA9IDA7CiBib29sIHkgPSAhKHggPiAwKTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00NjA3LDcgKzQ2MDgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBhYCBpc24ndCBhIEJvb2xlYW4KIHZhbHVlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGEgPSAzOwogYm9vbCBiID0gWyFhIV0gfHwgYSA+IDE7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNDYxNiw3ICs0NjE3LDcgQEAKIAogQ2hhbmdlIHRoZSBvcGVyYW5kIHRvIGEgQm9vbGVhbiB2YWx1ZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBhID0gMzsKIGJvb2wgYiA9IGEgPT0gMCB8fCBhID4gMTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00NjM2LDcgKzQ2MzcsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBmb3IgYENgCiBpc24ndCBhIGNvbnN0IGNvbnN0cnVjdG9yOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogWyFAQygpIV0KIHZvaWQgZigpIHsKIH0KQEAgLTQ2NTEsNyArNDY1Miw3IEBACiBJZiBpdCdzIHZhbGlkIGZvciB0aGUgY2xhc3MgdG8gaGF2ZSBhIGNvbnN0IGNvbnN0cnVjdG9yLCB0aGVuIGNyZWF0ZSBhCiBjb25zdCBjb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgYW5ub3RhdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIEBDKCkKIHZvaWQgZigpIHsKIH0KQEAgLTQ2NzAsMTQgKzQ2NzEsMTQgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIGV4cHJlc3Npb24gaW4gYSBjYXNlIGNsYXVzZQotaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLgorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIHRoZSBleHByZXNzaW9uIGluIGEgYGNhc2VgCitjbGF1c2UgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uLgogCiAjIyMjIEV4YW1wbGVzCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgamAgaXNuJ3QgYSBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgaSwgaW50IGopIHsKICAgc3dpdGNoIChpKSB7CiAgICAgY2FzZSBbIWohXToKQEAgLTQ2ODksMTAgKzQ2OTAsMTAgQEAKIAogIyMjIyBDb21tb24gZml4ZXMKIAotRWl0aGVyIG1ha2UgdGhlIGV4cHJlc3Npb24gYSBjb25zdGFudCBleHByZXNzaW9uLCBvciByZXdyaXRlIHRoZSBzd2l0Y2gKLXN0YXRlbWVudCBhcyBhIHNlcXVlbmNlIG9mIGlmIHN0YXRlbWVudHM6CitFaXRoZXIgbWFrZSB0aGUgZXhwcmVzc2lvbiBhIGNvbnN0YW50IGV4cHJlc3Npb24sIG9yIHJld3JpdGUgdGhlIGBzd2l0Y2hgCitzdGF0ZW1lbnQgYXMgYSBzZXF1ZW5jZSBvZiBgaWZgIHN0YXRlbWVudHM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGksIGludCBqKSB7CiAgIGlmIChpID09IGopIHsKICAgICAvLyAuLi4KQEAgLTQ3MTQsNyArNDcxNSw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgZGVmYXVsdFZhbHVlID0gMzsKIAogdm9pZCBmKFtpbnQgdmFsdWUgPSBbIWRlZmF1bHRWYWx1ZSFdXSkge30KQEAgLTQ3MjQsNyArNDcyNSw3IEBACiAKIElmIHRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYmUgYSBjb25zdGFudCwgdGhlbiBjb252ZXJ0IGl0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgZGVmYXVsdFZhbHVlID0gMzsKIAogdm9pZCBmKFtpbnQgdmFsdWUgPSBkZWZhdWx0VmFsdWVdKSB7fQpAQCAtNDczMyw3ICs0NzM0LDcgQEAKIElmIHRoZSBkZWZhdWx0IHZhbHVlIG5lZWRzIHRvIGNoYW5nZSBvdmVyIHRpbWUsIHRoZW4gYXBwbHkgdGhlIGRlZmF1bHQKIHZhbHVlIGluc2lkZSB0aGUgZnVuY3Rpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgZGVmYXVsdFZhbHVlID0gMzsKIAogdm9pZCBmKFtpbnQgdmFsdWVdKSB7CkBAIC00NzU3LDcgKzQ3NTgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCBpc24ndCBhIGNvbnN0YW50LAogZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBpbiBhbiBpbXBsaWNpdGx5IGNvbnN0YW50IGxpc3QgbGl0ZXJhbDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciB4ID0gMjsKIHZhciB5ID0gY29uc3QgPGludD5bMCwgMSwgWyF4IV1dOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ3NjgsNyArNDc2OSw3IEBACiBjb25zdGFudC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHlvdSBtaWdodCBhZGQgdGhlIGBjb25zdGAga2V5d29yZCB0byB0aGUKIGRlY2xhcmF0aW9uIG9mIGB4YDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IHggPSAyOwogdmFyIHkgPSBjb25zdCA8aW50PlswLCAxLCB4XTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00Nzc4LDcgKzQ3NzksNyBAQAogY29uc3RhbnQuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoaXMgbWVhbnMgcmVtb3ZpbmcgdGhlIGBjb25zdGAga2V5d29yZAogYmVmb3JlIHRoZSBsaXN0IGxpdGVyYWw6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgeCA9IDI7CiB2YXIgeSA9IDxpbnQ+WzAsIDEsIHhdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ3ODksMzQgKzQ3OTAsMzQgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gaWYgZWxlbWVudCBvciBhIHNwcmVhZAorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGBpZmAgZWxlbWVudCBvciBhIHNwcmVhZAogZWxlbWVudCBpbiBhIGNvbnN0YW50IG1hcCBpc24ndCBhIGNvbnN0YW50IGVsZW1lbnQuCiAKICMjIyMgRXhhbXBsZXMKIAotVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGl0IGlzIGF0dGVtcHRpbmcgdG8KK1RoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBpdCdzIGF0dGVtcHRpbmcgdG8KIHNwcmVhZCBhIG5vbi1jb25zdGFudCBtYXA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgbm90Q29uc3QgPSA8aW50LCBpbnQ+e307CiB2YXIgbWFwID0gY29uc3QgPGludCwgaW50PnsuLi5bIW5vdENvbnN0IV19OwogeyUgZW5kcHJldHRpZnkgJX0KIAogU2ltaWxhcmx5LCB0aGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlCi1jb25kaXRpb24gaW4gdGhlIGlmIGVsZW1lbnQgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uOgorY29uZGl0aW9uIGluIHRoZSBgaWZgIGVsZW1lbnQgaXNuJ3QgYSBjb25zdGFudCBleHByZXNzaW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogYm9vbCBub3RDb25zdCA9IHRydWU7CiB2YXIgbWFwID0gY29uc3QgPGludCwgaW50PntpZiAoWyFub3RDb25zdCFdKSAxIDogMn07CiB7JSBlbmRwcmV0dGlmeSAlfQogCiAjIyMjIENvbW1vbiBmaXhlcwogCi1JZiB0aGUgbWFwIG5lZWRzIHRvIGJlIGEgY29uc3RhbnQgbWFwLCB0aGVuIG1ha2UgdGhlIGVsZW1lbnRzICBjb25zdGFudHMuCitJZiB0aGUgbWFwIG5lZWRzIHRvIGJlIGEgY29uc3RhbnQgbWFwLCB0aGVuIG1ha2UgdGhlIGVsZW1lbnRzIGNvbnN0YW50cy4KIEluIHRoZSBzcHJlYWQgZXhhbXBsZSwgeW91IG1pZ2h0IGRvIHRoYXQgYnkgbWFraW5nIHRoZSBjb2xsZWN0aW9uIGJlaW5nCiBzcHJlYWQgYSBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IG5vdENvbnN0ID0gPGludCwgaW50Pnt9OwogdmFyIG1hcCA9IGNvbnN0IDxpbnQsIGludD57Li4ubm90Q29uc3R9OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ4MjQsNyArNDgyNSw3IEBACiBJZiB0aGUgbWFwIGRvZXNuJ3QgbmVlZCB0byBiZSBhIGNvbnN0YW50IG1hcCwgdGhlbiByZW1vdmUgdGhlIGBjb25zdGAKIGtleXdvcmQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBib29sIG5vdENvbnN0ID0gdHJ1ZTsKIHZhciBtYXAgPSA8aW50LCBpbnQ+e2lmIChub3RDb25zdCkgMSA6IDJ9OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ4NDIsNyArNDg0Myw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVhdXNlIGBhYCBpc24ndCBhIGNvbnN0YW50OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIGEgPSAnYSc7CiB2YXIgbSA9IGNvbnN0IHtbIWEhXTogMH07CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNDg1MSw3ICs0ODUyLDcgQEAKIAogSWYgdGhlIG1hcCBuZWVkcyB0byBiZSBhIGNvbnN0YW50IG1hcCwgdGhlbiBtYWtlIHRoZSBrZXkgYSBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IGEgPSAnYSc7CiB2YXIgbSA9IGNvbnN0IHthOiAwfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00ODU5LDcgKzQ4NjAsNyBAQAogSWYgdGhlIG1hcCBkb2Vzbid0IG5lZWQgdG8gYmUgYSBjb25zdGFudCBtYXAsIHRoZW4gcmVtb3ZlIHRoZSBgY29uc3RgCiBrZXl3b3JkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIGEgPSAnYSc7CiB2YXIgbSA9IHthOiAwfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00ODc3LDcgKzQ4NzgsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGFgIGlzbid0IGEgY29uc3RhbnQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgYSA9ICdhJzsKIHZhciBtID0gY29uc3QgezA6IFshYSFdfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC00ODg2LDcgKzQ4ODcsNyBAQAogCiBJZiB0aGUgbWFwIG5lZWRzIHRvIGJlIGEgY29uc3RhbnQgbWFwLCB0aGVuIG1ha2UgdGhlIGtleSBhIGNvbnN0YW50OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgYSA9ICdhJzsKIHZhciBtID0gY29uc3QgezA6IGF9OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ4OTQsNyArNDg5NSw3IEBACiBJZiB0aGUgbWFwIGRvZXNuJ3QgbmVlZCB0byBiZSBhIGNvbnN0YW50IG1hcCwgdGhlbiByZW1vdmUgdGhlIGBjb25zdGAKIGtleXdvcmQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgYSA9ICdhJzsKIHZhciBtID0gezA6IGF9OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTQ5MTIsNyArNDkxMyw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgaWAgaXNuJ3QgYSBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZhciBpID0gMDsKIAogdmFyIHMgPSBjb25zdCB7WyFpIV19OwpAQCAtNDkyMiw3ICs0OTIzLDcgQEAKIAogSWYgdGhlIGVsZW1lbnQgY2FuIGJlIGNoYW5nZWQgdG8gYmUgYSBjb25zdGFudCwgdGhlbiBjaGFuZ2UgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBpID0gMDsKIAogdmFyIHMgPSBjb25zdCB7aX07CkBAIC00OTMwLDcgKzQ5MzEsNyBAQAogCiBJZiB0aGUgZWxlbWVudCBjYW4ndCBiZSBhIGNvbnN0YW50LCB0aGVuIHJlbW92ZSB0aGUga2V5d29yZCBgY29uc3RgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIGkgPSAwOwogCiB2YXIgcyA9IHtpfTsKQEAgLTQ5NTYsNyArNDk1Nyw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBjbGFzcyBDIHsKQEAgLTQ5NzEsNyArNDk3Miw3IEBACiAKIEFkZCB0aGUga2V5d29yZCBgY29uc3RgIGJlZm9yZSB0aGUgY29uc3RydWN0b3IgaW52b2NhdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CiAKIGNsYXNzIEMgewpAQCAtNDk5Niw3ICs0OTk3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgaXMgYSB2YXJpYWJsZSwgbm90CiBhIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgeCA9IDA7CiBMaXN0PFsheCFdPiB4TGlzdCA9IFtdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTUwMDUsNyArNTAwNiw3IEBACiAKIENoYW5nZSB0aGUgdHlwZSBhcmd1bWVudCB0byBiZSBhIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgeCA9IDA7CiBMaXN0PGludD4geExpc3QgPSBbXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01MDE3LDE0ICs1MDE4LDE0IEBACiAjIyMjIERlc2NyaXB0aW9uCiAKIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgaWRlbnRpZmllciBmb2xsb3dpbmcgdGhlCi1gb25gIGluIGEgY2F0Y2ggY2xhdXNlIGlzIGRlZmluZWQgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSB0eXBlLgorYG9uYCBpbiBhIGBjYXRjaGAgY2xhdXNlIGlzIGRlZmluZWQgdG8gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYSB0eXBlLgogCiAjIyMjIEV4YW1wbGVzCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZmAgaXMgYSBmdW5jdGlvbiwgbm90CiBhIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgICAgLy8gLi4uCkBAIC01MDM4LDcgKzUwMzksNyBAQAogCiBDaGFuZ2UgdGhlIG5hbWUgdG8gdGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGNhdWdodDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgICAvLyAuLi4KQEAgLTUwNjksNyArNTA3MCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGNhbid0IGhhdmUgYSB2YWx1ZQogb2YgYG51bGxgLCBidXQgaXMgcmVmZXJlbmNlZCBiZWZvcmUgYSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBTdHJpbmcgZigpIHsKICAgaW50IHg7CiAgIHJldHVybiBbIXghXS50b1N0cmluZygpOwpAQCAtNTA3OSw3ICs1MDgwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgYXNzaWdubWVudCB0byBgeGAKIG1pZ2h0IG5vdCBiZSBleGVjdXRlZCwgc28gaXQgbWlnaHQgaGF2ZSBhIHZhbHVlIG9mIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBnKGJvb2wgYikgewogICBpbnQgeDsKICAgaWYgKGIpIHsKQEAgLTUwOTMsNyArNTA5NCw3IEBACiBwcm92ZSwgYmFzZWQgb24gZGVmaW5pdGUgYXNzaWdubWVudCBhbmFseXNpcywgdGhhdCBgeGAgd29uJ3QgYmUgcmVmZXJlbmNlZAogd2l0aG91dCBoYXZpbmcgYSB2YWx1ZSBhc3NpZ25lZCB0byBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBoKGJvb2wgYikgewogICBpbnQgeDsKICAgaWYgKGIpIHsKQEAgLTUxMTAsNyArNTExMSw3IEBACiAKIElmIGBudWxsYCBpcyBhIHZhbGlkIHZhbHVlLCB0aGVuIG1ha2UgdGhlIHZhcmlhYmxlIG51bGxhYmxlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogU3RyaW5nIGYoKSB7CiAgIGludD8geDsKICAgcmV0dXJuIHghLnRvU3RyaW5nKCk7CkBAIC01MTIwLDcgKzUxMjEsNyBAQAogSWYgYG51bGxgIGlzbuKAmXQgYSB2YWxpZCB2YWx1ZSwgYW5kIHRoZXJlJ3MgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUsIHRoZW4KIGFkZCBhbiBpbml0aWFsaXplcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBnKGJvb2wgYikgewogICBpbnQgeCA9IDI7CiAgIGlmIChiKSB7CkBAIC01MTMzLDcgKzUxMzQsNyBAQAogT3RoZXJ3aXNlLCBlbnN1cmUgdGhhdCBhIHZhbHVlIHdhcyBhc3NpZ25lZCBvbiBldmVyeSBwb3NzaWJsZSBjb2RlIHBhdGgKIGJlZm9yZSB0aGUgdmFsdWUgaXMgYWNjZXNzZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgZyhib29sIGIpIHsKICAgaW50IHg7CiAgIGlmIChiKSB7CkBAIC01MTUxLDcgKzUxNTIsNyBAQAogYmUgdXNlZCBpZiB5b3UncmUgc3VyZSB0aGF0IHRoZSB2YXJpYWJsZSB3aWxsIGFsd2F5cyBiZSBhc3NpZ25lZCwgZXZlbgogdGhvdWdoIHRoZSBhbmFseXplciBjYW4ndCBwcm92ZSBpdCBiYXNlZCBvbiBkZWZpbml0ZSBhc3NpZ25tZW50IGFuYWx5c2lzLgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGgoYm9vbCBiKSB7CiAgIGxhdGUgaW50IHg7CiAgIGlmIChiKSB7CkBAIC01MTc3LDcgKzUxNzgsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGlzIGEgZnVuY3Rpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBmKCkge30KIGcoWyFmIV0gdikge30KIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01MjAxLDcgKzUyMDIsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBmYCBkZWNsYXJlcyB0d28KIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGJ1dCBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgYSwgaW50IGIpIHt9CiB2b2lkIGcoKSB7CiAgIGZbISgwKSFdOwpAQCAtNTIxMiw3ICs1MjEzLDcgQEAKIAogQWRkIGFyZ3VtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZW1haW5pbmcgcGFyYW1ldGVyczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgYSwgaW50IGIpIHt9CiB2b2lkIGcoKSB7CiAgIGYoMCwgMSk7CkBAIC01MjM5LDcgKzUyNDAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCBpcyBpbXBsaWNpdGx5CiBpbml0aWFsaXplZCB0byBgbnVsbGAgd2hlbiBpdCBpc24ndCBhbGxvd2VkIHRvIGJlIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgWyF4IV07CiB9CkBAIC01MjUwLDcgKzUyNTEsNyBAQAogb25lIG9mIHRoZSBjb25zdHJ1Y3RvcnMsIGV2ZW4gdGhvdWdoIGl0J3MgaW5pdGlhbGl6ZWQgYnkgb3RoZXIKIGNvbnN0cnVjdG9yczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeDsKIApAQCAtNTI2NSw3ICs1MjY2LDcgQEAKIElmIHRoZXJlJ3MgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmaWVsZCB0aGF04oCZcyB0aGUgc2FtZSBmb3IgYWxsCiBpbnN0YW5jZXMsIHRoZW4gYWRkIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHggPSAwOwogfQpAQCAtNTI3NSw3ICs1Mjc2LDcgQEAKIHRoZW4gYWRkIGEgY29uc3RydWN0b3IgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgdXBkYXRlIGFuCiBleGlzdGluZyBjb25zdHJ1Y3RvcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgeDsKIApAQCAtNTI4OCw3ICs1Mjg5LDcgQEAKIGFuIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24gYXQgcnVudGltZS4gVGhpcyBhcHByb2FjaCBzaG91bGQgb25seSBiZSB1c2VkIGlmCiB5b3UncmUgc3VyZSB0aGF0IHRoZSBmaWVsZCB3aWxsIGFsd2F5cyBiZSBhc3NpZ25lZCBiZWZvcmUgaXQncyByZWZlcmVuY2VkLgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGxhdGUgaW50IHg7CiB9CkBAIC01MzExLDcgKzUzMTIsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBmaWVsZCBgZmAgY2FuJ3QgYmUKIGluaXRpYWxpemVkIHRvIGBudWxsYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzdGF0aWMgaW50IFshZiFdOwogfQpAQCAtNTMyMCw3ICs1MzIxLDcgQEAKIFNpbWlsYXJseSwgdGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZQogdG9wLWxldmVsIHZhcmlhYmxlIGB2YCBjYW4ndCBiZSBpbml0aWFsaXplZCB0byBgbnVsbGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgWyF2IV07CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC01MzI5LDcgKzUzMzAsNyBAQAogSWYgdGhlIGZpZWxkIG9yIHZhcmlhYmxlIGNhbid0IGJlIGluaXRpYWxpemVkIHRvIGBudWxsYCwgdGhlbiBhZGQgYW4KIGluaXRpYWxpemVyIHRoYXQgc2V0cyBpdCB0byBhIG5vbi1udWxsIHZhbHVlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIHN0YXRpYyBpbnQgZiA9IDA7CiB9CkBAIC01MzM4LDE0ICs1MzM5LDE0IEBACiBJZiB0aGUgZmllbGQgb3IgdmFyaWFibGUgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGBudWxsYCwgdGhlbiBjaGFuZ2UgdGhlCiB0eXBlIHRvIGJlIG51bGxhYmxlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50PyB2OwogeyUgZW5kcHJldHRpZnkgJX0KIAogSWYgdGhlIGZpZWxkIG9yIHZhcmlhYmxlIGNhbid0IGJlIGluaXRpYWxpemVkIGluIHRoZSBkZWNsYXJhdGlvbiBidXQgd2lsbAogYWx3YXlzIGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCdzIHJlZmVyZW5jZWQsIHRoZW4gbWFyayBpdCBhcyBiZWluZyBgbGF0ZWA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgc3RhdGljIGxhdGUgaW50IGY7CiB9CkBAIC01MzY1LDcgKzUzNjYsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIG0gPSA8U3RyaW5nLCBpbnQ+eydhJzogMCwgJ2InOiAxfTsKIHZhciBzID0gPFN0cmluZz57Li4uWyFtIV19OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTUzNzUsNyArNTM3Niw3IEBACiBUaGUgbW9zdCBjb21tb24gZml4IGlzIHRvIHJlcGxhY2UgdGhlIGV4cHJlc3Npb24gd2l0aCBvbmUgdGhhdCBwcm9kdWNlcyBhbgogaXRlcmFibGUgb2JqZWN0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIG0gPSA8U3RyaW5nLCBpbnQ+eydhJzogMCwgJ2InOiAxfTsKIHZhciBzID0gPFN0cmluZz57Li4ubS5rZXlzfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01Mzk0LDcgKzUzOTUsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGxgIGlzbid0IGEgYE1hcGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgbCA9ICA8U3RyaW5nPlsnYScsICdiJ107CiB2YXIgbSA9IDxpbnQsIFN0cmluZz57Li4uWyFsIV19OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTU0MDQsNyArNTQwNSw3IEBACiBUaGUgbW9zdCBjb21tb24gZml4IGlzIHRvIHJlcGxhY2UgdGhlIGV4cHJlc3Npb24gd2l0aCBvbmUgdGhhdCBwcm9kdWNlcyBhCiBtYXA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgbCA9ICA8U3RyaW5nPlsnYScsICdiJ107CiB2YXIgbSA9IDxpbnQsIFN0cmluZz57Li4ubC5hc01hcCgpfTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01NDI2LDcgKzU0MjcsNyBAQAogY2xhc3MgY2FuJ3QgYmUgdXNlZCBhcyBhbiBhbm5vdGF0aW9uIHdpdGhvdXQgaW52b2tpbmcgYSBgY29uc3RgIGNvbnN0cnVjdG9yCiBmcm9tIHRoZSBjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBjb25zdCBDKCk7CiB9CkBAIC01NDM5LDcgKzU0NDAsNyBAQAogCiBBZGQgdGhlIG1pc3NpbmcgYXJndW1lbnQgbGlzdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBjb25zdCBDKCk7CiB9CkBAIC01NDU2LDE2ICs1NDU3LDE2IEBACiAjIyMjIERlc2NyaXB0aW9uCiAKIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgdHlwZSBmb2xsb3dpbmcgYG9uYCBpbiBhCi1jYXRjaCBjbGF1c2UgaXMgYSBudWxsYWJsZSB0eXBlLiBJdCBpc24ndCB2YWxpZCB0byBzcGVjaWZ5IGEgbnVsbGFibGUgdHlwZQotYmVjYXVzZSBpdCBpc24ndCBwb3NzaWJsZSB0byBjYXRjaCBgbnVsbGAgKGJlY2F1c2UgaXQncyBhIHJ1bnRpbWUgZXJyb3IgdG8KLXRocm93IGBudWxsYCkuCitgY2F0Y2hgIGNsYXVzZSBpcyBhIG51bGxhYmxlIHR5cGUuIEl0IGlzbid0IHZhbGlkIHRvIHNwZWNpZnkgYSBudWxsYWJsZQordHlwZSBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIGNhdGNoIGBudWxsYCAoYmVjYXVzZSBpdCdzIGEgcnVudGltZQorZXJyb3IgdG8gdGhyb3cgYG51bGxgKS4KIAogIyMjIyBFeGFtcGxlCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIHR5cGUgaXMKIHNwZWNpZmllZCB0byBhbGxvdyBgbnVsbGAgd2hlbiBgbnVsbGAgY2FuJ3QgYmUgdGhyb3duOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKCkgewogICB0cnkgewogICAgIC8vIC4uLgpAQCAtNTQ3OCw3ICs1NDc5LDcgQEAKIAogUmVtb3ZlIHRoZSBxdWVzdGlvbiBtYXJrIGZyb20gdGhlIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIHRyeSB7CiAgICAgLy8gLi4uCkBAIC01NDk0LDEyICs1NDk1LDEyIEBACiAjIyMjIERlc2NyaXB0aW9uCiAKIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGNsYXNzIGRlY2xhcmF0aW9uIHVzZXMgYW4KLWV4dGVuZHMgY2xhdXNlIHRvIHNwZWNpZnkgYSBzdXBlcmNsYXNzLCBhbmQgdGhlIHN1cGVyY2xhc3MgaXMgZm9sbG93ZWQgYnkgYQotYD9gLgorYGV4dGVuZHNgIGNsYXVzZSB0byBzcGVjaWZ5IGEgc3VwZXJjbGFzcywgYW5kIHRoZSBzdXBlcmNsYXNzIGlzIGZvbGxvd2VkIGJ5CithIGA/YC4KIAogSXQgaXNuJ3QgdmFsaWQgdG8gc3BlY2lmeSBhIG51bGxhYmxlIHN1cGVyY2xhc3MgYmVjYXVzZSBkb2luZyBzbyB3b3VsZCBoYXZlCiBubyBtZWFuaW5nOyBpdCB3b3VsZG4ndCBjaGFuZ2UgZWl0aGVyIHRoZSBpbnRlcmZhY2Ugb3IgaW1wbGVtZW50YXRpb24gYmVpbmcKLWluaGVyaXRlZCBieSB0aGUgY2xhc3MgY29udGFpbmluZyB0aGUgZXh0ZW5kcyBjbGF1c2UuCitpbmhlcml0ZWQgYnkgdGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGBleHRlbmRzYCBjbGF1c2UuCiAKIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQgX2lzXyB2YWxpZCB0byB1c2UgYSBudWxsYWJsZSB0eXBlIGFzIGEgdHlwZSBhcmd1bWVudAogdG8gdGhlIHN1cGVyY2xhc3MsIHN1Y2ggYXMgYGNsYXNzIEEgZXh0ZW5kcyBCPEM/PiB7fWAuCkBAIC01NTA3LDkgKzU1MDgsOSBAQAogIyMjIyBFeGFtcGxlCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQT9gIGlzIGEgbnVsbGFibGUKLXR5cGUsIGFuZCBudWxsYWJsZSB0eXBlcyBjYW4ndCBiZSB1c2VkIGluIGFuIGV4dGVuZHMgY2xhdXNlOgordHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gYGV4dGVuZHNgIGNsYXVzZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEge30KIGNsYXNzIEIgZXh0ZW5kcyBbIUE/IV0ge30KIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01NTE4LDcgKzU1MTksNyBAQAogCiBSZW1vdmUgdGhlIHF1ZXN0aW9uIG1hcmsgZnJvbSB0aGUgdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEge30KIGNsYXNzIEIgZXh0ZW5kcyBBIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNTUzMCwxMSArNTUzMSwxMSBAQAogIyMjIyBEZXNjcmlwdGlvbgogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbiBoYXMKLWFuIGltcGxlbWVudHMgY2xhdXNlLCBhbmQgYW4gaW50ZXJmYWNlIGlzIGZvbGxvd2VkIGJ5IGEgYD9gLgorYW4gYGltcGxlbWVudHNgIGNsYXVzZSwgYW5kIGFuIGludGVyZmFjZSBpcyBmb2xsb3dlZCBieSBhIGA/YC4KIAogSXQgaXNuJ3QgdmFsaWQgdG8gc3BlY2lmeSBhIG51bGxhYmxlIGludGVyZmFjZSBiZWNhdXNlIGRvaW5nIHNvIHdvdWxkIGhhdmUKIG5vIG1lYW5pbmc7IGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgaW50ZXJmYWNlIGJlaW5nIGluaGVyaXRlZCBieSB0aGUgY2xhc3MKLWNvbnRhaW5pbmcgdGhlIGltcGxlbWVudHMgY2xhdXNlLgorY29udGFpbmluZyB0aGUgYGltcGxlbWVudHNgIGNsYXVzZS4KIAogTm90ZSwgaG93ZXZlciwgdGhhdCBpdCBfaXNfIHZhbGlkIHRvIHVzZSBhIG51bGxhYmxlIHR5cGUgYXMgYSB0eXBlIGFyZ3VtZW50CiB0byB0aGUgaW50ZXJmYWNlLCBzdWNoIGFzIGBjbGFzcyBBIGltcGxlbWVudHMgQjxDPz4ge31gLgpAQCAtNTU0Myw5ICs1NTQ0LDkgQEAKICMjIyMgRXhhbXBsZQogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYEE/YCBpcyBhIG51bGxhYmxlCi10eXBlLCBhbmQgbnVsbGFibGUgdHlwZXMgY2FuJ3QgYmUgdXNlZCBpbiBhbiBpbXBsZW1lbnRzIGNsYXVzZToKK3R5cGUsIGFuZCBudWxsYWJsZSB0eXBlcyBjYW4ndCBiZSB1c2VkIGluIGFuIGBpbXBsZW1lbnRzYCBjbGF1c2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiBjbGFzcyBCIGltcGxlbWVudHMgWyFBPyFdIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNTU1NCw3ICs1NTU1LDcgQEAKIAogUmVtb3ZlIHRoZSBxdWVzdGlvbiBtYXJrIGZyb20gdGhlIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiBjbGFzcyBCIGltcGxlbWVudHMgQSB7fQogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTU1NjUsMTMgKzU1NjYsMTMgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBtaXhpbiBkZWNsYXJhdGlvbiB1c2VzIGFuIG9uCitUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBtaXhpbiBkZWNsYXJhdGlvbiB1c2VzIGFuIGBvbmAKIGNsYXVzZSB0byBzcGVjaWZ5IGEgc3VwZXJjbGFzcyBjb25zdHJhaW50LCBhbmQgdGhlIGNsYXNzIHRoYXQncyBzcGVjaWZpZWQKIGlzIGZvbGxvd2VkIGJ5IGEgYD9gLgogCiBJdCBpc24ndCB2YWxpZCB0byBzcGVjaWZ5IGEgbnVsbGFibGUgc3VwZXJjbGFzcyBjb25zdHJhaW50IGJlY2F1c2UgZG9pbmcgc28KIHdvdWxkIGhhdmUgbm8gbWVhbmluZzsgaXQgd291bGRuJ3QgY2hhbmdlIHRoZSBpbnRlcmZhY2UgYmVpbmcgZGVwZW5kZWQgb24KLWJ5IHRoZSBtaXhpbiBjb250YWluaW5nIHRoZSBvbiBjbGF1c2UuCitieSB0aGUgbWl4aW4gY29udGFpbmluZyB0aGUgYG9uYCBjbGF1c2UuCiAKIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQgX2lzXyB2YWxpZCB0byB1c2UgYSBudWxsYWJsZSB0eXBlIGFzIGEgdHlwZSBhcmd1bWVudAogdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RyYWludCwgc3VjaCBhcyBgbWl4aW4gQSBvbiBCPEM/PiB7fWAuCkBAIC01NTgwLDkgKzU1ODEsOSBAQAogIyMjIyBFeGFtcGxlCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgQT9gIGlzIGEgbnVsbGFibGUgdHlwZQotYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gb24gY2xhdXNlOgorYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYW4gYG9uYCBjbGF1c2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHt9CiBtaXhpbiBNIG9uIFshQz8hXSB7fQogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTU1OTEsNyArNTU5Miw3IEBACiAKIFJlbW92ZSB0aGUgcXVlc3Rpb24gbWFyayBmcm9tIHRoZSB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7fQogbWl4aW4gTSBvbiBDIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNTYwMywxMSArNTYwNCwxMSBAQAogIyMjIyBEZXNjcmlwdGlvbgogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBjbGFzcyBvciBtaXhpbiBkZWNsYXJhdGlvbiBoYXMKLWEgd2l0aCBjbGF1c2UsIGFuZCBhIG1peGluIGlzIGZvbGxvd2VkIGJ5IGEgYD9gLgorYSBgd2l0aGAgY2xhdXNlLCBhbmQgYSBtaXhpbiBpcyBmb2xsb3dlZCBieSBhIGA/YC4KIAogSXQgaXNuJ3QgdmFsaWQgdG8gc3BlY2lmeSBhIG51bGxhYmxlIG1peGluIGJlY2F1c2UgZG9pbmcgc28gd291bGQgaGF2ZSBubwogbWVhbmluZzsgaXQgd291bGRuJ3QgY2hhbmdlIGVpdGhlciB0aGUgaW50ZXJmYWNlIG9yIGltcGxlbWVudGF0aW9uIGJlaW5nCi1pbmhlcml0ZWQgYnkgdGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHdpdGggY2xhdXNlLgoraW5oZXJpdGVkIGJ5IHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBgd2l0aGAgY2xhdXNlLgogCiBOb3RlLCBob3dldmVyLCB0aGF0IGl0IF9pc18gdmFsaWQgdG8gdXNlIGEgbnVsbGFibGUgdHlwZSBhcyBhIHR5cGUgYXJndW1lbnQKIHRvIHRoZSBtaXhpbiwgc3VjaCBhcyBgY2xhc3MgQSB3aXRoIEI8Qz8+IHt9YC4KQEAgLTU2MTUsOSArNTYxNiw5IEBACiAjIyMjIEV4YW1wbGUKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBBP2AgaXMgYSBudWxsYWJsZQotdHlwZSwgYW5kIG51bGxhYmxlIHR5cGVzIGNhbid0IGJlIHVzZWQgaW4gYSB3aXRoIGNsYXVzZToKK3R5cGUsIGFuZCBudWxsYWJsZSB0eXBlcyBjYW4ndCBiZSB1c2VkIGluIGEgYHdpdGhgIGNsYXVzZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIG1peGluIE0ge30KIGNsYXNzIEMgd2l0aCBbIU0/IV0ge30KIHslIGVuZHByZXR0aWZ5ICV9CkBAIC01NjI2LDcgKzU2MjcsNyBAQAogCiBSZW1vdmUgdGhlIHF1ZXN0aW9uIG1hcmsgZnJvbSB0aGUgdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIG1peGluIE0ge30KIGNsYXNzIEMgd2l0aCBNIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNTY1Miw3ICs1NjUzLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgbWAgaXNuJ3QgZGVjbGFyZWQgaW4KIGFueSBvZiB0aGUgc3VwZXJ0eXBlcyBvZiBgQ2A6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgQG92ZXJyaWRlCiAgIFN0cmluZyBbIW0hXSgpID0+ICcnOwpAQCAtNTY2NCw3ICs1NjY1LDcgQEAKIElmIHRoZSBtZW1iZXIgaXMgaW50ZW5kZWQgdG8gb3ZlcnJpZGUgYSBtZW1iZXIgd2l0aCBhIGRpZmZlcmVudCBuYW1lLCB0aGVuCiB1cGRhdGUgdGhlIG1lbWJlciB0byBoYXZlIHRoZSBzYW1lIG5hbWU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgQG92ZXJyaWRlCiAgIFN0cmluZyB0b1N0cmluZygpID0+ICcnOwpAQCAtNTY5MCw3ICs1NjkxLDcgQEAKIAogR2l2ZW4gYSBmaWxlIG5hbWVkIGBwYXJ0LmRhcnRgIGNvbnRhaW5pbmcKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHBhcnQgb2YgJ2xpYnJhcnkuZGFydCc7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC01Njk4LDcgKzU2OTksNyBAQAogZGlhZ25vc3RpYyBiZWNhdXNlIGl0IGF0dGVtcHRzIHRvIGluY2x1ZGUgYHBhcnQuZGFydGAgYXMgYSBwYXJ0IG9mIGl0c2VsZgogd2hlbiBgcGFydC5kYXJ0YCBpcyBhIHBhcnQgb2YgYSBkaWZmZXJlbnQgbGlicmFyeToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHBhcnQgWyEncGFja2FnZTphL3BhcnQuZGFydCchXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTU3MjQsMTQgKzU3MjUsMTQgQEAKIAogR2l2ZW4gYSBmaWxlIChgYS5kYXJ0YCkgY29udGFpbmluZzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEge30KIHslIGVuZHByZXR0aWZ5ICV9CiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgYS5kYXJ0YCBkb2Vzbid0CiBjb250YWluIGEgcGFydC1vZiBkaXJlY3RpdmU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBwYXJ0IFshJ2EuZGFydCchXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTU3NDAsNyArNTc0MSw3IEBACiBJZiB0aGUgcmVmZXJlbmNlZCBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGEgcGFydCBvZiBhbm90aGVyIGxpYnJhcnksIHRoZW4KIGFkZCBhIHBhcnQtb2YgZGlyZWN0aXZlIHRvIHRoZSBmaWxlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogcGFydCBvZiAndGVzdC5kYXJ0JzsKIAogY2xhc3MgQSB7fQpAQCAtNTc0OSw3ICs1NzUwLDcgQEAKIElmIHRoZSByZWZlcmVuY2VkIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgYSBsaWJyYXJ5LCB0aGVuIHJlcGxhY2UgdGhlIHBhcnQKIGRpcmVjdGl2ZSB3aXRoIGFuIGltcG9ydCBkaXJlY3RpdmU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ2EuZGFydCc7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC01NzY5LDcgKzU3NzAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBwcmVmaXggYG1hdGhgIGlzCiBiZWluZyB1c2VkIGFzIGlmIGl0IHdlcmUgYSB2YXJpYWJsZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwogCiB2b2lkIGYoKSB7CkBAIC01NzgyLDcgKzU3ODMsNyBAQAogSWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlbiByZWZlcmVuY2Ugc29tZXRoaW5nIGluIG9uZSBvZiB0aGUgbGlicmFyaWVzCiBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWZpeDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwogCiB2b2lkIGYoKSB7CkBAIC01ODEwLDcgKzU4MTEsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBmb3IgYEFgCiBkb2Vzbid0IGRlY2xhcmUgYSBwYXJhbWV0ZXIgdGhhdCB0aGUgY29uc3RydWN0b3IgZm9yIGBCYCByZXF1aXJlczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGFic3RyYWN0IGNsYXNzIEEgewogICBmYWN0b3J5IEEoKSA9IFshQiFdOwogfQpAQCAtNTgyNSw3ICs1ODI2LDcgQEAKIGRlY2xhcmVzIGEgbmFtZWQgcGFyYW1ldGVyIChgeWApIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGZvciBgQmAgZG9lc24ndAogYWxsb3c6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBhYnN0cmFjdCBjbGFzcyBBIHsKICAgZmFjdG9yeSBBKGludCB4LCB7aW50IHl9KSA9IFshQiFdOwogfQpAQCAtNTg0MCw3ICs1ODQxLDcgQEAKIElmIHRoZXJlJ3MgYSBkaWZmZXJlbnQgY29uc3RydWN0b3IgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlZGlyZWN0aW5nCiBjb25zdHJ1Y3RvciwgdGhlbiByZWRpcmVjdCB0byB0aGF0IGNvbnN0cnVjdG9yOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogYWJzdHJhY3QgY2xhc3MgQSB7CiAgIGZhY3RvcnkgQSgpID0gQi56ZXJvOwogfQpAQCAtNTg1Myw3ICs1ODU0LDcgQEAKIAogT3RoZXJ3aXNlLCB1cGRhdGUgdGhlIHJlZGlyZWN0aW5nIGNvbnN0cnVjdG9yIHRvIGJlIGNvbXBhdGlibGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBhYnN0cmFjdCBjbGFzcyBBIHsKICAgZmFjdG9yeSBBKGludCB4KSA9IEI7CiB9CkBAIC01ODc5LDcgKzU4ODAsNyBAQAogb2YgYENgLCB3aGljaCBtZWFucyB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29uc3RydWN0b3IgYEEoKWAKIGNvdWxkbid0IGJlIHJldHVybmVkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGBDKClgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7fQogCiBjbGFzcyBCIGltcGxlbWVudHMgQyB7fQpAQCAtNTg5NSw3ICs1ODk2LDcgQEAKIGNsYXNzLCB0aGVuIHVwZGF0ZSB0aGUgZmFjdG9yeSBjb25zdHJ1Y3RvciB0byByZWRpcmVjdCB0byB0aGUgY29ycmVjdAogY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHt9CiAKIGNsYXNzIEIgaW1wbGVtZW50cyBDIHt9CkBAIC01OTA4LDcgKzU5MDksNyBAQAogSWYgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjb25zdHJ1Y3RvciBiZWluZyByZWRpcmVjdGVkIHRvIGlzIHRoZSBjbGFzcyB0aGF0CiBzaG91bGQgYmUgcmV0dXJuZWQsIHRoZW4gbWFrZSBpdCBhIHN1YnR5cGUgb2YgdGhlIGZhY3RvcnkncyByZXR1cm4gdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgaW1wbGVtZW50cyBDIHt9CiAKIGNsYXNzIEIgaW1wbGVtZW50cyBDIHt9CkBAIC01OTMzLDcgKzU5MzQsNyBAQAogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGlzIGEgZnVuY3Rpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBDIGYoKSA9PiB0aHJvdyAwOwogCiBjbGFzcyBDIHsKQEAgLTU5NTIsNyArNTk1Myw3IEBACiBJZiB5b3UncmUgdHJ5aW5nIHRvIHJldHVybiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiwgdGhlbiByZXdyaXRlCiB0aGUgY29uc3RydWN0b3IgdG8gcmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBjb25zdHJ1Y3RvcidzIGJvZHk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBDIGYoKSA9PiB0aHJvdyAwOwogCiBjbGFzcyBDIHsKQEAgLTU5NzksNyArNTk4MCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGlgIGlzIHVzZWQgYmVmb3JlIGl0CiBpcyBkZWNsYXJlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgcHJpbnQoWyFpIV0pOwogICBpbnQgaSA9IDU7CkBAIC01OTkxLDcgKzU5OTIsNyBAQAogSWYgeW91IGludGVuZGVkIHRvIHJlZmVyZW5jZSB0aGUgbG9jYWwgdmFyaWFibGUsIG1vdmUgdGhlIGRlY2xhcmF0aW9uCiBiZWZvcmUgdGhlIGZpcnN0IHJlZmVyZW5jZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgaW50IGkgPSA1OwogICBwcmludChpKTsKQEAgLTYwMDIsNyArNjAwMyw3IEBACiBwYXJhbWV0ZXIsIGluc3RhbmNlIGZpZWxkIG9yIHRvcC1sZXZlbCB2YXJpYWJsZSwgdGhlbiByZW5hbWUgdGhlIGxvY2FsCiBkZWNsYXJhdGlvbiBzbyB0aGF0IGl0IGRvZXNuJ3QgaGlkZSB0aGUgb3V0ZXIgdmFyaWFibGUuCiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGkpIHsKICAgcHJpbnQoaSk7CiAgIGludCB4ID0gNTsKQEAgLTYwMTcsMTYgKzYwMTgsMTYgQEAKICMjIyMgRGVzY3JpcHRpb24KIAogVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGEgZ2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcgotY29udGFpbnMgYSByZXR1cm4gc3RhdGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCitjb250YWlucyBhIGByZXR1cm5gIHN0YXRlbWVudCB0aGF0IHNwZWNpZmllcyBhIHZhbHVlIHRvIGJlIHJldHVybmVkLgogR2VuZXJhdGl2ZSBjb25zdHJ1Y3RvcnMgYWx3YXlzIHJldHVybiB0aGUgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQsIGFuZAogdGhlcmVmb3JlIGNhbid0IHJldHVybiBhIGRpZmZlcmVudCBvYmplY3QuCiAKICMjIyMgRXhhbXBsZQogCi1UaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHJldHVybiBzdGF0ZW1lbnQKK1RoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgYHJldHVybmAgc3RhdGVtZW50CiBoYXMgYW4gZXhwcmVzc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDKCkgewogICAgIHJldHVybiBbIXRoaXMhXTsKQEAgLTYwMzcsOSArNjAzOCw5IEBACiAjIyMjIENvbW1vbiBmaXhlcwogCiBJZiB0aGUgY29uc3RydWN0b3Igc2hvdWxkIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSwgdGhlbiByZW1vdmUgZWl0aGVyIHRoZQotcmV0dXJuIHN0YXRlbWVudCBvciB0aGUgZXhwcmVzc2lvbjoKK2ByZXR1cm5gIHN0YXRlbWVudCBvciB0aGUgZXhwcmVzc2lvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDKCk7CiB9CkBAIC02MDQ4LDcgKzYwNDksNyBAQAogSWYgdGhlIGNvbnN0cnVjdG9yIHNob3VsZG4ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UsIHRoZW4gY29udmVydCBpdCB0byBiZSBhCiBmYWN0b3J5IGNvbnN0cnVjdG9yOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGZhY3RvcnkgQygpIHsKICAgICByZXR1cm4gX2luc3RhbmNlOwpAQCAtNjA4MSw3ICs2MDgyLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZmAgaGFzIGEgcmV0dXJuIHR5cGUKIG9mIGBTdHJpbmdgIGJ1dCBpcyByZXR1cm5pbmcgYW4gYGludGA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBTdHJpbmcgZigpID0+IFshMyFdOwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtNjA5MCwxMyArNjA5MSwxMyBAQAogSWYgdGhlIHJldHVybiB0eXBlIGlzIGNvcnJlY3QsIHRoZW4gcmVwbGFjZSB0aGUgdmFsdWUgYmVpbmcgcmV0dXJuZWQgd2l0aCBhCiB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlLCBwb3NzaWJseSBieSBjb252ZXJ0aW5nIHRoZSBleGlzdGluZyB2YWx1ZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIFN0cmluZyBmKCkgPT4gMy50b1N0cmluZygpOwogeyUgZW5kcHJldHRpZnkgJX0KIAogSWYgdGhlIHZhbHVlIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSByZXR1cm4gdHlwZSB0byBtYXRjaDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKCkgPT4gMzsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTYxMTYsNyArNjExNyw3IEBACiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBgU3RyaW5nYCwgYnV0IHRoZSBjbG9zdXJlIGFzc2lnbmVkIHRvIGl0IHJldHVybnMgYW4KIGBpbnRgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogU3RyaW5nIEZ1bmN0aW9uKFN0cmluZykgZiA9IChzKSA9PiBbITMhXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTYxMjUsNyArNjEyNiw3IEBACiBJZiB0aGUgcmV0dXJuIHR5cGUgaXMgY29ycmVjdCwgdGhlbiByZXBsYWNlIHRoZSByZXR1cm5lZCB2YWx1ZSB3aXRoIGEgdmFsdWUKIG9mIHRoZSBjb3JyZWN0IHR5cGUsIHBvc3NpYmx5IGJ5IGNvbnZlcnRpbmcgdGhlIGV4aXN0aW5nIHZhbHVlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogU3RyaW5nIEZ1bmN0aW9uKFN0cmluZykgZiA9IChzKSA9PiAzLnRvU3RyaW5nKCk7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC02MTM1LDcgKzYxMzYsNyBAQAogCiAjIyMjIERlc2NyaXB0aW9uCiAKLVRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBpdCBmaW5kcyBhIHJldHVybiBzdGF0ZW1lbnQKK1RoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBpdCBmaW5kcyBhIGByZXR1cm5gIHN0YXRlbWVudAogd2l0aG91dCBhbiBleHByZXNzaW9uIGluIGEgZnVuY3Rpb24gdGhhdCBkZWNsYXJlcyBhIHJldHVybiB0eXBlLgogCiAjIyMjIEV4YW1wbGVzCkBAIC02MTQzLDcgKzYxNDQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBmdW5jdGlvbiBgZmAgaXMKIGV4cGVjdGVkIHRvIHJldHVybiBhbiBgaW50YCwgYnV0IG5vIHZhbHVlIGlzIGJlaW5nIHJldHVybmVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGYoKSB7CiAgIFshcmV0dXJuIV07CiB9CkBAIC02MTUzLDcgKzYxNTQsNyBAQAogCiBBZGQgYW4gZXhwcmVzc2lvbiB0aGF0IGNvbXB1dGVzIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKCkgewogICByZXR1cm4gMDsKIH0KQEAgLTYxODUsNyArNjE4Niw3IEBACiBJbiB0aGUgcGFja2FnZSB0aGF0IGhhcyB0aGF0IHB1YnNwZWMsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzIHRoaXMKIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoWyFGdXR1cmUhXSBmKSB7fQogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtNjIwMiw3ICs2MjAzLDcgQEAKIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiBpbXBvcnQgdGhlCiBgZGFydDphc3luY2AgbGlicmFyeS4KIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDphc3luYyc7CiAKIHZvaWQgZihGdXR1cmUgZikge30KQEAgLTYyMTUsMTAgKzYyMTYsMTAgQEAKIAogIyMjIyBEZXNjcmlwdGlvbgogCi1UaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYW4gYXMgZXhwcmVzc2lvbiBpbnNpZGUgYQorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnNpZGUgYQogW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSBpcyBmb3VuZCBpbiBjb2RlIHRoYXQgaGFzIGFuIFNESwotY29uc3RyYWludCB3aG9zZSBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gMi4zLjIuIFVzaW5nIGFuIGFzIGV4cHJlc3Npb24gaW4KLWEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSB3YXNuJ3Qgc3VwcG9ydGVkIGluIGVhcmxpZXIKK2NvbnN0cmFpbnQgd2hvc2UgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIDIuMy4yLiBVc2luZyBhbiBgYXNgIGV4cHJlc3Npb24KK2luIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KSB3YXNuJ3Qgc3VwcG9ydGVkIGluIGVhcmxpZXIKIHZlcnNpb25zLCBzbyB0aGlzIGNvZGUgd29uJ3QgYmUgYWJsZSB0byBydW4gYWdhaW5zdCBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZQogU0RLLgogCkBAIC02MjM1LDcgKzYyMzYsNyBAQAogSW4gdGhlIHBhY2thZ2UgdGhhdCBoYXMgdGhhdCBwdWJzcGVjLCBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZyBwcm9kdWNlcwogdGhpcyBkaWFnbm9zdGljOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgbnVtIG4gPSAzOwogY29uc3QgaW50IGkgPSBbIW4gYXMgaW50IV07CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNjI1MSwxMCArNjI1MiwxMCBAQAogYGBgCiAKIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiBlaXRoZXIgcmV3cml0ZSB0aGUKLWNvZGUgdG8gbm90IHVzZSBhbiBhcyBleHByZXNzaW9uLCBvciBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgYXMKLWV4cHJlc3Npb24gaXMgbm90IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KS46Citjb2RlIHRvIG5vdCB1c2UgYW4gYGFzYCBleHByZXNzaW9uLCBvciBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgYGFzYAorZXhwcmVzc2lvbiBpc24ndCBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBudW0geCA9IDM7CiBpbnQgeSA9IHggYXMgaW50OwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTYyNjYsNyArNjI2Nyw3IEBACiAKICMjIyMgRGVzY3JpcHRpb24KIAotVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFueSB1c2Ugb2YgdGhlIGAmYCwgYHxgIG9yIGBeYAorVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFueSB1c2Ugb2YgdGhlIGAmYCwgYHxgLCBvciBgXmAKIG9wZXJhdG9ycyBvbiB0aGUgY2xhc3MgYGJvb2xgIGluc2lkZSBhCiBbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpIGlzIGZvdW5kIGluIGNvZGUgdGhhdCBoYXMgYW4gU0RLCiBjb25zdHJhaW50IHdob3NlIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiAyLjMuMi4gVXNpbmcgdGhlc2Ugb3BlcmF0b3JzIGluIGEKQEAgLTYyODYsNyArNjI4Nyw3IEBACiBJbiB0aGUgcGFja2FnZSB0aGF0IGhhcyB0aGF0IHB1YnNwZWMsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzIHRoaXMKIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBib29sIGEgPSB0cnVlOwogY29uc3QgYm9vbCBiID0gZmFsc2U7CiBjb25zdCBib29sIGMgPSBhIFshJiFdIGI7CkBAIC02MzA0LDkgKzYzMDUsOSBAQAogCiBJZiB5b3UgbmVlZCB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBTREssIHRoZW4gZWl0aGVyIHJld3JpdGUgdGhlCiBjb2RlIHRvIG5vdCB1c2UgdGhlc2Ugb3BlcmF0b3JzLCBvciBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgZXhwcmVzc2lvbgotaXMgbm90IGluIGEgW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KS46Citpc24ndCBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBib29sIGEgPSB0cnVlOwogY29uc3QgYm9vbCBiID0gZmFsc2U7CiBib29sIGMgPSBhICYgYjsKQEAgLTYzMzksNyArNjM0MCw3IEBACiBJbiB0aGUgcGFja2FnZSB0aGF0IGhhcyB0aGF0IHB1YnNwZWMsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzIHRoaXMKIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHt9CiBjb25zdCBDIGEgPSBudWxsOwogY29uc3QgQyBiID0gbnVsbDsKQEAgLTYzNTgsOSArNjM1OSw5IEBACiAKIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiBlaXRoZXIgcmV3cml0ZSB0aGUKIGNvZGUgdG8gbm90IHVzZSB0aGUgYD09YCBvcGVyYXRvciwgb3IgY2hhbmdlIHRoZSBjb2RlIHNvIHRoYXQgdGhlCi1leHByZXNzaW9uIGlzIG5vdCBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkuOgorZXhwcmVzc2lvbiBpc24ndCBpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHt9CiBjb25zdCBDIGEgPSBudWxsOwogY29uc3QgQyBiID0gbnVsbDsKQEAgLTYzOTMsNyArNjM5NCw3IEBACiBJbiB0aGUgcGFja2FnZSB0aGF0IGhhcyB0aGF0IHB1YnNwZWMsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzCiB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBbIWV4dGVuc2lvbiFdIEUgb24gU3RyaW5nIHsKICAgdm9pZCBzYXlIZWxsbygpIHsKICAgICBwcmludCgnSGVsbG8gJHRoaXMnKTsKQEAgLTY0MTYsNyArNjQxNyw3IEBACiB0aGUgbWVtYmVycyBvZiB0aGUgZXh0ZW5zaW9uIGFzIHRvcC1sZXZlbCBmdW5jdGlvbnMgKG9yIG1ldGhvZHMpIHRoYXQgdGFrZQogdGhlIHZhbHVlIHRoYXQgd291bGQgaGF2ZSBiZWVuIGJvdW5kIHRvIGB0aGlzYCBhcyBhIHBhcmFtZXRlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgc2F5SGVsbG8oU3RyaW5nIHMpIHsKICAgcHJpbnQoJ0hlbGxvICRzJyk7CiB9CkBAIC02NDI5LDEwICs2NDMwLDEwIEBACiAKICMjIyMgRGVzY3JpcHRpb24KIAotVGhlIGFuYWx5emVyIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyB3aGVuIGFuIGlzIGV4cHJlc3Npb24gaW5zaWRlIGEKK1RoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhbiBgaXNgIGV4cHJlc3Npb24gaW5zaWRlIGEKIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkgaXMgZm91bmQgaW4gY29kZSB0aGF0IGhhcyBhbiBTREsKLWNvbnN0cmFpbnQgd2hvc2UgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIDIuMy4yLiBVc2luZyBhbiBpcyBleHByZXNzaW9uIGluCi1hIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkgd2Fzbid0IHN1cHBvcnRlZCBpbiBlYXJsaWVyCitjb25zdHJhaW50IHdob3NlIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiAyLjMuMi4gVXNpbmcgYW4gYGlzYCBleHByZXNzaW9uCitpbiBhIFtjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCkgd2Fzbid0IHN1cHBvcnRlZCBpbiBlYXJsaWVyCiB2ZXJzaW9ucywgc28gdGhpcyBjb2RlIHdvbid0IGJlIGFibGUgdG8gcnVuIGFnYWluc3QgZWFybGllciB2ZXJzaW9ucyBvZiB0aGUKIFNESy4KIApAQCAtNjQ0OSw3ICs2NDUwLDcgQEAKIEluIHRoZSBwYWNrYWdlIHRoYXQgaGFzIHRoYXQgcHVic3BlYywgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmcgcHJvZHVjZXMKIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IHggPSA0OwogY29uc3QgeSA9IFsheCBpcyBpbnQhXSA/IDAgOiAxOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTY0NjUsMTEgKzY0NjYsMTEgQEAKIGBgYAogCiBJZiB5b3UgbmVlZCB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBTREssIHRoZW4gZWl0aGVyIHJld3JpdGUgdGhlCi1jb2RlIHRvIG5vdCB1c2UgdGhlIGlzIG9wZXJhdG9yLCBvciwgaWYgdGhhdCdzIG5vdCBwb3NzaWJsZSwgY2hhbmdlIHRoZQotY29kZSBzbyB0aGF0IHRoZSBpcyBleHByZXNzaW9uIGlzIG5vdCBpbiBhCi1bY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpLjoKK2NvZGUgdG8gbm90IHVzZSB0aGUgYGlzYCBvcGVyYXRvciwgb3IsIGlmIHRoYXQgaXNuJ3QgcG9zc2libGUsIGNoYW5nZSB0aGUKK2NvZGUgc28gdGhhdCB0aGUgYGlzYCBleHByZXNzaW9uIGlzbid0IGluIGEKK1tjb25zdGFudCBjb250ZXh0XSgjY29uc3RhbnQtY29udGV4dCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCB4ID0gNDsKIHZhciB5ID0geCBpcyBpbnQgPyAwIDogMTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC02NDk5LDcgKzY1MDAsNyBAQAogSW4gdGhlIHBhY2thZ2UgdGhhdCBoYXMgdGhhdCBwdWJzcGVjLCBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZyBwcm9kdWNlcyB0aGlzCiBkaWFnbm9zdGljOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIHMgPSBbITxpbnQ+e30hXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTY1MTYsNyArNjUxNyw3IEBACiBJZiB5b3UgZG8gbmVlZCB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBTREssIHRoZW4gcmVwbGFjZSB0aGUgc2V0CiBsaXRlcmFsIHdpdGggY29kZSB0aGF0IGNyZWF0ZXMgdGhlIHNldCB3aXRob3V0IHRoZSB1c2Ugb2YgYSBsaXRlcmFsOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdmFyIHMgPSBuZXcgU2V0PGludD4oKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTY1NDYsNyArNjU0Nyw3IEBACiBJbiB0aGUgcGFja2FnZSB0aGF0IGhhcyB0aGF0IHB1YnNwZWMsIGNvZGUgbGlrZSB0aGUgZm9sbG93aW5nIHByb2R1Y2VzCiB0aGlzIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgZGlnaXRzID0gW1shZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSBpIV1dOwogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtNjU2Myw3ICs2NTY0LDcgQEAKIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFNESywgdGhlbiByZXdyaXRlIHRoZSBjb2RlIHRvCiBub3QgbWFrZSB1c2Ugb2YgdGhvc2UgZWxlbWVudHM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2YXIgZGlnaXRzID0gX2luaXRpYWxpemVEaWdpdHMoKTsKIAogTGlzdDxpbnQ+IF9pbml0aWFsaXplRGlnaXRzKCkgewpAQCAtNjYwMiw3ICs2NjAzLDcgQEAKIEluIHRoZSBwYWNrYWdlIHRoYXQgaGFzIHRoYXQgcHVic3BlYywgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmcgcHJvZHVjZXMKIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IGEgPSBbMSwgMl07CiBjb25zdCBiID0gW1shLi4uYSFdXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC02NjIwLDE1ICs2NjIxLDE1IEBACiBJZiB5b3UgbmVlZCB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBTREssIHRoZW4gcmV3cml0ZSB0aGUgY29kZSB0bwogbm90IG1ha2UgdXNlIG9mIHRob3NlIGVsZW1lbnRzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgYSA9IFsxLCAyXTsKIGNvbnN0IGIgPSBbMSwgMl07CiB7JSBlbmRwcmV0dGlmeSAlfQogCi1JZiB0aGF0J3Mgbm90IHBvc3NpYmxlLCBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgaW4gYQotW2NvbnN0YW50IGNvbnRleHRdKCNjb25zdGFudC1jb250ZXh0KS46CitJZiB0aGF0IGlzbid0IHBvc3NpYmxlLCBjaGFuZ2UgdGhlIGNvZGUgc28gdGhhdCB0aGUgZWxlbWVudCBpc24ndCBpbiBhCitbY29uc3RhbnQgY29udGV4dF0oI2NvbnN0YW50LWNvbnRleHQpOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgYSA9IFsxLCAyXTsKIHZhciBiID0gWy4uLmFdOwogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTY2NDgsNyArNjY0OSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHhgIGlzIGFuIGluc3RhbmNlCiBmaWVsZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzdGF0aWMgaW50IGE7CiAKQEAgLTY2NjMsNyArNjY2NCw3IEBACiBJZiB5b3UgaW50ZW5kIHRvIGFjY2VzcyBhIHN0YXRpYyBmaWVsZCwgdGhlbiBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCiB0byBhbiBleGlzdGluZyBzdGF0aWMgZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgc3RhdGljIGludCBhOwogCkBAIC02Njc2LDcgKzY2NzcsNyBAQAogSWYgeW91IGludGVuZCB0byBhY2Nlc3MgdGhlIGluc3RhbmNlIGZpZWxkLCB0aGVuIHVzZSBhbiBpbnN0YW5jZSBvZiB0aGUKIGNsYXNzIHRvIGFjY2VzcyB0aGUgZmllbGQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgc3RhdGljIGludCBhOwogCkBAIC02NzAyLDcgKzY3MDMsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBzdXBlcmAgY2FuJ3QgYmUgdXNlZAogaW4gYW4gZXh0ZW5zaW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gT2JqZWN0IHsKICAgU3RyaW5nIGdldCBkaXNwbGF5U3RyaW5nID0+IFshc3VwZXIhXS50b1N0cmluZygpOwogfQpAQCAtNjcxMiw3ICs2NzEzLDcgQEAKIAogUmVtb3ZlIHRoZSBgc3VwZXJgIGtleXdvcmQgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gT2JqZWN0IHsKICAgU3RyaW5nIGdldCBkaXNwbGF5U3RyaW5nID0+IHRvU3RyaW5nKCk7CiB9CkBAIC02NzMyLDcgKzY3MzMsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBzdXBlcmAgaXMgdXNlZCBpbiBhCiB0b3AtbGV2ZWwgZnVuY3Rpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7CiAgIFshc3VwZXIhXS5mKCk7CiB9CkBAIC02NzUwLDE1ICs2NzUxLDE1IEBACiAjIyMjIERlc2NyaXB0aW9uCiAKIFRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpbiBhCi1zd2l0Y2ggc3RhdGVtZW50IGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb25zIGluIHRoZQotY2FzZSBjbGF1c2VzLgorYHN3aXRjaGAgc3RhdGVtZW50IGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb25zIGluIHRoZQorYGNhc2VgIGNsYXVzZXMuCiAKICMjIyMgRXhhbXBsZQogCiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIHR5cGUgb2YgYHNgCiAoYFN0cmluZ2ApIGlzbid0IGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgYDBgIChgaW50YCk6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoU3RyaW5nIHMpIHsKICAgc3dpdGNoIChbIXMhXSkgewogICAgIGNhc2UgMDoKQEAgLTY3NjksMTAgKzY3NzAsMTAgQEAKIAogIyMjIyBDb21tb24gZml4ZXMKIAotSWYgdGhlIHR5cGUgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbnMgaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlIGV4cHJlc3Npb24KLWluIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhdmUgdGhlIGNvcnJlY3QgdHlwZToKK0lmIHRoZSB0eXBlIG9mIHRoZSBgY2FzZWAgZXhwcmVzc2lvbnMgaXMgY29ycmVjdCwgdGhlbiBjaGFuZ2UgdGhlCitleHByZXNzaW9uIGluIHRoZSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gaGF2ZSB0aGUgY29ycmVjdCB0eXBlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFN0cmluZyBzKSB7CiAgIHN3aXRjaCAoaW50LnBhcnNlKHMpKSB7CiAgICAgY2FzZSAwOgpAQCAtNjc4MSwxMCArNjc4MiwxMCBAQAogfQogeyUgZW5kcHJldHRpZnkgJX0KIAotSWYgdGhlIHR5cGUgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uIGlzIGNvcnJlY3QsIHRoZW4gY2hhbmdlIHRoZSBjYXNlCitJZiB0aGUgdHlwZSBvZiB0aGUgYHN3aXRjaGAgZXhwcmVzc2lvbiBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgYGNhc2VgCiBleHByZXNzaW9ucyB0byBoYXZlIHRoZSBjb3JyZWN0IHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoU3RyaW5nIHMpIHsKICAgc3dpdGNoIChzKSB7CiAgICAgY2FzZSAnMCc6CkBAIC02ODAwLDcgKzY4MDEsNyBAQAogIyMjIyBEZXNjcmlwdGlvbgogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gaW4gYQotdGhyb3cgZXhwcmVzc2lvbiBpcyBub3QgYXNzaWduYWJsZSB0byBgT2JqZWN0YC4gSXTigJlzIG5vdCB2YWxpZCB0byB0aHJvdwordGhyb3cgZXhwcmVzc2lvbiBpc24ndCBhc3NpZ25hYmxlIHRvIGBPYmplY3RgLiBJdCBpc24ndCB2YWxpZCB0byB0aHJvdwogYG51bGxgLCBzbyBpdCBpc24ndCB2YWxpZCB0byB1c2UgYW4gZXhwcmVzc2lvbiB0aGF0IG1pZ2h0IGV2YWx1YXRlIHRvCiBgbnVsbGAuCiAKQEAgLTY4MDgsNyArNjgwOSw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgc2AgbWlnaHQgYmUgYG51bGxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFN0cmluZz8gcykgewogICB0aHJvdyBbIXMhXTsKIH0KQEAgLTY4MTgsNyArNjgxOSw3IEBACiAKIEFkZCBhbiBleHBsaWNpdCBudWxsIGNoZWNrIHRvIHRoZSBleHByZXNzaW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFN0cmluZz8gcykgewogICB0aHJvdyBzITsKIH0KQEAgLTY4MzgsNyArNjgzOSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYFN0cmluZ2AgaXNuJ3QgYQogc3ViY2xhc3Mgb2YgYG51bWA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBPEUgZXh0ZW5kcyBudW0+IHt9CiAKIHZhciBhID0gQTxbIVN0cmluZyFdPigpOwpAQCAtNjg0OCw3ICs2ODQ5LDcgQEAKIAogQ2hhbmdlIHRoZSB0eXBlIGFyZ3VtZW50IHRvIGJlIGEgc3ViY2xhc3Mgb2YgdGhlIGJvdW5kczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEE8RSBleHRlbmRzIG51bT4ge30KIAogdmFyIGEgPSBBPGludD4oKTsKQEAgLTY4NjgsNyArNjg2OSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIG5hbWUgYFNydGluZ2AgaXNuJ3QKIGRlZmluZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoT2JqZWN0IG8pIHsKICAgaWYgKG8gaXMgWyFTcnRpbmchXSkgewogICAgIC8vIC4uLgpAQCAtNjg4MCw3ICs2ODgxLDcgQEAKIAogUmVwbGFjZSB0aGUgbmFtZSB3aXRoIHRoZSBuYW1lIG9mIGEgdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihPYmplY3QgbykgewogICBpZiAobyBpcyBTdHJpbmcpIHsKICAgICAvLyAuLi4KQEAgLTY5MDQsNyArNjkwNSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYHNgIGNhbiBiZSBgbnVsbGAgYXQKIHRoZSBwb2ludCB3aGVyZSBpdCdzIHJlZmVyZW5jZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoU3RyaW5nPyBzKSB7CiAgIGlmIChbIXMhXS5sZW5ndGggPiAzKSB7CiAgICAgLy8gLi4uCkBAIC02OTE3LDcgKzY5MTgsNyBAQAogSWYgdGhlIHZhbHVlIHJlYWxseSBjYW4gYmUgYG51bGxgLCB0aGVuIGFkZCBhIHRlc3QgdG8gZW5zdXJlIHRoYXQgbWVtYmVycwogYXJlIG9ubHkgYWNjZXNzZWQgd2hlbiB0aGUgdmFsdWUgaXNuJ3QgYG51bGxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKFN0cmluZz8gcykgewogICBpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoID4gMykgewogICAgIC8vIC4uLgpAQCAtNjkyOCw3ICs2OTI5LDcgQEAKIElmIHRoZSBleHByZXNzaW9uIGlzIGEgdmFyaWFibGUgYW5kIHRoZSB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgYG51bGxgLCB0aGVuCiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIG5vbi1udWxsYWJsZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihTdHJpbmcgcykgewogICBpZiAocy5sZW5ndGggPiAzKSB7CiAgICAgLy8gLi4uCkBAIC02OTQxLDcgKzY5NDIsNyBAQAogaGF2aW5nIGFuIGV4Y2VwdGlvbiB0aHJvd24gYXQgcnVudGltZSBpZiB5b3UncmUgd3JvbmcsIHRoZW4geW91IGNhbiBhc3NlcnQKIHRoYXQgdGhlIHZhbHVlIGlzbid0IG51bGw6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoU3RyaW5nPyBzKSB7CiAgIGlmIChzIS5sZW5ndGggPiAzKSB7CiAgICAgLy8gLi4uCkBAIC02OTYzLDcgKzY5NjQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBuYW1lIGB1bmRlZmluZWRgCiBpc24ndCBkZWZpbmVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogWyFAdW5kZWZpbmVkIV0KIHZvaWQgZigpIHt9CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtNjk3Myw3ICs2OTc0LDcgQEAKIElmIHRoZSBuYW1lIGlzIGNvcnJlY3QsIGJ1dCBpdCBpc27igJl0IGRlY2xhcmVkIHlldCwgdGhlbiBkZWNsYXJlIHRoZSBuYW1lIGFzCiBhIGNvbnN0YW50IHZhbHVlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgdW5kZWZpbmVkID0gJ3VuZGVmaW5lZCc7CiAKIEB1bmRlZmluZWQKQEAgLTY5ODIsNyArNjk4Myw3IEBACiAKIElmIHRoZSBuYW1lIGlzIHdyb25nLCByZXBsYWNlIHRoZSBuYW1lIHdpdGggdGhlIG5hbWUgb2YgYSB2YWxpZCBjb25zdGFudDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIEBkZXByZWNhdGVkCiB2b2lkIGYoKSB7fQogeyUgZW5kcHJldHRpZnkgJX0KQEAgLTcwMDMsNyArNzAwNCw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgUGlvbnRgIGlzbid0IGRlZmluZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBQb2ludCB7fQogCiB2b2lkIGYoWyFQaW9udCFdIHApIHt9CkBAIC03MDE1LDcgKzcwMTYsNyBAQAogdGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGlzIGRlZmluZWQuIFRoZSBleGFtcGxlIGFib3ZlIGNhbiBiZSBjb3JyZWN0ZWQgYnkKIGZpeGluZyB0aGUgc3BlbGxpbmcgb2YgdGhlIGNsYXNzOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgUG9pbnQge30KIAogdm9pZCBmKFBvaW50IHApIHt9CkBAIC03MDQxLDcgKzcwNDIsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBBYCBkb2Vzbid0IGhhdmUgYW4KIHVubmFtZWQgY29uc3RydWN0b3I6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgQS5uKCk7CiB9CkBAIC03MDUzLDcgKzcwNTQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBBYCBkb2Vzbid0IGhhdmUgYQogY29uc3RydWN0b3IgbmFtZWQgYG1gOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQSB7CiAgIEEubigpOwogfQpAQCAtNzA2Nyw3ICs3MDY4LDcgQEAKIElmIHRoZSBzdXBlcmNsYXNzIGRlZmluZXMgYSBjb25zdHJ1Y3RvciB0aGF0IHNob3VsZCBiZSBpbnZva2VkLCB0aGVuIGNoYW5nZQogdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGludm9rZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBBIHsKICAgQS5uKCk7CiB9CkBAIC03MDc5LDcgKzcwODAsNyBAQAogSWYgdGhlIHN1cGVyY2xhc3MgZG9lc24ndCBkZWZpbmUgYW4gYXBwcm9wcmlhdGUgY29uc3RydWN0b3IsIHRoZW4gZGVmaW5lCiB0aGUgY29uc3RydWN0b3IgYmVpbmcgaW52b2tlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEEgewogICBBLm0oKTsKICAgQS5uKCk7CkBAIC03MTA0LDcgKzcxMDUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBFYCBkb2Vzbid0IGRlZmluZSBhCiBjb25zdGFudCBuYW1lZCBgY2A6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBlbnVtIEUge2EsIGJ9CiAKIHZhciBlID0gRS5bIWMhXTsKQEAgLTcxMTUsNyArNzExNiw3IEBACiBJZiB0aGUgY29uc3RhbnQgc2hvdWxkIGJlIGRlZmluZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUKIGVudW06CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBlbnVtIEUge2EsIGIsIGN9CiAKIHZhciBlID0gRS5jOwpAQCAtNzEyNCw3ICs3MTI1LDcgQEAKIElmIHRoZSBjb25zdGFudCBzaG91bGRuJ3QgYmUgZGVmaW5lZCwgdGhlbiBjaGFuZ2UgdGhlIG5hbWUgdG8gdGhlIG5hbWUgb2YKIGFuIGV4aXN0aW5nIGNvbnN0YW50OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZW51bSBFIHthLCBifQogCiB2YXIgZSA9IEUuYjsKQEAgLTcxNDYsNyArNzE0Nyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGV4dGVuc2lvbiBgRWAKIGRvZXNuJ3QgZGVjbGFyZSBhbiBpbnN0YW5jZSBnZXR0ZXIgbmFtZWQgYGJgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgU3RyaW5nIGdldCBhID0+ICdhJzsKIH0KQEAgLTcxNjMsNyArNzE2NCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGV4dGVuc2lvbiBgRWAKIGRvZXNuJ3QgZGVjbGFyZSBhIHN0YXRpYyBnZXR0ZXIgbmFtZWQgYGFgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHt9CiAKIHZhciB4ID0gRS5bIWEhXTsKQEAgLTcxNzQsNyArNzE3NSw3IEBACiBJZiB0aGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGlzIGluY29ycmVjdCwgdGhlbiBjaGFuZ2UgaXQgdG8gdGhlIG5hbWUgb2YgYW4KIGV4aXN0aW5nIGdldHRlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBnZXQgYSA9PiAnYSc7CiB9CkBAIC03MTkxLDcgKzcxOTIsNyBAQAogSWYgdGhlIG5hbWUgb2YgdGhlIGdldHRlciBpcyBjb3JyZWN0IGJ1dCB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGlzCiB3cm9uZywgdGhlbiBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB0aGUgY29ycmVjdCBuYW1lOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgU3RyaW5nIGdldCBhID0+ICdhJzsKIH0KQEAgLTcyMDgsNyArNzIwOSw3IEBACiBJZiB0aGUgbmFtZSBvZiB0aGUgZ2V0dGVyIGFuZCBleHRlbnNpb24gYXJlIGJvdGggY29ycmVjdCwgYnV0IHRoZSBnZXR0ZXIKIGlzbid0IGRlZmluZWQsIHRoZW4gZGVmaW5lIHRoZSBnZXR0ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBTdHJpbmcgZ2V0IGEgPT4gJ2EnOwogICBTdHJpbmcgZ2V0IGIgPT4gJ3onOwpAQCAtNzIzOSw3ICs3MjQwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgZXh0ZW5zaW9uIGBFYAogZG9lc24ndCBkZWNsYXJlIGFuIGluc3RhbmNlIG1ldGhvZCBuYW1lZCBgYmA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBTdHJpbmcgYSgpID0+ICdhJzsKIH0KQEAgLTcyNTYsNyArNzI1Nyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGV4dGVuc2lvbiBgRWAKIGRvZXNuJ3QgZGVjbGFyZSBhIHN0YXRpYyBtZXRob2QgbmFtZWQgYGFgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHt9CiAKIHZhciB4ID0gRS5bIWEhXSgpOwpAQCAtNzI2Nyw3ICs3MjY4LDcgQEAKIElmIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaXMgaW5jb3JyZWN0LCB0aGVuIGNoYW5nZSBpdCB0byB0aGUgbmFtZSBvZiBhbgogZXhpc3RpbmcgbWV0aG9kOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgU3RyaW5nIGEoKSA9PiAnYSc7CiB9CkBAIC03Mjg0LDcgKzcyODUsNyBAQAogSWYgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpcyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpcwogd3JvbmcsIHRoZW4gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdGhlIGNvcnJlY3QgbmFtZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBhKCkgPT4gJ2EnOwogfQpAQCAtNzMwMSw3ICs3MzAyLDcgQEAKIElmIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYW5kIGV4dGVuc2lvbiBhcmUgYm90aCBjb3JyZWN0LCBidXQgdGhlIG1ldGhvZAogaXNuJ3QgZGVmaW5lZCwgdGhlbiBkZWZpbmUgdGhlIG1ldGhvZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7CiAgIFN0cmluZyBhKCkgPT4gJ2EnOwogICBTdHJpbmcgYigpID0+ICd6JzsKQEAgLTczMzIsNyArNzMzMyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgdGhlIGV4dGVuc2lvbiBgRWAKIGRvZXNuJ3QgZGVjbGFyZSBhbiBpbnN0YW5jZSBzZXR0ZXIgbmFtZWQgYGJgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgc2V0IGEoU3RyaW5nIHYpIHt9CiB9CkBAIC03MzQ5LDcgKzczNTAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBleHRlbnNpb24gYEVgCiBkb2Vzbid0IGRlY2xhcmUgYSBzdGF0aWMgc2V0dGVyIG5hbWVkIGBhYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGV4dGVuc2lvbiBFIG9uIFN0cmluZyB7fQogCiB2b2lkIGYoKSB7CkBAIC03MzYyLDcgKzczNjMsNyBAQAogSWYgdGhlIG5hbWUgb2YgdGhlIHNldHRlciBpcyBpbmNvcnJlY3QsIHRoZW4gY2hhbmdlIGl0IHRvIHRoZSBuYW1lIG9mIGFuCiBleGlzdGluZyBzZXR0ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBleHRlbnNpb24gRSBvbiBTdHJpbmcgewogICBzZXQgYShTdHJpbmcgdikge30KIH0KQEAgLTczNzksNyArNzM4MCw3IEBACiBJZiB0aGUgbmFtZSBvZiB0aGUgc2V0dGVyIGlzIGNvcnJlY3QsIGJ1dCB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGlzCiB3cm9uZywgdGhlbiBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB0aGUgY29ycmVjdCBuYW1lOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgc2V0IGEoU3RyaW5nIHYpIHt9CiB9CkBAIC03Mzk2LDcgKzczOTcsNyBAQAogSWYgdGhlIG5hbWUgb2YgdGhlIHNldHRlciBhbmQgZXh0ZW5zaW9uIGFyZSBib3RoIGNvcnJlY3QsIGJ1dCB0aGUgc2V0dGVyCiBpc24ndCBkZWZpbmVkLCB0aGVuIGRlZmluZSB0aGUgc2V0dGVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIHsKICAgc2V0IGEoU3RyaW5nIHYpIHt9CiAgIHNldCBiKFN0cmluZyB2KSB7fQpAQCAtNzQyNiw3ICs3NDI3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgbmFtZSBgZW10eWAgaXNuJ3QKIGRlZmluZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBMaXN0PGludD4gZW1wdHkoKSA9PiBbXTsKIAogdm9pZCBtYWluKCkgewpAQCAtNzQ0MCw3ICs3NDQxLDcgQEAKIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBpcyBkZWZpbmVkLiBUaGUgZXhhbXBsZSBhYm92ZSBjYW4gYmUgY29ycmVjdGVkCiBieSBmaXhpbmcgdGhlIHNwZWxsaW5nIG9mIHRoZSBmdW5jdGlvbjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIExpc3Q8aW50PiBlbXB0eSgpID0+IFtdOwogCiB2b2lkIG1haW4oKSB7CkBAIC03NDY2LDcgKzc0NjcsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBTdHJpbmdgIGhhcyBubyBtZW1iZXIKIG5hbWVkIGBsZW5gOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGYoU3RyaW5nIHMpID0+IHMuWyFsZW4hXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc0NzYsNyArNzQ3Nyw3IEBACiB0aGUgbmFtZSBvZiBhIGdldHRlciB0aGF0IGlzIGRlZmluZWQuIFRoZSBleGFtcGxlIGFib3ZlIGNhbiBiZSBjb3JyZWN0ZWQgYnkKIGZpeGluZyB0aGUgc3BlbGxpbmcgb2YgdGhlIGdldHRlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKFN0cmluZyBzKSA9PiBzLmxlbmd0aDsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc0OTQsNyArNzQ5NSw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGRhcnQ6bWF0aGAgZG9lc24ndAogZGVmaW5lIHRoZSBuYW1lIGBTdHJpbmdgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdkYXJ0Om1hdGgnIGhpZGUgWyFTdHJpbmchXSwgbWF4OwogCiB2YXIgeCA9IG1pbigwLCAxKTsKQEAgLTc1MDUsNyArNzUwNiw3IEBACiBJZiBhIGRpZmZlcmVudCBuYW1lIHNob3VsZCBiZSBoaWRkZW4sIHRoZW4gY29ycmVjdCB0aGUgbmFtZS4gT3RoZXJ3aXNlLAogcmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIGxpc3Q6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ2RhcnQ6bWF0aCcgaGlkZSBtYXg7CiAKIHZhciB4ID0gbWluKDAsIDEpOwpAQCAtNzUyNiw3ICs3NTI3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgbmFtZSBgcmloZ3RgIGlzbid0CiBkZWZpbmVkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IG1pbihpbnQgbGVmdCwgaW50IHJpZ2h0KSA9PiBsZWZ0IDw9IFshcmloZ3QhXSA/IGxlZnQgOiByaWdodDsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc1MzYsNyArNzUzNyw3IEBACiBhbiBpZGVudGlmaWVyIHRoYXQgaXMgZGVmaW5lZC4gVGhlIGV4YW1wbGUgYWJvdmUgY2FuIGJlIGNvcnJlY3RlZCBieQogZml4aW5nIHRoZSBzcGVsbGluZyBvZiB0aGUgdmFyaWFibGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbnQgbWluKGludCBsZWZ0LCBpbnQgcmlnaHQpID0+IGxlZnQgPD0gcmlnaHQgPyBsZWZ0IDogcmlnaHQ7CiB7JSBlbmRwcmV0dGlmeSAlfQogCkBAIC03NTYwLDcgKzc1NjEsNyBAQAogdXNlZCBpbiB0aGUgYm9keSBvZiBgZmAgZXZlbiB0aG91Z2ggdGhlIGJvZHkgb2YgYGZgIGlzbid0IG1hcmtlZCB3aXRoIHRoZQogYGFzeW5jYCBrZXl3b3JkOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKHApIHsgWyFhd2FpdCFdIHA7IH0KIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc1NjgsNyArNzU2OSw3IEBACiAKIEFkZCB0aGUga2V5d29yZCBgYXN5bmNgIHRvIHRoZSBmdW5jdGlvbiBib2R5OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKHApIGFzeW5jIHsgYXdhaXQgcDsgfQogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtNzU4Nyw3ICs3NTg4LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgaWRlbnRpZmllcgogYHJlbW92ZU1pZGRsZWAgaXNuJ3QgZGVmaW5lZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKExpc3Q8aW50PiBsKSA9PiBsLlshcmVtb3ZlTWlkZGxlIV0oKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc1OTcsNyArNzU5OCw3IEBACiB0aGUgbmFtZSBvZiBhIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQuIFRoZSBleGFtcGxlIGFib3ZlIGNhbiBiZSBjb3JyZWN0ZWQgYnkKIGZpeGluZyB0aGUgc3BlbGxpbmcgb2YgdGhlIG1ldGhvZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKExpc3Q8aW50PiBsKSA9PiBsLnJlbW92ZUxhc3QoKTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTc2MTYsNyArNzYxNyw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYG1gIGRvZXNuJ3QgZGVjbGFyZSBhCiBuYW1lZCBwYXJhbWV0ZXIgbmFtZWQgYGFgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIG0oe2ludCBifSkge30KIH0KQEAgLTc2MzEsNyArNzYzMiw3IEBACiBJZiB0aGUgYXJndW1lbnQgbmFtZSBpcyBtaXN0eXBlZCwgdGhlbiByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlY3QgbmFtZS4KIFRoZSBleGFtcGxlIGFib3ZlIGNhbiBiZSBmaXhlZCBieSBjaGFuZ2luZyBgYWAgdG8gYGJgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIG0oe2ludCBifSkge30KIH0KQEAgLTc2NDQsNyArNzY0NSw3IEBACiBJZiBhIHN1YmNsYXNzIGFkZHMgYSBwYXJhbWV0ZXIgd2l0aCB0aGUgbmFtZSBpbiBxdWVzdGlvbiwgdGhlbiBjYXN0IHRoZQogdGFyZ2V0IHRvIHRoZSBzdWJjbGFzczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBtKHtpbnQgYn0pIHt9CiB9CkBAIC03NjYwLDcgKzc2NjEsNyBAQAogCiBJZiB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZnVuY3Rpb24sIHRoZW4gYWRkIGl0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIG0oe2ludCBhLCBpbnQgYn0pIHt9CiB9CkBAIC03Njg0LDcgKzc2ODUsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBjbGFzcyBgQ2AgZG9lc24ndAogZGVmaW5lIHRoZSBvcGVyYXRvciBgK2A6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHt9CiAKIEMgZihDIGMpID0+IGMgWyErIV0gMjsKQEAgLTc2OTQsNyArNzY5NSw3IEBACiAKIElmIHRoZSBvcGVyYXRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGNsYXNzLCB0aGVuIGRlZmluZSBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBDIG9wZXJhdG9yICsoaW50IGkpID0+IHRoaXM7CiB9CkBAIC03NzE4LDcgKzc3MTksNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBkYXJ0OmNvcmVgIGRvZXNuJ3QKIGRlZmluZSBhbnl0aGluZyBuYW1lZCBgYWA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgJ2RhcnQ6Y29yZScgYXMgcDsKIAogdm9pZCBmKCkgewpAQCAtNzc0OSw3ICs3NzUwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGVyZSBpc24ndCBhIHNldHRlcgogbmFtZWQgYHpgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCB4ID0gMDsKICAgdm9pZCBtKGludCB5KSB7CkBAIC03NzY0LDcgKzc3NjUsNyBAQAogdGhlIG5hbWUgb2YgYSBzZXR0ZXIgdGhhdCBpcyBkZWZpbmVkLiBUaGUgZXhhbXBsZSBhYm92ZSBjYW4gYmUgY29ycmVjdGVkIGJ5CiBmaXhpbmcgdGhlIHNwZWxsaW5nIG9mIHRoZSBzZXR0ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgaW50IHggPSAwOwogICB2b2lkIG0oaW50IHkpIHsKQEAgLTc3ODcsNyArNzc4OCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGRhcnQ6bWF0aGAgZG9lc24ndAogZGVmaW5lIHRoZSBuYW1lIGBTdHJpbmdgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0ICdkYXJ0Om1hdGgnIHNob3cgbWluLCBbIVN0cmluZyFdOwogCiB2YXIgeCA9IG1pbigwLCAxKTsKQEAgLTc3OTgsNyArNzc5OSw3IEBACiBJZiBhIGRpZmZlcmVudCBuYW1lIHNob3VsZCBiZSBzaG93biwgdGhlbiBjb3JyZWN0IHRoZSBuYW1lLiBPdGhlcndpc2UsCiByZW1vdmUgdGhlIG5hbWUgZnJvbSB0aGUgbGlzdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDptYXRoJyBzaG93IG1pbjsKIAogdmFyIHggPSBtaW4oMCwgMSk7CkBAIC03ODE5LDcgKzc4MjAsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBPYmplY3RgIGRvZXNuJ3QgZGVmaW5lCiBhIG1lbWJlciBuYW1lZCBgbmA6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgdm9pZCBtKCkgewogICAgIHN1cGVyLlshbiFdKCk7CkBAIC03ODUyLDcgKzc4NTMsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBuYCBpcyBhbHJlYWR5IGtub3duIHRvCiBiZSBhbiBgaW50YCBhcyBhIHJlc3VsdCBvZiB0aGUgYGlzYCB0ZXN0OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKG51bSBuKSB7CiAgIGlmIChuIGlzIGludCkgewogICAgIChbIW4gYXMgaW50IV0pLmlzRXZlbjsKQEAgLTc4NjQsNyArNzg2NSw3IEBACiAKIFJlbW92ZSB0aGUgdW5uZWNlc3NhcnkgY2FzdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihudW0gbikgewogICBpZiAobiBpcyBpbnQpIHsKICAgICBuLmlzRXZlbjsKQEAgLTc4ODUsNyArNzg4Niw3IEBACiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgY2FuJ3QgYmUgYG51bGxgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW50IGYoaW50IHgpIHsKICAgcmV0dXJuIHhbISEhXTsKIH0KQEAgLTc4OTUsNyArNzg5Niw3IEBACiAKIFJlbW92ZSB0aGUgbnVsbCBjaGVjayBvcGVyYXRvciAoYCFgKToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGludCBmKGludCB4KSB7CiAgIHJldHVybiB4OwogfQpAQCAtNzkxOSw3ICs3OTIwLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgeGAgY2FuIG5ldmVyIGJlCiBgbnVsbGAsIHNvIHRoZSBjb21wYXJpc29uIGFsd2F5cyBldmFsdWF0ZXMgdG8gYHRydWVgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKGludCB4KSB7CiAgIGlmICh4IFshIT0gbnVsbCFdKSB7CiAgICAgcHJpbnQoeCk7CkBAIC03OTMwLDcgKzc5MzEsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGB4YCBjYW4gbmV2ZXIgYmUKIGBudWxsYCwgc28gdGhlIGNvbXBhcmlzb24gYWx3YXlzIGV2YWx1YXRlcyB0byBgZmFsc2VgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKGludCB4KSB7CiAgIGlmICh4IFshPT0gbnVsbCFdKSB7CiAgICAgdGhyb3cgQXJndW1lbnRFcnJvcigieCBjYW4ndCBiZSBudWxsIik7CkBAIC03OTQzLDcgKzc5NDQsNyBAQAogSWYgdGhlIG90aGVyIG9wZXJhbmQgc2hvdWxkIGJlIGFibGUgdG8gYmUgYG51bGxgLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZgogdGhlIG9wZXJhbmQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50PyB4KSB7CiAgIGlmICh4ICE9IG51bGwpIHsKICAgICBwcmludCh4KTsKQEAgLTc5NTMsNyArNzk1NCw3IEBACiAKIElmIHRoZSBvdGhlciBvcGVyYW5kIHJlYWxseSBjYW4ndCBiZSBgbnVsbGAsIHRoZW4gcmVtb3ZlIHRoZSBjb25kaXRpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IHgpIHsKICAgcHJpbnQoeCk7CiB9CkBAIC03OTc1LDcgKzc5NzYsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBtYCBpcyBhIHN0YXRpYyBtZW1iZXIKIG9mIHRoZSBleHRlbmRlZCB0eXBlIGBDYDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzdGF0aWMgdm9pZCBtKCkge30KIH0KQEAgLTc5OTMsNyArNzk5NCw3IEBACiBleHRlbnNpb24sIHRoZW4gYWRkIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciBleHRlbnNpb24gYmVmb3JlIHRoZSByZWZlcmVuY2UKIHRvIHRoZSBtZW1iZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgc3RhdGljIHZvaWQgbSgpIHt9CiB9CkBAIC04MDA3LDcgKzgwMDgsNyBAQAogCiBJZiB5b3UncmUgcmVmZXJlbmNpbmcgYSBtZW1iZXIgdGhhdCBpc24ndCBkZWNsYXJlZCB5ZXQsIGFkZCBhIGRlY2xhcmF0aW9uOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIHN0YXRpYyB2b2lkIG0oKSB7fQogfQpAQCAtODAyNywxNSArODAyOCwxNSBAQAogCiAjIyMjIERlc2NyaXB0aW9uCiAKLVRoZSBhbmFseXplciBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgd2hlbiBhIGNhdGNoIGNsYXVzZSBpcyBmb3VuZCwgYW5kCitUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gYSBgY2F0Y2hgIGNsYXVzZSBpcyBmb3VuZCwgYW5kCiBuZWl0aGVyIHRoZSBleGNlcHRpb24gcGFyYW1ldGVyIG5vciB0aGUgb3B0aW9uYWwgc3RhY2sgdHJhY2UgcGFyYW1ldGVyIGFyZQotdXNlZCBpbiB0aGUgY2F0Y2ggYmxvY2suCit1c2VkIGluIHRoZSBgY2F0Y2hgIGJsb2NrLgogCiAjIyMjIEV4YW1wbGVzCiAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgZWAgaXNuJ3QgcmVmZXJlbmNlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgICBpbnQucGFyc2UoJzsnKTsKQEAgLTgwNDcsOSArODA0OCw5IEBACiAKICMjIyMgQ29tbW9uIGZpeGVzCiAKLVJlbW92ZSB0aGUgdW51c2VkIGNhdGNoIGNsYXVzZToKK1JlbW92ZSB0aGUgdW51c2VkIGBjYXRjaGAgY2xhdXNlOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogdm9pZCBmKCkgewogICB0cnkgewogICAgIGludC5wYXJzZSgnOycpOwpAQCAtODA2NiwxNCArODA2NywxNCBAQAogIyMjIyBEZXNjcmlwdGlvbgogCiBUaGUgYW5hbHl6ZXIgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIHdoZW4gdGhlIHN0YWNrIHRyYWNlIHBhcmFtZXRlciBpbiBhCi1jYXRjaCBjbGF1c2UgaXNuJ3QgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGNhdGNoIGJsb2NrLgorYGNhdGNoYCBjbGF1c2UgaXNuJ3QgcmVmZXJlbmNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGBjYXRjaGAgYmxvY2suCiAKICMjIyMgRXhhbXBsZXMKIAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIGBzdGFja1RyYWNlYCBpc24ndAogcmVmZXJlbmNlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgICAvLyAuLi4KQEAgLTgwODgsNyArODA4OSw3IEBACiBJZiB5b3UgbmVlZCB0byByZWZlcmVuY2UgdGhlIHN0YWNrIHRyYWNlIHBhcmFtZXRlciwgdGhlbiBhZGQgYSByZWZlcmVuY2UgdG8KIGl0LiBPdGhlcndpc2UsIHJlbW92ZSBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZigpIHsKICAgdHJ5IHsKICAgICAvLyAuLi4KQEAgLTgxMTMsNyArODExNCw3IEBACiBBc3N1bWluZyB0aGF0IG5vIGNvZGUgaW4gdGhlIGxpYnJhcnkgcmVmZXJlbmNlcyBgX0NgLCB0aGUgZm9sbG93aW5nIGNvZGUKIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIFshX0MhXSB7fQogeyUgZW5kcHJldHRpZnkgJX0KIApAQCAtODEzNyw3ICs4MTM4LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBgX3hgIGlzbid0IHJlZmVyZW5jZWQKIGFueXdoZXJlIGluIHRoZSBsaWJyYXJ5OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgUG9pbnQgewogICBpbnQgWyFfeCFdOwogfQpAQCAtODE2NCw3ICs4MTY1LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSBub3RoaW5nIGRlZmluZWQgaW4KIGBkYXJ0OmFzeW5jYCBpcyByZWZlcmVuY2VkIGluIHRoZSBsaWJyYXJ5OgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogaW1wb3J0IFshJ2RhcnQ6YXN5bmMnIV07CiAKIHZvaWQgbWFpbigpIHt9CkBAIC04MTkxLDcgKzgxOTIsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBsYWJlbCBgbG9vcGAgaXNuJ3QKIHJlZmVyZW5jZWQgYW55d2hlcmUgaW4gdGhlIG1ldGhvZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgZihpbnQgbGltaXQpIHsKICAgWyFsb29wOiFdIGZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewogICAgIHByaW50KGkpOwpAQCAtODIwMyw3ICs4MjA0LDcgQEAKIAogSWYgdGhlIGxhYmVsIGlzbid0IG5lZWRlZCwgdGhlbiByZW1vdmUgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGxpbWl0KSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewogICAgIHByaW50KGkpOwpAQCAtODIxMyw3ICs4MjE0LDcgQEAKIAogSWYgdGhlIGxhYmVsIGlzIG5lZWRlZCwgdGhlbiB1c2UgaXQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoaW50IGxpbWl0KSB7CiAgIGxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewogICAgIHByaW50KGkpOwpAQCAtODIzNiw3ICs4MjM3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgYGNvdW50YCBpcwogbmV2ZXIgcmVhZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIHZvaWQgbWFpbigpIHsKICAgaW50IFshY291bnQhXSA9IDA7CiB9CkBAIC04MjYzLDcgKzgyNjQsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBmdW5jdGlvbiBgbWF4YAogaXNuJ3QgdXNlZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDptYXRoJyBzaG93IG1pbiwgWyFtYXghXTsKIAogdmFyIHggPSBtaW4oMCwgMSk7CkBAIC04MjczLDcgKzgyNzQsNyBAQAogCiBFaXRoZXIgdXNlIHRoZSBuYW1lIG9yIHJlbW92ZSBpdDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCAnZGFydDptYXRoJyBzaG93IG1pbjsKIAogdmFyIHggPSBtaW4oMCwgMSk7CkBAIC04MjkzLDcgKzgyOTQsNyBAQAogSWYgdGhlIGZpbGUgYGxpYi5kYXJ0YCBkb2Vzbid0IGV4aXN0LCB0aGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcwogZGlhZ25vc3RpYzoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGltcG9ydCBbISdsaWIuZGFydCchXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTgzMjUsNyArODMyNiw3IEBACiBJZiB0aGUgZmlsZSBgbGliLmcuZGFydGAgZG9lc24ndCBleGlzdCwgdGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMKIGRpYWdub3N0aWM6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBpbXBvcnQgWyEnbGliLmcuZGFydCchXTsKIHslIGVuZHByZXR0aWZ5ICV9CiAKQEAgLTgzNTMsNyArODM1NCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYGZgIGRvZXNuJ3QgcHJvZHVjZSBhbgogb2JqZWN0IG9uIHdoaWNoIGB0b1N0cmluZ2AgY2FuIGJlIGludm9rZWQ6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiB2b2lkIGYoKSB7fQogCiB2b2lkIGcoKSB7CkBAIC04MzgwLDcgKzgzODEsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSB2YWx1ZSBvZiBgeGAgaXMgYW4KIGBpbnRgLCB3aGljaCBjYW4ndCBiZSBhc3NpZ25lZCB0byBgeWAgYmVjYXVzZSBhbiBgaW50YCBpc24ndCBhIGBTdHJpbmdgOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY29uc3QgT2JqZWN0IHggPSAwOwogY29uc3QgU3RyaW5nIHkgPSBbIXghXTsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC04MzkwLDcgKzgzOTEsNyBAQAogSWYgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBjb25zdGFudCBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgdmFsdWUgYmVpbmcKIGFzc2lnbmVkIHRvIGJlIG9mIHRoZSBjb3JyZWN0IHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjb25zdCBPYmplY3QgeCA9IDA7CiBjb25zdCBTdHJpbmcgeSA9ICckeCc7CiB7JSBlbmRwcmV0dGlmeSAlfQpAQCAtODM5OCw3ICs4Mzk5LDcgQEAKIElmIHRoZSBhc3NpZ25lZCB2YWx1ZSBpcyBjb3JyZWN0LCB0aGVuIGNoYW5nZSB0aGUgZGVjbGFyYXRpb24gdG8gaGF2ZSB0aGUKIGNvcnJlY3QgdHlwZToKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNvbnN0IE9iamVjdCB4ID0gMDsKIGNvbnN0IGludCB5ID0geDsKIHslIGVuZHByZXR0aWZ5ICV9CkBAIC04NDE3LDcgKzg0MTgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBvcGVyYXRvciBgK2AgbXVzdAogaGF2ZSBhIHNpbmdsZSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcmlnaHQgb3BlcmFuZDoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBpbnQgb3BlcmF0b3IgWyErIV0oYSwgYikgPT4gMDsKIH0KQEAgLTg0MjcsNyArODQyOCw3IEBACiAKIEFkZCBvciByZW1vdmUgcGFyYW1ldGVycyB0byBtYXRjaCB0aGUgcmVxdWlyZWQgbnVtYmVyOgogCi17JSBwcmV0dGlmeSBkYXJ0ICV9Cit7JSBwcmV0dGlmeSBkYXJ0IHRhZz1wcmUrY29kZSAlfQogY2xhc3MgQyB7CiAgIGludCBvcGVyYXRvciArKGEpID0+IDA7CiB9CkBAIC04NDQ3LDcgKzg0NDgsNyBAQAogVGhlIGZvbGxvd2luZyBjb2RlIHByb2R1Y2VzIHRoaXMgZGlhZ25vc3RpYyBiZWNhdXNlIHRoZSBzZXR0ZXIgYHNgIGRlY2xhcmVzCiB0d28gcmVxdWlyZWQgcGFyYW1ldGVyczoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzZXQgWyFzIV0oaW50IHgsIGludCB5KSB7fQogfQpAQCAtODQ1Niw3ICs4NDU3LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29kZSBwcm9kdWNlcyB0aGlzIGRpYWdub3N0aWMgYmVjYXVzZSB0aGUgc2V0dGVyIGBzYCBkZWNsYXJlcwogb25lIG9wdGlvbmFsIHBhcmFtZXRlcjoKIAoteyUgcHJldHRpZnkgZGFydCAlfQoreyUgcHJldHRpZnkgZGFydCB0YWc9cHJlK2NvZGUgJX0KIGNsYXNzIEMgewogICBzZXQgWyFzIV0oW2ludCB4XSkge30KIH0KQEAgLTg0NjcsNyArODQ2OCw3IEBACiBDaGFuZ2UgdGhlIGRlY2xhcmF0aW9uIHNvIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZSByZXF1aXJlZCBwb3NpdGlvbmFsCiBwYXJhbWV0ZXI6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDIHsKICAgc2V0IHMoaW50IHgpIHt9CiB9CkBAIC04NDk0LDcgKzg0OTUsNyBAQAogcGFyYW1ldGVyIGJ1dCB0d28gdHlwZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHdoZW4gaXQgaXMgdXNlZCBhcyBhIHR5cGUKIGFubm90YXRpb246CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDPEU+IHt9CiAKIHZvaWQgZihbIUM8aW50LCBpbnQ+IV0geCkge30KQEAgLTg1MDMsNyArODUwNCw3IEBACiBUaGUgZm9sbG93aW5nIGNvZGUgcHJvZHVjZXMgdGhpcyBkaWFnbm9zdGljIGJlY2F1c2UgYENgIGRlY2xhcmVzIG9uZSB0eXBlCiBwYXJhbWV0ZXIsIGJ1dCB0d28gdHlwZSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHdoZW4gY3JlYXRpbmcgYW4gaW5zdGFuY2U6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDPEU+IHt9CiAKIHZhciBjID0gWyFDPGludCwgaW50PiFdKCk7CkBAIC04NTE0LDcgKzg1MTUsNyBAQAogQWRkIG9yIHJlbW92ZSB0eXBlIGFyZ3VtZW50cywgYXMgbmVjZXNzYXJ5LCB0byBtYXRjaCB0aGUgbnVtYmVyIG9mIHR5cGUKIHBhcmFtZXRlcnMgZGVmaW5lZCBmb3IgdGhlIHR5cGU6CiAKLXslIHByZXR0aWZ5IGRhcnQgJX0KK3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9CiBjbGFzcyBDPEU+IHt9CiAKIHZvaWQgZihDPGludD4geCkge30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90b29sL2RpYWdub3N0aWNzL2dlbmVyYXRlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvdG9vbC9kaWFnbm9zdGljcy9nZW5lcmF0ZS5kYXJ0CmluZGV4IDYxZWEyZDcuLjZhMGMyZjMgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90b29sL2RpYWdub3N0aWNzL2dlbmVyYXRlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rvb2wvZGlhZ25vc3RpY3MvZ2VuZXJhdGUuZGFydApAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgICAgIFN0cmluZyB0cmltbWVkTGluZSA9IGxleGVtZS5zdWJzdHJpbmcoMyk7CiAgICAgICAgIGlmICh0cmltbWVkTGluZSA9PSAnYGBgZGFydCcpIHsKICAgICAgICAgICBpbkRhcnRDb2RlQmxvY2sgPSB0cnVlOwotICAgICAgICAgIGRvY3MuYWRkKCd7JSBwcmV0dGlmeSBkYXJ0ICV9Jyk7CisgICAgICAgICAgZG9jcy5hZGQoJ3slIHByZXR0aWZ5IGRhcnQgdGFnPXByZStjb2RlICV9Jyk7CiAgICAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUgPT0gJ2BgYCcpIHsKICAgICAgICAgICBpZiAoaW5EYXJ0Q29kZUJsb2NrKSB7CiAgICAgICAgICAgICBkb2NzLmFkZCgneyUgZW5kcHJldHRpZnkgJX0nKTsKQEAgLTQxOSw3ICs0MTksNyBAQAogCiAqIEFubm90YXRpb25zCiAKLSogVGhlIGV4cHJlc3Npb24gaW4gYSBjYXNlIGNsYXVzZS4gRXhhbXBsZToKKyogVGhlIGV4cHJlc3Npb24gaW4gYSBgY2FzZWAgY2xhdXNlLiBFeGFtcGxlOgogCiAgIGBgYGRhcnQKICAgdm9pZCBmKGludCBlKSB7CkBAIC00MzUsOSArNDM1LDkgQEAKIEEgdHlwZSBpcyBfcG90ZW50aWFsbHkgbm9uLW51bGxhYmxlXyBpZiBpdCdzIGVpdGhlciBleHBsaWNpdGx5IG5vbi1udWxsYWJsZSBvcgogaWYgaXQncyBhIHR5cGUgcGFyYW1ldGVyLgogCi1BIHR5cGUgaXMgZXhwbGljaXRseSBub24tbnVsbGFibGUgaWYgaXQgaXMgYSB0eXBlIG5hbWUgdGhhdCBpcyBub3QgZm9sbG93ZWQgYnkgYQorQSB0eXBlIGlzIGV4cGxpY2l0bHkgbm9uLW51bGxhYmxlIGlmIGl0IGlzIGEgdHlwZSBuYW1lIHRoYXQgaXNuJ3QgZm9sbG93ZWQgYnkgYQogcXVlc3Rpb24gbWFyay4gTm90ZSB0aGF0IHRoZXJlIGFyZSBhIGZldyB0eXBlcyB0aGF0IGFyZSBhbHdheXMgbnVsbGFibGUsIHN1Y2ggYXMKLWBOdWxsYCBhbmQgYGR5bmFtaWNgLCBhbmQgdGhhdCBgRnV0dXJlT3JgIGlzIG9ubHkgbm9uLW51bGxhYmxlIGlmIGl0IGlzIG5vdAorYE51bGxgIGFuZCBgZHluYW1pY2AsIGFuZCB0aGF0IGBGdXR1cmVPcmAgaXMgb25seSBub24tbnVsbGFibGUgaWYgaXQgaXNuJ3QKIGZvbGxvd2VkIGJ5IGEgcXVlc3Rpb24gbWFyayBfYW5kXyB0aGUgdHlwZSBhcmd1bWVudCBpcyBub24tbnVsbGFibGUgKHN1Y2ggYXMKIGBGdXR1cmVPcjxTdHJpbmc+YCkuCiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90b29sL2V4cGVyaW1lbnRzL2V4cGVyaW1lbnRzX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90b29sL2V4cGVyaW1lbnRzL2V4cGVyaW1lbnRzX3Rlc3QuZGFydAppbmRleCAxNjdjMDMzLi40Zjc3ZWUzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdG9vbC9leHBlcmltZW50cy9leHBlcmltZW50c190ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rvb2wvZXhwZXJpbWVudHMvZXhwZXJpbWVudHNfdGVzdC5kYXJ0CkBAIC05LDEwICs5LDggQEAKIAogaW1wb3J0ICdnZW5lcmF0ZS5kYXJ0JzsKIAotLyoqCi0gKiBDaGVjayB0aGF0IGFsbCB0YXJnZXRzIGhhdmUgYmVlbiBjb2RlIGdlbmVyYXRlZC4gIElmIHRoZXkgaGF2ZW4ndCB0ZWxsIHRoZQotICogdXNlciB0byBydW4gZ2VuZXJhdGVfYWxsLmRhcnQuCi0gKi8KKy8vLyBDaGVjayB0aGF0IGFsbCB0YXJnZXRzIGhhdmUgYmVlbiBjb2RlIGdlbmVyYXRlZC4gIElmIHRoZXkgaGF2ZW4ndCB0ZWxsIHRoZQorLy8vIHVzZXIgdG8gcnVuIGdlbmVyYXRlX2FsbC5kYXJ0LgogbWFpbigpIGFzeW5jIHsKICAgU3RyaW5nIHNjcmlwdCA9IFBsYXRmb3JtLnNjcmlwdC50b0ZpbGVQYXRoKHdpbmRvd3M6IFBsYXRmb3JtLmlzV2luZG93cyk7CiAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzID0gc3BsaXQoc2NyaXB0KTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci90b29sL2V4cGVyaW1lbnRzL2dlbmVyYXRlLmRhcnQgYi9wa2cvYW5hbHl6ZXIvdG9vbC9leHBlcmltZW50cy9nZW5lcmF0ZS5kYXJ0CmluZGV4IDBlYzFhMGIuLjIzMTg1MWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90b29sL2V4cGVyaW1lbnRzL2dlbmVyYXRlLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rvb2wvZXhwZXJpbWVudHMvZ2VuZXJhdGUuZGFydApAQCAtMSw3ICsxLDUgQEAKLS8qKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gZ2VuZXJhdGUgZXhwZXJpbWVudGFsIGZsYWdzCi0gKiBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwuCi0gKi8KKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB0byBnZW5lcmF0ZSBleHBlcmltZW50YWwgZmxhZ3MKKy8vLyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4gdG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwuCiBpbXBvcnQgJ2RhcnQ6aW8nOwogCiBpbXBvcnQgJ3BhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZC9zcmMvc2Nhbm5lci9jaGFyYWN0ZXJzLmRhcnQnCkBAIC0xOTIsMTUgKzE5MCwxNyBAQAogICAgICAgb3V0LndyaXRlKCcnJwogCiAgICAgICBzdGF0aWMgY29uc3QgJGlkID0gRXhwZXJpbWVudGFsRmVhdHVyZSgKLSAgICAgICRpbmRleCwKLSAgICAgIEVuYWJsZVN0cmluZy4kaWQsCi0gICAgICBJc0VuYWJsZWRCeURlZmF1bHQuJGlkLAotICAgICAgSXNFeHBpcmVkLiRpZCwKLSAgICAgICckaGVscCcKKyAgICAgICAgaW5kZXg6ICRpbmRleCwKKyAgICAgICAgZW5hYmxlU3RyaW5nOiBFbmFibGVTdHJpbmcuJGlkLAorICAgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC4kaWQsCisgICAgICAgIGlzRXhwaXJlZDogSXNFeHBpcmVkLiRpZCwKKyAgICAgICAgZG9jdW1lbnRhdGlvbjogJyRoZWxwJywKICAgICAnJycpOwogICAgICAgaWYgKGVuYWJsZWRJbiAhPSBudWxsKSB7CiAgICAgICAgIGVuYWJsZWRJbiA9IF92ZXJzaW9uTnVtYmVyQXNTdHJpbmcoZW5hYmxlZEluKTsKLSAgICAgICAgb3V0LndyaXRlKCIsZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnJGVuYWJsZWRJbiciKTsKKyAgICAgICAgb3V0LndyaXRlKCJmaXJzdFN1cHBvcnRlZFZlcnNpb246ICckZW5hYmxlZEluJywiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dC53cml0ZSgiZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiBudWxsLCIpOwogICAgICAgfQogICAgICAgb3V0LndyaXRlbG4oJyk7Jyk7CiAgICAgICArK2luZGV4OwpAQCAtMjEwLDIyICsyMTAsMjUgQEAKIAogICAgICAgQGRlcHJlY2F0ZWQKICAgICAgIHN0YXRpYyBjb25zdCBib2d1c19kaXNhYmxlZCA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICAgICRpbmRleCwKKyAgICAgICAgaW5kZXg6ICRpbmRleCwKICAgICAgICAgLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKLSAgICAgICAgRW5hYmxlU3RyaW5nLmJvZ3VzX2Rpc2FibGVkLAotICAgICAgICBJc0VuYWJsZWRCeURlZmF1bHQuYm9ndXNfZGlzYWJsZWQsCi0gICAgICAgIElzRXhwaXJlZC5ib2d1c19kaXNhYmxlZCwKLSAgICAgICAgbnVsbCk7CisgICAgICAgIGVuYWJsZVN0cmluZzogRW5hYmxlU3RyaW5nLmJvZ3VzX2Rpc2FibGVkLAorICAgICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IElzRW5hYmxlZEJ5RGVmYXVsdC5ib2d1c19kaXNhYmxlZCwKKyAgICAgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQuYm9ndXNfZGlzYWJsZWQsCisgICAgICAgIGRvY3VtZW50YXRpb246IG51bGwsCisgICAgICAgIGZpcnN0U3VwcG9ydGVkVmVyc2lvbjogbnVsbCwKKyAgICAgICk7CiAKICAgICAgIEBkZXByZWNhdGVkCiAgICAgICBzdGF0aWMgY29uc3QgYm9ndXNfZW5hYmxlZCA9IEV4cGVyaW1lbnRhbEZlYXR1cmUoCi0gICAgICAgICR7aW5kZXggKyAxfSwKKyAgICAgICAgaW5kZXg6ICR7aW5kZXggKyAxfSwKICAgICAgICAgLy8gaWdub3JlOiBkZXByZWNhdGVkX21lbWJlcl91c2VfZnJvbV9zYW1lX3BhY2thZ2UKLSAgICAgICAgRW5hYmxlU3RyaW5nLmJvZ3VzX2VuYWJsZWQsCi0gICAgICAgIElzRW5hYmxlZEJ5RGVmYXVsdC5ib2d1c19lbmFibGVkLAotICAgICAgICBJc0V4cGlyZWQuYm9ndXNfZW5hYmxlZCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnKTsKKyAgICAgICAgZW5hYmxlU3RyaW5nOiBFbmFibGVTdHJpbmcuYm9ndXNfZW5hYmxlZCwKKyAgICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBJc0VuYWJsZWRCeURlZmF1bHQuYm9ndXNfZW5hYmxlZCwKKyAgICAgICAgaXNFeHBpcmVkOiBJc0V4cGlyZWQuYm9ndXNfZW5hYmxlZCwKKyAgICAgICAgZG9jdW1lbnRhdGlvbjogbnVsbCwKKyAgICAgICAgZmlyc3RTdXBwb3J0ZWRWZXJzaW9uOiAnMS4wLjAnLAorICAgICAgKTsKICAgICB9JycnKTsKICAgfQogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdG9vbC9tZXNzYWdlcy9nZW5lcmF0ZS5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rvb2wvbWVzc2FnZXMvZ2VuZXJhdGUuZGFydAppbmRleCBiMzhkYjM0Li43NWZkMjY5IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdG9vbC9tZXNzYWdlcy9nZW5lcmF0ZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90b29sL21lc3NhZ2VzL2dlbmVyYXRlLmRhcnQKQEAgLTEsMTcgKzEsMTUgQEAKLS8qKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgdG8gZ2VuZXJhdGUgc2Nhbm5lciBhbmQgcGFyc2VyIG1lc3NhZ2UKLSAqIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBwa2cvZnJvbnRfZW5kL21lc3NhZ2VzLnlhbWwuCi0gKgotICogRm9yIGVhY2ggbWVzc2FnZSBpbiBtZXNzYWdlcy55YW1sIHRoYXQgY29udGFpbnMgYW4gJ2luZGV4OicgZmllbGQsCi0gKiB0aGlzIHRvb2wgZ2VuZXJhdGVzIGFuIGVycm9yIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGJ5IHRoZSAnYW5hbHl6ZXJDb2RlOicKLSAqIGZpZWxkIGFuZCBhbiBlbnRyeSBpbiB0aGUgZmFzdGFBbmFseXplckVycm9yTGlzdCBmb3IgdGhhdCBnZW5lcmF0ZWQgZXJyb3IuCi0gKiBUaGUgdGV4dCBpbiB0aGUgJ2FuYWx5emVyQ29kZTonIGZpZWxkIG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAqIGNvbnRhaW5pbmcgdGhlIGVycm9yIGFuZCB0aGUgbmFtZSBvZiB0aGUgZXJyb3Igc2VwYXJhdGVkIGJ5IGEgYC5gCi0gKiAoZS5nLiBQYXJzZXJFcnJvckNvZGUuRVFVQUxJVFlfQ0FOTk9UX0JFX0VRVUFMSVRZX09QRVJBTkQpLgotICoKLSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgJ3BrZy9mcm9udF9lbmQvdG9vbC9mYXN0YSBnZW5lcmF0ZS1tZXNzYWdlcycKLSAqIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IHJ1bi4KLSAqLworLy8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHRvIGdlbmVyYXRlIHNjYW5uZXIgYW5kIHBhcnNlciBtZXNzYWdlCisvLy8gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIHBrZy9mcm9udF9lbmQvbWVzc2FnZXMueWFtbC4KKy8vLworLy8vIEZvciBlYWNoIG1lc3NhZ2UgaW4gbWVzc2FnZXMueWFtbCB0aGF0IGNvbnRhaW5zIGFuICdpbmRleDonIGZpZWxkLAorLy8vIHRoaXMgdG9vbCBnZW5lcmF0ZXMgYW4gZXJyb3Igd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhlICdhbmFseXplckNvZGU6JworLy8vIGZpZWxkIGFuZCBhbiBlbnRyeSBpbiB0aGUgZmFzdGFBbmFseXplckVycm9yTGlzdCBmb3IgdGhhdCBnZW5lcmF0ZWQgZXJyb3IuCisvLy8gVGhlIHRleHQgaW4gdGhlICdhbmFseXplckNvZGU6JyBmaWVsZCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisvLy8gY29udGFpbmluZyB0aGUgZXJyb3IgYW5kIHRoZSBuYW1lIG9mIHRoZSBlcnJvciBzZXBhcmF0ZWQgYnkgYSBgLmAKKy8vLyAoZS5nLiBQYXJzZXJFcnJvckNvZGUuRVFVQUxJVFlfQ0FOTk9UX0JFX0VRVUFMSVRZX09QRVJBTkQpLgorLy8vCisvLy8gSXQgaXMgZXhwZWN0ZWQgdGhhdCAncGtnL2Zyb250X2VuZC90b29sL2Zhc3RhIGdlbmVyYXRlLW1lc3NhZ2VzJworLy8vIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IHJ1bi4KIGltcG9ydCAnZGFydDppbyc7CiAKIGltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L2J1aWxkX3Nka19zdW1tYXJpZXMuZGFydCBiL3BrZy9hbmFseXplci90b29sL3N1bW1hcnkvYnVpbGRfc2RrX3N1bW1hcmllcy5kYXJ0CmluZGV4IDVjMDU5MGIuLjUxNWZiNWQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90b29sL3N1bW1hcnkvYnVpbGRfc2RrX3N1bW1hcmllcy5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90b29sL3N1bW1hcnkvYnVpbGRfc2RrX3N1bW1hcmllcy5kYXJ0CkBAIC00LDkgKzQsOSBAQAogCiBpbXBvcnQgJ2RhcnQ6aW8nOwogCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9zZGsvYnVpbGRfc2RrX3N1bW1hcnkuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZmlsZV9zeXN0ZW0vcGh5c2ljYWxfZmlsZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvc2RrL3Nkay5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc3VtbWFyeS9zdW1tYXJ5X2ZpbGVfYnVpbGRlci5kYXJ0JzsKIAogdm9pZCBtYWluKExpc3Q8U3RyaW5nPiBhcmdzKSB7CiAgIFN0cmluZyBjb21tYW5kOwpAQCAtNDgsOSArNDgsNyBAQAogICB9CiB9CiAKLS8qKgotICogVGhlIG5hbWUgb2YgdGhlIFNESyBzdW1tYXJpZXMgYnVpbGRlciBhcHBsaWNhdGlvbi4KLSAqLworLy8vIFRoZSBuYW1lIG9mIHRoZSBTREsgc3VtbWFyaWVzIGJ1aWxkZXIgYXBwbGljYXRpb24uCiBjb25zdCBCSU5BUllfTkFNRSA9ICJidWlsZF9zZGtfc3VtbWFyaWVzIjsKIAogdm9pZCBfYnVpbGRTdW1tYXJ5KFN0cmluZyBzZGtQYXRoLCBTdHJpbmcgb3V0UGF0aCkgewpAQCAtNjQsOSArNjIsNyBAQAogICBwcmludCgnXHREb25lIGluICR7c3cuZWxhcHNlZE1pbGxpc2Vjb25kc30gbXMuJyk7CiB9CiAKLS8qKgotICogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgU0RLIHN1bW1hcmllcyBidWlsZGVyLgotICovCisvLy8gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgU0RLIHN1bW1hcmllcyBidWlsZGVyLgogdm9pZCBfcHJpbnRVc2FnZSgpIHsKICAgcHJpbnQoJ1VzYWdlOiAkQklOQVJZX05BTUUgY29tbWFuZCBhcmd1bWVudHMnKTsKICAgcHJpbnQoJ1doZXJlIGNvbW1hbmQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOicpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rvb2wvc3VtbWFyeS9jaGVja190ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L2NoZWNrX3Rlc3QuZGFydAppbmRleCA2YzRlNjM1Li5lOTNiYjMzIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L2NoZWNrX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L2NoZWNrX3Rlc3QuZGFydApAQCAtOCwxMCArOCw4IEBACiBpbXBvcnQgJy4uLy4uL3Rlc3QvdXRpbHMvcGFja2FnZV9yb290LmRhcnQnIGFzIHBhY2thZ2Vfcm9vdDsKIGltcG9ydCAnZ2VuZXJhdGUuZGFydCc7CiAKLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGZpbGUgaGFzIGJlZW4gY29kZSBnZW5lcmF0ZWQuICBJZiBpdCBoYXNuJ3QgdGVsbCB0aGUKLSAqIHVzZXIgdG8gcnVuIGdlbmVyYXRlLmRhcnQuCi0gKi8KKy8vLyBDaGVjayB0aGF0IHRoZSB0YXJnZXQgZmlsZSBoYXMgYmVlbiBjb2RlIGdlbmVyYXRlZC4gIElmIGl0IGhhc24ndCB0ZWxsIHRoZQorLy8vIHVzZXIgdG8gcnVuIGdlbmVyYXRlLmRhcnQuCiBtYWluKCkgYXN5bmMgewogICB2YXIgaWRsRm9sZGVyUGF0aCA9IG5vcm1hbGl6ZSgKICAgICAgIGpvaW4ocGFja2FnZV9yb290LnBhY2thZ2VSb290LCAnYW5hbHl6ZXInLCAnbGliJywgJ3NyYycsICdzdW1tYXJ5JykpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rvb2wvc3VtbWFyeS9pZGxfbW9kZWwuZGFydCBiL3BrZy9hbmFseXplci90b29sL3N1bW1hcnkvaWRsX21vZGVsLmRhcnQKaW5kZXggZjkwNDc1Yy4uOTY4MDc2MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rvb2wvc3VtbWFyeS9pZGxfbW9kZWwuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L2lkbF9tb2RlbC5kYXJ0CkBAIC0yLDM2ICsyLDI0IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotLyoqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgY29uY3JldGUgY2xhc3NlcyByZXByZXNlbnRpbmcgYW4gaW4tbWVtb3J5Ci0gKiBzZW1hbnRpYyBtb2RlbCBvZiB0aGUgSURMIHVzZWQgdG8gY29kZSBnZW5lcmF0ZSBzdW1tYXJ5IHNlcmlhbGl6YXRpb24gYW5kCi0gKiBkZXNlcmlhbGl6YXRpb24gY29kZS4KLSAqLworLy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHNldCBvZiBjb25jcmV0ZSBjbGFzc2VzIHJlcHJlc2VudGluZyBhbiBpbi1tZW1vcnkKKy8vLyBzZW1hbnRpYyBtb2RlbCBvZiB0aGUgSURMIHVzZWQgdG8gY29kZSBnZW5lcmF0ZSBzdW1tYXJ5IHNlcmlhbGl6YXRpb24gYW5kCisvLy8gZGVzZXJpYWxpemF0aW9uIGNvZGUuCiBpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGNsYXNzIGRlZmluZWQgaW4gdGhlIElETC4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGNsYXNzIGRlZmluZWQgaW4gdGhlIElETC4KIGNsYXNzIENsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBEZWNsYXJhdGlvbiB7Ci0gIC8qKgotICAgKiBBbGwgZmllbGRzIGRlZmluZWQgaW4gdGhlIGNsYXNzLCBpbmNsdWRpbmcgZGVwcmVjYXRlZCBvbmVzLgotICAgKi8KKyAgLy8vIEFsbCBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgY2xhc3MsIGluY2x1ZGluZyBkZXByZWNhdGVkIG9uZXMuCiAgIGZpbmFsIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gPEZpZWxkRGVjbGFyYXRpb24+W107CiAKLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGFzcyBoYXMgdGhlIGB0b3BMZXZlbGAgYW5ub3RhdGlvbi4KLSAgICovCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2xhc3MgaGFzIHRoZSBgdG9wTGV2ZWxgIGFubm90YXRpb24uCiAgIGZpbmFsIGJvb2wgaXNUb3BMZXZlbDsKIAotICAvKioKLSAgICogSWYgW2lzVG9wTGV2ZWxdIGlzIGB0cnVlYCBhbmQgYSBmaWxlIGlkZW50aWZpZXIgd2FzIHNwZWNpZmllZCBmb3IgdGhpcwotICAgKiBjbGFzcywgdGhlIGZpbGUgaWRlbnRpZmllciBzdHJpbmcuICBPdGhlcndpc2UgYG51bGxgLgotICAgKi8KKyAgLy8vIElmIFtpc1RvcExldmVsXSBpcyBgdHJ1ZWAgYW5kIGEgZmlsZSBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQgZm9yIHRoaXMKKyAgLy8vIGNsYXNzLCB0aGUgZmlsZSBpZGVudGlmaWVyIHN0cmluZy4gIE90aGVyd2lzZSBgbnVsbGAuCiAgIGZpbmFsIFN0cmluZyBmaWxlSWRlbnRpZmllcjsKIAotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIGhhcyB0aGUgYGRlcHJlY2F0ZWRgIGFubm90YXRpb24uCi0gICAqLworICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsYXNzIGhhcyB0aGUgYGRlcHJlY2F0ZWRgIGFubm90YXRpb24uCiAgIGZpbmFsIGJvb2wgaXNEZXByZWNhdGVkOwogCiAgIGZpbmFsIFN0cmluZyB2YXJpYW50RmllbGQ7CkBAIC00NSw3OCArMzMsNTIgQEAKICAgICBAcmVxdWlyZWQgdGhpcy52YXJpYW50RmllbGQsCiAgIH0pIDogc3VwZXIoZG9jdW1lbnRhdGlvbiwgbmFtZSk7CiAKLSAgLyoqCi0gICAqIEdldCB0aGUgbm9uLWRlcHJlY2F0ZWQgZmllbGRzIGRlZmluZWQgaW4gdGhlIGNsYXNzLgotICAgKi8KKyAgLy8vIEdldCB0aGUgbm9uLWRlcHJlY2F0ZWQgZmllbGRzIGRlZmluZWQgaW4gdGhlIGNsYXNzLgogICBJdGVyYWJsZTxGaWVsZERlY2xhcmF0aW9uPiBnZXQgZmllbGRzID0+CiAgICAgICBhbGxGaWVsZHMud2hlcmUoKEZpZWxkRGVjbGFyYXRpb24gZmllbGQpID0+ICFmaWVsZC5pc0RlcHJlY2F0ZWQpOwogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgZGVjbGFyYXRpb24gaW4gdGhlIElETC4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgZGVjbGFyYXRpb24gaW4gdGhlIElETC4KIGNsYXNzIERlY2xhcmF0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBvcHRpb25hbCBkb2N1bWVudGF0aW9uLCBtYXkgYmUgYG51bGxgLgotICAgKi8KKyAgLy8vIFRoZSBvcHRpb25hbCBkb2N1bWVudGF0aW9uLCBtYXkgYmUgYG51bGxgLgogICBmaW5hbCBTdHJpbmcgZG9jdW1lbnRhdGlvbjsKIAotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGRlY2xhcmF0aW9uLgotICAgKi8KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBkZWNsYXJhdGlvbi4KICAgZmluYWwgU3RyaW5nIG5hbWU7CiAKICAgRGVjbGFyYXRpb24odGhpcy5kb2N1bWVudGF0aW9uLCB0aGlzLm5hbWUpOwogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVudW0gZGVmaW5lZCBpbiB0aGUgSURMLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW51bSBkZWZpbmVkIGluIHRoZSBJREwuCiBjbGFzcyBFbnVtRGVjbGFyYXRpb24gZXh0ZW5kcyBEZWNsYXJhdGlvbiB7Ci0gIC8qKgotICAgKiBMaXN0IG9mIGVudW1lcmF0ZWQgdmFsdWVzLgotICAgKi8KKyAgLy8vIExpc3Qgb2YgZW51bWVyYXRlZCB2YWx1ZXMuCiAgIGZpbmFsIExpc3Q8RW51bVZhbHVlRGVjbGFyYXRpb24+IHZhbHVlcyA9IDxFbnVtVmFsdWVEZWNsYXJhdGlvbj5bXTsKIAogICBFbnVtRGVjbGFyYXRpb24oU3RyaW5nIGRvY3VtZW50YXRpb24sIFN0cmluZyBuYW1lKQogICAgICAgOiBzdXBlcihkb2N1bWVudGF0aW9uLCBuYW1lKTsKIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbnVtIHZhbHVlIGRlZmluZWQgaW4gdGhlIElETC4KLSAqLworLy8vIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVudW0gdmFsdWUgZGVmaW5lZCBpbiB0aGUgSURMLgogY2xhc3MgRW51bVZhbHVlRGVjbGFyYXRpb24gZXh0ZW5kcyBEZWNsYXJhdGlvbiB7CiAgIEVudW1WYWx1ZURlY2xhcmF0aW9uKFN0cmluZyBkb2N1bWVudGF0aW9uLCBTdHJpbmcgbmFtZSkKICAgICAgIDogc3VwZXIoZG9jdW1lbnRhdGlvbiwgbmFtZSk7CiB9CiAKLS8qKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgY2xhc3MgZmllbGQgZGVmaW5lZCBpbiB0aGUgSURMLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgY2xhc3MgZmllbGQgZGVmaW5lZCBpbiB0aGUgSURMLgogY2xhc3MgRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIERlY2xhcmF0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBmaWxlIG9mIHRoZSBmaWVsZC4KLSAgICovCisgIC8vLyBUaGUgZmlsZSBvZiB0aGUgZmllbGQuCiAgIGZpbmFsIEZpZWxkVHlwZSB0eXBlOwogCi0gIC8qKgotICAgKiBUaGUgaWQgb2YgdGhlIGZpZWxkLgotICAgKi8KKyAgLy8vIFRoZSBpZCBvZiB0aGUgZmllbGQuCiAgIGZpbmFsIGludCBpZDsKIAotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGRlcHJlY2F0ZWQuCi0gICAqLworICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGRlcHJlY2F0ZWQuCiAgIGZpbmFsIGJvb2wgaXNEZXByZWNhdGVkOwogCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgaXMgaW5mb3JtYXRpdmUuCi0gICAqLworICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGluZm9ybWF0aXZlLgogICBmaW5hbCBib29sIGlzSW5mb3JtYXRpdmU7CiAKLSAgLyoqCi0gICAqIE1hcHMgbG9naWNhbCBwcm9wZXJ0eSBuYW1lcyB0byBsb2dpY2FsIHByb3BlcnR5LgotICAgKi8KKyAgLy8vIE1hcHMgbG9naWNhbCBwcm9wZXJ0eSBuYW1lcyB0byBsb2dpY2FsIHByb3BlcnR5LgogICBmaW5hbCBNYXA8U3RyaW5nLCBMb2dpY2FsUHJvcGVydHk+IGxvZ2ljYWxQcm9wZXJ0aWVzOwogCiAgIEZpZWxkRGVjbGFyYXRpb24oewpAQCAtMTMwLDE5ICs5MiwxMyBAQAogICB9KSA6IHN1cGVyKGRvY3VtZW50YXRpb24sIG5hbWUpOwogfQogCi0vKioKLSAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGEgY2xhc3MgZmllbGQgZGVmaW5lZCBpbiB0aGUgSURMLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgYSBjbGFzcyBmaWVsZCBkZWZpbmVkIGluIHRoZSBJREwuCiBjbGFzcyBGaWVsZFR5cGUgewotICAvKioKLSAgICogVHlwZSBvZiB0aGUgZmllbGQgKGUuZy4gJ2ludCcpLgotICAgKi8KKyAgLy8vIFR5cGUgb2YgdGhlIGZpZWxkIChlLmcuICdpbnQnKS4KICAgZmluYWwgU3RyaW5nIHR5cGVOYW1lOwogCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4KLSAgICogW3R5cGVOYW1lXS4KLSAgICovCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4KKyAgLy8vIFt0eXBlTmFtZV0uCiAgIGZpbmFsIGJvb2wgaXNMaXN0OwogCiAgIEZpZWxkVHlwZSh0aGlzLnR5cGVOYW1lLCB0aGlzLmlzTGlzdCk7CkBAIC0xNjYsMzggKzEyMiwyNCBAQAogICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBpc0xpc3QgPyAnTGlzdDwkdHlwZU5hbWU+JyA6IHR5cGVOYW1lOwogfQogCi0vKioKLSAqIFRvcCBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3VtbWFyeSBJREwuCi0gKi8KKy8vLyBUb3AgbGV2ZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1bW1hcnkgSURMLgogY2xhc3MgSWRsIHsKLSAgLyoqCi0gICAqIENsYXNzZXMgZGVmaW5lZCBpbiB0aGUgSURMLgotICAgKi8KKyAgLy8vIENsYXNzZXMgZGVmaW5lZCBpbiB0aGUgSURMLgogICBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzc0RlY2xhcmF0aW9uPiBjbGFzc2VzID0gPFN0cmluZywgQ2xhc3NEZWNsYXJhdGlvbj57fTsKIAotICAvKioKLSAgICogRW51bXMgZGVmaW5lZCBpbiB0aGUgSURMLgotICAgKi8KKyAgLy8vIEVudW1zIGRlZmluZWQgaW4gdGhlIElETC4KICAgZmluYWwgTWFwPFN0cmluZywgRW51bURlY2xhcmF0aW9uPiBlbnVtcyA9IDxTdHJpbmcsIEVudW1EZWNsYXJhdGlvbj57fTsKIH0KIAotLyoqCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgcHJvcGVydHkgbWFwcGVkIHRvIGEgc2luZ2xlIGRhdGEgZmllbGRzLgotICovCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIHByb3BlcnR5IG1hcHBlZCB0byBhIHNpbmdsZSBkYXRhIGZpZWxkcy4KIGNsYXNzIExvZ2ljYWxQcm9wZXJ0eSB7Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4KLSAgICovCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4KICAgZmluYWwgYm9vbCBpc0RlcHJlY2F0ZWQ7CiAKLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBpbmZvcm1hdGl2ZS4KLSAgICovCisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgaW5mb3JtYXRpdmUuCiAgIGZpbmFsIGJvb2wgaXNJbmZvcm1hdGl2ZTsKIAotICAvKioKLSAgICogTmFtZXMgb2YgdmFyaWFudHMgaW4gd2hpY2ggdGhpcyBwcm9wZXJ0eSBpcyBhdmFpbGFibGUuCi0gICAqLworICAvLy8gTmFtZXMgb2YgdmFyaWFudHMgaW4gd2hpY2ggdGhpcyBwcm9wZXJ0eSBpcyBhdmFpbGFibGUuCiAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2YXJpYW50czsKIAogICBMb2dpY2FsUHJvcGVydHkoewpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rvb2wvc3VtbWFyeS9zdGF0cy5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rvb2wvc3VtbWFyeS9zdGF0cy5kYXJ0CmluZGV4IDQ1NmZlNzQuLjQ3ZjU4YjQgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90b29sL3N1bW1hcnkvc3RhdHMuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdG9vbC9zdW1tYXJ5L3N0YXRzLmRhcnQKQEAgLTIsMTAgKzIsOCBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8qKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGNvbGxlY3Rpbmcgc3RhdGlzdGljcyBhYm91dCB0aGUgdXNlIG9mIGZpZWxkcyBpbgotICogYSBzdW1tYXJ5IGZpbGUuCi0gKi8KKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgY29sbGVjdGluZyBzdGF0aXN0aWNzIGFib3V0IHRoZSB1c2Ugb2YgZmllbGRzIGluCisvLy8gYSBzdW1tYXJ5IGZpbGUuCiBpbXBvcnQgJ2RhcnQ6aW8nOwogaW1wb3J0ICdkYXJ0Om1pcnJvcnMnOwogCkBAIC0zMSwzMSArMjksMjEgQEAKICAgc3RhdHMuZHVtcCgpOwogfQogCi0vKioKLSAqIFRoZSBuYW1lIG9mIHRoZSBzdGF0cyB0b29sLgotICovCisvLy8gVGhlIG5hbWUgb2YgdGhlIHN0YXRzIHRvb2wuCiBjb25zdCBTdHJpbmcgQklOQVJZX05BTUUgPSAic3RhdHMiOwogCi0vKioKLSAqIFByaW50IGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byB1c2UgdGhlIHN0YXRzIHRvb2wuCi0gKi8KKy8vLyBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIHRoZSBzdGF0cyB0b29sLgogdm9pZCBfcHJpbnRVc2FnZSgpIHsKICAgcHJpbnQoJ1VzYWdlOiAkQklOQVJZX05BTUUgaW5wdXRfZmlsZV9wYXRoJyk7CiB9CiAKLS8qKgotICogQW4gaW5zdGFuY2Ugb2YgW1N0YXRzXSBrZWVwcyB0cmFjayBvZiBzdGF0aXN0aWNzIGFib3V0IHRoZSB1c2Ugb2YgZmllbGRzIGluCi0gKiBzdW1tYXJ5IG9iamVjdHMuCi0gKi8KKy8vLyBBbiBpbnN0YW5jZSBvZiBbU3RhdHNdIGtlZXBzIHRyYWNrIG9mIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHVzZSBvZiBmaWVsZHMgaW4KKy8vLyBzdW1tYXJ5IG9iamVjdHMuCiBjbGFzcyBTdGF0cyB7Ci0gIC8qKgotICAgKiBNYXAgZnJvbSB0eXBlIHRvIGZpZWxkIG5hbWUgdG8gYSBjb3VudCBvZiBob3cgb2Z0ZW4gdGhlIGZpZWxkIGlzIHVzZWQuCi0gICAqLworICAvLy8gTWFwIGZyb20gdHlwZSB0byBmaWVsZCBuYW1lIHRvIGEgY291bnQgb2YgaG93IG9mdGVuIHRoZSBmaWVsZCBpcyB1c2VkLgogICBNYXA8VHlwZSwgTWFwPFN0cmluZywgaW50Pj4gY291bnRzID0gPFR5cGUsIE1hcDxTdHJpbmcsIGludD4+e307CiAKLSAgLyoqCi0gICAqIFByaW50IG91dCBzdGF0aXN0aWNzIGdhdGhlcmVkIHNvIGZhci4KLSAgICovCisgIC8vLyBQcmludCBvdXQgc3RhdGlzdGljcyBnYXRoZXJlZCBzbyBmYXIuCiAgIHZvaWQgZHVtcCgpIHsKICAgICBjb3VudHMuZm9yRWFjaCgoVHlwZSB0eXBlLCBNYXA8U3RyaW5nLCBpbnQ+IHR5cGVDb3VudHMpIHsKICAgICAgIHByaW50KHR5cGUpOwpAQCAtNjgsOSArNTYsNyBAQAogICAgIH0pOwogICB9CiAKLSAgLyoqCi0gICAqIFJlY29yZCBzdGF0aXN0aWNzIGZvciBbb2JqXSBhbmQgYWxsIG9iamVjdHMgaXQgcmVmZXJzIHRvLgotICAgKi8KKyAgLy8vIFJlY29yZCBzdGF0aXN0aWNzIGZvciBbb2JqXSBhbmQgYWxsIG9iamVjdHMgaXQgcmVmZXJzIHRvLgogICB2b2lkIHJlY29yZChTdW1tYXJ5Q2xhc3Mgb2JqKSB7CiAgICAgTWFwPFN0cmluZywgaW50PiB0eXBlQ291bnRzID0KICAgICAgICAgY291bnRzLnB1dElmQWJzZW50KG9iai5ydW50aW1lVHlwZSwgKCkgPT4gPFN0cmluZywgaW50Pnt9KTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplcl9jbGkvYW5hbHlzaXNfb3B0aW9ucy55YW1sIGIvcGtnL2FuYWx5emVyX2NsaS9hbmFseXNpc19vcHRpb25zLnlhbWwKaW5kZXggZmY5ZmIyOS4uZWI1ZTdmMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyX2NsaS9hbmFseXNpc19vcHRpb25zLnlhbWwKKysrIGIvcGtnL2FuYWx5emVyX2NsaS9hbmFseXNpc19vcHRpb25zLnlhbWwKQEAgLTEsMyArMSw1IEBACitpbmNsdWRlOiBwYWNrYWdlOnBlZGFudGljL2FuYWx5c2lzX29wdGlvbnMuMS45LjAueWFtbAorCiBhbmFseXplcjoKICAgc3Ryb25nLW1vZGU6CiAgICAgaW1wbGljaXQtY2FzdHM6IGZhbHNlCkBAIC0xMCw1MSArMTIsMyBAQAogICBydWxlczoKICAgICAtIGVtcHR5X3N0YXRlbWVudHMKICAgICAtIHVubmVjZXNzYXJ5X2JyYWNlX2luX3N0cmluZ19pbnRlcnBzCi0gICAgIwotICAgICMgRnJvbSBwZWRhbnRpYyAxLjkuMDoKLSAgICAjCi0gICAgLSBhbHdheXNfZGVjbGFyZV9yZXR1cm5fdHlwZXMKLSAgICAtIGFsd2F5c19yZXF1aXJlX25vbl9udWxsX25hbWVkX3BhcmFtZXRlcnMKLSAgICAtIGFubm90YXRlX292ZXJyaWRlcwotICAgIC0gYXZvaWRfZW1wdHlfZWxzZQotICAgIC0gYXZvaWRfaW5pdF90b19udWxsCi0gICAgLSBhdm9pZF9udWxsX2NoZWNrc19pbl9lcXVhbGl0eV9vcGVyYXRvcnMKLSAgICAtIGF2b2lkX3JlbGF0aXZlX2xpYl9pbXBvcnRzCi0gICAgLSBhdm9pZF9yZXR1cm5fdHlwZXNfb25fc2V0dGVycwotICAgIC0gYXZvaWRfc2hhZG93aW5nX3R5cGVfcGFyYW1ldGVycwotICAgIC0gYXZvaWRfdHlwZXNfYXNfcGFyYW1ldGVyX25hbWVzCi0gICAgLSBjYW1lbF9jYXNlX2V4dGVuc2lvbnMKLSAgICAtIGN1cmx5X2JyYWNlc19pbl9mbG93X2NvbnRyb2xfc3RydWN0dXJlcwotICAgIC0gZW1wdHlfY2F0Y2hlcwotICAgIC0gZW1wdHlfY29uc3RydWN0b3JfYm9kaWVzCi0gICAgLSBsaWJyYXJ5X25hbWVzCi0gICAgLSBsaWJyYXJ5X3ByZWZpeGVzCi0gICAgLSBub19kdXBsaWNhdGVfY2FzZV92YWx1ZXMKLSAgICAtIG51bGxfY2xvc3VyZXMKLSAgICAtIG9taXRfbG9jYWxfdmFyaWFibGVfdHlwZXMKLSAgICAtIHByZWZlcl9hZGphY2VudF9zdHJpbmdfY29uY2F0ZW5hdGlvbgotICAgIC0gcHJlZmVyX2NvbGxlY3Rpb25fbGl0ZXJhbHMKLSAgICAtIHByZWZlcl9jb25kaXRpb25hbF9hc3NpZ25tZW50Ci0gICAgLSBwcmVmZXJfY29udGFpbnMKLSAgICAtIHByZWZlcl9lcXVhbF9mb3JfZGVmYXVsdF92YWx1ZXMKLSAgICAtIHByZWZlcl9maW5hbF9maWVsZHMKLSAgICAtIHByZWZlcl9mb3JfZWxlbWVudHNfdG9fbWFwX2Zyb21JdGVyYWJsZQotICAgIC0gcHJlZmVyX2dlbmVyaWNfZnVuY3Rpb25fdHlwZV9hbGlhc2VzCi0gICAgLSBwcmVmZXJfaWZfbnVsbF9vcGVyYXRvcnMKLSAgICAtIHByZWZlcl9pc19lbXB0eQotICAgIC0gcHJlZmVyX2lzX25vdF9lbXB0eQotICAgIC0gcHJlZmVyX2l0ZXJhYmxlX3doZXJlVHlwZQotICAgIC0gcHJlZmVyX3NpbmdsZV9xdW90ZXMKLSAgICAtIHByZWZlcl9zcHJlYWRfY29sbGVjdGlvbnMKLSAgICAtIHJlY3Vyc2l2ZV9nZXR0ZXJzCi0gICAgLSBzbGFzaF9mb3JfZG9jX2NvbW1lbnRzCi0gICAgLSB0eXBlX2luaXRfZm9ybWFscwotICAgIC0gdW5hd2FpdGVkX2Z1dHVyZXMKLSAgICAtIHVubmVjZXNzYXJ5X2NvbnN0Ci0gICAgLSB1bm5lY2Vzc2FyeV9uZXcKLSAgICAtIHVubmVjZXNzYXJ5X251bGxfaW5faWZfbnVsbF9vcGVyYXRvcnMKLSAgICAtIHVubmVjZXNzYXJ5X3RoaXMKLSAgICAtIHVucmVsYXRlZF90eXBlX2VxdWFsaXR5X2NoZWNrcwotICAgIC0gdXNlX2Z1bmN0aW9uX3R5cGVfc3ludGF4X2Zvcl9wYXJhbWV0ZXJzCi0gICAgLSB1c2VfcmV0aHJvd193aGVuX3Bvc3NpYmxlCi0gICAgLSB2YWxpZF9yZWdleHBzCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXJfY2xpL2xpYi9zcmMvZHJpdmVyLmRhcnQgYi9wa2cvYW5hbHl6ZXJfY2xpL2xpYi9zcmMvZHJpdmVyLmRhcnQKaW5kZXggMWI3NWE3YS4uYTc4Y2M4OSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyX2NsaS9saWIvc3JjL2RyaXZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplcl9jbGkvbGliL3NyYy9kcml2ZXIuZGFydApAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCAnZGFydDppbycgYXMgaW87CiBpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CiAKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9kYXJ0L3Nkay9idWlsZF9zZGtfc3VtbWFyeS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9lcnJvci9lcnJvci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9waHlzaWNhbF9maWxlX3N5c3RlbS5kYXJ0JzsKQEAgLTMxLDcgKzMyLDYgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvc291cmNlL3BhY2thZ2VfbWFwX3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zb3VyY2UvcGF0aF9maWx0ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL3N1bW1hcnkvcGFja2FnZV9idW5kbGVfcmVhZGVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L3N1bW1hcnlfZmlsZV9idWlsZGVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9zdW1tYXJ5L3N1bW1hcnlfc2RrLmRhcnQnIHNob3cgU3VtbWFyeUJhc2VkRGFydFNkazsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGFzay9vcHRpb25zLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy91dGlsL3lhbWwuZGFydCc7CkBAIC01NTIsNyArNTUyLDcgQEAKICAgICAgICAgdXNlU3VtbWFyaWVzID8gb3B0aW9ucy5idWlsZFN1bW1hcnlJbnB1dHMgOiA8U3RyaW5nPltdKTsKIAogICAgIC8vIE9uY2Ugb3B0aW9ucyBhbmQgZW1iZWRkZXJzIGFyZSBwcm9jZXNzZWQsIHNldHVwIHRoZSBTREsuCi0gICAgX3NldHVwU2RrKG9wdGlvbnMsIHVzZVN1bW1hcmllcywgYW5hbHlzaXNPcHRpb25zKTsKKyAgICBfc2V0dXBTZGsob3B0aW9ucywgYW5hbHlzaXNPcHRpb25zKTsKIAogICAgIC8vIENob29zZSBhIHBhY2thZ2UgcmVzb2x1dGlvbiBwb2xpY3kgYW5kIGEgZGlldCBwYXJzaW5nIHBvbGljeSBiYXNlZCBvbgogICAgIC8vIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KQEAgLTYyNyw4ICs2MjcsNyBAQAogICAgIHJldHVybiBhbmFseXplci5hbmFseXplKGZvcm1hdHRlcik7CiAgIH0KIAotICB2b2lkIF9zZXR1cFNkayhDb21tYW5kTGluZU9wdGlvbnMgb3B0aW9ucywgYm9vbCB1c2VTdW1tYXJpZXMsCi0gICAgICBBbmFseXNpc09wdGlvbnMgYW5hbHlzaXNPcHRpb25zKSB7CisgIHZvaWQgX3NldHVwU2RrKENvbW1hbmRMaW5lT3B0aW9ucyBvcHRpb25zLCBBbmFseXNpc09wdGlvbnMgYW5hbHlzaXNPcHRpb25zKSB7CiAgICAgaWYgKHNkayA9PSBudWxsKSB7CiAgICAgICBpZiAob3B0aW9ucy5kYXJ0U2RrU3VtbWFyeVBhdGggIT0gbnVsbCkgewogICAgICAgICBzZGsgPSBTdW1tYXJ5QmFzZWREYXJ0U2RrKG9wdGlvbnMuZGFydFNka1N1bW1hcnlQYXRoLCB0cnVlKTsKQEAgLTYzNiwxMiArNjM1LDYgQEAKICAgICAgICAgdmFyIGRhcnRTZGtQYXRoID0gb3B0aW9ucy5kYXJ0U2RrUGF0aDsKICAgICAgICAgdmFyIGRhcnRTZGsgPSBGb2xkZXJCYXNlZERhcnRTZGsoCiAgICAgICAgICAgICByZXNvdXJjZVByb3ZpZGVyLCByZXNvdXJjZVByb3ZpZGVyLmdldEZvbGRlcihkYXJ0U2RrUGF0aCkpOwotICAgICAgICBkYXJ0U2RrLnVzZVN1bW1hcnkgPSB1c2VTdW1tYXJpZXMgJiYKLSAgICAgICAgICAgIG9wdGlvbnMuc291cmNlRmlsZXMuZXZlcnkoKFN0cmluZyBzb3VyY2VQYXRoKSB7Ci0gICAgICAgICAgICAgIHNvdXJjZVBhdGggPSBwYXRoLmFic29sdXRlKHNvdXJjZVBhdGgpOwotICAgICAgICAgICAgICBzb3VyY2VQYXRoID0gcGF0aC5ub3JtYWxpemUoc291cmNlUGF0aCk7Ci0gICAgICAgICAgICAgIHJldHVybiAhcGF0aC5pc1dpdGhpbihkYXJ0U2RrUGF0aCwgc291cmNlUGF0aCk7Ci0gICAgICAgICAgICB9KTsKICAgICAgICAgZGFydFNkay5hbmFseXNpc09wdGlvbnMgPSBhbmFseXNpc09wdGlvbnM7CiAgICAgICAgIHNkayA9IGRhcnRTZGs7CiAgICAgICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXJfY2xpL3B1YnNwZWMueWFtbCBiL3BrZy9hbmFseXplcl9jbGkvcHVic3BlYy55YW1sCmluZGV4IDA2YTllMjcuLmI3NjFhMGUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplcl9jbGkvcHVic3BlYy55YW1sCisrKyBiL3BrZy9hbmFseXplcl9jbGkvcHVic3BlYy55YW1sCkBAIC0xNSw2ICsxNSw3IEBACiAgIHB1Yl9zZW12ZXI6IF4xLjQuMgogICB5YW1sOiBeMi4xLjIKIGRldl9kZXBlbmRlbmNpZXM6CisgIHBlZGFudGljOiBeMS45LjAKICAgdGVzdF9yZWZsZWN0aXZlX2xvYWRlcjogXjAuMS44CiAgIHRlc3Q6IF4xLjAuMAogICB1c2FnZTogXjMuMi4wKzEKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplcl9jbGkvdGVzdC9lbWJlZGRlcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXJfY2xpL3Rlc3QvZW1iZWRkZXJfdGVzdC5kYXJ0CmluZGV4IGM4NTVkMjEuLjEyMGFmNzIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplcl9jbGkvdGVzdC9lbWJlZGRlcl90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyX2NsaS90ZXN0L2VtYmVkZGVyX3Rlc3QuZGFydApAQCAtNTMsNyArNTMsNiBAQAogCiAgICAgICB2YXIgc2RrID0gZHJpdmVyLnNkazsKICAgICAgIGV4cGVjdChzZGssIGNvbnN0IFR5cGVNYXRjaGVyPEZvbGRlckJhc2VkRGFydFNkaz4oKSk7Ci0gICAgICBleHBlY3QoKHNkayBhcyBGb2xkZXJCYXNlZERhcnRTZGspLnVzZVN1bW1hcnksIGlzRmFsc2UpOwogICAgIH0pKTsKICAgfSk7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXJfY2xpL3Rlc3Qvb3B0aW9uc190ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXJfY2xpL3Rlc3Qvb3B0aW9uc190ZXN0LmRhcnQKaW5kZXggZDQyN2EwZS4uNmI4MTQyNSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyX2NsaS90ZXN0L29wdGlvbnNfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplcl9jbGkvdGVzdC9vcHRpb25zX3Rlc3QuZGFydApAQCAtODksOSArODksMzAgQEAKIAogICAgICAgZ3JvdXAoJ2VuYWJsZSBleHBlcmltZW50JywgKCkgewogICAgICAgICB2YXIga25vd25GZWF0dXJlcyA9IHsKLSAgICAgICAgICAnYSc6IEV4cGVyaW1lbnRhbEZlYXR1cmUoMCwgJ2EnLCBmYWxzZSwgZmFsc2UsICdhJyksCi0gICAgICAgICAgJ2InOiBFeHBlcmltZW50YWxGZWF0dXJlKDEsICdiJywgZmFsc2UsIGZhbHNlLCAnYicpLAotICAgICAgICAgICdjJzogRXhwZXJpbWVudGFsRmVhdHVyZSgyLCAnYycsIGZhbHNlLCBmYWxzZSwgJ2MnKSwKKyAgICAgICAgICAnYSc6IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICAgICAgICBpbmRleDogMCwKKyAgICAgICAgICAgIGVuYWJsZVN0cmluZzogJ2EnLAorICAgICAgICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgICAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnYScsCisgICAgICAgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgICAgICAgKSwKKyAgICAgICAgICAnYic6IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICAgICAgICBpbmRleDogMSwKKyAgICAgICAgICAgIGVuYWJsZVN0cmluZzogJ2InLAorICAgICAgICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgICAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnYicsCisgICAgICAgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgICAgICAgKSwKKyAgICAgICAgICAnYyc6IEV4cGVyaW1lbnRhbEZlYXR1cmUoCisgICAgICAgICAgICBpbmRleDogMiwKKyAgICAgICAgICAgIGVuYWJsZVN0cmluZzogJ2MnLAorICAgICAgICAgICAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSwKKyAgICAgICAgICAgIGlzRXhwaXJlZDogZmFsc2UsCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnYycsCisgICAgICAgICAgICBmaXJzdFN1cHBvcnRlZFZlcnNpb246IG51bGwsCisgICAgICAgICAgKSwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0KCdubyB2YWx1ZXMnLCAoKSB7CmRpZmYgLS1naXQgYS9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnQgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9pci9zdGF0aWNfdHlwZV9iYXNlLmRhcnQKaW5kZXggZTM3NTBkYS4uYjYyYzRjOSAxMDA2NDQKLS0tIGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMvaXIvc3RhdGljX3R5cGVfYmFzZS5kYXJ0CisrKyBiL3BrZy9jb21waWxlci9saWIvc3JjL2lyL3N0YXRpY190eXBlX2Jhc2UuZGFydApAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgQG92ZXJyaWRlCiAgIGlyLkRhcnRUeXBlIHZpc2l0QXdhaXRFeHByZXNzaW9uKGlyLkF3YWl0RXhwcmVzc2lvbiBub2RlKSB7Ci0gICAgcmV0dXJuIHR5cGVFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodmlzaXROb2RlKG5vZGUub3BlcmFuZCkpOworICAgIHJldHVybiB0eXBlRW52aXJvbm1lbnQuZmxhdHRlbih2aXNpdE5vZGUobm9kZS5vcGVyYW5kKSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnQgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19iYWNrZW5kL3J1bnRpbWVfdHlwZXNfcmVzb2x1dGlvbi5kYXJ0CmluZGV4IGQ2MzMyNjYuLjgyNTljMTAgMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlci9saWIvc3JjL2pzX2JhY2tlbmQvcnVudGltZV90eXBlc19yZXNvbHV0aW9uLmRhcnQKKysrIGIvcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfYmFja2VuZC9ydW50aW1lX3R5cGVzX3Jlc29sdXRpb24uZGFydApAQCAtMTA3MSw2ICsxMDcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqb2hubml3aW50aGVyKTogVXNlIHJlZ2lzdGVyIGdlbmVyaWMgaW5zdGFudGlhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZC4KICAgICAgICAgICAgICAgICAgICAgYXNzdW1lSW5zdGFudGlhdGlvbnM6IF9nZW5lcmljSW5zdGFudGlhdGlvbnMuaXNOb3RFbXB0eSkpIHsKKyAgICAgICAgICBpZiAoZnVuY3Rpb25UeXBlLnR5cGVWYXJpYWJsZXMuaXNOb3RFbXB0eSkgeworICAgICAgICAgICAgcG90ZW50aWFsbHlOZWVkVHlwZUFyZ3VtZW50cyhmdW5jdGlvbik7CisgICAgICAgICAgfQogICAgICAgICAgIGZ1bmN0aW9uVHlwZS5mb3JFYWNoVHlwZVZhcmlhYmxlKChUeXBlVmFyaWFibGVUeXBlIHR5cGVWYXJpYWJsZSkgewogICAgICAgICAgICAgRW50aXR5IHR5cGVEZWNsYXJhdGlvbiA9IHR5cGVWYXJpYWJsZS5lbGVtZW50LnR5cGVEZWNsYXJhdGlvbjsKICAgICAgICAgICAgIGlmICghcHJvY2Vzc2VkRW50aXRpZXMuY29udGFpbnModHlwZURlY2xhcmF0aW9uKSkgewpkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0IGIvcGtnL2NvbXBpbGVyL2xpYi9zcmMvanNfbW9kZWwvanNfd29ybGRfYnVpbGRlci5kYXJ0CmluZGV4IGY1ZDU5NTUuLmRiNzc5YzMgMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlci9saWIvc3JjL2pzX21vZGVsL2pzX3dvcmxkX2J1aWxkZXIuZGFydAorKysgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9qc19tb2RlbC9qc193b3JsZF9idWlsZGVyLmRhcnQKQEAgLTYyLDggKzYyLDYgQEAKICAgICAgIE91dHB1dFVuaXREYXRhIGtPdXRwdXRVbml0RGF0YSkgewogICAgIEpzVG9Gcm9udGVuZE1hcCBtYXAgPSBuZXcgSnNUb0Zyb250ZW5kTWFwSW1wbChfZWxlbWVudE1hcCk7CiAKLSAgICBCYWNrZW5kVXNhZ2UgYmFja2VuZFVzYWdlID0KLSAgICAgICAgX2NvbnZlcnRCYWNrZW5kVXNhZ2UobWFwLCBjbG9zZWRXb3JsZC5iYWNrZW5kVXNhZ2UpOwogICAgIE5hdGl2ZURhdGEgbmF0aXZlRGF0YSA9IF9jb252ZXJ0TmF0aXZlRGF0YShtYXAsIGNsb3NlZFdvcmxkLm5hdGl2ZURhdGEpOwogICAgIF9lbGVtZW50TWFwLm5hdGl2ZURhdGEgPSBuYXRpdmVEYXRhOwogICAgIEludGVyY2VwdG9yRGF0YSBpbnRlcmNlcHRvckRhdGEgPQpAQCAtMTYyLDcgKzE2MCw3IEBACiAgICAgICB9CiAKICAgICAgIFJ1bnRpbWVUeXBlc05lZWRJbXBsIGpSdGlOZWVkID0KLSAgICAgICAgICBfY29udmVydFJ1bnRpbWVUeXBlc05lZWQobWFwLCBiYWNrZW5kVXNhZ2UsIGtlcm5lbFJ0aU5lZWQpOworICAgICAgICAgIF9jb252ZXJ0UnVudGltZVR5cGVzTmVlZChtYXAsIGtlcm5lbFJ0aU5lZWQpOwogICAgICAgY2xvc3VyZURhdGEgPSBfY2xvc3VyZURhdGFCdWlsZGVyLmNyZWF0ZUNsb3N1cmVFbnRpdGllcygKICAgICAgICAgICB0aGlzLAogICAgICAgICAgIG1hcC50b0JhY2tlbmRNZW1iZXJNYXAoY2xvc3VyZU1vZGVscywgaWRlbnRpdHkpLApAQCAtMTg5LDYgKzE4NywxMSBAQAogICAgICAgcnRpTmVlZCA9IGpSdGlOZWVkOwogICAgIH0KIAorICAgIG1hcC5yZWdpc3RlckNsb3N1cmVEYXRhKGNsb3N1cmVEYXRhKTsKKworICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UgPQorICAgICAgICBfY29udmVydEJhY2tlbmRVc2FnZShtYXAsIGNsb3NlZFdvcmxkLmJhY2tlbmRVc2FnZSk7CisKICAgICBOb1N1Y2hNZXRob2REYXRhSW1wbCBvbGROb1N1Y2hNZXRob2REYXRhID0gY2xvc2VkV29ybGQubm9TdWNoTWV0aG9kRGF0YTsKICAgICBOb1N1Y2hNZXRob2REYXRhIG5vU3VjaE1ldGhvZERhdGEgPSBuZXcgTm9TdWNoTWV0aG9kRGF0YUltcGwoCiAgICAgICAgIG1hcC50b0JhY2tlbmRGdW5jdGlvblNldChvbGROb1N1Y2hNZXRob2REYXRhLnRocm93aW5nSW1wbHMpLApAQCAtMzc4LDggKzM4MSw4IEBACiAgICAgICAgICAgICBpbnRlcmNlcHRvckRhdGEuY2xhc3Nlc01peGVkSW50b0ludGVyY2VwdGVkQ2xhc3NlcykpOwogICB9CiAKLSAgUnVudGltZVR5cGVzTmVlZCBfY29udmVydFJ1bnRpbWVUeXBlc05lZWQoSnNUb0Zyb250ZW5kTWFwIG1hcCwKLSAgICAgIEJhY2tlbmRVc2FnZSBiYWNrZW5kVXNhZ2UsIFJ1bnRpbWVUeXBlc05lZWRJbXBsIHJ0aU5lZWQpIHsKKyAgUnVudGltZVR5cGVzTmVlZCBfY29udmVydFJ1bnRpbWVUeXBlc05lZWQoCisgICAgICBKc1RvRnJvbnRlbmRNYXAgbWFwLCBSdW50aW1lVHlwZXNOZWVkSW1wbCBydGlOZWVkKSB7CiAgICAgU2V0PENsYXNzRW50aXR5PiBjbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMgPQogICAgICAgICBtYXAudG9CYWNrZW5kQ2xhc3NTZXQocnRpTmVlZC5jbGFzc2VzTmVlZGluZ1R5cGVBcmd1bWVudHMpOwogICAgIFNldDxGdW5jdGlvbkVudGl0eT4gbWV0aG9kc05lZWRpbmdUeXBlQXJndW1lbnRzID0KQEAgLTU5Nyw2ICs2MDAsMTMgQEAKIAogICBDb25zdGFudFZhbHVlIHRvQmFja2VuZENvbnN0YW50KENvbnN0YW50VmFsdWUgdmFsdWUsIHtib29sIGFsbG93TnVsbDogZmFsc2V9KTsKIAorICAvLy8gUmVnaXN0ZXIgW2Nsb3N1cmVEYXRhXSB3aXRoIHRoaXMgbWFwLgorICAvLy8KKyAgLy8vIFtDbG9zdXJlRGF0YV0gaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gbG9jYWwgZnVuY3Rpb24gYW5kIHRoZSBiYWNrZW5kCisgIC8vLyBlbnRpdGllcy4gQmVmb3JlIHRoaXMgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgdHlwZSB2YXJpYWJsZXMgb2YgbG9jYWwKKyAgLy8vIGZ1bmN0aW9ucyBjYW5ub3QgYmUgY29udmVydGVkIGludG8gYmFja2VuZCBlcXVpdmFsZW50cy4KKyAgdm9pZCByZWdpc3RlckNsb3N1cmVEYXRhKENsb3N1cmVEYXRhIGNsb3N1cmVEYXRhKTsKKwogICBTZXQ8TGlicmFyeUVudGl0eT4gdG9CYWNrZW5kTGlicmFyeVNldChJdGVyYWJsZTxMaWJyYXJ5RW50aXR5PiBzZXQpIHsKICAgICByZXR1cm4gc2V0Lm1hcCh0b0JhY2tlbmRMaWJyYXJ5KS50b1NldCgpOwogICB9CkBAIC02NzEsNiArNjgxLDcgQEAKIAogY2xhc3MgSnNUb0Zyb250ZW5kTWFwSW1wbCBleHRlbmRzIEpzVG9Gcm9udGVuZE1hcCB7CiAgIGZpbmFsIEpzS2VybmVsVG9FbGVtZW50TWFwIF9iYWNrZW5kOworICBDbG9zdXJlRGF0YSBfY2xvc3VyZURhdGE7CiAKICAgSnNUb0Zyb250ZW5kTWFwSW1wbCh0aGlzLl9iYWNrZW5kKTsKIApAQCAtNzA3LDEwICs3MTgsMjMgQEAKICAgICByZXR1cm4gX2JhY2tlbmQubWVtYmVycy5nZXRFbnRpdHkobWVtYmVyLm1lbWJlckluZGV4KTsKICAgfQogCisgIEBvdmVycmlkZQorICB2b2lkIHJlZ2lzdGVyQ2xvc3VyZURhdGEoQ2xvc3VyZURhdGEgY2xvc3VyZURhdGEpIHsKKyAgICBhc3NlcnQoX2Nsb3N1cmVEYXRhID09IG51bGwsICJDbG9zdXJlIGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLiIpOworICAgIF9jbG9zdXJlRGF0YSA9IGNsb3N1cmVEYXRhOworICB9CisKICAgVHlwZVZhcmlhYmxlRW50aXR5IHRvQmFja2VuZFR5cGVWYXJpYWJsZShUeXBlVmFyaWFibGVFbnRpdHkgdHlwZVZhcmlhYmxlKSB7CiAgICAgaWYgKHR5cGVWYXJpYWJsZSBpcyBLTG9jYWxUeXBlVmFyaWFibGUpIHsKLSAgICAgIGZhaWxlZEF0KAotICAgICAgICAgIHR5cGVWYXJpYWJsZSwgIkxvY2FsIGZ1bmN0aW9uIHR5cGUgdmFyaWFibGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgaWYgKF9jbG9zdXJlRGF0YSA9PSBudWxsKSB7CisgICAgICAgIGZhaWxlZEF0KAorICAgICAgICAgICAgdHlwZVZhcmlhYmxlLCAiTG9jYWwgZnVuY3Rpb24gdHlwZSB2YXJpYWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICB9CisgICAgICBDbG9zdXJlUmVwcmVzZW50YXRpb25JbmZvIGluZm8gPQorICAgICAgICAgIF9jbG9zdXJlRGF0YS5nZXRDbG9zdXJlSW5mbyh0eXBlVmFyaWFibGUudHlwZURlY2xhcmF0aW9uLm5vZGUpOworICAgICAgcmV0dXJuIF9iYWNrZW5kLmVsZW1lbnRFbnZpcm9ubWVudAorICAgICAgICAgIC5nZXRGdW5jdGlvblR5cGVWYXJpYWJsZXMoaW5mby5jYWxsTWV0aG9kKVt0eXBlVmFyaWFibGUuaW5kZXhdCisgICAgICAgICAgLmVsZW1lbnQ7CiAgICAgfQogICAgIEluZGV4ZWRUeXBlVmFyaWFibGUgaW5kZXhlZFR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZTsKICAgICByZXR1cm4gX2JhY2tlbmQudHlwZVZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2RhcnQyanNfdGFyZ2V0LmRhcnQgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydAppbmRleCA3YmIwYjI3Li44OTFjNDYyIDEwMDY0NAotLS0gYS9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydAorKysgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvZGFydDJqc190YXJnZXQuZGFydApAQCAtMTgyLDYgKzE4Miw3IEBACiAgICAgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJywKICAgICAnZGFydDpfaW50ZXJjZXB0b3JzJywKICAgICAnZGFydDpfaW50ZXJuYWwnLAorICAgICdkYXJ0Ol9qc19hbm5vdGF0aW9ucycsCiAgICAgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJywKICAgICAnZGFydDpfanNfaGVscGVyJywKICAgICAnZGFydDpfanNfbmFtZXMnLApAQCAtMjAzLDYgKzIwNCw3IEBACiAgICAgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJywKICAgICAnZGFydDpfaW50ZXJjZXB0b3JzJywKICAgICAnZGFydDpfaW50ZXJuYWwnLAorICAgICdkYXJ0Ol9qc19hbm5vdGF0aW9ucycsCiAgICAgJ2RhcnQ6X2pzX2VtYmVkZGVkX25hbWVzJywKICAgICAnZGFydDpfanNfaGVscGVyJywKICAgICAnZGFydDpfanNfbmFtZXMnLApkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlbGVtZW50cy5kYXJ0IGIvcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlbGVtZW50cy5kYXJ0CmluZGV4IDI3N2EzM2MuLjAyNTdjMDggMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9rZWxlbWVudHMuZGFydAorKysgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwva2VsZW1lbnRzLmRhcnQKQEAgLTI4MSw3ICsyODEsNyBAQAogCiBjbGFzcyBLTG9jYWxUeXBlVmFyaWFibGUgaW1wbGVtZW50cyBUeXBlVmFyaWFibGVFbnRpdHkgewogICBAb3ZlcnJpZGUKLSAgZmluYWwgRW50aXR5IHR5cGVEZWNsYXJhdGlvbjsKKyAgZmluYWwgS0xvY2FsRnVuY3Rpb24gdHlwZURlY2xhcmF0aW9uOwogICBAb3ZlcnJpZGUKICAgZmluYWwgU3RyaW5nIG5hbWU7CiAgIEBvdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlcm5lbF9pbXBhY3QuZGFydCBiL3BrZy9jb21waWxlci9saWIvc3JjL2tlcm5lbC9rZXJuZWxfaW1wYWN0LmRhcnQKaW5kZXggZTRjNTY5YS4uOTRkOTZhNiAxMDA2NDQKLS0tIGEvcGtnL2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2tlcm5lbF9pbXBhY3QuZGFydAorKysgYi9wa2cvY29tcGlsZXIvbGliL3NyYy9rZXJuZWwva2VybmVsX2ltcGFjdC5kYXJ0CkBAIC04MjAsMTIgKzgyMCw2IEBACiAKICAgQG92ZXJyaWRlCiAgIHZvaWQgcmVnaXN0ZXJTd2l0Y2hTdGF0ZW1lbnROb2RlKGlyLlN3aXRjaFN0YXRlbWVudCBub2RlKSB7Ci0gICAgLy8gVE9ETygzMjU1Nyk6IFJlbW92ZSB0aGlzIHdoZW4gaXNzdWUgMzI1NTcgaXMgZml4ZWQuCi0gICAgaXIuVHJlZU5vZGUgZmlyc3RDYXNlOwotICAgIERhcnRUeXBlIGZpcnN0Q2FzZVR5cGU7Ci0gICAgRGlhZ25vc3RpY01lc3NhZ2UgZXJyb3I7Ci0gICAgTGlzdDxEaWFnbm9zdGljTWVzc2FnZT4gaW5mb3MgPSA8RGlhZ25vc3RpY01lc3NhZ2U+W107Ci0KICAgICBib29sIG92ZXJyaWRlc0VxdWFscyhJbnRlcmZhY2VUeXBlIHR5cGUpIHsKICAgICAgIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLnN5bWJvbEltcGxlbWVudGF0aW9uVHlwZSkgewogICAgICAgICAvLyBUcmVhdCBzeW1ib2wgY29uc3RhbnRzIGFzIGlmIFN5bWJvbCBkb2Vzbid0IG92ZXJyaWRlIGA9PWAuCkBAIC04NTAsNTAgKzg0NCwyMyBAQAogICAgICAgICBDb25zdGFudFZhbHVlIHZhbHVlID0KICAgICAgICAgICAgIGVsZW1lbnRNYXAuZ2V0Q29uc3RhbnRWYWx1ZShzdGF0aWNUeXBlQ29udGV4dCwgZXhwcmVzc2lvbik7CiAgICAgICAgIERhcnRUeXBlIHR5cGUgPSB2YWx1ZS5nZXRUeXBlKGVsZW1lbnRNYXAuY29tbW9uRWxlbWVudHMpOwotICAgICAgICBpZiAoZmlyc3RDYXNlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgZmlyc3RDYXNlID0gZXhwcmVzc2lvbjsKLSAgICAgICAgICBmaXJzdENhc2VUeXBlID0gdHlwZTsKLQotICAgICAgICAgIC8vIFdlIG9ubHkgcmVwb3J0IHRoZSBiYWQgdHlwZSBvbiB0aGUgZmlyc3QgY2xhc3MgZWxlbWVudC4gQWxsIG90aGVycwotICAgICAgICAgIC8vIGdldCBhICJ0eXBlIGRpZmZlcnMiIGVycm9yLgotICAgICAgICAgIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUpIHsKLSAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShleHByZXNzaW9uKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTLAotICAgICAgICAgICAgICAgIHsndHlwZSc6ICJkb3VibGUifSk7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLmZ1bmN0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX0ZPUkJJRERFTiwgeyd0eXBlJzogIkZ1bmN0aW9uIn0pOwotICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXNPYmplY3QgJiYKLSAgICAgICAgICAgICAgdHlwZSAhPSBjb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbFR5cGUgJiYKLSAgICAgICAgICAgICAgb3ZlcnJpZGVzRXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZmlyc3RDYXNlKSwKLSAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTLAotICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGVUb1N0cmluZyh0eXBlKX0pOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAodHlwZSAhPSBmaXJzdENhc2VUeXBlKSB7Ci0gICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICBlcnJvciA9IHJlcG9ydGVyLmNyZWF0ZU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICBjb21wdXRlU291cmNlU3BhbkZyb21UcmVlTm9kZShub2RlKSwKLSAgICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTCwKLSAgICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGVUb1N0cmluZyhmaXJzdENhc2VUeXBlKX0pOwotICAgICAgICAgICAgICBpbmZvcy5hZGQocmVwb3J0ZXIuY3JlYXRlTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGZpcnN0Q2FzZSksCi0gICAgICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9UWVBFU19OT1RfRVFVQUxfQ0FTRSwKLSAgICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGVUb1N0cmluZyhmaXJzdENhc2VUeXBlKX0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZm9zLmFkZChyZXBvcnRlci5jcmVhdGVNZXNzYWdlKAotICAgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGV4cHJlc3Npb24pLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1RZUEVTX05PVF9FUVVBTF9DQVNFLAotICAgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGVUb1N0cmluZyh0eXBlKX0pKTsKLSAgICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IGNvbW1vbkVsZW1lbnRzLmRvdWJsZVR5cGUpIHsKKyAgICAgICAgICByZXBvcnRlci5yZXBvcnRFcnJvck1lc3NhZ2UoCisgICAgICAgICAgICAgIGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKGV4cHJlc3Npb24pLAorICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9WQUxVRV9PVkVSUklERVNfRVFVQUxTLAorICAgICAgICAgICAgICB7J3R5cGUnOiAiZG91YmxlIn0pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gY29tbW9uRWxlbWVudHMuZnVuY3Rpb25UeXBlKSB7CisgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0RXJyb3JNZXNzYWdlKGNvbXB1dGVTb3VyY2VTcGFuRnJvbVRyZWVOb2RlKG5vZGUpLAorICAgICAgICAgICAgICBNZXNzYWdlS2luZC5TV0lUQ0hfQ0FTRV9GT1JCSURERU4sIHsndHlwZSc6ICJGdW5jdGlvbiJ9KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc09iamVjdCAmJgorICAgICAgICAgICAgdHlwZSAhPSBjb21tb25FbGVtZW50cy50eXBlTGl0ZXJhbFR5cGUgJiYKKyAgICAgICAgICAgIG92ZXJyaWRlc0VxdWFscyh0eXBlKSkgeworICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydEVycm9yTWVzc2FnZSgKKyAgICAgICAgICAgICAgY29tcHV0ZVNvdXJjZVNwYW5Gcm9tVHJlZU5vZGUoZXhwcmVzc2lvbiksCisgICAgICAgICAgICAgIE1lc3NhZ2VLaW5kLlNXSVRDSF9DQVNFX1ZBTFVFX09WRVJSSURFU19FUVVBTFMsCisgICAgICAgICAgICAgIHsndHlwZSc6IHR5cGVUb1N0cmluZyh0eXBlKX0pOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICByZXBvcnRlci5yZXBvcnRFcnJvcihlcnJvciwgaW5mb3MpOwotICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL3Rlc3QvYW5hbHlzZXMvYXBpX2FsbG93ZWQuanNvbiBiL3BrZy9jb21waWxlci90ZXN0L2FuYWx5c2VzL2FwaV9hbGxvd2VkLmpzb24KaW5kZXggMjgwNGY0NS4uNzM3MjI0YiAxMDA2NDQKLS0tIGEvcGtnL2NvbXBpbGVyL3Rlc3QvYW5hbHlzZXMvYXBpX2FsbG93ZWQuanNvbgorKysgYi9wa2cvY29tcGlsZXIvdGVzdC9hbmFseXNlcy9hcGlfYWxsb3dlZC5qc29uCkBAIC01Niw3ICs1Niw3IEBACiAgICJvcmctZGFydGxhbmctc2RrOi8vL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvYXN5bmNfcGF0Y2guZGFydCI6IHsKICAgICAiRHluYW1pYyBpbnZvY2F0aW9uIG9mICctJy4iOiAxLAogICAgICJEeW5hbWljIGFjY2VzcyBvZiAnaXRlcmF0b3InLiI6IDEsCi0gICAgIkR5bmFtaWMgaW52b2NhdGlvbiBvZiAnY2FsbCcuIjogNCwKKyAgICAiRHluYW1pYyBpbnZvY2F0aW9uIG9mICdjYWxsJy4iOiAxLAogICAgICJEeW5hbWljIGludm9jYXRpb24gb2YgJ3RoZW4nLiI6IDEKICAgfSwKICAgIm9yZy1kYXJ0bGFuZy1zZGs6Ly8vbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9jb2xsZWN0aW9uX3BhdGNoLmRhcnQiOiB7CkBAIC0xOTgsNCArMTk4LDQgQEAKICAgIm9yZy1kYXJ0bGFuZy1zZGs6Ly8vbGliL19odHRwL3dlYnNvY2tldF9pbXBsLmRhcnQiOiB7CiAgICAgIkR5bmFtaWMgaW52b2NhdGlvbiBvZiAnZGFydC5faHR0cDo6X3RvSlNPTicuIjogMQogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvcGtnL2NvbXBpbGVyL3Rlc3QvcnRpL2RhdGEvbG9jYWxfZnVuY3Rpb25fZ2VuZXJpYy5kYXJ0IGIvcGtnL2NvbXBpbGVyL3Rlc3QvcnRpL2RhdGEvbG9jYWxfZnVuY3Rpb25fZ2VuZXJpYy5kYXJ0CmluZGV4IGU1OTFiYzIuLjJhMDhlN2MgMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlci90ZXN0L3J0aS9kYXRhL2xvY2FsX2Z1bmN0aW9uX2dlbmVyaWMuZGFydAorKysgYi9wa2cvY29tcGlsZXIvdGVzdC9ydGkvZGF0YS9sb2NhbF9mdW5jdGlvbl9nZW5lcmljLmRhcnQKQEAgLTgsNyArOCw3IEBACiAKIG1ldGhvZDEoKSB7CiAgIC8qc3BlYy5kaXJlY3QsZXhwbGljaXQ9W2xvY2FsLlQqXSxuZWVkc0FyZ3MsbmVlZHNTaWduYXR1cmUqLwotICAvKnByb2QubmVlZHNTaWduYXR1cmUqLworICAvKnByb2QubmVlZHNBcmdzLG5lZWRzU2lnbmF0dXJlKi8KICAgVCBsb2NhbDxUPihUIHQpID0+IHQ7CiAgIHJldHVybiBsb2NhbDsKIH0KZGlmZiAtLWdpdCBhL3BrZy9jb21waWxlci90ZXN0L3J0aS9kYXRhL2xvY2FsX2Z1bmN0aW9uX3NpZ25hdHVyZXNfZ2VuZXJpYy5kYXJ0IGIvcGtnL2NvbXBpbGVyL3Rlc3QvcnRpL2RhdGEvbG9jYWxfZnVuY3Rpb25fc2lnbmF0dXJlc19nZW5lcmljLmRhcnQKaW5kZXggYmU5ZDdiMi4uOTNiNjJlOCAxMDA2NDQKLS0tIGEvcGtnL2NvbXBpbGVyL3Rlc3QvcnRpL2RhdGEvbG9jYWxfZnVuY3Rpb25fc2lnbmF0dXJlc19nZW5lcmljLmRhcnQKKysrIGIvcGtnL2NvbXBpbGVyL3Rlc3QvcnRpL2RhdGEvbG9jYWxfZnVuY3Rpb25fc2lnbmF0dXJlc19nZW5lcmljLmRhcnQKQEAgLTgsNyArOCw3IEBACiAKIGNsYXNzIENsYXNzMSB7CiAgIG1ldGhvZDEoKSB7Ci0gICAgLypuZWVkc1NpZ25hdHVyZSovCisgICAgLypuZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICAgIG51bSBsb2NhbDxUPihudW0gbikgPT4gbnVsbDsKICAgICByZXR1cm4gbG9jYWw7CiAgIH0KQEAgLTE5LDcgKzE5LDcgQEAKICAgfQogCiAgIG1ldGhvZDMoKSB7Ci0gICAgLypuZWVkc1NpZ25hdHVyZSovCisgICAgLypuZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICAgIGludCBsb2NhbDxUPihudW0gbikgPT4gbnVsbDsKICAgICByZXR1cm4gbG9jYWw7CiAgIH0KQEAgLTc1LDEzICs3NSwxMyBAQAogCiBtZXRob2QxMCgpIHsKICAgLypzcGVjLmRpcmVjdCxleHBsaWNpdD1bbG9jYWwuVCpdLG5lZWRzQXJncyxuZWVkc0luc3Q9WzxkeW5hbWljPiw8bnVtKj4sPG51bSo+XSxuZWVkc1NpZ25hdHVyZSovCi0gIC8qcHJvZC5uZWVkc1NpZ25hdHVyZSovCisgIC8qcHJvZC5uZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICBudW0gbG9jYWw8VD4oVCBuKSA9PiBudWxsOwogICByZXR1cm4gbG9jYWw7CiB9CiAKIG1ldGhvZDExKCkgewotICAvKm5lZWRzU2lnbmF0dXJlKi8KKyAgLypuZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICBUIGxvY2FsPFQ+KG51bSBuKSA9PiBudWxsOwogICByZXR1cm4gbG9jYWw7CiB9CkBAIC05MywyMCArOTMsMjAgQEAKIH0KIAogbnVtIEZ1bmN0aW9uKG51bSkgbWV0aG9kMTMoKSB7Ci0gIC8qbmVlZHNTaWduYXR1cmUqLworICAvKm5lZWRzQXJncyxuZWVkc0luc3Q9WzxkeW5hbWljPiw8bnVtKj4sPG51bSo+XSxuZWVkc1NpZ25hdHVyZSovCiAgIG51bSBsb2NhbDxUPihudW0gbikgPT4gbnVsbDsKICAgcmV0dXJuIGxvY2FsOwogfQogCiBudW0gRnVuY3Rpb24obnVtKSBtZXRob2QxNCgpIHsKICAgLypzcGVjLmRpcmVjdCxleHBsaWNpdD1bbG9jYWwuVCpdLG5lZWRzQXJncyxuZWVkc0luc3Q9WzxkeW5hbWljPiw8bnVtKj4sPG51bSo+XSxuZWVkc1NpZ25hdHVyZSovCi0gIC8qcHJvZC5uZWVkc1NpZ25hdHVyZSovCisgIC8qcHJvZC5uZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICBudW0gbG9jYWw8VD4oVCBuKSA9PiBudWxsOwogICByZXR1cm4gbG9jYWw7CiB9CiAKIG51bSBGdW5jdGlvbihudW0pIG1ldGhvZDE1KCkgewotICAvKm5lZWRzU2lnbmF0dXJlKi8KKyAgLypuZWVkc0FyZ3MsbmVlZHNJbnN0PVs8ZHluYW1pYz4sPG51bSo+LDxudW0qPl0sbmVlZHNTaWduYXR1cmUqLwogICBUIGxvY2FsPFQ+KG51bSBuKSA9PiBudWxsOwogICByZXR1cm4gbG9jYWw7CiB9CmRpZmYgLS1naXQgYS9wa2cvY29tcGlsZXIvdG9vbC9tb2R1bGFyX3Rlc3Rfc3VpdGUuZGFydCBiL3BrZy9jb21waWxlci90b29sL21vZHVsYXJfdGVzdF9zdWl0ZS5kYXJ0CmluZGV4IGEzMThmZjEuLmViODk1M2IgMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlci90b29sL21vZHVsYXJfdGVzdF9zdWl0ZS5kYXJ0CisrKyBiL3BrZy9jb21waWxlci90b29sL21vZHVsYXJfdGVzdF9zdWl0ZS5kYXJ0CkBAIC0xNCwxMyArMTQsMjEgQEAKIGltcG9ydCAncGFja2FnZTptb2R1bGFyX3Rlc3Qvc3JjL3BpcGVsaW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1vZHVsYXJfdGVzdC9zcmMvc3VpdGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bW9kdWxhcl90ZXN0L3NyYy9ydW5uZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZV9jb25maWcuZGFydCc7CiAKK1N0cmluZyBwYWNrYWdlQ29uZmlnSnNvblBhdGggPSAiLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uIjsKIFVyaSBzZGtSb290ID0gUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoIi4uLy4uLy4uLyIpOworVXJpIHBhY2thZ2VDb25maWdVcmkgPSBzZGtSb290LnJlc29sdmUocGFja2FnZUNvbmZpZ0pzb25QYXRoKTsKIE9wdGlvbnMgX29wdGlvbnM7CiBTdHJpbmcgX2RhcnQyanNTY3JpcHQ7CiBTdHJpbmcgX2tlcm5lbFdvcmtlclNjcmlwdDsKKworLy8gVE9ETyhqb3NodWFsaXR0KTogRmlndXJlIG91dCBhIHdheSB0byBzdXBwb3J0IHBhY2thZ2UgY29uZmlncyBpbgorLy8gdGVzdHMvbW9kdWxhci4KK1BhY2thZ2VDb25maWcgX3BhY2thZ2VDb25maWc7CiBtYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CiAgIF9vcHRpb25zID0gT3B0aW9ucy5wYXJzZShhcmdzKTsKKyAgX3BhY2thZ2VDb25maWcgPSBhd2FpdCBsb2FkUGFja2FnZUNvbmZpZ1VyaShwYWNrYWdlQ29uZmlnVXJpKTsKICAgYXdhaXQgX3Jlc29sdmVTY3JpcHRzKCk7CiAgIGF3YWl0IHJ1blN1aXRlKAogICAgICAgc2RrUm9vdC5yZXNvbHZlKCd0ZXN0cy9tb2R1bGFyLycpLApAQCAtNDUsNiArNTMsMTcgQEAKIGNvbnN0IGpzSWQgPSBjb25zdCBEYXRhSWQoImpzIik7CiBjb25zdCB0eHRJZCA9IGNvbnN0IERhdGFJZCgidHh0Iik7CiAKK1N0cmluZyBfcGFja2FnZUNvbmZpZ0VudHJ5KFN0cmluZyBuYW1lLCBVcmkgcm9vdCwKKyAgICB7VXJpIHBhY2thZ2VSb290LCBMYW5ndWFnZVZlcnNpb24gdmVyc2lvbn0pIHsKKyAgdmFyIGZpZWxkcyA9IFsKKyAgICAnIm5hbWUiOiAiJHtuYW1lfSInLAorICAgICcicm9vdFVyaSI6ICIkcm9vdCInLAorICAgIGlmIChwYWNrYWdlUm9vdCAhPSBudWxsKSAnInBhY2thZ2VVcmkiOiAiJHBhY2thZ2VSb290IicsCisgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgJyJsYW5ndWFnZVZlcnNpb24iOiAiJHZlcnNpb24iJworICBdOworICByZXR1cm4gJ3ske2ZpZWxkcy5qb2luKCcsJyl9fSc7Cit9CisKIC8vIFN0ZXAgdGhhdCBjb21waWxlcyBzb3VyY2VzIGluIGEgbW9kdWxlIHRvIGEgLmRpbGwgZmlsZS4KIGNsYXNzIFNvdXJjZVRvRGlsbFN0ZXAgaW1wbGVtZW50cyBJT01vZHVsYXJTdGVwIHsKICAgQG92ZXJyaWRlCkBAIC04OCwzMSArMTA3LDU0IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgLy8gV2UgY3JlYXRlIGEgLnBhY2thZ2VzIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhpcyBtb2R1bGUgaWYKLSAgICAvLyBpdCBpcyBhIHBhY2thZ2UuICBUaGUgQ0ZFIHJlcXVpcmVzIHRoYXQgaWYgYSBgcGFja2FnZTpgIFVSSSBvZiBhCi0gICAgLy8gZGVwZW5kZW5jeSBpcyB1c2VkIGluIGFuIGltcG9ydCwgdGhlbiB3ZSBuZWVkIHRoYXQgcGFja2FnZSBlbnRyeSBpbiB0aGUKLSAgICAvLyAucGFja2FnZXMgZmlsZS4gSG93ZXZlciwgYWZ0ZXIgaXQgY2hlY2tzIHRoYXQgdGhlIGRlZmluaXRpb24gZXhpc3RzLCB0aGUKLSAgICAvLyBDRkUgd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZSByZXNvbHZlZCBVUkkgaWYgYSBsaWJyYXJ5IGZvciB0aGUgaW1wb3J0Ci0gICAgLy8gVVJJIGlzIGFscmVhZHkgZm91bmQgaW4gb25lIG9mIHRoZSBwcm92aWRlZCAuZGlsbCBmaWxlcyBvZiB0aGUKLSAgICAvLyBkZXBlbmRlbmNpZXMuIEZvciB0aGF0IHJlYXNvbiwgYW5kIHRvIGVuc3VyZSB0aGF0IGEgc3RlcCBvbmx5IGhhcyBhY2Nlc3MKLSAgICAvLyB0byB0aGUgZmlsZXMgcHJvdmlkZWQgaW4gYSBtb2R1bGUsIHdlIGdlbmVyYXRlIGEgLnBhY2thZ2VzIHdpdGggaW52YWxpZAotICAgIC8vIGZvbGRlcnMgZm9yIG90aGVyIHBhY2thZ2VzLgorICAgIC8vIFdlIGNyZWF0ZSBib3RoIGEgLnBhY2thZ2VzIGFuZCBwYWNrYWdlX2NvbmZpZy5qc29uIGZpbGUgd2hpY2ggZGVmaW5lcworICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGlzIG1vZHVsZSBpZiBpdCBpcyBhIHBhY2thZ2UuICBUaGUgQ0ZFIHJlcXVpcmVzIHRoYXQKKyAgICAvLyBpZiBhIGBwYWNrYWdlOmAgVVJJIG9mIGEgZGVwZW5kZW5jeSBpcyB1c2VkIGluIGFuIGltcG9ydCwgdGhlbiB3ZSBuZWVkCisgICAgLy8gdGhhdCBwYWNrYWdlIGVudHJ5IGluIHRoZSBhc3NvY2lhdGVkIGZpbGUuIEhvd2V2ZXIsIGFmdGVyIGl0IGNoZWNrcyB0aGF0CisgICAgLy8gdGhlIGRlZmluaXRpb24gZXhpc3RzLCB0aGUgQ0ZFIHdpbGwgbm90IGFjdHVhbGx5IHVzZSB0aGUgcmVzb2x2ZWQgVVJJIGlmCisgICAgLy8gYSBsaWJyYXJ5IGZvciB0aGUgaW1wb3J0IFVSSSBpcyBhbHJlYWR5IGZvdW5kIGluIG9uZSBvZiB0aGUgcHJvdmlkZQorICAgIC8vIC5kaWxsIGZpbGVzIG9mIHRoZSBkZXBlbmRlbmNpZXMuIEZvciB0aGF0IHJlYXNvbiwgYW5kIHRvIGVuc3VyZSB0aGF0CisgICAgLy8gYSBzdGVwIG9ubHkgaGFzIGFjY2VzcyB0byB0aGUgZmlsZXMgcHJvdmlkZWQgaW4gYSBtb2R1bGUsIHdlIGdlbmVyYXRlIGEKKyAgICAvLyBjb25maWcgZmlsZSB3aXRoIGludmFsaWQgZm9sZGVycyBmb3Igb3RoZXIgcGFja2FnZXMuCiAgICAgLy8gVE9ETyhzaWdtdW5kKTogZm9sbG93IHVwIHdpdGggdGhlIENGRSB0byBzZWUgaWYgd2UgY2FuIHJlbW92ZSB0aGUgbmVlZAotICAgIC8vIGZvciB0aGUgLnBhY2thZ2VzIGVudHJ5IGFsdG9nZXRoZXIgaWYgdGhleSB3b24ndCBuZWVkIHRvIHJlYWQgdGhlCi0gICAgLy8gc291cmNlcy4KKyAgICAvLyBmb3IgdGhlc2UgZHVtbXkgZW50cmllcy4uCisgICAgLy8gVE9ETyhqb3NodWFsaXR0KTogR2VuZXJhdGUganVzdCB0aGUganNvbiBmaWxlLgorICAgIHZhciBwYWNrYWdlc0pzb24gPSBbXTsKICAgICB2YXIgcGFja2FnZXNDb250ZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICBpZiAobW9kdWxlLmlzUGFja2FnZSkgewogICAgICAgcGFja2FnZXNDb250ZW50cy53cml0ZSgnJHttb2R1bGUubmFtZX06JHttb2R1bGUucGFja2FnZUJhc2V9XG4nKTsKKyAgICAgIHBhY2thZ2VzSnNvbi5hZGQoX3BhY2thZ2VDb25maWdFbnRyeSgKKyAgICAgICAgICBtb2R1bGUubmFtZSwgVXJpLnBhcnNlKCcuLi8ke21vZHVsZS5wYWNrYWdlQmFzZX0nKSkpOwogICAgIH0KKwogICAgIFNldDxNb2R1bGU+IHRyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBjb21wdXRlVHJhbnNpdGl2ZURlcGVuZGVuY2llcyhtb2R1bGUpOwogICAgIGludCB1bnVzZWROdW0gPSAwOwogICAgIGZvciAoTW9kdWxlIGRlcGVuZGVuY3kgaW4gdHJhbnNpdGl2ZURlcGVuZGVuY2llcykgewogICAgICAgaWYgKGRlcGVuZGVuY3kuaXNQYWNrYWdlKSB7CisgICAgICAgIC8vIHJvb3RVcmkgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGRlcGVuZGVudCBtb2R1bGVzLCBzbyB3ZSBwYXNzIGluIGEKKyAgICAgICAgLy8gYm9ndXMgdmFsdWUuCisgICAgICAgIHZhciByb290VXJpID0gVXJpLnBhcnNlKCd1bnVzZWQkdW51c2VkTnVtJyk7CiAgICAgICAgIHVudXNlZE51bSsrOwotICAgICAgICBwYWNrYWdlc0NvbnRlbnRzLndyaXRlKCcke2RlcGVuZGVuY3kubmFtZX06dW51c2VkJHVudXNlZE51bVxuJyk7CisKKyAgICAgICAgdmFyIGRlcGVuZGVudFBhY2thZ2UgPSBfcGFja2FnZUNvbmZpZ1tkZXBlbmRlbmN5Lm5hbWVdOworICAgICAgICB2YXIgcGFja2FnZUpzb24gPSBkZXBlbmRlbnRQYWNrYWdlID09IG51bGwKKyAgICAgICAgICAgID8gX3BhY2thZ2VDb25maWdFbnRyeShkZXBlbmRlbmN5Lm5hbWUsIHJvb3RVcmkpCisgICAgICAgICAgICA6IF9wYWNrYWdlQ29uZmlnRW50cnkoZGVwZW5kZW50UGFja2FnZS5uYW1lLCByb290VXJpLAorICAgICAgICAgICAgICAgIHZlcnNpb246IGRlcGVuZGVudFBhY2thZ2UubGFuZ3VhZ2VWZXJzaW9uKTsKKyAgICAgICAgcGFja2FnZXNKc29uLmFkZChwYWNrYWdlSnNvbik7CisgICAgICAgIHBhY2thZ2VzQ29udGVudHMud3JpdGUoJyR7ZGVwZW5kZW5jeS5uYW1lfTokcm9vdFVyaVxuJyk7CiAgICAgICB9CiAgICAgfQogCisgICAgaWYgKG1vZHVsZS5pc1BhY2thZ2UpIHsKKyAgICAgIGF3YWl0IEZpbGUuZnJvbVVyaShyb290LnJlc29sdmUocGFja2FnZUNvbmZpZ0pzb25QYXRoKSkKKyAgICAgICAgICAuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CisgICAgICBhd2FpdCBGaWxlLmZyb21Vcmkocm9vdC5yZXNvbHZlKHBhY2thZ2VDb25maWdKc29uUGF0aCkpLndyaXRlQXNTdHJpbmcoJ3snCisgICAgICAgICAgJyAgImNvbmZpZ1ZlcnNpb24iOiAke19wYWNrYWdlQ29uZmlnLnZlcnNpb259LCcKKyAgICAgICAgICAnICAicGFja2FnZXMiOiBbICR7cGFja2FnZXNKc29uLmpvaW4oJywnKX0gXScKKyAgICAgICAgICAnfScpOworICAgIH0KKwogICAgIGF3YWl0IEZpbGUuZnJvbVVyaShyb290LnJlc29sdmUoJy5wYWNrYWdlcycpKQogICAgICAgICAud3JpdGVBc1N0cmluZygnJHBhY2thZ2VzQ29udGVudHMnKTsKIApkaWZmIC0tZ2l0IGEvcGtnL2RhcnRkZXYvYmluL2RhcnRkZXYuZGFydCBiL3BrZy9kYXJ0ZGV2L2Jpbi9kYXJ0ZGV2LmRhcnQKaW5kZXggMTAzNWY0ZS4uMWEzMTRlNiAxMDA2NDQKLS0tIGEvcGtnL2RhcnRkZXYvYmluL2RhcnRkZXYuZGFydAorKysgYi9wa2cvZGFydGRldi9iaW4vZGFydGRldi5kYXJ0CkBAIC0yLDkgKzIsMTggQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQgJ2RhcnQ6aW8nOworCiBpbXBvcnQgJ3BhY2thZ2U6ZGFydGRldi9kYXJ0ZGV2LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnBlZGFudGljL3BlZGFudGljLmRhcnQnIHNob3cgdW5hd2FpdGVkOwogCiAvLy8gVGhlIGVudHJ5IHBvaW50IGZvciBkYXJ0ZGV2LgogRnV0dXJlPHZvaWQ+IG1haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgLy8gSWdub3JlIFNJR0lOVCB0byBlbnN1cmUgRGFydERldiBkb2Vzbid0IGV4aXQgYmVmb3JlIGFueSBvZiBpdHMKKyAgLy8gc3Bhd25lZCBjaGlsZHJlbi4gRHJhaW5pbmcgdGhlIHN0cmVhbSByZXR1cm5lZCBieSB3YXRjaCgpIGVmZmVjdGl2ZWx5CisgIC8vIHNlbmRzIHRoZSBzaWduYWxzIHRvIHRoZSB2b2lkLgorICAvLworICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzQyMDkyIGZvciBjb250ZXh0LgorICB1bmF3YWl0ZWQoUHJvY2Vzc1NpZ25hbC5zaWdpbnQud2F0Y2goKS5kcmFpbigpKTsKICAgYXdhaXQgcnVuRGFydGRldihhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9kYXJ0ZGV2LmRhcnQgYi9wa2cvZGFydGRldi9saWIvZGFydGRldi5kYXJ0CmluZGV4IGMxY2MyMjQuLjNkN2JiOWMgMTAwNjQ0Ci0tLSBhL3BrZy9kYXJ0ZGV2L2xpYi9kYXJ0ZGV2LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL2RhcnRkZXYuZGFydApAQCAtNCw2ICs0LDcgQEAKIAogaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKIAoraW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2FuYWx5c2lzL2V4cGVyaW1lbnRzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphcmdzL2NvbW1hbmRfcnVubmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmNsaV91dGlsL2NsaV9sb2dnaW5nLmRhcnQnOwpAQCAtMTksMTMgKzIwLDE0IEBACiBpbXBvcnQgJ3NyYy9jb21tYW5kcy9ydW4uZGFydCc7CiBpbXBvcnQgJ3NyYy9jb21tYW5kcy90ZXN0LmRhcnQnOwogaW1wb3J0ICdzcmMvY29yZS5kYXJ0JzsKK2ltcG9ydCAnc3JjL2V4cGVyaW1lbnRzLmRhcnQnOwogCiAvLy8gVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGZyb20gYmluLywgYnV0IGdpdmVuIHRoZSBsZW5ndGggb2YgdGhlIG1ldGhvZCBhbmQKIC8vLyBhbmFseXRpY3MgbG9naWMsIGl0IGhhcyBiZWVuIG1vdmVkIGhlcmUuIEFsc28gbm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbGxzCiAvLy8gW2lvLmV4aXQoY29kZSldIGRpcmVjdGx5LgogRnV0dXJlPHZvaWQ+IHJ1bkRhcnRkZXYoTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKICAgZmluYWwgc3RvcHdhdGNoID0gU3RvcHdhdGNoKCk7Ci0gIGR5bmFtaWMgcmVzdWx0OworICBpbnQgcmVzdWx0OwogCiAgIC8vIFRoZSBBbmFseXRpY3MgaW5zdGFuY2UgdXNlZCB0byByZXBvcnQgaW5mb3JtYXRpb24gYmFjayB0byBHb29nbGUgQW5hbHl0aWNzLAogICAvLyBzZWUgbGliL3NyYy9hbmFseXRpY3MuZGFydC4KQEAgLTEwNCw3ICsxMDYsNyBAQAogICAgIHN0b3B3YXRjaC5zdG9wKCk7CiAKICAgICAvLyBTZXQgdGhlIGV4aXRDb2RlLCBpZiBpdCB3YXNuJ3Qgc2V0IGluIHRoZSBjYXRjaCBibG9jayBhYm92ZS4KLSAgICBleGl0Q29kZSA/Pz0gcmVzdWx0IGlzIGludCA/IHJlc3VsdCA6IDA7CisgICAgZXhpdENvZGUgPz89IHJlc3VsdCA/PyAwOwogCiAgICAgLy8gU2VuZCBhbmFseXRpY3MgYmVmb3JlIGV4aXRpbmcKICAgICBpZiAoYW5hbHl0aWNzLmVuYWJsZWQpIHsKQEAgLTE0Myw3ICsxNDUsNyBAQAogICAgIGZpbmFsIGJvb2wgdmVyYm9zZSA9IGFyZ3MuY29udGFpbnMoJy12JykgfHwgYXJncy5jb250YWlucygnLS12ZXJib3NlJyk7CiAKICAgICBhcmdQYXJzZXIuYWRkRmxhZygndmVyYm9zZScsCi0gICAgICAgIGFiYnI6ICd2JywgbmVnYXRhYmxlOiBmYWxzZSwgaGVscDogJ1Nob3cgdmVyYm9zZSBvdXRwdXQuJyk7CisgICAgICAgIGFiYnI6ICd2JywgbmVnYXRhYmxlOiBmYWxzZSwgaGVscDogJ1Nob3cgYWRkaXRpb25hbCBjb21tYW5kIG91dHB1dC4nKTsKICAgICBhcmdQYXJzZXIuYWRkRmxhZygndmVyc2lvbicsCiAgICAgICAgIG5lZ2F0YWJsZTogZmFsc2UsIGhlbHA6ICdQcmludCB0aGUgRGFydCBTREsgdmVyc2lvbi4nKTsKICAgICBhcmdQYXJzZXIuYWRkRmxhZygnZW5hYmxlLWFuYWx5dGljcycsCkBAIC0xNTEsOCArMTUzLDEwIEBACiAgICAgYXJnUGFyc2VyLmFkZEZsYWcoJ2Rpc2FibGUtYW5hbHl0aWNzJywKICAgICAgICAgbmVnYXRhYmxlOiBmYWxzZSwgaGVscDogJ0Rpc2FibGUgYW5vbnltb3VzIGFuYWx5dGljcy4nKTsKIAotICAgIC8vIFRPRE8oandyZW4pOiBob29rIHVwLgotICAgIGFyZ1BhcnNlci5hZGRNdWx0aU9wdGlvbignZW5hYmxlLWV4cGVyaW1lbnQnLCBoaWRlOiB0cnVlKTsKKyAgICBhZGRFeHBlcmltZW50YWxGbGFncyhhcmdQYXJzZXIsIHZlcmJvc2UpOworCisgICAgYXJnUGFyc2VyLmFkZEZsYWcoJ2RpYWdub3N0aWNzJywKKyAgICAgICAgbmVnYXRhYmxlOiBmYWxzZSwgaGVscDogJ1Nob3cgdG9vbCBkaWFnbm9zdGljIG91dHB1dC4nLCBoaWRlOiAhdmVyYm9zZSk7CiAKICAgICAvLyBBIGhpZGRlbiBmbGFnIHRvIGRpc2FibGUgYW5hbHl0aWNzIG9uIHRoaXMgcnVuLCB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZQogICAgIC8vIGNhbGxlZCB3aXRoIHRoaXMgZmxhZywgYnV0IHNob3VsZCBiZSByZW1vdmVkIGJlZm9yZSBydW4oKSBpcyBjYWxsZWQgYXMKQEAgLTE2MiwxNCArMTY2LDE0IEBACiAgICAgICAgIGhlbHA6ICdEaXNhYmxlIGFub255bW91cyBhbmFseXRpY3MgZm9yIHRoaXMgYGRhcnQgKmAgcnVuJywKICAgICAgICAgaGlkZTogdHJ1ZSk7CiAKLSAgICBhZGRDb21tYW5kKEFuYWx5emVDb21tYW5kKHZlcmJvc2U6IHZlcmJvc2UpKTsKKyAgICBhZGRDb21tYW5kKEFuYWx5emVDb21tYW5kKCkpOwogICAgIGFkZENvbW1hbmQoQ3JlYXRlQ29tbWFuZCh2ZXJib3NlOiB2ZXJib3NlKSk7Ci0gICAgYWRkQ29tbWFuZChDb21waWxlQ29tbWFuZCh2ZXJib3NlOiB2ZXJib3NlKSk7Ci0gICAgYWRkQ29tbWFuZChGb3JtYXRDb21tYW5kKHZlcmJvc2U6IHZlcmJvc2UpKTsKKyAgICBhZGRDb21tYW5kKENvbXBpbGVDb21tYW5kKCkpOworICAgIGFkZENvbW1hbmQoRm9ybWF0Q29tbWFuZCgpKTsKICAgICBhZGRDb21tYW5kKE1pZ3JhdGVDb21tYW5kKHZlcmJvc2U6IHZlcmJvc2UpKTsKLSAgICBhZGRDb21tYW5kKFB1YkNvbW1hbmQodmVyYm9zZTogdmVyYm9zZSkpOwotICAgIGFkZENvbW1hbmQoUnVuQ29tbWFuZCh2ZXJib3NlOiB2ZXJib3NlKSk7Ci0gICAgYWRkQ29tbWFuZChUZXN0Q29tbWFuZCh2ZXJib3NlOiB2ZXJib3NlKSk7CisgICAgYWRkQ29tbWFuZChQdWJDb21tYW5kKCkpOworICAgIGFkZENvbW1hbmQoUnVuQ29tbWFuZCgpKTsKKyAgICBhZGRDb21tYW5kKFRlc3RDb21tYW5kKCkpOwogICB9CiAKICAgQG92ZXJyaWRlCkBAIC0xNzksNiArMTgzLDcgQEAKICAgQG92ZXJyaWRlCiAgIEZ1dHVyZTxpbnQ+IHJ1bkNvbW1hbmQoQXJnUmVzdWx0cyB0b3BMZXZlbFJlc3VsdHMpIGFzeW5jIHsKICAgICBhc3NlcnQoIXRvcExldmVsUmVzdWx0cy5hcmd1bWVudHMuY29udGFpbnMoJy0tZGlzYWJsZS1kYXJ0ZGV2LWFuYWx5dGljcycpKTsKKwogICAgIGlmICh0b3BMZXZlbFJlc3VsdHMuY29tbWFuZCA9PSBudWxsICYmCiAgICAgICAgIHRvcExldmVsUmVzdWx0cy5hcmd1bWVudHMuaXNOb3RFbXB0eSkgewogICAgICAgZmluYWwgZmlyc3RBcmcgPSB0b3BMZXZlbFJlc3VsdHMuYXJndW1lbnRzLmZpcnN0OwpAQCAtMTkwLDExICsxOTUsNDUgQEAKICAgICAgICAgaW8uZXhpdCgyNTQpOwogICAgICAgfQogICAgIH0KLSAgICBpc1ZlcmJvc2UgPSB0b3BMZXZlbFJlc3VsdHNbJ3ZlcmJvc2UnXTsKKworICAgIGlzRGlhZ25vc3RpY3MgPSB0b3BMZXZlbFJlc3VsdHNbJ2RpYWdub3N0aWNzJ107CiAKICAgICBmaW5hbCBBbnNpIGFuc2kgPSBBbnNpKEFuc2kudGVybWluYWxTdXBwb3J0c0Fuc2kpOwotICAgIGxvZyA9IGlzVmVyYm9zZSA/IExvZ2dlci52ZXJib3NlKGFuc2k6IGFuc2kpIDogTG9nZ2VyLnN0YW5kYXJkKGFuc2k6IGFuc2kpOworICAgIGxvZyA9IGlzRGlhZ25vc3RpY3MKKyAgICAgICAgPyBMb2dnZXIudmVyYm9zZShhbnNpOiBhbnNpKQorICAgICAgICA6IExvZ2dlci5zdGFuZGFyZChhbnNpOiBhbnNpKTsKKworICAgIGlmICh0b3BMZXZlbFJlc3VsdHMud2FzUGFyc2VkKGV4cGVyaW1lbnRGbGFnTmFtZSkpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBleHBlcmltZW50SWRzID0gdG9wTGV2ZWxSZXN1bHRzW2V4cGVyaW1lbnRGbGFnTmFtZV07CisgICAgICBmb3IgKEV4cGVyaW1lbnRhbEZlYXR1cmUgZmVhdHVyZSBpbiBleHBlcmltZW50YWxGZWF0dXJlcykgeworICAgICAgICAvLyBXZSBhbGxvdyBkZWZhdWx0IHRydWUgZmxhZ3MsIGJ1dCBjb21wbGFpbiB3aGVuIHRoZXkgYXJlIHBhc3NlZCBpbi4KKyAgICAgICAgaWYgKGZlYXR1cmUuaXNFbmFibGVkQnlEZWZhdWx0ICYmCisgICAgICAgICAgICBleHBlcmltZW50SWRzLmNvbnRhaW5zKGZlYXR1cmUuZW5hYmxlU3RyaW5nKSkgeworICAgICAgICAgIHByaW50KCInJHtmZWF0dXJlLmVuYWJsZVN0cmluZ30nIGlzIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoaXMgIgorICAgICAgICAgICAgICAnZmxhZyBpcyBubyBsb25nZXIgcmVxdWlyZWQuJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gYXdhaXQgc3VwZXIucnVuQ29tbWFuZCh0b3BMZXZlbFJlc3VsdHMpOwogICB9CisKKyAgdm9pZCBhZGRFeHBlcmltZW50YWxGbGFncyhBcmdQYXJzZXIgYXJnUGFyc2VyLCBib29sIHZlcmJvc2UpIHsKKyAgICBMaXN0PEV4cGVyaW1lbnRhbEZlYXR1cmU+IGZlYXR1cmVzID0gZXhwZXJpbWVudGFsRmVhdHVyZXM7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFsbG93ZWRIZWxwID0ge307CisgICAgZm9yIChFeHBlcmltZW50YWxGZWF0dXJlIGZlYXR1cmUgaW4gZmVhdHVyZXMpIHsKKyAgICAgIFN0cmluZyBzdWZmaXggPQorICAgICAgICAgIGZlYXR1cmUuaXNFbmFibGVkQnlEZWZhdWx0ID8gJyAobm8tb3AgLSBlbmFibGVkIGJ5IGRlZmF1bHQpJyA6ICcnOworICAgICAgYWxsb3dlZEhlbHBbZmVhdHVyZS5lbmFibGVTdHJpbmddID0gJyR7ZmVhdHVyZS5kb2N1bWVudGF0aW9ufSRzdWZmaXgnOworICAgIH0KKworICAgIGFyZ1BhcnNlci5hZGRNdWx0aU9wdGlvbigKKyAgICAgIGV4cGVyaW1lbnRGbGFnTmFtZSwKKyAgICAgIHZhbHVlSGVscDogJ2V4cGVyaW1lbnQnLAorICAgICAgYWxsb3dlZDogZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiBmZWF0dXJlLmVuYWJsZVN0cmluZyksCisgICAgICBhbGxvd2VkSGVscDogdmVyYm9zZSA/IGFsbG93ZWRIZWxwIDogbnVsbCwKKyAgICAgIGhlbHA6ICdFbmFibGUgb25lIG9yIG1vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmVzLicsCisgICAgKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9hbmFseXplLmRhcnQgYi9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2FuYWx5emUuZGFydAppbmRleCBjY2Y5YTU3Li41N2Q4M2E1IDEwMDY0NAotLS0gYS9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2FuYWx5emUuZGFydAorKysgYi9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2FuYWx5emUuZGFydApAQCAtMTIsOSArMTIsMTAgQEAKIGltcG9ydCAnLi4vdXRpbHMuZGFydCc7CiBpbXBvcnQgJ2FuYWx5emVfaW1wbC5kYXJ0JzsKIAorLy8gVE9ETzogU3VwcG9ydCBlbmFibGUtZXhwZXJpbWVudCBmb3IgJ2RhcnQgYW5hbHl6ZScuCisKIGNsYXNzIEFuYWx5emVDb21tYW5kIGV4dGVuZHMgRGFydGRldkNvbW1hbmQ8aW50PiB7Ci0gIEFuYWx5emVDb21tYW5kKHtib29sIHZlcmJvc2UgPSBmYWxzZX0pCi0gICAgICA6IHN1cGVyKCdhbmFseXplJywgIkFuYWx5emUgdGhlIHByb2plY3QncyBEYXJ0IGNvZGUuIikgeworICBBbmFseXplQ29tbWFuZCgpIDogc3VwZXIoJ2FuYWx5emUnLCAiQW5hbHl6ZSB0aGUgcHJvamVjdCdzIERhcnQgY29kZS4iKSB7CiAgICAgYXJnUGFyc2VyCiAgICAgICAuLmFkZEZsYWcoJ2ZhdGFsLWluZm9zJywKICAgICAgICAgICBoZWxwOiAnVHJlYXQgaW5mbyBsZXZlbCBpc3N1ZXMgYXMgZmF0YWwuJywgbmVnYXRhYmxlOiBmYWxzZSkKQEAgLTEwMiw2ICsxMDMsMjAgQEAKICAgICAgICAgICAnKCR7ZXJyb3IuY29kZX0pJywKICAgICAgICAgKTsKIAorICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgIHZhciBwYWRkaW5nID0gJyAnLnBhZExlZnQoZXJyb3Iuc2V2ZXJpdHkubGVuZ3RoICsgMik7CisgICAgICAgICAgZm9yICh2YXIgbWVzc2FnZSBpbiBlcnJvci5jb250ZXh0TWVzc2FnZXMpIHsKKyAgICAgICAgICAgIGxvZy5zdGRvdXQoJyRwYWRkaW5nJHttZXNzYWdlLm1lc3NhZ2V9ICcKKyAgICAgICAgICAgICAgICAnYXQgJHttZXNzYWdlLmZpbGVQYXRofToke21lc3NhZ2UubGluZX06JHttZXNzYWdlLmNvbHVtbn0nKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGVycm9yLmNvcnJlY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLnN0ZG91dCgnJHBhZGRpbmcke2Vycm9yLmNvcnJlY3Rpb259Jyk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChlcnJvci51cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLnN0ZG91dCgnJHBhZGRpbmcke2Vycm9yLnVybH0nKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBoYXNFcnJvcnMgfD0gZXJyb3IuaXNFcnJvcjsKICAgICAgICAgaGFzV2FybmluZ3MgfD0gZXJyb3IuaXNXYXJuaW5nOwogICAgICAgICBoYXNJbmZvcyB8PSBlcnJvci5pc0luZm87CmRpZmYgLS1naXQgYS9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2FuYWx5emVfaW1wbC5kYXJ0IGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9hbmFseXplX2ltcGwuZGFydAppbmRleCA3NmUxZmNiLi4wOTE4ODY0IDEwMDY0NAotLS0gYS9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2FuYWx5emVfaW1wbC5kYXJ0CisrKyBiL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvYW5hbHl6ZV9pbXBsLmRhcnQKQEAgLTQ1LDcgKzQ1LDYgQEAKICAgICAgIHNka1BhdGgucGF0aCwKICAgICBdOwogCi0gICAgbG9nLnRyYWNlKCdkYXJ0ICR7Y29tbWFuZC5qb2luKCcgJyl9Jyk7CiAgICAgX3Byb2Nlc3MgPSBhd2FpdCBzdGFydFByb2Nlc3Moc2RrLmRhcnQsIGNvbW1hbmQpOwogICAgIC8vIFRoaXMgY2FsbGJhY2sgaG9va3VwIGNhbid0IHRocm93LgogICAgIC8vaWdub3JlOiB1bmF3YWl0ZWRfZnV0dXJlcwpAQCAtMjA0LDYgKzIwMyw4IEBACiAKICAgU3RyaW5nIGdldCBjb2RlID0+IGpzb25bJ2NvZGUnXSBhcyBTdHJpbmc7CiAKKyAgU3RyaW5nIGdldCBjb3JyZWN0aW9uID0+IGpzb25bJ2NvcnJlY3Rpb24nXSBhcyBTdHJpbmc7CisKICAgU3RyaW5nIGdldCBmaWxlID0+IGpzb25bJ2xvY2F0aW9uJ11bJ2ZpbGUnXSBhcyBTdHJpbmc7CiAKICAgaW50IGdldCBzdGFydExpbmUgPT4ganNvblsnbG9jYXRpb24nXVsnc3RhcnRMaW5lJ10gYXMgaW50OwpAQCAtMjE0LDYgKzIxNSwxMyBAQAogCiAgIFN0cmluZyBnZXQgbWVzc2FnZVNlbnRlbmNlRnJhZ21lbnQgPT4gdHJpbUVuZChtZXNzYWdlLCAnLicpOwogCisgIFN0cmluZyBnZXQgdXJsID0+IGpzb25bJ3VybCddIGFzIFN0cmluZzsKKworICBMaXN0PERpYWdub3N0aWNNZXNzYWdlPiBnZXQgY29udGV4dE1lc3NhZ2VzIHsKKyAgICB2YXIgbWVzc2FnZXMgPSBqc29uWydjb250ZXh0TWVzc2FnZXMnXSBhcyBMaXN0PGR5bmFtaWM+OworICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2UpKS50b0xpc3QoKTsKKyAgfQorCiAgIC8vIFRPRE8oandyZW4pIGFkZCBzb21lIHRlc3RzIHRvIHZlcmlmeSB0aGF0IHRoZSByZXN1bHRzIGFyZSB3aGF0IHdlIGFyZQogICAvLyAgZXhwZWN0aW5nLCAnb3RoZXInIGlzIG5vdCBhbHdheXMgb24gdGhlIFJIUyBvZiB0aGUgc3VidHJhY3Rpb24gaW4gdGhlCiAgIC8vICBpbXBsZW1lbnRhdGlvbi4KQEAgLTI0Miw2ICsyNTAsMjAgQEAKICAgICAgICcoJGNvZGUpJzsKIH0KIAorY2xhc3MgRGlhZ25vc3RpY01lc3NhZ2UgeworICBmaW5hbCBNYXA8U3RyaW5nLCBkeW5hbWljPiBqc29uOworCisgIERpYWdub3N0aWNNZXNzYWdlKHRoaXMuanNvbik7CisKKyAgaW50IGdldCBjb2x1bW4gPT4ganNvblsnbG9jYXRpb24nXVsnc3RhcnRDb2x1bW4nXSBhcyBpbnQ7CisKKyAgU3RyaW5nIGdldCBmaWxlUGF0aCA9PiBqc29uWydsb2NhdGlvbiddWydmaWxlJ10gYXMgU3RyaW5nOworCisgIGludCBnZXQgbGluZSA9PiBqc29uWydsb2NhdGlvbiddWydzdGFydExpbmUnXSBhcyBpbnQ7CisKKyAgU3RyaW5nIGdldCBtZXNzYWdlID0+IGpzb25bJ21lc3NhZ2UnXSBhcyBTdHJpbmc7Cit9CisKIGNsYXNzIEZpbGVBbmFseXNpc0Vycm9ycyB7CiAgIGZpbmFsIFN0cmluZyBmaWxlOwogICBmaW5hbCBMaXN0PEFuYWx5c2lzRXJyb3I+IGVycm9yczsKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvY29tcGlsZS5kYXJ0IGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9jb21waWxlLmRhcnQKaW5kZXggMDI1ZDVjNi4uZDc5MjY1YiAxMDA2NDQKLS0tIGEvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9jb21waWxlLmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9jb21waWxlLmRhcnQKQEAgLTE4LDYgKzE4LDcgQEAKICAgZmluYWwgU3RyaW5nIGZsYWc7CiAgIGZpbmFsIFN0cmluZyBoZWxwOwogICBmaW5hbCBTdHJpbmcgYWJicjsKKwogICBPcHRpb24oe3RoaXMuZmxhZywgdGhpcy5oZWxwLCB0aGlzLmFiYnJ9KTsKIH0KIApAQCAtNDQsMTAgKzQ1LDcgQEAKIH0KIAogY2xhc3MgQ29tcGlsZUpTQ29tbWFuZCBleHRlbmRzIERhcnRkZXZDb21tYW5kPGludD4gewotICBib29sIHZlcmJvc2UgPSBmYWxzZTsKLSAgQ29tcGlsZUpTQ29tbWFuZCh7Ci0gICAgdGhpcy52ZXJib3NlLAotICB9KSA6IHN1cGVyKCdqcycsICdDb21waWxlIERhcnQgdG8gSmF2YVNjcmlwdCcpIHsKKyAgQ29tcGlsZUpTQ29tbWFuZCgpIDogc3VwZXIoJ2pzJywgJ0NvbXBpbGUgRGFydCB0byBKYXZhU2NyaXB0JykgewogICAgIGFyZ1BhcnNlcgogICAgICAgLi5hZGRPcHRpb24oCiAgICAgICAgIGNvbW1vbk9wdGlvbnNbJ291dHB1dEZpbGUnXS5mbGFnLApAQCAtODUsMTQgKzgzLDEyIEBACiB9CiAKIGNsYXNzIENvbXBpbGVTbmFwc2hvdENvbW1hbmQgZXh0ZW5kcyBEYXJ0ZGV2Q29tbWFuZDxpbnQ+IHsKLSAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAgIGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZTsKICAgZmluYWwgU3RyaW5nIGhlbHA7CiAgIGZpbmFsIFN0cmluZyBmaWxlRXh0OwogICBmaW5hbCBTdHJpbmcgZm9ybWF0TmFtZTsKIAogICBDb21waWxlU25hcHNob3RDb21tYW5kKHsKLSAgICB0aGlzLnZlcmJvc2UsCiAgICAgdGhpcy5jb21tYW5kTmFtZSwKICAgICB0aGlzLmhlbHAsCiAgICAgdGhpcy5maWxlRXh0LApAQCAtMTQ2LDEzICsxNDIsMTEgQEAKIH0KIAogY2xhc3MgQ29tcGlsZU5hdGl2ZUNvbW1hbmQgZXh0ZW5kcyBEYXJ0ZGV2Q29tbWFuZDxpbnQ+IHsKLSAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAgIGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZTsKICAgZmluYWwgU3RyaW5nIGZvcm1hdDsKICAgZmluYWwgU3RyaW5nIGhlbHA7CiAKICAgQ29tcGlsZU5hdGl2ZUNvbW1hbmQoewotICAgIHRoaXMudmVyYm9zZSwKICAgICB0aGlzLmNvbW1hbmROYW1lLAogICAgIHRoaXMuZm9ybWF0LAogICAgIHRoaXMuaGVscCwKQEAgLTIxNiwyOSArMjEwLDI3IEBACiBjbGFzcyBDb21waWxlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewogICBAb3ZlcnJpZGUKICAgU3RyaW5nIGdldCBkZXNjcmlwdGlvbiA9PiAnQ29tcGlsZSBEYXJ0IHRvIHZhcmlvdXMgZm9ybWF0cy4nOworCiAgIEBvdmVycmlkZQogICBTdHJpbmcgZ2V0IG5hbWUgPT4gJ2NvbXBpbGUnOwogCi0gIENvbXBpbGVDb21tYW5kKHtib29sIHZlcmJvc2UgPSBmYWxzZX0pIHsKKyAgQ29tcGlsZUNvbW1hbmQoKSB7CiAgICAgYWRkU3ViY29tbWFuZChDb21waWxlSlNDb21tYW5kKCkpOwogICAgIGFkZFN1YmNvbW1hbmQoQ29tcGlsZVNuYXBzaG90Q29tbWFuZCgKICAgICAgIGNvbW1hbmROYW1lOiAnaml0LXNuYXBzaG90JywKICAgICAgIGhlbHA6ICd0byBhIEpJVCBzbmFwc2hvdCcsCiAgICAgICBmaWxlRXh0OiAnaml0JywKICAgICAgIGZvcm1hdE5hbWU6ICdhcHAtaml0JywKLSAgICAgIHZlcmJvc2U6IHZlcmJvc2UsCiAgICAgKSk7CiAgICAgYWRkU3ViY29tbWFuZChDb21waWxlTmF0aXZlQ29tbWFuZCgKICAgICAgIGNvbW1hbmROYW1lOiAnZXhlJywKICAgICAgIGhlbHA6ICd0byBhIHNlbGYtY29udGFpbmVkIGV4ZWN1dGFibGUnLAogICAgICAgZm9ybWF0OiAnZXhlJywKLSAgICAgIHZlcmJvc2U6IHZlcmJvc2UsCiAgICAgKSk7CiAgICAgYWRkU3ViY29tbWFuZChDb21waWxlTmF0aXZlQ29tbWFuZCgKICAgICAgIGNvbW1hbmROYW1lOiAnYW90LXNuYXBzaG90JywKICAgICAgIGhlbHA6ICd0byBhbiBBT1Qgc25hcHNob3QnLAogICAgICAgZm9ybWF0OiAnYW90JywKLSAgICAgIHZlcmJvc2U6IHZlcmJvc2UsCiAgICAgKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvZm9ybWF0LmRhcnQgYi9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL2Zvcm1hdC5kYXJ0CmluZGV4IGM4MTJlZTEuLmMxZGZjNjAgMTAwNjQ0Ci0tLSBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvZm9ybWF0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9mb3JtYXQuZGFydApAQCAtOCw4ICs4LDcgQEAKIGltcG9ydCAnLi4vc2RrLmRhcnQnOwogCiBjbGFzcyBGb3JtYXRDb21tYW5kIGV4dGVuZHMgRGFydGRldkNvbW1hbmQgewotICBGb3JtYXRDb21tYW5kKHtib29sIHZlcmJvc2UgPSBmYWxzZX0pCi0gICAgICA6IHN1cGVyKCdmb3JtYXQnLCAnRm9ybWF0IERhcnQgc291cmNlIGNvZGUuJykgeworICBGb3JtYXRDb21tYW5kKCkgOiBzdXBlcignZm9ybWF0JywgJ0Zvcm1hdCBEYXJ0IHNvdXJjZSBjb2RlLicpIHsKICAgICAvLyBUT0RPKGp3cmVuKSBXaGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvZGFydF9zdHlsZS9pc3N1ZXMvODg5CiAgICAgLy8gIGlzIHJlc29sdmVkLCBoYXZlIGRhcnRfc3R5bGUgcHJvdmlkZSB0aGUgQXJnUGFyc2VyLCBpbnN0ZWFkIG9mIGNyZWF0aW5nCiAgICAgLy8gb25lIGhlcmUuCmRpZmYgLS1naXQgYS9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL3B1Yi5kYXJ0IGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9wdWIuZGFydAppbmRleCAwMDE5Njk2Li5jMDYyZWI2IDEwMDY0NAotLS0gYS9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL3B1Yi5kYXJ0CisrKyBiL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvcHViLmRhcnQKQEAgLTgsMTAgKzgsMTEgQEAKIGltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CiAKIGltcG9ydCAnLi4vY29yZS5kYXJ0JzsKK2ltcG9ydCAnLi4vZXhwZXJpbWVudHMuZGFydCc7CiBpbXBvcnQgJy4uL3Nkay5kYXJ0JzsKIAogY2xhc3MgUHViQ29tbWFuZCBleHRlbmRzIERhcnRkZXZDb21tYW5kPGludD4gewotICBQdWJDb21tYW5kKHtib29sIHZlcmJvc2UgPSBmYWxzZX0pIDogc3VwZXIoJ3B1YicsICdXb3JrIHdpdGggcGFja2FnZXMuJyk7CisgIFB1YkNvbW1hbmQoKSA6IHN1cGVyKCdwdWInLCAnV29yayB3aXRoIHBhY2thZ2VzLicpOwogCiAgIEBvdmVycmlkZQogICBmaW5hbCBBcmdQYXJzZXIgYXJnUGFyc2VyID0gQXJnUGFyc2VyLmFsbG93QW55dGhpbmcoKTsKQEAgLTQyLDcgKzQzLDI2IEBACiAgIEBvdmVycmlkZQogICBGdXR1cmVPcjxpbnQ+IHJ1bigpIGFzeW5jIHsKICAgICBmaW5hbCBjb21tYW5kID0gc2RrLnB1YjsKLSAgICBmaW5hbCBhcmdzID0gYXJnUmVzdWx0cy5hcmd1bWVudHM7CisgICAgdmFyIGFyZ3MgPSBhcmdSZXN1bHRzLmFyZ3VtZW50czsKKworICAgIC8vIFBhc3MgYW55IC0tZW5hYmxlLWV4cGVyaW1lbnQgb3B0aW9ucyBhbG9uZy4KKyAgICBpZiAoYXJncy5pc05vdEVtcHR5ICYmIHdlcmVFeHBlcmltZW50c1NwZWNpZmllZCkgeworICAgICAgTGlzdDxTdHJpbmc+IGV4cGVyaW1lbnRJZHMgPSBzcGVjaWZpZWRFeHBlcmltZW50czsKKworICAgICAgaWYgKGFyZ3MuZmlyc3QgPT0gJ3J1bicpIHsKKyAgICAgICAgYXJncyA9IFsKKyAgICAgICAgICAuLi5hcmdzLnN1Ymxpc3QoMCwgMSksCisgICAgICAgICAgJy0tJGV4cGVyaW1lbnRGbGFnTmFtZT0ke2V4cGVyaW1lbnRJZHMuam9pbignLCcpfScsCisgICAgICAgICAgLi4uYXJncy5zdWJsaXN0KDEpLAorICAgICAgICBdOworICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+IDEgJiYgYXJnc1swXSA9PSAnZ2xvYmFsJyAmJiBhcmdzWzBdID09ICdydW4nKSB7CisgICAgICAgIGFyZ3MgPSBbCisgICAgICAgICAgLi4uYXJncy5zdWJsaXN0KDAsIDIpLAorICAgICAgICAgICctLSRleHBlcmltZW50RmxhZ05hbWU9JHtleHBlcmltZW50SWRzLmpvaW4oJywnKX0nLAorICAgICAgICAgIC4uLmFyZ3Muc3VibGlzdCgyKSwKKyAgICAgICAgXTsKKyAgICAgIH0KKyAgICB9CiAKICAgICBsb2cudHJhY2UoJyRjb21tYW5kICR7YXJncy5qb2luKCcgJyl9Jyk7CiAKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvcnVuLmRhcnQgYi9wa2cvZGFydGRldi9saWIvc3JjL2NvbW1hbmRzL3J1bi5kYXJ0CmluZGV4IDc0OTZhMmEuLjZiYTc2ZTAgMTAwNjQ0Ci0tLSBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvcnVuLmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy9ydW4uZGFydApAQCAtMTEsMTIgKzExLDE1IEBACiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnOwogCiBpbXBvcnQgJy4uL2NvcmUuZGFydCc7CitpbXBvcnQgJy4uL2V4cGVyaW1lbnRzLmRhcnQnOwogaW1wb3J0ICcuLi9zZGsuZGFydCc7CiBpbXBvcnQgJy4uL3V0aWxzLmRhcnQnOwogCiBjbGFzcyBSdW5Db21tYW5kIGV4dGVuZHMgRGFydGRldkNvbW1hbmQ8aW50PiB7CiAgIEBvdmVycmlkZQogICBmaW5hbCBBcmdQYXJzZXIgYXJnUGFyc2VyID0gQXJnUGFyc2VyLmFsbG93QW55dGhpbmcoKTsKKworICBAb3ZlcnJpZGUKICAgZmluYWwgYm9vbCB2ZXJib3NlOwogCiAgIFJ1bkNvbW1hbmQoe3RoaXMudmVyYm9zZSA9IGZhbHNlfSkgOiBzdXBlcigncnVuJywgJycnCkBAIC01NSw3ICs1OCw3IEBACiAgIEBvdmVycmlkZQogICBGdXR1cmVPcjxpbnQ+IHJ1bigpIGFzeW5jIHsKICAgICAvLyBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhZnRlciAncnVuJwotICAgIGZpbmFsIGFyZ3MgPSBhcmdSZXN1bHRzLmFyZ3VtZW50cy50b0xpc3QoKTsKKyAgICB2YXIgYXJncyA9IGFyZ1Jlc3VsdHMuYXJndW1lbnRzLnRvTGlzdCgpOwogCiAgICAgdmFyIGFyZ3NDb250YWluRmlsZU9ySGVscCA9IGZhbHNlOwogICAgIGZvciAodmFyIGFyZyBpbiBhcmdzKSB7CkBAIC03MCw2ICs3Myw3IEBACiAgICAgfQogCiAgICAgZmluYWwgY3dkID0gRGlyZWN0b3J5LmN1cnJlbnQ7CisKICAgICBpZiAoIWFyZ3NDb250YWluRmlsZU9ySGVscCAmJiBjd2QuZXhpc3RzU3luYygpKSB7CiAgICAgICB2YXIgZm91bmRJbXBsaWNpdEZpbGVUb1J1biA9IGZhbHNlOwogICAgICAgdmFyIGN3ZE5hbWUgPSBjd2QubmFtZTsKQEAgLTkwLDYgKzk0LDcgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQorCiAgICAgICBpZiAoIWZvdW5kSW1wbGljaXRGaWxlVG9SdW4pIHsKICAgICAgICAgbG9nLnN0ZGVycigKICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgdGhlIGltcGxpY2l0IGZpbGUgdG8gcnVuOiAnCkBAIC05OCw2ICsxMDMsMTUgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBQYXNzIGFueSAtLWVuYWJsZS1leHBlcmltZW50IG9wdGlvbnMgYWxvbmcuCisgICAgaWYgKGFyZ3MuaXNOb3RFbXB0eSAmJiB3ZXJlRXhwZXJpbWVudHNTcGVjaWZpZWQpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBleHBlcmltZW50SWRzID0gc3BlY2lmaWVkRXhwZXJpbWVudHM7CisgICAgICBhcmdzID0gWworICAgICAgICAnLS0kZXhwZXJpbWVudEZsYWdOYW1lPSR7ZXhwZXJpbWVudElkcy5qb2luKCcsJyl9JywKKyAgICAgICAgLi4uYXJncywKKyAgICAgIF07CisgICAgfQorCiAgICAgLy8gSWYgdGhlIHVzZXIgd2FudHMgdG8gc3RhcnQgYSBkZWJ1Z2dpbmcgc2Vzc2lvbiB3ZSBuZWVkIHRvIGRvIHNvbWUgZXh0cmEKICAgICAvLyB3b3JrIGFuZCBzcGF3biBhIERhcnQgRGV2ZWxvcG1lbnQgU2VydmljZSAoRERTKSBpbnN0YW5jZS4gRERTIGlzIGEgVk0KICAgICAvLyBzZXJ2aWNlIGludGVybWVkaWFyeSB3aGljaCBpbXBsZW1lbnRzIHRoZSBWTSBzZXJ2aWNlIHByb3RvY29sIGFuZApAQCAtMTA3LDE0ICsxMjEsMTQgQEAKICAgICAgICAgZWxlbWVudC5zdGFydHNXaXRoKCctLW9ic2VydmUnKSB8fAogICAgICAgICBlbGVtZW50LnN0YXJ0c1dpdGgoJy0tZW5hYmxlLXZtLXNlcnZpY2UnKSkpIHsKICAgICAgIHJldHVybiBhd2FpdCBfRGVidWdnaW5nU2Vzc2lvbih0aGlzLCBhcmdzKS5zdGFydCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTdGFydGluZyBpbiBQcm9jZXNzU3RhcnRNb2RlLmluaGVyaXRTdGRpbyBtb2RlIG1lYW5zIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAvLyBjYW4gZGV0ZWN0IHN1cHBvcnQgZm9yIGFuc2kgY2hhcnMuCisgICAgICBmaW5hbCBwcm9jZXNzID0gYXdhaXQgUHJvY2Vzcy5zdGFydCgKKyAgICAgICAgICBzZGsuZGFydCwgWyctLWRpc2FibGUtZGFydC1kZXYnLCAuLi5hcmdzXSwKKyAgICAgICAgICBtb2RlOiBQcm9jZXNzU3RhcnRNb2RlLmluaGVyaXRTdGRpbyk7CisgICAgICByZXR1cm4gcHJvY2Vzcy5leGl0Q29kZTsKICAgICB9Ci0KLSAgICAvLyBTdGFydGluZyBpbiBQcm9jZXNzU3RhcnRNb2RlLmluaGVyaXRTdGRpbyBtb2RlIG1lYW5zIHRoZSBjaGlsZCBwcm9jZXNzCi0gICAgLy8gY2FuIGRldGVjdCBzdXBwb3J0IGZvciBhbnNpIGNoYXJzLgotICAgIGZpbmFsIHByb2Nlc3MgPSBhd2FpdCBQcm9jZXNzLnN0YXJ0KAotICAgICAgICBzZGsuZGFydCwgWyctLWRpc2FibGUtZGFydC1kZXYnLCAuLi5hcmdzXSwKLSAgICAgICAgbW9kZTogUHJvY2Vzc1N0YXJ0TW9kZS5pbmhlcml0U3RkaW8pOwotICAgIHJldHVybiBwcm9jZXNzLmV4aXRDb2RlOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29tbWFuZHMvdGVzdC5kYXJ0IGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy90ZXN0LmRhcnQKaW5kZXggZDUyYjgwMi4uY2NjODI2OCAxMDA2NDQKLS0tIGEvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy90ZXN0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb21tYW5kcy90ZXN0LmRhcnQKQEAgLTgsMTEgKzgsMTEgQEAKIGltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CiAKIGltcG9ydCAnLi4vY29yZS5kYXJ0JzsKK2ltcG9ydCAnLi4vZXhwZXJpbWVudHMuZGFydCc7CiBpbXBvcnQgJy4uL3Nkay5kYXJ0JzsKIAogY2xhc3MgVGVzdENvbW1hbmQgZXh0ZW5kcyBEYXJ0ZGV2Q29tbWFuZDxpbnQ+IHsKLSAgVGVzdENvbW1hbmQoe2Jvb2wgdmVyYm9zZSA9IGZhbHNlfSkKLSAgICAgIDogc3VwZXIoJ3Rlc3QnLCAnUnVucyB0ZXN0cyBpbiB0aGlzIHByb2plY3QuJyk7CisgIFRlc3RDb21tYW5kKCkgOiBzdXBlcigndGVzdCcsICdSdW5zIHRlc3RzIGluIHRoaXMgcHJvamVjdC4nKTsKIAogICBAb3ZlcnJpZGUKICAgZmluYWwgQXJnUGFyc2VyIGFyZ1BhcnNlciA9IEFyZ1BhcnNlci5hbGxvd0FueXRoaW5nKCk7CkBAIC00Myw5ICs0MywxNSBAQAogICBAb3ZlcnJpZGUKICAgRnV0dXJlT3I8aW50PiBydW4oKSBhc3luYyB7CiAgICAgZmluYWwgY29tbWFuZCA9IHNkay5wdWI7Ci0gICAgZmluYWwgYXJncyA9IGFyZ1Jlc3VsdHMuYXJndW1lbnRzLnRvTGlzdCgpOworICAgIGZpbmFsIHRlc3RBcmdzID0gYXJnUmVzdWx0cy5hcmd1bWVudHMudG9MaXN0KCk7CiAKLSAgICBhcmdzLmluc2VydEFsbCgwLCBbJ3J1bicsICd0ZXN0J10pOworICAgIGZpbmFsIGFyZ3MgPSBbCisgICAgICAncnVuJywKKyAgICAgIGlmICh3ZXJlRXhwZXJpbWVudHNTcGVjaWZpZWQpCisgICAgICAgICctLSRleHBlcmltZW50RmxhZ05hbWU9JHtzcGVjaWZpZWRFeHBlcmltZW50cy5qb2luKCcsJyl9JywKKyAgICAgICd0ZXN0JywKKyAgICAgIC4uLnRlc3RBcmdzLAorICAgIF07CiAKICAgICBsb2cudHJhY2UoJyRjb21tYW5kICR7YXJncy5qb2luKCcgJyl9Jyk7CiAKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvY29yZS5kYXJ0IGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb3JlLmRhcnQKaW5kZXggYjBiYjc1ZS4uZGE0YjNkMyAxMDA2NDQKLS0tIGEvcGtnL2RhcnRkZXYvbGliL3NyYy9jb3JlLmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9jb3JlLmRhcnQKQEAgLTksMTAgKzksMTEgQEAKIGltcG9ydCAncGFja2FnZTpjbGlfdXRpbC9jbGlfbG9nZ2luZy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKIAoraW1wb3J0ICdleHBlcmltZW50cy5kYXJ0JzsKIGltcG9ydCAndXRpbHMuZGFydCc7CiAKIExvZ2dlciBsb2c7Ci1ib29sIGlzVmVyYm9zZSA9IGZhbHNlOworYm9vbCBpc0RpYWdub3N0aWNzID0gZmFsc2U7CiAKIGFic3RyYWN0IGNsYXNzIERhcnRkZXZDb21tYW5kPGludD4gZXh0ZW5kcyBDb21tYW5kIHsKICAgZmluYWwgU3RyaW5nIF9uYW1lOwpAQCAtMzIsNiArMzMsMTkgQEAKICAgU3RyaW5nIGdldCBkZXNjcmlwdGlvbiA9PiBfZGVzY3JpcHRpb247CiAKICAgUHJvamVjdCBnZXQgcHJvamVjdCA9PiBfcHJvamVjdCA/Pz0gUHJvamVjdCgpOworCisgIC8vLyBSZXR1cm4gd2hldGhlciBjb21tYW5kcyBzaG91bGQgZW1pdCB2ZXJib3NlIG91dHB1dC4KKyAgYm9vbCBnZXQgdmVyYm9zZSA9PiBnbG9iYWxSZXN1bHRzWyd2ZXJib3NlJ107CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIHRoZSB0b29sIHNob3VsZCBlbWl0IGRpYWdub3N0aWMgb3V0cHV0LgorICBib29sIGdldCBkaWFnbm9zdGljc0VuYWJsZWQgPT4gZ2xvYmFsUmVzdWx0c1snZGlhZ25vc3RpY3MnXTsKKworICAvLy8gUmV0dXJuIHdoZXRoZXIgYW55IERhcnQgZXhwZXJpbWVudHMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgIGJvb2wgZ2V0IHdlcmVFeHBlcmltZW50c1NwZWNpZmllZCA9PgorICAgICAgZ2xvYmFsUmVzdWx0cy53YXNQYXJzZWQoZXhwZXJpbWVudEZsYWdOYW1lKTsKKworICAvLy8gUmV0dXJuIHRoZSBsaXN0IG9mIERhcnQgZXhwZXJpbWVudCBmbGFncyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgIExpc3Q8U3RyaW5nPiBnZXQgc3BlY2lmaWVkRXhwZXJpbWVudHMgPT4gZ2xvYmFsUmVzdWx0c1tleHBlcmltZW50RmxhZ05hbWVdOwogfQogCiAvLy8gQSB1dGlsaXR5IG1ldGhvZCB0byBzdGFydCB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBhcyBhIHByb2Nlc3MsIG9wdGlvbmFsbHkKQEAgLTUwLDcgKzY0LDcgQEAKICAgYm9vbCBsb2dUb1RyYWNlID0gZmFsc2UsCiAgIHZvaWQgRnVuY3Rpb24oU3RyaW5nIHN0cikgbGlzdGVuZXIsCiB9KSB7Ci0gIGlmIChpc1ZlcmJvc2UpIHsKKyAgaWYgKGlzRGlhZ25vc3RpY3MpIHsKICAgICBfc3RyZWFtTGluZVRyYW5zZm9ybShwcm9jZXNzLnN0ZG91dCwgKFN0cmluZyBsaW5lKSB7CiAgICAgICBsb2dUb1RyYWNlID8gbG9nLnRyYWNlKGxpbmUudHJpbVJpZ2h0KCkpIDogbG9nLnN0ZG91dChsaW5lLnRyaW1SaWdodCgpKTsKICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSBsaXN0ZW5lcihsaW5lKTsKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvZXhwZXJpbWVudHMuZGFydCBiL3BrZy9kYXJ0ZGV2L2xpYi9zcmMvZXhwZXJpbWVudHMuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIxOTAwCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2RhcnRkZXYvbGliL3NyYy9leHBlcmltZW50cy5kYXJ0CkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvYW5hbHlzaXMvZXhwZXJpbWVudHMuZGFydCc7CisKK2NvbnN0IGV4cGVyaW1lbnRGbGFnTmFtZSA9ICdlbmFibGUtZXhwZXJpbWVudCc7CisKKy8vLyBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbm9uLWV4cGlyZWQgRGFydCBleHBlcmltZW50cy4KK0xpc3Q8RXhwZXJpbWVudGFsRmVhdHVyZT4gZ2V0IGV4cGVyaW1lbnRhbEZlYXR1cmVzIHsKKyAgTGlzdDxFeHBlcmltZW50YWxGZWF0dXJlPiBmZWF0dXJlcyA9IEV4cGVyaW1lbnRTdGF0dXMua25vd25GZWF0dXJlcy52YWx1ZXMKKyAgICAgIC53aGVyZSgoZmVhdHVyZSkgPT4gIWZlYXR1cmUuaXNFeHBpcmVkKQorICAgICAgLnRvTGlzdCgpOworICBmZWF0dXJlcy5zb3J0KChhLCBiKSA9PiBhLmVuYWJsZVN0cmluZy5jb21wYXJlVG8oYi5lbmFibGVTdHJpbmcpKTsKKyAgcmV0dXJuIGZlYXR1cmVzOworfQpkaWZmIC0tZ2l0IGEvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy9hbmFseXplX3Rlc3QuZGFydCBiL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvYW5hbHl6ZV90ZXN0LmRhcnQKaW5kZXggMjljNGQwNy4uNjEyMDZjYSAxMDA2NDQKLS0tIGEvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy9hbmFseXplX3Rlc3QuZGFydAorKysgYi9wa2cvZGFydGRldi90ZXN0L2NvbW1hbmRzL2FuYWx5emVfdGVzdC5kYXJ0CkBAIC0xNTcsNCArMTU3LDI1IEBACiAgICAgZXhwZWN0KHJlc3VsdC5zdGRlcnIsIGlzRW1wdHkpOwogICAgIGV4cGVjdChyZXN1bHQuc3Rkb3V0LCBjb250YWlucygnMSBpc3N1ZSBmb3VuZC4nKSk7CiAgIH0pOworCisgIHRlc3QoJy0tdmVyYm9zZScsICgpIHsKKyAgICBwID0gcHJvamVjdChtYWluU3JjOiAnJycKK2ludCBmKCkgeworICB2YXIgcmVzdWx0ID0gb25lICsgMjsKKyAgdmFyIG9uZSA9IDE7CisgIHJldHVybiByZXN1bHQ7Cit9JycnKTsKKyAgICB2YXIgcmVzdWx0ID0gcC5ydW5TeW5jKCdhbmFseXplJywgWyctLXZlcmJvc2UnLCBwLmRpclBhdGhdKTsKKworICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIDMpOworICAgIGV4cGVjdChyZXN1bHQuc3RkZXJyLCBpc0VtcHR5KTsKKyAgICB2YXIgc3Rkb3V0ID0gcmVzdWx0LnN0ZG91dDsKKyAgICBleHBlY3Qoc3Rkb3V0LCBjb250YWlucygiVGhlIGRlY2xhcmF0aW9uIG9mICdvbmUnIGlzIG9uIGxpbmUgMy4iKSk7CisgICAgZXhwZWN0KAorICAgICAgICBzdGRvdXQsIGNvbnRhaW5zKCdUcnkgbW92aW5nIHRoZSBkZWNsYXJhdGlvbiB0byBiZWZvcmUgdGhlIGZpcnN0IHVzZScpKTsKKyAgICBleHBlY3QoCisgICAgICAgIHN0ZG91dCwKKyAgICAgICAgY29udGFpbnMoCisgICAgICAgICAgICAnaHR0cHM6Ly9kYXJ0LmRldi90b29scy9kaWFnbm9zdGljLW1lc3NhZ2VzI3JlZmVyZW5jZWRfYmVmb3JlX2RlY2xhcmF0aW9uJykpOworICB9KTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvZmxhZ190ZXN0LmRhcnQgYi9wa2cvZGFydGRldi90ZXN0L2NvbW1hbmRzL2ZsYWdfdGVzdC5kYXJ0CmluZGV4IDk3OGM2YWUuLjc0ODI0MGYgMTAwNjQ0Ci0tLSBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvZmxhZ190ZXN0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy9mbGFnX3Rlc3QuZGFydApAQCAtMiw2ICsyLDcgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvY29tbWFuZF9ydW5uZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6ZGFydGRldi9kYXJ0ZGV2LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKQEAgLTM3LDYgKzM4LDE3IEBACiAgICAgICB9CiAgICAgfSk7CiAgIH0pOworCisgIHRlc3QoJ2VuYWJsZSBleHBlcmltZW50cyBmbGFnIGlzIHN1cHBvcnRlZCcsICgpIHsKKyAgICBmaW5hbCBhcmdzID0gWworICAgICAgJy0tZGlzYWJsZS1kYXJ0ZGV2LWFuYWx5dGljcycsCisgICAgICAnLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUnCisgICAgXTsKKyAgICBmaW5hbCBydW5uZXIgPSBEYXJ0ZGV2UnVubmVyKGFyZ3MpOworICAgIEFyZ1Jlc3VsdHMgcmVzdWx0cyA9IHJ1bm5lci5wYXJzZShhcmdzKTsKKyAgICBleHBlY3QocmVzdWx0c1snZW5hYmxlLWV4cGVyaW1lbnQnXSwgaXNOb3RFbXB0eSk7CisgICAgZXhwZWN0KHJlc3VsdHNbJ2VuYWJsZS1leHBlcmltZW50J10uZmlyc3QsICdub24tbnVsbGFibGUnKTsKKyAgfSk7CiB9CiAKIHZvaWQgaGVscCgpIHsKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvcHViX3Rlc3QuZGFydCBiL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvcHViX3Rlc3QuZGFydAppbmRleCBiOGE5OGVlLi5lZDlmODAxIDEwMDY0NAotLS0gYS9wa2cvZGFydGRldi90ZXN0L2NvbW1hbmRzL3B1Yl90ZXN0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy9wdWJfdGVzdC5kYXJ0CkBAIC0zNCw2ICszNCw0NCBAQAogICAgIGV4cGVjdChyZXN1bHQuc3RkZXJyLCBpc0VtcHR5KTsKICAgfSk7CiAKKyAgdGVzdCgnLS1lbmFibGUtZXhwZXJpbWVudCBwdWIgcnVuJywgKCkgeworICAgIHAgPSBwcm9qZWN0KCk7CisgICAgcC5maWxlKCdiaW4vbWFpbi5kYXJ0JywKKyAgICAgICAgInZvaWQgbWFpbigpIHsgaW50IGE7IGEgPSBudWxsOyBwcmludCgnYSBpcyBcJGEuJyk7IH0iKTsKKworICAgIC8vIHJ1biAncHViIGdldCcKKyAgICBwLnJ1blN5bmMoJ3B1YicsIFsnZ2V0J10pOworCisgICAgdmFyIHJlc3VsdCA9IHAucnVuU3luYygKKyAgICAgICAgJy0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlJywgWydwdWInLCAncnVuJywgJ21haW4uZGFydCddKTsKKworICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIDI1NCk7CisgICAgZXhwZWN0KHJlc3VsdC5zdGRvdXQsIGlzRW1wdHkpOworICAgIGV4cGVjdCgKKyAgICAgICAgcmVzdWx0LnN0ZGVyciwKKyAgICAgICAgY29udGFpbnMoIkEgdmFsdWUgb2YgdHlwZSAnTnVsbCcgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiAiCisgICAgICAgICAgICAidHlwZSAnaW50JyIpKTsKKyAgfSk7CisKKyAgdGVzdCgncHViIHJ1biAtLWVuYWJsZS1leHBlcmltZW50JywgKCkgeworICAgIHAgPSBwcm9qZWN0KCk7CisgICAgcC5maWxlKCdiaW4vbWFpbi5kYXJ0JywKKyAgICAgICAgInZvaWQgbWFpbigpIHsgaW50IGE7IGEgPSBudWxsOyBwcmludCgnYSBpcyBcJGEuJyk7IH0iKTsKKworICAgIC8vIHJ1biAncHViIGdldCcKKyAgICBwLnJ1blN5bmMoJ3B1YicsIFsnZ2V0J10pOworCisgICAgdmFyIHJlc3VsdCA9IHAucnVuU3luYygKKyAgICAgICAgJ3B1YicsIFsncnVuJywgJy0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlJywgJ21haW4uZGFydCddKTsKKworICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIDI1NCk7CisgICAgZXhwZWN0KHJlc3VsdC5zdGRvdXQsIGlzRW1wdHkpOworICAgIGV4cGVjdCgKKyAgICAgICAgcmVzdWx0LnN0ZGVyciwKKyAgICAgICAgY29udGFpbnMoIkEgdmFsdWUgb2YgdHlwZSAnTnVsbCcgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiAiCisgICAgICAgICAgICAidHlwZSAnaW50JyIpKTsKKyAgfSk7CisKICAgdGVzdCgnZmFpbHVyZScsICgpIHsKICAgICBwID0gcHJvamVjdChtYWluU3JjOiAnaW50IGdldCBmb28gPT4gMTtcbicpOwogICAgIHZhciByZXN1bHQgPSBwLnJ1blN5bmMoJ3B1YicsIFsnZGVwcyddKTsKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvcnVuX3Rlc3QuZGFydCBiL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvcnVuX3Rlc3QuZGFydAppbmRleCBlNmI4OTMxLi5hYzI1MjdhIDEwMDY0NAotLS0gYS9wa2cvZGFydGRldi90ZXN0L2NvbW1hbmRzL3J1bl90ZXN0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy9ydW5fdGVzdC5kYXJ0CkBAIC0zNiw2ICszNiwyMCBAQAogICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIDApOwogICB9KTsKIAorICB0ZXN0KCctLWVuYWJsZS1leHBlcmltZW50JywgKCkgeworICAgIHAgPSBwcm9qZWN0KCk7CisgICAgcC5maWxlKCdtYWluLmRhcnQnLCAidm9pZCBtYWluKCkgeyBpbnQgYTsgYSA9IG51bGw7IHByaW50KCdhIGlzIFwkYS4nKTsgfSIpOworICAgIHZhciByZXN1bHQgPQorICAgICAgICBwLnJ1blN5bmMoJy0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlJywgWydydW4nLCAnbWFpbi5kYXJ0J10pOworCisgICAgZXhwZWN0KHJlc3VsdC5leGl0Q29kZSwgMjU0KTsKKyAgICBleHBlY3QocmVzdWx0LnN0ZG91dCwgaXNFbXB0eSk7CisgICAgZXhwZWN0KAorICAgICAgICByZXN1bHQuc3RkZXJyLAorICAgICAgICBjb250YWlucygiQSB2YWx1ZSBvZiB0eXBlICdOdWxsJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mICIKKyAgICAgICAgICAgICJ0eXBlICdpbnQnIikpOworICB9KTsKKwogICB0ZXN0KCdubyBzdWNoIGZpbGUnLCAoKSB7CiAgICAgcCA9IHByb2plY3QobWFpblNyYzogInZvaWQgbWFpbigpIHsgcHJpbnQoJ0hlbGxvIFdvcmxkJyk7IH0iKTsKICAgICBQcm9jZXNzUmVzdWx0IHJlc3VsdCA9CkBAIC00Nyw3ICs2MSw3IEBACiAKICAgdGVzdCgnaW1wbGljaXQgcGFja2FnZU5hbWUuZGFydCcsICgpIHsKICAgICAvLyBUT0RPKGp3cmVuKSBjaXJjbGUgYmFjayB0byByZWltcGxlbWVudCB0aGlzIHRlc3QgaWYgcG9zc2libGUsIHRoZSBmaWxlCi0gICAgLy8gIG5hbWUgKHBhY2thZ2UgbmFtZSkgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvbiBkaXNrCisgICAgLy8gbmFtZSAocGFja2FnZSBuYW1lKSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG9uIGRpc2sKICAgICBwID0gcHJvamVjdChtYWluU3JjOiAidm9pZCBtYWluKCkgeyBwcmludCgnSGVsbG8gV29ybGQnKTsgfSIpOwogICAgIHAuZmlsZSgnYmluL21haW4uZGFydCcsICJ2b2lkIG1haW4oKSB7IHByaW50KCdIZWxsbyBtYWluLmRhcnQnKTsgfSIpOwogICAgIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0gcC5ydW5TeW5jKCdydW4nLCBbXSk7CkBAIC01Nyw3ICs3MSw3IEBACiAgICAgZXhwZWN0KHJlc3VsdC5leGl0Q29kZSwgMCk7CiAgIH0sIHNraXA6IHRydWUpOwogCi0gIC8vQ291bGQgbm90IGZpbmQgdGhlIGltcGxpY2l0IGZpbGUgdG8gcnVuOiBiaW4KKyAgLy8gQ291bGQgbm90IGZpbmQgdGhlIGltcGxpY2l0IGZpbGUgdG8gcnVuOiBiaW4KICAgdGVzdCgnbWlzc2luZyBpbXBsaWNpdCBwYWNrYWdlTmFtZS5kYXJ0JywgKCkgewogICAgIHAgPSBwcm9qZWN0KG1haW5TcmM6ICJ2b2lkIG1haW4oKSB7IHByaW50KCdIZWxsbyBXb3JsZCcpOyB9Iik7CiAgICAgcC5maWxlKCdiaW4vZm9vLmRhcnQnLCAidm9pZCBtYWluKCkgeyBwcmludCgnSGVsbG8gbWFpbi5kYXJ0Jyk7IH0iKTsKZGlmZiAtLWdpdCBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvdGVzdF90ZXN0LmRhcnQgYi9wa2cvZGFydGRldi90ZXN0L2NvbW1hbmRzL3Rlc3RfdGVzdC5kYXJ0CmluZGV4IDNmMmVhNzAuLmEzYjUyNjUgMTAwNjQ0Ci0tLSBhL3BrZy9kYXJ0ZGV2L3Rlc3QvY29tbWFuZHMvdGVzdF90ZXN0LmRhcnQKKysrIGIvcGtnL2RhcnRkZXYvdGVzdC9jb21tYW5kcy90ZXN0X3Rlc3QuZGFydApAQCAtNjUsNCArNjUsMjYgQEAKICAgICBleHBlY3QocmVzdWx0LnN0ZG91dCwgY29udGFpbnMoJ0FsbCB0ZXN0cyBwYXNzZWQhJykpOwogICAgIGV4cGVjdChyZXN1bHQuc3RkZXJyLCBpc0VtcHR5KTsKICAgfSwgc2tpcDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy80MDg1NCcpOworCisgIHRlc3QoJy0tZW5hYmxlLWV4cGVyaW1lbnQnLCAoKSB7CisgICAgcCA9IHByb2plY3QobWFpblNyYzogJ2ludCBnZXQgZm9vID0+IDE7XG4nKTsKKyAgICBwLmZpbGUoJ3Rlc3QvZm9vX3Rlc3QuZGFydCcsICcnJworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICB0ZXN0KCcnLCAoKSB7CisgICAgaW50IGE7CisgICAgYSA9IG51bGw7CisgICAgcHJpbnQoJ2EgaXMgXCRhLicpOworICB9KTsKK30KKycnJyk7CisKKyAgICB2YXIgcmVzdWx0ID0gcC5ydW5TeW5jKCdwdWInLCBbJ2dldCcsICctLW9mZmxpbmUnXSk7CisgICAgZXhwZWN0KHJlc3VsdC5leGl0Q29kZSwgMCk7CisKKyAgICByZXN1bHQgPSBwLnJ1blN5bmMoJy0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlJywKKyAgICAgICAgWyd0ZXN0JywgJy0tbm8tY29sb3InLCAnLS1yZXBvcnRlcicsICdleHBhbmRlZCddKTsKKyAgICBleHBlY3QocmVzdWx0LmV4aXRDb2RlLCAxKTsKKyAgfSwgc2tpcDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy80MDg1NCcpOwogfQpkaWZmIC0tZ2l0IGEvcGtnL2RhcnRkZXYvdGVzdC9leHBlcmltZW50c190ZXN0LmRhcnQgYi9wa2cvZGFydGRldi90ZXN0L2V4cGVyaW1lbnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJlYzBlCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2RhcnRkZXYvdGVzdC9leHBlcmltZW50c190ZXN0LmRhcnQKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTpkYXJ0ZGV2L3NyYy9leHBlcmltZW50cy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgZ3JvdXAoJ2V4cGVyaW1lbnRzJywgKCkgeworICAgIHRlc3QoJ2V4cGVyaW1lbnRhbEZlYXR1cmVzJywgKCkgeworICAgICAgZXhwZWN0KGV4cGVyaW1lbnRhbEZlYXR1cmVzLCBpc05vdEVtcHR5KTsKKyAgICAgIGV4cGVjdCgKKyAgICAgICAgZXhwZXJpbWVudGFsRmVhdHVyZXMubWFwKChleHBlcmltZW50KSA9PiBleHBlcmltZW50LmVuYWJsZVN0cmluZyksCisgICAgICAgIGNvbnRhaW5zKCdub24tbnVsbGFibGUnKSwKKyAgICAgICk7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Rldl9jb21waWxlci9saWIvc3JjL2tlcm5lbC9jb21waWxlci5kYXJ0IGIvcGtnL2Rldl9jb21waWxlci9saWIvc3JjL2tlcm5lbC9jb21waWxlci5kYXJ0CmluZGV4IDBlN2YzMWUuLmQ2ZjBmYTUgMTAwNjQ0Ci0tLSBhL3BrZy9kZXZfY29tcGlsZXIvbGliL3NyYy9rZXJuZWwvY29tcGlsZXIuZGFydAorKysgYi9wa2cvZGV2X2NvbXBpbGVyL2xpYi9zcmMva2VybmVsL2NvbXBpbGVyLmRhcnQKQEAgLTEyLDYgKzEyLDcgQEAKIGltcG9ydCAncGFja2FnZTprZXJuZWwvbGlicmFyeV9pbmRleC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTprZXJuZWwvdHlwZV9hbGdlYnJhLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9zcmMvZGFydF90eXBlX2VxdWl2YWxlbmNlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnNvdXJjZV9zcGFuL3NvdXJjZV9zcGFuLmRhcnQnIHNob3cgU291cmNlTG9jYXRpb247CiBpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHA7CiAKQEAgLTMxMjUsNyArMzEyNiw3IEBACiAgICAgdmFyIGdlbiA9IGVtaXRHZW5lcmF0b3JGbigoXykgPT4gW10pOwogICAgIC8vIFJldHVybiB0eXBlIG9mIGFuIGFzeW5jIGJvZHkgaXMgYEZ1dHVyZTxmbGF0dGVuKFQpPmAsIHdoZXJlIFQgaXMgdGhlCiAgICAgLy8gZGVjbGFyZWQgcmV0dXJuIHR5cGUuCi0gICAgdmFyIHJldHVyblR5cGUgPSBfdHlwZXMudW5mdXR1cmVUeXBlKGZ1bmN0aW9uCisgICAgdmFyIHJldHVyblR5cGUgPSBfdHlwZXMuZmxhdHRlbihmdW5jdGlvbgogICAgICAgICAuY29tcHV0ZVRoaXNGdW5jdGlvblR5cGUoX2N1cnJlbnRMaWJyYXJ5Lm5vbk51bGxhYmxlKQogICAgICAgICAucmV0dXJuVHlwZSk7CiAgICAgcmV0dXJuIGpzLmNhbGwoJyMuYXN5bmMoIywgIyknLApAQCAtNTMzMSw3ICs1MzMyLDggQEAKICAgICB9CiAKICAgICBpZiAoIWlzVHlwZUVycm9yICYmCi0gICAgICAgIGZyb20ud2l0aERlY2xhcmVkTnVsbGFiaWxpdHkoTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpID09IHRvICYmCisgICAgICAgIERhcnRUeXBlRXF1aXZhbGVuY2UoX2NvcmVUeXBlcywgaWdub3JlVG9wTGV2ZWxOdWxsYWJpbGl0eTogdHJ1ZSkKKyAgICAgICAgICAgIC5hcmVFcXVhbChmcm9tLCB0bykgJiYKICAgICAgICAgX211c3RCZU5vbk51bGxhYmxlKHRvKSkgewogICAgICAgLy8gSWYgdGhlIHVuZGVybHlpbmcgdHlwZSBpcyB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIGEgbnVsbCBjaGVjay4KICAgICAgIHJldHVybiBydW50aW1lQ2FsbCgnbnVsbENhc3QoIywgIyknLCBbanNGcm9tLCBfZW1pdFR5cGUodG8pXSk7CmRpZmYgLS1naXQgYS9wa2cvZGV2X2NvbXBpbGVyL3Rlc3QvbW9kdWxhcl9zdWl0ZS5kYXJ0IGIvcGtnL2Rldl9jb21waWxlci90ZXN0L21vZHVsYXJfc3VpdGUuZGFydAppbmRleCBlMzY4ZWUyLi5hYjcyMWNiIDEwMDY0NAotLS0gYS9wa2cvZGV2X2NvbXBpbGVyL3Rlc3QvbW9kdWxhcl9zdWl0ZS5kYXJ0CisrKyBiL3BrZy9kZXZfY29tcGlsZXIvdGVzdC9tb2R1bGFyX3N1aXRlLmRhcnQKQEAgLTExLDE0ICsxMSwyMiBAQAogaW1wb3J0ICdwYWNrYWdlOm1vZHVsYXJfdGVzdC9zcmMvcGlwZWxpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bW9kdWxhcl90ZXN0L3NyYy9zdWl0ZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptb2R1bGFyX3Rlc3Qvc3JjL3J1bm5lci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpwYWNrYWdlX2NvbmZpZy9wYWNrYWdlX2NvbmZpZy5kYXJ0JzsKIAorU3RyaW5nIHBhY2thZ2VDb25maWdKc29uUGF0aCA9ICcuZGFydF90b29sL3BhY2thZ2VfY29uZmlnLmpzb24nOwogVXJpIHNka1Jvb3QgPSBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgnLi4vLi4vLi4vJyk7CitVcmkgcGFja2FnZUNvbmZpZ1VyaSA9IHNka1Jvb3QucmVzb2x2ZShwYWNrYWdlQ29uZmlnSnNvblBhdGgpOwogT3B0aW9ucyBfb3B0aW9uczsKIFN0cmluZyBfZGFydGRldmNTY3JpcHQ7CiBTdHJpbmcgX2tlcm5lbFdvcmtlclNjcmlwdDsKIAorLy8gVE9ETyhqb3NodWFsaXR0KTogRmlndXJlIG91dCBhIHdheSB0byBzdXBwb3J0IHBhY2thZ2UgY29uZmlncyBpbgorLy8gdGVzdHMvbW9kdWxhci4KK1BhY2thZ2VDb25maWcgX3BhY2thZ2VDb25maWc7CisKIHZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgewogICBfb3B0aW9ucyA9IE9wdGlvbnMucGFyc2UoYXJncyk7CisgIF9wYWNrYWdlQ29uZmlnID0gYXdhaXQgbG9hZFBhY2thZ2VDb25maWdVcmkocGFja2FnZUNvbmZpZ1VyaSk7CiAgIGF3YWl0IF9yZXNvbHZlU2NyaXB0cygpOwogICBhd2FpdCBydW5TdWl0ZSgKICAgICAgIHNka1Jvb3QucmVzb2x2ZSgndGVzdHMvbW9kdWxhci8nKSwKQEAgLTM1LDYgKzQzLDE3IEBACiBjb25zdCBqc0lkID0gRGF0YUlkKCdqcycpOwogY29uc3QgdHh0SWQgPSBEYXRhSWQoJ3R4dCcpOwogCitTdHJpbmcgX3BhY2thZ2VDb25maWdFbnRyeShTdHJpbmcgbmFtZSwgVXJpIHJvb3QsCisgICAge1VyaSBwYWNrYWdlUm9vdCwgTGFuZ3VhZ2VWZXJzaW9uIHZlcnNpb259KSB7CisgIHZhciBmaWVsZHMgPSBbCisgICAgJyJuYW1lIjogIiR7bmFtZX0iJywKKyAgICAnInJvb3RVcmkiOiAiJHJvb3QiJywKKyAgICBpZiAocGFja2FnZVJvb3QgIT0gbnVsbCkgJyJwYWNrYWdlVXJpIjogIiRwYWNrYWdlUm9vdCInLAorICAgIGlmICh2ZXJzaW9uICE9IG51bGwpICcibGFuZ3VhZ2VWZXJzaW9uIjogIiR2ZXJzaW9uIicKKyAgXTsKKyAgcmV0dXJuICd7JHtmaWVsZHMuam9pbignLCcpfX0nOworfQorCiBjbGFzcyBTb3VyY2VUb1N1bW1hcnlEaWxsU3RlcCBpbXBsZW1lbnRzIElPTW9kdWxhclN0ZXAgewogICBAb3ZlcnJpZGUKICAgTGlzdDxEYXRhSWQ+IGdldCByZXN1bHREYXRhID0+IGNvbnN0IFtkaWxsSWRdOwpAQCAtMjk4LDMwICszMTcsNTEgQEAKIAogRnV0dXJlPHZvaWQ+IF9jcmVhdGVQYWNrYWdlc0ZpbGUoCiAgICAgTW9kdWxlIG1vZHVsZSwgVXJpIHJvb3QsIFNldDxNb2R1bGU+IHRyYW5zaXRpdmVEZXBlbmRlbmNpZXMpIGFzeW5jIHsKLSAgLy8gV2UgY3JlYXRlIGEgLnBhY2thZ2VzIGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhpcyBtb2R1bGUgaWYKLSAgLy8gaXQgaXMgYSBwYWNrYWdlLiAgVGhlIENGRSByZXF1aXJlcyB0aGF0IGlmIGEgYHBhY2thZ2U6YCBVUkkgb2YgYQotICAvLyBkZXBlbmRlbmN5IGlzIHVzZWQgaW4gYW4gaW1wb3J0LCB0aGVuIHdlIG5lZWQgdGhhdCBwYWNrYWdlIGVudHJ5IGluIHRoZQotICAvLyAucGFja2FnZXMgZmlsZS4gSG93ZXZlciwgYWZ0ZXIgaXQgY2hlY2tzIHRoYXQgdGhlIGRlZmluaXRpb24gZXhpc3RzLCB0aGUKLSAgLy8gQ0ZFIHdpbGwgbm90IGFjdHVhbGx5IHVzZSB0aGUgcmVzb2x2ZWQgVVJJIGlmIGEgbGlicmFyeSBmb3IgdGhlIGltcG9ydAotICAvLyBVUkkgaXMgYWxyZWFkeSBmb3VuZCBpbiBvbmUgb2YgdGhlIHByb3ZpZGVkIC5kaWxsIGZpbGVzIG9mIHRoZQotICAvLyBkZXBlbmRlbmNpZXMuIEZvciB0aGF0IHJlYXNvbiwgYW5kIHRvIGVuc3VyZSB0aGF0IGEgc3RlcCBvbmx5IGhhcyBhY2Nlc3MKLSAgLy8gdG8gdGhlIGZpbGVzIHByb3ZpZGVkIGluIGEgbW9kdWxlLCB3ZSBnZW5lcmF0ZSBhIC5wYWNrYWdlcyB3aXRoIGludmFsaWQKLSAgLy8gZm9sZGVycyBmb3Igb3RoZXIgcGFja2FnZXMuCisgIC8vIFdlIGNyZWF0ZSBib3RoIGEgLnBhY2thZ2VzIGFuZCBwYWNrYWdlX2NvbmZpZy5qc29uIGZpbGUgd2hpY2ggZGVmaW5lcworICAvLyB0aGUgbG9jYXRpb24gb2YgdGhpcyBtb2R1bGUgaWYgaXQgaXMgYSBwYWNrYWdlLiAgVGhlIENGRSByZXF1aXJlcyB0aGF0CisgIC8vIGlmIGEgYHBhY2thZ2U6YCBVUkkgb2YgYSBkZXBlbmRlbmN5IGlzIHVzZWQgaW4gYW4gaW1wb3J0LCB0aGVuIHdlIG5lZWQKKyAgLy8gdGhhdCBwYWNrYWdlIGVudHJ5IGluIHRoZSBhc3NvY2lhdGVkIGZpbGUuIEhvd2V2ZXIsIGFmdGVyIGl0IGNoZWNrcyB0aGF0CisgIC8vIHRoZSBkZWZpbml0aW9uIGV4aXN0cywgdGhlIENGRSB3aWxsIG5vdCBhY3R1YWxseSB1c2UgdGhlIHJlc29sdmVkIFVSSSBpZgorICAvLyBhIGxpYnJhcnkgZm9yIHRoZSBpbXBvcnQgVVJJIGlzIGFscmVhZHkgZm91bmQgaW4gb25lIG9mIHRoZSBwcm92aWRlCisgIC8vIC5kaWxsIGZpbGVzIG9mIHRoZSBkZXBlbmRlbmNpZXMuIEZvciB0aGF0IHJlYXNvbiwgYW5kIHRvIGVuc3VyZSB0aGF0CisgIC8vIGEgc3RlcCBvbmx5IGhhcyBhY2Nlc3MgdG8gdGhlIGZpbGVzIHByb3ZpZGVkIGluIGEgbW9kdWxlLCB3ZSBnZW5lcmF0ZSBhCisgIC8vIGNvbmZpZyBmaWxlIHdpdGggaW52YWxpZCBmb2xkZXJzIGZvciBvdGhlciBwYWNrYWdlcy4KICAgLy8gVE9ETyhzaWdtdW5kKTogZm9sbG93IHVwIHdpdGggdGhlIENGRSB0byBzZWUgaWYgd2UgY2FuIHJlbW92ZSB0aGUgbmVlZAotICAvLyBmb3IgdGhlIC5wYWNrYWdlcyBlbnRyeSBhbHRvZ2V0aGVyIGlmIHRoZXkgd29uJ3QgbmVlZCB0byByZWFkIHRoZQotICAvLyBzb3VyY2VzLgorICAvLyBmb3IgdGhlc2UgZHVtbXkgZW50cmllcy4uCisgIC8vIFRPRE8oam9zaHVhbGl0dCk6IEdlbmVyYXRlIGp1c3QgdGhlIGpzb24gZmlsZS4KKyAgdmFyIHBhY2thZ2VzSnNvbiA9IFtdOwogICB2YXIgcGFja2FnZXNDb250ZW50cyA9IFN0cmluZ0J1ZmZlcigpOwogICBpZiAobW9kdWxlLmlzUGFja2FnZSkgewogICAgIHBhY2thZ2VzQ29udGVudHMud3JpdGUoJyR7bW9kdWxlLm5hbWV9OiR7bW9kdWxlLnBhY2thZ2VCYXNlfVxuJyk7CisgICAgcGFja2FnZXNKc29uLmFkZChfcGFja2FnZUNvbmZpZ0VudHJ5KAorICAgICAgICBtb2R1bGUubmFtZSwgVXJpLnBhcnNlKCcuLi8ke21vZHVsZS5wYWNrYWdlQmFzZX0nKSkpOwogICB9CiAgIHZhciB1bnVzZWROdW0gPSAwOwogICBmb3IgKHZhciBkZXBlbmRlbmN5IGluIHRyYW5zaXRpdmVEZXBlbmRlbmNpZXMpIHsKICAgICBpZiAoZGVwZW5kZW5jeS5pc1BhY2thZ2UpIHsKKyAgICAgIC8vIHJvb3RVcmkgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGRlcGVuZGVudCBtb2R1bGVzLCBzbyB3ZSBwYXNzIGluIGEKKyAgICAgIC8vIGJvZ3VzIHZhbHVlLgorICAgICAgdmFyIHJvb3RVcmkgPSBVcmkucGFyc2UoJ3VudXNlZCR1bnVzZWROdW0nKTsKICAgICAgIHVudXNlZE51bSsrOwotICAgICAgcGFja2FnZXNDb250ZW50cy53cml0ZSgnJHtkZXBlbmRlbmN5Lm5hbWV9OnVudXNlZCR1bnVzZWROdW1cbicpOworICAgICAgdmFyIGRlcGVuZGVudFBhY2thZ2UgPSBfcGFja2FnZUNvbmZpZ1tkZXBlbmRlbmN5Lm5hbWVdOworICAgICAgdmFyIHBhY2thZ2VKc29uID0gZGVwZW5kZW50UGFja2FnZSA9PSBudWxsCisgICAgICAgICAgPyBfcGFja2FnZUNvbmZpZ0VudHJ5KGRlcGVuZGVuY3kubmFtZSwgcm9vdFVyaSkKKyAgICAgICAgICA6IF9wYWNrYWdlQ29uZmlnRW50cnkoZGVwZW5kZW50UGFja2FnZS5uYW1lLCByb290VXJpLAorICAgICAgICAgICAgICB2ZXJzaW9uOiBkZXBlbmRlbnRQYWNrYWdlLmxhbmd1YWdlVmVyc2lvbik7CisgICAgICBwYWNrYWdlc0pzb24uYWRkKHBhY2thZ2VKc29uKTsKKyAgICAgIHBhY2thZ2VzQ29udGVudHMud3JpdGUoJyR7ZGVwZW5kZW5jeS5uYW1lfTokcm9vdFVyaVxuJyk7CiAgICAgfQogICB9CiAKKyAgaWYgKG1vZHVsZS5pc1BhY2thZ2UpIHsKKyAgICBhd2FpdCBGaWxlLmZyb21Vcmkocm9vdC5yZXNvbHZlKHBhY2thZ2VDb25maWdKc29uUGF0aCkpCisgICAgICAgIC5jcmVhdGUocmVjdXJzaXZlOiB0cnVlKTsKKyAgICBhd2FpdCBGaWxlLmZyb21Vcmkocm9vdC5yZXNvbHZlKHBhY2thZ2VDb25maWdKc29uUGF0aCkpLndyaXRlQXNTdHJpbmcoJ3snCisgICAgICAgICcgICJjb25maWdWZXJzaW9uIjogJHtfcGFja2FnZUNvbmZpZy52ZXJzaW9ufSwnCisgICAgICAgICcgICJwYWNrYWdlcyI6IFsgJHtwYWNrYWdlc0pzb24uam9pbignLCcpfSBdJworICAgICAgICAnfScpOworICB9CisKICAgYXdhaXQgRmlsZS5mcm9tVXJpKHJvb3QucmVzb2x2ZSgnLnBhY2thZ2VzJykpCiAgICAgICAud3JpdGVBc1N0cmluZygnJHBhY2thZ2VzQ29udGVudHMnKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy9kZXZfY29tcGlsZXIvdGVzdC9tb2R1bGFyX3N1aXRlX25uYmQuZGFydCBiL3BrZy9kZXZfY29tcGlsZXIvdGVzdC9tb2R1bGFyX3N1aXRlX25uYmQuZGFydAppbmRleCBjMWE2MjRiLi4wOTcwZTU0IDEwMDY0NAotLS0gYS9wa2cvZGV2X2NvbXBpbGVyL3Rlc3QvbW9kdWxhcl9zdWl0ZV9ubmJkLmRhcnQKKysrIGIvcGtnL2Rldl9jb21waWxlci90ZXN0L21vZHVsYXJfc3VpdGVfbm5iZC5kYXJ0CkBAIC0xMSwxNCArMTEsMjIgQEAKIGltcG9ydCAncGFja2FnZTptb2R1bGFyX3Rlc3Qvc3JjL3BpcGVsaW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1vZHVsYXJfdGVzdC9zcmMvc3VpdGUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6bW9kdWxhcl90ZXN0L3NyYy9ydW5uZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6cGFja2FnZV9jb25maWcvcGFja2FnZV9jb25maWcuZGFydCc7CiAKK1N0cmluZyBwYWNrYWdlQ29uZmlnSnNvblBhdGggPSAnLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uJzsKIFVyaSBzZGtSb290ID0gUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoJy4uLy4uLy4uLycpOworVXJpIHBhY2thZ2VDb25maWdVcmkgPSBzZGtSb290LnJlc29sdmUocGFja2FnZUNvbmZpZ0pzb25QYXRoKTsKIE9wdGlvbnMgX29wdGlvbnM7CiBTdHJpbmcgX2RhcnRkZXZjU2NyaXB0OwogU3RyaW5nIF9rZXJuZWxXb3JrZXJTY3JpcHQ7CiAKKy8vIFRPRE8oam9zaHVhbGl0dCk6IEZpZ3VyZSBvdXQgYSB3YXkgdG8gc3VwcG9ydCBwYWNrYWdlIGNvbmZpZ3MgaW4KKy8vIHRlc3RzL21vZHVsYXIuCitQYWNrYWdlQ29uZmlnIF9wYWNrYWdlQ29uZmlnOworCiB2b2lkIG1haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKICAgX29wdGlvbnMgPSBPcHRpb25zLnBhcnNlKGFyZ3MpOworICBfcGFja2FnZUNvbmZpZyA9IGF3YWl0IGxvYWRQYWNrYWdlQ29uZmlnVXJpKHBhY2thZ2VDb25maWdVcmkpOwogICBhd2FpdCBfcmVzb2x2ZVNjcmlwdHMoKTsKICAgYXdhaXQgcnVuU3VpdGUoCiAgICAgICBzZGtSb290LnJlc29sdmUoJ3Rlc3RzL21vZHVsYXIvJyksCkBAIC0zNSw2ICs0MywxNyBAQAogY29uc3QganNJZCA9IERhdGFJZCgnanMnKTsKIGNvbnN0IHR4dElkID0gRGF0YUlkKCd0eHQnKTsKIAorU3RyaW5nIF9wYWNrYWdlQ29uZmlnRW50cnkoU3RyaW5nIG5hbWUsIFVyaSByb290LAorICAgIHtVcmkgcGFja2FnZVJvb3QsIExhbmd1YWdlVmVyc2lvbiB2ZXJzaW9ufSkgeworICB2YXIgZmllbGRzID0gWworICAgICcibmFtZSI6ICIke25hbWV9IicsCisgICAgJyJyb290VXJpIjogIiRyb290IicsCisgICAgaWYgKHBhY2thZ2VSb290ICE9IG51bGwpICcicGFja2FnZVVyaSI6ICIkcGFja2FnZVJvb3QiJywKKyAgICBpZiAodmVyc2lvbiAhPSBudWxsKSAnImxhbmd1YWdlVmVyc2lvbiI6ICIkdmVyc2lvbiInCisgIF07CisgIHJldHVybiAneyR7ZmllbGRzLmpvaW4oJywnKX19JzsKK30KKwogY2xhc3MgU291cmNlVG9TdW1tYXJ5RGlsbFN0ZXAgaW1wbGVtZW50cyBJT01vZHVsYXJTdGVwIHsKICAgQG92ZXJyaWRlCiAgIExpc3Q8RGF0YUlkPiBnZXQgcmVzdWx0RGF0YSA9PiBjb25zdCBbZGlsbElkXTsKQEAgLTMwMSwzMCArMzIwLDUxIEBACiAKIEZ1dHVyZTx2b2lkPiBfY3JlYXRlUGFja2FnZXNGaWxlKAogICAgIE1vZHVsZSBtb2R1bGUsIFVyaSByb290LCBTZXQ8TW9kdWxlPiB0cmFuc2l0aXZlRGVwZW5kZW5jaWVzKSBhc3luYyB7Ci0gIC8vIFdlIGNyZWF0ZSBhIC5wYWNrYWdlcyBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoaXMgbW9kdWxlIGlmCi0gIC8vIGl0IGlzIGEgcGFja2FnZS4gIFRoZSBDRkUgcmVxdWlyZXMgdGhhdCBpZiBhIGBwYWNrYWdlOmAgVVJJIG9mIGEKLSAgLy8gZGVwZW5kZW5jeSBpcyB1c2VkIGluIGFuIGltcG9ydCwgdGhlbiB3ZSBuZWVkIHRoYXQgcGFja2FnZSBlbnRyeSBpbiB0aGUKLSAgLy8gLnBhY2thZ2VzIGZpbGUuIEhvd2V2ZXIsIGFmdGVyIGl0IGNoZWNrcyB0aGF0IHRoZSBkZWZpbml0aW9uIGV4aXN0cywgdGhlCi0gIC8vIENGRSB3aWxsIG5vdCBhY3R1YWxseSB1c2UgdGhlIHJlc29sdmVkIFVSSSBpZiBhIGxpYnJhcnkgZm9yIHRoZSBpbXBvcnQKLSAgLy8gVVJJIGlzIGFscmVhZHkgZm91bmQgaW4gb25lIG9mIHRoZSBwcm92aWRlZCAuZGlsbCBmaWxlcyBvZiB0aGUKLSAgLy8gZGVwZW5kZW5jaWVzLiBGb3IgdGhhdCByZWFzb24sIGFuZCB0byBlbnN1cmUgdGhhdCBhIHN0ZXAgb25seSBoYXMgYWNjZXNzCi0gIC8vIHRvIHRoZSBmaWxlcyBwcm92aWRlZCBpbiBhIG1vZHVsZSwgd2UgZ2VuZXJhdGUgYSAucGFja2FnZXMgd2l0aCBpbnZhbGlkCi0gIC8vIGZvbGRlcnMgZm9yIG90aGVyIHBhY2thZ2VzLgorICAvLyBXZSBjcmVhdGUgYm90aCBhIC5wYWNrYWdlcyBhbmQgcGFja2FnZV9jb25maWcuanNvbiBmaWxlIHdoaWNoIGRlZmluZXMKKyAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoaXMgbW9kdWxlIGlmIGl0IGlzIGEgcGFja2FnZS4gIFRoZSBDRkUgcmVxdWlyZXMgdGhhdAorICAvLyBpZiBhIGBwYWNrYWdlOmAgVVJJIG9mIGEgZGVwZW5kZW5jeSBpcyB1c2VkIGluIGFuIGltcG9ydCwgdGhlbiB3ZSBuZWVkCisgIC8vIHRoYXQgcGFja2FnZSBlbnRyeSBpbiB0aGUgYXNzb2NpYXRlZCBmaWxlLiBIb3dldmVyLCBhZnRlciBpdCBjaGVja3MgdGhhdAorICAvLyB0aGUgZGVmaW5pdGlvbiBleGlzdHMsIHRoZSBDRkUgd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZSByZXNvbHZlZCBVUkkgaWYKKyAgLy8gYSBsaWJyYXJ5IGZvciB0aGUgaW1wb3J0IFVSSSBpcyBhbHJlYWR5IGZvdW5kIGluIG9uZSBvZiB0aGUgcHJvdmlkZQorICAvLyAuZGlsbCBmaWxlcyBvZiB0aGUgZGVwZW5kZW5jaWVzLiBGb3IgdGhhdCByZWFzb24sIGFuZCB0byBlbnN1cmUgdGhhdAorICAvLyBhIHN0ZXAgb25seSBoYXMgYWNjZXNzIHRvIHRoZSBmaWxlcyBwcm92aWRlZCBpbiBhIG1vZHVsZSwgd2UgZ2VuZXJhdGUgYQorICAvLyBjb25maWcgZmlsZSB3aXRoIGludmFsaWQgZm9sZGVycyBmb3Igb3RoZXIgcGFja2FnZXMuCiAgIC8vIFRPRE8oc2lnbXVuZCk6IGZvbGxvdyB1cCB3aXRoIHRoZSBDRkUgdG8gc2VlIGlmIHdlIGNhbiByZW1vdmUgdGhlIG5lZWQKLSAgLy8gZm9yIHRoZSAucGFja2FnZXMgZW50cnkgYWx0b2dldGhlciBpZiB0aGV5IHdvbid0IG5lZWQgdG8gcmVhZCB0aGUKLSAgLy8gc291cmNlcy4KKyAgLy8gZm9yIHRoZXNlIGR1bW15IGVudHJpZXMuLgorICAvLyBUT0RPKGpvc2h1YWxpdHQpOiBHZW5lcmF0ZSBqdXN0IHRoZSBqc29uIGZpbGUuCisgIHZhciBwYWNrYWdlc0pzb24gPSBbXTsKICAgdmFyIHBhY2thZ2VzQ29udGVudHMgPSBTdHJpbmdCdWZmZXIoKTsKICAgaWYgKG1vZHVsZS5pc1BhY2thZ2UpIHsKICAgICBwYWNrYWdlc0NvbnRlbnRzLndyaXRlKCcke21vZHVsZS5uYW1lfToke21vZHVsZS5wYWNrYWdlQmFzZX1cbicpOworICAgIHBhY2thZ2VzSnNvbi5hZGQoX3BhY2thZ2VDb25maWdFbnRyeSgKKyAgICAgICAgbW9kdWxlLm5hbWUsIFVyaS5wYXJzZSgnLi4vJHttb2R1bGUucGFja2FnZUJhc2V9JykpKTsKICAgfQogICB2YXIgdW51c2VkTnVtID0gMDsKICAgZm9yICh2YXIgZGVwZW5kZW5jeSBpbiB0cmFuc2l0aXZlRGVwZW5kZW5jaWVzKSB7CiAgICAgaWYgKGRlcGVuZGVuY3kuaXNQYWNrYWdlKSB7CisgICAgICAvLyByb290VXJpIHNob3VsZCBiZSBpZ25vcmVkIGZvciBkZXBlbmRlbnQgbW9kdWxlcywgc28gd2UgcGFzcyBpbiBhCisgICAgICAvLyBib2d1cyB2YWx1ZS4KKyAgICAgIHZhciByb290VXJpID0gVXJpLnBhcnNlKCd1bnVzZWQkdW51c2VkTnVtJyk7CiAgICAgICB1bnVzZWROdW0rKzsKLSAgICAgIHBhY2thZ2VzQ29udGVudHMud3JpdGUoJyR7ZGVwZW5kZW5jeS5uYW1lfTp1bnVzZWQkdW51c2VkTnVtXG4nKTsKKyAgICAgIHZhciBkZXBlbmRlbnRQYWNrYWdlID0gX3BhY2thZ2VDb25maWdbZGVwZW5kZW5jeS5uYW1lXTsKKyAgICAgIHZhciBwYWNrYWdlSnNvbiA9IGRlcGVuZGVudFBhY2thZ2UgPT0gbnVsbAorICAgICAgICAgID8gX3BhY2thZ2VDb25maWdFbnRyeShkZXBlbmRlbmN5Lm5hbWUsIHJvb3RVcmkpCisgICAgICAgICAgOiBfcGFja2FnZUNvbmZpZ0VudHJ5KGRlcGVuZGVudFBhY2thZ2UubmFtZSwgcm9vdFVyaSwKKyAgICAgICAgICAgICAgdmVyc2lvbjogZGVwZW5kZW50UGFja2FnZS5sYW5ndWFnZVZlcnNpb24pOworICAgICAgcGFja2FnZXNKc29uLmFkZChwYWNrYWdlSnNvbik7CisgICAgICBwYWNrYWdlc0NvbnRlbnRzLndyaXRlKCcke2RlcGVuZGVuY3kubmFtZX06JHJvb3RVcmlcbicpOwogICAgIH0KICAgfQogCisgIGlmIChtb2R1bGUuaXNQYWNrYWdlKSB7CisgICAgYXdhaXQgRmlsZS5mcm9tVXJpKHJvb3QucmVzb2x2ZShwYWNrYWdlQ29uZmlnSnNvblBhdGgpKQorICAgICAgICAuY3JlYXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CisgICAgYXdhaXQgRmlsZS5mcm9tVXJpKHJvb3QucmVzb2x2ZShwYWNrYWdlQ29uZmlnSnNvblBhdGgpKS53cml0ZUFzU3RyaW5nKCd7JworICAgICAgICAnICAiY29uZmlnVmVyc2lvbiI6ICR7X3BhY2thZ2VDb25maWcudmVyc2lvbn0sJworICAgICAgICAnICAicGFja2FnZXMiOiBbICR7cGFja2FnZXNKc29uLmpvaW4oJywnKX0gXScKKyAgICAgICAgJ30nKTsKKyAgfQorCiAgIGF3YWl0IEZpbGUuZnJvbVVyaShyb290LnJlc29sdmUoJy5wYWNrYWdlcycpKQogICAgICAgLndyaXRlQXNTdHJpbmcoJyRwYWNrYWdlc0NvbnRlbnRzJyk7CiB9CmRpZmYgLS1naXQgYS9wa2cvZGV2X2NvbXBpbGVyL3Rvb2wvZGFydDJqc19ubmJkX3Nka19lcnJvcl9nb2xkZW4udHh0IGIvcGtnL2Rldl9jb21waWxlci90b29sL2RhcnQyanNfbm5iZF9zZGtfZXJyb3JfZ29sZGVuLnR4dAppbmRleCA5YTY2MmU4Li5lNWI0NjllIDEwMDY0NAotLS0gYS9wa2cvZGV2X2NvbXBpbGVyL3Rvb2wvZGFydDJqc19ubmJkX3Nka19lcnJvcl9nb2xkZW4udHh0CisrKyBiL3BrZy9kZXZfY29tcGlsZXIvdG9vbC9kYXJ0MmpzX25uYmRfc2RrX2Vycm9yX2dvbGRlbi50eHQKQEAgLTEsMTAgKzEsMTAgQEAKLUVSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjM2fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnJic6IEpTTnVtYmVyLiYgKG51bSBGdW5jdGlvbihudW0pKSwgaW50LiYgKGludCBGdW5jdGlvbihpbnQpKS4KLUVSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjM2fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnPDwnOiBKU051bWJlci48PCAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuPDwgKGludCBGdW5jdGlvbihpbnQpKS4KLUVSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjM2fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnPj4nOiBKU051bWJlci4+PiAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuPj4gKGludCBGdW5jdGlvbihpbnQpKS4KLUVSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjM2fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnXHwnOiBKU051bWJlci5cfCAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuXHwgKGludCBGdW5jdGlvbihpbnQpKS4KLUVSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjM2fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnXic6IEpTTnVtYmVyLl4gKG51bSBGdW5jdGlvbihudW0pKSwgaW50Ll4gKGludCBGdW5jdGlvbihpbnQpKS4KLUVSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY1M3wyOHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KLUVSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY1NXwyN3wxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KLUVSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY1OHwxN3wxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KLUVSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY2M3wxOHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KLUVSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY2M3w0NHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjU5fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnJic6IEpTTnVtYmVyLiYgKG51bSBGdW5jdGlvbihudW0pKSwgaW50LiYgKGludCBGdW5jdGlvbihpbnQpKS4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjU5fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnPDwnOiBKU051bWJlci48PCAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuPDwgKGludCBGdW5jdGlvbihpbnQpKS4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjU5fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnPj4nOiBKU051bWJlci4+PiAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuPj4gKGludCBGdW5jdGlvbihpbnQpKS4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjU5fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnXHwnOiBKU051bWJlci5cfCAobnVtIEZ1bmN0aW9uKG51bSkpLCBpbnQuXHwgKGludCBGdW5jdGlvbihpbnQpKS4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxJTkNPTlNJU1RFTlRfSU5IRVJJVEFOQ0V8bGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9pbnRlcmNlcHRvcnMuZGFydHwxNjU5fDd8NXxTdXBlcmludGVyZmFjZXMgZG9uJ3QgaGF2ZSBhIHZhbGlkIG92ZXJyaWRlIGZvciAnXic6IEpTTnVtYmVyLl4gKG51bSBGdW5jdGlvbihudW0pKSwgaW50Ll4gKGludCBGdW5jdGlvbihpbnQpKS4KK0VSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY3NnwyOHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KK0VSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY3OHwyN3wxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KK0VSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY4MXwxN3wxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KK0VSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY4NnwxOHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KK0VSUk9SfFNUQVRJQ19UWVBFX1dBUk5JTkd8VU5ERUZJTkVEX09QRVJBVE9SfGxpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvaW50ZXJjZXB0b3JzLmRhcnR8MTY4Nnw0NHwxfFRoZSBvcGVyYXRvciAnJicgaXNuJ3QgZGVmaW5lZCBmb3IgdGhlIHR5cGUgJ0pTSW50Jy4KZGlmZiAtLWdpdCBhL3BrZy9kZXZfY29tcGlsZXIvdG9vbC9kYXJ0ZGV2Y19ubmJkX3Nka19lcnJvcl9nb2xkZW4udHh0IGIvcGtnL2Rldl9jb21waWxlci90b29sL2RhcnRkZXZjX25uYmRfc2RrX2Vycm9yX2dvbGRlbi50eHQKaW5kZXggYTRlNWY2ZS4uMjFhNjM4YyAxMDA2NDQKLS0tIGEvcGtnL2Rldl9jb21waWxlci90b29sL2RhcnRkZXZjX25uYmRfc2RrX2Vycm9yX2dvbGRlbi50eHQKKysrIGIvcGtnL2Rldl9jb21waWxlci90b29sL2RhcnRkZXZjX25uYmRfc2RrX2Vycm9yX2dvbGRlbi50eHQKQEAgLTEsOCArMSw4IEBACi1FUlJPUnxDT01QSUxFX1RJTUVfRVJST1J8Q09OU1RfQ09OU1RSVUNUT1JfVEhST1dTX0VYQ0VQVElPTnxsaWIvY29yZS9jb3JlLmRhcnR8MzcyM3w1fDk0fENvbnN0IGNvbnN0cnVjdG9ycyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgotRVJST1J8Q09NUElMRV9USU1FX0VSUk9SfENPTlNUX0NPTlNUUlVDVE9SX1RIUk9XU19FWENFUFRJT058bGliL2NvcmUvY29yZS5kYXJ0fDc5MTN8NXw5N3xDb25zdCBjb25zdHJ1Y3RvcnMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4KK0VSUk9SfENPTVBJTEVfVElNRV9FUlJPUnxDT05TVF9DT05TVFJVQ1RPUl9USFJPV1NfRVhDRVBUSU9OfGxpYi9jb3JlL2NvcmUuZGFydHwzNzI2fDV8OTR8Q29uc3QgY29uc3RydWN0b3JzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuCitFUlJPUnxDT01QSUxFX1RJTUVfRVJST1J8Q09OU1RfQ09OU1RSVUNUT1JfVEhST1dTX0VYQ0VQVElPTnxsaWIvY29yZS9jb3JlLmRhcnR8NzkxNnw1fDk3fENvbnN0IGNvbnN0cnVjdG9ycyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgogRVJST1J8Q09NUElMRV9USU1FX0VSUk9SfENPTlNUX0NPTlNUUlVDVE9SX1RIUk9XU19FWENFUFRJT058bGliL2NvcmUvY29yZS5kYXJ0fDk0MHw1fDk1fENvbnN0IGNvbnN0cnVjdG9ycyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgogRVJST1J8Q09NUElMRV9USU1FX0VSUk9SfENPTlNUX0NPTlNUUlVDVE9SX1RIUk9XU19FWENFUFRJT058bGliL2NvcmUvY29yZS5kYXJ0fDk3M3w1fDk0fENvbnN0IGNvbnN0cnVjdG9ycyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgotRVJST1J8U1lOVEFDVElDX0VSUk9SfENPTlNUX0ZBQ1RPUll8bGliL2NvcmUvY29yZS5kYXJ0fDM3MjF8M3w1fE9ubHkgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgY2FuIGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuCi1FUlJPUnxTWU5UQUNUSUNfRVJST1J8Q09OU1RfRkFDVE9SWXxsaWIvY29yZS9jb3JlLmRhcnR8NzkxMXwzfDV8T25seSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW4gYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy4KK0VSUk9SfFNZTlRBQ1RJQ19FUlJPUnxDT05TVF9GQUNUT1JZfGxpYi9jb3JlL2NvcmUuZGFydHwzNzI0fDN8NXxPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLgorRVJST1J8U1lOVEFDVElDX0VSUk9SfENPTlNUX0ZBQ1RPUll8bGliL2NvcmUvY29yZS5kYXJ0fDc5MTR8M3w1fE9ubHkgcmVkaXJlY3RpbmcgZmFjdG9yeSBjb25zdHJ1Y3RvcnMgY2FuIGJlIGRlY2xhcmVkIHRvIGJlICdjb25zdCcuCiBFUlJPUnxTWU5UQUNUSUNfRVJST1J8Q09OU1RfRkFDVE9SWXxsaWIvY29yZS9jb3JlLmRhcnR8OTM4fDN8NXxPbmx5IHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSAnY29uc3QnLgogRVJST1J8U1lOVEFDVElDX0VSUk9SfENPTlNUX0ZBQ1RPUll8bGliL2NvcmUvY29yZS5kYXJ0fDk3MXwzfDV8T25seSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9ycyBjYW4gYmUgZGVjbGFyZWQgdG8gYmUgJ2NvbnN0Jy4KZGlmZiAtLWdpdCBhL3BrZy9leHBlY3QvbGliL2V4cGVjdC5kYXJ0IGIvcGtnL2V4cGVjdC9saWIvZXhwZWN0LmRhcnQKaW5kZXggNzM3NmNhOC4uZmNmNjRkYSAxMDA2NDQKLS0tIGEvcGtnL2V4cGVjdC9saWIvZXhwZWN0LmRhcnQKKysrIGIvcGtnL2V4cGVjdC9saWIvZXhwZWN0LmRhcnQKQEAgLTYxMiw2ICs2MTIsMTkgQEAKICAgICBFeHBlY3QudGhyb3dzKGYsIChlcnJvcikgPT4gZXJyb3IgaXMgTm9TdWNoTWV0aG9kRXJyb3IsIHJlYXNvbik7CiAgIH0KIAorICAvLy8gQ2hlY2tzIHRoYXQgW2ZdIHRocm93cyBhbiBhcHByb3ByaWF0ZSBlcnJvciBvbiBhIG51bGwgYXJndW1lbnQuCisgIC8vLworICAvLy8gSW4gc3Ryb25nIG1vZGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBbVHlwZUVycm9yXSB3aGVuIGNhc3RpbmcgdGhlCisgIC8vLyBgbnVsbGAgdG8gc29tZSBub24tbnVsbGFibGUgdHlwZS4gSW4gd2VhayBtb2RlLCB0aGF0IGNhc3QgaXMgaWdub3JlZCBhbmQKKyAgLy8vIHNvbWUgbGF0ZXIgZXhwbGljaXQgdmFsaWRhdGlvbiBzaG91bGQgaGFuZGxlIGl0IGFuZCBbQXJndW1lbnRFcnJvcl0uCisgIHN0YXRpYyB2b2lkIHRocm93c051bGxDaGVja0Vycm9yKHZvaWQgZigpKSB7CisgICAgaWYgKGlzU3Ryb25nTW9kZSkgeworICAgICAgdGhyb3dzVHlwZUVycm9yKGYpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvd3NBcmd1bWVudEVycm9yKGYpOworICAgIH0KKyAgfQorCiAgIHN0YXRpYyB2b2lkIHRocm93c1JhbmdlRXJyb3Iodm9pZCBmKCksIFtTdHJpbmcgcmVhc29uID0gIlJhbmdlRXJyb3IiXSkgewogICAgIEV4cGVjdC50aHJvd3MoZiwgKGVycm9yKSA9PiBlcnJvciBpcyBSYW5nZUVycm9yLCByZWFzb24pOwogICB9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3NfZ2VuZXJhdGVkLmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvYXBpX3Byb3RvdHlwZS9leHBlcmltZW50YWxfZmxhZ3NfZ2VuZXJhdGVkLmRhcnQKaW5kZXggYTUzZDRmMi4uMjZjNzAyYSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2FwaV9wcm90b3R5cGUvZXhwZXJpbWVudGFsX2ZsYWdzX2dlbmVyYXRlZC5kYXJ0CisrKyBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9hcGlfcHJvdG90eXBlL2V4cGVyaW1lbnRhbF9mbGFnc19nZW5lcmF0ZWQuZGFydApAQCAtMTA4LDYgKzEwOCw5IEBACiAgICJjb2xsZWN0aW9uIjogewogICAgIEV4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGUsCiAgIH0sCisgICJkYXJ0X2ludGVybmFsIjogeworICAgIEV4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGUsCisgIH0sCiAgICJmYWtlX2FzeW5jIjogewogICAgIEV4cGVyaW1lbnRhbEZsYWcubm9uTnVsbGFibGUsCiAgIH0sCkBAIC0xMTcsNiArMTIwLDkgQEAKICAgImZsdXR0ZXIiOiB7CiAgICAgRXhwZXJpbWVudGFsRmxhZy5ub25OdWxsYWJsZSwKICAgfSwKKyAgImZsdXR0ZXJfdGVzdCI6IHsKKyAgICBFeHBlcmltZW50YWxGbGFnLm5vbk51bGxhYmxlLAorICB9LAogICAianMiOiB7CiAgICAgRXhwZXJpbWVudGFsRmxhZy5ub25OdWxsYWJsZSwKICAgfSwKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydCBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9idWlsZGVyL2NsYXNzX2J1aWxkZXIuZGFydAppbmRleCA3ZGNmYWQzLi4yYjdmM2ExIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9jbGFzc19idWlsZGVyLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvY2xhc3NfYnVpbGRlci5kYXJ0CkBAIC04LDYgKzgsNyBAQAogICAgIHNob3cKICAgICAgICAgQXJndW1lbnRzLAogICAgICAgICBBc0V4cHJlc3Npb24sCisgICAgICAgIEFzeW5jTWFya2VyLAogICAgICAgICBDbGFzcywKICAgICAgICAgQ29uc3RydWN0b3IsCiAgICAgICAgIERhcnRUeXBlLApAQCAtODczLDYgKzg3NCw4IEBACiAgICAgcHJvY2VkdXJlLmZ1bmN0aW9uLmJvZHkgPSBuZXcgUmV0dXJuU3RhdGVtZW50KHJlc3VsdCkKICAgICAgIC4uZmlsZU9mZnNldCA9IHByb2NlZHVyZS5maWxlT2Zmc2V0OwogICAgIHByb2NlZHVyZS5mdW5jdGlvbi5ib2R5LnBhcmVudCA9IHByb2NlZHVyZS5mdW5jdGlvbjsKKyAgICBwcm9jZWR1cmUuZnVuY3Rpb24uYXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci5TeW5jOworICAgIHByb2NlZHVyZS5mdW5jdGlvbi5kYXJ0QXN5bmNNYXJrZXIgPSBBc3luY01hcmtlci5TeW5jOwogCiAgICAgcHJvY2VkdXJlLmlzQWJzdHJhY3QgPSBmYWxzZTsKICAgICBwcm9jZWR1cmUuaXNOb1N1Y2hNZXRob2RGb3J3YXJkZXIgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9lbnVtX2J1aWxkZXIuZGFydAppbmRleCBiYzMyYjE4ZC4uOTU4MGRhNyAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvZW51bV9idWlsZGVyLmRhcnQKQEAgLTcsNiArNyw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgIHNob3cKICAgICAgICAgQXJndW1lbnRzLAorICAgICAgICBBc3luY01hcmtlciwKICAgICAgICAgQ2xhc3MsCiAgICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCkBAIC0yMzksNyArMjQwLDggQEAKICAgICAgICAgY2hhck9mZnNldCwKICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgdG9TdHJpbmdSZWZlcmVuY2UsCi0gICAgICAgIG51bGwpOworICAgICAgICBudWxsLAorICAgICAgICBBc3luY01hcmtlci5TeW5jKTsKICAgICBtZW1iZXJzWyJ0b1N0cmluZyJdID0gdG9TdHJpbmdCdWlsZGVyOwogICAgIFN0cmluZyBjbGFzc05hbWUgPSBuYW1lOwogICAgIGlmIChlbnVtQ29uc3RhbnRJbmZvcyAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0IGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydAppbmRleCAwODZlYTQxOS4uMWU5MGRlMyAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2J1aWxkZXIvcHJvY2VkdXJlX2J1aWxkZXIuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvYnVpbGRlci9wcm9jZWR1cmVfYnVpbGRlci5kYXJ0CkBAIC0yMjYsNiArMjI2LDcgQEAKICAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAogICAgICAgUHJvY2VkdXJlIHJlZmVyZW5jZUZyb20sCiAgICAgICB0aGlzLl90ZWFyT2ZmUmVmZXJlbmNlRnJvbSwKKyAgICAgIEFzeW5jTWFya2VyIGFzeW5jTW9kaWZpZXIsCiAgICAgICBbU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWVdKQogICAgICAgOiBzdXBlcigKICAgICAgICAgICAgIG1ldGFkYXRhLApAQCAtMjQxLDcgKzI0Miw5IEBACiAgICAgICAgICAgICBjaGFyT3BlblBhcmVuT2Zmc2V0LAogICAgICAgICAgICAgY2hhckVuZE9mZnNldCwKICAgICAgICAgICAgIHJlZmVyZW5jZUZyb20sCi0gICAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKKyAgICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpIHsKKyAgICB0aGlzLmFzeW5jTW9kaWZpZXIgPSBhc3luY01vZGlmaWVyOworICB9CiAKICAgYm9vbCBfdHlwZUVuc3VyZWQgPSBmYWxzZTsKICAgU2V0PENsYXNzTWVtYmVyPiBfb3ZlcnJpZGVEZXBlbmRlbmNpZXM7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvaW5jcmVtZW50YWxfY29tcGlsZXIuZGFydCBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0CmluZGV4IDAzZDg2YzIuLjAxZmM3MTQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0CisrKyBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9pbmNyZW1lbnRhbF9jb21waWxlci5kYXJ0CkBAIC0xNDM4LDkgKzE0MzgsOSBAQAogICAgIGRpbGxMb2FkZWREYXRhID0gbmV3IERpbGxUYXJnZXQodGlja2VyLCB1cmlUcmFuc2xhdG9yLCBjLm9wdGlvbnMudGFyZ2V0KTsKICAgICBpbnQgYnl0ZXNMZW5ndGggPSAwOwogCisgICAgZGF0YS5jb21wb25lbnQgPSBjLm9wdGlvbnMudGFyZ2V0LmNvbmZpZ3VyZUNvbXBvbmVudChuZXcgQ29tcG9uZW50KCkpOwogICAgIGlmIChzdW1tYXJ5Qnl0ZXMgIT0gbnVsbCkgewogICAgICAgdGlja2VyLmxvZ01zKCJSZWFkICR7Yy5vcHRpb25zLnNka1N1bW1hcnl9Iik7Ci0gICAgICBkYXRhLmNvbXBvbmVudCA9IGMub3B0aW9ucy50YXJnZXQuY29uZmlndXJlQ29tcG9uZW50KG5ldyBDb21wb25lbnQoKSk7CiAgICAgICBuZXcgQmluYXJ5QnVpbGRlcldpdGhNZXRhZGF0YShzdW1tYXJ5Qnl0ZXMsCiAgICAgICAgICAgICAgIGRpc2FibGVMYXp5UmVhZGluZzogZmFsc2UsIGRpc2FibGVMYXp5Q2xhc3NSZWFkaW5nOiB0cnVlKQogICAgICAgICAgIC5yZWFkQ29tcG9uZW50KGRhdGEuY29tcG9uZW50KTsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvYm9keV9idWlsZGVyLmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2JvZHlfYnVpbGRlci5kYXJ0CmluZGV4IDEyYjgyOGQuLjY5ZjRkNzIgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvYm9keV9idWlsZGVyLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9ib2R5X2J1aWxkZXIuZGFydApAQCAtNjU0NiwyNyArNjU0Niw2IEBACiAgIH0KIH0KIAotQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXJGcm9tVG9rZW5zKFRva2VuIGFzeW5jVG9rZW4sIFRva2VuIHN0YXJUb2tlbikgewotICBpZiAoYXN5bmNUb2tlbiA9PSBudWxsIHx8IGlkZW50aWNhbChhc3luY1Rva2VuLnN0cmluZ1ZhbHVlLCAic3luYyIpKSB7Ci0gICAgaWYgKHN0YXJUb2tlbiA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gQXN5bmNNYXJrZXIuU3luYzsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdGFyVG9rZW4uc3RyaW5nVmFsdWUsICIqIikpOwotICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlN5bmNTdGFyOwotICAgIH0KLSAgfSBlbHNlIGlmIChpZGVudGljYWwoYXN5bmNUb2tlbi5zdHJpbmdWYWx1ZSwgImFzeW5jIikpIHsKLSAgICBpZiAoc3RhclRva2VuID09IG51bGwpIHsKLSAgICAgIHJldHVybiBBc3luY01hcmtlci5Bc3luYzsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdGFyVG9rZW4uc3RyaW5nVmFsdWUsICIqIikpOwotICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLkFzeW5jU3RhcjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHVuaGFuZGxlZChhc3luY1Rva2VuLmxleGVtZSwgImFzeW5jTWFya2VyRnJvbVRva2VucyIsCi0gICAgICAgIGFzeW5jVG9rZW4uY2hhck9mZnNldCwgbnVsbCk7Ci0gIH0KLX0KLQogLy8vIEEgZGF0YSBob2xkZXIgdXNlZCB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGxhYmVsIHRoYXQgaXMgcHVzaGVkIG9uCiAvLy8gdGhlIHN0YWNrLgogY2xhc3MgTGFiZWwgewpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb2xsZWN0aW9ucy5kYXJ0IGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9jb2xsZWN0aW9ucy5kYXJ0CmluZGV4IDc5NDRiYTUuLjBhMjZjM2EgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvY29sbGVjdGlvbnMuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2NvbGxlY3Rpb25zLmRhcnQKQEAgLTEwOCw4ICsxMDgsMTIgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICB2b2lkIHRvVGV4dEludGVybmFsKEFzdFByaW50ZXIgc3RhdGUpIHsKLSAgICAvLyBUT0RPKGpvaG5uaXdpbnRoZXIpOiBJbXBsZW1lbnQgdGhpcy4KKyAgdm9pZCB0b1RleHRJbnRlcm5hbChBc3RQcmludGVyIHByaW50ZXIpIHsKKyAgICBwcmludGVyLndyaXRlKCcuLi4nKTsKKyAgICBpZiAoaXNOdWxsQXdhcmUpIHsKKyAgICAgIHByaW50ZXIud3JpdGUoJz8nKTsKKyAgICB9CisgICAgcHJpbnRlci53cml0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7CiAgIH0KIH0KIApAQCAtMTc0LDggKzE3OCwxNSBAQAogICB9CiAKICAgQG92ZXJyaWRlCi0gIHZvaWQgdG9UZXh0SW50ZXJuYWwoQXN0UHJpbnRlciBzdGF0ZSkgewotICAgIC8vIFRPRE8oam9obm5pd2ludGhlcik6IEltcGxlbWVudCB0aGlzLgorICB2b2lkIHRvVGV4dEludGVybmFsKEFzdFByaW50ZXIgcHJpbnRlcikgeworICAgIHByaW50ZXIud3JpdGUoJ2lmICgnKTsKKyAgICBwcmludGVyLndyaXRlRXhwcmVzc2lvbihjb25kaXRpb24pOworICAgIHByaW50ZXIud3JpdGUoJykgJyk7CisgICAgcHJpbnRlci53cml0ZUV4cHJlc3Npb24odGhlbik7CisgICAgaWYgKG90aGVyd2lzZSAhPSBudWxsKSB7CisgICAgICBwcmludGVyLndyaXRlKCcgZWxzZSAnKTsKKyAgICAgIHByaW50ZXIud3JpdGVFeHByZXNzaW9uKG90aGVyd2lzZSk7CisgICAgfQogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJlbmNlX3Zpc2l0b3IuZGFydCBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW5mZXJlbmNlX3Zpc2l0b3IuZGFydAppbmRleCA5NjQ0ODk0Li4xZThlMjFlIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2luZmVyZW5jZV92aXNpdG9yLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbmZlcmVuY2VfdmlzaXRvci5kYXJ0CkBAIC0yNzEsNyArMjcxLDcgQEAKICAgICAgICAgbm9kZS5vcGVyYW5kLCB0eXBlQ29udGV4dCwgdHJ1ZSwKICAgICAgICAgaXNWb2lkQWxsb3dlZDogIWluZmVycmVyLmlzTm9uTnVsbGFibGVCeURlZmF1bHQpOwogICAgIERhcnRUeXBlIGluZmVycmVkVHlwZSA9Ci0gICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUob3BlcmFuZFJlc3VsdC5pbmZlcnJlZFR5cGUpOworICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZmxhdHRlbihvcGVyYW5kUmVzdWx0LmluZmVycmVkVHlwZSk7CiAgICAgbm9kZS5vcGVyYW5kID0gb3BlcmFuZFJlc3VsdC5leHByZXNzaW9uLi5wYXJlbnQgPSBub2RlOwogICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdChpbmZlcnJlZFR5cGUsIG5vZGUpOwogICB9CkBAIC03NDgsNyArNzQ4LDggQEAKICAgICBhc3NlcnQoZ2V0RXhwbGljaXRUeXBlQXJndW1lbnRzKG5vZGUuYXJndW1lbnRzKSA9PSBudWxsKTsKICAgICBUeXBlZGVmIHR5cGVkZWYgPSBub2RlLnR5cGVBbGlhc0J1aWxkZXIudHlwZWRlZjsKICAgICBGdW5jdGlvblR5cGUgY2FsbGVlVHlwZSA9IG5vZGUudGFyZ2V0LmZ1bmN0aW9uCi0gICAgICAgIC5jb21wdXRlQWxpYXNlZEZ1bmN0aW9uVHlwZSh0eXBlZGVmLCBpbmZlcnJlci5saWJyYXJ5LmxpYnJhcnkpOworICAgICAgICAuY29tcHV0ZUFsaWFzZWRDb25zdHJ1Y3RvckZ1bmN0aW9uVHlwZSgKKyAgICAgICAgICAgIHR5cGVkZWYsIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CiAgICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCiAgICAgICAgIHR5cGVDb250ZXh0LCBub2RlLmZpbGVPZmZzZXQsIGNhbGxlZVR5cGUsIG5vZGUuYXJndW1lbnRzLAogICAgICAgICByZXR1cm5UeXBlOiBjYWxsZWVUeXBlLnJldHVyblR5cGUudW5hbGlhcywgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKQEAgLTc3MiwxMCArNzczLDI5IEBACiAKICAgRXhwcmVzc2lvbkluZmVyZW5jZVJlc3VsdCB2aXNpdFR5cGVBbGlhc2VkRmFjdG9yeUludm9jYXRpb25KdWRnbWVudCgKICAgICAgIFR5cGVBbGlhc2VkRmFjdG9yeUludm9jYXRpb25KdWRnbWVudCBub2RlLCBEYXJ0VHlwZSB0eXBlQ29udGV4dCkgewotICAgIC8vIFRPRE8oZWVybnN0KTogU2VlIHZpc2l0VHlwZUFsaWFzZWRDb25zdHJ1Y3Rvckludm9jYXRpb25KdWRnbWVudAotICAgIC8vIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBoYW5kbGluZyBhIHNpbWlsYXIgdGFzay4KLSAgICB0aHJvdyAidmlzaXRUeXBlQWxpYXNlZEZhY3RvcnlJbnZvY2F0aW9uSnVkZ21lbnQ6ICIKLSAgICAgICAgIiR7bm9kZS50eXBlQWxpYXNCdWlsZGVyfSwgJHtub2RlLnRhcmdldH0sICR0eXBlQ29udGV4dCI7CisgICAgYXNzZXJ0KGdldEV4cGxpY2l0VHlwZUFyZ3VtZW50cyhub2RlLmFyZ3VtZW50cykgPT0gbnVsbCk7CisgICAgVHlwZWRlZiB0eXBlZGVmID0gbm9kZS50eXBlQWxpYXNCdWlsZGVyLnR5cGVkZWY7CisgICAgRnVuY3Rpb25UeXBlIGNhbGxlZVR5cGUgPSBub2RlLnRhcmdldC5mdW5jdGlvbgorICAgICAgICAuY29tcHV0ZUFsaWFzZWRGYWN0b3J5RnVuY3Rpb25UeXBlKHR5cGVkZWYsIGluZmVycmVyLmxpYnJhcnkubGlicmFyeSk7CisgICAgSW52b2NhdGlvbkluZmVyZW5jZVJlc3VsdCByZXN1bHQgPSBpbmZlcnJlci5pbmZlckludm9jYXRpb24oCisgICAgICAgIHR5cGVDb250ZXh0LCBub2RlLmZpbGVPZmZzZXQsIGNhbGxlZVR5cGUsIG5vZGUuYXJndW1lbnRzLAorICAgICAgICByZXR1cm5UeXBlOiBjYWxsZWVUeXBlLnJldHVyblR5cGUudW5hbGlhcywgaXNDb25zdDogbm9kZS5pc0NvbnN0KTsKKyAgICBub2RlLmhhc0JlZW5JbmZlcnJlZCA9IHRydWU7CisgICAgRXhwcmVzc2lvbiByZXN1bHROb2RlID0gbm9kZTsKKyAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKKyAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OworICAgICAgbGlicmFyeS5jaGVja0JvdW5kc0luVHlwZShyZXN1bHQuaW5mZXJyZWRUeXBlLAorICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudCwgaW5mZXJyZXIuaGVscGVyLnVyaSwgbm9kZS5maWxlT2Zmc2V0LAorICAgICAgICAgIGluZmVycmVkOiB0cnVlKTsKKyAgICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICAgIGlmIChub2RlLnRhcmdldCA9PSBpbmZlcnJlci5jb3JlVHlwZXMubGlzdERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAgICAgICAgIHJlc3VsdE5vZGUgPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbShub2RlLAorICAgICAgICAgICAgICBtZXNzYWdlRGVmYXVsdExpc3RDb25zdHJ1Y3RvckVycm9yLCBub2RlLmZpbGVPZmZzZXQsIG5vTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JbmZlcmVuY2VSZXN1bHQoCisgICAgICAgIHJlc3VsdC5pbmZlcnJlZFR5cGUsIHJlc3VsdC5hcHBseVJlc3VsdChyZXN1bHROb2RlKSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKQEAgLTEzMDMsNyArMTMyMywxMSBAQAogICBEYXJ0VHlwZSBnZXRTcHJlYWRFbGVtZW50VHlwZShEYXJ0VHlwZSBzcHJlYWRUeXBlLCBib29sIGlzTnVsbEF3YXJlKSB7CiAgICAgaWYgKHNwcmVhZFR5cGUgaXMgSW50ZXJmYWNlVHlwZSkgewogICAgICAgaWYgKHNwcmVhZFR5cGUuY2xhc3NOb2RlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGlzTnVsbEF3YXJlID8gc3ByZWFkVHlwZSA6IG51bGw7CisgICAgICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICAgICAgcmV0dXJuIGlzTnVsbEF3YXJlID8gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSA6IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGlzTnVsbEF3YXJlID8gc3ByZWFkVHlwZSA6IG51bGw7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIExpc3Q8RGFydFR5cGU+IHN1cGVydHlwZUFyZ3VtZW50cyA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAogICAgICAgICAgIC5nZXRUeXBlQXJndW1lbnRzQXNJbnN0YW5jZU9mKApAQCAtMTcwNiw3ICsxNzMwLDEyIEBACiAgICAgaWYgKHNwcmVhZE1hcEVudHJ5VHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7CiAgICAgICBpZiAoc3ByZWFkTWFwRW50cnlUeXBlLmNsYXNzTm9kZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbENsYXNzKSB7CiAgICAgICAgIGlmIChpc051bGxBd2FyZSkgewotICAgICAgICAgIG91dHB1dFtvZmZzZXRdID0gb3V0cHV0W29mZnNldCArIDFdID0gc3ByZWFkTWFwRW50cnlUeXBlOworICAgICAgICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICAgICAgICBvdXRwdXRbb2Zmc2V0XSA9CisgICAgICAgICAgICAgICAgb3V0cHV0W29mZnNldCArIDFdID0gY29uc3QgTmV2ZXJUeXBlKE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0W29mZnNldF0gPSBvdXRwdXRbb2Zmc2V0ICsgMV0gPSBzcHJlYWRNYXBFbnRyeVR5cGU7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICBMaXN0PERhcnRUeXBlPiBzdXBlcnR5cGVBcmd1bWVudHMgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQKQEAgLTIxMzIsNyArMjE2MSw3IEBACiAgICAgYm9vbCB0eXBlQ29udGV4dElzTWFwID0gbm9kZS5rZXlUeXBlIGlzISBJbXBsaWNpdFR5cGVBcmd1bWVudDsKICAgICBib29sIHR5cGVDb250ZXh0SXNJdGVyYWJsZSA9IGZhbHNlOwogICAgIERhcnRUeXBlIHVuZnV0dXJlZFR5cGVDb250ZXh0ID0KLSAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZSh0eXBlQ29udGV4dCk7CisgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5mbGF0dGVuKHR5cGVDb250ZXh0KTsKICAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwgJiYgaW5mZXJlbmNlTmVlZGVkKSB7CiAgICAgICAvLyBBbWJpZ3VvdXMgc2V0L21hcCBsaXRlcmFsCiAgICAgICBpZiAodW5mdXR1cmVkVHlwZUNvbnRleHQgaXMgSW50ZXJmYWNlVHlwZSkgewpAQCAtNTQ1MSw5ICs1NDgwLDcgQEAKICAgICAgIGluZmVycmVkVHlwZSA9IGluZmVycmVyLmluZmVyRGVjbGFyYXRpb25UeXBlKAogICAgICAgICAgIGluaXRpYWxpemVyUmVzdWx0LmluZmVycmVkVHlwZSwKICAgICAgICAgICBmb3JTeW50aGV0aWNWYXJpYWJsZTogbm9kZS5uYW1lID09IG51bGwpOwotICAgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmRlY2xhcmUobm9kZSwgdHJ1ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGluZmVycmVyLmZsb3dBbmFseXNpcy5kZWNsYXJlKG5vZGUsIGZhbHNlKTsKICAgICAgIGluZmVycmVkVHlwZSA9IGNvbnN0IER5bmFtaWNUeXBlKCk7CiAgICAgfQogICAgIGlmIChub2RlLmlzSW1wbGljaXRseVR5cGVkKSB7CkBAIC01NDcwLDYgKzU0OTcsNyBAQAogICAgICAgICAgIGZpbGVPZmZzZXQ6IG5vZGUuZmlsZU9mZnNldCwgaXNWb2lkQWxsb3dlZDogbm9kZS50eXBlIGlzIFZvaWRUeXBlKTsKICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplci4ucGFyZW50ID0gbm9kZTsKICAgICB9CisgICAgaW5mZXJyZXIuZmxvd0FuYWx5c2lzLmRlY2xhcmUobm9kZSwgbm9kZS5pbml0aWFsaXplciAhPSBudWxsKTsKICAgICBpZiAoIWluZmVycmVyLmlzVG9wTGV2ZWwpIHsKICAgICAgIFNvdXJjZUxpYnJhcnlCdWlsZGVyIGxpYnJhcnkgPSBpbmZlcnJlci5saWJyYXJ5OwogICAgICAgaWYgKG5vZGUuaXNJbXBsaWNpdGx5VHlwZWQpIHsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW50ZXJuYWxfYXN0LmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEva2VybmVsL2ludGVybmFsX2FzdC5kYXJ0CmluZGV4IDM3N2RhY2UuLjc2YjQwYmEgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9rZXJuZWwvaW50ZXJuYWxfYXN0LmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL2tlcm5lbC9pbnRlcm5hbF9hc3QuZGFydApAQCAtMzUwMCw2ICszNTAwLDE3IEBACiAgIFN0cmluZyB0b1N0cmluZygpIHsKICAgICByZXR1cm4gIkVxdWFsc0V4cHJlc3Npb24oJHt0b1N0cmluZ0ludGVybmFsKCl9KSI7CiAgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCB0b1RleHRJbnRlcm5hbChBc3RQcmludGVyIHByaW50ZXIpIHsKKyAgICBwcmludGVyLndyaXRlRXhwcmVzc2lvbihsZWZ0LCBtaW5pbXVtUHJlY2VkZW5jZTogUHJlY2VkZW5jZS5FUVVBTElUWSk7CisgICAgaWYgKGlzTm90KSB7CisgICAgICBwcmludGVyLndyaXRlKCcgIT0gJyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXIud3JpdGUoJyA9PSAnKTsKKyAgICB9CisgICAgcHJpbnRlci53cml0ZUV4cHJlc3Npb24ocmlnaHQsIG1pbmltdW1QcmVjZWRlbmNlOiBQcmVjZWRlbmNlLkVRVUFMSVRZICsgMSk7CisgIH0KIH0KIAogLy8vIEludGVybmFsIGV4cHJlc3Npb24gZm9yIGEgYmluYXJ5IGV4cHJlc3Npb24uCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL291dGxpbmVfYnVpbGRlci5kYXJ0IGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9vdXRsaW5lX2J1aWxkZXIuZGFydAppbmRleCBkYTliZjlkLi4zN2E5NTM1IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL291dGxpbmVfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvb3V0bGluZV9idWlsZGVyLmRhcnQKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCAncGFja2FnZTpfZmVfYW5hbHl6ZXJfc2hhcmVkL3NyYy9zY2FubmVyL3NjYW5uZXIuZGFydCcgc2hvdyBUb2tlbjsKIAogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKLSAgICBzaG93IEludmFsaWRUeXBlLCBOdWxsYWJpbGl0eSwgUHJvY2VkdXJlS2luZCwgVmFyaWFuY2U7CisgICAgc2hvdyBBc3luY01hcmtlciwgSW52YWxpZFR5cGUsIE51bGxhYmlsaXR5LCBQcm9jZWR1cmVLaW5kLCBWYXJpYW5jZTsKIAogaW1wb3J0ICcuLi9idWlsZGVyL2NvbnN0cnVjdG9yX3JlZmVyZW5jZV9idWlsZGVyLmRhcnQnOwogaW1wb3J0ICcuLi9idWlsZGVyL2VudW1fYnVpbGRlci5kYXJ0JzsKQEAgLTc5Nyw2ICs3OTcsNyBAQAogICB2b2lkIGVuZFRvcExldmVsTWV0aG9kKFRva2VuIGJlZ2luVG9rZW4sIFRva2VuIGdldE9yU2V0LCBUb2tlbiBlbmRUb2tlbikgewogICAgIGRlYnVnRXZlbnQoImVuZFRvcExldmVsTWV0aG9kIik7CiAgICAgTWV0aG9kQm9keSBraW5kID0gcG9wKCk7CisgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciA9IHBvcCgpOwogICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgIGludCBmb3JtYWxzT2Zmc2V0ID0gcG9wKCk7CiAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CkBAIC04NDEsNiArODQyLDcgQEAKICAgICAgICAgZm9ybWFsc09mZnNldCwKICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgbmF0aXZlTWV0aG9kTmFtZSwKKyAgICAgICAgYXN5bmNNb2RpZmllciwKICAgICAgICAgaXNUb3BMZXZlbDogdHJ1ZSk7CiAgICAgbmF0aXZlTWV0aG9kTmFtZSA9IG51bGw7CiAgIH0KQEAgLTk3Myw2ICs5NzUsNyBAQAogICAgICAgcG9wKCk7CiAgICAgfQogICAgIGFzc2VydChjaGVja1N0YXRlKGJlZ2luVG9rZW4sIFsKKyAgICAgIFZhbHVlS2luZHMuQXN5bmNNb2RpZmllciwKICAgICAgIFZhbHVlS2luZHMuRm9ybWFsc09yTnVsbCwKICAgICAgIFZhbHVlS2luZHMuSW50ZWdlciwgLy8gZm9ybWFscyBvZmZzZXQKICAgICAgIFZhbHVlS2luZHMuVHlwZVZhcmlhYmxlTGlzdE9yTnVsbCwKQEAgLTk4OCw2ICs5OTEsNyBAQAogICAgICAgVmFsdWVLaW5kcy5JbnRlZ2VyLCAvLyB2YXIvZmluYWwvY29uc3Qgb2Zmc2V0CiAgICAgICBWYWx1ZUtpbmRzLk1ldGFkYXRhTGlzdE9yTnVsbCwKICAgICBdKSk7CisgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciA9IHBvcCgpOwogICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgIGludCBmb3JtYWxzT2Zmc2V0ID0gcG9wKCk7CiAgICAgTGlzdDxUeXBlVmFyaWFibGVCdWlsZGVyPiB0eXBlVmFyaWFibGVzID0gcG9wKCk7CkBAIC0xMTgxLDYgKzExODUsNyBAQAogICAgICAgICAgIGZvcm1hbHNPZmZzZXQsCiAgICAgICAgICAgZW5kVG9rZW4uY2hhck9mZnNldCwKICAgICAgICAgICBuYXRpdmVNZXRob2ROYW1lLAorICAgICAgICAgIGFzeW5jTW9kaWZpZXIsCiAgICAgICAgICAgaXNUb3BMZXZlbDogZmFsc2UpOwogICAgIH0KICAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKQEAgLTE5MjYsNiArMTkzMSw3IEBACiAgICAgaWYgKGtpbmQgPT0gTWV0aG9kQm9keS5SZWRpcmVjdGluZ0ZhY3RvcnlCb2R5KSB7CiAgICAgICByZWRpcmVjdGlvblRhcmdldCA9IG51bGxJZlBhcnNlclJlY292ZXJ5KHBvcCgpKTsKICAgICB9CisgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciA9IHBvcCgpOwogICAgIExpc3Q8Rm9ybWFsUGFyYW1ldGVyQnVpbGRlcj4gZm9ybWFscyA9IHBvcCgpOwogICAgIGludCBmb3JtYWxzT2Zmc2V0ID0gcG9wKCk7CiAgICAgcG9wKCk7IC8vIHR5cGUgdmFyaWFibGVzCkBAIC0xOTQzLDE3ICsxOTQ5LDE5IEBACiAgICAgfQogICAgIFN0cmluZyBkb2N1bWVudGF0aW9uQ29tbWVudCA9IGdldERvY3VtZW50YXRpb25Db21tZW50KGJlZ2luVG9rZW4pOwogICAgIGxpYnJhcnlCdWlsZGVyLmFkZEZhY3RvcnlNZXRob2QoCi0gICAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAotICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgbW9kaWZpZXJzLAotICAgICAgICBuYW1lLAotICAgICAgICBmb3JtYWxzLAotICAgICAgICByZWRpcmVjdGlvblRhcmdldCwKLSAgICAgICAgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LAotICAgICAgICBjaGFyT2Zmc2V0LAotICAgICAgICBmb3JtYWxzT2Zmc2V0LAotICAgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAotICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKKyAgICAgIGRvY3VtZW50YXRpb25Db21tZW50LAorICAgICAgbWV0YWRhdGEsCisgICAgICBtb2RpZmllcnMsCisgICAgICBuYW1lLAorICAgICAgZm9ybWFscywKKyAgICAgIHJlZGlyZWN0aW9uVGFyZ2V0LAorICAgICAgYmVnaW5Ub2tlbi5jaGFyT2Zmc2V0LAorICAgICAgY2hhck9mZnNldCwKKyAgICAgIGZvcm1hbHNPZmZzZXQsCisgICAgICBlbmRUb2tlbi5jaGFyT2Zmc2V0LAorICAgICAgbmF0aXZlTWV0aG9kTmFtZSwKKyAgICAgIGFzeW5jTW9kaWZpZXIsCisgICAgKTsKICAgICBuYXRpdmVNZXRob2ROYW1lID0gbnVsbDsKICAgICBpbkNvbnN0cnVjdG9yID0gZmFsc2U7CiAgIH0KQEAgLTIwNjAsNiArMjA2OCw3IEBACiAgIEBvdmVycmlkZQogICB2b2lkIGhhbmRsZUFzeW5jTW9kaWZpZXIoVG9rZW4gYXN5bmNUb2tlbiwgVG9rZW4gc3RhclRva2VuKSB7CiAgICAgZGVidWdFdmVudCgiQXN5bmNNb2RpZmllciIpOworICAgIHB1c2goYXN5bmNNYXJrZXJGcm9tVG9rZW5zKGFzeW5jVG9rZW4sIHN0YXJUb2tlbikpOwogICB9CiAKICAgdm9pZCBhZGRQcm9ibGVtKE1lc3NhZ2UgbWVzc2FnZSwgaW50IGNoYXJPZmZzZXQsIGludCBsZW5ndGgsCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9saWJyYXJ5X2J1aWxkZXIuZGFydCBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0CmluZGV4IGFiMTNiZjcuLjlkNDg5ZDYgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc291cmNlX2xpYnJhcnlfYnVpbGRlci5kYXJ0CkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JwogICAgIHNob3cKICAgICAgICAgQXJndW1lbnRzLAorICAgICAgICBBc3luY01hcmtlciwKICAgICAgICAgQ2xhc3MsCiAgICAgICAgIENvbnN0cnVjdG9yLAogICAgICAgICBDb25zdHJ1Y3Rvckludm9jYXRpb24sCkBAIC0yMTIwLDYgKzIxMjEsNyBAQAogICAgICAgaW50IGNoYXJPcGVuUGFyZW5PZmZzZXQsCiAgICAgICBpbnQgY2hhckVuZE9mZnNldCwKICAgICAgIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lLAorICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllciwKICAgICAgIHtib29sIGlzVG9wTGV2ZWx9KSB7CiAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IgPSBsb2FkZXIudGFyZ2V0Lm1ldGFkYXRhQ29sbGVjdG9yOwogICAgIGlmIChyZXR1cm5UeXBlID09IG51bGwpIHsKQEAgLTIxOTQsNiArMjE5Niw3IEBACiAgICAgICAgIGNoYXJFbmRPZmZzZXQsCiAgICAgICAgIHJlZmVyZW5jZUZyb20sCiAgICAgICAgIHRlYXJPZmZSZWZlcmVuY2VGcm9tLAorICAgICAgICBhc3luY01vZGlmaWVyLAogICAgICAgICBuYXRpdmVNZXRob2ROYW1lKTsKICAgICBtZXRhZGF0YUNvbGxlY3Rvcj8uc2V0RG9jdW1lbnRhdGlvbkNvbW1lbnQoCiAgICAgICAgIHByb2NlZHVyZUJ1aWxkZXIucHJvY2VkdXJlLCBkb2N1bWVudGF0aW9uQ29tbWVudCk7CkBAIC0yMjE2LDcgKzIyMTksOCBAQAogICAgICAgaW50IGNoYXJPZmZzZXQsCiAgICAgICBpbnQgY2hhck9wZW5QYXJlbk9mZnNldCwKICAgICAgIGludCBjaGFyRW5kT2Zmc2V0LAotICAgICAgU3RyaW5nIG5hdGl2ZU1ldGhvZE5hbWUpIHsKKyAgICAgIFN0cmluZyBuYXRpdmVNZXRob2ROYW1lLAorICAgICAgQXN5bmNNYXJrZXIgYXN5bmNNb2RpZmllcikgewogICAgIFR5cGVCdWlsZGVyIHJldHVyblR5cGUgPSBhZGROYW1lZFR5cGUoCiAgICAgICAgIGN1cnJlbnRUeXBlUGFyYW1ldGVyU2NvcGVCdWlsZGVyLnBhcmVudC5uYW1lLAogICAgICAgICBjb25zdCBOdWxsYWJpbGl0eUJ1aWxkZXIub21pdHRlZCgpLApAQCAtMjI3OCw2ICsyMjgyLDcgQEAKICAgICAgICAgICBjaGFyRW5kT2Zmc2V0LAogICAgICAgICAgIHJlZmVyZW5jZUZyb20sCiAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICBhc3luY01vZGlmaWVyLAogICAgICAgICAgIG5hdGl2ZU1ldGhvZE5hbWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zb3VyY2VfbG9hZGVyLmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydAppbmRleCBlNmNmNTgyLi5kZDEwMjFiIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3NvdXJjZV9sb2FkZXIuZGFydApAQCAtMjksNiArMjksNyBAQAogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcKICAgICBzaG93CiAgICAgICAgIEFyZ3VtZW50cywKKyAgICAgICAgQXN5bmNNYXJrZXIsCiAgICAgICAgIEJvdHRvbVR5cGUsCiAgICAgICAgIENsYXNzLAogICAgICAgICBDb21wb25lbnQsCkBAIC0zOTgsNyArMzk5LDggQEAKICAgICAgICAgLTEsCiAgICAgICAgIC0xLAogICAgICAgICBudWxsLAotICAgICAgICBudWxsKQorICAgICAgICBudWxsLAorICAgICAgICBBc3luY01hcmtlci5TeW5jKQogICAgICAgLi5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgQm9keUJ1aWxkZXIgbGlzdGVuZXIgPSBkaWV0TGlzdGVuZXIuY3JlYXRlTGlzdGVuZXIoCiAgICAgICAgIGJ1aWxkZXIsIGRpZXRMaXN0ZW5lci5tZW1iZXJTY29wZSwKQEAgLTEzMDAsMTAgKzEzMDIsMTIgQEAKIAogY2xhc3MgX0dyb3dhYmxlTGlzdDxFPiB7CiAgIGZhY3RvcnkgX0dyb3dhYmxlTGlzdCgpID0+IG51bGw7CisgIGZhY3RvcnkgX0dyb3dhYmxlTGlzdC5maWxsZWQoKSA9PiBudWxsOwogfQogCiBjbGFzcyBfTGlzdDxFPiB7CiAgIGZhY3RvcnkgX0xpc3QoKSA9PiBudWxsOworICBmYWN0b3J5IF9MaXN0LmZpbGxlZCgpID0+IG51bGw7CiB9CiAKIGNsYXNzIE1hcEVudHJ5PEssIFY+IHsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2Uvc3RhY2tfbGlzdGVuZXJfaW1wbC5kYXJ0IGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lcl9pbXBsLmRhcnQKaW5kZXggOWViNDkxMi4uMmQ0NTc3YiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lcl9pbXBsLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS9zdGFja19saXN0ZW5lcl9pbXBsLmRhcnQKQEAgLTI1LDYgKzI1LDI3IEBACiBhYnN0cmFjdCBjbGFzcyBTdGFja0xpc3RlbmVySW1wbCBleHRlbmRzIFN0YWNrTGlzdGVuZXIgewogICBTb3VyY2VMaWJyYXJ5QnVpbGRlciBnZXQgbGlicmFyeUJ1aWxkZXI7CiAKKyAgQXN5bmNNYXJrZXIgYXN5bmNNYXJrZXJGcm9tVG9rZW5zKFRva2VuIGFzeW5jVG9rZW4sIFRva2VuIHN0YXJUb2tlbikgeworICAgIGlmIChhc3luY1Rva2VuID09IG51bGwgfHwgaWRlbnRpY2FsKGFzeW5jVG9rZW4uc3RyaW5nVmFsdWUsICJzeW5jIikpIHsKKyAgICAgIGlmIChzdGFyVG9rZW4gPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gQXN5bmNNYXJrZXIuU3luYzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChpZGVudGljYWwoc3RhclRva2VuLnN0cmluZ1ZhbHVlLCAiKiIpKTsKKyAgICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLlN5bmNTdGFyOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGFzeW5jVG9rZW4uc3RyaW5nVmFsdWUsICJhc3luYyIpKSB7CisgICAgICBpZiAoc3RhclRva2VuID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIEFzeW5jTWFya2VyLkFzeW5jOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGlkZW50aWNhbChzdGFyVG9rZW4uc3RyaW5nVmFsdWUsICIqIikpOworICAgICAgICByZXR1cm4gQXN5bmNNYXJrZXIuQXN5bmNTdGFyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdW5oYW5kbGVkKGFzeW5jVG9rZW4ubGV4ZW1lLCAiYXN5bmNNYXJrZXJGcm9tVG9rZW5zIiwKKyAgICAgICAgICBhc3luY1Rva2VuLmNoYXJPZmZzZXQsIG51bGwpOworICAgIH0KKyAgfQorCiAgIC8vIFRPRE8oYWhlKTogVGhpcyBkb2Vzbid0IGJlbG9uZyBoZXJlLiBPbmx5IGltcGxlbWVudGVkIGJ5IGJvZHlfYnVpbGRlci5kYXJ0CiAgIC8vIGFuZCBhc3RfYnVpbGRlci5kYXJ0LgogICB2b2lkIGZpbmlzaEZ1bmN0aW9uKApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0IGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3NvdXJjZS92YWx1ZV9raW5kcy5kYXJ0CmluZGV4IDEyNjhlODEuLmI3ZDgwZGMgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS9zb3VyY2UvdmFsdWVfa2luZHMuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvc291cmNlL3ZhbHVlX2tpbmRzLmRhcnQKQEAgLTY0LDYgKzY0LDggQEAKICAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBJZGVudGlmaWVyT3JOdWxsID0KICAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLklkZW50aWZpZXI+KE51bGxWYWx1ZS5JZGVudGlmaWVyKTsKICAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBJbnRlZ2VyID0gY29uc3QgU2luZ2xlVmFsdWVLaW5kPGludD4oKTsKKyAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBBc3luY01vZGlmaWVyID0KKyAgICAgIGNvbnN0IFNpbmdsZVZhbHVlS2luZDx0eXBlLkFzeW5jTWFya2VyPigpOwogICBzdGF0aWMgY29uc3QgVmFsdWVLaW5kIEZvcm1hbHMgPQogICAgICAgY29uc3QgU2luZ2xlVmFsdWVLaW5kPExpc3Q8dHlwZS5Gb3JtYWxQYXJhbWV0ZXJCdWlsZGVyPj4oKTsKICAgc3RhdGljIGNvbnN0IFZhbHVlS2luZCBGb3JtYWxzT3JOdWxsID0KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS9jbG9zdXJlX2NvbnRleHQuZGFydCBiL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS9jbG9zdXJlX2NvbnRleHQuZGFydAppbmRleCAxZmYzNDRmLi4wMjUxZjBjIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvY2xvc3VyZV9jb250ZXh0LmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL2Nsb3N1cmVfY29udGV4dC5kYXJ0CkBAIC01Myw4ICs1MywxMyBAQAogICAgICAgICAgICAgeWllbGRDb250ZXh0LCBkZWNsYXJlZFJldHVyblR5cGUsIG5lZWRUb0luZmVyUmV0dXJuVHlwZSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChpc0FzeW5jKSB7Ci0gICAgICByZXR1cm5Db250ZXh0ID0gaW5mZXJyZXIud3JhcEZ1dHVyZU9yVHlwZSgKLSAgICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHJldHVybkNvbnRleHQpKTsKKyAgICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICAgIHJldHVybkNvbnRleHQgPSBpbmZlcnJlci53cmFwRnV0dXJlT3JUeXBlKAorICAgICAgICAgICAgaW5mZXJyZXIuY29tcHV0ZUZ1dHVyZVZhbHVlVHlwZVNjaGVtYShyZXR1cm5Db250ZXh0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm5Db250ZXh0ID0gaW5mZXJyZXIud3JhcEZ1dHVyZU9yVHlwZSgKKyAgICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5mbGF0dGVuKHJldHVybkNvbnRleHQpKTsKKyAgICAgIH0KICAgICAgIHJldHVybiBuZXcgX0FzeW5jQ2xvc3VyZUNvbnRleHQoCiAgICAgICAgICAgcmV0dXJuQ29udGV4dCwgZGVjbGFyZWRSZXR1cm5UeXBlLCBuZWVkVG9JbmZlclJldHVyblR5cGUpOwogICAgIH0gZWxzZSB7CkBAIC0xNDgsNTggKzE1MywxMTUgQEAKIAogICB2b2lkIF9jaGVja1ZhbGlkUmV0dXJuKFR5cGVJbmZlcnJlckltcGwgaW5mZXJyZXIsIERhcnRUeXBlIHJldHVyblR5cGUsCiAgICAgICBSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50LCBEYXJ0VHlwZSBleHByZXNzaW9uVHlwZSkgewotICAgIC8vIFRoZSBydWxlcyBmb3IgdmFsaWQgcmV0dXJucyBmb3IgZnVuY3Rpb25zIHdpdGggW3JldHVyblR5cGVdIGBUYCBhbmQKLSAgICAvLyBhIHJldHVybiBleHByZXNzaW9uIHdpdGggc3RhdGljIFtleHByZXNzaW9uVHlwZV0gYFNgLgotICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAvLyBgcmV0dXJuO2AgaXMgYSB2YWxpZCByZXR1cm4gaWYgVCBpcyB2b2lkLCBkeW5hbWljLCBvciBOdWxsLgotICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUgfHwKLSAgICAgICAgICByZXR1cm5UeXBlIGlzIER5bmFtaWNUeXBlIHx8Ci0gICAgICAgICAgcmV0dXJuVHlwZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUpIHsKLSAgICAgICAgLy8gVmFsaWQgcmV0dXJuOworICAgIGlmIChpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm47YCwgdW5sZXNzIFQgaXMgdm9pZCwKKyAgICAgICAgLy8gZHluYW1pYywgb3IgTnVsbC4KKyAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUgfHwKKyAgICAgICAgICAgIHJldHVyblR5cGUgaXMgRHluYW1pY1R5cGUgfHwKKyAgICAgICAgICAgIHJldHVyblR5cGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7CisgICAgICAgICAgLy8gVmFsaWQgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCisgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvblN5bmMsCisgICAgICAgICAgICAgIHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAotICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKLSAgICAgICAgICAgIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbiwKLSAgICAgICAgICAgIHN0YXRlbWVudC5maWxlT2Zmc2V0LAotICAgICAgICAgICAgbm9MZW5ndGgpCi0gICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGlmIChfaXNBcnJvdyAmJiByZXR1cm5UeXBlIGlzIFZvaWRUeXBlKSB7CisgICAgICAgICAgLy8gRm9yIGA9PiBlYCBpdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBUIGlzIG5vdCB2b2lkLCBhbmQgaXQKKyAgICAgICAgICAvLyB3b3VsZCBoYXZlIGJlZW4gYSBjb21waWxlLXRpbWUgZXJyb3IgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gd2l0aAorICAgICAgICAgIC8vIHRoZSBib2R5IGB7IHJldHVybiBlOyB9YCByYXRoZXIgdGhhbiBgPT4gZWAuCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldHVyblR5cGUgaXMgVm9pZFR5cGUgJiYKKyAgICAgICAgICAgICEoZXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUgfHwKKyAgICAgICAgICAgICAgICBleHByZXNzaW9uVHlwZSBpcyBEeW5hbWljVHlwZSB8fAorICAgICAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm4gZTtgLCBUIGlzIHZvaWQsIGFuZCBTIGlzCisgICAgICAgICAgLy8gbmVpdGhlciB2b2lkLCBkeW5hbWljLCBub3IgTnVsbC4KKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb24sCisgICAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG5vTGVuZ3RoKQorICAgICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0gZWxzZSBpZiAoIShyZXR1cm5UeXBlIGlzIFZvaWRUeXBlIHx8IHJldHVyblR5cGUgaXMgRHluYW1pY1R5cGUpICYmCisgICAgICAgICAgICBleHByZXNzaW9uVHlwZSBpcyBWb2lkVHlwZSkgeworICAgICAgICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHMgaXMgYHJldHVybiBlO2AsIFQgaXMgbmVpdGhlciB2b2lkCisgICAgICAgICAgLy8gbm9yIGR5bmFtaWMsIGFuZCBTIGlzIHZvaWQuCisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sCisgICAgICAgICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgbm9MZW5ndGgpCisgICAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uVHlwZSBpcyEgVm9pZFR5cGUpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm4gZTtgLCBTIGlzIG5vdCB2b2lkLCBhbmQKKyAgICAgICAgICAvLyBTIGlzIG5vdCBhc3NpZ25hYmxlIHRvIFQuCisgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKKyAgICAgICAgICAgICAgX3JldHVybkNvbnRleHQsIGV4cHJlc3Npb25UeXBlLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgZmlsZU9mZnNldDogc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgdm9pZCBlbnN1cmVBc3NpZ25hYmlsaXR5KCkgewotICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAotICAgICAgICAgICAgX3JldHVybkNvbnRleHQsIGV4cHJlc3Npb25UeXBlLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKLSAgICAgICAgICAgIGZpbGVPZmZzZXQ6IHN0YXRlbWVudC5maWxlT2Zmc2V0LCBpc1ZvaWRBbGxvd2VkOiB0cnVlKTsKLSAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChfaXNBcnJvdyAmJiByZXR1cm5UeXBlIGlzIFZvaWRUeXBlKSB7Ci0gICAgICAgIC8vIEFycm93IGZ1bmN0aW9ucyBhcmUgdmFsaWQgaWY6IFQgaXMgdm9pZCBvciByZXR1cm4gZXhwOyBpcyBhIHZhbGlkIGZvcgotICAgICAgICAvLyBhIGJsb2NrLWJvZGllZCBmdW5jdGlvbi4KLSAgICAgICAgZW5zdXJlQXNzaWduYWJpbGl0eSgpOwotICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlICYmCi0gICAgICAgICAgZXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCi0gICAgICAgICAgZXhwcmVzc2lvblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCi0gICAgICAgICAgZXhwcmVzc2lvblR5cGUgIT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7Ci0gICAgICAgIC8vIEludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBTIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsCi0gICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKLSAgICAgICAgICAgIG1lc3NhZ2VSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uLAotICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKLSAgICAgICAgICAgIG5vTGVuZ3RoKQotICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OwotICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uVHlwZSBpcyBWb2lkVHlwZSAmJgotICAgICAgICAgIHJldHVyblR5cGUgaXMhIFZvaWRUeXBlICYmCi0gICAgICAgICAgcmV0dXJuVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKLSAgICAgICAgICByZXR1cm5UeXBlICE9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgewotICAgICAgICAvLyBJbnZhbGlkIGlmIFMgaXMgdm9pZCBhbmQgVCBpcyBub3Qgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KLSAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKLSAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLAotICAgICAgICAgICAgbWVzc2FnZVZvaWRFeHByZXNzaW9uLAotICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKLSAgICAgICAgICAgIG5vTGVuZ3RoKQotICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgLy8gVGhlIHJ1bGVzIGZvciB2YWxpZCByZXR1cm5zIGZvciBmdW5jdGlvbnMgd2l0aCBbcmV0dXJuVHlwZV0gYFRgIGFuZAorICAgICAgLy8gYSByZXR1cm4gZXhwcmVzc2lvbiB3aXRoIHN0YXRpYyBbZXhwcmVzc2lvblR5cGVdIGBTYC4KKyAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgIC8vIGByZXR1cm47YCBpcyBhIHZhbGlkIHJldHVybiBpZiBUIGlzIHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCisgICAgICAgIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlIHx8CisgICAgICAgICAgICByZXR1cm5UeXBlIGlzIER5bmFtaWNUeXBlIHx8CisgICAgICAgICAgICByZXR1cm5UeXBlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgeworICAgICAgICAgIC8vIFZhbGlkIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb24sCisgICAgICAgICAgICAgIHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBlbnN1cmVBc3NpZ25hYmlsaXR5KCk7CisgICAgICAgIHZvaWQgZW5zdXJlQXNzaWduYWJpbGl0eSgpIHsKKyAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAorICAgICAgICAgICAgICBfcmV0dXJuQ29udGV4dCwgZXhwcmVzc2lvblR5cGUsIHN0YXRlbWVudC5leHByZXNzaW9uLAorICAgICAgICAgICAgICBmaWxlT2Zmc2V0OiBzdGF0ZW1lbnQuZmlsZU9mZnNldCwgaXNWb2lkQWxsb3dlZDogdHJ1ZSk7CisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2lzQXJyb3cgJiYgcmV0dXJuVHlwZSBpcyBWb2lkVHlwZSkgeworICAgICAgICAgIC8vIEFycm93IGZ1bmN0aW9ucyBhcmUgdmFsaWQgaWY6IFQgaXMgdm9pZCBvciByZXR1cm4gZXhwOyBpcyBhIHZhbGlkCisgICAgICAgICAgLy8gZm9yIGEgYmxvY2stYm9kaWVkIGZ1bmN0aW9uLgorICAgICAgICAgIGVuc3VyZUFzc2lnbmFiaWxpdHkoKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlICYmCisgICAgICAgICAgICBleHByZXNzaW9uVHlwZSBpcyEgVm9pZFR5cGUgJiYKKyAgICAgICAgICAgIGV4cHJlc3Npb25UeXBlIGlzISBEeW5hbWljVHlwZSAmJgorICAgICAgICAgICAgZXhwcmVzc2lvblR5cGUgIT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7CisgICAgICAgICAgLy8gSW52YWxpZCBpZiBUIGlzIHZvaWQgYW5kIFMgaXMgbm90IHZvaWQsIGR5bmFtaWMsIG9yIE51bGwKKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgbWVzc2FnZVJldHVybkZyb21Wb2lkRnVuY3Rpb24sCisgICAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG5vTGVuZ3RoKQorICAgICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUgJiYKKyAgICAgICAgICAgIHJldHVyblR5cGUgaXMhIFZvaWRUeXBlICYmCisgICAgICAgICAgICByZXR1cm5UeXBlIGlzISBEeW5hbWljVHlwZSAmJgorICAgICAgICAgICAgcmV0dXJuVHlwZSAhPSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUpIHsKKyAgICAgICAgICAvLyBJbnZhbGlkIGlmIFMgaXMgdm9pZCBhbmQgVCBpcyBub3Qgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgbWVzc2FnZVZvaWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVuc3VyZUFzc2lnbmFiaWxpdHkoKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzgwLDcyICs0NDIsMTU5IEBACiAKICAgdm9pZCBfY2hlY2tWYWxpZFJldHVybihUeXBlSW5mZXJyZXJJbXBsIGluZmVycmVyLCBEYXJ0VHlwZSByZXR1cm5UeXBlLAogICAgICAgUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCwgRGFydFR5cGUgZXhwcmVzc2lvblR5cGUpIHsKLSAgICAvLyBUaGUgcnVsZXMgZm9yIHZhbGlkIHJldHVybnMgZm9yIGFzeW5jIGZ1bmN0aW9ucyB3aXRoIFtyZXR1cm5UeXBlXSBgVGAgYW5kCi0gICAgLy8gYSByZXR1cm4gZXhwcmVzc2lvbiB3aXRoIHN0YXRpYyBbZXhwcmVzc2lvblR5cGVdIGBTYC4KLSAgICBEYXJ0VHlwZSBmbGF0dGVuZWRSZXR1cm5UeXBlID0KLSAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LnVuZnV0dXJlVHlwZShyZXR1cm5UeXBlKTsKLSAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24gPT0gbnVsbCkgewotICAgICAgLy8gYHJldHVybjtgIGlzIGEgdmFsaWQgcmV0dXJuIGlmIGZsYXR0ZW4oVCkgaXMgdm9pZCwgZHluYW1pYywgb3IgTnVsbC4KLSAgICAgIGlmIChmbGF0dGVuZWRSZXR1cm5UeXBlIGlzIFZvaWRUeXBlIHx8Ci0gICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBEeW5hbWljVHlwZSB8fAotICAgICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgPT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7Ci0gICAgICAgIC8vIFZhbGlkIHJldHVybjsKKyAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgeworICAgICAgRGFydFR5cGUgZnV0dXJlVmFsdWVUeXBlID0KKyAgICAgICAgICBjb21wdXRlRnV0dXJlVmFsdWVUeXBlKGluZmVycmVyLmNvcmVUeXBlcywgcmV0dXJuVHlwZSk7CisKKyAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgIC8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHMgaXMgYHJldHVybjtgLCB1bmxlc3MgVF92IGlzIHZvaWQsCisgICAgICAgIC8vIGR5bmFtaWMsIG9yIE51bGwuCisgICAgICAgIGlmIChmdXR1cmVWYWx1ZVR5cGUgaXMgVm9pZFR5cGUgfHwKKyAgICAgICAgICAgIGZ1dHVyZVZhbHVlVHlwZSBpcyBEeW5hbWljVHlwZSB8fAorICAgICAgICAgICAgZnV0dXJlVmFsdWVUeXBlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgeworICAgICAgICAgIC8vIFZhbGlkIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb25Bc3luYywKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG5vTGVuZ3RoKQorICAgICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCi0gICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0LAotICAgICAgICAgICAgbWVzc2FnZVJldHVybldpdGhvdXRFeHByZXNzaW9uLAotICAgICAgICAgICAgc3RhdGVtZW50LmZpbGVPZmZzZXQsCi0gICAgICAgICAgICBub0xlbmd0aCkKLSAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgaWYgKF9pc0Fycm93ICYmCisgICAgICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZmxhdHRlbihyZXR1cm5UeXBlKSBpcyBWb2lkVHlwZSkgeworICAgICAgICAgIC8vIEZvciBgYXN5bmMgPT4gZWAgaXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgZmxhdHRlbihUKSBpcyBub3QKKyAgICAgICAgICAvLyB2b2lkLCBhbmQgaXQgd291bGQgaGF2ZSBiZWVuIGEgY29tcGlsZS10aW1lIGVycm9yIHRvIGRlY2xhcmUgdGhlCisgICAgICAgICAgLy8gZnVuY3Rpb24gd2l0aCB0aGUgYm9keSBgYXN5bmMgeyByZXR1cm4gZTsgfWAgcmF0aGVyIHRoYW4KKyAgICAgICAgICAvLyBgYXN5bmMgPT4gZWAuCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgRGFydFR5cGUgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgPQorICAgICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmZsYXR0ZW4oZXhwcmVzc2lvblR5cGUpOworICAgICAgICBpZiAoZnV0dXJlVmFsdWVUeXBlIGlzIFZvaWRUeXBlICYmCisgICAgICAgICAgICAhKGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlIGlzIFZvaWRUeXBlIHx8CisgICAgICAgICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMgRHluYW1pY1R5cGUgfHwKKyAgICAgICAgICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSA9PSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUpKSB7CisgICAgICAgICAgLy8gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgcyBpcyBgcmV0dXJuIGU7YCwgVF92IGlzIHZvaWQsIGFuZAorICAgICAgICAgIC8vIGZsYXR0ZW4oUykgaXMgbmVpdGhlciB2b2lkLCBkeW5hbWljLCBOdWxsLgorICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCisgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG1lc3NhZ2VSZXR1cm5Gcm9tVm9pZEZ1bmN0aW9uLAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgICB9IGVsc2UgaWYgKCEoZnV0dXJlVmFsdWVUeXBlIGlzIFZvaWRUeXBlIHx8CisgICAgICAgICAgICAgICAgZnV0dXJlVmFsdWVUeXBlIGlzIER5bmFtaWNUeXBlKSAmJgorICAgICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm4gZTtgLCBUX3YgaXMgbmVpdGhlciB2b2lkCisgICAgICAgICAgLy8gbm9yIGR5bmFtaWMsIGFuZCBmbGF0dGVuKFMpIGlzIHZvaWQuCisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKKyAgICAgICAgICAgICAgbmV3IE51bGxMaXRlcmFsKCkuLmZpbGVPZmZzZXQgPSBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgbWVzc2FnZVZvaWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworLyogICAgICAgIH0gZWxzZSBpZiAoZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCisgICAgICAgICAgICAhaW5mZXJyZXIuaXNBc3NpZ25hYmxlKGZ1dHVyZVZhbHVlVHlwZSwgZXhwcmVzc2lvblR5cGUpICYmCisgICAgICAgICAgICAhaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CisgICAgICAgICAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAorICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSwgZnV0dXJlVmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIC5pc1N1YnR5cGVXaGVuVXNpbmdOdWxsYWJpbGl0aWVzKCkpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm4gZTtgLCBmbGF0dGVuKFMpIGlzIG5vdAorICAgICAgICAgIC8vIHZvaWQsIFMgaXMgbm90IGFzc2lnbmFibGUgdG8gVF92LCBhbmQgZmxhdHRlbihTKSBpcyBub3QgYSBzdWJ0eXBlCisgICAgICAgICAgLy8gb2YgVF92LgorICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCisgICAgICAgICAgICAgIG5ldyBOdWxsTGl0ZXJhbCgpLi5maWxlT2Zmc2V0ID0gc3RhdGVtZW50LmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIG1lc3NhZ2VSZXR1cm5XaXRob3V0RXhwcmVzc2lvbkFzeW5jLAorICAgICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OyovCisgICAgICAgIH0gZWxzZSBpZiAoZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCisgICAgICAgICAgICAhaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50CisgICAgICAgICAgICAgICAgLnBlcmZvcm1OdWxsYWJpbGl0eUF3YXJlU3VidHlwZUNoZWNrKAorICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSwgZnV0dXJlVmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIC5pc1N1YnR5cGVXaGVuVXNpbmdOdWxsYWJpbGl0aWVzKCkpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBzIGlzIGByZXR1cm4gZTtgLCBmbGF0dGVuKFMpIGlzIG5vdAorICAgICAgICAgIC8vIHZvaWQsIFMgaXMgbm90IGFzc2lnbmFibGUgdG8gVF92LCBhbmQgZmxhdHRlbihTKSBpcyBub3QgYSBzdWJ0eXBlCisgICAgICAgICAgLy8gb2YgVF92LgorICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuZW5zdXJlQXNzaWduYWJsZSgKKyAgICAgICAgICAgICAgZnV0dXJlVmFsdWVUeXBlLCBleHByZXNzaW9uVHlwZSwgc3RhdGVtZW50LmV4cHJlc3Npb24sCisgICAgICAgICAgICAgIGZpbGVPZmZzZXQ6IHN0YXRlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgIHJ1bnRpbWVDaGVja2VkVHlwZTogX3JldHVybkNvbnRleHQsCisgICAgICAgICAgICAgIGlzVm9pZEFsbG93ZWQ6IGZhbHNlKQorICAgICAgICAgICAgLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgRGFydFR5cGUgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgPQotICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUoZXhwcmVzc2lvblR5cGUpOwotCi0gICAgICB2b2lkIGVuc3VyZUFzc2lnbmFiaWxpdHkoKSB7Ci0gICAgICAgIERhcnRUeXBlIHdyYXBwZWRUeXBlID0gaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50Ci0gICAgICAgICAgICAuZnV0dXJlVHlwZShmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSwgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOwotICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBpbmZlcnJlci5lbnN1cmVBc3NpZ25hYmxlKAotICAgICAgICAgICAgY29tcHV0ZUFzc2lnbmFibGVUeXBlKGluZmVycmVyLCBfcmV0dXJuQ29udGV4dCwgd3JhcHBlZFR5cGUpLAotICAgICAgICAgICAgd3JhcHBlZFR5cGUsCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKLSAgICAgICAgICAgIGZpbGVPZmZzZXQ6IHN0YXRlbWVudC5maWxlT2Zmc2V0LAotICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSwKLSAgICAgICAgICAgIHJ1bnRpbWVDaGVja2VkVHlwZTogX3JldHVybkNvbnRleHQpOwotICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uLnBhcmVudCA9IHN0YXRlbWVudDsKLSAgICAgIH0KLQotICAgICAgaWYgKF9pc0Fycm93ICYmIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMgVm9pZFR5cGUpIHsKLSAgICAgICAgLy8gQXJyb3cgZnVuY3Rpb25zIGFyZSB2YWxpZCBpZjogZmxhdHRlbihUKSBpcyB2b2lkIG9yIHJldHVybiBleHA7IGlzCi0gICAgICAgIC8vIHZhbGlkIGZvciBhIGJsb2NrLWJvZGllZCBmdW5jdGlvbi4KLSAgICAgICAgZW5zdXJlQXNzaWduYWJpbGl0eSgpOwotICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlIGlzIFZvaWRUeXBlICYmCi0gICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCi0gICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCi0gICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgIT0gaW5mZXJyZXIuY29yZVR5cGVzLm51bGxUeXBlKSB7Ci0gICAgICAgIC8vIEludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBmbGF0dGVuKFMpIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsLgotICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAotICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sCi0gICAgICAgICAgICBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiwKLSAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCi0gICAgICAgICAgICBub0xlbmd0aCkKLSAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKLSAgICAgIH0gZWxzZSBpZiAoZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMgVm9pZFR5cGUgJiYKLSAgICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlIGlzISBWb2lkVHlwZSAmJgotICAgICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCi0gICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSAhPSBpbmZlcnJlci5jb3JlVHlwZXMubnVsbFR5cGUpIHsKLSAgICAgICAgLy8gSW52YWxpZCBpZiBmbGF0dGVuKFMpIGlzIHZvaWQgYW5kIGZsYXR0ZW4oVCkgaXMgbm90IHZvaWQsIGR5bmFtaWMsCi0gICAgICAgIC8vIG9yIE51bGwuCi0gICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwKLSAgICAgICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKLSAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLmZpbGVPZmZzZXQsCi0gICAgICAgICAgICBub0xlbmd0aCkKLSAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKKyAgICAgIC8vIFRoZSBydWxlcyBmb3IgdmFsaWQgcmV0dXJucyBmb3IgYXN5bmMgZnVuY3Rpb25zIHdpdGggW3JldHVyblR5cGVdIGBUYAorICAgICAgLy8gYW5kIGEgcmV0dXJuIGV4cHJlc3Npb24gd2l0aCBzdGF0aWMgW2V4cHJlc3Npb25UeXBlXSBgU2AuCisgICAgICBEYXJ0VHlwZSBmbGF0dGVuZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZmxhdHRlbihyZXR1cm5UeXBlKTsKKyAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgIC8vIGByZXR1cm47YCBpcyBhIHZhbGlkIHJldHVybiBpZiBmbGF0dGVuKFQpIGlzIHZvaWQsIGR5bmFtaWMsIG9yIE51bGwuCisgICAgICAgIGlmIChmbGF0dGVuZWRSZXR1cm5UeXBlIGlzIFZvaWRUeXBlIHx8CisgICAgICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlIGlzIER5bmFtaWNUeXBlIHx8CisgICAgICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlID09IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgeworICAgICAgICAgIC8vIFZhbGlkIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA9IGluZmVycmVyLmhlbHBlci53cmFwSW5Qcm9ibGVtKAorICAgICAgICAgICAgICBuZXcgTnVsbExpdGVyYWwoKS4uZmlsZU9mZnNldCA9IHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBtZXNzYWdlUmV0dXJuV2l0aG91dEV4cHJlc3Npb24sCisgICAgICAgICAgICAgIHN0YXRlbWVudC5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICBub0xlbmd0aCkKKyAgICAgICAgICAgIC4ucGFyZW50ID0gc3RhdGVtZW50OworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgY2FsbGVyIHdpbGwgY2hlY2sgdGhhdCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSB0byB0aGUKLSAgICAgICAgLy8gcmV0dXJuIHR5cGUuCi0gICAgICAgIGVuc3VyZUFzc2lnbmFiaWxpdHkoKTsKKyAgICAgICAgRGFydFR5cGUgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgPQorICAgICAgICAgICAgaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmZsYXR0ZW4oZXhwcmVzc2lvblR5cGUpOworCisgICAgICAgIHZvaWQgZW5zdXJlQXNzaWduYWJpbGl0eSgpIHsKKyAgICAgICAgICBEYXJ0VHlwZSB3cmFwcGVkVHlwZSA9IGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudAorICAgICAgICAgICAgICAuZnV0dXJlVHlwZShmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSwgTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpOworICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGluZmVycmVyLmVuc3VyZUFzc2lnbmFibGUoCisgICAgICAgICAgICAgIGNvbXB1dGVBc3NpZ25hYmxlVHlwZShpbmZlcnJlciwgX3JldHVybkNvbnRleHQsIHdyYXBwZWRUeXBlKSwKKyAgICAgICAgICAgICAgd3JhcHBlZFR5cGUsCisgICAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLAorICAgICAgICAgICAgICBmaWxlT2Zmc2V0OiBzdGF0ZW1lbnQuZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgaXNWb2lkQWxsb3dlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgcnVudGltZUNoZWNrZWRUeXBlOiBfcmV0dXJuQ29udGV4dCk7CisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBleHByZXNzaW9uLi5wYXJlbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2lzQXJyb3cgJiYgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyBWb2lkVHlwZSkgeworICAgICAgICAgIC8vIEFycm93IGZ1bmN0aW9ucyBhcmUgdmFsaWQgaWY6IGZsYXR0ZW4oVCkgaXMgdm9pZCBvciByZXR1cm4gZXhwOyBpcworICAgICAgICAgIC8vIHZhbGlkIGZvciBhIGJsb2NrLWJvZGllZCBmdW5jdGlvbi4KKyAgICAgICAgICBlbnN1cmVBc3NpZ25hYmlsaXR5KCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuVHlwZSBpcyBWb2lkVHlwZSAmJgorICAgICAgICAgICAgZmxhdHRlbmVkRXhwcmVzc2lvblR5cGUgaXMhIFZvaWRUeXBlICYmCisgICAgICAgICAgICBmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSBpcyEgRHluYW1pY1R5cGUgJiYKKyAgICAgICAgICAgIGZsYXR0ZW5lZEV4cHJlc3Npb25UeXBlICE9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgeworICAgICAgICAgIC8vIEludmFsaWQgaWYgVCBpcyB2b2lkIGFuZCBmbGF0dGVuKFMpIGlzIG5vdCB2b2lkLCBkeW5hbWljLCBvciBOdWxsLgorICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gaW5mZXJyZXIuaGVscGVyLndyYXBJblByb2JsZW0oCisgICAgICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLAorICAgICAgICAgICAgICBtZXNzYWdlUmV0dXJuRnJvbVZvaWRGdW5jdGlvbiwKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgbm9MZW5ndGgpCisgICAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgfSBlbHNlIGlmIChmbGF0dGVuZWRFeHByZXNzaW9uVHlwZSBpcyBWb2lkVHlwZSAmJgorICAgICAgICAgICAgZmxhdHRlbmVkUmV0dXJuVHlwZSBpcyEgVm9pZFR5cGUgJiYKKyAgICAgICAgICAgIGZsYXR0ZW5lZFJldHVyblR5cGUgaXMhIER5bmFtaWNUeXBlICYmCisgICAgICAgICAgICBmbGF0dGVuZWRSZXR1cm5UeXBlICE9IGluZmVycmVyLmNvcmVUeXBlcy5udWxsVHlwZSkgeworICAgICAgICAgIC8vIEludmFsaWQgaWYgZmxhdHRlbihTKSBpcyB2b2lkIGFuZCBmbGF0dGVuKFQpIGlzIG5vdCB2b2lkLCBkeW5hbWljLAorICAgICAgICAgIC8vIG9yIE51bGwuCisgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBpbmZlcnJlci5oZWxwZXIud3JhcEluUHJvYmxlbSgKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sCisgICAgICAgICAgICAgIG1lc3NhZ2VWb2lkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24uZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgbm9MZW5ndGgpCisgICAgICAgICAgICAuLnBhcmVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGUgY2FsbGVyIHdpbGwgY2hlY2sgdGhhdCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSB0bworICAgICAgICAgIC8vIHRoZSByZXR1cm4gdHlwZS4KKyAgICAgICAgICBlbnN1cmVBc3NpZ25hYmlsaXR5KCk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTQ4OCw3ICs2MzcsNyBAQAogICAgICAgLy8gc2hhcGUgRnV0dXJlT3I8VD4uICBXZSBjaGVjayBib3RoIGJyYW5jaGVzIGZvciBGdXR1cmVPciBoZXJlOiBib3RoIFQKICAgICAgIC8vIGFuZCBGdXR1cmU8VD4uCiAgICAgICBEYXJ0VHlwZSB1bmZ1dHVyZWRFeHBlY3RlZFR5cGUgPQotICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUoY29udGV4dFR5cGUpOworICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5mbGF0dGVuKGNvbnRleHRUeXBlKTsKICAgICAgIERhcnRUeXBlIGZ1dHVyZWRFeHBlY3RlZFR5cGUgPSBpbmZlcnJlci53cmFwRnV0dXJlVHlwZSgKICAgICAgICAgICB1bmZ1dHVyZWRFeHBlY3RlZFR5cGUsIGluZmVycmVyLmxpYnJhcnkubm9uTnVsbGFibGUpOwogICAgICAgaWYgKGluZmVycmVyLmlzQXNzaWduYWJsZSh1bmZ1dHVyZWRFeHBlY3RlZFR5cGUsIGV4cHJlc3Npb25UeXBlKSkgewpAQCAtNTE0LDE1ICs2NjMsMTYgQEAKIAogICAgICAgICAvLyBUaGUgcmV0dXJuIGV4cHJlc3Npb24gaGFzIHRvIGJlIGFzc2lnbmFibGUgdG8gdGhlIHJldHVybiB0eXBlCiAgICAgICAgIC8vIGV4cGVjdGF0aW9uIGZyb20gdGhlIGRvd253YXJkcyBpbmZlcmVuY2UgY29udGV4dC4KLSAgICAgICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICBpZiAoIWluZmVycmVyLmlzQXNzaWduYWJsZSgKLSAgICAgICAgICAgICAgY29tcHV0ZUFzc2lnbmFibGVUeXBlKGluZmVycmVyLCBfcmV0dXJuQ29udGV4dCwgdHlwZSksIHR5cGUpKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYXNzaWduYWJsZSwgdXNlIHRoZSBleHBlY3RhdGlvbi4KLSAgICAgICAgICAgIHR5cGUgPSBpbmZlcnJlci5jb21wdXRlR3JlYXRlc3RDbG9zdXJlKF9yZXR1cm5Db250ZXh0KTsKKyAgICAgICAgaWYgKCFpbmZlcnJlci5pc05vbk51bGxhYmxlQnlEZWZhdWx0KSB7CisgICAgICAgICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghaW5mZXJyZXIuaXNBc3NpZ25hYmxlKAorICAgICAgICAgICAgICAgIGNvbXB1dGVBc3NpZ25hYmxlVHlwZShpbmZlcnJlciwgX3JldHVybkNvbnRleHQsIHR5cGUpLCB0eXBlKSkgeworICAgICAgICAgICAgICAvLyBOb3QgYXNzaWduYWJsZSwgdXNlIHRoZSBleHBlY3RhdGlvbi4KKyAgICAgICAgICAgICAgdHlwZSA9IGluZmVycmVyLmNvbXB1dGVHcmVhdGVzdENsb3N1cmUoX3JldHVybkNvbnRleHQpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBEYXJ0VHlwZSB1bndyYXBwZWRUeXBlID0KLSAgICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodHlwZSk7CisgICAgICAgIERhcnRUeXBlIHVud3JhcHBlZFR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZmxhdHRlbih0eXBlKTsKICAgICAgICAgaWYgKGluZmVycmVkVHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgaW5mZXJyZWRUeXBlID0gdW53cmFwcGVkVHlwZTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTU0MywxNCArNjkzLDI2IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgaW5mZXJyZWRUeXBlID0KLSAgICAgICAgaW5mZXJyZXIud3JhcEZ1dHVyZVR5cGUoaW5mZXJyZWRUeXBlLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKKyAgICBpZiAoaW5mZXJyZXIuaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCkgeworICAgICAgaWYgKCFpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCisgICAgICAgICAgaW5mZXJyZWRUeXBlLCBfcmV0dXJuQ29udGV4dCwgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykpIHsKKyAgICAgICAgLy8gSWYgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIGlzbid0IGEgc3VidHlwZSBvZiB0aGUgY29udGV4dCwgd2UgdXNlCisgICAgICAgIC8vIHRoZSBjb250ZXh0LgorICAgICAgICBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb21wdXRlR3JlYXRlc3RDbG9zdXJlMihfZGVjbGFyZWRSZXR1cm5UeXBlKTsKKyAgICAgIH0KKyAgICAgIGluZmVycmVkVHlwZSA9IGluZmVycmVyLndyYXBGdXR1cmVUeXBlKAorICAgICAgICAgIGluZmVycmVyLnR5cGVTY2hlbWFFbnZpcm9ubWVudC5mbGF0dGVuKGluZmVycmVkVHlwZSksCisgICAgICAgICAgaW5mZXJyZXIubGlicmFyeS5ub25OdWxsYWJsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZmVycmVkVHlwZSA9CisgICAgICAgICAgaW5mZXJyZXIud3JhcEZ1dHVyZVR5cGUoaW5mZXJyZWRUeXBlLCBpbmZlcnJlci5saWJyYXJ5Lm5vbk51bGxhYmxlKTsKIAotICAgIGlmICghaW5mZXJyZXIudHlwZVNjaGVtYUVudmlyb25tZW50LmlzU3VidHlwZU9mKAotICAgICAgICBpbmZlcnJlZFR5cGUsIF9yZXR1cm5Db250ZXh0LCBTdWJ0eXBlQ2hlY2tNb2RlLndpdGhOdWxsYWJpbGl0aWVzKSkgewotICAgICAgLy8gSWYgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIGlzbid0IGEgc3VidHlwZSBvZiB0aGUgY29udGV4dCwgd2UgdXNlIHRoZQotICAgICAgLy8gY29udGV4dC4KLSAgICAgIGluZmVycmVkVHlwZSA9IGluZmVycmVyLmNvbXB1dGVHcmVhdGVzdENsb3N1cmUyKF9kZWNsYXJlZFJldHVyblR5cGUpOworICAgICAgaWYgKCFpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuaXNTdWJ0eXBlT2YoCisgICAgICAgICAgaW5mZXJyZWRUeXBlLCBfcmV0dXJuQ29udGV4dCwgU3VidHlwZUNoZWNrTW9kZS53aXRoTnVsbGFiaWxpdGllcykpIHsKKyAgICAgICAgLy8gSWYgdGhlIGluZmVycmVkIHJldHVybiB0eXBlIGlzbid0IGEgc3VidHlwZSBvZiB0aGUgY29udGV4dCwgd2UgdXNlCisgICAgICAgIC8vIHRoZSBjb250ZXh0LgorICAgICAgICBpbmZlcnJlZFR5cGUgPSBpbmZlcnJlci5jb21wdXRlR3JlYXRlc3RDbG9zdXJlMihfZGVjbGFyZWRSZXR1cm5UeXBlKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yZXR1cm5TdGF0ZW1lbnRzLmxlbmd0aDsgKytpKSB7CkBAIC01NzYsNyArNzM4LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuVHlwZSA9IF9kZWNsYXJlZFJldHVyblR5cGU7CiAgICAgfQotICAgIHJldHVyblR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHJldHVyblR5cGUpOworICAgIHJldHVyblR5cGUgPSBpbmZlcnJlci50eXBlU2NoZW1hRW52aXJvbm1lbnQuZmxhdHRlbihyZXR1cm5UeXBlKTsKICAgICBpZiAoaW5mZXJyZXIubGlicmFyeS5pc05vbk51bGxhYmxlQnlEZWZhdWx0ICYmCiAgICAgICAgIChjb250YWluc0ludmFsaWRUeXBlKHJldHVyblR5cGUpIHx8CiAgICAgICAgICAgICByZXR1cm5UeXBlLmlzUG90ZW50aWFsbHlOb25OdWxsYWJsZSkgJiYKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQgYi9wa2cvZnJvbnRfZW5kL2xpYi9zcmMvZmFzdGEvdHlwZV9pbmZlcmVuY2UvdHlwZV9pbmZlcnJlci5kYXJ0CmluZGV4IGY0MzI5NjkuLjZlNDMzNzkgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbGliL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2luZmVycmVyLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC9saWIvc3JjL2Zhc3RhL3R5cGVfaW5mZXJlbmNlL3R5cGVfaW5mZXJyZXIuZGFydApAQCAtMTIsMTcgKzEyLDEyIEBACiBpbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS90eXBlX2luZmVyZW5jZS90eXBlX2RlbW90aW9uLmRhcnQnOwogCiBpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL2FzdC5kYXJ0JzsKLQogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jbGFzc19oaWVyYXJjaHkuZGFydCcgc2hvdyBDbGFzc0hpZXJhcmNoeTsKLQogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9jb3JlX3R5cGVzLmRhcnQnIHNob3cgQ29yZVR5cGVzOwotCiBpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3R5cGVfYWxnZWJyYS5kYXJ0JzsKLQogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOwotCiBpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9ib3VuZHNfY2hlY2tzLmRhcnQnIHNob3cgY2FsY3VsYXRlQm91bmRzOwotCitpbXBvcnQgJ3BhY2thZ2U6a2VybmVsL3NyYy9mdXR1cmVfdmFsdWVfdHlwZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2xlZ2FjeV9lcmFzdXJlLmRhcnQnOwogCiBpbXBvcnQgJy4uLy4uL2Jhc2UvaW5zdHJ1bWVudGF0aW9uLmRhcnQnCkBAIC04NDksOCArODQ0LDggQEAKICAgICAgICAgICAgIGlzUG90ZW50aWFsbHlOdWxsYWJsZTogZmFsc2UpOwogICAgICAgfQogICAgICAgaWYgKGluY2x1ZGVFeHRlbnNpb25NZXRob2RzKSB7Ci0gICAgICAgIE9iamVjdEFjY2Vzc1RhcmdldCB0YXJnZXQgPQotICAgICAgICAgICAgX2ZpbmRFeHRlbnNpb25NZW1iZXIocmVjZWl2ZXJCb3VuZCwgY2xhc3NOb2RlLCBuYW1lLCBmaWxlT2Zmc2V0KTsKKyAgICAgICAgT2JqZWN0QWNjZXNzVGFyZ2V0IHRhcmdldCA9IF9maW5kRXh0ZW5zaW9uTWVtYmVyKAorICAgICAgICAgICAgcmVjZWl2ZXJCb3VuZCwgY29yZVR5cGVzLm9iamVjdENsYXNzLCBuYW1lLCBmaWxlT2Zmc2V0KTsKICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CiAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgfQpAQCAtMzE5Miw2ICszMTg3LDIyIEBACiAgICAgICAgIGNsYXNzXywgbnVsbGFiaWxpdHksIDxEYXJ0VHlwZT5bdHlwZSA/PyBjb25zdCBEeW5hbWljVHlwZSgpXSk7CiAgIH0KIAorICAvLy8gQ29tcHV0ZXMgdGhlIGBmdXR1cmVWYWx1ZVR5cGVTY2hlbWFgIGZvciB0aGUgdHlwZSBzY2hlbWEgW3R5cGVdLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFtmdXR1cmVWYWx1ZVR5cGVdIGV4Y2VwdCB0aGF0IHRoaXMgaGFuZGxlcworICAvLy8gdGhlIHVua25vd24gdHlwZS4KKyAgRGFydFR5cGUgY29tcHV0ZUZ1dHVyZVZhbHVlVHlwZVNjaGVtYShEYXJ0VHlwZSB0eXBlKSB7CisgICAgcmV0dXJuIHR5cGUuYWNjZXB0MShuZXcgRnV0dXJlVmFsdWVUeXBlVmlzaXRvcih1bmhhbmRsZWRUeXBlSGFuZGxlcjoKKyAgICAgICAgKERhcnRUeXBlIG5vZGUsIENvcmVUeXBlcyBjb3JlVHlwZXMsCisgICAgICAgICAgICBEYXJ0VHlwZSBGdW5jdGlvbihEYXJ0VHlwZSBub2RlLCBDb3JlVHlwZXMgY29yZVR5cGVzKSByZWN1cnNvcikgeworICAgICAgaWYgKG5vZGUgaXMgVW5rbm93blR5cGUpIHsKKyAgICAgICAgLy8gZnV0dXJlVmFsdWVUeXBlU2NoZW1hKF8pID0gXy4KKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAnJHtub2RlLnJ1bnRpbWVUeXBlfScuIik7CisgICAgfSksIGNvcmVUeXBlcyk7CisgIH0KKwogICBNZW1iZXIgX2dldEludGVyZmFjZU1lbWJlcigKICAgICAgIENsYXNzIGNsYXNzXywgTmFtZSBuYW1lLCBib29sIHNldHRlciwgaW50IGNoYXJPZmZzZXQpIHsKICAgICBNZW1iZXIgbWVtYmVyID0gZW5naW5lLmhpZXJhcmNoeUJ1aWxkZXIuZ2V0Q29tYmluZWRNZW1iZXJTaWduYXR1cmVLZXJuZWwoCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL21lc3NhZ2VzLnN0YXR1cyBiL3BrZy9mcm9udF9lbmQvbWVzc2FnZXMuc3RhdHVzCmluZGV4IDBmZDFhMzEuLmY1YTgxODQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvbWVzc2FnZXMuc3RhdHVzCisrKyBiL3BrZy9mcm9udF9lbmQvbWVzc2FnZXMuc3RhdHVzCkBAIC02MTMsNiArNjEzLDkgQEAKIFJldGhyb3dOb3RDYXRjaC9leGFtcGxlOiBGYWlsCiBSZXR1cm5UeXBlRnVuY3Rpb25FeHByZXNzaW9uL2FuYWx5emVyQ29kZTogRmFpbAogUmV0dXJuVHlwZUZ1bmN0aW9uRXhwcmVzc2lvbi9leGFtcGxlOiBGYWlsCitSZXR1cm5XaXRob3V0RXhwcmVzc2lvbkFzeW5jL2FuYWx5emVyQ29kZTogRmFpbAorUmV0dXJuV2l0aG91dEV4cHJlc3Npb25TeW5jL2FuYWx5emVyQ29kZTogRmFpbAorUmV0dXJuV2l0aG91dEV4cHJlc3Npb25TeW5jL3BhcnRfd3JhcHBlZF9zY3JpcHQ6IEZhaWwKIFNka1Jvb3ROb3RGb3VuZC9hbmFseXplckNvZGU6IEZhaWwKIFNka1Jvb3ROb3RGb3VuZC9leGFtcGxlOiBGYWlsCiBTZGtTcGVjaWZpY2F0aW9uTm90Rm91bmQvYW5hbHl6ZXJDb2RlOiBGYWlsCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL21lc3NhZ2VzLnlhbWwgYi9wa2cvZnJvbnRfZW5kL21lc3NhZ2VzLnlhbWwKaW5kZXggZTJjZTkyNi4uN2I0NGM3NCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC9tZXNzYWdlcy55YW1sCisrKyBiL3BrZy9mcm9udF9lbmQvbWVzc2FnZXMueWFtbApAQCAtMTE4Niw3ICsxMTg2LDcgQEAKICAgdGVtcGxhdGU6ICIjc3RyaW5nIgogCiBTdHJvbmdNb2RlTk5CREJ1dE9wdE91dDoKLSAgdGVtcGxhdGU6ICJBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLiIKKyAgdGVtcGxhdGU6ICJBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBudWxsIHNhZmV0eSBieSBkZWZhdWx0LCB3aGVuIHVzaW5nIHNvdW5kIG51bGwgc2FmZXR5LiIKIAogQWJzdHJhY3ROb3RTeW5jOgogICB0ZW1wbGF0ZTogIkFic3RyYWN0IG1ldGhvZHMgY2FuJ3QgdXNlICdhc3luYycsICdhc3luYyonLCBvciAnc3luYyonLiIKQEAgLTM0MDEsNiArMzQwMSwxOCBAQAogICBhbmFseXplckNvZGU6IFJFVFVSTl9XSVRIT1VUX1ZBTFVFCiAgIGRlY2xhcmF0aW9uOiAiaW50IGZvbygpIHsgcmV0dXJuOyB9IgogCitSZXR1cm5XaXRob3V0RXhwcmVzc2lvblN5bmM6CisgIHRlbXBsYXRlOiAiQSB2YWx1ZSBtdXN0IGJlIGV4cGxpY2l0bHkgcmV0dXJuZWQgZnJvbSBhIG5vbi12b2lkIGZ1bmN0aW9uLiIKKyAgY29uZmlndXJhdGlvbjogbm5iZC1zdHJvbmcKKyAgc2NyaXB0OiB8CisgICAgaW1wb3J0ICJkYXJ0OmFzeW5jIjsKKyAgICBGdXR1cmVPcjxPYmplY3Q/PiBmb28oKSB7IHJldHVybjsgfQorCitSZXR1cm5XaXRob3V0RXhwcmVzc2lvbkFzeW5jOgorICB0ZW1wbGF0ZTogIkEgdmFsdWUgbXVzdCBiZSBleHBsaWNpdGx5IHJldHVybmVkIGZyb20gYSBub24tdm9pZCBhc3luYyBmdW5jdGlvbi4iCisgIGNvbmZpZ3VyYXRpb246IG5uYmQtc3Ryb25nCisgIGRlY2xhcmF0aW9uOiAiRnV0dXJlPGludD4gZm9vKCkgYXN5bmMgeyByZXR1cm47IH0iCisKIEltcGxpY2l0UmV0dXJuTnVsbDoKICAgdGVtcGxhdGU6ICJBIG5vbi1udWxsIHZhbHVlIG11c3QgYmUgcmV0dXJuZWQgc2luY2UgdGhlIHJldHVybiB0eXBlICcjdHlwZScgZG9lc24ndCBhbGxvdyBudWxsLiIKICAgY29uZmlndXJhdGlvbjogbm5iZC1zdHJvbmcKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdC9iaW5hcnlfbWRfZGlsbF9yZWFkZXIuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdC9iaW5hcnlfbWRfZGlsbF9yZWFkZXIuZGFydAppbmRleCAwMWNmNGQ5Li5jMGE0YjViIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3QvYmluYXJ5X21kX2RpbGxfcmVhZGVyLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0L2JpbmFyeV9tZF9kaWxsX3JlYWRlci5kYXJ0CkBAIC00NzMsMzEgKzQ3MywzMyBAQAogICAgICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgdHlwZS5pbmRleE9mKCJbIikpOwogICAgICAgICB0eXBlID0gX2xvb2t1cEdlbmVyaWNUeXBlKHR5cGVOYW1lcywgdHlwZSwgdHlwZXMpOwogCi0gICAgICAgIGludCBpbnRDb3VudCA9IC0xOwotICAgICAgICBpZiAodmFyc1tjb3VudF0gIT0gbnVsbCAmJiB2YXJzW2NvdW50XSBpcyBpbnQpIHsKLSAgICAgICAgICBpbnRDb3VudCA9IHZhcnNbY291bnRdOwotICAgICAgICB9IGVsc2UgaWYgKGNvdW50LmNvbnRhaW5zKCIuIikpIHsKLSAgICAgICAgICBMaXN0PFN0cmluZz4gY291bnREYXRhID0KLSAgICAgICAgICAgICAgY291bnQuc3BsaXQocmVnRXhwU3BsaXQpLm1hcCgocykgPT4gcy50cmltKCkpLnRvTGlzdCgpOwotICAgICAgICAgIGlmICh2YXJzW2NvdW50RGF0YVswXV0gIT0gbnVsbCkgewotICAgICAgICAgICAgZHluYW1pYyB2ID0gdmFyc1tjb3VudERhdGFbMF1dOwotICAgICAgICAgICAgaWYgKHYgaXMgTWFwICYmCi0gICAgICAgICAgICAgICAgY291bnREYXRhWzFdID09ICJsYXN0IiAmJgotICAgICAgICAgICAgICAgIHZbIml0ZW1zIl0gaXMgTGlzdCAmJgotICAgICAgICAgICAgICAgIHZbIml0ZW1zIl0ubGFzdCBpcyBpbnQpIHsKLSAgICAgICAgICAgICAgaW50Q291bnQgPSB2WyJpdGVtcyJdLmxhc3Q7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHYgaXMgTWFwICYmIHZbY291bnREYXRhWzFdXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIHYgPSB2W2NvdW50RGF0YVsxXV07Ci0gICAgICAgICAgICAgIGlmICh2IGlzIE1hcCAmJiB2W2NvdW50RGF0YVsyXV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHYgPSB2W2NvdW50RGF0YVsyXV07Ci0gICAgICAgICAgICAgICAgaWYgKHYgaXMgaW50KSBpbnRDb3VudCA9IHY7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAodiBpcyBpbnQgJiYKLSAgICAgICAgICAgICAgICAgIGNvdW50RGF0YS5sZW5ndGggPT0gNCAmJgotICAgICAgICAgICAgICAgICAgY291bnREYXRhWzJdID09ICIrIikgewotICAgICAgICAgICAgICAgIGludENvdW50ID0gdiArIGludC5wYXJzZShjb3VudERhdGFbM10pOworICAgICAgICBpbnQgaW50Q291bnQgPSBpbnQudHJ5UGFyc2UoY291bnQpID8/IC0xOworICAgICAgICBpZiAoaW50Q291bnQgPT0gLTEpIHsKKyAgICAgICAgICBpZiAodmFyc1tjb3VudF0gIT0gbnVsbCAmJiB2YXJzW2NvdW50XSBpcyBpbnQpIHsKKyAgICAgICAgICAgIGludENvdW50ID0gdmFyc1tjb3VudF07CisgICAgICAgICAgfSBlbHNlIGlmIChjb3VudC5jb250YWlucygiLiIpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY291bnREYXRhID0KKyAgICAgICAgICAgICAgICBjb3VudC5zcGxpdChyZWdFeHBTcGxpdCkubWFwKChzKSA9PiBzLnRyaW0oKSkudG9MaXN0KCk7CisgICAgICAgICAgICBpZiAodmFyc1tjb3VudERhdGFbMF1dICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZHluYW1pYyB2ID0gdmFyc1tjb3VudERhdGFbMF1dOworICAgICAgICAgICAgICBpZiAodiBpcyBNYXAgJiYKKyAgICAgICAgICAgICAgICAgIGNvdW50RGF0YVsxXSA9PSAibGFzdCIgJiYKKyAgICAgICAgICAgICAgICAgIHZbIml0ZW1zIl0gaXMgTGlzdCAmJgorICAgICAgICAgICAgICAgICAgdlsiaXRlbXMiXS5sYXN0IGlzIGludCkgeworICAgICAgICAgICAgICAgIGludENvdW50ID0gdlsiaXRlbXMiXS5sYXN0OworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYgaXMgTWFwICYmIHZbY291bnREYXRhWzFdXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdiA9IHZbY291bnREYXRhWzFdXTsKKyAgICAgICAgICAgICAgICBpZiAodiBpcyBNYXAgJiYgdltjb3VudERhdGFbMl1dICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgIHYgPSB2W2NvdW50RGF0YVsyXV07CisgICAgICAgICAgICAgICAgICBpZiAodiBpcyBpbnQpIGludENvdW50ID0gdjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYgaXMgaW50ICYmCisgICAgICAgICAgICAgICAgICAgIGNvdW50RGF0YS5sZW5ndGggPT0gNCAmJgorICAgICAgICAgICAgICAgICAgICBjb3VudERhdGFbMl0gPT0gIisiKSB7CisgICAgICAgICAgICAgICAgICBpbnRDb3VudCA9IHYgKyBpbnQucGFyc2UoY291bnREYXRhWzNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gZG90IHRvIGludCAoJGNvdW50KSI7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRocm93ICJVbmtub3duIGRvdCB0byBpbnQgKCRjb3VudCkiOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX2xvYWRfZnJvbV9kaWxsX3N1aXRlLmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3QvaW5jcmVtZW50YWxfbG9hZF9mcm9tX2RpbGxfc3VpdGUuZGFydAppbmRleCBiY2RlMjYzLi41MmM5YTg2IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3QvaW5jcmVtZW50YWxfbG9hZF9mcm9tX2RpbGxfc3VpdGUuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3QvaW5jcmVtZW50YWxfbG9hZF9mcm9tX2RpbGxfc3VpdGUuZGFydApAQCAtNDY5LDYgKzQ2OSw5IEBACiAgICAgICAgIG9wdGlvbnMuZmlsZVN5c3RlbSA9IGZzOwogICAgICAgICBvcHRpb25zLnNka1Jvb3QgPSBudWxsOwogICAgICAgICBvcHRpb25zLnNka1N1bW1hcnkgPSBzZGtTdW1tYXJ5VXJpOworICAgICAgICBpZiAod29ybGRbImJhZFNkayJdID09IHRydWUpIHsKKyAgICAgICAgICBvcHRpb25zLnNka1N1bW1hcnkgPSBzZGtTdW1tYXJ5VXJpLnJlc29sdmUoIm5vbmV4aXN0aW5nLmRpbGwiKTsKKyAgICAgICAgfQogICAgICAgICBvcHRpb25zLm9taXRQbGF0Zm9ybSA9IG9taXRQbGF0Zm9ybSAhPSBmYWxzZTsKICAgICAgICAgaWYgKHdvcmxkWyJleHBlcmltZW50cyJdICE9IG51bGwpIHsKICAgICAgICAgICBNYXA8RXhwZXJpbWVudGFsRmxhZywgYm9vbD4gZXhwZXJpbWVudGFsRmxhZ3MgPQpAQCAtNDg2LDggKzQ4OSwxMiBAQAogICAgICAgZmluYWwgU2V0PFN0cmluZz4gZm9ybWF0dGVkRXJyb3JzID0gU2V0PFN0cmluZz4oKTsKICAgICAgIGJvb2wgZ290V2FybmluZyA9IGZhbHNlOwogICAgICAgZmluYWwgU2V0PFN0cmluZz4gZm9ybWF0dGVkV2FybmluZ3MgPSBTZXQ8U3RyaW5nPigpOworICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2VlbkRpYWdub3N0aWNDb2RlcyA9IFNldDxTdHJpbmc+KCk7CiAKICAgICAgIG9wdGlvbnMub25EaWFnbm9zdGljID0gKERpYWdub3N0aWNNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSBnZXRNZXNzYWdlQ29kZU9iamVjdChtZXNzYWdlKT8ubmFtZTsKKyAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgc2VlbkRpYWdub3N0aWNDb2Rlcy5hZGQoY29kZSk7CisKICAgICAgICAgU3RyaW5nIHN0cmluZ0lkID0gbWVzc2FnZS5hbnNpRm9ybWF0dGVkLmpvaW4oIlxuIik7CiAgICAgICAgIGlmIChtZXNzYWdlIGlzIEZvcm1hdHRlZE1lc3NhZ2UpIHsKICAgICAgICAgICBzdHJpbmdJZCA9IG1lc3NhZ2UudG9Kc29uU3RyaW5nKCk7CkBAIC01ODEsNiArNTg4LDI3IEBACiAgICAgICB9CiAgICAgICBwZXJmb3JtRXJyb3JBbmRXYXJuaW5nQ2hlY2soCiAgICAgICAgICAgd29ybGQsIGdvdEVycm9yLCBmb3JtYXR0ZWRFcnJvcnMsIGdvdFdhcm5pbmcsIGZvcm1hdHRlZFdhcm5pbmdzKTsKKyAgICAgIGlmICh3b3JsZFsiZXhwZWN0SW5pdGlhbGl6YXRpb25FcnJvciJdICE9IG51bGwpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gc2VlbkluaXRpYWxpemF0aW9uRXJyb3IgPSBzZWVuRGlhZ25vc3RpY0NvZGVzLmludGVyc2VjdGlvbih7CisgICAgICAgICAgIkluaXRpYWxpemVGcm9tRGlsbE5vdFNlbGZDb250YWluZWROb0R1bXAiLAorICAgICAgICAgICJJbml0aWFsaXplRnJvbURpbGxOb3RTZWxmQ29udGFpbmVkIiwKKyAgICAgICAgICAiSW5pdGlhbGl6ZUZyb21EaWxsVW5rbm93blByb2JsZW0iLAorICAgICAgICAgICJJbml0aWFsaXplRnJvbURpbGxVbmtub3duUHJvYmxlbU5vRHVtcCIsCisgICAgICAgIH0pOworICAgICAgICBpZiAod29ybGRbImV4cGVjdEluaXRpYWxpemF0aW9uRXJyb3IiXSA9PSB0cnVlKSB7CisgICAgICAgICAgaWYgKHNlZW5Jbml0aWFsaXphdGlvbkVycm9yLmlzRW1wdHkpIHsKKyAgICAgICAgICAgIHRocm93ICJFeHBlY3RlZCB0byBzZWUgYW4gaW5pdGlhbGl6YXRpb24gZXJyb3IgYnV0IGRpZG4ndC4iOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh3b3JsZFsiZXhwZWN0SW5pdGlhbGl6YXRpb25FcnJvciJdID09IGZhbHNlKSB7CisgICAgICAgICAgaWYgKHNlZW5Jbml0aWFsaXphdGlvbkVycm9yLmlzTm90RW1wdHkpIHsKKyAgICAgICAgICAgIHRocm93ICJFeHBlY3RlZCBub3QgdG8gc2VlIGFuIGluaXRpYWxpemF0aW9uIGVycm9yIGJ1dCBkaWQ6ICIKKyAgICAgICAgICAgICAgICAiJHNlZW5Jbml0aWFsaXphdGlvbkVycm9yLiI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93ICJVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgJ2V4cGVjdEluaXRpYWxpemF0aW9uRXJyb3InOiAiCisgICAgICAgICAgICAgICIke3dvcmxkWyJleHBlY3RJbml0aWFsaXphdGlvbkVycm9yIl19IjsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgdXRpbC50aHJvd09uRW1wdHlNaXhpbkJvZGllcyhjb21wb25lbnQpOwogICAgICAgYXdhaXQgdXRpbC50aHJvd09uSW5zdWZmaWNpZW50VXJpVG9Tb3VyY2UoY29tcG9uZW50LAogICAgICAgICAgIGZpbGVTeXN0ZW06IGdvdEVycm9yID8gbnVsbCA6IGZzKTsKQEAgLTE1OTQsNiArMTYyMiwxMSBAQAogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogICB9CisKKyAgdm9pZCByZWNvcmRUZW1wb3JhcnlGaWxlRm9yVGVzdGluZyhVcmkgdXJpKSB7CisgICAgRmlsZSBmID0gbmV3IEZpbGUuZnJvbVVyaSh1cmkpOworICAgIGlmIChmLmV4aXN0c1N5bmMoKSkgZi5kZWxldGVTeW5jKCk7CisgIH0KIH0KIAogdm9pZCBkb1NpbXVsYXRlVHJhbnNmb3JtZXIoQ29tcG9uZW50IGMpIHsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdC9pbmNyZW1lbnRhbF91dGlscy5kYXJ0IGIvcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX3V0aWxzLmRhcnQKaW5kZXggN2NjMjg0Mi4uZjkxZTgyMyAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX3V0aWxzLmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX3V0aWxzLmRhcnQKQEAgLTY3LDYgKzY3LDcgQEAKICAgY29tcG9uZW50LmFjY2VwdCh1cmlGaW5kZXIpOwogICBTZXQ8VXJpPiB1cmlzID0gdXJpRmluZGVyLnNlZW5VcmlzLnRvU2V0KCk7CiAgIHVyaXMucmVtb3ZlQWxsKGNvbXBvbmVudC51cmlUb1NvdXJjZS5rZXlzKTsKKyAgdXJpcy5yZW1vdmUobnVsbCk7CiAgIGlmICh1cmlzLmxlbmd0aCAhPSAwKSB7CiAgICAgdGhyb3cgIkV4cGVjdGVkIDAgdXJpcyB3aXRoIG5vIHNvdXJjZSwgYnV0IGZvdW5kICR7dXJpcy5sZW5ndGh9ICgkdXJpcykiOwogICB9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3Qvc3BlbGxfY2hlY2tpbmdfbGlzdF9jb2RlLnR4dCBiL3BrZy9mcm9udF9lbmQvdGVzdC9zcGVsbF9jaGVja2luZ19saXN0X2NvZGUudHh0CmluZGV4IDE5MGZhNmFmOWIuLjBkYmEzOWEgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdC9zcGVsbF9jaGVja2luZ19saXN0X2NvZGUudHh0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdC9zcGVsbF9jaGVja2luZ19saXN0X2NvZGUudHh0CkBAIC01Myw2ICs1Myw3IEBACiBhcmlzaW5nCiBhcml0eQogYXJ0aWZhY3QKK2FydGlmYWN0cwogYXJ0aWZpY2lhbAogYXNnZXJmCiBhc2tlc2MKQEAgLTMxMyw2ICszMTQsNyBAQAogZGlzYW1iaWd1YXRvcgogZGlzam9pbnQKIGRpc3BhdGNoZWQKK2Rpc3RyaWJ1dGUKIGRpdmlkZWQKIGRtaXRyeWFzCiBkb2MKQEAgLTMyNSw2ICszMjcsNyBAQAogZG93bmxvYWRpbmcKIGRxCiBkcXVvdGUKK2RzZGsKIGRzdAogZHVtbXkKIGR1cGRhdGUKQEAgLTM0OCw2ICszNTEsNyBAQAogZW1pdHRlZAogZW1pdHRpbmcKIGVuCitlbmNhcHN1bGF0aW9uCiBlbmZvcmNlCiBlbmZvcmNlZAogZW5mb3JjZXMKQEAgLTQzNSwxMiArNDM5LDE0IEBACiBmdXR1cmVvcgogZwogZ2FyZGVuaW5nCitnZW4KIGdlbmVyYXRpb24KIGdldHMKIGdldHRlcjFhCiBnZXR0ZXIxYgogZ2V0dGluZwogZ2Z0CitnaXQKIGdpdGh1YgogZ2xiCiBnbG9iCkBAIC04OTMsNiArODk5LDcgQEAKIHJlcGxhY2VtZW50cwogcmVwbGFjZXIKIHJlcGxhY2VzCityZXBsaWNhdGVkCiByZXBvCiByZXBvc2l0b3JpZXMKIHJlcXVpcmVtZW50CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3Qvc3BlbGxfY2hlY2tpbmdfbGlzdF90ZXN0cy50eHQgYi9wa2cvZnJvbnRfZW5kL3Rlc3Qvc3BlbGxfY2hlY2tpbmdfbGlzdF90ZXN0cy50eHQKaW5kZXggOGFmNDdiNy4uZTYyYjZjMSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0L3NwZWxsX2NoZWNraW5nX2xpc3RfdGVzdHMudHh0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdC9zcGVsbF9jaGVja2luZ19saXN0X3Rlc3RzLnR4dApAQCAtNzgsNiArNzgsNyBAQAogY2FtZWwKIGNhcGl0YWxpemVkCiBjYXNpbmcKK2NhdXNhbAogY2MKIGNjYwogY2hhcmNvZGUKQEAgLTI3MSw2ICsyNzIsOCBAQAogaWEKIGlrZwogaWxsdXN0cmF0ZQoraW1hZ2UKK2ltYWdlcwogaW1wbGVtZW50b3IKIGluY2xvc3VyZQogaW5jcmVhc2VkCkBAIC01MDUsNiArNTA4LDcgQEAKIHNxcnQKIHNxdWFyZWQKIHNzc3AKK3N0YWNrcwogc3Rhc2hlZAogc3RhdAogc3RhdHMKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdC90ZXh0X3JlcHJlc2VudGF0aW9uL2ludGVybmFsX2FzdF90ZXh0X3JlcHJlc2VudGF0aW9uX3Rlc3QuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdC90ZXh0X3JlcHJlc2VudGF0aW9uL2ludGVybmFsX2FzdF90ZXh0X3JlcHJlc2VudGF0aW9uX3Rlc3QuZGFydAppbmRleCAzMDhmYTllLi43ODdhZDA3IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3QvdGV4dF9yZXByZXNlbnRhdGlvbi9pbnRlcm5hbF9hc3RfdGV4dF9yZXByZXNlbnRhdGlvbl90ZXN0LmRhcnQKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0L3RleHRfcmVwcmVzZW50YXRpb24vaW50ZXJuYWxfYXN0X3RleHRfcmVwcmVzZW50YXRpb25fdGVzdC5kYXJ0CkBAIC0zLDYgKzMsNyBAQAogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvY29sbGVjdGlvbnMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6ZnJvbnRfZW5kL3NyYy9mYXN0YS9rZXJuZWwvZm9yZXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmZyb250X2VuZC9zcmMvZmFzdGEva2VybmVsL2ludGVybmFsX2FzdC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTprZXJuZWwvYXN0LmRhcnQnOwpAQCAtNjMyLDcgKzYzMywxNiBAQAogCiB2b2lkIF90ZXN0RXh0ZW5zaW9uVGVhck9mZigpIHt9CiAKLXZvaWQgX3Rlc3RFcXVhbHNFeHByZXNzaW9uKCkge30KK3ZvaWQgX3Rlc3RFcXVhbHNFeHByZXNzaW9uKCkgeworICB0ZXN0RXhwcmVzc2lvbigKKyAgICAgIG5ldyBFcXVhbHNFeHByZXNzaW9uKG5ldyBJbnRMaXRlcmFsKDApLCBuZXcgSW50TGl0ZXJhbCgxKSwgaXNOb3Q6IGZhbHNlKSwKKyAgICAgICcnJworMCA9PSAxJycnKTsKKyAgdGVzdEV4cHJlc3Npb24oCisgICAgICBuZXcgRXF1YWxzRXhwcmVzc2lvbihuZXcgSW50TGl0ZXJhbCgwKSwgbmV3IEludExpdGVyYWwoMSksIGlzTm90OiB0cnVlKSwKKyAgICAgICcnJworMCAhPSAxJycnKTsKK30KIAogdm9pZCBfdGVzdEJpbmFyeUV4cHJlc3Npb24oKSB7fQogCkBAIC02NDAsOSArNjUwLDIxIEBACiAKIHZvaWQgX3Rlc3RQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHt9CiAKLXZvaWQgX3Rlc3RTcHJlYWRFbGVtZW50KCkge30KK3ZvaWQgX3Rlc3RTcHJlYWRFbGVtZW50KCkgeworICB0ZXN0RXhwcmVzc2lvbihuZXcgU3ByZWFkRWxlbWVudChuZXcgSW50TGl0ZXJhbCgwKSwgZmFsc2UpLCAnJycKKy4uLjAnJycpOworICB0ZXN0RXhwcmVzc2lvbihuZXcgU3ByZWFkRWxlbWVudChuZXcgSW50TGl0ZXJhbCgwKSwgdHJ1ZSksICcnJworLi4uPzAnJycpOworfQogCi12b2lkIF90ZXN0SWZFbGVtZW50KCkge30KK3ZvaWQgX3Rlc3RJZkVsZW1lbnQoKSB7CisgIHRlc3RFeHByZXNzaW9uKG5ldyBJZkVsZW1lbnQobmV3IEludExpdGVyYWwoMCksIG5ldyBJbnRMaXRlcmFsKDEpLCBudWxsKSwgJycnCitpZiAoMCkgMScnJyk7CisgIHRlc3RFeHByZXNzaW9uKAorICAgICAgbmV3IElmRWxlbWVudChuZXcgSW50TGl0ZXJhbCgwKSwgbmV3IEludExpdGVyYWwoMSksIG5ldyBJbnRMaXRlcmFsKDIpKSwKKyAgICAgICcnJworaWYgKDApIDEgZWxzZSAyJycnKTsKK30KIAogdm9pZCBfdGVzdEZvckVsZW1lbnQoKSB7fQogCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3QvdXRpbHMva2VybmVsX2NoYWluLmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3QvdXRpbHMva2VybmVsX2NoYWluLmRhcnQKaW5kZXggNDNiYmNmYS4uYmY1ZTA0YiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0L3V0aWxzL2tlcm5lbF9jaGFpbi5kYXJ0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdC91dGlscy9rZXJuZWxfY2hhaW4uZGFydApAQCAtMjU3LDggKzI1Nyw3IEBACiAgICAgICBjb21wb25lbnQuYWRvcHRDaGlsZHJlbigpOwogICAgIH0KIAotICAgIFVyaSB1cmkgPQotICAgICAgICBjb21wb25lbnQudXJpVG9Tb3VyY2Uua2V5cy5maXJzdFdoZXJlKCh1cmkpID0+IHVyaT8uc2NoZW1lID09ICJmaWxlIik7CisgICAgVXJpIHVyaSA9IHJlc3VsdC5kZXNjcmlwdGlvbi51cmk7CiAgICAgSXRlcmFibGU8TGlicmFyeT4gbGlicmFyaWVzID0KICAgICAgICAgY29tcG9uZW50VG9UZXh0LmxpYnJhcmllcy53aGVyZShyZXN1bHQuaXNVc2VyTGlicmFyeSk7CiAgICAgVXJpIGJhc2UgPSB1cmkucmVzb2x2ZSgiLiIpOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9kZWZlcnJlZF9leHBsaWNpdF9hY2Nlc3MuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2V4dGVuc2lvbnMvZGVmZXJyZWRfZXhwbGljaXRfYWNjZXNzLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggOTVjNTQ0Zi4uYmQ0NDA1ZSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9kZWZlcnJlZF9leHBsaWNpdF9hY2Nlc3MuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2RlZmVycmVkX2V4cGxpY2l0X2FjY2Vzcy5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xMSw3ICsxMSw3IEBACiAKIGltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2RlZmVycmVkX2V4cGxpY2l0X2FjY2Vzc19saWIuZGFydCIgZGVmZXJyZWQgYXMgcHJlZml4OwogCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgZXhwZWN0KGR5bmFtaWMgZXhwZWN0ZWQsIGR5bmFtaWMgYWN0dWFsKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2RlZmVycmVkX2ltcG9ydF9oaWRkZW4uZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2V4dGVuc2lvbnMvZGVmZXJyZWRfaW1wb3J0X2hpZGRlbi5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGQxMDJjNTYuLjVjZTM0ZWMgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2V4dGVuc2lvbnMvZGVmZXJyZWRfaW1wb3J0X2hpZGRlbi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2V4dGVuc2lvbnMvZGVmZXJyZWRfaW1wb3J0X2hpZGRlbi5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0zLDcgKzMsNyBAQAogCiBpbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9kZWZlcnJlZF9leHBsaWNpdF9hY2Nlc3NfbGliLmRhcnQiIGRlZmVycmVkIGFzIHByZWZpeDsKIAotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIGV4cGVjdChkeW5hbWljIGV4cGVjdGVkLCBkeW5hbWljIGFjdHVhbCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzhfbGliLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2lzc3VlMzk5MzgvaXNzdWUzOTkzOC5kYXJ0Lm91dGxpbmUuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2lzc3VlMzk5MzgvaXNzdWUzOTkzOF9saWIuZGFydC5vdXRsaW5lLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzguZGFydC5vdXRsaW5lLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzhfbGliLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2V4dGVuc2lvbnMvaXNzdWUzOTkzOC9pc3N1ZTM5OTM4LmRhcnQuc3Ryb25nLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzhfbGliLmRhcnQuc3Ryb25nLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzguZGFydC5zdHJvbmcuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2lzc3VlMzk5MzgvaXNzdWUzOTkzOF9saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZXh0ZW5zaW9ucy9pc3N1ZTM5OTM4L2lzc3VlMzk5MzguZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2lzc3VlMzk5MzgvaXNzdWUzOTkzOF9saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9leHRlbnNpb25zL2lzc3VlMzk5MzgvaXNzdWUzOTkzOC5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXN5bmNfZnVuY3Rpb24uZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXN5bmNfZnVuY3Rpb24uZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCBlZTU4ZDIyLi5iMmI5OWY3IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2FzeW5jX2Z1bmN0aW9uLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hc3luY19mdW5jdGlvbi5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC02LDE3ICs2LDE3IEBACiBpbXBvcnQgImRhcnQ6YXN5bmMiOwogCiBzdGF0aWMgZmllbGQgY29yZTo6TGlzdDxjb3JlOjpTdHJpbmcqPiogc3RyaW5nTGlzdDsKLXN0YXRpYyBtZXRob2QgYXN5bmNTdHJpbmcoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6U3RyaW5nKj4qCitzdGF0aWMgbWV0aG9kIGFzeW5jU3RyaW5nKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OlN0cmluZyo+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBhc3luY1N0cmluZzIoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6U3RyaW5nKj4qCitzdGF0aWMgbWV0aG9kIGFzeW5jU3RyaW5nMigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpTdHJpbmcqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2Qgc3luY1N0YXJTdHJpbmcoKSDihpIgY29yZTo6SXRlcmFibGU8Y29yZTo6U3RyaW5nKj4qCitzdGF0aWMgbWV0aG9kIHN5bmNTdGFyU3RyaW5nKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OlN0cmluZyo+KiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBzeW5jU3RhclN0cmluZzIoKSDihpIgY29yZTo6SXRlcmFibGU8Y29yZTo6U3RyaW5nKj4qCitzdGF0aWMgbWV0aG9kIHN5bmNTdGFyU3RyaW5nMigpIOKGkiBjb3JlOjpJdGVyYWJsZTxjb3JlOjpTdHJpbmcqPiogc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgYXN5bmNTdGFyU3RyaW5nKCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OlN0cmluZyo+Kgorc3RhdGljIG1ldGhvZCBhc3luY1N0YXJTdHJpbmcoKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6U3RyaW5nKj4qIGFzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBhc3luY1N0YXJTdHJpbmcyKCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OlN0cmluZyo+Kgorc3RhdGljIG1ldGhvZCBhc3luY1N0YXJTdHJpbmcyKCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OlN0cmluZyo+KiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hc3luY19tZXRob2Rfd2l0aF9pbnZhbGlkX3R5cGUuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXN5bmNfbWV0aG9kX3dpdGhfaW52YWxpZF90eXBlLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggZWEyMmFmNy4uNGE5YjgyZSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hc3luY19tZXRob2Rfd2l0aF9pbnZhbGlkX3R5cGUuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2FzeW5jX21ldGhvZF93aXRoX2ludmFsaWRfdHlwZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xLDUgKzEsNSBAQAogbGlicmFyeTsKIGltcG9ydCBzZWxmIGFzIHNlbGY7CiAKLXN0YXRpYyBtZXRob2QgZm9vKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgZm9vKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXN5bmNfbmVzdGVkLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2FzeW5jX25lc3RlZC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDdkMWJjODIuLmFkZWJhMWQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXN5bmNfbmVzdGVkLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hc3luY19uZXN0ZWQuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjMsNSArMjMsNSBAQAogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogaW52b2NhdGlvbikg4oaSIGR5bmFtaWM7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOwogfQotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiB2b2lkIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNmEyOGMwZC4uYjMzMDRlZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hd2FpdC5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXdhaXQuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMSw1ICsxLDUgQEAKIGxpYnJhcnk7CiBpbXBvcnQgc2VsZiBhcyBzZWxmOwogCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYXdhaXRfY29tcGxleC5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hd2FpdF9jb21wbGV4LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNjA4MjEwNC4uNWE4Y2M0NCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hd2FpdF9jb21wbGV4LmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hd2FpdF9jb21wbGV4LmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTQzLDI3ICs0MywyNyBAQAogICA7CiBzdGF0aWMgbWV0aG9kIGR1bW15KCkg4oaSIGR5bmFtaWMKICAgOwotc3RhdGljIG1ldGhvZCBzdGF0aWNNZW1iZXJzKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2Qgc3RhdGljTWVtYmVycygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHRvcExldmVsTWVtYmVycygpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIHRvcExldmVsTWVtYmVycygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGluc3RhbmNlTWVtYmVycygpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGluc3RhbmNlTWVtYmVycygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIG90aGVycygpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG90aGVycygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGNvbmRpdGlvbmFscygpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGNvbmRpdGlvbmFscygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGFzc2VydHMoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBhc3NlcnRzKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgY29udHJvbEZsb3coKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBjb250cm9sRmxvdygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGZ1dHVyZTxUIGV4dGVuZHMgY29yZTo6T2JqZWN0KiA9IGR5bmFtaWM+KHNlbGY6OmZ1dHVyZTo6VCogdmFsdWUpIOKGkiBGdXR1cmVPcjxzZWxmOjpmdXR1cmU6OlQqPioKK3N0YXRpYyBtZXRob2QgZnV0dXJlPFQgZXh0ZW5kcyBjb3JlOjpPYmplY3QqID0gZHluYW1pYz4oc2VsZjo6ZnV0dXJlOjpUKiB2YWx1ZSkg4oaSIEZ1dHVyZU9yPHNlbGY6OmZ1dHVyZTo6VCo+KiBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBpZDxUIGV4dGVuZHMgY29yZTo6T2JqZWN0KiA9IGR5bmFtaWM+KHNlbGY6OmlkOjpUKiB2YWx1ZSkg4oaSIEZ1dHVyZU9yPHNlbGY6OmlkOjpUKj4qCiAgIDsKLXN0YXRpYyBtZXRob2QgaW50U3RyZWFtKCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBpbnRTdHJlYW0oKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6aW50Kj4qIGFzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIGV4cGVjdChkeW5hbWljIGV4cGVjdGVkLCBkeW5hbWljIGFjdHVhbCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9hd2FpdF9pbl9jYXNjYWRlLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2F3YWl0X2luX2Nhc2NhZGUuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCAxZDhlNWZkLi45MTNmZWQ3IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2F3YWl0X2luX2Nhc2NhZGUuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2F3YWl0X2luX2Nhc2NhZGUuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtOCw5ICs4LDkgQEAKIGNsYXNzIEMgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkMqCiAgICAgOwotICBtZXRob2QgbSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qCisgIG1ldGhvZCBtKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgICAgOwotICBtZXRob2QgX20oKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qCisgIG1ldGhvZCBfbSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQqPiogYXN5bmMgCiAgICAgOwogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKQEAgLTIzLDcgKzIzLDcgQEAKICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOwogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKIH0KLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBleHBlY3QoZHluYW1pYyBleHBlY3RlZCwgZHluYW1pYyBhY3R1YWwpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYnVnMzMxOTYuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYnVnMzMxOTYuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA3ZWJiNDRlLi5iMTg3MTAyIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2J1ZzMzMTk2LmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9idWczMzE5Ni5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC02LDUgKzYsNSBAQAogCiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybnNTdHJpbmcoKSDihpIgRnV0dXJlT3I8Y29yZTo6U3RyaW5nKj4qCitzdGF0aWMgbWV0aG9kIHJldHVybnNTdHJpbmcoKSDihpIgRnV0dXJlT3I8Y29yZTo6U3RyaW5nKj4qIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2J1ZzMzMjA2LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2J1ZzMzMjA2LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggYjJlOWViYS4uYWE4NzhkZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9idWczMzIwNi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvYnVnMzMyMDYuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzgsMTMgKzM4LDEzIEBACiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7CiB9Ci1zdGF0aWMgbWV0aG9kIGYxKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6T2JqZWN0Kj4qPioKK3N0YXRpYyBtZXRob2QgZjEoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TGlzdDxjb3JlOjpPYmplY3QqPio+KiBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBmMigpIOKGkiBjb3JlOjpMaXN0PGNvcmU6Ok9iamVjdCo+KgogICA7Ci1zdGF0aWMgbWV0aG9kIGYzKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Ok9iamVjdCo+Kgorc3RhdGljIG1ldGhvZCBmMygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpPYmplY3QqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZm9vKCkg4oaSIGFzeTo6RnV0dXJlPHNlbGY6OlgqPioKK3N0YXRpYyBtZXRob2QgZm9vKCkg4oaSIGFzeTo6RnV0dXJlPHNlbGY6OlgqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPioKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiogYXN5bmMgCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvY2hlY2tfZGVmZXJyZWRfYmVmb3JlX2FyZ3MyLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2NoZWNrX2RlZmVycmVkX2JlZm9yZV9hcmdzMi5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGJiN2YyOTYuLmVhYTE3NjQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvY2hlY2tfZGVmZXJyZWRfYmVmb3JlX2FyZ3MyLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9jaGVja19kZWZlcnJlZF9iZWZvcmVfYXJnczIuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNSw3ICs1LDcgQEAKIAogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiAKIGxpYnJhcnk7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2NvbnRyb2xfZmxvd19jb2xsZWN0aW9uX2luZmVyZW5jZS5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9jb250cm9sX2Zsb3dfY29sbGVjdGlvbl9pbmZlcmVuY2UuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA1MGFlMTQ2Li45MTU4YTRmIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2NvbnRyb2xfZmxvd19jb2xsZWN0aW9uX2luZmVyZW5jZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvY29udHJvbF9mbG93X2NvbGxlY3Rpb25faW5mZXJlbmNlLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTMxLDcgKzMxLDcgQEAKICAgOwogc3RhdGljIG1ldGhvZCB0ZXN0Rm9yRWxlbWVudChkeW5hbWljIGR5blZhciwgY29yZTo6TGlzdDxjb3JlOjppbnQqPiogbGlzdEludCwgY29yZTo6TGlzdDxjb3JlOjpkb3VibGUqPiogbGlzdERvdWJsZSwgY29yZTo6aW50KiBpbmRleCwgY29yZTo6TWFwPGNvcmU6OlN0cmluZyosIGNvcmU6OmludCo+KiBtYXBTdHJpbmdJbnQsIGNvcmU6Ok1hcDxjb3JlOjpTdHJpbmcqLCBjb3JlOjpkb3VibGUqPiogbWFwU3RyaW5nRG91YmxlKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIHRlc3RGb3JFbGVtZW50RXJyb3JzKGNvcmU6Ok1hcDxjb3JlOjppbnQqLCBjb3JlOjppbnQqPiogbWFwLCBjb3JlOjpMaXN0PGNvcmU6OmludCo+KiBsaXN0KSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCB0ZXN0Rm9yRWxlbWVudEVycm9ycyhjb3JlOjpNYXA8Y29yZTo6aW50KiwgY29yZTo6aW50Kj4qIG1hcCwgY29yZTo6TGlzdDxjb3JlOjppbnQqPiogbGlzdCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdEZvckVsZW1lbnRFcnJvcnNOb3RBc3luYyhhc3k6OlN0cmVhbTxjb3JlOjppbnQqPiogc3RyZWFtKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Vycm9yX3JlY292ZXJ5L2VtcHR5X2F3YWl0X2Zvci5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9lcnJvcl9yZWNvdmVyeS9lbXB0eV9hd2FpdF9mb3IuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA2YTI4YzBkLi5iMzMwNGVmIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Vycm9yX3JlY292ZXJ5L2VtcHR5X2F3YWl0X2Zvci5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvZXJyb3JfcmVjb3ZlcnkvZW1wdHlfYXdhaXRfZm9yLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTEsNSArMSw1IEBACiBsaWJyYXJ5OwogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIAotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Z1dHVyZV9vcl90ZXN0LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Z1dHVyZV9vcl90ZXN0LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggOWE0ZGZhZC4uNGJmZTFkMyAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9mdXR1cmVfb3JfdGVzdC5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvZnV0dXJlX29yX3Rlc3QuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjUsNyArMjUsNyBAQAogICBmaWVsZCBzZWxmOjpBKiBhOwogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkIqCiAgICAgOwotICBtZXRob2QgYmFyKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+KgorICBtZXRob2QgYmFyKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+KiBhc3luYyAKICAgICA7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwpAQCAtNDIsNyArNDIsNyBAQAogICBmaWVsZCBzZWxmOjpCKiBiOwogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkMqCiAgICAgOwotICBtZXRob2QgYmF6KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KgorICBtZXRob2QgYmF6KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiBhc3luYyAKICAgICA7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9mdXR1cmVfcmV0dXJuLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Z1dHVyZV9yZXR1cm4uZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA3ZmVkMTcxLi5kMjA5YjIwIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Z1dHVyZV9yZXR1cm4uZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2Z1dHVyZV9yZXR1cm4uZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjEsMjkgKzIxLDI5IEBACiB9CiBzdGF0aWMgbWV0aG9kIHJldHVybkR5bmFtaWMoKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkNsYXNzKCkg4oaSIHNlbGY6OkNsYXNzKgorc3RhdGljIG1ldGhvZCByZXR1cm5DbGFzcygpIOKGkiBzZWxmOjpDbGFzcyogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlQ2xhc3MoKSDihpIgYXN5OjpGdXR1cmU8c2VsZjo6Q2xhc3MqPioKK3N0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlQ2xhc3MoKSDihpIgYXN5OjpGdXR1cmU8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlT3JDbGFzcygpIOKGkiBGdXR1cmVPcjxzZWxmOjpDbGFzcyo+Kgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVPckNsYXNzKCkg4oaSIEZ1dHVyZU9yPHNlbGY6OkNsYXNzKj4qIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkNsYXNzRnJvbUR5bmFtaWMoKSDihpIgc2VsZjo6Q2xhc3MqCitzdGF0aWMgbWV0aG9kIHJldHVybkNsYXNzRnJvbUR5bmFtaWMoKSDihpIgc2VsZjo6Q2xhc3MqIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkZ1dHVyZUNsYXNzRHluYW1pYygpIOKGkiBhc3k6OkZ1dHVyZTxzZWxmOjpDbGFzcyo+Kgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVDbGFzc0R5bmFtaWMoKSDihpIgYXN5OjpGdXR1cmU8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlT3JDbGFzc0R5bmFtaWMoKSDihpIgRnV0dXJlT3I8c2VsZjo6Q2xhc3MqPioKK3N0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlT3JDbGFzc0R5bmFtaWMoKSDihpIgRnV0dXJlT3I8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuQ2xhc3NGcm9tRnV0dXJlQ2xhc3MoKSDihpIgc2VsZjo6Q2xhc3MqCitzdGF0aWMgbWV0aG9kIHJldHVybkNsYXNzRnJvbUZ1dHVyZUNsYXNzKCkg4oaSIHNlbGY6OkNsYXNzKiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVDbGFzc0Zyb21GdXR1cmVDbGFzcygpIOKGkiBhc3k6OkZ1dHVyZTxzZWxmOjpDbGFzcyo+Kgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVDbGFzc0Zyb21GdXR1cmVDbGFzcygpIOKGkiBhc3k6OkZ1dHVyZTxzZWxmOjpDbGFzcyo+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVPckNsYXNzRnJvbUZ1dHVyZUNsYXNzKCkg4oaSIEZ1dHVyZU9yPHNlbGY6OkNsYXNzKj4qCitzdGF0aWMgbWV0aG9kIHJldHVybkZ1dHVyZU9yQ2xhc3NGcm9tRnV0dXJlQ2xhc3MoKSDihpIgRnV0dXJlT3I8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuQ2xhc3NGcm9tRnV0dXJlT3JDbGFzcygpIOKGkiBzZWxmOjpDbGFzcyoKK3N0YXRpYyBtZXRob2QgcmV0dXJuQ2xhc3NGcm9tRnV0dXJlT3JDbGFzcygpIOKGkiBzZWxmOjpDbGFzcyogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlQ2xhc3NGcm9tRnV0dXJlT3JDbGFzcygpIOKGkiBhc3k6OkZ1dHVyZTxzZWxmOjpDbGFzcyo+Kgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVDbGFzc0Zyb21GdXR1cmVPckNsYXNzKCkg4oaSIGFzeTo6RnV0dXJlPHNlbGY6OkNsYXNzKj4qIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkZ1dHVyZU9yQ2xhc3NGcm9tRnV0dXJlT3JDbGFzcygpIOKGkiBGdXR1cmVPcjxzZWxmOjpDbGFzcyo+Kgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVPckNsYXNzRnJvbUZ1dHVyZU9yQ2xhc3MoKSDihpIgRnV0dXJlT3I8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9pc3N1ZTQwNjYyLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDA2NjIuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA0YmY3NWI0Li45OTNmMmQ2IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDA2NjIuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDA2NjIuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNCw5ICs0LDkgQEAKIAogc3RhdGljIG1ldGhvZCBiYXIoY29yZTo6aW50KiBhLCBjb3JlOjpMaXN0PGNvcmU6OmludCo+KiBiKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIGZvbyhjb3JlOjppbnQqIHgpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGZvbyhjb3JlOjppbnQqIHgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgdm9pZAorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgZXhwZWN0KGR5bmFtaWMgZXhwZWN0ZWQsIGR5bmFtaWMgYWN0dWFsKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDEyMTBiL2lzc3VlNDEyMTBfbGliLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDEyMTBiL2lzc3VlNDEyMTAuZGFydC5vdXRsaW5lLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9pc3N1ZTQxMjEwYi9pc3N1ZTQxMjEwX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDEyMTBiL2lzc3VlNDEyMTAuZGFydC5vdXRsaW5lLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9pc3N1ZTQxMjEwYi9pc3N1ZTQxMjEwX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDEyMTBiL2lzc3VlNDEyMTAuZGFydC5zdHJvbmcuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL2lzc3VlNDEyMTBiL2lzc3VlNDEyMTBfbGliLmRhcnQuc3Ryb25nLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9pc3N1ZTQxMjEwYi9pc3N1ZTQxMjEwLmRhcnQuc3Ryb25nLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9ub19zdWNoX21ldGhvZF9mb3J3YXJkZXIuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMzE5YQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBYIHsKKyAgdm9pZCBfZm9vKCkgYXN5bmMgeworICAgIGF3YWl0IG51bGw7CisgICAgcHJpbnQoImhlbGxvIik7CisgIH0KKworICB2b2lkIGZvbygpID0+IF9mb28oKTsKK30KKworY2xhc3MgWSBpbXBsZW1lbnRzIFggeworICB2b2lkIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIF8pIHsKKyAgICBwcmludCgiSGVsbG8gZnJvbSBub1N1Y2hNZXRob2QiKTsKKyAgfQorfQorCittYWluKCkgeworICBZIHkgPSBuZXcgWSgpOworICB5LmZvbygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0Lm91dGxpbmUuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTdhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0wLDAgKzEsNDMgQEAKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK2NsYXNzIFggZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlgqCisgICAgOworICBtZXRob2QgX2ZvbygpIOKGkiB2b2lkIGFzeW5jIAorICAgIDsKKyAgbWV0aG9kIGZvbygpIOKGkiB2b2lkCisgICAgOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogaW52b2NhdGlvbikg4oaSIGR5bmFtaWM7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Cit9CitjbGFzcyBZIGV4dGVuZHMgY29yZTo6T2JqZWN0IGltcGxlbWVudHMgc2VsZjo6WCB7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6WSoKKyAgICA7CisgIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogXykg4oaSIHZvaWQKKyAgICA7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7CisgIG5vLXN1Y2gtbWV0aG9kLWZvcndhcmRlciBtZXRob2QgX2ZvbygpIOKGkiB2b2lkCisgICAgcmV0dXJuIHRoaXMue3NlbGY6Olk6Om5vU3VjaE1ldGhvZH0obmV3IGNvcmU6Ol9JbnZvY2F0aW9uTWlycm9yOjpfd2l0aFR5cGUoI19mb28sIDAsIGNvbnN0IDxjb3JlOjpUeXBlKj5bXSwgY29uc3QgPGR5bmFtaWM+W10sIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KGNvbnN0IDxjb3JlOjpTeW1ib2wqLCBkeW5hbWljPnt9KSkpOworICBuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXIgbWV0aG9kIGZvbygpIOKGkiB2b2lkCisgICAgcmV0dXJuIHRoaXMue3NlbGY6Olk6Om5vU3VjaE1ldGhvZH0obmV3IGNvcmU6Ol9JbnZvY2F0aW9uTWlycm9yOjpfd2l0aFR5cGUoI2ZvbywgMCwgY29uc3QgPGNvcmU6OlR5cGUqPltdLCBjb25zdCA8ZHluYW1pYz5bXSwgY29yZTo6TWFwOjp1bm1vZGlmaWFibGU8Y29yZTo6U3ltYm9sKiwgZHluYW1pYz4oY29uc3QgPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+e30pKSk7Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnN0cm9uZy5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4ODAwMgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQuc3Ryb25nLmV4cGVjdApAQCAtMCwwICsxLDU4IEBACitsaWJyYXJ5OworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitjbGFzcyBYIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpYKgorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKKyAgbWV0aG9kIF9mb28oKSDihpIgdm9pZCBhc3luYyB7CisgICAgYXdhaXQgbnVsbDsKKyAgICBjb3JlOjpwcmludCgiaGVsbG8iKTsKKyAgfQorICBtZXRob2QgZm9vKCkg4oaSIHZvaWQKKyAgICByZXR1cm4gdGhpcy57c2VsZjo6WDo6X2Zvb30oKTsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOworfQorY2xhc3MgWSBleHRlbmRzIGNvcmU6Ok9iamVjdCBpbXBsZW1lbnRzIHNlbGY6OlggeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlkqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIF8pIOKGkiB2b2lkIHsKKyAgICBjb3JlOjpwcmludCgiSGVsbG8gZnJvbSBub1N1Y2hNZXRob2QiKTsKKyAgfQorICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOworICBuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXIgbWV0aG9kIF9mb28oKSDihpIgdm9pZAorICAgIHJldHVybiB0aGlzLntzZWxmOjpZOjpub1N1Y2hNZXRob2R9KG5ldyBjb3JlOjpfSW52b2NhdGlvbk1pcnJvcjo6X3dpdGhUeXBlKCNDMSwgMCwgI0MyLCAjQzMsIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KCNDNCkpKTsKKyAgbm8tc3VjaC1tZXRob2QtZm9yd2FyZGVyIG1ldGhvZCBmb28oKSDihpIgdm9pZAorICAgIHJldHVybiB0aGlzLntzZWxmOjpZOjpub1N1Y2hNZXRob2R9KG5ldyBjb3JlOjpfSW52b2NhdGlvbk1pcnJvcjo6X3dpdGhUeXBlKCNDNSwgMCwgI0MyLCAjQzMsIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KCNDNCkpKTsKK30KK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHsKKyAgc2VsZjo6WSogeSA9IG5ldyBzZWxmOjpZOjrigKIoKTsKKyAgeS57c2VsZjo6WDo6Zm9vfSgpOworfQorCitjb25zdGFudHMgIHsKKyAgI0MxID0gI29yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9ub19zdWNoX21ldGhvZF9mb3J3YXJkZXIuZGFydDo6X2ZvbworICAjQzIgPSA8Y29yZTo6VHlwZSo+W10KKyAgI0MzID0gPGR5bmFtaWM+W10KKyAgI0M0ID0gY29yZTo6X0ltbXV0YWJsZU1hcDxjb3JlOjpTeW1ib2wqLCBkeW5hbWljPiB7X2t2UGFpcnM6I0MzfQorICAjQzUgPSAjZm9vCit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNDcxZQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDg1IEBACitsaWJyYXJ5OworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CitpbXBvcnQgImRhcnQ6X2ludGVybmFsIiBhcyBfaW47CisKK2NsYXNzIFggZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlgqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBtZXRob2QgX2ZvbygpIOKGkiB2b2lkIC8qIG9yaWdpbmFsbHkgYXN5bmMgKi8geworICAgIGZpbmFsIGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI8ZHluYW1pYz4qIDphc3luY19jb21wbGV0ZXIgPSBuZXcgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjo64oCiPGR5bmFtaWM+KCk7CisgICAgRnV0dXJlT3I8ZHluYW1pYz4qIDpyZXR1cm5fdmFsdWU7CisgICAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgICAgKGR5bmFtaWMpIOKGkiogZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgICAoY29yZTo6T2JqZWN0KiwgY29yZTo6U3RhY2tUcmFjZSopIOKGkiogZHluYW1pYyA6YXN5bmNfb3BfZXJyb3I7CisgICAgY29yZTo6aW50KiA6YXdhaXRfanVtcF92YXIgPSAwOworICAgIGR5bmFtaWMgOmF3YWl0X2N0eF92YXI7CisgICAgZHluYW1pYyA6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMDsKKyAgICBmdW5jdGlvbiA6YXN5bmNfb3AoW2R5bmFtaWMgOnJlc3VsdCwgZHluYW1pYyA6ZXhjZXB0aW9uLCBkeW5hbWljIDpzdGFja190cmFjZV0pIOKGkiBkeW5hbWljIHlpZWxkaW5nIAorICAgICAgdHJ5IHsKKyAgICAgICAgI0wxOgorICAgICAgICB7CisgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDEgPSBhc3k6Ol9hd2FpdEhlbHBlcihudWxsLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgICAgX2luOjp1bnNhZmVDYXN0PGNvcmU6Ok51bGw/Pig6cmVzdWx0KTsKKyAgICAgICAgICBjb3JlOjpwcmludCgiaGVsbG8iKTsKKyAgICAgICAgfQorICAgICAgICBhc3k6Ol9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oOmFzeW5jX2NvbXBsZXRlciwgOnJldHVybl92YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG9uIGR5bmFtaWMgY2F0Y2goZHluYW1pYyBleGNlcHRpb24sIGNvcmU6OlN0YWNrVHJhY2UqIHN0YWNrX3RyYWNlKSB7CisgICAgICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpjb21wbGV0ZUVycm9yfShleGNlcHRpb24sIHN0YWNrX3RyYWNlKTsKKyAgICAgIH0KKyAgICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgICA6YXN5bmNfb3BfdGhlbiA9IGFzeTo6X2FzeW5jVGhlbldyYXBwZXJIZWxwZXIoOmFzeW5jX29wKTsKKyAgICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICAgIHJldHVybiA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKKyAgfQorICBtZXRob2QgZm9vKCkg4oaSIHZvaWQKKyAgICByZXR1cm4gdGhpcy57c2VsZjo6WDo6X2Zvb30oKTsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOworfQorY2xhc3MgWSBleHRlbmRzIGNvcmU6Ok9iamVjdCBpbXBsZW1lbnRzIHNlbGY6OlggeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlkqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIF8pIOKGkiB2b2lkIHsKKyAgICBjb3JlOjpwcmludCgiSGVsbG8gZnJvbSBub1N1Y2hNZXRob2QiKTsKKyAgfQorICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOworICBuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXIgbWV0aG9kIF9mb28oKSDihpIgdm9pZAorICAgIHJldHVybiB0aGlzLntzZWxmOjpZOjpub1N1Y2hNZXRob2R9KG5ldyBjb3JlOjpfSW52b2NhdGlvbk1pcnJvcjo6X3dpdGhUeXBlKCNDMSwgMCwgI0MyLCAjQzMsIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KCNDNCkpKTsKKyAgbm8tc3VjaC1tZXRob2QtZm9yd2FyZGVyIG1ldGhvZCBmb28oKSDihpIgdm9pZAorICAgIHJldHVybiB0aGlzLntzZWxmOjpZOjpub1N1Y2hNZXRob2R9KG5ldyBjb3JlOjpfSW52b2NhdGlvbk1pcnJvcjo6X3dpdGhUeXBlKCNDNSwgMCwgI0MyLCAjQzMsIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KCNDNCkpKTsKK30KK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHsKKyAgc2VsZjo6WSogeSA9IG5ldyBzZWxmOjpZOjrigKIoKTsKKyAgeS57c2VsZjo6WDo6Zm9vfSgpOworfQorCitjb25zdGFudHMgIHsKKyAgI0MxID0gI29yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9ub19zdWNoX21ldGhvZF9mb3J3YXJkZXIuZGFydDo6X2ZvbworICAjQzIgPSA8Y29yZTo6VHlwZSo+W10KKyAgI0MzID0gPGR5bmFtaWM+W10KKyAgI0M0ID0gY29yZTo6X0ltbXV0YWJsZU1hcDxjb3JlOjpTeW1ib2wqLCBkeW5hbWljPiB7X2t2UGFpcnM6I0MzfQorICAjQzUgPSAjZm9vCit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL25vX3N1Y2hfbWV0aG9kX2ZvcndhcmRlci5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhYTE4MwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApAQCAtMCwwICsxLDEwIEBACitjbGFzcyBYIHsKKyAgdm9pZCBfZm9vKCkgYXN5bmMge30KKyAgdm9pZCBmb28oKSA9PiBfZm9vKCk7Cit9CisKK2NsYXNzIFkgaW1wbGVtZW50cyBYIHsKKyAgdm9pZCBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBfKSB7fQorfQorCittYWluKCkge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvbm9fc3VjaF9tZXRob2RfZm9yd2FyZGVyLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FhMTgzCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9ub19zdWNoX21ldGhvZF9mb3J3YXJkZXIuZGFydC50ZXh0dWFsX291dGxpbmVfbW9kZWxsZWQuZXhwZWN0CkBAIC0wLDAgKzEsMTAgQEAKK2NsYXNzIFggeworICB2b2lkIF9mb28oKSBhc3luYyB7fQorICB2b2lkIGZvbygpID0+IF9mb28oKTsKK30KKworY2xhc3MgWSBpbXBsZW1lbnRzIFggeworICB2b2lkIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIF8pIHt9Cit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9zdGF0ZW1lbnRzLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3N0YXRlbWVudHMuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCAxMjJjOWNiMS4uMWI5NDYxNCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9zdGF0ZW1lbnRzLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9zdGF0ZW1lbnRzLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTMsNyArMyw3IEBACiAKIHN0YXRpYyBtZXRob2QgZm9vKCkg4oaSIGR5bmFtaWMKICAgOwotc3RhdGljIG1ldGhvZCBiYXIoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBiYXIoKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC9zdHJlYW1fZnV0dXJlLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3N0cmVhbV9mdXR1cmUuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA3NTU0ZDkzLi5kOWQyMTEyIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3N0cmVhbV9mdXR1cmUuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3N0cmVhbV9mdXR1cmUuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjMsMTMgKzIzLDEzIEBACiAgIDsKIHN0YXRpYyBtZXRob2QgcmV0dXJuQ2xhc3MoKSDihpIgc2VsZjo6Q2xhc3MqCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlRHluYW1pYygpIOKGkiBhc3k6OkZ1dHVyZTxkeW5hbWljPioKK3N0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlRHluYW1pYygpIOKGkiBhc3k6OkZ1dHVyZTxkeW5hbWljPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlQ2xhc3MoKSDihpIgYXN5OjpGdXR1cmU8c2VsZjo6Q2xhc3MqPioKK3N0YXRpYyBtZXRob2QgcmV0dXJuRnV0dXJlQ2xhc3MoKSDihpIgYXN5OjpGdXR1cmU8c2VsZjo6Q2xhc3MqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZXJyb3IoKSDihpIgYXN5OjpTdHJlYW08RnV0dXJlT3I8c2VsZjo6Q2xhc3MqPio+Kgorc3RhdGljIG1ldGhvZCBlcnJvcigpIOKGkiBhc3k6OlN0cmVhbTxGdXR1cmVPcjxzZWxmOjpDbGFzcyo+Kj4qIGFzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBzdHJlYW0oKSDihpIgYXN5OjpTdHJlYW08RnV0dXJlT3I8c2VsZjo6Q2xhc3MqPio+Kgorc3RhdGljIG1ldGhvZCBzdHJlYW0oKSDihpIgYXN5OjpTdHJlYW08RnV0dXJlT3I8c2VsZjo6Q2xhc3MqPio+KiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluLmRhcnQub3V0bGluZS5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvYWJzdHJhY3RfbWVtYmVyc19mcm9tX2RpbGwvbWFpbl9saWIuZGFydC5vdXRsaW5lLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluLmRhcnQub3V0bGluZS5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvYWJzdHJhY3RfbWVtYmVyc19mcm9tX2RpbGwvbWFpbl9saWIuZGFydC5zdHJvbmcuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluLmRhcnQuc3Ryb25nLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvYWJzdHJhY3RfbWVtYmVyc19mcm9tX2RpbGwvbWFpbi5kYXJ0LnN0cm9uZy5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvYWJzdHJhY3RfbWVtYmVyc19mcm9tX2RpbGwvbWFpbl9saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9hYnN0cmFjdF9tZW1iZXJzX2Zyb21fZGlsbC9tYWluX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvYWJzdHJhY3RfbWVtYmVyc19mcm9tX2RpbGwvbWFpbi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9leHRlbnNpb25fZnJvbV9kaWxsL2V4dGVuc2lvbl9mcm9tX2RpbGwuZGFydC5vdXRsaW5lLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9leHRlbnNpb25fZnJvbV9kaWxsL2V4dGVuc2lvbl9mcm9tX2RpbGxfbGliLmRhcnQub3V0bGluZS5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsLmRhcnQub3V0bGluZS5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3dpdGhfZGVwZW5kZW5jaWVzL2V4dGVuc2lvbl9mcm9tX2RpbGwvZXh0ZW5zaW9uX2Zyb21fZGlsbC5kYXJ0LnN0cm9uZy5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsLmRhcnQuc3Ryb25nLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9leHRlbnNpb25fZnJvbV9kaWxsL2V4dGVuc2lvbl9mcm9tX2RpbGxfbGliLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvZXh0ZW5zaW9uX2Zyb21fZGlsbC9leHRlbnNpb25fZnJvbV9kaWxsLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9leHRlbnNpb25fZnJvbV9kaWxsL2V4dGVuc2lvbl9mcm9tX2RpbGxfbGliLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9leHRlbnNpb25fZnJvbV9kaWxsL2V4dGVuc2lvbl9mcm9tX2RpbGwuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3dpdGhfZGVwZW5kZW5jaWVzL21peGluX2Zyb21fZGlsbC9taXhpbl9mcm9tX2RpbGxfbGliMS5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9taXhpbl9mcm9tX2RpbGwvbWl4aW5fZnJvbV9kaWxsLmRhcnQub3V0bGluZS5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbF9saWIxLmRhcnQub3V0bGluZS5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3dpdGhfZGVwZW5kZW5jaWVzL21peGluX2Zyb21fZGlsbC9taXhpbl9mcm9tX2RpbGxfbGliMS5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3dpdGhfZGVwZW5kZW5jaWVzL21peGluX2Zyb21fZGlsbC9taXhpbl9mcm9tX2RpbGwuZGFydC5zdHJvbmcuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9nZW5lcmFsL3dpdGhfZGVwZW5kZW5jaWVzL21peGluX2Zyb21fZGlsbC9taXhpbl9mcm9tX2RpbGxfbGliMS5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbC5kYXJ0LnN0cm9uZy5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbF9saWIxLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbC5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvbWl4aW5fZnJvbV9kaWxsL21peGluX2Zyb21fZGlsbF9saWIxLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy9taXhpbl9mcm9tX2RpbGwvbWl4aW5fZnJvbV9kaWxsLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsLmRhcnQub3V0bGluZS5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvdmFyaWFuY2VfZnJvbV9kaWxsL3ZhcmlhbmNlX2Zyb21fZGlsbF9saWIuZGFydC5vdXRsaW5lLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsLmRhcnQub3V0bGluZS5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvdmFyaWFuY2VfZnJvbV9kaWxsL3ZhcmlhbmNlX2Zyb21fZGlsbF9saWIuZGFydC5zdHJvbmcuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsLmRhcnQuc3Ryb25nLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvdmFyaWFuY2VfZnJvbV9kaWxsL3ZhcmlhbmNlX2Zyb21fZGlsbC5kYXJ0LnN0cm9uZy5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvdmFyaWFuY2VfZnJvbV9kaWxsL3ZhcmlhbmNlX2Zyb21fZGlsbF9saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvZ2VuZXJhbC93aXRoX2RlcGVuZGVuY2llcy92YXJpYW5jZV9mcm9tX2RpbGwvdmFyaWFuY2VfZnJvbV9kaWxsX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2dlbmVyYWwvd2l0aF9kZXBlbmRlbmNpZXMvdmFyaWFuY2VfZnJvbV9kaWxsL3ZhcmlhbmNlX2Zyb21fZGlsbC5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luY3JlbWVudGFsX2luaXRpYWxpemVfZnJvbV9kaWxsL2JhZF9zZGtfdXJpLnlhbWwgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzI5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sCkBAIC0wLDAgKzEsNTggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorIyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorIyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRS5tZCBmaWxlLgorCisjIEdpdmUgYSBiYWQgU0RLIFVSSSwgYW5kIHRyeSB0byBpbml0aWFsaXplIGZyb20gZGlsbC4KKwordHlwZTogbmV3d29ybGQKK3dvcmxkczoKKyAgLSBlbnRyeTogbWFpbi5kYXJ0CisgICAgc291cmNlczoKKyAgICAgIG1haW4uZGFydDogfAorICAgICAgICBpbXBvcnQgJ2xpYi5kYXJ0JzsKKyAgICAgICAgY2xhc3MgQSBleHRlbmRzIEIge30KKyAgICAgIGxpYi5kYXJ0OiB8CisgICAgICAgIGNsYXNzIEIgeworICAgICAgICAgIHZvaWQgYk1ldGhvZCgpIHt9CisgICAgICAgIH0KKyAgICBleHBlY3RlZExpYnJhcnlDb3VudDogMgorCisgIC0gZW50cnk6IG1haW4uZGFydAorICAgIGV4cGVjdEluaXRpYWxpemVGcm9tRGlsbDogdHJ1ZQorICAgIGludmFsaWRhdGU6CisgICAgICAtIG1haW4uZGFydAorICAgIHNvdXJjZXM6CisgICAgICBtYWluLmRhcnQ6IHwKKyAgICAgICAgaW1wb3J0ICdsaWIuZGFydCc7CisgICAgICAgIGNsYXNzIEEgZXh0ZW5kcyBCIHt9CisgICAgICBsaWIuZGFydDogfAorICAgICAgICBjbGFzcyBCIHsKKyAgICAgICAgICB2b2lkIGJNZXRob2QoKSB7fQorICAgICAgICB9CisgICAgZXhwZWN0ZWRMaWJyYXJ5Q291bnQ6IDIKKworICAtIGVudHJ5OiBtYWluLmRhcnQKKyAgICBiYWRTZGs6IHRydWUKKyAgICBlcnJvcnM6IHRydWUKKyAgICBleHBlY3RJbml0aWFsaXplRnJvbURpbGw6IGZhbHNlCisgICAgZXhwZWN0SW5pdGlhbGl6YXRpb25FcnJvcjogZmFsc2UKKworICAgICMgdGhpcyBza2lwcyBhIGNoZWNrIHRoYXQgZmFpbHMgKHNob3VsZG4ndCBtYXR0ZXIgY29uc2lkZXJpbmcgdGhpcyBpcyBhbgorICAgICMgZXhjZXB0aW9uYWwgY2FzZSkuCisgICAgY2hlY2tJbnZhbGlkYXRlZEZpbGVzOiBmYWxzZQorCisgICAgIyB0aGlzIHNraXBzIHJlLWNvbXBpbGluZyBzZXZlcmFsIHRpbWVzIHdoaWNoIGZhaWxzIHRvIHByb2R1Y2UgdGhlIHNhbWUKKyAgICAjIHJlc3VsdCAoc2hvdWxkbid0IG1hdHRlciBjb25zaWRlcmluZyB0aGlzIGlzIGFuIGV4Y2VwdGlvbmFsIGNhc2UpLgorICAgIG5vRnVsbENvbXBvbmVudDogdHJ1ZQorCisgICAgaW52YWxpZGF0ZToKKyAgICAgIC0gbWFpbi5kYXJ0CisgICAgc291cmNlczoKKyAgICAgIG1haW4uZGFydDogfAorICAgICAgICBpbXBvcnQgJ2xpYi5kYXJ0JzsKKyAgICAgICAgY2xhc3MgQSBleHRlbmRzIEIge30KKyAgICAgIGxpYi5kYXJ0OiB8CisgICAgICAgIGNsYXNzIEIgeworICAgICAgICAgIHZvaWQgYk1ldGhvZCgpIHt9CisgICAgICAgIH0KKyAgICBleHBlY3RlZExpYnJhcnlDb3VudDogMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luY3JlbWVudGFsX2luaXRpYWxpemVfZnJvbV9kaWxsL2JhZF9zZGtfdXJpLnlhbWwud29ybGQuMS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjEuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGFiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjEuZXhwZWN0CkBAIC0wLDAgKzEsMzAgQEAKK21haW4gPSA8Tm8gTWVtYmVyPjsKK2xpYnJhcnkgZnJvbSAib3JnLWRhcnRsYW5nLXRlc3Q6Ly8vbGliLmRhcnQiIGFzIGxpYiB7CisKKyAgY2xhc3MgQiBleHRlbmRzIGRhcnQuY29yZTo6T2JqZWN0IHsKKyAgICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIGxpYjo6QioKKyAgICAgIDogc3VwZXIgZGFydC5jb3JlOjpPYmplY3Q6OuKAoigpCisgICAgICA7CisgICAgbWV0aG9kIGJNZXRob2QoKSDihpIgdm9pZCB7fQorICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGRhcnQuY29yZTo6aW50KjsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBkYXJ0LmNvcmU6OmJvb2wqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mKGR5bmFtaWMgdHlwZSkg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBkYXJ0LmNvcmU6OmJvb2wqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgZGFydC5jb3JlOjppbnQqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGRhcnQuY29yZTo6U3RyaW5nKjsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoZGFydC5jb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBkYXJ0LmNvcmU6OlR5cGUqOworICB9Cit9CitsaWJyYXJ5IGZyb20gIm9yZy1kYXJ0bGFuZy10ZXN0Oi8vL21haW4uZGFydCIgYXMgbWFpbiB7CisKKyAgaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdDovLy9saWIuZGFydCI7CisKKyAgY2xhc3MgQSBleHRlbmRzIGxpYjo6QiB7CisgICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBtYWluOjpBKgorICAgICAgOiBzdXBlciBsaWI6OkI6OuKAoigpCisgICAgICA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luY3JlbWVudGFsX2luaXRpYWxpemVfZnJvbV9kaWxsL2JhZF9zZGtfdXJpLnlhbWwud29ybGQuMi5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjIuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMGFiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjIuZXhwZWN0CkBAIC0wLDAgKzEsMzAgQEAKK21haW4gPSA8Tm8gTWVtYmVyPjsKK2xpYnJhcnkgZnJvbSAib3JnLWRhcnRsYW5nLXRlc3Q6Ly8vbGliLmRhcnQiIGFzIGxpYiB7CisKKyAgY2xhc3MgQiBleHRlbmRzIGRhcnQuY29yZTo6T2JqZWN0IHsKKyAgICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIGxpYjo6QioKKyAgICAgIDogc3VwZXIgZGFydC5jb3JlOjpPYmplY3Q6OuKAoigpCisgICAgICA7CisgICAgbWV0aG9kIGJNZXRob2QoKSDihpIgdm9pZCB7fQorICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGRhcnQuY29yZTo6aW50KjsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBkYXJ0LmNvcmU6OmJvb2wqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mKGR5bmFtaWMgdHlwZSkg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBkYXJ0LmNvcmU6OmJvb2wqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikg4oaSIGRhcnQuY29yZTo6Ym9vbCo7CisgICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgZGFydC5jb3JlOjppbnQqOworICAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGRhcnQuY29yZTo6U3RyaW5nKjsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoZGFydC5jb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBkYXJ0LmNvcmU6OlR5cGUqOworICB9Cit9CitsaWJyYXJ5IGZyb20gIm9yZy1kYXJ0bGFuZy10ZXN0Oi8vL21haW4uZGFydCIgYXMgbWFpbiB7CisKKyAgaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdDovLy9saWIuZGFydCI7CisKKyAgY2xhc3MgQSBleHRlbmRzIGxpYjo6QiB7CisgICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBtYWluOjpBKgorICAgICAgOiBzdXBlciBsaWI6OkI6OuKAoigpCisgICAgICA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luY3JlbWVudGFsX2luaXRpYWxpemVfZnJvbV9kaWxsL2JhZF9zZGtfdXJpLnlhbWwud29ybGQuMy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjMuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTAxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmNyZW1lbnRhbF9pbml0aWFsaXplX2Zyb21fZGlsbC9iYWRfc2RrX3VyaS55YW1sLndvcmxkLjMuZXhwZWN0CkBAIC0wLDAgKzEsNDEgQEAKK21haW4gPSA8Tm8gTWVtYmVyPjsKK2xpYnJhcnkgZnJvbSAib3JnLWRhcnRsYW5nLXRlc3Q6Ly8vbGliLmRhcnQiIGFzIGxpYiB7CisKKyAgY2xhc3MgQiBleHRlbmRzICNsaWIxOjpPYmplY3QgeworICAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgbGliOjpCKgorICAgICAgOiBzdXBlciAjbGliMTo6T2JqZWN0OjrigKIoKQorICAgICAgOworICAgIG1ldGhvZCBiTWV0aG9kKCkg4oaSIHZvaWQge30KKyAgICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgZHluYW1pYykg4oaSICNsaWIxOjpib29sKjsKKyAgfQorfQorbGlicmFyeSBmcm9tICJvcmctZGFydGxhbmctdGVzdDovLy9tYWluLmRhcnQiIGFzIG1haW4geworCisgIGltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3Q6Ly8vbGliLmRhcnQiOworCisgIGNsYXNzIEEgZXh0ZW5kcyBsaWI6OkIgeworICAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgbWFpbjo6QSoKKyAgICAgIDogc3VwZXIgbGliOjpCOjrigKIoKQorICAgICAgOworICB9Cit9CisKK0FuZCAxOCBwbGF0Zm9ybSBsaWJyYXJpZXM6CisgLSBkYXJ0Ol9idWlsdGluCisgLSBkYXJ0Ol9pbnRlcm5hbAorIC0gZGFydDpfdm1zZXJ2aWNlCisgLSBkYXJ0OmFzeW5jCisgLSBkYXJ0OmNsaQorIC0gZGFydDpjb2xsZWN0aW9uCisgLSBkYXJ0OmNvbnZlcnQKKyAtIGRhcnQ6Y29yZQorIC0gZGFydDpkZXZlbG9wZXIKKyAtIGRhcnQ6ZmZpCisgLSBkYXJ0OmlvCisgLSBkYXJ0Omlzb2xhdGUKKyAtIGRhcnQ6bWF0aAorIC0gZGFydDptaXJyb3JzCisgLSBkYXJ0Om5hdGl2ZXdyYXBwZXJzCisgLSBkYXJ0OnR5cGVkX2RhdGEKKyAtIGRhcnQ6dm1zZXJ2aWNlX2lvCisgLSBkYXJ0Ondhc20KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9hc3luY19hd2FpdC5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2FzeW5jX2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNjNkYzhhOC4uOWExMjg0YSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2FzeW5jX2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2FzeW5jX2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTI0LDcgKzI0LDcgQEAKICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgYXNTdHJlYW0oKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6aW50Kj4qOwogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCB0aW1lb3V0KGNvcmU6OkR1cmF0aW9uKiB0aW1lTGltaXQsIHtnZW5lcmljLWNvdmFyaWFudC1pbXBsICgpIOKGkiogRnV0dXJlT3I8Y29yZTo6aW50Kj5vblRpbWVvdXR9KSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qOwogfQotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIHZvaWQKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiB2b2lkIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvYmxvY2tfYm9kaWVkX2xhbWJkYXNfaW5mZXJfYm90dG9tX2FzeW5jLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvYmxvY2tfYm9kaWVkX2xhbWJkYXNfaW5mZXJfYm90dG9tX2FzeW5jLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNTVlMmVkMS4uMmZmZjM2MCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Jsb2NrX2JvZGllZF9sYW1iZGFzX2luZmVyX2JvdHRvbV9hc3luYy5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9ibG9ja19ib2RpZWRfbGFtYmRhc19pbmZlcl9ib3R0b21fYXN5bmMuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMyw1ICszLDUgQEAKIAogaW1wb3J0ICJkYXJ0OmFzeW5jIjsKIAotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvYmxvY2tfYm9kaWVkX2xhbWJkYXNfaW5mZXJfYm90dG9tX2FzeW5jX3N0YXIuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9ibG9ja19ib2RpZWRfbGFtYmRhc19pbmZlcl9ib3R0b21fYXN5bmNfc3Rhci5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDU1ZTJlZDEuLjJmZmYzNjAgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9ibG9ja19ib2RpZWRfbGFtYmRhc19pbmZlcl9ib3R0b21fYXN5bmNfc3Rhci5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9ibG9ja19ib2RpZWRfbGFtYmRhc19pbmZlcl9ib3R0b21fYXN5bmNfc3Rhci5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0zLDUgKzMsNSBAQAogCiBpbXBvcnQgImRhcnQ6YXN5bmMiOwogCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9kb3dud2FyZHNfaW5mZXJlbmNlX2FzeW5jX2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZG93bndhcmRzX2luZmVyZW5jZV9hc3luY19hd2FpdC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDc1NTRiN2MuLjU1Nzk1ZDUgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9kb3dud2FyZHNfaW5mZXJlbmNlX2FzeW5jX2F3YWl0LmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Rvd253YXJkc19pbmZlcmVuY2VfYXN5bmNfYXdhaXQuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNCw1ICs0LDUgQEAKIAogaW1wb3J0ICJkYXJ0OmFzeW5jIjsKIAotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+Kgorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+KiBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Rvd253YXJkc19pbmZlcmVuY2VfZm9yX2VhY2guZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9kb3dud2FyZHNfaW5mZXJlbmNlX2Zvcl9lYWNoLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggZTY2ZTAwNy4uYTNmNTdiOSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Rvd253YXJkc19pbmZlcmVuY2VfZm9yX2VhY2guZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZG93bndhcmRzX2luZmVyZW5jZV9mb3JfZWFjaC5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC01OCw3ICs1OCw3IEBACiB9CiBzdGF0aWMgbWV0aG9kIEY8VCBleHRlbmRzIGNvcmU6Ok9iamVjdCogPSBkeW5hbWljPigpIOKGkiBzZWxmOjpGOjpUKgogICA7Ci1zdGF0aWMgbWV0aG9kIGYoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4qCitzdGF0aWMgbWV0aG9kIGYoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4qIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4qCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4qIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZG93bndhcmRzX2luZmVyZW5jZV95aWVsZF95aWVsZF9zdGFyLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZG93bndhcmRzX2luZmVyZW5jZV95aWVsZF95aWVsZF9zdGFyLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggYzJlZTA0ZS4uN2VjNjg3ZSAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Rvd253YXJkc19pbmZlcmVuY2VfeWllbGRfeWllbGRfc3Rhci5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9kb3dud2FyZHNfaW5mZXJlbmNlX3lpZWxkX3lpZWxkX3N0YXIuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNTYsOSArNTYsOSBAQAogICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogaW52b2NhdGlvbikg4oaSIGR5bmFtaWM7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOwogfQotc3RhdGljIG1ldGhvZCBmb28oKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBmb28oKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+KiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgYmFyKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6Ok1hcDxjb3JlOjppbnQqLCBjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBiYXIoKSDihpIgY29yZTo6SXRlcmFibGU8Y29yZTo6TWFwPGNvcmU6OmludCosIGNvcmU6OmludCo+Kj4qIHN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZm9yX2VhY2hfZG93bmNhc3RfaXRlcmFibGUuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mb3JfZWFjaF9kb3duY2FzdF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDhlODU2OTcuLmY2OWY1MDAgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mb3JfZWFjaF9kb3duY2FzdF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mb3JfZWFjaF9kb3duY2FzdF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xLDcgKzEsNyBAQAogbGlicmFyeSB0ZXN0OwogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIAotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2FzeW5jX2NvbmRpdGlvbmFsLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2FzeW5jX2NvbmRpdGlvbmFsLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggMDczNjk4Mi4uZmE3Nzk0OCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9hc3luY19jb25kaXRpb25hbC5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fYXN5bmNfY29uZGl0aW9uYWwuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzIsMTEgKzMyLDExIEBACiAgIG1lbWJlci1zaWduYXR1cmUgbm8tc3VjaC1tZXRob2QtZm9yd2FyZGVyIG1ldGhvZCB0aW1lb3V0KGNvcmU6OkR1cmF0aW9uKiB0aW1lTGltaXQsIHtnZW5lcmljLWNvdmFyaWFudC1pbXBsICgpIOKGkiogRnV0dXJlT3I8c2VsZjo6TXlGdXR1cmU6OlQqPm9uVGltZW91dH0pIOKGkiBhc3k6OkZ1dHVyZTxzZWxmOjpNeUZ1dHVyZTo6VCo+KgogICAgIHJldHVybiB0aGlzLntzZWxmOjpNeUZ1dHVyZTo6bm9TdWNoTWV0aG9kfShuZXcgY29yZTo6X0ludm9jYXRpb25NaXJyb3I6Ol93aXRoVHlwZSgjdGltZW91dCwgMCwgY29uc3QgPGNvcmU6OlR5cGUqPltdLCBjb3JlOjpMaXN0Ojp1bm1vZGlmaWFibGU8ZHluYW1pYz4oPGR5bmFtaWM+W3RpbWVMaW1pdF0pLCBjb3JlOjpNYXA6OnVubW9kaWZpYWJsZTxjb3JlOjpTeW1ib2wqLCBkeW5hbWljPig8Y29yZTo6U3ltYm9sKiwgZHluYW1pYz57I29uVGltZW91dDogb25UaW1lb3V0fSkpKSBhc3tUeXBlRXJyb3IsRm9yRHluYW1pY30gYXN5OjpGdXR1cmU8c2VsZjo6TXlGdXR1cmU6OlQqPio7CiB9Ci1zdGF0aWMgbWV0aG9kIGcxKGNvcmU6OmJvb2wqIHgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQqPioKK3N0YXRpYyBtZXRob2QgZzEoY29yZTo6Ym9vbCogeCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBnMihjb3JlOjpib29sKiB4KSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qCitzdGF0aWMgbWV0aG9kIGcyKGNvcmU6OmJvb2wqIHgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQqPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZzMoY29yZTo6Ym9vbCogeCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBnMyhjb3JlOjpib29sKiB4KSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2FzeW5jX2NvbmRpdGlvbmFsXzIuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fYXN5bmNfY29uZGl0aW9uYWxfMi5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDA3MzY5ODIuLmZhNzc5NDggMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fYXN5bmNfY29uZGl0aW9uYWxfMi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fYXN5bmNfY29uZGl0aW9uYWxfMi5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0zMiwxMSArMzIsMTEgQEAKICAgbWVtYmVyLXNpZ25hdHVyZSBuby1zdWNoLW1ldGhvZC1mb3J3YXJkZXIgbWV0aG9kIHRpbWVvdXQoY29yZTo6RHVyYXRpb24qIHRpbWVMaW1pdCwge2dlbmVyaWMtY292YXJpYW50LWltcGwgKCkg4oaSKiBGdXR1cmVPcjxzZWxmOjpNeUZ1dHVyZTo6VCo+b25UaW1lb3V0fSkg4oaSIGFzeTo6RnV0dXJlPHNlbGY6Ok15RnV0dXJlOjpUKj4qCiAgICAgcmV0dXJuIHRoaXMue3NlbGY6Ok15RnV0dXJlOjpub1N1Y2hNZXRob2R9KG5ldyBjb3JlOjpfSW52b2NhdGlvbk1pcnJvcjo6X3dpdGhUeXBlKCN0aW1lb3V0LCAwLCBjb25zdCA8Y29yZTo6VHlwZSo+W10sIGNvcmU6Okxpc3Q6OnVubW9kaWZpYWJsZTxkeW5hbWljPig8ZHluYW1pYz5bdGltZUxpbWl0XSksIGNvcmU6Ok1hcDo6dW5tb2RpZmlhYmxlPGNvcmU6OlN5bWJvbCosIGR5bmFtaWM+KDxjb3JlOjpTeW1ib2wqLCBkeW5hbWljPnsjb25UaW1lb3V0OiBvblRpbWVvdXR9KSkpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljfSBhc3k6OkZ1dHVyZTxzZWxmOjpNeUZ1dHVyZTo6VCo+KjsKIH0KLXN0YXRpYyBtZXRob2QgZzEoY29yZTo6Ym9vbCogeCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBnMShjb3JlOjpib29sKiB4KSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGcyKGNvcmU6OmJvb2wqIHgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQqPioKK3N0YXRpYyBtZXRob2QgZzIoY29yZTo6Ym9vbCogeCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBnMyhjb3JlOjpib29sKiB4KSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Kj4qCitzdGF0aWMgbWV0aG9kIGczKGNvcmU6OmJvb2wqIHgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQqPiogYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkcy5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDc5MjFjNDIuLjViZTlmZWQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9kb3dud2FyZHMuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzUsOSArMzUsOSBAQAogc3RhdGljIGZpZWxkIHNlbGY6Ok15RnV0dXJlPGR5bmFtaWM+KiBmOwogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiB0MTsKIHN0YXRpYyBmaWVsZCBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIHQyOwotc3RhdGljIG1ldGhvZCBnMigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qCitzdGF0aWMgbWV0aG9kIGcyKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZzMoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBnMygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc18yLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc18yLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNzkyMWM0Mi4uNWJlOWZlZCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9kb3dud2FyZHNfMi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzXzIuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzUsOSArMzUsOSBAQAogc3RhdGljIGZpZWxkIHNlbGY6Ok15RnV0dXJlPGR5bmFtaWM+KiBmOwogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiB0MTsKIHN0YXRpYyBmaWVsZCBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIHQyOwotc3RhdGljIG1ldGhvZCBnMigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qCitzdGF0aWMgbWV0aG9kIGcyKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZzMoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBnMygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc18zLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc18zLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNjg2NWQ4YS4uZjJjMDg0ZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9kb3dud2FyZHNfMy5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzXzMuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzUsOSArMzUsOSBAQAogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGR5bmFtaWM+KiBmOwogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiB0MTsKIHN0YXRpYyBmaWVsZCBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIHQyOwotc3RhdGljIG1ldGhvZCBnMigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qCitzdGF0aWMgbWV0aG9kIGcyKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZzMoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBnMygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc180LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc180LmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNjg2NWQ4YS4uZjJjMDg0ZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9kb3dud2FyZHNfNC5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzXzQuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMzUsOSArMzUsOSBAQAogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGR5bmFtaWM+KiBmOwogc3RhdGljIGZpZWxkIGFzeTo6RnV0dXJlPGNvcmU6OmludCo+KiB0MTsKIHN0YXRpYyBmaWVsZCBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIHQyOwotc3RhdGljIG1ldGhvZCBnMigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qCitzdGF0aWMgbWV0aG9kIGcyKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Okxpc3Q8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZzMoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TGlzdDxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBnMygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpMaXN0PGNvcmU6OmludCo+Kj4qIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc19nZW5lcmljX21ldGhvZF93aXRoX2Z1dHVyZV9yZXR1cm4uZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzX2dlbmVyaWNfbWV0aG9kX3dpdGhfZnV0dXJlX3JldHVybi5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGZjYmUyZDkuLmI0ZGRiMGYgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzX2dlbmVyaWNfbWV0aG9kX3dpdGhfZnV0dXJlX3JldHVybi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzX2dlbmVyaWNfbWV0aG9kX3dpdGhfZnV0dXJlX3JldHVybi5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xOCw3ICsxOCw3IEBACiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7CiB9Ci1zdGF0aWMgbWV0aG9kIGZvbygpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGZvbygpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc19nZW5lcmljX21ldGhvZF93aXRoX2dlbmVyaWNfcmV0dXJuLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX2Rvd253YXJkc19nZW5lcmljX21ldGhvZF93aXRoX2dlbmVyaWNfcmV0dXJuLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggZmZkMjk4NC4uZWRlM2JlMCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl9kb3dud2FyZHNfZ2VuZXJpY19tZXRob2Rfd2l0aF9nZW5lcmljX3JldHVybi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fZG93bndhcmRzX2dlbmVyaWNfbWV0aG9kX3dpdGhfZ2VuZXJpY19yZXR1cm4uZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNiw3ICs2LDcgQEAKIAogc3RhdGljIG1ldGhvZCBpZDxUIGV4dGVuZHMgY29yZTo6T2JqZWN0KiA9IGR5bmFtaWM+KHNlbGY6OmlkOjpUKiB4KSDihpIgc2VsZjo6aWQ6OlQqCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl91cHdhcmRzX2dlbmVyaWNfbWV0aG9kcy5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2Z1dHVyZV91bmlvbl91cHdhcmRzX2dlbmVyaWNfbWV0aG9kcy5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDM2OTIxMDkuLjg0YzM5MjUgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS9mdXR1cmVfdW5pb25fdXB3YXJkc19nZW5lcmljX21ldGhvZHMuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvZnV0dXJlX3VuaW9uX3Vwd2FyZHNfZ2VuZXJpY19tZXRob2RzLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTI2LDUgKzI2LDUgQEAKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpDKgogICAgIDsKIH0KLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL2luZmVyX3R5cGVzX29uX2xvb3BfaW5kaWNlc19mb3JfZWFjaF9sb29wX2FzeW5jLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvaW5mZXJfdHlwZXNfb25fbG9vcF9pbmRpY2VzX2Zvcl9lYWNoX2xvb3BfYXN5bmMuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA4NmVkOWZkLi4zNTU3MzcyIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvaW5mZXJfdHlwZXNfb25fbG9vcF9pbmRpY2VzX2Zvcl9lYWNoX2xvb3BfYXN5bmMuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2UvaW5mZXJfdHlwZXNfb25fbG9vcF9pbmRpY2VzX2Zvcl9lYWNoX2xvb3BfYXN5bmMuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjMsNyArMjMsNyBAQAogY2xhc3MgQmFyPFQgZXh0ZW5kcyBhc3k6OlN0cmVhbTxjb3JlOjpTdHJpbmcqPiogPSBhc3k6OlN0cmVhbTxjb3JlOjpTdHJpbmcqPio+IGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCYXI8c2VsZjo6QmFyOjpUKj4qCiAgICAgOwotICBtZXRob2QgZm9vKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6QmFyOjpUKiB0KSDihpIgZHluYW1pYworICBtZXRob2QgZm9vKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6QmFyOjpUKiB0KSDihpIgZHluYW1pYyBhc3luYyAKICAgICA7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwpAQCAtMzksNyArMzksNyBAQAogY2xhc3MgQmF6PFQgZXh0ZW5kcyBjb3JlOjpPYmplY3QqID0gZHluYW1pYywgRSBleHRlbmRzIGFzeTo6U3RyZWFtPHNlbGY6OkJhejo6VCo+KiA9IGFzeTo6U3RyZWFtPGR5bmFtaWM+KiwgUyBleHRlbmRzIHNlbGY6OkJhejo6RSogPSBhc3k6OlN0cmVhbTxkeW5hbWljPio+IGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCYXo8c2VsZjo6QmF6OjpUKiwgc2VsZjo6QmF6OjpFKiwgc2VsZjo6QmF6OjpTKj4qCiAgICAgOwotICBtZXRob2QgZm9vKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6QmF6OjpTKiB0KSDihpIgZHluYW1pYworICBtZXRob2QgZm9vKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6QmF6OjpTKiB0KSDihpIgZHluYW1pYyBhc3luYyAKICAgICA7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKICAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7CiB9Ci1zdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZS90b3BfbGV2ZWxfcmV0dXJuX2FuZF95aWVsZC5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL3RvcF9sZXZlbF9yZXR1cm5fYW5kX3lpZWxkLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggODUxMGE0Mi4uMzdlMDhhZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL3RvcF9sZXZlbF9yZXR1cm5fYW5kX3lpZWxkLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlL3RvcF9sZXZlbF9yZXR1cm5fYW5kX3lpZWxkLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTgsMTUgKzgsMTUgQEAKIHR5cGVkZWYgSW50VG9JbnQgPSAoY29yZTo6aW50Kikg4oaSKiBjb3JlOjppbnQqOwogc3RhdGljIG1ldGhvZCBhKCkg4oaSIChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCoKICAgOwotc3RhdGljIG1ldGhvZCBiKCkg4oaSIGFzeTo6RnV0dXJlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBiKCkg4oaSIGFzeTo6RnV0dXJlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBjKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBjKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+KiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBkKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBkKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+KiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBlKCkg4oaSIGFzeTo6U3RyZWFtPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+Kgorc3RhdGljIG1ldGhvZCBlKCkg4oaSIGFzeTo6U3RyZWFtPChjb3JlOjppbnQqKSDihpIqIGNvcmU6OmludCo+KiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgZigpIOKGkiBhc3k6OlN0cmVhbTwoY29yZTo6aW50Kikg4oaSKiBjb3JlOjppbnQqPioKK3N0YXRpYyBtZXRob2QgZigpIOKGkiBhc3k6OlN0cmVhbTwoY29yZTo6aW50Kikg4oaSKiBjb3JlOjppbnQqPiogYXN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2VfbmV3L2Zvcl9lYWNoX2ludmFsaWRfaXRlcmFibGUuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZV9uZXcvZm9yX2VhY2hfaW52YWxpZF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDhlODU2OTcuLmY2OWY1MDAgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZV9uZXcvZm9yX2VhY2hfaW52YWxpZF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZV9uZXcvZm9yX2VhY2hfaW52YWxpZF9pdGVyYWJsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xLDcgKzEsNyBAQAogbGlicmFyeSB0ZXN0OwogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIAotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2VfbmV3L2Zvcl9lYWNoX291dGVyX3Zhcl90eXBlLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9pbmZlcmVuY2VfbmV3L2Zvcl9lYWNoX291dGVyX3Zhcl90eXBlLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggMjdiNjI5ZS4uYzViMzJkMCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvaW5mZXJlbmNlX25ldy9mb3JfZWFjaF9vdXRlcl92YXJfdHlwZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2luZmVyZW5jZV9uZXcvZm9yX2VhY2hfb3V0ZXJfdmFyX3R5cGUuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMjQsNyArMjQsNyBAQAogfQogc3RhdGljIG1ldGhvZCBmPFQgZXh0ZW5kcyBjb3JlOjpPYmplY3QqID0gZHluYW1pYz4oKSDihpIgc2VsZjo6Zjo6VCoKICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Yy5kYXJ0Lm91dGxpbmUuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjLmRhcnQub3V0bGluZS5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvaXNzdWU0MTQzNmMvaXNzdWU0MTQzNmNfbGliLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvaXNzdWU0MTQzNmMvaXNzdWU0MTQzNmMuZGFydC5zdHJvbmcuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvaXNzdWU0MTQzNmMvaXNzdWU0MTQzNmMuZGFydC5zdHJvbmcuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Y19saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Y19saWIuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvaXNzdWU0MTQzNmMvaXNzdWU0MTQzNmMuZGFydC53ZWFrLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Y19saWIuZGFydC53ZWFrLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Yy5kYXJ0LndlYWsuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9pc3N1ZTQxNDM2Yy9pc3N1ZTQxNDM2Yy5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjX2xpYi5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2lzc3VlNDE0MzZjL2lzc3VlNDE0MzZjLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvbGF0ZXIuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL2xhdGVfbG93ZXJpbmcvbGF0ZXIuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA3YzA3Zjc4Li5hNmNiNmY2IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9sYXRlX2xvd2VyaW5nL2xhdGVyLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbGF0ZV9sb3dlcmluZy9sYXRlci5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC00Nyw5ICs0Nyw5IEBACiAgIDsKIHN0YXRpYyBtZXRob2QgYmF6KCkg4oaSIGR5bmFtaWMKICAgOwotc3RhdGljIG1ldGhvZCBoZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgaGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGZpc2soKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBmaXNrKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9mcm9tX2Fnbm9zdGljL2Zyb21fYWdub3N0aWMuZGFydC5vdXRsaW5lLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9mcm9tX2Fnbm9zdGljL2Zyb21fYWdub3N0aWNfbGliLmRhcnQub3V0bGluZS5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljLmRhcnQub3V0bGluZS5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2Zyb21fYWdub3N0aWMvZnJvbV9hZ25vc3RpYy5kYXJ0LnN0cm9uZy5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljX2xpYi5kYXJ0LnN0cm9uZy5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljLmRhcnQuc3Ryb25nLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9mcm9tX2Fnbm9zdGljL2Zyb21fYWdub3N0aWNfbGliLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9mcm9tX2Fnbm9zdGljL2Zyb21fYWdub3N0aWNfbGliLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9mcm9tX2Fnbm9zdGljL2Zyb21fYWdub3N0aWMuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2Zyb21fYWdub3N0aWMvZnJvbV9hZ25vc3RpY19saWIuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljLmRhcnQud2Vhay5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljX2xpYi5kYXJ0LndlYWsuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2Zyb21fYWdub3N0aWMvZnJvbV9hZ25vc3RpYy5kYXJ0LndlYWsuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2Zyb21fYWdub3N0aWMvZnJvbV9hZ25vc3RpY19saWIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvZnJvbV9hZ25vc3RpYy9mcm9tX2Fnbm9zdGljX2xpYi5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2Zyb21fYWdub3N0aWMvZnJvbV9hZ25vc3RpYy5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDExMTQuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTExNC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGUyY2JhNmIuLjA3NGZlNWQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTExNC5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTExNC5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xLDUgKzEsNSBAQAogbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKIGltcG9ydCBzZWxmIGFzIHNlbGY7CiAKLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxMTU2LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDExNTYuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCAyOWJkOTlmLi4yZDA1YmU5IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDExNTYuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDExNTYuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNSw1ICs1LDUgQEAKICAgOwogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQKICAgOwotc3RhdGljIG1ldGhvZCBlcnJvcnMoKSDihpIgdm9pZAorc3RhdGljIG1ldGhvZCBlcnJvcnMoKSDihpIgdm9pZCBhc3luYyAKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0CmluZGV4IDc3OGNkNjkuLjcwOTJiMjYgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQKQEAgLTExLDE5ICsxMSwxOSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgorRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBvawogRnV0dXJlPGJvb2w+IHRlc3QyKCkgPT4gZ2V0TnVsbCgpOyAvLyBvawogYm9vbCB0ZXN0MygpID0+IGdldE51bGwoKTsgLy8gb2sKLUZ1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKK0Z1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gb2sKIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKIEZ1dHVyZTxib29sPiB0ZXN0NigpID0+IGdldEZ1dHVyZUJvb2woKTsgLy8gb2sKIEZ1dHVyZTxib29sPiB0ZXN0NygpIGFzeW5jID0+IGdldEZ1dHVyZUJvb2woKTsgLy8gb2sKIAogdGVzdCgpIGFzeW5jIHsKLSAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgorICBGdXR1cmU8Ym9vbD4gdGVzdDEoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCk7IC8vIG9rCiAgIEZ1dHVyZTxib29sPiB0ZXN0MigpID0+IGdldE51bGwoKTsgLy8gb2sKICAgYm9vbCB0ZXN0MygpID0+IGdldE51bGwoKTsgLy8gb2sKLSAgRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgorICBGdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7IC8vIG9rCiAgIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKICAgRnV0dXJlPGJvb2w+IHRlc3Q2KCkgPT4gZ2V0RnV0dXJlQm9vbCgpOyAvLyBvawogICBGdXR1cmU8Ym9vbD4gdGVzdDcoKSBhc3luYyA9PiBnZXRGdXR1cmVCb29sKCk7IC8vIG9rCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggN2UyOGZmYy4uMGYwNWNjYiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNSwyNSArNSwyNSBAQAogCiBzdGF0aWMgbWV0aG9kIGdldE51bGwoKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIGdldEZ1dHVyZU51bGwoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4KK3N0YXRpYyBtZXRob2QgZ2V0RnV0dXJlTnVsbCgpIOKGkiBhc3k6OkZ1dHVyZTxkeW5hbWljPiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBnZXRGdXR1cmVCb29sKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+CitzdGF0aWMgbWV0aG9kIGdldEZ1dHVyZUJvb2woKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdDEoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KK3N0YXRpYyBtZXRob2QgdGVzdDEoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDIoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KICAgOwogc3RhdGljIG1ldGhvZCB0ZXN0MygpIOKGkiBjb3JlOjpib29sCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdDQoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KK3N0YXRpYyBtZXRob2QgdGVzdDQoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDUoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KICAgOwogc3RhdGljIG1ldGhvZCB0ZXN0NigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgogICA7Ci1zdGF0aWMgbWV0aG9kIHRlc3Q3KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+CitzdGF0aWMgbWV0aG9kIHRlc3Q3KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC5zdHJvbmcuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnN0cm9uZy5leHBlY3QKaW5kZXggMjg2NGNiNS4uN2IzNTAwMiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnN0cm9uZy5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnN0cm9uZy5leHBlY3QKQEAgLTIsMzEgKzIsMTEgQEAKIC8vCiAvLyBQcm9ibGVtcyBpbiBsaWJyYXJ5OgogLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNDozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNzozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAvLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIC8vIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjM6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0vLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLS8vICAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI2OjMzOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0vLyAgIEZ1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNzoyNzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAvLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIC8vICAgRnV0dXJlPGJvb2w+IHRlc3Q1KCkgPT4gZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgpAQCAtNjAsMjEgKzQwLDE1IEBACiAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIG1ldGhvZCB0ZXN0MSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiBhc3luYyAKLSAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNDozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gYXdhaXQgc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgIHJldHVybiBhd2FpdCBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+Owogc3RhdGljIG1ldGhvZCB0ZXN0MigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgogICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKIHN0YXRpYyBtZXRob2QgdGVzdDMoKSDihpIgY29yZTo6Ym9vbAogICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjpib29sOwogc3RhdGljIG1ldGhvZCB0ZXN0NCgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiBhc3luYyAKLSAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDIgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNzozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gYXdhaXQgc2VsZjo6Z2V0RnV0dXJlTnVsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgIHJldHVybiBhd2FpdCBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+Owogc3RhdGljIG1ldGhvZCB0ZXN0NSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgotICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE4OjI1OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluIHNlbGY6OmdldEZ1dHVyZU51bGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpAQCAtODQsMjEgKzU4LDE1IEBACiAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7CiBzdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYyBhc3luYyB7CiAgIGZ1bmN0aW9uIHRlc3QxKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAotICAgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q0ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjM6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLSAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBhd2FpdCBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICByZXR1cm4gYXdhaXQgc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDIoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KICAgICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDMoKSDihpIgY29yZTo6Ym9vbAogICAgIHJldHVybiBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmJvb2w7CiAgIGZ1bmN0aW9uIHRlc3Q0KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAotICAgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q1ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjY6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLSAgRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBhd2FpdCBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICByZXR1cm4gYXdhaXQgc2VsZjo6Z2V0RnV0dXJlTnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDUoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KLSAgICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI3OjI3OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI3OjI3OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluIHNlbGY6OmdldEZ1dHVyZU51bGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpAQCAtMTA2LDE3ICs3NCwxNyBAQAogICAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7CiAgIGZ1bmN0aW9uIHRlc3Q3KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAogICAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjEgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q3ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzE6NTI6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXIxID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjMxOjUyOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyMSA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IGFzeW5jID0+IGF3YWl0IHNlbGY6OmdldE51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CiAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjIgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwogICBjb3JlOjpib29sIHZhcjMgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmJvb2w7Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjQgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q4ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzQ6NTg6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI0ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NCA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM0OjU4OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyNCA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IGFzeW5jID0+IGF3YWl0IHNlbGY6OmdldEZ1dHVyZU51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjUgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q5ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzU6NDY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI1ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM1OjQ2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyNSA9ICgoKSA9PiBnZXRGdXR1cmVOdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+ID0+IHNlbGY6OmdldEZ1dHVyZU51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CmluZGV4IDU4ZTI3MzcuLjRlZmFhZGYgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CkBAIC0yLDMxICsyLDExIEBACiAvLwogLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MTQ6MzE6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0vLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLS8vIEZ1dHVyZTxib29sPiB0ZXN0MSgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKTsgLy8gZXJyb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MTc6MzE6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0vLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLS8vIEZ1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vCiAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MTg6MjU6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiAvLyBGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCiAvLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjIzOjMzOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0vLyAgIEZ1dHVyZTxib29sPiB0ZXN0MSgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKTsgLy8gZXJyb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNjozMzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gICBGdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vCiAvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6Mjc6Mjc6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiAvLyAgIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKQEAgLTEyMCwxMiArMTAwLDggQEAKICAgICB0cnkgewogICAgICAgI0wzOgogICAgICAgewotICAgICAgICBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNDozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiI7Ci0gICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QyID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0TnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7Ci0gICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QxID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0TnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgICAgICAgYnJlYWsgI0wzOwogICAgICAgfQogICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOwpAQCAtMTU3LDEyICsxMzMsOCBAQAogICAgIHRyeSB7CiAgICAgICAjTDQ6CiAgICAgICB7Ci0gICAgICAgIGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE3OjMxOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi1GdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIjsKLSAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDQgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXRGdXR1cmVOdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKLSAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDIgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXRGdXR1cmVOdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OwogICAgICAgICBicmVhayAjTDQ7CiAgICAgICB9CiAgICAgICBhc3k6Ol9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oOmFzeW5jX2NvbXBsZXRlciwgOnJldHVybl92YWx1ZSk7CkBAIC0xNzgsNyArMTUwLDcgQEAKICAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OwogfQogc3RhdGljIG1ldGhvZCB0ZXN0NSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgotICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE4OjI1OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDMgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluIHNlbGY6OmdldEZ1dHVyZU51bGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpAQCAtMjM2LDEyICsyMDgsOCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgI0w3OgogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWw8Qm90dG9tVHlwZT4gI3Q2ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjM6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLSAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIjsKLSAgICAgICAgICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0NyA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldE51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOwotICAgICAgICAgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDQgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXROdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdCBhc3tUeXBlRXJyb3IsRm9yRHluYW1pYyxGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CiAgICAgICAgICAgICAgICAgYnJlYWsgI0w3OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKQEAgLTI3MywxMiArMjQxLDggQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICNMODoKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsPEJvdHRvbVR5cGU+ICN0OCA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI2OjMzOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0gIEZ1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiI7Ci0gICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDkgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXRGdXR1cmVOdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKLSAgICAgICAgICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdCBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OworICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q1ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgICAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OwogICAgICAgICAgICAgICAgIGJyZWFrICNMODsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhc3k6Ol9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oOmFzeW5jX2NvbXBsZXRlciwgOnJldHVybl92YWx1ZSk7CkBAIC0yOTQsNyArMjU4LDcgQEAKICAgICAgICAgICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07CiAgICAgICAgIH0KICAgICAgICAgZnVuY3Rpb24gdGVzdDUoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KLSAgICAgICAgICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MTAgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNzoyNzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCisgICAgICAgICAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDYgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNzoyNzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KICAgRnV0dXJlPGJvb2w+IHRlc3Q1KCkgPT4gZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKQEAgLTMyNyw3ICsyOTEsNyBAQAogICAgICAgICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOwogICAgICAgICAgIHJldHVybiA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKICAgICAgICAgfQotICAgICAgICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXIxID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MTEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDozMTo1MjogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCisgICAgICAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjEgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q3ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzE6NTI6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiAgIEZ1dHVyZTxib29sPiB2YXIxID0gKCgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKSkoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluICgoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CkBAIC0zNDMsNyArMzA3LDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICNMMTA6CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MTIgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXROdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0OCA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldE51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOwogICAgICAgICAgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0OwogICAgICAgICAgICAgICAgIGJyZWFrICNMMTA7CiAgICAgICAgICAgICAgIH0KQEAgLTM2MSw3ICszMjUsNyBAQAogICAgICAgICB9KS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKICAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyMiA9ICgoKSDihpIgZHluYW1pYyA9PiBzZWxmOjpnZXROdWxsKCkpLmNhbGwoKSBhc3tUeXBlRXJyb3IsRm9yRHluYW1pYyxGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CiAgICAgICAgIGNvcmU6OmJvb2wgdmFyMyA9ICgoKSDihpIgZHluYW1pYyA9PiBzZWxmOjpnZXROdWxsKCkpLmNhbGwoKSBhc3tUeXBlRXJyb3IsRm9yRHluYW1pYyxGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6Ym9vbDsKLSAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyNCA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEzID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzQ6NTg6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICAgICAgICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI0ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0OSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM0OjU4OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyNCA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IC8qIG9yaWdpbmFsbHkgYXN5bmMgKi8gewpAQCAtMzc3LDcgKzM0MSw3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAjTDExOgogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDE0ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDEwID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CiAgICAgICAgICAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQ7CiAgICAgICAgICAgICAgICAgYnJlYWsgI0wxMTsKICAgICAgICAgICAgICAgfQpAQCAtMzkzLDcgKzM1Nyw3IEBACiAgICAgICAgICAgOmFzeW5jX2NvbXBsZXRlci57YXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjo6c3RhcnR9KDphc3luY19vcCk7CiAgICAgICAgICAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OwogICAgICAgICB9KS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKLSAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyNSA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDE1ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzU6NDY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICAgICAgICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI1ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MTEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDozNTo0NjogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KICAgRnV0dXJlPGJvb2w+IHZhcjUgPSAoKCkgPT4gZ2V0RnV0dXJlTnVsbCgpKSgpOyAvLyBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gKCgpIOKGkiBhc3k6OkZ1dHVyZTxkeW5hbWljPiA9PiBzZWxmOjpnZXRGdXR1cmVOdWxsKCkpLmNhbGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQ2MzhmCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSwxMiBAQAorZHluYW1pYyBnZXROdWxsKCkgPT4gbnVsbDsKK0Z1dHVyZTxkeW5hbWljPiBnZXRGdXR1cmVOdWxsKCkgYXN5bmMge30KK0Z1dHVyZTxib29sPiBnZXRGdXR1cmVCb29sKCkgYXN5bmMge30KK0Z1dHVyZTxib29sPiB0ZXN0MSgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKTsKK0Z1dHVyZTxib29sPiB0ZXN0MigpID0+IGdldE51bGwoKTsKK2Jvb2wgdGVzdDMoKSA9PiBnZXROdWxsKCk7CitGdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7CitGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7CitGdXR1cmU8Ym9vbD4gdGVzdDYoKSA9PiBnZXRGdXR1cmVCb29sKCk7CitGdXR1cmU8Ym9vbD4gdGVzdDcoKSBhc3luYyA9PiBnZXRGdXR1cmVCb29sKCk7Cit0ZXN0KCkgYXN5bmMge30KK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEwNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QKQEAgLTAsMCArMSwxMiBAQAorRnV0dXJlPGJvb2w+IGdldEZ1dHVyZUJvb2woKSBhc3luYyB7fQorRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOworRnV0dXJlPGJvb2w+IHRlc3QyKCkgPT4gZ2V0TnVsbCgpOworRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOworRnV0dXJlPGJvb2w+IHRlc3Q1KCkgPT4gZ2V0RnV0dXJlTnVsbCgpOworRnV0dXJlPGJvb2w+IHRlc3Q2KCkgPT4gZ2V0RnV0dXJlQm9vbCgpOworRnV0dXJlPGJvb2w+IHRlc3Q3KCkgYXN5bmMgPT4gZ2V0RnV0dXJlQm9vbCgpOworRnV0dXJlPGR5bmFtaWM+IGdldEZ1dHVyZU51bGwoKSBhc3luYyB7fQorYm9vbCB0ZXN0MygpID0+IGdldE51bGwoKTsKK2R5bmFtaWMgZ2V0TnVsbCgpID0+IG51bGw7CittYWluKCkge30KK3Rlc3QoKSBhc3luYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LndlYWsuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LndlYWsuZXhwZWN0CmluZGV4IDI4NjRjYjUuLjdiMzUwMDIgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC53ZWFrLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQud2Vhay5leHBlY3QKQEAgLTIsMzEgKzIsMTEgQEAKIC8vCiAvLyBQcm9ibGVtcyBpbiBsaWJyYXJ5OgogLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNDozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNzozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAvLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIC8vIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjM6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0vLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLS8vICAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI2OjMzOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0vLyAgIEZ1dHVyZTxib29sPiB0ZXN0NCgpIGFzeW5jID0+IGF3YWl0IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8KIC8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNzoyNzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAvLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIC8vICAgRnV0dXJlPGJvb2w+IHRlc3Q1KCkgPT4gZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgpAQCAtNjAsMjEgKzQwLDE1IEBACiAgIHJldHVybiB0cnVlOwogfQogc3RhdGljIG1ldGhvZCB0ZXN0MSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiBhc3luYyAKLSAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNDozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gYXdhaXQgc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgIHJldHVybiBhd2FpdCBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+Owogc3RhdGljIG1ldGhvZCB0ZXN0MigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgogICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKIHN0YXRpYyBtZXRob2QgdGVzdDMoKSDihpIgY29yZTo6Ym9vbAogICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjpib29sOwogc3RhdGljIG1ldGhvZCB0ZXN0NCgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiBhc3luYyAKLSAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDIgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNzozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gYXdhaXQgc2VsZjo6Z2V0RnV0dXJlTnVsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgIHJldHVybiBhd2FpdCBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+Owogc3RhdGljIG1ldGhvZCB0ZXN0NSgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPgotICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE4OjI1OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluIHNlbGY6OmdldEZ1dHVyZU51bGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpAQCAtODQsMjEgKzU4LDE1IEBACiAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7CiBzdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYyBhc3luYyB7CiAgIGZ1bmN0aW9uIHRlc3QxKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAotICAgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q0ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjM6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLSAgRnV0dXJlPGJvb2w+IHRlc3QxKCkgYXN5bmMgPT4gYXdhaXQgZ2V0TnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBhd2FpdCBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICByZXR1cm4gYXdhaXQgc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDIoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KICAgICByZXR1cm4gc2VsZjo6Z2V0TnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDMoKSDihpIgY29yZTo6Ym9vbAogICAgIHJldHVybiBzZWxmOjpnZXROdWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmJvb2w7CiAgIGZ1bmN0aW9uIHRlc3Q0KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAotICAgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q1ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjY6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLSAgRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBhd2FpdCBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICByZXR1cm4gYXdhaXQgc2VsZjo6Z2V0RnV0dXJlTnVsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgZnVuY3Rpb24gdGVzdDUoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KLSAgICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI3OjI3OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgICByZXR1cm4gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI3OjI3OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluIHNlbGY6OmdldEZ1dHVyZU51bGwoKSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwpAQCAtMTA2LDE3ICs3NCwxNyBAQAogICAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7CiAgIGZ1bmN0aW9uIHRlc3Q3KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IGFzeW5jIAogICAgIHJldHVybiBzZWxmOjpnZXRGdXR1cmVCb29sKCk7Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjEgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q3ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzE6NTI6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXIxID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjMxOjUyOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyMSA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IGFzeW5jID0+IGF3YWl0IHNlbGY6OmdldE51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CiAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjIgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwogICBjb3JlOjpib29sIHZhcjMgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmJvb2w7Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjQgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q4ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzQ6NTg6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI0ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NCA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM0OjU4OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyNCA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IGFzeW5jID0+IGF3YWl0IHNlbGY6OmdldEZ1dHVyZU51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47Ci0gIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjUgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q5ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzU6NDY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXI1ID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM1OjQ2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyNSA9ICgoKSA9PiBnZXRGdXR1cmVOdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+ID0+IHNlbGY6OmdldEZ1dHVyZU51bGwoKSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKaW5kZXggNThlMjczNy4uNGVmYWFkZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMiwzMSArMiwxMSBAQAogLy8KIC8vIFByb2JsZW1zIGluIGxpYnJhcnk6CiAvLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE0OjMxOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0vLyBGdXR1cmU8Ym9vbD4gdGVzdDEoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCk7IC8vIGVycm9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE3OjMxOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotLy8gIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0vLyBGdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLwogLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjE4OjI1OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KIC8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogLy8gRnV0dXJlPGJvb2w+IHRlc3Q1KCkgPT4gZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgogLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyMzozMzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLS8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotLy8gICBGdXR1cmU8Ym9vbD4gdGVzdDEoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCk7IC8vIGVycm9yCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MjY6MzM6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0vLyAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLS8vICAgRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0vLwogLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjI3OjI3OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KIC8vICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogLy8gICBGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCkBAIC0xMjAsMTIgKzEwMCw4IEBACiAgICAgdHJ5IHsKICAgICAgICNMMzoKICAgICAgIHsKLSAgICAgICAgZmluYWw8Qm90dG9tVHlwZT4gI3QxID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MTQ6MzE6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmVPcjxib29sPicuCi0gLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KLUZ1dHVyZTxib29sPiB0ZXN0MSgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKTsgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iOwotICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MiA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldE51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOwotICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdCBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MSA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldE51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOworICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdCBhc3tUeXBlRXJyb3IsRm9yRHluYW1pYyxGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CiAgICAgICAgIGJyZWFrICNMMzsKICAgICAgIH0KICAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKQEAgLTE1NywxMiArMTMzLDggQEAKICAgICB0cnkgewogICAgICAgI0w0OgogICAgICAgewotICAgICAgICBmaW5hbDxCb3R0b21UeXBlPiAjdDMgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxNzozMTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotRnV0dXJlPGJvb2w+IHRlc3Q0KCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpOyAvLyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiI7Ci0gICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q0ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7Ci0gICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gRnV0dXJlT3I8Y29yZTo6Ym9vbD47CisgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QyID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgICAgICAgYnJlYWsgI0w0OwogICAgICAgfQogICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOwpAQCAtMTc4LDcgKzE1MCw3IEBACiAgIHJldHVybiA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKIH0KIHN0YXRpYyBtZXRob2QgdGVzdDUoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4KLSAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDUgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoxODoyNTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCisgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QzID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MTg6MjU6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiBGdXR1cmU8Ym9vbD4gdGVzdDUoKSA9PiBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiBzZWxmOjpnZXRGdXR1cmVOdWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKQEAgLTIzNiwxMiArMjA4LDggQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICNMNzoKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsPEJvdHRvbVR5cGU+ICN0NiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjIzOjMzOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Ym9vbD4nLgotIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCi0gIEZ1dHVyZTxib29sPiB0ZXN0MSgpIGFzeW5jID0+IGF3YWl0IGdldE51bGwoKTsgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiI7Ci0gICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDcgPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXROdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKLSAgICAgICAgICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdCBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OworICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q0ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0TnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgICAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IEZ1dHVyZU9yPGNvcmU6OmJvb2w+OwogICAgICAgICAgICAgICAgIGJyZWFrICNMNzsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBhc3k6Ol9jb21wbGV0ZU9uQXN5bmNSZXR1cm4oOmFzeW5jX2NvbXBsZXRlciwgOnJldHVybl92YWx1ZSk7CkBAIC0yNzMsMTIgKzI0MSw4IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAjTDg6CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbDxCb3R0b21UeXBlPiAjdDggPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDoyNjozMzogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZU9yPGJvb2w+Jy4KLSAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgotICBGdXR1cmU8Ym9vbD4gdGVzdDQoKSBhc3luYyA9PiBhd2FpdCBnZXRGdXR1cmVOdWxsKCk7IC8vIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iOwotICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q5ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0RnV0dXJlTnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7Ci0gICAgICAgICAgICAgICAgOnJldHVybl92YWx1ZSA9IDpyZXN1bHQgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKKyAgICAgICAgICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0NSA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldEZ1dHVyZU51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOworICAgICAgICAgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0IGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBGdXR1cmVPcjxjb3JlOjpib29sPjsKICAgICAgICAgICAgICAgICBicmVhayAjTDg7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOwpAQCAtMjk0LDcgKzI1OCw3IEBACiAgICAgICAgICAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OwogICAgICAgICB9CiAgICAgICAgIGZ1bmN0aW9uIHRlc3Q1KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+Ci0gICAgICAgICAgcmV0dXJuIGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEwID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6Mjc6Mjc6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICAgICAgICAgIHJldHVybiBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3Q2ID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6Mjc6Mjc6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiAgIEZ1dHVyZTxib29sPiB0ZXN0NSgpID0+IGdldEZ1dHVyZU51bGwoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gc2VsZjo6Z2V0RnV0dXJlTnVsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CkBAIC0zMjcsNyArMjkxLDcgQEAKICAgICAgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKICAgICAgICAgICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07CiAgICAgICAgIH0KLSAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyMSA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDExID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzE6NTI6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgorICAgICAgICBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPiB2YXIxID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0NyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjMxOjUyOiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KICAtICdGdXR1cmUnIGlzIGZyb20gJ2RhcnQ6YXN5bmMnLgogICBGdXR1cmU8Ym9vbD4gdmFyMSA9ICgoKSBhc3luYyA9PiBhd2FpdCBnZXROdWxsKCkpKCk7IC8vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIiBpbiAoKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IC8qIG9yaWdpbmFsbHkgYXN5bmMgKi8gewpAQCAtMzQzLDcgKzMwNyw3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAjTDEwOgogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDEyID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6Z2V0TnVsbCgpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgICAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDggPSBhc3k6Ol9hd2FpdEhlbHBlcihzZWxmOjpnZXROdWxsKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKICAgICAgICAgICAgICAgICA6cmV0dXJuX3ZhbHVlID0gOnJlc3VsdDsKICAgICAgICAgICAgICAgICBicmVhayAjTDEwOwogICAgICAgICAgICAgICB9CkBAIC0zNjEsNyArMzI1LDcgQEAKICAgICAgICAgfSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47CiAgICAgICAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjIgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+OwogICAgICAgICBjb3JlOjpib29sIHZhcjMgPSAoKCkg4oaSIGR5bmFtaWMgPT4gc2VsZjo6Z2V0TnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmJvb2w7Ci0gICAgICAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjQgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QxMyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM0OjU4OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyNCA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDkgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2EuZGFydDozNDo1ODogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnRnV0dXJlPGR5bmFtaWM+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0Z1dHVyZTxib29sPicuCiAgLSAnRnV0dXJlJyBpcyBmcm9tICdkYXJ0OmFzeW5jJy4KICAgRnV0dXJlPGJvb2w+IHZhcjQgPSAoKCkgYXN5bmMgPT4gYXdhaXQgZ2V0RnV0dXJlTnVsbCgpKSgpOyAvLyBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiIgaW4gKCgpIOKGkiBhc3k6OkZ1dHVyZTxkeW5hbWljPiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKQEAgLTM3Nyw3ICszNDEsNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgI0wxMToKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QxNCA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldEZ1dHVyZU51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOworICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QxMCA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmdldEZ1dHVyZU51bGwoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOwogICAgICAgICAgICAgICAgIDpyZXR1cm5fdmFsdWUgPSA6cmVzdWx0OwogICAgICAgICAgICAgICAgIGJyZWFrICNMMTE7CiAgICAgICAgICAgICAgIH0KQEAgLTM5Myw3ICszNTcsNyBAQAogICAgICAgICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOwogICAgICAgICAgIHJldHVybiA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKICAgICAgICAgfSkuY2FsbCgpIGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD47Ci0gICAgICAgIGFzeTo6RnV0dXJlPGNvcmU6OmJvb2w+IHZhcjUgPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QxNSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3YS5kYXJ0OjM1OjQ2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8ZHluYW1pYz4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlPGJvb2w+Jy4KKyAgICAgICAgYXN5OjpGdXR1cmU8Y29yZTo6Ym9vbD4gdmFyNSA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDExID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdhLmRhcnQ6MzU6NDY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZTxkeW5hbWljPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdGdXR1cmU8Ym9vbD4nLgogIC0gJ0Z1dHVyZScgaXMgZnJvbSAnZGFydDphc3luYycuCiAgIEZ1dHVyZTxib29sPiB2YXI1ID0gKCgpID0+IGdldEZ1dHVyZU51bGwoKSkoKTsgLy8gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4iIGluICgoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4gPT4gc2VsZjo6Z2V0RnV0dXJlTnVsbCgpKS5jYWxsKCkgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBhc3k6OkZ1dHVyZTxjb3JlOjpib29sPjsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2IuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2IuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCBhYjMwZTkxLi41YzBiYTU5IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdiLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3Yi5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC00LDI1ICs0LDI1IEBACiAKIHN0YXRpYyBtZXRob2QgZ2V0TnVsbCgpIOKGkiBkeW5hbWljCiAgIDsKLXN0YXRpYyBtZXRob2QgZ2V0SXRlcmFibGVOdWxsKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGR5bmFtaWM+CitzdGF0aWMgbWV0aG9kIGdldEl0ZXJhYmxlTnVsbCgpIOKGkiBjb3JlOjpJdGVyYWJsZTxkeW5hbWljPiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCBnZXRJdGVyYWJsZUJvb2woKSDihpIgY29yZTo6SXRlcmFibGU8Y29yZTo6Ym9vbD4KK3N0YXRpYyBtZXRob2QgZ2V0SXRlcmFibGVCb29sKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+IHN5bmMqIAogICA7Ci1zdGF0aWMgbWV0aG9kIHRlc3QxKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+CitzdGF0aWMgbWV0aG9kIHRlc3QxKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+IHN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIHRlc3QyKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+CiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDMoKSDihpIgY29yZTo6Ym9vbAogICA7Ci1zdGF0aWMgbWV0aG9kIHRlc3Q0KCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+CitzdGF0aWMgbWV0aG9kIHRlc3Q0KCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+IHN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIHRlc3Q1KCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmJvb2w+CiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDYoKSDihpIgY29yZTo6SXRlcmFibGU8Y29yZTo6Ym9vbD4KICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0NygpIOKGkiBjb3JlOjpJdGVyYWJsZTxjb3JlOjpib29sPgorc3RhdGljIG1ldGhvZCB0ZXN0NygpIOKGkiBjb3JlOjpJdGVyYWJsZTxjb3JlOjpib29sPiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdjLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE0MzdjLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggZjg3N2U0ZC4uZDVlOWQwNiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNDM3Yy5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MTQzN2MuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNSwyNSArNSwyNSBAQAogCiBzdGF0aWMgbWV0aG9kIGdldE51bGwoKSDihpIgZHluYW1pYwogICA7Ci1zdGF0aWMgbWV0aG9kIGdldFN0cmVhbU51bGwoKSDihpIgYXN5OjpTdHJlYW08ZHluYW1pYz4KK3N0YXRpYyBtZXRob2QgZ2V0U3RyZWFtTnVsbCgpIOKGkiBhc3k6OlN0cmVhbTxkeW5hbWljPiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgZ2V0U3RyZWFtQm9vbCgpIOKGkiBhc3k6OlN0cmVhbTxjb3JlOjpib29sPgorc3RhdGljIG1ldGhvZCBnZXRTdHJlYW1Cb29sKCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OmJvb2w+IGFzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0MSgpIOKGkiBhc3k6OlN0cmVhbTxjb3JlOjpib29sPgorc3RhdGljIG1ldGhvZCB0ZXN0MSgpIOKGkiBhc3k6OlN0cmVhbTxjb3JlOjpib29sPiBhc3luYyogCiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDIoKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6Ym9vbD4KICAgOwogc3RhdGljIG1ldGhvZCB0ZXN0MygpIOKGkiBjb3JlOjpib29sCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdDQoKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6Ym9vbD4KK3N0YXRpYyBtZXRob2QgdGVzdDQoKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6Ym9vbD4gYXN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIHRlc3Q1KCkg4oaSIGFzeTo6U3RyZWFtPGNvcmU6OmJvb2w+CiAgIDsKIHN0YXRpYyBtZXRob2QgdGVzdDYoKSDihpIgYXN5OjpTdHJlYW08Y29yZTo6Ym9vbD4KICAgOwotc3RhdGljIG1ldGhvZCB0ZXN0NygpIOKGkiBhc3k6OlN0cmVhbTxjb3JlOjpib29sPgorc3RhdGljIG1ldGhvZCB0ZXN0NygpIOKGkiBhc3k6OlN0cmVhbTxjb3JlOjpib29sPiBhc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQxNjAyLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE2MDIuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA2OTMzMjk3Li45OWZhOGMzIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE2MDIuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDE2MDIuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMiwxMyArMiwxMyBAQAogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIGltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwogCi1zdGF0aWMgbWV0aG9kIHJldHVybkZ1dHVyZU9mVm9pZCgpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPgorc3RhdGljIG1ldGhvZCByZXR1cm5GdXR1cmVPZlZvaWQoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgcmV0dXJuVm9pZCgpIOKGkiB2b2lkCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuVm9pZEFzeW5jKCkg4oaSIHZvaWQKK3N0YXRpYyBtZXRob2QgcmV0dXJuVm9pZEFzeW5jKCkg4oaSIHZvaWQgYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgdGVzdCgpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIHRlc3QoKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTBiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydApAQCAtMCwwICsxLDEyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKwordGVzdDxYPihYPyB4KSB7CisgIGlmICh4IGlzIFN0cmluZz8pIHsKKyAgICBPYmplY3QgbyA9IHg7CisgICAgbyA9IHg7CisgIH0KK30KKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0Lm91dGxpbmUuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2U0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMCwwICsxLDggQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK3N0YXRpYyBtZXRob2QgdGVzdDxYIGV4dGVuZHMgY29yZTo6T2JqZWN0PyA9IGR5bmFtaWM+KHNlbGY6OnRlc3Q6Olg/IHgpIOKGkiBkeW5hbWljCisgIDsKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCisgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC5zdHJvbmcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjdiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC5zdHJvbmcuZXhwZWN0CkBAIC0wLDAgKzEsMzAgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CisvLworLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKKy8vCisvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo3OjE2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorLy8gIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKy8vICAgICBPYmplY3QgbyA9IHg7CisvLyAgICAgICAgICAgICAgICBeCisvLworLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6ODo5OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorLy8gIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKy8vICAgICBvID0geDsKKy8vICAgICAgICAgXgorLy8KK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworc3RhdGljIG1ldGhvZCB0ZXN0PFggZXh0ZW5kcyBjb3JlOjpPYmplY3Q/ID0gZHluYW1pYz4oc2VsZjo6dGVzdDo6WD8geCkg4oaSIGR5bmFtaWMgeworICBpZih4IGlze0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjpTdHJpbmc/KSB7CisgICAgY29yZTo6T2JqZWN0IG8gPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QxID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo3OjE2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKyAgICBPYmplY3QgbyA9IHg7CisgICAgICAgICAgICAgICBeIiBpbiB4e3NlbGY6OnRlc3Q6Olg/ICYgY29yZTo6U3RyaW5nPyAvKiAnPycgJiAnPycgPSAnPycgKi99IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6T2JqZWN0OworICAgIG8gPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QyID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo4Ojk6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ1g/JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ09iamVjdCcuCisgLSAnT2JqZWN0JyBpcyBmcm9tICdkYXJ0OmNvcmUnLgorICAgIG8gPSB4OworICAgICAgICBeIiBpbiB4e3NlbGY6OnRlc3Q6Olg/ICYgY29yZTo6U3RyaW5nPyAvKiAnPycgJiAnPycgPSAnPycgKi99IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6T2JqZWN0OworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExOGE1YwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTAsMCArMSwzMCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKKy8vCisvLyBQcm9ibGVtcyBpbiBsaWJyYXJ5OgorLy8KKy8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0Ojc6MTY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ1g/JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ09iamVjdCcuCisvLyAgLSAnT2JqZWN0JyBpcyBmcm9tICdkYXJ0OmNvcmUnLgorLy8gICAgIE9iamVjdCBvID0geDsKKy8vICAgICAgICAgICAgICAgIF4KKy8vCisvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo4Ojk6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ1g/JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ09iamVjdCcuCisvLyAgLSAnT2JqZWN0JyBpcyBmcm9tICdkYXJ0OmNvcmUnLgorLy8gICAgIG8gPSB4OworLy8gICAgICAgICBeCisvLworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitzdGF0aWMgbWV0aG9kIHRlc3Q8WCBleHRlbmRzIGNvcmU6Ok9iamVjdD8gPSBkeW5hbWljPihzZWxmOjp0ZXN0OjpYPyB4KSDihpIgZHluYW1pYyB7CisgIGlmKHggaXN7Rm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OlN0cmluZz8pIHsKKyAgICBjb3JlOjpPYmplY3QgbyA9IGxldCBmaW5hbDxCb3R0b21UeXBlPiAjdDEgPSBpbnZhbGlkLWV4cHJlc3Npb24gInBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0Ojc6MTY6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ1g/JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ09iamVjdCcuCisgLSAnT2JqZWN0JyBpcyBmcm9tICdkYXJ0OmNvcmUnLgorICAgIE9iamVjdCBvID0geDsKKyAgICAgICAgICAgICAgIF4iIGluIGxldCBzZWxmOjp0ZXN0OjpYPyAmIGNvcmU6OlN0cmluZz8gLyogJz8nICYgJz8nID0gJz8nICovICN0MiA9IHh7c2VsZjo6dGVzdDo6WD8gJiBjb3JlOjpTdHJpbmc/IC8qICc/JyAmICc/JyA9ICc/JyAqL30gaW4gI3QyLj09KG51bGwpID97Y29yZTo6T2JqZWN0fSAjdDIgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjpPYmplY3QgOiAjdDJ7Y29yZTo6T2JqZWN0fTsKKyAgICBvID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MyA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6ODo5OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKyAgICBvID0geDsKKyAgICAgICAgXiIgaW4gbGV0IHNlbGY6OnRlc3Q6Olg/ICYgY29yZTo6U3RyaW5nPyAvKiAnPycgJiAnPycgPSAnPycgKi8gI3Q0ID0geHtzZWxmOjp0ZXN0OjpYPyAmIGNvcmU6OlN0cmluZz8gLyogJz8nICYgJz8nID0gJz8nICovfSBpbiAjdDQuPT0obnVsbCkgP3tjb3JlOjpPYmplY3R9ICN0NCBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6Ok9iamVjdCA6ICN0NHtjb3JlOjpPYmplY3R9OworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMWZiNwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSwyIEBACit0ZXN0PFg+KFg/IHgpIHt9CittYWluKCkge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC50ZXh0dWFsX291dGxpbmVfbW9kZWxsZWQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWYxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC50ZXh0dWFsX291dGxpbmVfbW9kZWxsZWQuZXhwZWN0CkBAIC0wLDAgKzEsMiBAQAorbWFpbigpIHt9Cit0ZXN0PFg+KFg/IHgpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LndlYWsuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjdiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydC53ZWFrLmV4cGVjdApAQCAtMCwwICsxLDMwIEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworLy8KKy8vIFByb2JsZW1zIGluIGxpYnJhcnk6CisvLworLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6NzoxNjogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnWD8nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnT2JqZWN0Jy4KKy8vICAtICdPYmplY3QnIGlzIGZyb20gJ2RhcnQ6Y29yZScuCisvLyAgICAgT2JqZWN0IG8gPSB4OworLy8gICAgICAgICAgICAgICAgXgorLy8KKy8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0Ojg6OTogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnWD8nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnT2JqZWN0Jy4KKy8vICAtICdPYmplY3QnIGlzIGZyb20gJ2RhcnQ6Y29yZScuCisvLyAgICAgbyA9IHg7CisvLyAgICAgICAgIF4KKy8vCitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK3N0YXRpYyBtZXRob2QgdGVzdDxYIGV4dGVuZHMgY29yZTo6T2JqZWN0PyA9IGR5bmFtaWM+KHNlbGY6OnRlc3Q6Olg/IHgpIOKGkiBkeW5hbWljIHsKKyAgaWYoeCBpc3tGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6U3RyaW5nPykgeworICAgIGNvcmU6Ok9iamVjdCBvID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MSA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6NzoxNjogRXJyb3I6IEEgdmFsdWUgb2YgdHlwZSAnWD8nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnT2JqZWN0Jy4KKyAtICdPYmplY3QnIGlzIGZyb20gJ2RhcnQ6Y29yZScuCisgICAgT2JqZWN0IG8gPSB4OworICAgICAgICAgICAgICAgXiIgaW4geHtzZWxmOjp0ZXN0OjpYPyAmIGNvcmU6OlN0cmluZz8gLyogJz8nICYgJz8nID0gJz8nICovfSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6Ok9iamVjdDsKKyAgICBvID0gbGV0IGZpbmFsPEJvdHRvbVR5cGU+ICN0MiA9IGludmFsaWQtZXhwcmVzc2lvbiAicGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6ODo5OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKyAgICBvID0geDsKKyAgICAgICAgXiIgaW4geHtzZWxmOjp0ZXN0OjpYPyAmIGNvcmU6OlN0cmluZz8gLyogJz8nICYgJz8nID0gJz8nICovfSBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6Ok9iamVjdDsKKyAgfQorfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1Yjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjA4OS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CkBAIC0wLDAgKzEsMzAgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CisvLworLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKKy8vCisvLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo3OjE2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorLy8gIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKy8vICAgICBPYmplY3QgbyA9IHg7CisvLyAgICAgICAgICAgICAgICBeCisvLworLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyMDg5LmRhcnQ6ODo5OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorLy8gIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKy8vICAgICBvID0geDsKKy8vICAgICAgICAgXgorLy8KK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworc3RhdGljIG1ldGhvZCB0ZXN0PFggZXh0ZW5kcyBjb3JlOjpPYmplY3Q/ID0gZHluYW1pYz4oc2VsZjo6dGVzdDo6WD8geCkg4oaSIGR5bmFtaWMgeworICBpZih4IGlze0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjpTdHJpbmc/KSB7CisgICAgY29yZTo6T2JqZWN0IG8gPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QxID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo3OjE2OiBFcnJvcjogQSB2YWx1ZSBvZiB0eXBlICdYPycgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdPYmplY3QnLgorIC0gJ09iamVjdCcgaXMgZnJvbSAnZGFydDpjb3JlJy4KKyAgICBPYmplY3QgbyA9IHg7CisgICAgICAgICAgICAgICBeIiBpbiB4e3NlbGY6OnRlc3Q6Olg/ICYgY29yZTo6U3RyaW5nPyAvKiAnPycgJiAnPycgPSAnPycgKi99OworICAgIG8gPSBsZXQgZmluYWw8Qm90dG9tVHlwZT4gI3QyID0gaW52YWxpZC1leHByZXNzaW9uICJwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDIwODkuZGFydDo4Ojk6IEVycm9yOiBBIHZhbHVlIG9mIHR5cGUgJ1g/JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ09iamVjdCcuCisgLSAnT2JqZWN0JyBpcyBmcm9tICdkYXJ0OmNvcmUnLgorICAgIG8gPSB4OworICAgICAgICBeIiBpbiB4e3NlbGY6OnRlc3Q6Olg/ICYgY29yZTo6U3RyaW5nPyAvKiAnPycgJiAnPycgPSAnPycgKi99OworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDI1MDQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhiMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2Fic3RyYWN0IGNsYXNzIEltYWdlU3RyZWFtQ29tcGxldGVyIHsKKyAgdm9pZCBhZGRMaXN0ZW5lcigpOworfQorCitjbGFzcyBfTGl2ZUltYWdlIHsKKyAgZmFjdG9yeSBfTGl2ZUltYWdlKEltYWdlU3RyZWFtQ29tcGxldGVyIGEpID0+IHRocm93IFVuaW1wbGVtZW50ZWRFcnJvcigpOworfQorCithYnN0cmFjdCBjbGFzcyBGb28geworICBkeW5hbWljIGdldCBfcGVuZGluZ0ltYWdlczsKKworICBJbWFnZVN0cmVhbUNvbXBsZXRlcj8gcHV0SWZBYnNlbnQoT2JqZWN0IGtleSwgSW1hZ2VTdHJlYW1Db21wbGV0ZXIgbG9hZGVyKCkpIHsKKyAgICBhc3NlcnQoa2V5ICE9IG51bGwpOworICAgIGFzc2VydChsb2FkZXIgIT0gbnVsbCk7CisgICAgSW1hZ2VTdHJlYW1Db21wbGV0ZXI/IHJlc3VsdCA9IF9wZW5kaW5nSW1hZ2VzW2tleV0/LmNvbXBsZXRlcjsKKyAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBsb2FkZXIoKTsKKyAgICAgIF9MaXZlSW1hZ2UocmVzdWx0KTsKKyAgICB9IGNhdGNoIChlcnJvcikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcmVzdWx0LmFkZExpc3RlbmVyKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDI1MDQuZGFydC5vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDMxNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSwyMiBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworYWJzdHJhY3QgY2xhc3MgSW1hZ2VTdHJlYW1Db21wbGV0ZXIgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyCisgICAgOworICBhYnN0cmFjdCBtZXRob2QgYWRkTGlzdGVuZXIoKSDihpIgdm9pZDsKK30KK2NsYXNzIF9MaXZlSW1hZ2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzdGF0aWMgZmFjdG9yeSDigKIoc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgYSkg4oaSIHNlbGY6Ol9MaXZlSW1hZ2UKKyAgICA7Cit9CithYnN0cmFjdCBjbGFzcyBGb28gZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkZvbworICAgIDsKKyAgYWJzdHJhY3QgZ2V0IF9wZW5kaW5nSW1hZ2VzKCkg4oaSIGR5bmFtaWM7CisgIG1ldGhvZCBwdXRJZkFic2VudChjb3JlOjpPYmplY3Qga2V5LCAoKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgbG9hZGVyKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI/CisgICAgOworfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKKyAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnN0cm9uZy5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnN0cm9uZy5leHBlY3QKQEAgLTAsMCArMSwzOCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworYWJzdHJhY3QgY2xhc3MgSW1hZ2VTdHJlYW1Db21wbGV0ZXIgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBhYnN0cmFjdCBtZXRob2QgYWRkTGlzdGVuZXIoKSDihpIgdm9pZDsKK30KK2NsYXNzIF9MaXZlSW1hZ2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzdGF0aWMgZmFjdG9yeSDigKIoc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgYSkg4oaSIHNlbGY6Ol9MaXZlSW1hZ2UKKyAgICByZXR1cm4gdGhyb3cgbmV3IGNvcmU6OlVuaW1wbGVtZW50ZWRFcnJvcjo64oCiKCk7Cit9CithYnN0cmFjdCBjbGFzcyBGb28gZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkZvbworICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKKyAgYWJzdHJhY3QgZ2V0IF9wZW5kaW5nSW1hZ2VzKCkg4oaSIGR5bmFtaWM7CisgIG1ldGhvZCBwdXRJZkFic2VudChjb3JlOjpPYmplY3Qga2V5LCAoKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgbG9hZGVyKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI/IHsKKyAgICBhc3NlcnQoIWtleS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpOworICAgIGFzc2VydCghbG9hZGVyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSk7CisgICAgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI/IHJlc3VsdCA9IChsZXQgZmluYWwgZHluYW1pYyAjdDEgPSB0aGlzLntzZWxmOjpGb286Ol9wZW5kaW5nSW1hZ2VzfS5bXShrZXkpIGluICN0MS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkgP3tkeW5hbWljfSBudWxsIDogI3QxLmNvbXBsZXRlcikgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPzsKKyAgICBpZighcmVzdWx0Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgcmV0dXJuIHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn07CisgICAgfQorICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBsb2FkZXIuY2FsbCgpOworICAgICAgc2VsZjo6X0xpdmVJbWFnZTo64oCiKHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn0pOworICAgIH0KKyAgICBvbiBjb3JlOjpPYmplY3QgY2F0Y2goZmluYWwgY29yZTo6T2JqZWN0IGVycm9yKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmVzdWx0e3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyfS57c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI6OmFkZExpc3RlbmVyfSgpOworICAgIHJldHVybiByZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9OworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTAsMCArMSwzOCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworYWJzdHJhY3QgY2xhc3MgSW1hZ2VTdHJlYW1Db21wbGV0ZXIgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBhYnN0cmFjdCBtZXRob2QgYWRkTGlzdGVuZXIoKSDihpIgdm9pZDsKK30KK2NsYXNzIF9MaXZlSW1hZ2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzdGF0aWMgZmFjdG9yeSDigKIoc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgYSkg4oaSIHNlbGY6Ol9MaXZlSW1hZ2UKKyAgICByZXR1cm4gdGhyb3cgbmV3IGNvcmU6OlVuaW1wbGVtZW50ZWRFcnJvcjo64oCiKCk7Cit9CithYnN0cmFjdCBjbGFzcyBGb28gZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkZvbworICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKKyAgYWJzdHJhY3QgZ2V0IF9wZW5kaW5nSW1hZ2VzKCkg4oaSIGR5bmFtaWM7CisgIG1ldGhvZCBwdXRJZkFic2VudChjb3JlOjpPYmplY3Qga2V5LCAoKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXIgbG9hZGVyKSDihpIgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI/IHsKKyAgICBhc3NlcnQoIWtleS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpOworICAgIGFzc2VydCghbG9hZGVyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSk7CisgICAgc2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI/IHJlc3VsdCA9IChsZXQgZmluYWwgZHluYW1pYyAjdDEgPSB0aGlzLntzZWxmOjpGb286Ol9wZW5kaW5nSW1hZ2VzfS5bXShrZXkpIGluICN0MS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkgP3tkeW5hbWljfSBudWxsIDogI3QxLmNvbXBsZXRlcikgYXN7VHlwZUVycm9yLEZvckR5bmFtaWMsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPzsKKyAgICBpZighcmVzdWx0Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgcmV0dXJuIHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn07CisgICAgfQorICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBsb2FkZXIuY2FsbCgpOworICAgICAgc2VsZjo6X0xpdmVJbWFnZTo64oCiKHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn0pOworICAgIH0KKyAgICBvbiBjb3JlOjpPYmplY3QgY2F0Y2goZmluYWwgY29yZTo6T2JqZWN0IGVycm9yKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmVzdWx0e3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyfS57c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXI6OmFkZExpc3RlbmVyfSgpOworICAgIHJldHVybiByZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9OworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1YmQwYgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSwxNSBAQAorYWJzdHJhY3QgY2xhc3MgSW1hZ2VTdHJlYW1Db21wbGV0ZXIgeworICB2b2lkIGFkZExpc3RlbmVyKCk7Cit9CisKK2NsYXNzIF9MaXZlSW1hZ2UgeworICBmYWN0b3J5IF9MaXZlSW1hZ2UoSW1hZ2VTdHJlYW1Db21wbGV0ZXIgYSkgPT4gdGhyb3cgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CisKK2Fic3RyYWN0IGNsYXNzIEZvbyB7CisgIGR5bmFtaWMgZ2V0IF9wZW5kaW5nSW1hZ2VzOworICBJbWFnZVN0cmVhbUNvbXBsZXRlcj8gcHV0SWZBYnNlbnQoCisgICAgICBPYmplY3Qga2V5LCBJbWFnZVN0cmVhbUNvbXBsZXRlciBsb2FkZXIoKSkge30KK30KKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2lzc3VlNDI1MDQuZGFydC50ZXh0dWFsX291dGxpbmVfbW9kZWxsZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM5MGZmCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApAQCAtMCwwICsxLDE1IEBACithYnN0cmFjdCBjbGFzcyBGb28geworICBJbWFnZVN0cmVhbUNvbXBsZXRlcj8gcHV0SWZBYnNlbnQoCisgICAgICBPYmplY3Qga2V5LCBJbWFnZVN0cmVhbUNvbXBsZXRlciBsb2FkZXIoKSkge30KKyAgZHluYW1pYyBnZXQgX3BlbmRpbmdJbWFnZXM7Cit9CisKK2Fic3RyYWN0IGNsYXNzIEltYWdlU3RyZWFtQ29tcGxldGVyIHsKKyAgdm9pZCBhZGRMaXN0ZW5lcigpOworfQorCitjbGFzcyBfTGl2ZUltYWdlIHsKKyAgZmFjdG9yeSBfTGl2ZUltYWdlKEltYWdlU3RyZWFtQ29tcGxldGVyIGEpID0+IHRocm93IFVuaW1wbGVtZW50ZWRFcnJvcigpOworfQorCittYWluKCkge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LndlYWsuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQud2Vhay5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LndlYWsuZXhwZWN0CkBAIC0wLDAgKzEsMzggQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK2Fic3RyYWN0IGNsYXNzIEltYWdlU3RyZWFtQ29tcGxldGVyIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcgorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKKyAgYWJzdHJhY3QgbWV0aG9kIGFkZExpc3RlbmVyKCkg4oaSIHZvaWQ7Cit9CitjbGFzcyBfTGl2ZUltYWdlIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3RhdGljIGZhY3Rvcnkg4oCiKHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyIGEpIOKGkiBzZWxmOjpfTGl2ZUltYWdlCisgICAgcmV0dXJuIHRocm93IG5ldyBjb3JlOjpVbmltcGxlbWVudGVkRXJyb3I6OuKAoigpOworfQorYWJzdHJhY3QgY2xhc3MgRm9vIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpGb28KKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CisgIGFic3RyYWN0IGdldCBfcGVuZGluZ0ltYWdlcygpIOKGkiBkeW5hbWljOworICBtZXRob2QgcHV0SWZBYnNlbnQoY29yZTo6T2JqZWN0IGtleSwgKCkg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyIGxvYWRlcikg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPyB7CisgICAgYXNzZXJ0KCFrZXkue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKTsKKyAgICBhc3NlcnQoIWxvYWRlci57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpOworICAgIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPyByZXN1bHQgPSAobGV0IGZpbmFsIGR5bmFtaWMgI3QxID0gdGhpcy57c2VsZjo6Rm9vOjpfcGVuZGluZ0ltYWdlc30uW10oa2V5KSBpbiAjdDEue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpID97ZHluYW1pY30gbnVsbCA6ICN0MS5jb21wbGV0ZXIpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcj87CisgICAgaWYoIXJlc3VsdC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIHJldHVybiByZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9OworICAgIH0KKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gbG9hZGVyLmNhbGwoKTsKKyAgICAgIHNlbGY6Ol9MaXZlSW1hZ2U6OuKAoihyZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9KTsKKyAgICB9CisgICAgb24gY29yZTo6T2JqZWN0IGNhdGNoKGZpbmFsIGNvcmU6Ok9iamVjdCBlcnJvcikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn0ue3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyOjphZGRMaXN0ZW5lcn0oKTsKKyAgICByZXR1cm4gcmVzdWx0e3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyfTsKKyAgfQorfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9pc3N1ZTQyNTA0LmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvaXNzdWU0MjUwNC5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CkBAIC0wLDAgKzEsMzggQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK2Fic3RyYWN0IGNsYXNzIEltYWdlU3RyZWFtQ29tcGxldGVyIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcgorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKKyAgYWJzdHJhY3QgbWV0aG9kIGFkZExpc3RlbmVyKCkg4oaSIHZvaWQ7Cit9CitjbGFzcyBfTGl2ZUltYWdlIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3RhdGljIGZhY3Rvcnkg4oCiKHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyIGEpIOKGkiBzZWxmOjpfTGl2ZUltYWdlCisgICAgcmV0dXJuIHRocm93IG5ldyBjb3JlOjpVbmltcGxlbWVudGVkRXJyb3I6OuKAoigpOworfQorYWJzdHJhY3QgY2xhc3MgRm9vIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpGb28KKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CisgIGFic3RyYWN0IGdldCBfcGVuZGluZ0ltYWdlcygpIOKGkiBkeW5hbWljOworICBtZXRob2QgcHV0SWZBYnNlbnQoY29yZTo6T2JqZWN0IGtleSwgKCkg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyIGxvYWRlcikg4oaSIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPyB7CisgICAgYXNzZXJ0KCFrZXkue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKTsKKyAgICBhc3NlcnQoIWxvYWRlci57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpOworICAgIHNlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyPyByZXN1bHQgPSAobGV0IGZpbmFsIGR5bmFtaWMgI3QxID0gdGhpcy57c2VsZjo6Rm9vOjpfcGVuZGluZ0ltYWdlc30uW10oa2V5KSBpbiAjdDEue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpID97ZHluYW1pY30gbnVsbCA6ICN0MS5jb21wbGV0ZXIpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcj87CisgICAgaWYoIXJlc3VsdC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIHJldHVybiByZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9OworICAgIH0KKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gbG9hZGVyLmNhbGwoKTsKKyAgICAgIHNlbGY6Ol9MaXZlSW1hZ2U6OuKAoihyZXN1bHR7c2VsZjo6SW1hZ2VTdHJlYW1Db21wbGV0ZXJ9KTsKKyAgICB9CisgICAgb24gY29yZTo6T2JqZWN0IGNhdGNoKGZpbmFsIGNvcmU6Ok9iamVjdCBlcnJvcikgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJlc3VsdHtzZWxmOjpJbWFnZVN0cmVhbUNvbXBsZXRlcn0ue3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyOjphZGRMaXN0ZW5lcn0oKTsKKyAgICByZXR1cm4gcmVzdWx0e3NlbGY6OkltYWdlU3RyZWFtQ29tcGxldGVyfTsKKyAgfQorfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbGF0ZXIuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbGF0ZXIuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCA2NTQ2NjJlLi40MWZlZTUwIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL2xhdGVyLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9sYXRlci5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC00MCw5ICs0MCw5IEBACiAgIDsKIHN0YXRpYyBtZXRob2QgYmF6KCkg4oaSIGR5bmFtaWMKICAgOwotc3RhdGljIG1ldGhvZCBoZXN0KCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgaGVzdCgpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIGZpc2soKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBmaXNrKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzA3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0CkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgU3RyaW5nIHRleHQgPSAiIjsKK30KKworZXh0ZW5zaW9uIG9uIEE/IHsKKyAgU3RyaW5nIGdldCB0ZXh0ID0+ICJMaWx5IHdhcyBoZXJlIjsKK30KKwordm9pZCBtYWluKCkgeworICBBPyBhID0gbnVsbDsKKyAgZXhwZWN0KCJMaWx5IHdhcyBoZXJlIiwgYS50ZXh0KTsKK30KKworZXhwZWN0KGV4cGVjdGVkLCBhY3R1YWwpIHsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgdGhyb3cgJ0V4cGVjdGVkICRleHBlY3RlZCwgYWN0dWFsICRhY3R1YWwnOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9udWxsYWJsZV9leHRlbnNpb24uZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQub3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4OTYzZAotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSwxOCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworY2xhc3MgQSBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIGZpZWxkIGNvcmU6OlN0cmluZyB0ZXh0OworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkEKKyAgICA7Cit9CitleHRlbnNpb24gX2V4dGVuc2lvbiMwIG9uIHNlbGY6OkE/IHsKKyAgZ2V0IHRleHQgPSBzZWxmOjpfZXh0ZW5zaW9uIzB8Z2V0I3RleHQ7Cit9CitzdGF0aWMgbWV0aG9kIF9leHRlbnNpb24jMHxnZXQjdGV4dChmaW5hbCBzZWxmOjpBPyAjdGhpcykg4oaSIGNvcmU6OlN0cmluZworICA7CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgdm9pZAorICA7CitzdGF0aWMgbWV0aG9kIGV4cGVjdChkeW5hbWljIGV4cGVjdGVkLCBkeW5hbWljIGFjdHVhbCkg4oaSIGR5bmFtaWMKKyAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9udWxsYWJsZV9leHRlbnNpb24uZGFydC5zdHJvbmcuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9udWxsYWJsZV9leHRlbnNpb24uZGFydC5zdHJvbmcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzRkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0LnN0cm9uZy5leHBlY3QKQEAgLTAsMCArMSwyMyBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworY2xhc3MgQSBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIGZpZWxkIGNvcmU6OlN0cmluZyB0ZXh0ID0gIiI7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QQorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKK30KK2V4dGVuc2lvbiBfZXh0ZW5zaW9uIzAgb24gc2VsZjo6QT8geworICBnZXQgdGV4dCA9IHNlbGY6Ol9leHRlbnNpb24jMHxnZXQjdGV4dDsKK30KK3N0YXRpYyBtZXRob2QgX2V4dGVuc2lvbiMwfGdldCN0ZXh0KGZpbmFsIHNlbGY6OkE/ICN0aGlzKSDihpIgY29yZTo6U3RyaW5nCisgIHJldHVybiAiTGlseSB3YXMgaGVyZSI7CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgdm9pZCB7CisgIHNlbGY6OkE/IGEgPSBudWxsOworICBzZWxmOjpleHBlY3QoIkxpbHkgd2FzIGhlcmUiLCBzZWxmOjpfZXh0ZW5zaW9uIzB8Z2V0I3RleHQoYSkpOworfQorc3RhdGljIG1ldGhvZCBleHBlY3QoZHluYW1pYyBleHBlY3RlZCwgZHluYW1pYyBhY3R1YWwpIOKGkiBkeW5hbWljIHsKKyAgaWYoIWV4cGVjdGVkLntjb3JlOjpPYmplY3Q6Oj09fShhY3R1YWwpKQorICAgIHRocm93ICJFeHBlY3RlZCAke2V4cGVjdGVkfSwgYWN0dWFsICR7YWN0dWFsfSI7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NGRlYwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDIzIEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitjbGFzcyBBIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgZmllbGQgY29yZTo6U3RyaW5nIHRleHQgPSAiIjsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpBCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworfQorZXh0ZW5zaW9uIF9leHRlbnNpb24jMCBvbiBzZWxmOjpBPyB7CisgIGdldCB0ZXh0ID0gc2VsZjo6X2V4dGVuc2lvbiMwfGdldCN0ZXh0OworfQorc3RhdGljIG1ldGhvZCBfZXh0ZW5zaW9uIzB8Z2V0I3RleHQoZmluYWwgc2VsZjo6QT8gI3RoaXMpIOKGkiBjb3JlOjpTdHJpbmcKKyAgcmV0dXJuICJMaWx5IHdhcyBoZXJlIjsKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiB2b2lkIHsKKyAgc2VsZjo6QT8gYSA9IG51bGw7CisgIHNlbGY6OmV4cGVjdCgiTGlseSB3YXMgaGVyZSIsIHNlbGY6Ol9leHRlbnNpb24jMHxnZXQjdGV4dChhKSk7Cit9CitzdGF0aWMgbWV0aG9kIGV4cGVjdChkeW5hbWljIGV4cGVjdGVkLCBkeW5hbWljIGFjdHVhbCkg4oaSIGR5bmFtaWMgeworICBpZighZXhwZWN0ZWQue2NvcmU6Ok9iamVjdDo6PT19KGFjdHVhbCkpCisgICAgdGhyb3cgIkV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBhY3R1YWwgJHthY3R1YWx9IjsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJmMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9udWxsYWJsZV9leHRlbnNpb24uZGFydC50ZXh0dWFsX291dGxpbmUuZXhwZWN0CkBAIC0wLDAgKzEsOCBAQAorY2xhc3MgQSB7CisgIFN0cmluZyB0ZXh0ID0gIiI7Cit9CitleHRlbnNpb24gb24gOworQTsKKz8geyBTdHJpbmcgZ2V0IHRleHQgPT4gIkxpbHkgd2FzIGhlcmUiOyB9Cit2b2lkIG1haW4oKSB7IH0KK2V4cGVjdChleHBlY3RlZCwgYWN0dWFsKSB7IH0KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQud2Vhay5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0LndlYWsuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzRkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL251bGxhYmxlX2V4dGVuc2lvbi5kYXJ0LndlYWsuZXhwZWN0CkBAIC0wLDAgKzEsMjMgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK2NsYXNzIEEgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBmaWVsZCBjb3JlOjpTdHJpbmcgdGV4dCA9ICIiOworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkEKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7Cit9CitleHRlbnNpb24gX2V4dGVuc2lvbiMwIG9uIHNlbGY6OkE/IHsKKyAgZ2V0IHRleHQgPSBzZWxmOjpfZXh0ZW5zaW9uIzB8Z2V0I3RleHQ7Cit9CitzdGF0aWMgbWV0aG9kIF9leHRlbnNpb24jMHxnZXQjdGV4dChmaW5hbCBzZWxmOjpBPyAjdGhpcykg4oaSIGNvcmU6OlN0cmluZworICByZXR1cm4gIkxpbHkgd2FzIGhlcmUiOworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQgeworICBzZWxmOjpBPyBhID0gbnVsbDsKKyAgc2VsZjo6ZXhwZWN0KCJMaWx5IHdhcyBoZXJlIiwgc2VsZjo6X2V4dGVuc2lvbiMwfGdldCN0ZXh0KGEpKTsKK30KK3N0YXRpYyBtZXRob2QgZXhwZWN0KGR5bmFtaWMgZXhwZWN0ZWQsIGR5bmFtaWMgYWN0dWFsKSDihpIgZHluYW1pYyB7CisgIGlmKCFleHBlY3RlZC57Y29yZTo6T2JqZWN0Ojo9PX0oYWN0dWFsKSkKKyAgICB0aHJvdyAiRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGFjdHVhbCAke2FjdHVhbH0iOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9udWxsYWJsZV9leHRlbnNpb24uZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NGRlYwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvbnVsbGFibGVfZXh0ZW5zaW9uLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTAsMCArMSwyMyBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworY2xhc3MgQSBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIGZpZWxkIGNvcmU6OlN0cmluZyB0ZXh0ID0gIiI7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QQorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKK30KK2V4dGVuc2lvbiBfZXh0ZW5zaW9uIzAgb24gc2VsZjo6QT8geworICBnZXQgdGV4dCA9IHNlbGY6Ol9leHRlbnNpb24jMHxnZXQjdGV4dDsKK30KK3N0YXRpYyBtZXRob2QgX2V4dGVuc2lvbiMwfGdldCN0ZXh0KGZpbmFsIHNlbGY6OkE/ICN0aGlzKSDihpIgY29yZTo6U3RyaW5nCisgIHJldHVybiAiTGlseSB3YXMgaGVyZSI7CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgdm9pZCB7CisgIHNlbGY6OkE/IGEgPSBudWxsOworICBzZWxmOjpleHBlY3QoIkxpbHkgd2FzIGhlcmUiLCBzZWxmOjpfZXh0ZW5zaW9uIzB8Z2V0I3RleHQoYSkpOworfQorc3RhdGljIG1ldGhvZCBleHBlY3QoZHluYW1pYyBleHBlY3RlZCwgZHluYW1pYyBhY3R1YWwpIOKGkiBkeW5hbWljIHsKKyAgaWYoIWV4cGVjdGVkLntjb3JlOjpPYmplY3Q6Oj09fShhY3R1YWwpKQorICAgIHRocm93ICJFeHBlY3RlZCAke2V4cGVjdGVkfSwgYWN0dWFsICR7YWN0dWFsfSI7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM1Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgdGVzdCBpcyBkZXJpdmVkIGZyb20gYHJ1bnRpbWUvdGVzdHMvdm0vZGFydC9jYXVzYWxfc3RhY2tzL3V0aWxzLmRhcnRgLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCitGdXR1cmU8dm9pZD4gdGhyb3dTeW5jKCkgeworICB0aHJvdyAnJzsKK30KKworRnV0dXJlPHZvaWQ+IGFsbFlpZWxkKCkgYXN5bmMgeworICBhd2FpdCAwOworICBhd2FpdCBhbGxZaWVsZDIoKTsKK30KKworRnV0dXJlPHZvaWQ+IGFsbFlpZWxkMigpIGFzeW5jIHsKKyAgYXdhaXQgMDsKKyAgYXdhaXQgYWxsWWllbGQzKCk7Cit9CisKK0Z1dHVyZTx2b2lkPiBhbGxZaWVsZDMoKSBhc3luYyB7CisgIGF3YWl0IDA7CisgIHRocm93U3luYygpOworfQorCitGdXR1cmU8dm9pZD4gY3VzdG9tRXJyb3Jab25lKCkgYXN5bmMgeworICBmaW5hbCBjb21wbGV0ZXIgPSBDb21wbGV0ZXI8dm9pZD4oKTsKKyAgcnVuWm9uZWRHdWFyZGVkKCgpIGFzeW5jIHsKKyAgICBhd2FpdCBhbGxZaWVsZCgpOworICAgIGNvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKKyAgfSwgKGUsIHMpIHsKKyAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlLCBzKTsKKyAgfSk7CisgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworfQorCittYWluKCkge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0Lm91dGxpbmUuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWY3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0wLDAgKzEsMTggQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CisKK2ltcG9ydCAiZGFydDphc3luYyI7CisKK3N0YXRpYyBtZXRob2QgdGhyb3dTeW5jKCkg4oaSIGFzeTo6RnV0dXJlPHZvaWQ+CisgIDsKK3N0YXRpYyBtZXRob2QgYWxsWWllbGQoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgCisgIDsKK3N0YXRpYyBtZXRob2QgYWxsWWllbGQyKCkg4oaSIGFzeTo6RnV0dXJlPHZvaWQ+IGFzeW5jIAorICA7CitzdGF0aWMgbWV0aG9kIGFsbFlpZWxkMygpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiBhc3luYyAKKyAgOworc3RhdGljIG1ldGhvZCBjdXN0b21FcnJvclpvbmUoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgCisgIDsKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCisgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQuc3Ryb25nLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzkzMjJiCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC5zdHJvbmcuZXhwZWN0CkBAIC0wLDAgKzEsMzMgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworaW1wb3J0ICJkYXJ0OmFzeW5jIjsKKworc3RhdGljIG1ldGhvZCB0aHJvd1N5bmMoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4geworICB0aHJvdyAiIjsKK30KK3N0YXRpYyBtZXRob2QgYWxsWWllbGQoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgeworICBhd2FpdCAwOworICBhd2FpdCBzZWxmOjphbGxZaWVsZDIoKTsKK30KK3N0YXRpYyBtZXRob2QgYWxsWWllbGQyKCkg4oaSIGFzeTo6RnV0dXJlPHZvaWQ+IGFzeW5jIHsKKyAgYXdhaXQgMDsKKyAgYXdhaXQgc2VsZjo6YWxsWWllbGQzKCk7Cit9CitzdGF0aWMgbWV0aG9kIGFsbFlpZWxkMygpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiBhc3luYyB7CisgIGF3YWl0IDA7CisgIHNlbGY6OnRocm93U3luYygpOworfQorc3RhdGljIG1ldGhvZCBjdXN0b21FcnJvclpvbmUoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgeworICBmaW5hbCBhc3k6OkNvbXBsZXRlcjx2b2lkPiBjb21wbGV0ZXIgPSBhc3k6OkNvbXBsZXRlcjo64oCiPHZvaWQ+KCk7CisgIGFzeTo6cnVuWm9uZWRHdWFyZGVkPGFzeTo6RnV0dXJlPGNvcmU6Ok51bGw/Pj4oKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Ok51bGw/PiBhc3luYyB7CisgICAgYXdhaXQgc2VsZjo6YWxsWWllbGQoKTsKKyAgICBjb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpjb21wbGV0ZX0obnVsbCk7CisgIH0sIChjb3JlOjpPYmplY3QgZSwgY29yZTo6U3RhY2tUcmFjZSBzKSDihpIgY29yZTo6TnVsbD8geworICAgIGNvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGUsIHMpOworICB9KTsKKyAgcmV0dXJuIGNvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDBiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTAsMCArMSwxNjAgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKK2ltcG9ydCAiZGFydDpfaW50ZXJuYWwiIGFzIF9pbjsKKworaW1wb3J0ICJkYXJ0OmFzeW5jIjsKKworc3RhdGljIG1ldGhvZCB0aHJvd1N5bmMoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4geworICB0aHJvdyAiIjsKK30KK3N0YXRpYyBtZXRob2QgYWxsWWllbGQoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CisgIGZpbmFsIGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI8dm9pZD4gOmFzeW5jX2NvbXBsZXRlciA9IG5ldyBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjrigKI8dm9pZD4oKTsKKyAgRnV0dXJlT3I8dm9pZD4/IDpyZXR1cm5fdmFsdWU7CisgIGR5bmFtaWMgOmFzeW5jX3N0YWNrX3RyYWNlOworICAoZHluYW1pYykg4oaSIGR5bmFtaWMgOmFzeW5jX29wX3RoZW47CisgIChjb3JlOjpPYmplY3QsIGNvcmU6OlN0YWNrVHJhY2UpIOKGkiBkeW5hbWljIDphc3luY19vcF9lcnJvcjsKKyAgY29yZTo6aW50IDphd2FpdF9qdW1wX3ZhciA9IDA7CisgIGR5bmFtaWMgOmF3YWl0X2N0eF92YXI7CisgIGR5bmFtaWMgOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjA7CisgIGZ1bmN0aW9uIDphc3luY19vcChbZHluYW1pYyA6cmVzdWx0LCBkeW5hbWljIDpleGNlcHRpb24sIGR5bmFtaWMgOnN0YWNrX3RyYWNlXSkg4oaSIGR5bmFtaWMgeWllbGRpbmcgCisgICAgdHJ5IHsKKyAgICAgICNMMToKKyAgICAgIHsKKyAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDEgPSBhc3k6Ol9hd2FpdEhlbHBlcigwLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDxjb3JlOjppbnQ+KDpyZXN1bHQpOworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MiA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmFsbFlpZWxkMigpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDx2b2lkPig6cmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb24gZHluYW1pYyBjYXRjaChkeW5hbWljIGV4Y2VwdGlvbiwgY29yZTo6U3RhY2tUcmFjZSBzdGFja190cmFjZSkgeworICAgICAgOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGV4Y2VwdGlvbiwgc3RhY2tfdHJhY2UpOworICAgIH0KKyAgOmFzeW5jX3N0YWNrX3RyYWNlID0gYXN5OjpfYXN5bmNTdGFja1RyYWNlSGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF90aGVuID0gYXN5OjpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKKyAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OworfQorc3RhdGljIG1ldGhvZCBhbGxZaWVsZDIoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CisgIGZpbmFsIGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI8dm9pZD4gOmFzeW5jX2NvbXBsZXRlciA9IG5ldyBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjrigKI8dm9pZD4oKTsKKyAgRnV0dXJlT3I8dm9pZD4/IDpyZXR1cm5fdmFsdWU7CisgIGR5bmFtaWMgOmFzeW5jX3N0YWNrX3RyYWNlOworICAoZHluYW1pYykg4oaSIGR5bmFtaWMgOmFzeW5jX29wX3RoZW47CisgIChjb3JlOjpPYmplY3QsIGNvcmU6OlN0YWNrVHJhY2UpIOKGkiBkeW5hbWljIDphc3luY19vcF9lcnJvcjsKKyAgY29yZTo6aW50IDphd2FpdF9qdW1wX3ZhciA9IDA7CisgIGR5bmFtaWMgOmF3YWl0X2N0eF92YXI7CisgIGR5bmFtaWMgOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjA7CisgIGZ1bmN0aW9uIDphc3luY19vcChbZHluYW1pYyA6cmVzdWx0LCBkeW5hbWljIDpleGNlcHRpb24sIGR5bmFtaWMgOnN0YWNrX3RyYWNlXSkg4oaSIGR5bmFtaWMgeWllbGRpbmcgCisgICAgdHJ5IHsKKyAgICAgICNMMjoKKyAgICAgIHsKKyAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDMgPSBhc3k6Ol9hd2FpdEhlbHBlcigwLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDxjb3JlOjppbnQ+KDpyZXN1bHQpOworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0NCA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmFsbFlpZWxkMygpLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDx2b2lkPig6cmVzdWx0KTsKKyAgICAgIH0KKyAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb24gZHluYW1pYyBjYXRjaChkeW5hbWljIGV4Y2VwdGlvbiwgY29yZTo6U3RhY2tUcmFjZSBzdGFja190cmFjZSkgeworICAgICAgOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGV4Y2VwdGlvbiwgc3RhY2tfdHJhY2UpOworICAgIH0KKyAgOmFzeW5jX3N0YWNrX3RyYWNlID0gYXN5OjpfYXN5bmNTdGFja1RyYWNlSGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF90aGVuID0gYXN5OjpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKKyAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OworfQorc3RhdGljIG1ldGhvZCBhbGxZaWVsZDMoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CisgIGZpbmFsIGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI8dm9pZD4gOmFzeW5jX2NvbXBsZXRlciA9IG5ldyBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjrigKI8dm9pZD4oKTsKKyAgRnV0dXJlT3I8dm9pZD4/IDpyZXR1cm5fdmFsdWU7CisgIGR5bmFtaWMgOmFzeW5jX3N0YWNrX3RyYWNlOworICAoZHluYW1pYykg4oaSIGR5bmFtaWMgOmFzeW5jX29wX3RoZW47CisgIChjb3JlOjpPYmplY3QsIGNvcmU6OlN0YWNrVHJhY2UpIOKGkiBkeW5hbWljIDphc3luY19vcF9lcnJvcjsKKyAgY29yZTo6aW50IDphd2FpdF9qdW1wX3ZhciA9IDA7CisgIGR5bmFtaWMgOmF3YWl0X2N0eF92YXI7CisgIGR5bmFtaWMgOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjA7CisgIGZ1bmN0aW9uIDphc3luY19vcChbZHluYW1pYyA6cmVzdWx0LCBkeW5hbWljIDpleGNlcHRpb24sIGR5bmFtaWMgOnN0YWNrX3RyYWNlXSkg4oaSIGR5bmFtaWMgeWllbGRpbmcgCisgICAgdHJ5IHsKKyAgICAgICNMMzoKKyAgICAgIHsKKyAgICAgICAgW3lpZWxkXSBsZXQgZHluYW1pYyAjdDUgPSBhc3k6Ol9hd2FpdEhlbHBlcigwLCA6YXN5bmNfb3BfdGhlbiwgOmFzeW5jX29wX2Vycm9yLCA6YXN5bmNfb3ApIGluIG51bGw7CisgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDxjb3JlOjppbnQ+KDpyZXN1bHQpOworICAgICAgICBzZWxmOjp0aHJvd1N5bmMoKTsKKyAgICAgIH0KKyAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb24gZHluYW1pYyBjYXRjaChkeW5hbWljIGV4Y2VwdGlvbiwgY29yZTo6U3RhY2tUcmFjZSBzdGFja190cmFjZSkgeworICAgICAgOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGV4Y2VwdGlvbiwgc3RhY2tfdHJhY2UpOworICAgIH0KKyAgOmFzeW5jX3N0YWNrX3RyYWNlID0gYXN5OjpfYXN5bmNTdGFja1RyYWNlSGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF90aGVuID0gYXN5OjpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKKyAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OworfQorc3RhdGljIG1ldGhvZCBjdXN0b21FcnJvclpvbmUoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CisgIGZpbmFsIGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI8dm9pZD4gOmFzeW5jX2NvbXBsZXRlciA9IG5ldyBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjrigKI8dm9pZD4oKTsKKyAgRnV0dXJlT3I8dm9pZD4/IDpyZXR1cm5fdmFsdWU7CisgIGR5bmFtaWMgOmFzeW5jX3N0YWNrX3RyYWNlOworICAoZHluYW1pYykg4oaSIGR5bmFtaWMgOmFzeW5jX29wX3RoZW47CisgIChjb3JlOjpPYmplY3QsIGNvcmU6OlN0YWNrVHJhY2UpIOKGkiBkeW5hbWljIDphc3luY19vcF9lcnJvcjsKKyAgY29yZTo6aW50IDphd2FpdF9qdW1wX3ZhciA9IDA7CisgIGR5bmFtaWMgOmF3YWl0X2N0eF92YXI7CisgIGZ1bmN0aW9uIDphc3luY19vcChbZHluYW1pYyA6cmVzdWx0LCBkeW5hbWljIDpleGNlcHRpb24sIGR5bmFtaWMgOnN0YWNrX3RyYWNlXSkg4oaSIGR5bmFtaWMgeWllbGRpbmcgCisgICAgdHJ5IHsKKyAgICAgICNMNDoKKyAgICAgIHsKKyAgICAgICAgZmluYWwgYXN5OjpDb21wbGV0ZXI8dm9pZD4gY29tcGxldGVyID0gYXN5OjpDb21wbGV0ZXI6OuKAojx2b2lkPigpOworICAgICAgICBhc3k6OnJ1blpvbmVkR3VhcmRlZDxhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz4+KCgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz4gLyogb3JpZ2luYWxseSBhc3luYyAqLyB7CisgICAgICAgICAgZmluYWwgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjxjb3JlOjpOdWxsPz4gOmFzeW5jX2NvbXBsZXRlciA9IG5ldyBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjrigKI8Y29yZTo6TnVsbD8+KCk7CisgICAgICAgICAgRnV0dXJlT3I8Y29yZTo6TnVsbD8+PyA6cmV0dXJuX3ZhbHVlOworICAgICAgICAgIGR5bmFtaWMgOmFzeW5jX3N0YWNrX3RyYWNlOworICAgICAgICAgIChkeW5hbWljKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgICAgICAgICAoY29yZTo6T2JqZWN0LCBjb3JlOjpTdGFja1RyYWNlKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfZXJyb3I7CisgICAgICAgICAgY29yZTo6aW50IDphd2FpdF9qdW1wX3ZhciA9IDA7CisgICAgICAgICAgZHluYW1pYyA6YXdhaXRfY3R4X3ZhcjsKKyAgICAgICAgICBkeW5hbWljIDpzYXZlZF90cnlfY29udGV4dF92YXIwOworICAgICAgICAgIGZ1bmN0aW9uIDphc3luY19vcChbZHluYW1pYyA6cmVzdWx0LCBkeW5hbWljIDpleGNlcHRpb24sIGR5bmFtaWMgOnN0YWNrX3RyYWNlXSkg4oaSIGR5bmFtaWMgeWllbGRpbmcgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAjTDU6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0NiA9IGFzeTo6X2F3YWl0SGVscGVyKHNlbGY6OmFsbFlpZWxkKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgICAgICAgICBfaW46OnVuc2FmZUNhc3Q8dm9pZD4oOnJlc3VsdCk7CisgICAgICAgICAgICAgICAgY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGV9KG51bGwpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb24gZHluYW1pYyBjYXRjaChkeW5hbWljIGV4Y2VwdGlvbiwgY29yZTo6U3RhY2tUcmFjZSBzdGFja190cmFjZSkgeworICAgICAgICAgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZXhjZXB0aW9uLCBzdGFja190cmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgOmFzeW5jX3N0YWNrX3RyYWNlID0gYXN5OjpfYXN5bmNTdGFja1RyYWNlSGVscGVyKDphc3luY19vcCk7CisgICAgICAgICAgOmFzeW5jX29wX3RoZW4gPSBhc3k6Ol9hc3luY1RoZW5XcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgICAgICAgICAgOmFzeW5jX29wX2Vycm9yID0gYXN5OjpfYXN5bmNFcnJvcldyYXBwZXJIZWxwZXIoOmFzeW5jX29wKTsKKyAgICAgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKKyAgICAgICAgICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07CisgICAgICAgIH0sIChjb3JlOjpPYmplY3QgZSwgY29yZTo6U3RhY2tUcmFjZSBzKSDihpIgY29yZTo6TnVsbD8geworICAgICAgICAgIGNvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGUsIHMpOworICAgICAgICB9KTsKKyAgICAgICAgOnJldHVybl92YWx1ZSA9IGNvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07CisgICAgICAgIGJyZWFrICNMNDsKKyAgICAgIH0KKyAgICAgIGFzeTo6X2NvbXBsZXRlT25Bc3luY1JldHVybig6YXN5bmNfY29tcGxldGVyLCA6cmV0dXJuX3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb24gZHluYW1pYyBjYXRjaChkeW5hbWljIGV4Y2VwdGlvbiwgY29yZTo6U3RhY2tUcmFjZSBzdGFja190cmFjZSkgeworICAgICAgOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlRXJyb3J9KGV4Y2VwdGlvbiwgc3RhY2tfdHJhY2UpOworICAgIH0KKyAgOmFzeW5jX3N0YWNrX3RyYWNlID0gYXN5OjpfYXN5bmNTdGFja1RyYWNlSGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF90aGVuID0gYXN5OjpfYXN5bmNUaGVuV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICA6YXN5bmNfY29tcGxldGVyLnthc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyOjpzdGFydH0oOmFzeW5jX29wKTsKKyAgcmV0dXJuIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpmdXR1cmV9OworfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk2ODRmCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC50ZXh0dWFsX291dGxpbmUuZXhwZWN0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworRnV0dXJlPHZvaWQ+IHRocm93U3luYygpIHt9CitGdXR1cmU8dm9pZD4gYWxsWWllbGQoKSBhc3luYyB7fQorRnV0dXJlPHZvaWQ+IGFsbFlpZWxkMigpIGFzeW5jIHt9CitGdXR1cmU8dm9pZD4gYWxsWWllbGQzKCkgYXN5bmMge30KK0Z1dHVyZTx2b2lkPiBjdXN0b21FcnJvclpvbmUoKSBhc3luYyB7fQorbWFpbigpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzOWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApAQCAtMCwwICsxLDggQEAKK2ltcG9ydCAnZGFydDphc3luYyc7CisKK0Z1dHVyZTx2b2lkPiBhbGxZaWVsZCgpIGFzeW5jIHt9CitGdXR1cmU8dm9pZD4gYWxsWWllbGQyKCkgYXN5bmMge30KK0Z1dHVyZTx2b2lkPiBhbGxZaWVsZDMoKSBhc3luYyB7fQorRnV0dXJlPHZvaWQ+IGN1c3RvbUVycm9yWm9uZSgpIGFzeW5jIHt9CitGdXR1cmU8dm9pZD4gdGhyb3dTeW5jKCkge30KK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQud2Vhay5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5MzIyYgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvcmV0dXJuX2FzeW5jLmRhcnQud2Vhay5leHBlY3QKQEAgLTAsMCArMSwzMyBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitpbXBvcnQgImRhcnQ6YXN5bmMiOworCitzdGF0aWMgbWV0aG9kIHRocm93U3luYygpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiB7CisgIHRocm93ICIiOworfQorc3RhdGljIG1ldGhvZCBhbGxZaWVsZCgpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiBhc3luYyB7CisgIGF3YWl0IDA7CisgIGF3YWl0IHNlbGY6OmFsbFlpZWxkMigpOworfQorc3RhdGljIG1ldGhvZCBhbGxZaWVsZDIoKSDihpIgYXN5OjpGdXR1cmU8dm9pZD4gYXN5bmMgeworICBhd2FpdCAwOworICBhd2FpdCBzZWxmOjphbGxZaWVsZDMoKTsKK30KK3N0YXRpYyBtZXRob2QgYWxsWWllbGQzKCkg4oaSIGFzeTo6RnV0dXJlPHZvaWQ+IGFzeW5jIHsKKyAgYXdhaXQgMDsKKyAgc2VsZjo6dGhyb3dTeW5jKCk7Cit9CitzdGF0aWMgbWV0aG9kIGN1c3RvbUVycm9yWm9uZSgpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiBhc3luYyB7CisgIGZpbmFsIGFzeTo6Q29tcGxldGVyPHZvaWQ+IGNvbXBsZXRlciA9IGFzeTo6Q29tcGxldGVyOjrigKI8dm9pZD4oKTsKKyAgYXN5OjpydW5ab25lZEd1YXJkZWQ8YXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+PigoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+IGFzeW5jIHsKKyAgICBhd2FpdCBzZWxmOjphbGxZaWVsZCgpOworICAgIGNvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmNvbXBsZXRlfShudWxsKTsKKyAgfSwgKGNvcmU6Ok9iamVjdCBlLCBjb3JlOjpTdGFja1RyYWNlIHMpIOKGkiBjb3JlOjpOdWxsPyB7CisgICAgY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZSwgcyk7CisgIH0pOworICByZXR1cm4gY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKK30KK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9hc3luYy5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTAwYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fYXN5bmMuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDE2MCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworaW1wb3J0ICJkYXJ0Ol9pbnRlcm5hbCIgYXMgX2luOworCitpbXBvcnQgImRhcnQ6YXN5bmMiOworCitzdGF0aWMgbWV0aG9kIHRocm93U3luYygpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiB7CisgIHRocm93ICIiOworfQorc3RhdGljIG1ldGhvZCBhbGxZaWVsZCgpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKKyAgZmluYWwgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjx2b2lkPiA6YXN5bmNfY29tcGxldGVyID0gbmV3IGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OuKAojx2b2lkPigpOworICBGdXR1cmVPcjx2b2lkPj8gOnJldHVybl92YWx1ZTsKKyAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgIChkeW5hbWljKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgKGNvcmU6Ok9iamVjdCwgY29yZTo6U3RhY2tUcmFjZSkg4oaSIGR5bmFtaWMgOmFzeW5jX29wX2Vycm9yOworICBjb3JlOjppbnQgOmF3YWl0X2p1bXBfdmFyID0gMDsKKyAgZHluYW1pYyA6YXdhaXRfY3R4X3ZhcjsKKyAgZHluYW1pYyA6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMDsKKyAgZnVuY3Rpb24gOmFzeW5jX29wKFtkeW5hbWljIDpyZXN1bHQsIGR5bmFtaWMgOmV4Y2VwdGlvbiwgZHluYW1pYyA6c3RhY2tfdHJhY2VdKSDihpIgZHluYW1pYyB5aWVsZGluZyAKKyAgICB0cnkgeworICAgICAgI0wxOgorICAgICAgeworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MSA9IGFzeTo6X2F3YWl0SGVscGVyKDAsIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgX2luOjp1bnNhZmVDYXN0PGNvcmU6OmludD4oOnJlc3VsdCk7CisgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3QyID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6YWxsWWllbGQyKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgX2luOjp1bnNhZmVDYXN0PHZvaWQ+KDpyZXN1bHQpOworICAgICAgfQorICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbiBkeW5hbWljIGNhdGNoKGR5bmFtaWMgZXhjZXB0aW9uLCBjb3JlOjpTdGFja1RyYWNlIHN0YWNrX3RyYWNlKSB7CisgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZXhjZXB0aW9uLCBzdGFja190cmFjZSk7CisgICAgfQorICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgOmFzeW5jX29wX3RoZW4gPSBhc3k6Ol9hc3luY1RoZW5XcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF9lcnJvciA9IGFzeTo6X2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07Cit9CitzdGF0aWMgbWV0aG9kIGFsbFlpZWxkMigpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKKyAgZmluYWwgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjx2b2lkPiA6YXN5bmNfY29tcGxldGVyID0gbmV3IGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OuKAojx2b2lkPigpOworICBGdXR1cmVPcjx2b2lkPj8gOnJldHVybl92YWx1ZTsKKyAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgIChkeW5hbWljKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgKGNvcmU6Ok9iamVjdCwgY29yZTo6U3RhY2tUcmFjZSkg4oaSIGR5bmFtaWMgOmFzeW5jX29wX2Vycm9yOworICBjb3JlOjppbnQgOmF3YWl0X2p1bXBfdmFyID0gMDsKKyAgZHluYW1pYyA6YXdhaXRfY3R4X3ZhcjsKKyAgZHluYW1pYyA6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMDsKKyAgZnVuY3Rpb24gOmFzeW5jX29wKFtkeW5hbWljIDpyZXN1bHQsIGR5bmFtaWMgOmV4Y2VwdGlvbiwgZHluYW1pYyA6c3RhY2tfdHJhY2VdKSDihpIgZHluYW1pYyB5aWVsZGluZyAKKyAgICB0cnkgeworICAgICAgI0wyOgorICAgICAgeworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0MyA9IGFzeTo6X2F3YWl0SGVscGVyKDAsIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgX2luOjp1bnNhZmVDYXN0PGNvcmU6OmludD4oOnJlc3VsdCk7CisgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q0ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6YWxsWWllbGQzKCksIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgX2luOjp1bnNhZmVDYXN0PHZvaWQ+KDpyZXN1bHQpOworICAgICAgfQorICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbiBkeW5hbWljIGNhdGNoKGR5bmFtaWMgZXhjZXB0aW9uLCBjb3JlOjpTdGFja1RyYWNlIHN0YWNrX3RyYWNlKSB7CisgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZXhjZXB0aW9uLCBzdGFja190cmFjZSk7CisgICAgfQorICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgOmFzeW5jX29wX3RoZW4gPSBhc3k6Ol9hc3luY1RoZW5XcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF9lcnJvciA9IGFzeTo6X2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07Cit9CitzdGF0aWMgbWV0aG9kIGFsbFlpZWxkMygpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKKyAgZmluYWwgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjx2b2lkPiA6YXN5bmNfY29tcGxldGVyID0gbmV3IGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OuKAojx2b2lkPigpOworICBGdXR1cmVPcjx2b2lkPj8gOnJldHVybl92YWx1ZTsKKyAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgIChkeW5hbWljKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgKGNvcmU6Ok9iamVjdCwgY29yZTo6U3RhY2tUcmFjZSkg4oaSIGR5bmFtaWMgOmFzeW5jX29wX2Vycm9yOworICBjb3JlOjppbnQgOmF3YWl0X2p1bXBfdmFyID0gMDsKKyAgZHluYW1pYyA6YXdhaXRfY3R4X3ZhcjsKKyAgZHluYW1pYyA6c2F2ZWRfdHJ5X2NvbnRleHRfdmFyMDsKKyAgZnVuY3Rpb24gOmFzeW5jX29wKFtkeW5hbWljIDpyZXN1bHQsIGR5bmFtaWMgOmV4Y2VwdGlvbiwgZHluYW1pYyA6c3RhY2tfdHJhY2VdKSDihpIgZHluYW1pYyB5aWVsZGluZyAKKyAgICB0cnkgeworICAgICAgI0wzOgorICAgICAgeworICAgICAgICBbeWllbGRdIGxldCBkeW5hbWljICN0NSA9IGFzeTo6X2F3YWl0SGVscGVyKDAsIDphc3luY19vcF90aGVuLCA6YXN5bmNfb3BfZXJyb3IsIDphc3luY19vcCkgaW4gbnVsbDsKKyAgICAgICAgX2luOjp1bnNhZmVDYXN0PGNvcmU6OmludD4oOnJlc3VsdCk7CisgICAgICAgIHNlbGY6OnRocm93U3luYygpOworICAgICAgfQorICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbiBkeW5hbWljIGNhdGNoKGR5bmFtaWMgZXhjZXB0aW9uLCBjb3JlOjpTdGFja1RyYWNlIHN0YWNrX3RyYWNlKSB7CisgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZXhjZXB0aW9uLCBzdGFja190cmFjZSk7CisgICAgfQorICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgOmFzeW5jX29wX3RoZW4gPSBhc3k6Ol9hc3luY1RoZW5XcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF9lcnJvciA9IGFzeTo6X2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07Cit9CitzdGF0aWMgbWV0aG9kIGN1c3RvbUVycm9yWm9uZSgpIOKGkiBhc3k6OkZ1dHVyZTx2b2lkPiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKKyAgZmluYWwgYXN5OjpfQXN5bmNBd2FpdENvbXBsZXRlcjx2b2lkPiA6YXN5bmNfY29tcGxldGVyID0gbmV3IGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OuKAojx2b2lkPigpOworICBGdXR1cmVPcjx2b2lkPj8gOnJldHVybl92YWx1ZTsKKyAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgIChkeW5hbWljKSDihpIgZHluYW1pYyA6YXN5bmNfb3BfdGhlbjsKKyAgKGNvcmU6Ok9iamVjdCwgY29yZTo6U3RhY2tUcmFjZSkg4oaSIGR5bmFtaWMgOmFzeW5jX29wX2Vycm9yOworICBjb3JlOjppbnQgOmF3YWl0X2p1bXBfdmFyID0gMDsKKyAgZHluYW1pYyA6YXdhaXRfY3R4X3ZhcjsKKyAgZnVuY3Rpb24gOmFzeW5jX29wKFtkeW5hbWljIDpyZXN1bHQsIGR5bmFtaWMgOmV4Y2VwdGlvbiwgZHluYW1pYyA6c3RhY2tfdHJhY2VdKSDihpIgZHluYW1pYyB5aWVsZGluZyAKKyAgICB0cnkgeworICAgICAgI0w0OgorICAgICAgeworICAgICAgICBmaW5hbCBhc3k6OkNvbXBsZXRlcjx2b2lkPiBjb21wbGV0ZXIgPSBhc3k6OkNvbXBsZXRlcjo64oCiPHZvaWQ+KCk7CisgICAgICAgIGFzeTo6cnVuWm9uZWRHdWFyZGVkPGFzeTo6RnV0dXJlPGNvcmU6Ok51bGw/Pj4oKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6Ok51bGw/PiAvKiBvcmlnaW5hbGx5IGFzeW5jICovIHsKKyAgICAgICAgICBmaW5hbCBhc3k6Ol9Bc3luY0F3YWl0Q29tcGxldGVyPGNvcmU6Ok51bGw/PiA6YXN5bmNfY29tcGxldGVyID0gbmV3IGFzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OuKAojxjb3JlOjpOdWxsPz4oKTsKKyAgICAgICAgICBGdXR1cmVPcjxjb3JlOjpOdWxsPz4/IDpyZXR1cm5fdmFsdWU7CisgICAgICAgICAgZHluYW1pYyA6YXN5bmNfc3RhY2tfdHJhY2U7CisgICAgICAgICAgKGR5bmFtaWMpIOKGkiBkeW5hbWljIDphc3luY19vcF90aGVuOworICAgICAgICAgIChjb3JlOjpPYmplY3QsIGNvcmU6OlN0YWNrVHJhY2UpIOKGkiBkeW5hbWljIDphc3luY19vcF9lcnJvcjsKKyAgICAgICAgICBjb3JlOjppbnQgOmF3YWl0X2p1bXBfdmFyID0gMDsKKyAgICAgICAgICBkeW5hbWljIDphd2FpdF9jdHhfdmFyOworICAgICAgICAgIGR5bmFtaWMgOnNhdmVkX3RyeV9jb250ZXh0X3ZhcjA7CisgICAgICAgICAgZnVuY3Rpb24gOmFzeW5jX29wKFtkeW5hbWljIDpyZXN1bHQsIGR5bmFtaWMgOmV4Y2VwdGlvbiwgZHluYW1pYyA6c3RhY2tfdHJhY2VdKSDihpIgZHluYW1pYyB5aWVsZGluZyAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICNMNToKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFt5aWVsZF0gbGV0IGR5bmFtaWMgI3Q2ID0gYXN5OjpfYXdhaXRIZWxwZXIoc2VsZjo6YWxsWWllbGQoKSwgOmFzeW5jX29wX3RoZW4sIDphc3luY19vcF9lcnJvciwgOmFzeW5jX29wKSBpbiBudWxsOworICAgICAgICAgICAgICAgIF9pbjo6dW5zYWZlQ2FzdDx2b2lkPig6cmVzdWx0KTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpjb21wbGV0ZX0obnVsbCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbiBkeW5hbWljIGNhdGNoKGR5bmFtaWMgZXhjZXB0aW9uLCBjb3JlOjpTdGFja1RyYWNlIHN0YWNrX3RyYWNlKSB7CisgICAgICAgICAgICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6Q29tcGxldGVyOjpjb21wbGV0ZUVycm9yfShleGNlcHRpb24sIHN0YWNrX3RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgICAgICAgICA6YXN5bmNfb3BfdGhlbiA9IGFzeTo6X2FzeW5jVGhlbldyYXBwZXJIZWxwZXIoOmFzeW5jX29wKTsKKyAgICAgICAgICA6YXN5bmNfb3BfZXJyb3IgPSBhc3k6Ol9hc3luY0Vycm9yV3JhcHBlckhlbHBlcig6YXN5bmNfb3ApOworICAgICAgICAgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICAgICAgICAgIHJldHVybiA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKKyAgICAgICAgfSwgKGNvcmU6Ok9iamVjdCBlLCBjb3JlOjpTdGFja1RyYWNlIHMpIOKGkiBjb3JlOjpOdWxsPyB7CisgICAgICAgICAgY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZSwgcyk7CisgICAgICAgIH0pOworICAgICAgICA6cmV0dXJuX3ZhbHVlID0gY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6ZnV0dXJlfTsKKyAgICAgICAgYnJlYWsgI0w0OworICAgICAgfQorICAgICAgYXN5OjpfY29tcGxldGVPbkFzeW5jUmV0dXJuKDphc3luY19jb21wbGV0ZXIsIDpyZXR1cm5fdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbiBkeW5hbWljIGNhdGNoKGR5bmFtaWMgZXhjZXB0aW9uLCBjb3JlOjpTdGFja1RyYWNlIHN0YWNrX3RyYWNlKSB7CisgICAgICA6YXN5bmNfY29tcGxldGVyLnthc3k6OkNvbXBsZXRlcjo6Y29tcGxldGVFcnJvcn0oZXhjZXB0aW9uLCBzdGFja190cmFjZSk7CisgICAgfQorICA6YXN5bmNfc3RhY2tfdHJhY2UgPSBhc3k6Ol9hc3luY1N0YWNrVHJhY2VIZWxwZXIoOmFzeW5jX29wKTsKKyAgOmFzeW5jX29wX3RoZW4gPSBhc3k6Ol9hc3luY1RoZW5XcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19vcF9lcnJvciA9IGFzeTo6X2FzeW5jRXJyb3JXcmFwcGVySGVscGVyKDphc3luY19vcCk7CisgIDphc3luY19jb21wbGV0ZXIue2FzeTo6X0FzeW5jQXdhaXRDb21wbGV0ZXI6OnN0YXJ0fSg6YXN5bmNfb3ApOworICByZXR1cm4gOmFzeW5jX2NvbXBsZXRlci57YXN5OjpDb21wbGV0ZXI6OmZ1dHVyZX07Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fbnVsbC5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fbnVsbC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGRiNWQ0YmNmLi4zZmM3Yzg2IDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3JldHVybl9udWxsLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9yZXR1cm5fbnVsbC5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0yMywyMyArMjMsMjMgQEAKICAgOwogc3RhdGljIG1ldGhvZCByZXR1cm5NaXhlZChjb3JlOjpib29sIGIpIOKGkiBjb3JlOjpTdHJpbmcKICAgOwotc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzEoKSDihpIgYXN5OjpGdXR1cmU8ZHluYW1pYz4KK3N0YXRpYyBtZXRob2QgcmV0dXJuQXN5bmMxKCkg4oaSIGFzeTo6RnV0dXJlPGR5bmFtaWM+IGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkFzeW5jMigpIOKGkiBGdXR1cmVPcjxkeW5hbWljPgorc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzIoKSDihpIgRnV0dXJlT3I8ZHluYW1pYz4gYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuQXN5bmMzKCkg4oaSIEZ1dHVyZU9yPGNvcmU6OmludD4KK3N0YXRpYyBtZXRob2QgcmV0dXJuQXN5bmMzKCkg4oaSIEZ1dHVyZU9yPGNvcmU6OmludD4gYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgcmV0dXJuQXN5bmM0KCkg4oaSIEZ1dHVyZU9yPGNvcmU6OmludD8+CitzdGF0aWMgbWV0aG9kIHJldHVybkFzeW5jNCgpIOKGkiBGdXR1cmVPcjxjb3JlOjppbnQ/PiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzUoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzUoKSDihpIgZHluYW1pYyBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzYoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Pz4KK3N0YXRpYyBtZXRob2QgcmV0dXJuQXN5bmM2KCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OmludD8+IGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHJldHVybkFzeW5jNygpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjppbnQ/Pgorc3RhdGljIG1ldGhvZCByZXR1cm5Bc3luYzcoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6aW50Pz4gYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgeWllbGRTeW5jKCkg4oaSIGNvcmU6Okl0ZXJhYmxlPGR5bmFtaWM+CitzdGF0aWMgbWV0aG9kIHlpZWxkU3luYygpIOKGkiBjb3JlOjpJdGVyYWJsZTxkeW5hbWljPiBzeW5jKiAKICAgOwotc3RhdGljIG1ldGhvZCB5aWVsZEFzeW5jKCkg4oaSIGFzeTo6U3RyZWFtPGR5bmFtaWM+CitzdGF0aWMgbWV0aG9kIHlpZWxkQXN5bmMoKSDihpIgYXN5OjpTdHJlYW08ZHluYW1pYz4gYXN5bmMqIAogICA7CiBzdGF0aWMgbWV0aG9kIGNhc2VSZXR1cm4xKHNlbGY6OkVudW0gZSkg4oaSIHNlbGY6OkVudW0KICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjE1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK21haW4oKSB7CisgIExpc3Q8aW50Pj8gbGlzdCA9IG51bGw7CisgIHByaW50KDxpbnQ+WzEsIDIsIC4uLj9saXN0LCAzXSk7CisgIHByaW50KDxpbnQ+WzEsIDIsIC4uLj9udWxsLCAzXSk7CisgIHZhciBsaXN0MSA9IFsuLi4/bGlzdF07CisgIHZhciBsaXN0MiA9IFsuLi4/bnVsbF07CisgIHZhciBsaXN0MyA9IFsxLCAyLCAuLi4/bGlzdCwgM107CisgIHZhciBsaXN0NCA9IFsxLCAyLCAuLi4/bnVsbCwgM107CisKKyAgU2V0PGludD4/IHNldCA9IG51bGw7CisgIHByaW50KDxpbnQ+ezEsIDIsIC4uLj9zZXQsIDN9KTsKKyAgcHJpbnQoPGludD57MSwgMiwgLi4uP251bGwsIDN9KTsKKyAgdmFyIHNldDEgPSB7Li4uP3NldH07CisgIHZhciBzZXQzID0gezEsIDIsIC4uLj9zZXQsIDN9OworICB2YXIgc2V0NCA9IHsxLCAyLCAuLi4/bnVsbCwgM307CisKKyAgTWFwPGludCwgaW50Pj8gbWFwID0gbnVsbDsKKyAgcHJpbnQoPGludCwgaW50PnsxOiAxLCAyOiAyLCAuLi4/bWFwLCAzOiAzfSk7CisgIHByaW50KDxpbnQsIGludD57MTogMSwgMjogMiwgLi4uP251bGwsIDM6IDN9KTsKKyAgdmFyIG1hcDEgPSB7Li4uP21hcH07CisgIHZhciBtYXAzID0gezE6IDEsIDI6IDIsIC4uLj9tYXAsIDM6IDN9OworICB2YXIgbWFwNCA9IHsxOiAxLCAyOiAyLCAuLi4/bnVsbCwgMzogM307Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQub3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYmE2YgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMCwwICsxLDUgQEAKK2xpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87CitpbXBvcnQgc2VsZiBhcyBzZWxmOworCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC5zdHJvbmcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQuc3Ryb25nLmV4cGVjdApAQCAtMCwwICsxLDE2MCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKK2ltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBhcyBjb2w7CisKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+PyBsaXN0ID0gbnVsbDsKKyAgY29yZTo6cHJpbnQoIGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpMaXN0PGNvcmU6OmludD4gI3QxID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxLntjb3JlOjpMaXN0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MiA9IGxpc3Q7CisgICAgaWYoISN0Mi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDMgaW4gI3Qye2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59KQorICAgICAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oI3QzKTsKKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDEpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDQgPSA8Y29yZTo6aW50PltdOworICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgxKTsKKyAgICAjdDQue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3Q1ID0gbnVsbDsKKyAgICBpZighI3Q1Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0NiBpbiAjdDV7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgjdDYpOworICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgzKTsKKyAgfSA9PiN0NCk7CisgIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiBsaXN0MSA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpMaXN0PGNvcmU6OmludD4gI3Q3ID0gPGNvcmU6OmludD5bXTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDggPSBsaXN0OworICAgIGlmKCEjdDgue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjppbnQgI3Q5IGluICN0OHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3Q3Lntjb3JlOjpMaXN0OjphZGR9KCN0OSk7CisgIH0gPT4jdDc7CisgIGNvcmU6Okxpc3Q8TmV2ZXI+IGxpc3QyID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8TmV2ZXI+ICN0MTAgPSA8TmV2ZXI+W107CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8TmV2ZXI+PyAjdDExID0gbnVsbDsKKyAgICBpZighI3QxMS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIE5ldmVyICN0MTIgaW4gI3QxMXtjb3JlOjpJdGVyYWJsZTxOZXZlcj59KQorICAgICAgICAjdDEwLntjb3JlOjpMaXN0OjphZGR9KCN0MTIpOworICB9ID0+I3QxMDsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+IGxpc3QzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDEzID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDEzLntjb3JlOjpMaXN0OjphZGR9KDEpOworICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QxNCA9IGxpc3Q7CisgICAgaWYoISN0MTQue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjppbnQgI3QxNSBpbiAjdDE0e2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59KQorICAgICAgICAjdDEzLntjb3JlOjpMaXN0OjphZGR9KCN0MTUpOworICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDEzOworICBjb3JlOjpMaXN0PGNvcmU6OmludD4gbGlzdDQgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0MTYgPSA8Y29yZTo6aW50PltdOworICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxNi57Y29yZTo6TGlzdDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDE3ID0gbnVsbDsKKyAgICBpZighI3QxNy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDE4IGluICN0MTd7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oI3QxOCk7CisgICAgI3QxNi57Y29yZTo6TGlzdDo6YWRkfSgzKTsKKyAgfSA9PiN0MTY7CisgIGNvcmU6OlNldDxjb3JlOjppbnQ+PyBzZXQgPSBudWxsOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MTkgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0MTkue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDIwID0gc2V0OworICAgIGlmKCEjdDIwLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MjEgaW4gI3QyMHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KCN0MjEpOworICAgICN0MTkue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0MTkpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MjIgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0MjIue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDIzID0gbnVsbDsKKyAgICBpZighI3QyMy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDI0IGluICN0MjN7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0MjIue2NvcmU6OlNldDo6YWRkfSgjdDI0KTsKKyAgICAjdDIyLntjb3JlOjpTZXQ6OmFkZH0oMyk7CisgIH0gPT4jdDIyKTsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4gc2V0MSA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDI1ID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGR5bmFtaWM+PyAjdDI2ID0gc2V0OworICAgIGlmKCEjdDI2Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgZHluYW1pYyAjdDI3IGluICN0MjZ7Y29yZTo6SXRlcmFibGU8ZHluYW1pYz59KSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDI4ID0gI3QyNyBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmludDsKKyAgICAgICAgI3QyNS57Y29yZTo6U2V0OjphZGR9KCN0MjgpOworICAgICAgfQorICB9ID0+I3QyNTsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4gc2V0MyA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDI5ID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgxKTsKKyAgICAjdDI5Lntjb3JlOjpTZXQ6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QzMCA9IHNldDsKKyAgICBpZighI3QzMC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDMxIGluICN0MzB7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgjdDMxKTsKKyAgICAjdDI5Lntjb3JlOjpTZXQ6OmFkZH0oMyk7CisgIH0gPT4jdDI5OworICBjb3JlOjpTZXQ8Y29yZTo6aW50PiBzZXQ0ID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MzIgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QzMi57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDMzID0gbnVsbDsKKyAgICBpZighI3QzMy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDM0IGluICN0MzN7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgjdDM0KTsKKyAgICAjdDMyLntjb3JlOjpTZXQ6OmFkZH0oMyk7CisgIH0gPT4jdDMyOworICBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyBtYXAgPSBudWxsOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3QzNSA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICAjdDM1Lntjb3JlOjpNYXA6OltdPX0oMSwgMSk7CisgICAgI3QzNS57Y29yZTo6TWFwOjpbXT19KDIsIDIpOworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0MzYgPSBtYXA7CisgICAgaWYoISN0MzYue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3QzNyBpbiAjdDM2e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9KQorICAgICAgICAjdDM1Lntjb3JlOjpNYXA6OltdPX0oI3QzNy57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0Mzcue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0MzUpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3QzOCA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMSwgMSk7CisgICAgI3QzOC57Y29yZTo6TWFwOjpbXT19KDIsIDIpOworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0MzkgPSBudWxsOworICAgIGlmKCEjdDM5Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDAgaW4gI3QzOXtjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfSkKKyAgICAgICAgI3QzOC57Y29yZTo6TWFwOjpbXT19KCN0NDAue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDQwLntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMywgMyk7CisgIH0gPT4jdDM4KTsKKyAgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiBtYXAxID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0MSA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDQyID0gbWFwOworICAgIGlmKCEjdDQyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDMgaW4gI3Q0Mntjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfSkKKyAgICAgICAgI3Q0MS57Y29yZTo6TWFwOjpbXT19KCN0NDMue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDQzLntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgfSA9PiN0NDE7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gbWFwMyA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDQgPSA8Y29yZTo6aW50LCBjb3JlOjppbnQ+e307CisgICAgI3Q0NC57Y29yZTo6TWFwOjpbXT19KDEsIDEpOworICAgICN0NDQue2NvcmU6Ok1hcDo6W109fSgyLCAyKTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDQ1ID0gbWFwOworICAgIGlmKCEjdDQ1Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDYgaW4gI3Q0NXtjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfSkKKyAgICAgICAgI3Q0NC57Y29yZTo6TWFwOjpbXT19KCN0NDYue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDQ2Lntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oMywgMyk7CisgIH0gPT4jdDQ0OworICBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+IG1hcDQgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ3ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDQ3Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3Q0OCA9IG51bGw7CisgICAgaWYoISN0NDgue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0OSBpbiAjdDQ4e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9KQorICAgICAgICAjdDQ3Lntjb3JlOjpNYXA6OltdPX0oI3Q0OS57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDkue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0NDc7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZmYzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDIyNSBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKK2ltcG9ydCAiZGFydDpjb2xsZWN0aW9uIiBhcyBjb2w7CisKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+PyBsaXN0ID0gbnVsbDsKKyAgY29yZTo6cHJpbnQoIGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpMaXN0PGNvcmU6OmludD4gI3QxID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxLntjb3JlOjpMaXN0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MiA9IGxpc3Q7CisgICAgaWYoISN0Mi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Qye2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0MyA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oI3QzKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QxLntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3QxKTsKKyAgY29yZTo6cHJpbnQoIGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpMaXN0PGNvcmU6OmludD4gI3Q0ID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDQue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3Q0Lntjb3JlOjpMaXN0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0NSA9IG51bGw7CisgICAgaWYoISN0NS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Q1e2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0NiA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDQue2NvcmU6Okxpc3Q6OmFkZH0oI3Q2KTsKKyAgICAgIH0KKyAgICB9CisgICAgI3Q0Lntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3Q0KTsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+IGxpc3QxID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDcgPSA8Y29yZTo6aW50PltdOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0OCA9IGxpc3Q7CisgICAgaWYoISN0OC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Q4e2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0OSA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDcue2NvcmU6Okxpc3Q6OmFkZH0oI3Q5KTsKKyAgICAgIH0KKyAgICB9CisgIH0gPT4jdDc7CisgIGNvcmU6Okxpc3Q8TmV2ZXI+IGxpc3QyID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8TmV2ZXI+ICN0MTAgPSA8TmV2ZXI+W107CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8TmV2ZXI+PyAjdDExID0gbnVsbDsKKyAgICBpZighI3QxMS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPE5ldmVyPiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDExe2NvcmU6Okl0ZXJhYmxlPE5ldmVyPn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBOZXZlciAjdDEyID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MTAue2NvcmU6Okxpc3Q6OmFkZH0oI3QxMik7CisgICAgICB9CisgICAgfQorICB9ID0+I3QxMDsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+IGxpc3QzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDEzID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDEzLntjb3JlOjpMaXN0OjphZGR9KDEpOworICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QxNCA9IGxpc3Q7CisgICAgaWYoISN0MTQue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjppbnQ+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MTR7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QxNSA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDEzLntjb3JlOjpMaXN0OjphZGR9KCN0MTUpOworICAgICAgfQorICAgIH0KKyAgICAjdDEzLntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3QxMzsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+IGxpc3Q0ID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDE2ID0gPGNvcmU6OmludD5bXTsKKyAgICAjdDE2Lntjb3JlOjpMaXN0OjphZGR9KDEpOworICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QxNyA9IG51bGw7CisgICAgaWYoISN0MTcue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjppbnQ+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MTd7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QxOCA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDE2Lntjb3JlOjpMaXN0OjphZGR9KCN0MTgpOworICAgICAgfQorICAgIH0KKyAgICAjdDE2Lntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3QxNjsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4/IHNldCA9IG51bGw7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QxOSA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICAjdDE5Lntjb3JlOjpTZXQ6OmFkZH0oMSk7CisgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MjAgPSBzZXQ7CisgICAgaWYoISN0MjAue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjppbnQ+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MjB7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QyMSA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDE5Lntjb3JlOjpTZXQ6OmFkZH0oI3QyMSk7CisgICAgICB9CisgICAgfQorICAgICN0MTkue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0MTkpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MjIgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0MjIue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDIzID0gbnVsbDsKKyAgICBpZighI3QyMy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QyM3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDI0ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MjIue2NvcmU6OlNldDo6YWRkfSgjdDI0KTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KDMpOworICB9ID0+I3QyMik7CisgIGNvcmU6OlNldDxjb3JlOjppbnQ+IHNldDEgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QyNSA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxkeW5hbWljPj8gI3QyNiA9IHNldDsKKyAgICBpZighI3QyNi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGR5bmFtaWM+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MjZ7Y29yZTo6SXRlcmFibGU8ZHluYW1pYz59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgZHluYW1pYyAjdDI3ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgIHsKKyAgICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QyOCA9ICN0MjcgYXN7VHlwZUVycm9yLEZvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjppbnQ7CisgICAgICAgICAgI3QyNS57Y29yZTo6U2V0OjphZGR9KCN0MjgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9ID0+I3QyNTsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4gc2V0MyA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDI5ID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgxKTsKKyAgICAjdDI5Lntjb3JlOjpTZXQ6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QzMCA9IHNldDsKKyAgICBpZighI3QzMC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QzMHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDMxID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgjdDMxKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QyOS57Y29yZTo6U2V0OjphZGR9KDMpOworICB9ID0+I3QyOTsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4gc2V0NCA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDMyID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgxKTsKKyAgICAjdDMyLntjb3JlOjpTZXQ6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QzMyA9IG51bGw7CisgICAgaWYoISN0MzMue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjppbnQ+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MzN7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QzNCA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDMyLntjb3JlOjpTZXQ6OmFkZH0oI3QzNCk7CisgICAgICB9CisgICAgfQorICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0MzI7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/IG1hcCA9IG51bGw7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM1ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDM1Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3QzNiA9IG1hcDsKKyAgICBpZighI3QzNi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50Pj4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QzNntjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM3ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgjdDM3Lntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3QzNy57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgICB9CisgICAgfQorICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0MzUpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3QzOCA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMSwgMSk7CisgICAgI3QzOC57Y29yZTo6TWFwOjpbXT19KDIsIDIpOworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0MzkgPSBudWxsOworICAgIGlmKCEjdDM5Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDM5e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDAgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3QzOC57Y29yZTo6TWFwOjpbXT19KCN0NDAue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDQwLntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QzOC57Y29yZTo6TWFwOjpbXT19KDMsIDMpOworICB9ID0+I3QzOCk7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gbWFwMSA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDEgPSA8Y29yZTo6aW50LCBjb3JlOjppbnQ+e307CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3Q0MiA9IG1hcDsKKyAgICBpZighI3Q0Mi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50Pj4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Q0Mntjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQzID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0NDEue2NvcmU6Ok1hcDo6W109fSgjdDQzLntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3Q0My57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgICB9CisgICAgfQorICB9ID0+I3Q0MTsKKyAgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiBtYXAzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0NCA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oMSwgMSk7CisgICAgI3Q0NC57Y29yZTo6TWFwOjpbXT19KDIsIDIpOworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0NDUgPSBtYXA7CisgICAgaWYoISN0NDUue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0NDV7Y29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pn0ue2NvcmU6Ok1hcDo6ZW50cmllc30ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0NiA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oI3Q0Ni57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDYue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICAgfQorICAgIH0KKyAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oMywgMyk7CisgIH0gPT4jdDQ0OworICBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+IG1hcDQgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ3ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDQ3Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3Q0OCA9IG51bGw7CisgICAgaWYoISN0NDgue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0NDh7Y29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pn0ue2NvcmU6Ok1hcDo6ZW50cmllc30ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0OSA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDQ3Lntjb3JlOjpNYXA6OltdPX0oI3Q0OS57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDkue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICAgfQorICAgIH0KKyAgICAjdDQ3Lntjb3JlOjpNYXA6OltdPX0oMywgMyk7CisgIH0gPT4jdDQ3OworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU4OTVhCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSBAQAorbWFpbigpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC50ZXh0dWFsX291dGxpbmVfbW9kZWxsZWQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTg5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3NwcmVhZF9pZl9udWxsLmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApAQCAtMCwwICsxIEBACittYWluKCkge30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC53ZWFrLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDYxMmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0LndlYWsuZXhwZWN0CkBAIC0wLDAgKzEsMTYwIEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIGFzIGNvbDsKKworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgeworICBjb3JlOjpMaXN0PGNvcmU6OmludD4/IGxpc3QgPSBudWxsOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDEgPSA8Y29yZTo6aW50PltdOworICAgICN0MS57Y29yZTo6TGlzdDo6YWRkfSgxKTsKKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QyID0gbGlzdDsKKyAgICBpZighI3QyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MyBpbiAjdDJ7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0MS57Y29yZTo6TGlzdDo6YWRkfSgjdDMpOworICAgICN0MS57Y29yZTo6TGlzdDo6YWRkfSgzKTsKKyAgfSA9PiN0MSk7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0NCA9IDxjb3JlOjppbnQ+W107CisgICAgI3Q0Lntjb3JlOjpMaXN0OjphZGR9KDEpOworICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDUgPSBudWxsOworICAgIGlmKCEjdDUue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjppbnQgI3Q2IGluICN0NXtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3Q0Lntjb3JlOjpMaXN0OjphZGR9KCN0Nik7CisgICAgI3Q0Lntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3Q0KTsKKyAgY29yZTo6TGlzdDxjb3JlOjppbnQ+IGxpc3QxID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDcgPSA8Y29yZTo6aW50PltdOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0OCA9IGxpc3Q7CisgICAgaWYoISN0OC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDkgaW4gI3Q4e2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59KQorICAgICAgICAjdDcue2NvcmU6Okxpc3Q6OmFkZH0oI3Q5KTsKKyAgfSA9PiN0NzsKKyAgY29yZTo6TGlzdDxOZXZlcj4gbGlzdDIgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxOZXZlcj4gI3QxMCA9IDxOZXZlcj5bXTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxOZXZlcj4/ICN0MTEgPSBudWxsOworICAgIGlmKCEjdDExLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgTmV2ZXIgI3QxMiBpbiAjdDExe2NvcmU6Okl0ZXJhYmxlPE5ldmVyPn0pCisgICAgICAgICN0MTAue2NvcmU6Okxpc3Q6OmFkZH0oI3QxMik7CisgIH0gPT4jdDEwOworICBjb3JlOjpMaXN0PGNvcmU6OmludD4gbGlzdDMgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0MTMgPSA8Y29yZTo6aW50PltdOworICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxMy57Y29yZTo6TGlzdDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDE0ID0gbGlzdDsKKyAgICBpZighI3QxNC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6OmludCAjdDE1IGluICN0MTR7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0pCisgICAgICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oI3QxNSk7CisgICAgI3QxMy57Y29yZTo6TGlzdDo6YWRkfSgzKTsKKyAgfSA9PiN0MTM7CisgIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiBsaXN0NCA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpMaXN0PGNvcmU6OmludD4gI3QxNiA9IDxjb3JlOjppbnQ+W107CisgICAgI3QxNi57Y29yZTo6TGlzdDo6YWRkfSgxKTsKKyAgICAjdDE2Lntjb3JlOjpMaXN0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MTcgPSBudWxsOworICAgIGlmKCEjdDE3Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MTggaW4gI3QxN3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3QxNi57Y29yZTo6TGlzdDo6YWRkfSgjdDE4KTsKKyAgICAjdDE2Lntjb3JlOjpMaXN0OjphZGR9KDMpOworICB9ID0+I3QxNjsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4/IHNldCA9IG51bGw7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QxOSA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICAjdDE5Lntjb3JlOjpTZXQ6OmFkZH0oMSk7CisgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MjAgPSBzZXQ7CisgICAgaWYoISN0MjAue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjppbnQgI3QyMSBpbiAjdDIwe2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59KQorICAgICAgICAjdDE5Lntjb3JlOjpTZXQ6OmFkZH0oI3QyMSk7CisgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KDMpOworICB9ID0+I3QxOSk7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QyMiA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICAjdDIyLntjb3JlOjpTZXQ6OmFkZH0oMSk7CisgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MjMgPSBudWxsOworICAgIGlmKCEjdDIzLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MjQgaW4gI3QyM3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KCN0MjQpOworICAgICN0MjIue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0MjIpOworICBjb3JlOjpTZXQ8Y29yZTo6aW50PiBzZXQxID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MjUgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8ZHluYW1pYz4/ICN0MjYgPSBzZXQ7CisgICAgaWYoISN0MjYue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBkeW5hbWljICN0MjcgaW4gI3QyNntjb3JlOjpJdGVyYWJsZTxkeW5hbWljPn0pIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0MjggPSAjdDI3IGFze1R5cGVFcnJvcixGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6aW50OworICAgICAgICAjdDI1Lntjb3JlOjpTZXQ6OmFkZH0oI3QyOCk7CisgICAgICB9CisgIH0gPT4jdDI1OworICBjb3JlOjpTZXQ8Y29yZTo6aW50PiBzZXQzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MjkgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QyOS57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDMwID0gc2V0OworICAgIGlmKCEjdDMwLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MzEgaW4gI3QzMHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3QyOS57Y29yZTo6U2V0OjphZGR9KCN0MzEpOworICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0Mjk7CisgIGNvcmU6OlNldDxjb3JlOjppbnQ+IHNldDQgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QzMiA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICAjdDMyLntjb3JlOjpTZXQ6OmFkZH0oMSk7CisgICAgI3QzMi57Y29yZTo6U2V0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MzMgPSBudWxsOworICAgIGlmKCEjdDMzLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkKKyAgICAgIGZvciAoZmluYWwgY29yZTo6aW50ICN0MzQgaW4gI3QzM3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fSkKKyAgICAgICAgI3QzMi57Y29yZTo6U2V0OjphZGR9KCN0MzQpOworICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgzKTsKKyAgfSA9PiN0MzI7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/IG1hcCA9IG51bGw7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM1ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDM1Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3QzNiA9IG1hcDsKKyAgICBpZighI3QzNi57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM3IGluICN0MzZ7Y29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pn0ue2NvcmU6Ok1hcDo6ZW50cmllc30pCisgICAgICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgjdDM3Lntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3QzNy57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgI3QzNS57Y29yZTo6TWFwOjpbXT19KDMsIDMpOworICB9ID0+I3QzNSk7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM4ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0Mzgue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3QzOSA9IG51bGw7CisgICAgaWYoISN0Mzkue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0MCBpbiAjdDM5e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9KQorICAgICAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oI3Q0MC57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDAue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICN0Mzgue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0MzgpOworICBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+IG1hcDEgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQxID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0NDIgPSBtYXA7CisgICAgaWYoISN0NDIue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0MyBpbiAjdDQye2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9KQorICAgICAgICAjdDQxLntjb3JlOjpNYXA6OltdPX0oI3Q0My57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDMue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICB9ID0+I3Q0MTsKKyAgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiBtYXAzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0NCA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oMSwgMSk7CisgICAgI3Q0NC57Y29yZTo6TWFwOjpbXT19KDIsIDIpOworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4/ICN0NDUgPSBtYXA7CisgICAgaWYoISN0NDUue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKQorICAgICAgZm9yIChmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0NiBpbiAjdDQ1e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9KQorICAgICAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oI3Q0Ni57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDYue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICN0NDQue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0NDQ7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gbWFwNCA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDcgPSA8Y29yZTo6aW50LCBjb3JlOjppbnQ+e307CisgICAgI3Q0Ny57Y29yZTo6TWFwOjpbXT19KDEsIDEpOworICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgyLCAyKTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDQ4ID0gbnVsbDsKKyAgICBpZighI3Q0OC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpCisgICAgICBmb3IgKGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ5IGluICN0NDh7Y29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pn0ue2NvcmU6Ok1hcDo6ZW50cmllc30pCisgICAgICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgjdDQ5Lntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3Q0OS57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgI3Q0Ny57Y29yZTo6TWFwOjpbXT19KDMsIDMpOworICB9ID0+I3Q0NzsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3ByZWFkX2lmX251bGwuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGZmM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zcHJlYWRfaWZfbnVsbC5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CkBAIC0wLDAgKzEsMjI1IEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworaW1wb3J0ICJkYXJ0OmNvbGxlY3Rpb24iIGFzIGNvbDsKKworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgeworICBjb3JlOjpMaXN0PGNvcmU6OmludD4/IGxpc3QgPSBudWxsOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDEgPSA8Y29yZTo6aW50PltdOworICAgICN0MS57Y29yZTo6TGlzdDo6YWRkfSgxKTsKKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QyID0gbGlzdDsKKyAgICBpZighI3QyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6aW50PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDJ7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3QzID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MS57Y29yZTo6TGlzdDo6YWRkfSgjdDMpOworICAgICAgfQorICAgIH0KKyAgICAjdDEue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDEpOworICBjb3JlOjpwcmludCggYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Okxpc3Q8Y29yZTo6aW50PiAjdDQgPSA8Y29yZTo6aW50PltdOworICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgxKTsKKyAgICAjdDQue2NvcmU6Okxpc3Q6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3Q1ID0gbnVsbDsKKyAgICBpZighI3Q1Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6aW50PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDV7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3Q2ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0NC57Y29yZTo6TGlzdDo6YWRkfSgjdDYpOworICAgICAgfQorICAgIH0KKyAgICAjdDQue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDQpOworICBjb3JlOjpMaXN0PGNvcmU6OmludD4gbGlzdDEgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0NyA9IDxjb3JlOjppbnQ+W107CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3Q4ID0gbGlzdDsKKyAgICBpZighI3Q4Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6aW50PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDh7Y29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjppbnQgI3Q5ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0Ny57Y29yZTo6TGlzdDo6YWRkfSgjdDkpOworICAgICAgfQorICAgIH0KKyAgfSA9PiN0NzsKKyAgY29yZTo6TGlzdDxOZXZlcj4gbGlzdDIgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxOZXZlcj4gI3QxMCA9IDxOZXZlcj5bXTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxOZXZlcj4/ICN0MTEgPSBudWxsOworICAgIGlmKCEjdDExLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8TmV2ZXI+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0MTF7Y29yZTo6SXRlcmFibGU8TmV2ZXI+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIE5ldmVyICN0MTIgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3QxMC57Y29yZTo6TGlzdDo6YWRkfSgjdDEyKTsKKyAgICAgIH0KKyAgICB9CisgIH0gPT4jdDEwOworICBjb3JlOjpMaXN0PGNvcmU6OmludD4gbGlzdDMgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0MTMgPSA8Y29yZTo6aW50PltdOworICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxMy57Y29yZTo6TGlzdDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDE0ID0gbGlzdDsKKyAgICBpZighI3QxNC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QxNHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDE1ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oI3QxNSk7CisgICAgICB9CisgICAgfQorICAgICN0MTMue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDEzOworICBjb3JlOjpMaXN0PGNvcmU6OmludD4gbGlzdDQgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TGlzdDxjb3JlOjppbnQ+ICN0MTYgPSA8Y29yZTo6aW50PltdOworICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oMSk7CisgICAgI3QxNi57Y29yZTo6TGlzdDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDE3ID0gbnVsbDsKKyAgICBpZighI3QxNy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QxN3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDE4ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oI3QxOCk7CisgICAgICB9CisgICAgfQorICAgICN0MTYue2NvcmU6Okxpc3Q6OmFkZH0oMyk7CisgIH0gPT4jdDE2OworICBjb3JlOjpTZXQ8Y29yZTo6aW50Pj8gc2V0ID0gbnVsbDsKKyAgY29yZTo6cHJpbnQoIGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDE5ID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgICN0MTkue2NvcmU6OlNldDo6YWRkfSgxKTsKKyAgICAjdDE5Lntjb3JlOjpTZXQ6OmFkZH0oMik7CisgICAgZmluYWwgY29yZTo6SXRlcmFibGU8Y29yZTo6aW50Pj8gI3QyMCA9IHNldDsKKyAgICBpZighI3QyMC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QyMHtjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDIxID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MTkue2NvcmU6OlNldDo6YWRkfSgjdDIxKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QxOS57Y29yZTo6U2V0OjphZGR9KDMpOworICB9ID0+I3QxOSk7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6U2V0PGNvcmU6OmludD4gI3QyMiA9IGNvbDo6TGlua2VkSGFzaFNldDo64oCiPGNvcmU6OmludD4oKTsKKyAgICAjdDIyLntjb3JlOjpTZXQ6OmFkZH0oMSk7CisgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KDIpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD4/ICN0MjMgPSBudWxsOworICAgIGlmKCEjdDIzLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6aW50PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDIze2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0MjQgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3QyMi57Y29yZTo6U2V0OjphZGR9KCN0MjQpOworICAgICAgfQorICAgIH0KKyAgICAjdDIyLntjb3JlOjpTZXQ6OmFkZH0oMyk7CisgIH0gPT4jdDIyKTsKKyAgY29yZTo6U2V0PGNvcmU6OmludD4gc2V0MSA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpTZXQ8Y29yZTo6aW50PiAjdDI1ID0gY29sOjpMaW5rZWRIYXNoU2V0OjrigKI8Y29yZTo6aW50PigpOworICAgIGZpbmFsIGNvcmU6Okl0ZXJhYmxlPGR5bmFtaWM+PyAjdDI2ID0gc2V0OworICAgIGlmKCEjdDI2Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8ZHluYW1pYz4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QyNntjb3JlOjpJdGVyYWJsZTxkeW5hbWljPn0ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBkeW5hbWljICN0MjcgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgeworICAgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDI4ID0gI3QyNyBhc3tUeXBlRXJyb3IsRm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmludDsKKyAgICAgICAgICAjdDI1Lntjb3JlOjpTZXQ6OmFkZH0oI3QyOCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gPT4jdDI1OworICBjb3JlOjpTZXQ8Y29yZTo6aW50PiBzZXQzID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MjkgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QyOS57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0Mjkue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDMwID0gc2V0OworICAgIGlmKCEjdDMwLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6aW50PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDMwe2NvcmU6Okl0ZXJhYmxlPGNvcmU6OmludD59Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6aW50ICN0MzEgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3QyOS57Y29yZTo6U2V0OjphZGR9KCN0MzEpOworICAgICAgfQorICAgIH0KKyAgICAjdDI5Lntjb3JlOjpTZXQ6OmFkZH0oMyk7CisgIH0gPT4jdDI5OworICBjb3JlOjpTZXQ8Y29yZTo6aW50PiBzZXQ0ID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6OlNldDxjb3JlOjppbnQ+ICN0MzIgPSBjb2w6OkxpbmtlZEhhc2hTZXQ6OuKAojxjb3JlOjppbnQ+KCk7CisgICAgI3QzMi57Y29yZTo6U2V0OjphZGR9KDEpOworICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgyKTsKKyAgICBmaW5hbCBjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+PyAjdDMzID0gbnVsbDsKKyAgICBpZighI3QzMy57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6OmludD4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3QzM3tjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQ+fS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6OmludCAjdDM0ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0MzIue2NvcmU6OlNldDo6YWRkfSgjdDM0KTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QzMi57Y29yZTo6U2V0OjphZGR9KDMpOworICB9ID0+I3QzMjsKKyAgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gbWFwID0gbnVsbDsKKyAgY29yZTo6cHJpbnQoIGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0MzUgPSA8Y29yZTo6aW50LCBjb3JlOjppbnQ+e307CisgICAgI3QzNS57Y29yZTo6TWFwOjpbXT19KDEsIDEpOworICAgICN0MzUue2NvcmU6Ok1hcDo6W109fSgyLCAyKTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDM2ID0gbWFwOworICAgIGlmKCEjdDM2Lntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDM2e2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0MzcgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3QzNS57Y29yZTo6TWFwOjpbXT19KCN0Mzcue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDM3Lntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgICAgIH0KKyAgICB9CisgICAgI3QzNS57Y29yZTo6TWFwOjpbXT19KDMsIDMpOworICB9ID0+I3QzNSk7CisgIGNvcmU6OnByaW50KCBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDM4ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0Mzgue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3QzOSA9IG51bGw7CisgICAgaWYoISN0Mzkue2NvcmU6Ok9iamVjdDo6PT19KG51bGwpKSB7CisgICAgICBjb3JlOjpJdGVyYXRvcjxjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4+IDpzeW5jLWZvci1pdGVyYXRvciA9ICN0Mzl7Y29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pn0ue2NvcmU6Ok1hcDo6ZW50cmllc30ue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgICBmb3IgKDsgOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgICBmaW5hbCBjb3JlOjpNYXBFbnRyeTxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0MCA9IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oI3Q0MC57Y29yZTo6TWFwRW50cnk6OmtleX0sICN0NDAue2NvcmU6Ok1hcEVudHJ5Ojp2YWx1ZX0pOworICAgICAgfQorICAgIH0KKyAgICAjdDM4Lntjb3JlOjpNYXA6OltdPX0oMywgMyk7CisgIH0gPT4jdDM4KTsKKyAgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiBtYXAxID0gYmxvY2sgeworICAgIGZpbmFsIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gI3Q0MSA9IDxjb3JlOjppbnQsIGNvcmU6OmludD57fTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDQyID0gbWFwOworICAgIGlmKCEjdDQyLntjb3JlOjpPYmplY3Q6Oj09fShudWxsKSkgeworICAgICAgY29yZTo6SXRlcmF0b3I8Y29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+PiA6c3luYy1mb3ItaXRlcmF0b3IgPSAjdDQye2NvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD59Lntjb3JlOjpNYXA6OmVudHJpZXN9Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgICAgZm9yICg7IDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgICAgZmluYWwgY29yZTo6TWFwRW50cnk8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDMgPSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgICAgI3Q0MS57Y29yZTo6TWFwOjpbXT19KCN0NDMue2NvcmU6Ok1hcEVudHJ5OjprZXl9LCAjdDQzLntjb3JlOjpNYXBFbnRyeTo6dmFsdWV9KTsKKyAgICAgIH0KKyAgICB9CisgIH0gPT4jdDQxOworICBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+IG1hcDMgPSBibG9jayB7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ0ID0gPGNvcmU6OmludCwgY29yZTo6aW50Pnt9OworICAgICN0NDQue2NvcmU6Ok1hcDo6W109fSgxLCAxKTsKKyAgICAjdDQ0Lntjb3JlOjpNYXA6OltdPX0oMiwgMik7CisgICAgZmluYWwgY29yZTo6TWFwPGNvcmU6OmludCwgY29yZTo6aW50Pj8gI3Q0NSA9IG1hcDsKKyAgICBpZighI3Q0NS57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50Pj4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Q0NXtjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ2ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0NDQue2NvcmU6Ok1hcDo6W109fSgjdDQ2Lntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3Q0Ni57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgICB9CisgICAgfQorICAgICN0NDQue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0NDQ7CisgIGNvcmU6Ok1hcDxjb3JlOjppbnQsIGNvcmU6OmludD4gbWFwNCA9IGJsb2NrIHsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+ICN0NDcgPSA8Y29yZTo6aW50LCBjb3JlOjppbnQ+e307CisgICAgI3Q0Ny57Y29yZTo6TWFwOjpbXT19KDEsIDEpOworICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgyLCAyKTsKKyAgICBmaW5hbCBjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+PyAjdDQ4ID0gbnVsbDsKKyAgICBpZighI3Q0OC57Y29yZTo6T2JqZWN0Ojo9PX0obnVsbCkpIHsKKyAgICAgIGNvcmU6Okl0ZXJhdG9yPGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50Pj4gOnN5bmMtZm9yLWl0ZXJhdG9yID0gI3Q0OHtjb3JlOjpNYXA8Y29yZTo6aW50LCBjb3JlOjppbnQ+fS57Y29yZTo6TWFwOjplbnRyaWVzfS57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICAgIGZvciAoOyA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICAgIGZpbmFsIGNvcmU6Ok1hcEVudHJ5PGNvcmU6OmludCwgY29yZTo6aW50PiAjdDQ5ID0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgjdDQ5Lntjb3JlOjpNYXBFbnRyeTo6a2V5fSwgI3Q0OS57Y29yZTo6TWFwRW50cnk6OnZhbHVlfSk7CisgICAgICB9CisgICAgfQorICAgICN0NDcue2NvcmU6Ok1hcDo6W109fSgzLCAzKTsKKyAgfSA9PiN0NDc7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0Lm91dGxpbmUuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjRjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMCwwICsxLDE4IEBACisvLworLy8gUHJvYmxlbXMgaW4gY29tcG9uZW50OgorLy8KKy8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydDogRXJyb3I6IEEgbGlicmFyeSBjYW4ndCBvcHQgb3V0IG9mIG51bGwgc2FmZXR5IGJ5IGRlZmF1bHQsIHdoZW4gdXNpbmcgc291bmQgbnVsbCBzYWZldHkuCisvLworbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CisKK2ltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3N0cm9uZ19saWIuZGFydCI7CisKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCisgIDsKKworbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHNlbGYyOworCitzdGF0aWMgbWV0aG9kIGZvbygpIOKGkiB2b2lkCisgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LnN0cm9uZy5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5zdHJvbmcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5zdHJvbmcuZXhwZWN0CkBAIC0wLDAgKzEsMjIgQEAKKy8vCisvLyBQcm9ibGVtcyBpbiBjb21wb25lbnQ6CisvLworLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0OiBFcnJvcjogQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2YgbnVsbCBzYWZldHkgYnkgZGVmYXVsdCwgd2hlbiB1c2luZyBzb3VuZCBudWxsIHNhZmV0eS4KKy8vCitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAic3Ryb25nX2xpYi5kYXJ0IiBhcyBzdHI7CisKK2ltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3N0cm9uZ19saWIuZGFydCI7CisKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHsKKyAgc3RyOjpmb28oKTsKK30KKworbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHN0cjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitzdGF0aWMgbWV0aG9kIGZvbygpIOKGkiB2b2lkIHsKKyAgY29yZTo6cHJpbnQoImhlbGxvIik7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY0ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDIyIEBACisvLworLy8gUHJvYmxlbXMgaW4gY29tcG9uZW50OgorLy8KKy8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydDogRXJyb3I6IEEgbGlicmFyeSBjYW4ndCBvcHQgb3V0IG9mIG51bGwgc2FmZXR5IGJ5IGRlZmF1bHQsIHdoZW4gdXNpbmcgc291bmQgbnVsbCBzYWZldHkuCisvLworbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgInN0cm9uZ19saWIuZGFydCIgYXMgc3RyOworCitpbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zdHJvbmdfbGliLmRhcnQiOworCitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7CisgIHN0cjo6Zm9vKCk7Cit9CisKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyBzdHI7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworc3RhdGljIG1ldGhvZCBmb28oKSDihpIgdm9pZCB7CisgIGNvcmU6OnByaW50KCJoZWxsbyIpOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LndlYWsuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQud2Vhay5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC53ZWFrLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQud2Vhay5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQub3V0bGluZS5leHBlY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDE2NjEuLjAwMDAwMDAKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8KLS8vIFByb2JsZW1zIGluIGNvbXBvbmVudDoKLS8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQ6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgotLy8KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBzZWxmOwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zdHJvbmdfbGliLmRhcnQiOwotCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYwotICA7Ci0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmMjsKLQotc3RhdGljIG1ldGhvZCBmb28oKSDihpIgdm9pZAotICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC5zdHJvbmcuZXhwZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjc2YzAwLi4wMDAwMDAwCi0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC5zdHJvbmcuZXhwZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8KLS8vIFByb2JsZW1zIGluIGNvbXBvbmVudDoKLS8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQ6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgotLy8KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBzZWxmOwotaW1wb3J0ICJzdHJvbmdfbGliLmRhcnQiIGFzIHN0cjsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc3Ryb25nX2xpYi5kYXJ0IjsKLQotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgewotICBzdHI6OmZvbygpOwotfQotCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc3RyOwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci0KLXN0YXRpYyBtZXRob2QgZm9vKCkg4oaSIHZvaWQgewotICBjb3JlOjpwcmludCgiaGVsbG8iKTsKLX0KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzZjMDAuLjAwMDAwMDAKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLwotLy8gUHJvYmxlbXMgaW4gY29tcG9uZW50OgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydDogRXJyb3I6IEEgbGlicmFyeSBjYW4ndCBvcHQgb3V0IG9mIG5vbi1udWxsYWJsZSBieSBkZWZhdWx0LCB3aGVuIGluIG5uYmQtc3Ryb25nIG1vZGUuCi0vLwotbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKLWltcG9ydCBzZWxmIGFzIHNlbGY7Ci1pbXBvcnQgInN0cm9uZ19saWIuZGFydCIgYXMgc3RyOwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zdHJvbmdfbGliLmRhcnQiOwotCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7Ci0gIHN0cjo6Zm9vKCk7Ci19Ci0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzdHI7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLQotc3RhdGljIG1ldGhvZCBmb28oKSDihpIgdm9pZCB7Ci0gIGNvcmU6OnByaW50KCJoZWxsbyIpOwotfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmcuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9zb3VyY2Uvc3Ryb25nLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggOTM5OWM3MC4uN2ExNzBmOCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmcuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZy5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xMCw3ICsxMCw3IEBACiAvLwogLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZ19saWIuZGFydDoxOjE6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgorLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmdfbGliLmRhcnQ6MToxOiBFcnJvcjogQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2YgbnVsbCBzYWZldHkgYnkgZGVmYXVsdCwgd2hlbiB1c2luZyBzb3VuZCBudWxsIHNhZmV0eS4KIC8vIC8vIEBkYXJ0ID0gMi43CiAvLyBeXl5eXl5eXl5eXl5eXgogLy8KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9zb3VyY2Uvc3Ryb25nLmRhcnQuc3Ryb25nLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9zb3VyY2Uvc3Ryb25nLmRhcnQuc3Ryb25nLmV4cGVjdAppbmRleCA3ZmU2MTU3Li43MDE5MjdkIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZy5kYXJ0LnN0cm9uZy5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmcuZGFydC5zdHJvbmcuZXhwZWN0CkBAIC0xMiw3ICsxMiw3IEBACiAvLwogLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZ19saWIuZGFydDoxOjE6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgorLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmdfbGliLmRhcnQ6MToxOiBFcnJvcjogQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2YgbnVsbCBzYWZldHkgYnkgZGVmYXVsdCwgd2hlbiB1c2luZyBzb3VuZCBudWxsIHNhZmV0eS4KIC8vIC8vIEBkYXJ0ID0gMi43CiAvLyBeXl5eXl5eXl5eXl5eXgogLy8KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9zb3VyY2Uvc3Ryb25nLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX2xpYl9ub3Rfb2tfZnJvbV9zb3VyY2Uvc3Ryb25nLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdAppbmRleCA3ZmU2MTU3Li43MDE5MjdkIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZy5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmcuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CkBAIC0xMiw3ICsxMiw3IEBACiAvLwogLy8gUHJvYmxlbXMgaW4gbGlicmFyeToKIC8vCi0vLyBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19saWJfbm90X29rX2Zyb21fc291cmNlL3N0cm9uZ19saWIuZGFydDoxOjE6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgorLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfbGliX25vdF9va19mcm9tX3NvdXJjZS9zdHJvbmdfbGliLmRhcnQ6MToxOiBFcnJvcjogQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2YgbnVsbCBzYWZldHkgYnkgZGVmYXVsdCwgd2hlbiB1c2luZyBzb3VuZCBudWxsIHNhZmV0eS4KIC8vIC8vIEBkYXJ0ID0gMi43CiAvLyBeXl5eXl5eXl5eXl5eXgogLy8KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQub3V0bGluZS5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQub3V0bGluZS5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5vdXRsaW5lLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfb2tfZnJvbV9kaWxsL3N0cm9uZ19saWIuZGFydC5zdHJvbmcuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LnN0cm9uZy5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQuc3Ryb25nLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LnN0cm9uZy5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQuc3Ryb25nLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LnN0cm9uZy50cmFuc2Zvcm1lZC5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC5zdHJvbmcudHJhbnNmb3JtZWQuZXhwZWN0CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LndlYWsuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZC9zdHJvbmdfb2tfZnJvbV9kaWxsL3N0cm9uZy5kYXJ0LndlYWsuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nX2xpYi5kYXJ0LndlYWsuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQud2Vhay5leHBlY3QKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkL3N0cm9uZ19va19mcm9tX2RpbGwvc3Ryb25nLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmdfbGliLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKcmVuYW1lIHRvIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmQvc3Ryb25nX29rX2Zyb21fZGlsbC9zdHJvbmcuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTJfbGliLmRhcnQud2Vhay5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDA1MTIvaXNzdWU0MDUxMi5kYXJ0LndlYWsuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDA1MTIvaXNzdWU0MDUxMl9saWIuZGFydC53ZWFrLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTIuZGFydC53ZWFrLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTJfbGliLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDA1MTIvaXNzdWU0MDUxMi5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDA1MTIvaXNzdWU0MDUxMl9saWIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApyZW5hbWUgdG8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTJfbGliLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDA1MTIvaXNzdWU0MDUxMl9saWIuZGFydC5vdXRsaW5lLmV4cGVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3ODIyZTMuLjAwMDAwMDAKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTJfbGliLmRhcnQub3V0bGluZS5leHBlY3QKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLwotLy8gUHJvYmxlbXMgaW4gY29tcG9uZW50OgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MDUxMi9pc3N1ZTQwNTEyX2xpYi5kYXJ0OiBFcnJvcjogQSBsaWJyYXJ5IGNhbid0IG9wdCBvdXQgb2Ygbm9uLW51bGxhYmxlIGJ5IGRlZmF1bHQsIHdoZW4gaW4gbm5iZC1zdHJvbmcgbW9kZS4KLS8vCi1saWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOwotLy8KLS8vIFByb2JsZW1zIGluIGxpYnJhcnk6Ci0vLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQwNTEyL2lzc3VlNDA1MTIuZGFydDo1OjE6IEVycm9yOiBBIGxpYnJhcnkgY2FuJ3Qgb3B0IG91dCBvZiBub24tbnVsbGFibGUgYnkgZGVmYXVsdCwgd2hlbiBpbiBubmJkLXN0cm9uZyBtb2RlLgotLy8gLy8gQGRhcnQgPSAyLjYKLS8vIF5eXl5eXl5eXl5eXl5eCi0vLwotaW1wb3J0IHNlbGYgYXMgc2VsZjsKLWltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwotaW1wb3J0ICJpc3N1ZTQwNTEyX2xpYi5kYXJ0IiBhcyBiYXoyOwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9pc3N1ZTQwNTEyX2xpYi5kYXJ0IjsKLQotYWJzdHJhY3QgY2xhc3MgX0MmT2JqZWN0JkEgPSBjb3JlOjpPYmplY3Qgd2l0aCBiYXoyOjpBIC8qaXNBbm9ueW1vdXNNaXhpbixoYXNDb25zdENvbnN0cnVjdG9yKi8gIHsKLSAgY29uc3Qgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpfQyZPYmplY3QmQQotICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQotICAgIDsKLX0KLWFic3RyYWN0IGNsYXNzIF9DJk9iamVjdCZBJkIgPSBzZWxmOjpfQyZPYmplY3QmQSB3aXRoIGJhejI6OkIgLyppc0Fub255bW91c01peGluLGhhc0NvbnN0Q29uc3RydWN0b3IqLyAgewotICBjb25zdCBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6Ol9DJk9iamVjdCZBJkIKLSAgICA6IHN1cGVyIHNlbGY6Ol9DJk9iamVjdCZBOjrigKIoKQotICAgIDsKLSAgYWJzdHJhY3QgZm9yd2FyZGluZy1zdHViIG1ldGhvZCB0b1N0cmluZyh7Y29yZTo6U3RyaW5nKiBzfSkg4oaSIGNvcmU6OlN0cmluZyo7Ci19Ci1jbGFzcyBDIGV4dGVuZHMgc2VsZjo6X0MmT2JqZWN0JkEmQiB7Ci0gIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QwotICAgIDsKLSAgYWJzdHJhY3QgZm9yd2FyZGluZy1zdHViIG1ldGhvZCB0b1N0cmluZyh7Y29yZTo6U3RyaW5nKiBzfSkg4oaSIGNvcmU6OlN0cmluZyo7Ci19Ci1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgdm9pZAotICA7Ci0KLWxpYnJhcnkgYmF6MjsKLWltcG9ydCBzZWxmIGFzIGJhejI7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLQotYWJzdHJhY3QgY2xhc3MgQSBleHRlbmRzIGNvcmU6Ok9iamVjdCAvKmlzTWl4aW5EZWNsYXJhdGlvbiovICB7Ci0gIG1ldGhvZCB0b1N0cmluZyh7Y29yZTo6U3RyaW5nKiBzID0gImhlbGxvIn0pIOKGkiBjb3JlOjpTdHJpbmcqCi0gICAgOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19Ci1jbGFzcyBCIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKLSAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBiYXoyOjpCKgotICAgIDsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgX2lkZW50aXR5SGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX2luc3RhbmNlT2YoZHluYW1pYyBpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLCBkeW5hbWljIGZ1bmN0aW9uVHlwZUFyZ3VtZW50cywgZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZlRydWUoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mRmFsc2UoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBoYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCB0b1N0cmluZygpIOKGkiBjb3JlOjpTdHJpbmcqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogaW52b2NhdGlvbikg4oaSIGR5bmFtaWM7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOwotfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQxMjEwYS9pc3N1ZTQxMjEwX2xpYjEuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MTIxMGEvaXNzdWU0MTIxMC5kYXJ0LndlYWsuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDEyMTBhL2lzc3VlNDEyMTBfbGliMS5kYXJ0LndlYWsuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDEyMTBhL2lzc3VlNDEyMTAuZGFydC53ZWFrLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQxMjEwYS9pc3N1ZTQxMjEwX2xpYjEuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MTIxMGEvaXNzdWU0MTIxMC5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDEyMTBhL2lzc3VlNDEyMTBfbGliMS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CnJlbmFtZSB0byBwa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDEyMTBhL2lzc3VlNDEyMTAuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQxMjEwYS9pc3N1ZTQxMjEwX2xpYjEuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MTIxMGEvaXNzdWU0MTIxMF9saWIxLmRhcnQub3V0bGluZS5leHBlY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWRiMzUuLjAwMDAwMDAKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQxMjEwYS9pc3N1ZTQxMjEwX2xpYjEuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vCi0vLyBQcm9ibGVtcyBpbiBjb21wb25lbnQ6Ci0vLwotLy8gcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQxMjEwYS9pc3N1ZTQxMjEwX2xpYjEuZGFydDogRXJyb3I6IEEgbGlicmFyeSBjYW4ndCBvcHQgb3V0IG9mIG5vbi1udWxsYWJsZSBieSBkZWZhdWx0LCB3aGVuIGluIG5uYmQtc3Ryb25nIG1vZGUuCi0vLwotbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKLS8vCi0vLyBQcm9ibGVtcyBpbiBsaWJyYXJ5OgotLy8KLS8vIHBrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MTIxMGEvaXNzdWU0MTIxMC5kYXJ0OjU6MTogRXJyb3I6IEEgbGlicmFyeSBjYW4ndCBvcHQgb3V0IG9mIG5vbi1udWxsYWJsZSBieSBkZWZhdWx0LCB3aGVuIGluIG5uYmQtc3Ryb25nIG1vZGUuCi0vLyAvLyBAZGFydD0yLjYKLS8vIF5eXl5eXl5eXl5eXgotLy8KLWltcG9ydCBzZWxmIGFzIHNlbGY7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiaXNzdWU0MTIxMF9saWIxLmRhcnQiIGFzIGlzczsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vaXNzdWU0MTIxMF9saWIxLmRhcnQiOwotCi1hYnN0cmFjdCBjbGFzcyBfQyZPYmplY3QmQSA9IGNvcmU6Ok9iamVjdCB3aXRoIGlzczo6QSAvKmlzQW5vbnltb3VzTWl4aW4saGFzQ29uc3RDb25zdHJ1Y3RvciovICB7Ci0gIGNvbnN0IHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6X0MmT2JqZWN0JkEKLSAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKLSAgICA7Ci19Ci1hYnN0cmFjdCBjbGFzcyBfQyZPYmplY3QmQSZCID0gc2VsZjo6X0MmT2JqZWN0JkEgd2l0aCBpc3M6OkIgLyppc0Fub255bW91c01peGluLGhhc0NvbnN0Q29uc3RydWN0b3IqLyAgewotICBjb25zdCBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6Ol9DJk9iamVjdCZBJkIKLSAgICA6IHN1cGVyIHNlbGY6Ol9DJk9iamVjdCZBOjrigKIoKQotICAgIDsKLSAgYWJzdHJhY3QgZm9yd2FyZGluZy1zdHViIG1ldGhvZCBtZXRob2Qoe2NvcmU6OlN0cmluZyogc30pIOKGkiBjb3JlOjpTdHJpbmcqOwotfQotY2xhc3MgQyBleHRlbmRzIHNlbGY6Ol9DJk9iamVjdCZBJkIgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkMKLSAgICA7Ci0gIGFic3RyYWN0IGZvcndhcmRpbmctc3R1YiBtZXRob2QgbWV0aG9kKHtjb3JlOjpTdHJpbmcqIHN9KSDihpIgY29yZTo6U3RyaW5nKjsKLX0KLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljCi0gIDsKLQotbGlicmFyeTsKLWltcG9ydCBzZWxmIGFzIGlzczsKLWltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwotaW1wb3J0ICJpc3N1ZTQxMjEwX2xpYjIuZGFydCIgYXMgaXNzMjsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vaXNzdWU0MTIxMF9saWIyLmRhcnQiOwotCi1hYnN0cmFjdCBjbGFzcyBBIGV4dGVuZHMgY29yZTo6T2JqZWN0IGltcGxlbWVudHMgaXNzMjo6SW50ZXJmYWNlIC8qaXNNaXhpbkRlY2xhcmF0aW9uKi8gIHsKLSAgbWV0aG9kIG1ldGhvZCh7Y29yZTo6U3RyaW5nKiBzID0gImhlbGxvIn0pIOKGkiBjb3JlOjpTdHJpbmcqCi0gICAgOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19Ci1hYnN0cmFjdCBjbGFzcyBCIGV4dGVuZHMgY29yZTo6T2JqZWN0IGltcGxlbWVudHMgaXNzMjo6SW50ZXJmYWNlIHsKLSAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBpc3M6OkIqCi0gICAgOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG1ldGhvZCgpIOKGkiBjb3JlOjpTdHJpbmcqOwotfQotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQKLSAgOwotCi1saWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOwotaW1wb3J0IHNlbGYgYXMgaXNzMjsKLWltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwotCi1hYnN0cmFjdCBjbGFzcyBJbnRlcmZhY2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIGlzczI6OkludGVyZmFjZQotICAgIDsKLSAgYWJzdHJhY3QgbWV0aG9kIG1ldGhvZCgpIOKGkiBjb3JlOjpTdHJpbmc7Ci19CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MjM4Ny9mb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0LndlYWsuZXhwZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNmZmRkLi4wMDAwMDAwCi0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MjM4Ny9mb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0LndlYWsuZXhwZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmOwotaW1wb3J0ICJmb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiIGFzIGZvdTsKLWltcG9ydCAic2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNjaDsKLWltcG9ydCAic2VydmljZXNfYmluZGluZ19saWIuZGFydCIgYXMgc2VyOwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2xpYi5kYXJ0IjsKLWltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NlcnZpY2VzX2xpYi5kYXJ0IjsKLWltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9saWIuZGFydCI7Ci0KLWFic3RyYWN0IGNsYXNzIF9UZXN0U2NoZWR1bGVyQmluZGluZyZCaW5kaW5nQmFzZSZTY2hlZHVsZXJCaW5kaW5nID0gZm91OjpCaW5kaW5nQmFzZSB3aXRoIHNjaDo6U2NoZWR1bGVyQmluZGluZyAvKmlzQW5vbnltb3VzTWl4aW4qLyAgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6Ol9UZXN0U2NoZWR1bGVyQmluZGluZyZCaW5kaW5nQmFzZSZTY2hlZHVsZXJCaW5kaW5nKgotICAgIDogc3VwZXIgZm91OjpCaW5kaW5nQmFzZTo64oCiKCkKLSAgICA7Ci19Ci1hYnN0cmFjdCBjbGFzcyBfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyZTZXJ2aWNlc0JpbmRpbmcgPSBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyB3aXRoIHNlcjo6U2VydmljZXNCaW5kaW5nIC8qaXNBbm9ueW1vdXNNaXhpbiovICB7Ci0gIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcmU2VydmljZXNCaW5kaW5nKgotICAgIDogc3VwZXIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmc6OuKAoigpCi0gICAgOwotfQotY2xhc3MgVGVzdFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyZTZXJ2aWNlc0JpbmRpbmcgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlRlc3RTY2hlZHVsZXJCaW5kaW5nKgotICAgIDogc3VwZXIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcmU2VydmljZXNCaW5kaW5nOjrigKIoKQotICAgIDsKLX0KLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHt9Ci0KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBzZWxmMjsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci0KLXR5cGVkZWYgQXN5bmNDYWxsYmFjayA9ICgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz47Ci0KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBmb3U7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IjsKLQotYWJzdHJhY3QgY2xhc3MgQmluZGluZ0Jhc2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIGZvdTo6QmluZGluZ0Jhc2UKLSAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKLSAgICA7Ci0gIG1ldGhvZCByZWdpc3RlclNpZ25hbFNlcnZpY2VFeHRlbnNpb24oe3JlcXVpcmVkIGNvcmU6OlN0cmluZyBuYW1lID0gI0MxLCByZXF1aXJlZCAoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+IGNhbGxiYWNrID0gI0MxfSkg4oaSIHZvaWQge30KLX0KLQotbGlicmFyeTsKLWltcG9ydCBzZWxmIGFzIHNlbGYzOwotaW1wb3J0ICJmb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IiBhcyBzZWxmMjsKLWltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7Ci1hZGRpdGlvbmFsRXhwb3J0cyA9IChzZWxmMjo6QXN5bmNDYWxsYmFjaywKLSAgZm91OjpCaW5kaW5nQmFzZSkKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydCI7Ci1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzY2g7Ci1pbXBvcnQgImZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCIgYXMgZm91OwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci1pbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7Ci0KLWFic3RyYWN0IGNsYXNzIFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBmb3U6OkJpbmRpbmdCYXNlIC8qaXNNaXhpbkRlY2xhcmF0aW9uKi8gIHsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19Ci0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmNDsKLWltcG9ydCAic2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNjaDsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNjaDo6U2NoZWR1bGVyQmluZGluZykKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZXI7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7Ci1pbXBvcnQgInNjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzY2g7Ci1pbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7Ci1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfbGliLmRhcnQiOwotCi1hYnN0cmFjdCBjbGFzcyBfU2VydmljZXNCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBjb3JlOjpPYmplY3QgaW1wbGVtZW50cyBmb3U6OkJpbmRpbmdCYXNlLCBzY2g6OlNjaGVkdWxlckJpbmRpbmcgLyppc0Fub255bW91c01peGluKi8gIHsKLSAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZXI6Ol9TZXJ2aWNlc0JpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyoKLSAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKLSAgICA7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotfQotYWJzdHJhY3QgY2xhc3MgU2VydmljZXNCaW5kaW5nIGV4dGVuZHMgc2VyOjpfU2VydmljZXNCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcgLyppc01peGluRGVjbGFyYXRpb24qLyAgewotfQotCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjU7Ci1pbXBvcnQgInNlcnZpY2VzX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNlcjsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNlcjo6U2VydmljZXNCaW5kaW5nKQotCi1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IjsKLQotCi1jb25zdGFudHMgIHsKLSAgI0MxID0gbnVsbAotfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQyMzg3L2ZvdW5kYXRpb25fYmFzaWNfdHlwZXNfbGliLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3MDgzMS4uMDAwMDAwMAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjsKLWltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7Ci1pbXBvcnQgInNjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzY2g7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwotaW1wb3J0ICJzZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzZXI7Ci0KLWltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2ZvdW5kYXRpb25fbGliLmRhcnQiOwotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2VydmljZXNfbGliLmRhcnQiOwotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2xpYi5kYXJ0IjsKLQotYWJzdHJhY3QgY2xhc3MgX1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBmb3U6OkJpbmRpbmdCYXNlIGltcGxlbWVudHMgc2NoOjpTY2hlZHVsZXJCaW5kaW5nIC8qaXNBbm9ueW1vdXNNaXhpbixpc0VsaW1pbmF0ZWRNaXhpbiovICB7Ci0gIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcqCi0gICAgOiBzdXBlciBmb3U6OkJpbmRpbmdCYXNlOjrigKIoKQotICAgIDsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgLyogZnJvbSBvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQgKi8gcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCAvKiBmcm9tIG9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfYmluZGluZ19saWIuZGFydCAqLyBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCAvKiBmcm9tIG9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfYmluZGluZ19saWIuZGFydCAqLyBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgLyogZnJvbSBvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQgKi8gX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIC8qIGZyb20gb3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0ICovIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgLyogZnJvbSBvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQgKi8gX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciAvKiBmcm9tIG9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfYmluZGluZ19saWIuZGFydCAqLyA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IC8qIGZyb20gb3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0ICovIGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIC8qIGZyb20gb3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0ICovIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIC8qIGZyb20gb3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0ICovIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgLyogZnJvbSBvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQgKi8gcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19Ci1hYnN0cmFjdCBjbGFzcyBfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyZTZXJ2aWNlc0JpbmRpbmcgZXh0ZW5kcyBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyBpbXBsZW1lbnRzIHNlcjo6U2VydmljZXNCaW5kaW5nIC8qaXNBbm9ueW1vdXNNaXhpbixpc0VsaW1pbmF0ZWRNaXhpbiovICB7Ci0gIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcmU2VydmljZXNCaW5kaW5nKgotICAgIDogc3VwZXIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmc6OuKAoigpCi0gICAgOwotfQotY2xhc3MgVGVzdFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyZTZXJ2aWNlc0JpbmRpbmcgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlRlc3RTY2hlZHVsZXJCaW5kaW5nKgotICAgIDogc3VwZXIgc2VsZjo6X1Rlc3RTY2hlZHVsZXJCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcmU2VydmljZXNCaW5kaW5nOjrigKIoKQotICAgIDsKLX0KLXN0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIHt9Ci0KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBzZWxmMjsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci0KLXR5cGVkZWYgQXN5bmNDYWxsYmFjayA9ICgpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz47Ci0KLWxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBmb3U7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwotCi1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IjsKLQotYWJzdHJhY3QgY2xhc3MgQmluZGluZ0Jhc2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIGZvdTo6QmluZGluZ0Jhc2UKLSAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKLSAgICA7Ci0gIG1ldGhvZCByZWdpc3RlclNpZ25hbFNlcnZpY2VFeHRlbnNpb24oe3JlcXVpcmVkIGNvcmU6OlN0cmluZyBuYW1lID0gI0MxLCByZXF1aXJlZCAoKSDihpIgYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+IGNhbGxiYWNrID0gI0MxfSkg4oaSIHZvaWQge30KLX0KLQotbGlicmFyeTsKLWltcG9ydCBzZWxmIGFzIHNlbGYzOwotaW1wb3J0ICJmb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IiBhcyBzZWxmMjsKLWltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7Ci1hZGRpdGlvbmFsRXhwb3J0cyA9IChzZWxmMjo6QXN5bmNDYWxsYmFjaywKLSAgZm91OjpCaW5kaW5nQmFzZSkKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydCI7Ci1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzY2g7Ci1pbXBvcnQgImZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCIgYXMgZm91OwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci1pbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7Ci0KLWFic3RyYWN0IGNsYXNzIFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBmb3U6OkJpbmRpbmdCYXNlIC8qaXNNaXhpbkRlY2xhcmF0aW9uKi8gIHsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19Ci0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmNDsKLWltcG9ydCAic2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNjaDsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNjaDo6U2NoZWR1bGVyQmluZGluZykKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZXI7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7Ci1pbXBvcnQgInNjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzY2g7Ci1pbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKLQotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7Ci1pbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfbGliLmRhcnQiOwotCi1hYnN0cmFjdCBjbGFzcyBfU2VydmljZXNCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBjb3JlOjpPYmplY3QgaW1wbGVtZW50cyBmb3U6OkJpbmRpbmdCYXNlLCBzY2g6OlNjaGVkdWxlckJpbmRpbmcgLyppc0Fub255bW91c01peGluKi8gIHsKLSAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZXI6Ol9TZXJ2aWNlc0JpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyoKLSAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKLSAgICA7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotfQotYWJzdHJhY3QgY2xhc3MgU2VydmljZXNCaW5kaW5nIGV4dGVuZHMgc2VyOjpfU2VydmljZXNCaW5kaW5nJkJpbmRpbmdCYXNlJlNjaGVkdWxlckJpbmRpbmcgLyppc01peGluRGVjbGFyYXRpb24qLyAgewotfQotCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjU7Ci1pbXBvcnQgInNlcnZpY2VzX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNlcjsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNlcjo6U2VydmljZXNCaW5kaW5nKQotCi1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IjsKLQotCi1jb25zdGFudHMgIHsKLSAgI0MxID0gbnVsbAotfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQyMzg3L3NjaGVkdWxlcl90ZXN0ZXIuZGFydC53ZWFrLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MjM4Ny9zY2hlZHVsZXJfdGVzdGVyLmRhcnQud2Vhay5leHBlY3QKaW5kZXggZGNlZmJhYi4uNGQzZmZkZCAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQyMzg3L3NjaGVkdWxlcl90ZXN0ZXIuZGFydC53ZWFrLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvc2NoZWR1bGVyX3Rlc3Rlci5kYXJ0LndlYWsuZXhwZWN0CkBAIC0yLDggKzIsNiBAQAogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIGltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7CiBpbXBvcnQgInNjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzY2g7Ci1pbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKLWltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OwogaW1wb3J0ICJzZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzZXI7CiAKIGltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2ZvdW5kYXRpb25fbGliLmRhcnQiOwpAQCAtMTQsMTcgKzEyLDYgQEAKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyoKICAgICA6IHN1cGVyIGZvdTo6QmluZGluZ0Jhc2U6OuKAoigpCiAgICAgOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCByZWdpc3RlclNpZ25hbFNlcnZpY2VFeHRlbnNpb24oe2NvcmU6OlN0cmluZyogbmFtZSA9ICNDMSwgKCkg4oaSKiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz4qIGNhbGxiYWNrID0gI0MxfSkg4oaSIHZvaWQ7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKIH0KIGFic3RyYWN0IGNsYXNzIF9UZXN0U2NoZWR1bGVyQmluZGluZyZCaW5kaW5nQmFzZSZTY2hlZHVsZXJCaW5kaW5nJlNlcnZpY2VzQmluZGluZyA9IHNlbGY6Ol9UZXN0U2NoZWR1bGVyQmluZGluZyZCaW5kaW5nQmFzZSZTY2hlZHVsZXJCaW5kaW5nIHdpdGggc2VyOjpTZXJ2aWNlc0JpbmRpbmcgLyppc0Fub255bW91c01peGluKi8gIHsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpfVGVzdFNjaGVkdWxlckJpbmRpbmcmQmluZGluZ0Jhc2UmU2NoZWR1bGVyQmluZGluZyZTZXJ2aWNlc0JpbmRpbmcqCkBAIC0zOCwzNSArMjUsOCBAQAogfQogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMge30KIAotbGlicmFyeTsKLWltcG9ydCBzZWxmIGFzIHNlbGYyOwotaW1wb3J0ICJmb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IiBhcyBmb3UyOwotaW1wb3J0ICJmb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiIGFzIGZvdTsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKGZvdTI6OkFzeW5jQ2FsbGJhY2ssCi0gIGZvdTo6QmluZGluZ0Jhc2UpCi0KLWV4cG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2ZvdW5kYXRpb25fYmFzaWNfdHlwZXNfbGliLmRhcnQiOwotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IjsKLQotCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjM7Ci1pbXBvcnQgInNlcnZpY2VzX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNlcjsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNlcjo6U2VydmljZXNCaW5kaW5nKQotCi1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IjsKLQotCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjQ7Ci1pbXBvcnQgInNjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzY2g7Ci1hZGRpdGlvbmFsRXhwb3J0cyA9IChzY2g6OlNjaGVkdWxlckJpbmRpbmcpCi0KLWV4cG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NjaGVkdWxlcl9iaW5kaW5nX2xpYi5kYXJ0IjsKLQotCiBsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOwotaW1wb3J0IHNlbGYgYXMgZm91MjsKK2ltcG9ydCBzZWxmIGFzIHNlbGYyOwogaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CiBpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKIApAQCAtODcsNiArNDcsNDcgQEAKIH0KIAogbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHNlbGYzOworaW1wb3J0ICJmb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IiBhcyBzZWxmMjsKK2ltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7CithZGRpdGlvbmFsRXhwb3J0cyA9IChzZWxmMjo6QXN5bmNDYWxsYmFjaywKKyAgZm91OjpCaW5kaW5nQmFzZSkKKworZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydCI7CitleHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiOworCisKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyBzY2g7CitpbXBvcnQgImZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCIgYXMgZm91OworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CitpbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKKworaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7CisKK2Fic3RyYWN0IGNsYXNzIFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBmb3U6OkJpbmRpbmdCYXNlIC8qaXNNaXhpbkRlY2xhcmF0aW9uKi8gIHsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Cit9CisKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyBzZWxmNDsKK2ltcG9ydCAic2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNjaDsKK2FkZGl0aW9uYWxFeHBvcnRzID0gKHNjaDo6U2NoZWR1bGVyQmluZGluZykKKworZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiOworCisKK2xpYnJhcnk7CiBpbXBvcnQgc2VsZiBhcyBzZXI7CiBpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKIGltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7CkBAIC0xMTYsMjYgKzExNywxMiBAQAogfQogCiBsaWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2NoOwotaW1wb3J0ICJmb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiIGFzIGZvdTsKLWltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwotaW1wb3J0ICJkYXJ0OmFzeW5jIiBhcyBhc3k7CitpbXBvcnQgc2VsZiBhcyBzZWxmNTsKK2ltcG9ydCAic2VydmljZXNfYmluZGluZ19saWIuZGFydCIgYXMgc2VyOworYWRkaXRpb25hbEV4cG9ydHMgPSAoc2VyOjpTZXJ2aWNlc0JpbmRpbmcpCiAKLWltcG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2ZvdW5kYXRpb25fbGliLmRhcnQiOworZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2VydmljZXNfYmluZGluZ19saWIuZGFydCI7CiAKLWFic3RyYWN0IGNsYXNzIFNjaGVkdWxlckJpbmRpbmcgZXh0ZW5kcyBmb3U6OkJpbmRpbmdCYXNlIC8qaXNNaXhpbkRlY2xhcmF0aW9uKi8gIHsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgcmVnaXN0ZXJTaWduYWxTZXJ2aWNlRXh0ZW5zaW9uKHtjb3JlOjpTdHJpbmcqIG5hbWUgPSAjQzEsICgpIOKGkiogYXN5OjpGdXR1cmU8Y29yZTo6TnVsbD8+KiBjYWxsYmFjayA9ICNDMX0pIOKGkiB2b2lkOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Ci19CiAKIGNvbnN0YW50cyAgewogICAjQzEgPSBudWxsCmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvc2NoZWR1bGVyX3Rlc3Rlci5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9pc3N1ZTQyMzg3L3NjaGVkdWxlcl90ZXN0ZXIuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdAppbmRleCBiZGMwYzY4Li4zNjcwODMxIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL2lzc3VlNDIzODcvc2NoZWR1bGVyX3Rlc3Rlci5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvaXNzdWU0MjM4Ny9zY2hlZHVsZXJfdGVzdGVyLmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTM4LDM1ICszOCw4IEBACiB9CiBzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7fQogCi1saWJyYXJ5OwotaW1wb3J0IHNlbGYgYXMgc2VsZjI7Ci1pbXBvcnQgImZvdW5kYXRpb25fYmFzaWNfdHlwZXNfbGliLmRhcnQiIGFzIGZvdTI7Ci1pbXBvcnQgImZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCIgYXMgZm91OwotYWRkaXRpb25hbEV4cG9ydHMgPSAoZm91Mjo6QXN5bmNDYWxsYmFjaywKLSAgZm91OjpCaW5kaW5nQmFzZSkKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9iYXNpY190eXBlc19saWIuZGFydCI7Ci1leHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmMzsKLWltcG9ydCAic2VydmljZXNfYmluZGluZ19saWIuZGFydCIgYXMgc2VyOwotYWRkaXRpb25hbEV4cG9ydHMgPSAoc2VyOjpTZXJ2aWNlc0JpbmRpbmcpCi0KLWV4cG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL3NlcnZpY2VzX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KLWxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzZWxmNDsKLWltcG9ydCAic2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiIGFzIHNjaDsKLWFkZGl0aW9uYWxFeHBvcnRzID0gKHNjaDo6U2NoZWR1bGVyQmluZGluZykKLQotZXhwb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vc2NoZWR1bGVyX2JpbmRpbmdfbGliLmRhcnQiOwotCi0KIGxpYnJhcnkgLyppc05vbk51bGxhYmxlQnlEZWZhdWx0Ki87Ci1pbXBvcnQgc2VsZiBhcyBmb3UyOworaW1wb3J0IHNlbGYgYXMgc2VsZjI7CiBpbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKIGltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwogCkBAIC04Nyw2ICs2MCw0NyBAQAogfQogCiBsaWJyYXJ5OworaW1wb3J0IHNlbGYgYXMgc2VsZjM7CitpbXBvcnQgImZvdW5kYXRpb25fYmFzaWNfdHlwZXNfbGliLmRhcnQiIGFzIHNlbGYyOworaW1wb3J0ICJmb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiIGFzIGZvdTsKK2FkZGl0aW9uYWxFeHBvcnRzID0gKHNlbGYyOjpBc3luY0NhbGxiYWNrLAorICBmb3U6OkJpbmRpbmdCYXNlKQorCitleHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2Jhc2ljX3R5cGVzX2xpYi5kYXJ0IjsKK2V4cG9ydCAib3JnLWRhcnRsYW5nLXRlc3RjYXNlOi8vL2ZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCI7CisKKworbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHNjaDsKK2ltcG9ydCAiZm91bmRhdGlvbl9iaW5kaW5nX2xpYi5kYXJ0IiBhcyBmb3U7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKK2ltcG9ydCAiZGFydDphc3luYyIgYXMgYXN5OworCitpbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9mb3VuZGF0aW9uX2xpYi5kYXJ0IjsKKworYWJzdHJhY3QgY2xhc3MgU2NoZWR1bGVyQmluZGluZyBleHRlbmRzIGZvdTo6QmluZGluZ0Jhc2UgLyppc01peGluRGVjbGFyYXRpb24qLyAgeworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCByZWdpc3RlclNpZ25hbFNlcnZpY2VFeHRlbnNpb24oe2NvcmU6OlN0cmluZyogbmFtZSA9ICNDMSwgKCkg4oaSKiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz4qIGNhbGxiYWNrID0gI0MxfSkg4oaSIHZvaWQ7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKK30KKworbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHNlbGY0OworaW1wb3J0ICJzY2hlZHVsZXJfYmluZGluZ19saWIuZGFydCIgYXMgc2NoOworYWRkaXRpb25hbEV4cG9ydHMgPSAoc2NoOjpTY2hlZHVsZXJCaW5kaW5nKQorCitleHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zY2hlZHVsZXJfYmluZGluZ19saWIuZGFydCI7CisKKworbGlicmFyeTsKIGltcG9ydCBzZWxmIGFzIHNlcjsKIGltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOwogaW1wb3J0ICJmb3VuZGF0aW9uX2JpbmRpbmdfbGliLmRhcnQiIGFzIGZvdTsKQEAgLTExNiwyNiArMTMwLDEyIEBACiB9CiAKIGxpYnJhcnk7Ci1pbXBvcnQgc2VsZiBhcyBzY2g7Ci1pbXBvcnQgImZvdW5kYXRpb25fYmluZGluZ19saWIuZGFydCIgYXMgZm91OwotaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7Ci1pbXBvcnQgImRhcnQ6YXN5bmMiIGFzIGFzeTsKK2ltcG9ydCBzZWxmIGFzIHNlbGY1OworaW1wb3J0ICJzZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IiBhcyBzZXI7CithZGRpdGlvbmFsRXhwb3J0cyA9IChzZXI6OlNlcnZpY2VzQmluZGluZykKIAotaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vZm91bmRhdGlvbl9saWIuZGFydCI7CitleHBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9zZXJ2aWNlc19iaW5kaW5nX2xpYi5kYXJ0IjsKIAotYWJzdHJhY3QgY2xhc3MgU2NoZWR1bGVyQmluZGluZyBleHRlbmRzIGZvdTo6QmluZGluZ0Jhc2UgLyppc01peGluRGVjbGFyYXRpb24qLyAgewotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCByZWdpc3RlclNpZ25hbFNlcnZpY2VFeHRlbnNpb24oe2NvcmU6OlN0cmluZyogbmFtZSA9ICNDMSwgKCkg4oaSKiBhc3k6OkZ1dHVyZTxjb3JlOjpOdWxsPz4qIGNhbGxiYWNrID0gI0MxfSkg4oaSIHZvaWQ7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7Ci0gIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKLSAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOwotICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKLX0KIAogY29uc3RhbnRzICB7CiAgICNDMSA9IG51bGwKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvbnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXQuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvbnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2FiMjMxCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dC5kYXJ0CkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0X2xpYi5kYXJ0JzsKKworZXh0ZW5zaW9uIG9uIEE/IHsKKyAgU3RyaW5nIGdldCB0ZXh0ID0+ICJMaWx5IHdhcyBoZXJlIjsKK30KKwordm9pZCBtYWluKCkgeworICBBPyBhID0gbnVsbDsKKyAgZXhwZWN0KCJMaWx5IHdhcyBoZXJlIiwgYS50ZXh0KTsKK30KKworZXhwZWN0KGV4cGVjdGVkLCBhY3R1YWwpIHsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgdGhyb3cgJ0V4cGVjdGVkICRleHBlY3RlZCwgYWN0dWFsICRhY3R1YWwnOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0LmRhcnQudGV4dHVhbF9vdXRsaW5lLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjc2ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dC5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKQEAgLTAsMCArMSw2IEBACitpbXBvcnQgJ251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0X2xpYi5kYXJ0JzsKK2V4dGVuc2lvbiBvbiA7CitBOworPyB7IFN0cmluZyBnZXQgdGV4dCA9PiAiTGlseSB3YXMgaGVyZSI7IH0KK3ZvaWQgbWFpbigpIHsgfQorZXhwZWN0KGV4cGVjdGVkLCBhY3R1YWwpIHsgfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dC5kYXJ0LndlYWsuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dC5kYXJ0LndlYWsuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmFhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0LmRhcnQud2Vhay5leHBlY3QKQEAgLTAsMCArMSw0MSBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgIm51bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0X2xpYi5kYXJ0IiBhcyBudWw7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vbnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXRfbGliLmRhcnQiOworCitleHRlbnNpb24gX2V4dGVuc2lvbiMwIG9uIG51bDo6QT8geworICBnZXQgdGV4dCA9IHNlbGY6Ol9leHRlbnNpb24jMHxnZXQjdGV4dDsKK30KK3N0YXRpYyBtZXRob2QgX2V4dGVuc2lvbiMwfGdldCN0ZXh0KGZpbmFsIG51bDo6QT8gI3RoaXMpIOKGkiBjb3JlOjpTdHJpbmcKKyAgcmV0dXJuICJMaWx5IHdhcyBoZXJlIjsKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiB2b2lkIHsKKyAgbnVsOjpBPyBhID0gbnVsbDsKKyAgc2VsZjo6ZXhwZWN0KCJMaWx5IHdhcyBoZXJlIiwgc2VsZjo6X2V4dGVuc2lvbiMwfGdldCN0ZXh0KGEpKTsKK30KK3N0YXRpYyBtZXRob2QgZXhwZWN0KGR5bmFtaWMgZXhwZWN0ZWQsIGR5bmFtaWMgYWN0dWFsKSDihpIgZHluYW1pYyB7CisgIGlmKCFleHBlY3RlZC57Y29yZTo6T2JqZWN0Ojo9PX0oYWN0dWFsKSkKKyAgICB0aHJvdyAiRXhwZWN0ZWQgJHtleHBlY3RlZH0sIGFjdHVhbCAke2FjdHVhbH0iOworfQorCitsaWJyYXJ5OworaW1wb3J0IHNlbGYgYXMgbnVsOworaW1wb3J0ICJkYXJ0OmNvcmUiIGFzIGNvcmU7CisKK2NsYXNzIEEgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBmaWVsZCBjb3JlOjpTdHJpbmcqIHRleHQgPSAiIjsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBudWw6OkEqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBfaWRlbnRpdHlIYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfaW5zdGFuY2VPZihkeW5hbWljIGluc3RhbnRpYXRvclR5cGVBcmd1bWVudHMsIGR5bmFtaWMgZnVuY3Rpb25UeXBlQXJndW1lbnRzLCBkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2YoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mVHJ1ZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZGYWxzZShkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IGhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIHRvU3RyaW5nKCkg4oaSIGNvcmU6OlN0cmluZyo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIG5vU3VjaE1ldGhvZChjb3JlOjpJbnZvY2F0aW9uKiBpbnZvY2F0aW9uKSDihpIgZHluYW1pYzsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgcnVudGltZVR5cGUoKSDihpIgY29yZTo6VHlwZSo7Cit9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0LmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0LmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYWEzMwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvbnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXQuZGFydC53ZWFrLnRyYW5zZm9ybWVkLmV4cGVjdApAQCAtMCwwICsxLDQxIEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAibnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXRfbGliLmRhcnQiIGFzIG51bDsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitpbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy9udWxsYWJsZV9leHRlbnNpb25fb25fb3B0X291dF9saWIuZGFydCI7CisKK2V4dGVuc2lvbiBfZXh0ZW5zaW9uIzAgb24gbnVsOjpBPyB7CisgIGdldCB0ZXh0ID0gc2VsZjo6X2V4dGVuc2lvbiMwfGdldCN0ZXh0OworfQorc3RhdGljIG1ldGhvZCBfZXh0ZW5zaW9uIzB8Z2V0I3RleHQoZmluYWwgbnVsOjpBPyAjdGhpcykg4oaSIGNvcmU6OlN0cmluZworICByZXR1cm4gIkxpbHkgd2FzIGhlcmUiOworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIHZvaWQgeworICBudWw6OkE/IGEgPSBudWxsOworICBzZWxmOjpleHBlY3QoIkxpbHkgd2FzIGhlcmUiLCBzZWxmOjpfZXh0ZW5zaW9uIzB8Z2V0I3RleHQoYSkpOworfQorc3RhdGljIG1ldGhvZCBleHBlY3QoZHluYW1pYyBleHBlY3RlZCwgZHluYW1pYyBhY3R1YWwpIOKGkiBkeW5hbWljIHsKKyAgaWYoIWV4cGVjdGVkLntjb3JlOjpPYmplY3Q6Oj09fShhY3R1YWwpKQorICAgIHRocm93ICJFeHBlY3RlZCAke2V4cGVjdGVkfSwgYWN0dWFsICR7YWN0dWFsfSI7Cit9CisKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyBudWw7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworY2xhc3MgQSBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIGZpZWxkIGNvcmU6OlN0cmluZyogdGV4dCA9ICIiOworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIG51bDo6QSoKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvbnVsbGFibGVfZXh0ZW5zaW9uX29uX29wdF9vdXRfbGliLmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0X2xpYi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjZlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL251bGxhYmxlX2V4dGVuc2lvbl9vbl9vcHRfb3V0X2xpYi5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIEBkYXJ0PTIuNgorCitjbGFzcyBBIHsKKyAgU3RyaW5nIHRleHQgPSAiIjsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkuZGFydCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTllOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0CkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5X2xpYi5kYXJ0JzsKKworY2xhc3MgQzxUIGV4dGVuZHMgbnVtPywgUywgVT4geworICB2b2lkIHByb21vdGVOdWxsYWJsZShUPyB0KSB7CisgICAgaWYgKHQgaXMgaW50KSAvKiBDcmVhdGVzIFQ/ICYgaW50ISAqLyB7CisgICAgICB0OworICAgIH0KKyAgICBpZiAodCBpcyBpbnQ/KSAvKiBDcmVhdGVzIFQ/ICYgaW50PyAqLyB7CisgICAgICB0OworICAgIH0KKyAgfQorCisgIHZvaWQgbnVsbGFibGVBc1VuZGV0ZXJtaW5lZChTPyBzKSB7CisgICAgcyBhcyBVOyAvKiBDcmVhdGVzIFM/ICYgVSUgKi8KKyAgfQorfQorCittYWluKCkgeworICB2YXIgYyA9IG5ldyBDPG51bSwgbnVtLCBudW0+KCk7CisgIGMucHJvbW90ZU51bGxhYmxlKG51bGwpOworICBjLnByb21vdGVOdWxsYWJsZSgwKTsKKyAgYy5udWxsYWJsZUFzVW5kZXRlcm1pbmVkKG51bGwpOworICBjLm51bGxhYmxlQXNVbmRldGVybWluZWQoMCk7CisgIHZhciBkID0gbmV3IEQ8bnVtPigpOworICBkLnByb21vdGVMZWdhY3kobnVsbCk7CisgIGQucHJvbW90ZUxlZ2FjeSgwKTsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkuZGFydC50ZXh0dWFsX291dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0LnRleHR1YWxfb3V0bGluZS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1NzE5MwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkuZGFydC50ZXh0dWFsX291dGxpbmUuZXhwZWN0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0ICd0eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eV9saWIuZGFydCc7CisKK2NsYXNzIEM8VCBleHRlbmRzIG51bT8sIFMsIFU+IHsKKyAgdm9pZCBwcm9tb3RlTnVsbGFibGUoVD8gdCkge30KKyAgdm9pZCBudWxsYWJsZUFzVW5kZXRlcm1pbmVkKFM/IHMpIHt9Cit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5LmRhcnQudGV4dHVhbF9vdXRsaW5lX21vZGVsbGVkLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQzNmMyCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0LnRleHR1YWxfb3V0bGluZV9tb2RlbGxlZC5leHBlY3QKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgJ3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5X2xpYi5kYXJ0JzsKKworY2xhc3MgQzxUIGV4dGVuZHMgbnVtPywgUywgVT4geworICB2b2lkIG51bGxhYmxlQXNVbmRldGVybWluZWQoUz8gcykge30KKyAgdm9pZCBwcm9tb3RlTnVsbGFibGUoVD8gdCkge30KK30KKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5LmRhcnQud2Vhay5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5LmRhcnQud2Vhay5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3OGRjYwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkuZGFydC53ZWFrLmV4cGVjdApAQCAtMCwwICsxLDU4IEBACitsaWJyYXJ5IC8qaXNOb25OdWxsYWJsZUJ5RGVmYXVsdCovOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworaW1wb3J0ICJ0eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eV9saWIuZGFydCIgYXMgdHlwOworCitpbXBvcnQgIm9yZy1kYXJ0bGFuZy10ZXN0Y2FzZTovLy90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eV9saWIuZGFydCI7CisKK2NsYXNzIEM8VCBleHRlbmRzIGNvcmU6Om51bT8gPSBjb3JlOjpudW0/LCBTIGV4dGVuZHMgY29yZTo6T2JqZWN0PyA9IGR5bmFtaWMsIFUgZXh0ZW5kcyBjb3JlOjpPYmplY3Q/ID0gZHluYW1pYz4gZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkM8c2VsZjo6Qzo6VCUsIHNlbGY6OkM6OlMlLCBzZWxmOjpDOjpVJT4KKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CisgIG1ldGhvZCBwcm9tb3RlTnVsbGFibGUoZ2VuZXJpYy1jb3ZhcmlhbnQtaW1wbCBzZWxmOjpDOjpUPyB0KSDihpIgdm9pZCB7CisgICAgaWYodCBpc3tGb3JOb25OdWxsYWJsZUJ5RGVmYXVsdH0gY29yZTo6aW50KSB7CisgICAgICB0e3NlbGY6OkM6OlQ/ICYgY29yZTo6aW50IC8qICc/JyAmICchJyA9ICchJyAqL307CisgICAgfQorICAgIGlmKHQgaXN7Rm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmludD8pIHsKKyAgICAgIHR7c2VsZjo6Qzo6VD8gJiBjb3JlOjppbnQ/IC8qICc/JyAmICc/JyA9ICc/JyAqL307CisgICAgfQorICB9CisgIG1ldGhvZCBudWxsYWJsZUFzVW5kZXRlcm1pbmVkKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6Qzo6Uz8gcykg4oaSIHZvaWQgeworICAgIHMgYXN7Rm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IHNlbGY6OkM6OlUlOworICB9Cit9CitzdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYyB7CisgIHNlbGY6OkM8Y29yZTo6bnVtLCBjb3JlOjpudW0sIGNvcmU6Om51bT4gYyA9IG5ldyBzZWxmOjpDOjrigKI8Y29yZTo6bnVtLCBjb3JlOjpudW0sIGNvcmU6Om51bT4oKTsKKyAgYy57c2VsZjo6Qzo6cHJvbW90ZU51bGxhYmxlfShudWxsKTsKKyAgYy57c2VsZjo6Qzo6cHJvbW90ZU51bGxhYmxlfSgwKTsKKyAgYy57c2VsZjo6Qzo6bnVsbGFibGVBc1VuZGV0ZXJtaW5lZH0obnVsbCk7CisgIGMue3NlbGY6OkM6Om51bGxhYmxlQXNVbmRldGVybWluZWR9KDApOworICB0eXA6OkQ8Y29yZTo6bnVtPiBkID0gbmV3IHR5cDo6RDo64oCiPGNvcmU6Om51bT4oKTsKKyAgZC57dHlwOjpEOjpwcm9tb3RlTGVnYWN5fShudWxsKTsKKyAgZC57dHlwOjpEOjpwcm9tb3RlTGVnYWN5fSgwKTsKK30KKworbGlicmFyeTsKK2ltcG9ydCBzZWxmIGFzIHR5cDsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCitjbGFzcyBEPFQgZXh0ZW5kcyBjb3JlOjpudW0qID0gY29yZTo6bnVtKj4gZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHR5cDo6RDx0eXA6OkQ6OlQqPioKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CisgIG1ldGhvZCBwcm9tb3RlTGVnYWN5KGdlbmVyaWMtY292YXJpYW50LWltcGwgdHlwOjpEOjpUKiB0KSDihpIgdm9pZCB7CisgICAgaWYodCBpcyBjb3JlOjppbnQqKSB7CisgICAgICBsZXQgZmluYWwgdHlwOjpEOjpUKiAmIGNvcmU6OmludCogLyogJyonICYgJyonID0gJyonICovICN0MSA9IHR7dHlwOjpEOjpUKiAmIGNvcmU6OmludCogLyogJyonICYgJyonID0gJyonICovfSBpbiAjdDEue2NvcmU6Om51bTo6PT19KG51bGwpID97Y29yZTo6Ym9vbCp9IG51bGwgOiAjdDEue2NvcmU6OmludDo6aXNFdmVufTsKKyAgICB9CisgIH0KKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgX2lkZW50aXR5SGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX2luc3RhbmNlT2YoZHluYW1pYyBpbnN0YW50aWF0b3JUeXBlQXJndW1lbnRzLCBkeW5hbWljIGZ1bmN0aW9uVHlwZUFyZ3VtZW50cywgZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZlRydWUoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9zaW1wbGVJbnN0YW5jZU9mRmFsc2UoZHluYW1pYyB0eXBlKSDihpIgY29yZTo6Ym9vbCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgb3BlcmF0b3IgPT0oZHluYW1pYyBvdGhlcikg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBoYXNoQ29kZSgpIOKGkiBjb3JlOjppbnQqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCB0b1N0cmluZygpIOKGkiBjb3JlOjpTdHJpbmcqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBub1N1Y2hNZXRob2QoY29yZTo6SW52b2NhdGlvbiogaW52b2NhdGlvbikg4oaSIGR5bmFtaWM7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IHJ1bnRpbWVUeXBlKCkg4oaSIGNvcmU6OlR5cGUqOworfQpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvbm5iZF9taXhlZC90eXBlX3BhcmFtZXRlcl9udWxsYWJpbGl0eS5kYXJ0LndlYWsudHJhbnNmb3JtZWQuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzhkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5LmRhcnQud2Vhay50cmFuc2Zvcm1lZC5leHBlY3QKQEAgLTAsMCArMSw1OCBAQAorbGlicmFyeSAvKmlzTm9uTnVsbGFibGVCeURlZmF1bHQqLzsKK2ltcG9ydCBzZWxmIGFzIHNlbGY7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKK2ltcG9ydCAidHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHlfbGliLmRhcnQiIGFzIHR5cDsKKworaW1wb3J0ICJvcmctZGFydGxhbmctdGVzdGNhc2U6Ly8vdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHlfbGliLmRhcnQiOworCitjbGFzcyBDPFQgZXh0ZW5kcyBjb3JlOjpudW0/ID0gY29yZTo6bnVtPywgUyBleHRlbmRzIGNvcmU6Ok9iamVjdD8gPSBkeW5hbWljLCBVIGV4dGVuZHMgY29yZTo6T2JqZWN0PyA9IGR5bmFtaWM+IGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpDPHNlbGY6OkM6OlQlLCBzZWxmOjpDOjpTJSwgc2VsZjo6Qzo6VSU+CisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBtZXRob2QgcHJvbW90ZU51bGxhYmxlKGdlbmVyaWMtY292YXJpYW50LWltcGwgc2VsZjo6Qzo6VD8gdCkg4oaSIHZvaWQgeworICAgIGlmKHQgaXN7Rm9yTm9uTnVsbGFibGVCeURlZmF1bHR9IGNvcmU6OmludCkgeworICAgICAgdHtzZWxmOjpDOjpUPyAmIGNvcmU6OmludCAvKiAnPycgJiAnIScgPSAnIScgKi99OworICAgIH0KKyAgICBpZih0IGlze0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBjb3JlOjppbnQ/KSB7CisgICAgICB0e3NlbGY6OkM6OlQ/ICYgY29yZTo6aW50PyAvKiAnPycgJiAnPycgPSAnPycgKi99OworICAgIH0KKyAgfQorICBtZXRob2QgbnVsbGFibGVBc1VuZGV0ZXJtaW5lZChnZW5lcmljLWNvdmFyaWFudC1pbXBsIHNlbGY6OkM6OlM/IHMpIOKGkiB2b2lkIHsKKyAgICBzIGFze0Zvck5vbk51bGxhYmxlQnlEZWZhdWx0fSBzZWxmOjpDOjpVJTsKKyAgfQorfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgeworICBzZWxmOjpDPGNvcmU6Om51bSwgY29yZTo6bnVtLCBjb3JlOjpudW0+IGMgPSBuZXcgc2VsZjo6Qzo64oCiPGNvcmU6Om51bSwgY29yZTo6bnVtLCBjb3JlOjpudW0+KCk7CisgIGMue3NlbGY6OkM6OnByb21vdGVOdWxsYWJsZX0obnVsbCk7CisgIGMue3NlbGY6OkM6OnByb21vdGVOdWxsYWJsZX0oMCk7CisgIGMue3NlbGY6OkM6Om51bGxhYmxlQXNVbmRldGVybWluZWR9KG51bGwpOworICBjLntzZWxmOjpDOjpudWxsYWJsZUFzVW5kZXRlcm1pbmVkfSgwKTsKKyAgdHlwOjpEPGNvcmU6Om51bT4gZCA9IG5ldyB0eXA6OkQ6OuKAojxjb3JlOjpudW0+KCk7CisgIGQue3R5cDo6RDo6cHJvbW90ZUxlZ2FjeX0obnVsbCk7CisgIGQue3R5cDo6RDo6cHJvbW90ZUxlZ2FjeX0oMCk7Cit9CisKK2xpYnJhcnk7CitpbXBvcnQgc2VsZiBhcyB0eXA7CitpbXBvcnQgImRhcnQ6Y29yZSIgYXMgY29yZTsKKworY2xhc3MgRDxUIGV4dGVuZHMgY29yZTo6bnVtKiA9IGNvcmU6Om51bSo+IGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiB0eXA6OkQ8dHlwOjpEOjpUKj4qCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworICBtZXRob2QgcHJvbW90ZUxlZ2FjeShnZW5lcmljLWNvdmFyaWFudC1pbXBsIHR5cDo6RDo6VCogdCkg4oaSIHZvaWQgeworICAgIGlmKHQgaXMgY29yZTo6aW50KikgeworICAgICAgbGV0IGZpbmFsIHR5cDo6RDo6VCogJiBjb3JlOjppbnQqIC8qICcqJyAmICcqJyA9ICcqJyAqLyAjdDEgPSB0e3R5cDo6RDo6VCogJiBjb3JlOjppbnQqIC8qICcqJyAmICcqJyA9ICcqJyAqL30gaW4gI3QxLntjb3JlOjpudW06Oj09fShudWxsKSA/e2NvcmU6OmJvb2wqfSBudWxsIDogI3QxLntjb3JlOjppbnQ6OmlzRXZlbn07CisgICAgfQorICB9CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgZ2V0IF9pZGVudGl0eUhhc2hDb2RlKCkg4oaSIGNvcmU6OmludCo7CisgIGFic3RyYWN0IG1lbWJlci1zaWduYXR1cmUgbWV0aG9kIF9pbnN0YW5jZU9mKGR5bmFtaWMgaW5zdGFudGlhdG9yVHlwZUFyZ3VtZW50cywgZHluYW1pYyBmdW5jdGlvblR5cGVBcmd1bWVudHMsIGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZihkeW5hbWljIHR5cGUpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgX3NpbXBsZUluc3RhbmNlT2ZUcnVlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG1ldGhvZCBfc2ltcGxlSW5zdGFuY2VPZkZhbHNlKGR5bmFtaWMgdHlwZSkg4oaSIGNvcmU6OmJvb2wqOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIG9wZXJhdG9yID09KGR5bmFtaWMgb3RoZXIpIOKGkiBjb3JlOjpib29sKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBnZXQgaGFzaENvZGUoKSDihpIgY29yZTo6aW50KjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2QgdG9TdHJpbmcoKSDihpIgY29yZTo6U3RyaW5nKjsKKyAgYWJzdHJhY3QgbWVtYmVyLXNpZ25hdHVyZSBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljOworICBhYnN0cmFjdCBtZW1iZXItc2lnbmF0dXJlIGdldCBydW50aW1lVHlwZSgpIOKGkiBjb3JlOjpUeXBlKjsKK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL25uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHlfbGliLmRhcnQgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5X2xpYi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0N2MxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9ubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5X2xpYi5kYXJ0CkBAIC0wLDAgKzEsMTMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBAZGFydD0yLjYKKworY2xhc3MgRDxUIGV4dGVuZHMgbnVtPiB7CisgIHZvaWQgcHJvbW90ZUxlZ2FjeShUIHQpIHsKKyAgICBpZiAodCBpcyBpbnQpIHsKKyAgICAgIHQ/LmlzRXZlbjsgLy8gQ3JlYXRlcyBUKiAmIGludCEKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMjk5ODMuZGFydC5vdXRsaW5lLmV4cGVjdCBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMjk5ODMuZGFydC5vdXRsaW5lLmV4cGVjdAppbmRleCBiYTM1OGI1Li42ZjY3NGYzIDEwMDY0NAotLS0gYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzI5OTgzLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvcmVncmVzcy9pc3N1ZV8yOTk4My5kYXJ0Lm91dGxpbmUuZXhwZWN0CkBAIC0xLDExICsxLDExIEBACiBsaWJyYXJ5OwogaW1wb3J0IHNlbGYgYXMgc2VsZjsKIAotc3RhdGljIG1ldGhvZCBmKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgZigpIOKGkiBkeW5hbWljIHN5bmMqIAogICA7Ci1zdGF0aWMgbWV0aG9kIGcoKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBnKCkg4oaSIGR5bmFtaWMgc3luYyogCiAgIDsKLXN0YXRpYyBtZXRob2QgaCgpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGgoKSDihpIgZHluYW1pYyBzeW5jKiAKICAgOwogc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKICAgOwpkaWZmIC0tZ2l0IGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvcmVncmVzcy9pc3N1ZV8zNDg1MC5kYXJ0Lm91dGxpbmUuZXhwZWN0IGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvcmVncmVzcy9pc3N1ZV8zNDg1MC5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IDcxYjRhYmMuLjM5M2M5ZWQgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMzQ4NTAuZGFydC5vdXRsaW5lLmV4cGVjdAorKysgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzM0ODUwLmRhcnQub3V0bGluZS5leHBlY3QKQEAgLTU3LDkgKzU3LDkgQEAKICAgOwogc3RhdGljIG1ldGhvZCBGdXR1cmU8TGlzdCBleHRlbmRzIGNvcmU6Ok9iamVjdCogPSBkeW5hbWljPigpIOKGkiBpbnZhbGlkLXR5cGUKICAgOwotc3RhdGljIG1ldGhvZCBmMigpIOKGkiBkeW5hbWljCitzdGF0aWMgbWV0aG9kIGYyKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgZjMoKSDihpIgaW52YWxpZC10eXBlCitzdGF0aWMgbWV0aG9kIGYzKCkg4oaSIGludmFsaWQtdHlwZSBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7CmRpZmYgLS1naXQgYS9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzM3NjgxLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9yZWdyZXNzL2lzc3VlXzM3NjgxLmRhcnQub3V0bGluZS5leHBlY3QKaW5kZXggNmEyOGMwZC4uYjMzMDRlZiAxMDA2NDQKLS0tIGEvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvcmVncmVzcy9pc3N1ZV8zNzY4MS5kYXJ0Lm91dGxpbmUuZXhwZWN0CisrKyBiL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3JlZ3Jlc3MvaXNzdWVfMzc2ODEuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtMSw1ICsxLDUgQEAKIGxpYnJhcnk7CiBpbXBvcnQgc2VsZiBhcyBzZWxmOwogCi1zdGF0aWMgbWV0aG9kIG1haW4oKSDihpIgZHluYW1pYworc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgYXN5bmMgCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3NldF9saXRlcmFscy9kaXNhbWJpZ3VhdGlvbl9ydWxlLmRhcnQub3V0bGluZS5leHBlY3QgYi9wa2cvZnJvbnRfZW5kL3Rlc3RjYXNlcy9zZXRfbGl0ZXJhbHMvZGlzYW1iaWd1YXRpb25fcnVsZS5kYXJ0Lm91dGxpbmUuZXhwZWN0CmluZGV4IGE3ZDMwYTMuLjJiM2UzMWEgMTAwNjQ0Ci0tLSBhL3BrZy9mcm9udF9lbmQvdGVzdGNhc2VzL3NldF9saXRlcmFscy9kaXNhbWJpZ3VhdGlvbl9ydWxlLmRhcnQub3V0bGluZS5leHBlY3QKKysrIGIvcGtnL2Zyb250X2VuZC90ZXN0Y2FzZXMvc2V0X2xpdGVyYWxzL2Rpc2FtYmlndWF0aW9uX3J1bGUuZGFydC5vdXRsaW5lLmV4cGVjdApAQCAtNywxNyArNywxNyBAQAogaW1wb3J0ICJkYXJ0OmFzeW5jIjsKIGltcG9ydCAiZGFydDpjb2xsZWN0aW9uIjsKIAotc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMKK3N0YXRpYyBtZXRob2QgbWFpbigpIOKGkiBkeW5hbWljIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIG1hcGZ1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpNYXA8Y29yZTo6aW50KiwgY29yZTo6Ym9vbCo+Kj4qCitzdGF0aWMgbWV0aG9kIG1hcGZ1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpNYXA8Y29yZTo6aW50KiwgY29yZTo6Ym9vbCo+Kj4qIGFzeW5jIAogICA7Ci1zdGF0aWMgbWV0aG9kIHNldGZ1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpTZXQ8Y29yZTo6aW50Kj4qPioKK3N0YXRpYyBtZXRob2Qgc2V0ZnVuKCkg4oaSIGFzeTo6RnV0dXJlPGNvcmU6OlNldDxjb3JlOjppbnQqPio+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBpdGVyYWJsZWZ1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQqPio+Kgorc3RhdGljIG1ldGhvZCBpdGVyYWJsZWZ1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb3JlOjpJdGVyYWJsZTxjb3JlOjppbnQqPio+KiBhc3luYyAKICAgOwotc3RhdGljIG1ldGhvZCBsaHNmdW4oKSDihpIgYXN5OjpGdXR1cmU8Y29sOjpMaW5rZWRIYXNoU2V0PGNvcmU6OmludCo+Kj4qCitzdGF0aWMgbWV0aG9kIGxoc2Z1bigpIOKGkiBhc3k6OkZ1dHVyZTxjb2w6OkxpbmtlZEhhc2hTZXQ8Y29yZTo6aW50Kj4qPiogYXN5bmMgCiAgIDsKLXN0YXRpYyBtZXRob2QgbGhtZnVuKCkg4oaSIGFzeTo6RnV0dXJlPGNvbDo6TGlua2VkSGFzaE1hcDxjb3JlOjppbnQqLCBjb3JlOjpib29sKj4qPioKK3N0YXRpYyBtZXRob2QgbGhtZnVuKCkg4oaSIGFzeTo6RnV0dXJlPGNvbDo6TGlua2VkSGFzaE1hcDxjb3JlOjppbnQqLCBjb3JlOjpib29sKj4qPiogYXN5bmMgCiAgIDsKIHN0YXRpYyBtZXRob2QgbWFwZnVuMigpIOKGkiBGdXR1cmVPcjxjb3JlOjpNYXA8Y29yZTo6aW50KiwgY29yZTo6Ym9vbCo+Kj4qCiAgIDsKZGlmZiAtLWdpdCBhL3BrZy9rZXJuZWwvYmluYXJ5Lm1kIGIvcGtnL2tlcm5lbC9iaW5hcnkubWQKaW5kZXggMmIzN2IyYy4uNzJlMjA1NyAxMDA2NDQKLS0tIGEvcGtnL2tlcm5lbC9iaW5hcnkubWQKKysrIGIvcGtnL2tlcm5lbC9iaW5hcnkubWQKQEAgLTE0Myw3ICsxNDMsOCBAQAogCiB0eXBlIENvbXBvbmVudEZpbGUgewogICBVSW50MzIgbWFnaWMgPSAweDkwQUJDREVGOwotICBVSW50MzIgZm9ybWF0VmVyc2lvbiA9IDQyOworICBVSW50MzIgZm9ybWF0VmVyc2lvbiA9IDQzOworICBCeXRlWzEwXSBzaG9ydFNka0hhc2g7CiAgIExpc3Q8U3RyaW5nPiBwcm9ibGVtc0FzSnNvbjsgLy8gRGVzY3JpYmVkIGluIHByb2JsZW1zLm1kLgogICBMaWJyYXJ5W10gbGlicmFyaWVzOwogICBVcmlTb3VyY2Ugc291cmNlTWFwOwpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC9saWIvYXN0LmRhcnQgYi9wa2cva2VybmVsL2xpYi9hc3QuZGFydAppbmRleCA3ZWZmMWEwLi44OWEwMzk4IDEwMDY0NAotLS0gYS9wa2cva2VybmVsL2xpYi9hc3QuZGFydAorKysgYi9wa2cva2VybmVsL2xpYi9hc3QuZGFydApAQCAtMjgxOCwxNCArMjgxOCwxNSBAQAogICAgICAgICAgICAgLmFwcGx5VG9GdW5jdGlvblR5cGUoY29tcHV0ZVRoaXNGdW5jdGlvblR5cGUobnVsbGFiaWxpdHkpKTsKICAgfQogCi0gIC8vLyBSZXR1cm4gZnVuY3Rpb24gdHlwZSBvZiBub2RlOiByZXR1cm4gW3R5cGVkZWZUeXBlXSwgcmV1c2UgdHlwZSBwYXJhbWV0ZXJzLgorICAvLy8gUmV0dXJuIGZ1bmN0aW9uIHR5cGUgb2Ygbm9kZSByZXR1cm5pbmcgW3R5cGVkZWZUeXBlXSByZXVzZSB0eXBlIHBhcmFtZXRlcnMKICAgLy8vCiAgIC8vLyBXaGVuIHRoaXMgZ2V0dGVyIGlzIGludm9rZWQsIHRoZSBwYXJlbnQgbXVzdCBiZSBhIFtDb25zdHJ1Y3Rvcl0uCiAgIC8vLyBUaGlzIGdldHRlciB3b3JrcyBzaW1pbGFybHkgdG8gW2NvbXB1dGVUaGlzRnVuY3Rpb25UeXBlXSwgYnV0IHVzZXMKICAgLy8vIFt0eXBlZGVmXSB0byBjb21wdXRlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gdHlwZS4gSXQKICAgLy8vIGlzIHVzZWZ1bCBpbiBzb21lIGNvbnRleHRzLCBlc3BlY2lhbGx5IGR1cmluZyBpbmZlcmVuY2Ugb2YgYWxpYXNlZAogICAvLy8gY29uc3RydWN0b3IgaW52b2NhdGlvbnMuCi0gIEZ1bmN0aW9uVHlwZSBjb21wdXRlQWxpYXNlZEZ1bmN0aW9uVHlwZShUeXBlZGVmIHR5cGVkZWYsIExpYnJhcnkgbGlicmFyeSkgeworICBGdW5jdGlvblR5cGUgY29tcHV0ZUFsaWFzZWRDb25zdHJ1Y3RvckZ1bmN0aW9uVHlwZSgKKyAgICAgIFR5cGVkZWYgdHlwZWRlZiwgTGlicmFyeSBsaWJyYXJ5KSB7CiAgICAgVHJlZU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICAgYXNzZXJ0KHBhcmVudCBpcyBDb25zdHJ1Y3RvciwgIk9ubHkgcnVuIHRoaXMgbWV0aG9kIG9uIGNvbnN0cnVjdG9ycyIpOwogICAgIENvbnN0cnVjdG9yIHBhcmVudENvbnN0cnVjdG9yID0gcGFyZW50OwpAQCAtMjg1NSw3ICsyODU2LDUxIEBACiAgICAgICAgICAgICBpc1JlcXVpcmVkOiBkZWNsLmlzUmVxdWlyZWQpKQogICAgICAgICAudG9MaXN0KGdyb3dhYmxlOiBmYWxzZSk7CiAgICAgbmFtZWQuc29ydCgpOwotICAgIHJldHVybiBuZXcgRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWwsIHR5cGVkZWZUeXBlLCBsaWJyYXJ5Lm5vbk51bGxhYmxlLAorICAgIHJldHVybiBGdW5jdGlvblR5cGUocG9zaXRpb25hbCwgdHlwZWRlZlR5cGUudW5hbGlhcywgbGlicmFyeS5ub25OdWxsYWJsZSwKKyAgICAgICAgbmFtZWRQYXJhbWV0ZXJzOiBuYW1lZCwKKyAgICAgICAgdHlwZVBhcmFtZXRlcnM6IHR5cGVkZWZUeXBlUGFyYW1ldGVyc0NvcHksCisgICAgICAgIHJlcXVpcmVkUGFyYW1ldGVyQ291bnQ6IHJlcXVpcmVkUGFyYW1ldGVyQ291bnQpOworICB9CisKKyAgLy8vIFJldHVybiBmdW5jdGlvbiB0eXBlIG9mIG5vZGUgcmV0dXJuaW5nIFt0eXBlZGVmVHlwZV0gcmV1c2UgdHlwZSBwYXJhbWV0ZXJzCisgIC8vLworICAvLy8gV2hlbiB0aGlzIGdldHRlciBpcyBpbnZva2VkLCB0aGUgcGFyZW50IG11c3QgYmUgYSBbUHJvY2VkdXJlXSB3aGljaCBpcyBhCisgIC8vLyByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yLiBUaGlzIGdldHRlciB3b3JrcyBzaW1pbGFybHkgdG8KKyAgLy8vIFtjb21wdXRlVGhpc0Z1bmN0aW9uVHlwZV0sIGJ1dCB1c2VzIFt0eXBlZGVmXSB0byBjb21wdXRlIHRoZSByZXR1cm4gdHlwZQorICAvLy8gb2YgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHR5cGUuIEl0IGlzIHVzZWZ1bCBpbiBzb21lIGNvbnRleHRzLCBlc3BlY2lhbGx5CisgIC8vLyBkdXJpbmcgaW5mZXJlbmNlIG9mIGFsaWFzZWQgZmFjdG9yeSBpbnZvY2F0aW9ucy4KKyAgRnVuY3Rpb25UeXBlIGNvbXB1dGVBbGlhc2VkRmFjdG9yeUZ1bmN0aW9uVHlwZSgKKyAgICAgIFR5cGVkZWYgdHlwZWRlZiwgTGlicmFyeSBsaWJyYXJ5KSB7CisgICAgYXNzZXJ0KAorICAgICAgICBwYXJlbnQgaXMgUHJvY2VkdXJlICYmCisgICAgICAgICAgICAocGFyZW50IGFzIFByb2NlZHVyZSkua2luZCA9PSBQcm9jZWR1cmVLaW5kLkZhY3RvcnksCisgICAgICAgICJPbmx5IHJ1biB0aGlzIG1ldGhvZCBvbiBhIGZhY3RvcnkiKTsKKyAgICAvLyBXZSBuZWVkIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGxpc3Qgb2YgdHlwZSBwYXJhbWV0ZXJzLCBvdGhlcndpc2UKKyAgICAvLyB0cmFuc2Zvcm1hdGlvbnMgbGlrZSBlcmFzdXJlIGRvbid0IHdvcmsuCisgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiBjbGFzc1R5cGVQYXJhbWV0ZXJzQ29weSA9IExpc3QuZnJvbSh0eXBlUGFyYW1ldGVycyk7CisgICAgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlZGVmVHlwZVBhcmFtZXRlcnNDb3B5ID0KKyAgICAgICAgTGlzdC5mcm9tKHR5cGVkZWYudHlwZVBhcmFtZXRlcnMpOworICAgIExpc3Q8RGFydFR5cGU+IGFzVHlwZUFyZ3VtZW50cyA9CisgICAgICAgIGdldEFzVHlwZUFyZ3VtZW50cyh0eXBlZGVmVHlwZVBhcmFtZXRlcnNDb3B5LCBsaWJyYXJ5KTsKKyAgICBUeXBlZGVmVHlwZSB0eXBlZGVmVHlwZSA9CisgICAgICAgIFR5cGVkZWZUeXBlKHR5cGVkZWYsIGxpYnJhcnkubm9uTnVsbGFibGUsIGFzVHlwZUFyZ3VtZW50cyk7CisgICAgRGFydFR5cGUgdW5hbGlhc2VkVHlwZWRlZiA9IHR5cGVkZWZUeXBlLnVuYWxpYXM7CisgICAgYXNzZXJ0KHVuYWxpYXNlZFR5cGVkZWYgaXMgSW50ZXJmYWNlVHlwZSwKKyAgICAgICAgIlt0eXBlZGVmXSBpcyBhc3N1bWVkIHRvIHJlc29sdmUgdG8gYW4gaW50ZXJmYWNlIHR5cGUiKTsKKyAgICBJbnRlcmZhY2VUeXBlIHRhcmdldFR5cGUgPSB1bmFsaWFzZWRUeXBlZGVmOworICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZnJvbVBhaXJzKAorICAgICAgICBjbGFzc1R5cGVQYXJhbWV0ZXJzQ29weSwgdGFyZ2V0VHlwZS50eXBlQXJndW1lbnRzKTsKKyAgICBMaXN0PERhcnRUeXBlPiBwb3NpdGlvbmFsID0gcG9zaXRpb25hbFBhcmFtZXRlcnMKKyAgICAgICAgLm1hcCgoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsKSA9PgorICAgICAgICAgICAgc3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVUeXBlKGRlY2wudHlwZSkpCisgICAgICAgIC50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKKyAgICBMaXN0PE5hbWVkVHlwZT4gbmFtZWQgPSBuYW1lZFBhcmFtZXRlcnMKKyAgICAgICAgLm1hcCgoVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsKSA9PiBOYW1lZFR5cGUoCisgICAgICAgICAgICBkZWNsLm5hbWUsIHN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlVHlwZShkZWNsLnR5cGUpLAorICAgICAgICAgICAgaXNSZXF1aXJlZDogZGVjbC5pc1JlcXVpcmVkKSkKKyAgICAgICAgLnRvTGlzdChncm93YWJsZTogZmFsc2UpOworICAgIG5hbWVkLnNvcnQoKTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlKHBvc2l0aW9uYWwsIHR5cGVkZWZUeXBlLnVuYWxpYXMsIGxpYnJhcnkubm9uTnVsbGFibGUsCiAgICAgICAgIG5hbWVkUGFyYW1ldGVyczogbmFtZWQsCiAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiB0eXBlZGVmVHlwZVBhcmFtZXRlcnNDb3B5LAogICAgICAgICByZXF1aXJlZFBhcmFtZXRlckNvdW50OiByZXF1aXJlZFBhcmFtZXRlckNvdW50KTsKQEAgLTU0MzgsNyArNTQ4Myw3IEBACiAgIH0KIAogICBEYXJ0VHlwZSBnZXRTdGF0aWNUeXBlKFN0YXRpY1R5cGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICByZXR1cm4gY29udGV4dC50eXBlRW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKG9wZXJhbmQuZ2V0U3RhdGljVHlwZShjb250ZXh0KSk7CisgICAgcmV0dXJuIGNvbnRleHQudHlwZUVudmlyb25tZW50LmZsYXR0ZW4ob3BlcmFuZC5nZXRTdGF0aWNUeXBlKGNvbnRleHQpKTsKICAgfQogCiAgIFIgYWNjZXB0PFI+KEV4cHJlc3Npb25WaXNpdG9yPFI+IHYpID0+IHYudmlzaXRBd2FpdEV4cHJlc3Npb24odGhpcyk7CkBAIC02OTE1LDYgKzY5NjAsMTMgQEAKICAgfQogCiAgIEBvdmVycmlkZQorICBTdHJpbmcgdG9TdHJpbmdJbnRlcm5hbCgpIHsKKyAgICBBc3RQcmludGVyIHByaW50ZXIgPSBuZXcgQXN0UHJpbnRlcihkZWZhdWx0QXN0VGV4dFN0cmF0ZWd5KTsKKyAgICBwcmludGVyLndyaXRlVmFyaWFibGVEZWNsYXJhdGlvbih0aGlzLCBpbmNsdWRlSW5pdGlhbGl6ZXI6IGZhbHNlKTsKKyAgICByZXR1cm4gcHJpbnRlci5nZXRUZXh0KCk7CisgIH0KKworICBAb3ZlcnJpZGUKICAgdm9pZCB0b1RleHRJbnRlcm5hbChBc3RQcmludGVyIHByaW50ZXIpIHsKICAgICBwcmludGVyLndyaXRlVmFyaWFibGVEZWNsYXJhdGlvbih0aGlzKTsKICAgICBwcmludGVyLndyaXRlKCc7Jyk7CkBAIC03OTkwLDEyICs4MDQyLDg4IEBACiAgIC8vLyBpcyB0aGVyZWZvcmUgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIG9mIFtwYXJhbWV0ZXJdLgogICBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kOwogCi0gIFR5cGVQYXJhbWV0ZXJUeXBlKHRoaXMucGFyYW1ldGVyLCB0aGlzLmRlY2xhcmVkTnVsbGFiaWxpdHksCi0gICAgICBbdGhpcy5wcm9tb3RlZEJvdW5kXSk7CisgIFR5cGVQYXJhbWV0ZXJUeXBlLmludGVybmFsKAorICAgICAgdGhpcy5wYXJhbWV0ZXIsIHRoaXMuZGVjbGFyZWROdWxsYWJpbGl0eSwgdGhpcy5wcm9tb3RlZEJvdW5kKSB7CisgICAgYXNzZXJ0KAorICAgICAgICBwcm9tb3RlZEJvdW5kID09IG51bGwgfHwKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgfHwKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHx8CisgICAgICAgICAgICAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSkgfHwKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHx8CisgICAgICAgICAgICAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB8fAorICAgICAgICAgICAgKGRlY2xhcmVkTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgb2JzZXJ2ZWQgaW4gcmVhbCBzaXR1YXRpb25zOgorICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9pZF90ZXN0cy90eXBlX3Byb21vdGlvbl90ZXN0CisgICAgICAgICAgICAvLyByZXBsaWNhdGVkIGluIG5uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgfHwKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9rZXJuZWxfdHlwZV9wYXJzZXJfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2Zhc3RhL2luY3JlbWVudGFsX2hlbGxvX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9mYXN0YV90eXBlc190ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZXhwbGljaXRfY3JlYXRpb25fdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90b29sL2Zhc3RhX3BlcmZfdGVzdAorICAgICAgICAgICAgLy8gbm5iZC9pc3N1ZTQyMDg5CisgICAgICAgICAgICAvLyByZXBsaWNhdGVkIGluIG5uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgfHwKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9leHBsaWNpdF9jcmVhdGlvbl90ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZGlsbF9yb3VuZF90cmlwX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9jb21waWxlX2RhcnQyanNfd2l0aF9ub19zZGtfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2Zhc3RhL3R5cGVzL2xhcmdlX2FwcF9iZW5jaG1hcmtfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX2RhcnQyanNfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L3JlYWRfZGlsbF9mcm9tX2JpbmFyeV9tZF90ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3Qvc3RhdGljX3R5cGVzL3N0YXRpY190eXBlX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9zcGxpdF9kaWxsX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdG9vbC9pbmNyZW1lbnRhbF9wZXJmX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy92bS90ZXN0L2tlcm5lbF9mcm9udF9lbmRfdGVzdAorICAgICAgICAgICAgLy8gZ2VuZXJhbC9wcm9tb3RlZF9udWxsX2F3YXJlX2FjY2VzcworICAgICAgICAgICAgLy8gaW5mZXJlbmNlL2NvbnN0cnVjdG9yc19pbmZlcl9mcm9tX2FyZ3VtZW50c19mYWN0b3J5CisgICAgICAgICAgICAvLyBpbmZlcmVuY2UvaW5mZXJfdHlwZXNfb25fbG9vcF9pbmRpY2VzX2Zvcl9lYWNoX2xvb3AKKyAgICAgICAgICAgIC8vIGluZmVyZW5jZS9pbmZlcl90eXBlc19vbl9sb29wX2luZGljZXNfZm9yX2VhY2hfbG9vcF9hc3luYworICAgICAgICAgICAgLy8gcmVwbGljYXRlZCBpbiBubmJkX21peGVkL3R5cGVfcGFyYW1ldGVyX251bGxhYmlsaXR5CisgICAgICAgICAgICAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB8fAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2Zhc3RhL2luY3JlbWVudGFsX2hlbGxvX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9leHBsaWNpdF9jcmVhdGlvbl90ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rvb2wvZmFzdGFfcGVyZl90ZXN0CisgICAgICAgICAgICAvLyByZXBsaWNhdGVkIGluIG5uYmRfbWl4ZWQvdHlwZV9wYXJhbWV0ZXJfbnVsbGFiaWxpdHkKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHx8CisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgb25seSBvYnNlcnZlZCBpbiB0ZXN0cyBhbmQgbWlnaHQgYmUgYXJ0aWZhY3RzIG9mIHRoZQorICAgICAgICAgICAgLy8gdGVzdHMgcmF0aGVyIHRoYW4gcmVhbCBzaXR1YXRpb25zOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9rZXJuZWxfdHlwZV9wYXJzZXJfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2Zhc3RhL3R5cGVzL2Zhc3RhX3R5cGVzX3Rlc3QKKyAgICAgICAgICAgIChkZWNsYXJlZE51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHx8CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMva2VybmVsX3R5cGVfcGFyc2VyX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9mYXN0YV90eXBlc190ZXN0CisgICAgICAgICAgICAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUpIHx8CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMva2VybmVsX3R5cGVfcGFyc2VyX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9mYXN0YV90eXBlc190ZXN0CisgICAgICAgICAgICAoZGVjbGFyZWROdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSksCisgICAgICAgICJVbmV4cGVjdGVkIG51bGxhYmlsaXRpZXMgZm9yICRwYXJhbWV0ZXIgJiAkcHJvbW90ZWRCb3VuZDogIgorICAgICAgICAiZGVjbGFyZWROdWxsYWJpbGl0eSA9ICRkZWNsYXJlZE51bGxhYmlsaXR5LCAiCisgICAgICAgICJwcm9tb3RlZCBib3VuZCBudWxsYWJpbGl0eSA9ICR7cHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eX0uIik7CisgIH0KKworICBUeXBlUGFyYW1ldGVyVHlwZShUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgTnVsbGFiaWxpdHkgZGVjbGFyZWROdWxsYWJpbGl0eSwKKyAgICAgIFtEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kXSkKKyAgICAgIDogdGhpcy5pbnRlcm5hbChwYXJhbWV0ZXIsIGRlY2xhcmVkTnVsbGFiaWxpdHksIHByb21vdGVkQm91bmQpOwogCiAgIC8vLyBDcmVhdGVzIGFuIGludGVyc2VjdGlvbiB0eXBlIGJldHdlZW4gYSB0eXBlIHBhcmFtZXRlciBhbmQgW3Byb21vdGVkQm91bmRdLgotICBUeXBlUGFyYW1ldGVyVHlwZS5pbnRlcnNlY3Rpb24oCi0gICAgICB0aGlzLnBhcmFtZXRlciwgdGhpcy5kZWNsYXJlZE51bGxhYmlsaXR5LCB0aGlzLnByb21vdGVkQm91bmQpOworICBUeXBlUGFyYW1ldGVyVHlwZS5pbnRlcnNlY3Rpb24oVHlwZVBhcmFtZXRlciBwYXJhbWV0ZXIsCisgICAgICBOdWxsYWJpbGl0eSBkZWNsYXJlZE51bGxhYmlsaXR5LCBEYXJ0VHlwZSBwcm9tb3RlZEJvdW5kKQorICAgICAgOiB0aGlzLmludGVybmFsKHBhcmFtZXRlciwgZGVjbGFyZWROdWxsYWJpbGl0eSwgcHJvbW90ZWRCb3VuZCk7CiAKICAgLy8vIENyZWF0ZXMgYSB0eXBlLXBhcmFtZXRlciB0eXBlIHRvIGJlIHVzZWQgaW4gYWxwaGEtcmVuYW1pbmcuCiAgIC8vLwpAQCAtODE5NCwxNiArODMyMiw4MCBAQAogICAgIC8vCiAgICAgLy8gfCBMSFMgXCBSSFMgfCAgISAgfCAgPyAgfCAgKiAgfCAgJSAgfAogICAgIC8vIHwtLS0tLS0tLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwKLSAgICAvLyB8ICAgICAhICAgICB8ICAhICB8IE4vQSB8IE4vQSB8ICAhICB8Ci0gICAgLy8gfCAgICAgPyAgICAgfCBOL0EgfCBOL0EgfCBOL0EgfCBOL0EgfAotICAgIC8vIHwgICAgICogICAgIHwgTi9BIHwgTi9BIHwgICogIHwgTi9BIHwKLSAgICAvLyB8ICAgICAlICAgICB8ICAhICB8ICAlICB8IE4vQSB8ICAlICB8CisgICAgLy8gfCAgICAgISAgICAgfCAgISAgfCAgKyAgfCBOL0EgfCAgISAgfAorICAgIC8vIHwgICAgID8gICAgIHwgKCEpIHwgKD8pIHwgTi9BIHwgKCUpIHwKKyAgICAvLyB8ICAgICAqICAgICB8ICgqKSB8ICArICB8ICAqICB8IE4vQSB8CisgICAgLy8gfCAgICAgJSAgICAgfCAgISAgfCAgJSAgfCAgKyAgfCAgJSAgfAogICAgIC8vCiAgICAgLy8gSW4gdGhlIHRhYmxlLCBMSFMgY29ycmVzcG9uZHMgdG8gbGhzTnVsbGFiaWxpdHkgaW4gdGhlIGNvZGUgYmVsb3c7IFJIUwogICAgIC8vIGNvcnJlc3BvbmRzIHRvIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHk7ICEsID8sICosIGFuZCAlIGNvcnJlc3BvbmQgdG8KICAgICAvLyBub25OdWxsYWJsZSwgbnVsbGFibGUsIGxlZ2FjeSwgYW5kIHVuZGV0ZXJtaW5lZCB2YWx1ZXMgb2YgdGhlIE51bGxhYmlsaXR5CiAgICAgLy8gZW51bS4KLSAgICAvLworCisgICAgYXNzZXJ0KAorICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlKSB8fAorICAgICAgICAgICAgKGxoc051bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm5vbk51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHx8CisgICAgICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubGVnYWN5ICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHx8CisgICAgICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgfHwKKyAgICAgICAgICAgIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB8fAorICAgICAgICAgICAgKGxoc051bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkKQorICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGVzZSBoYXBwZW5zIGFzIHdlbGw6CisgICAgICAgICAgICB8fAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2lkX3Rlc3RzL3R5cGVfcHJvbW90aW9uX3Rlc3QKKyAgICAgICAgICAgIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHx8CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMva2VybmVsX3R5cGVfcGFyc2VyX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS9pbmNyZW1lbnRhbF9oZWxsb190ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMvZmFzdGFfdHlwZXNfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2V4cGxpY2l0X2NyZWF0aW9uX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdG9vbC9mYXN0YV9wZXJmX3Rlc3QKKyAgICAgICAgICAgIC8vIG5uYmQvaXNzdWU0MjA4OQorICAgICAgICAgICAgKGxoc051bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgfHwKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9leHBsaWNpdF9jcmVhdGlvbl90ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZGlsbF9yb3VuZF90cmlwX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9jb21waWxlX2RhcnQyanNfd2l0aF9ub19zZGtfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2Zhc3RhL3R5cGVzL2xhcmdlX2FwcF9iZW5jaG1hcmtfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2luY3JlbWVudGFsX2RhcnQyanNfdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L3JlYWRfZGlsbF9mcm9tX2JpbmFyeV9tZF90ZXN0CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3Qvc3RhdGljX3R5cGVzL3N0YXRpY190eXBlX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9zcGxpdF9kaWxsX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdG9vbC9pbmNyZW1lbnRhbF9wZXJmX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy92bS90ZXN0L2tlcm5lbF9mcm9udF9lbmRfdGVzdAorICAgICAgICAgICAgLy8gZ2VuZXJhbC9wcm9tb3RlZF9udWxsX2F3YXJlX2FjY2VzcworICAgICAgICAgICAgLy8gaW5mZXJlbmNlL2NvbnN0cnVjdG9yc19pbmZlcl9mcm9tX2FyZ3VtZW50c19mYWN0b3J5CisgICAgICAgICAgICAvLyBpbmZlcmVuY2UvaW5mZXJfdHlwZXNfb25fbG9vcF9pbmRpY2VzX2Zvcl9lYWNoX2xvb3AKKyAgICAgICAgICAgIC8vIGluZmVyZW5jZS9pbmZlcl90eXBlc19vbl9sb29wX2luZGljZXNfZm9yX2VhY2hfbG9vcF9hc3luYworICAgICAgICAgICAgKGxoc051bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LmxlZ2FjeSAmJgorICAgICAgICAgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHx8CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvaW5jcmVtZW50YWxfaGVsbG9fdGVzdAorICAgICAgICAgICAgLy8gcGtnL2Zyb250X2VuZC90ZXN0L2V4cGxpY2l0X2NyZWF0aW9uX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdG9vbC9mYXN0YV9wZXJmX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS9pbmNyZW1lbnRhbF9oZWxsb190ZXN0CisgICAgICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkgfHwKKworICAgICAgICAgICAgLy8gVGhpcyBpcyBjcmVhdGVkIGJ1dCBuZXZlciBvYnNlcnZlZC4KKyAgICAgICAgICAgIC8vIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgJiYKKyAgICAgICAgICAgIC8vICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSB8fAorCisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMva2VybmVsX3R5cGVfcGFyc2VyX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9mYXN0YV90eXBlc190ZXN0CisgICAgICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkudW5kZXRlcm1pbmVkICYmCisgICAgICAgICAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kpIHx8CisgICAgICAgICAgICAvLyBwa2cvZnJvbnRfZW5kL3Rlc3QvZmFzdGEvdHlwZXMva2VybmVsX3R5cGVfcGFyc2VyX3Rlc3QKKyAgICAgICAgICAgIC8vIHBrZy9mcm9udF9lbmQvdGVzdC9mYXN0YS90eXBlcy9mYXN0YV90eXBlc190ZXN0CisgICAgICAgICAgICAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUgJiYKKyAgICAgICAgICAgICAgICBwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlKSwKKyAgICAgICAgIlVuZXhwZWN0ZWQgbnVsbGFiaWxpdGllcyBmb3I6IExIUyBudWxsYWJpbGl0eSA9ICRsaHNOdWxsYWJpbGl0eSwgIgorICAgICAgICAiUkhTIG51bGxhYmlsaXR5ID0gJHtwcm9tb3RlZEJvdW5kLm51bGxhYmlsaXR5fS4iKTsKKwogICAgIC8vIFdoZW5ldmVyIHRoZXJlJ3MgTi9BIGluIHRoZSB0YWJsZSwgaXQgbWVhbnMgdGhhdCB0aGUgY29ycmVzcG9uZGluZwogICAgIC8vIGNvbWJpbmF0aW9uIG9mIHRoZSBMSFMgYW5kIFJIUyBudWxsYWJpbGl0eSBpcyBub3QgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAvLyBmcm9tIERhcnQgc291cmNlIGZpbGVzLCBzbyB3ZSBjYW4gZGVmaW5lIGl0IHRvIGJlIHdoYXRldmVyIGlzIGZhc3RlciBhbmQKQEAgLTgyMTUsMTAgKzg0MDcsMzAgQEAKICAgICAvLyB8IExIUyBcIFJIUyB8ICAhICB8ICA/ICB8ICAqICB8ICAlICB8CiAgICAgLy8gfC0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfAogICAgIC8vIHwgICAgICEgICAgIHwgICEgIHwgICEgIHwgICEgIHwgICEgIHwKLSAgICAvLyB8ICAgICA/ICAgICB8ICAhICB8ICAqICB8ICAqICB8ICAlICB8Ci0gICAgLy8gfCAgICAgKiAgICAgfCAgISAgfCAgKiAgfCAgKiAgfCAgJSAgfAorICAgIC8vIHwgICAgID8gICAgIHwgKCEpIHwgKD8pIHwgICogIHwgKCUpIHwKKyAgICAvLyB8ICAgICAqICAgICB8ICgqKSB8ICAqICB8ICAqICB8ICAlICB8CiAgICAgLy8gfCAgICAgJSAgICAgfCAgISAgfCAgJSAgfCAgJSAgfCAgJSAgfAogCisgICAgaWYgKGxoc051bGxhYmlsaXR5ID09IE51bGxhYmlsaXR5Lm51bGxhYmxlICYmCisgICAgICAgIHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubm9uTnVsbGFibGUpIHsKKyAgICAgIHJldHVybiBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZTsKKyAgICB9CisKKyAgICBpZiAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgJiYKKyAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5udWxsYWJsZSkgeworICAgICAgcmV0dXJuIE51bGxhYmlsaXR5Lm51bGxhYmxlOworICAgIH0KKworICAgIGlmIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5sZWdhY3kgJiYKKyAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSkgeworICAgICAgcmV0dXJuIE51bGxhYmlsaXR5LmxlZ2FjeTsKKyAgICB9CisKKyAgICBpZiAobGhzTnVsbGFiaWxpdHkgPT0gTnVsbGFiaWxpdHkubnVsbGFibGUgJiYKKyAgICAgICAgcHJvbW90ZWRCb3VuZC5udWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS51bmRldGVybWluZWQpIHsKKyAgICAgIHJldHVybiBOdWxsYWJpbGl0eS51bmRldGVybWluZWQ7CisgICAgfQorCiAgICAgLy8gSW50ZXJzZWN0aW9uIHdpdGggYSBub24tbnVsbGFibGUgdHlwZSBhbHdheXMgeWllbGRzIGEgbm9uLW51bGxhYmxlIHR5cGUsCiAgICAgLy8gYXMgaXQncyB0aGUgbW9zdCByZXN0cmljdGl2ZSBraW5kIG9mIHR5cGVzLgogICAgIGlmIChsaHNOdWxsYWJpbGl0eSA9PSBOdWxsYWJpbGl0eS5ub25OdWxsYWJsZSB8fApAQCAtODI1OCwyMiArODQ3MCwxNyBAQAogCiAgIEBvdmVycmlkZQogICB2b2lkIHRvVGV4dEludGVybmFsKEFzdFByaW50ZXIgcHJpbnRlcikgewotICAgIHByaW50ZXIud3JpdGVUeXBlUGFyYW1ldGVyTmFtZShwYXJhbWV0ZXIpOwotICAgIHByaW50ZXIud3JpdGUobnVsbGFiaWxpdHlUb1N0cmluZyhkZWNsYXJlZE51bGxhYmlsaXR5KSk7CiAgICAgaWYgKHByb21vdGVkQm91bmQgIT0gbnVsbCkgeworICAgICAgcHJpbnRlci53cml0ZSgnKCcpOworICAgICAgcHJpbnRlci53cml0ZVR5cGVQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlcik7CisgICAgICBwcmludGVyLndyaXRlKG51bGxhYmlsaXR5VG9TdHJpbmcoZGVjbGFyZWROdWxsYWJpbGl0eSkpOwogICAgICAgcHJpbnRlci53cml0ZSgiICYgIik7Ci0gICAgICBwcmludGVyLndyaXRlKHByb21vdGVkQm91bmQudG9TdHJpbmdJbnRlcm5hbCgpKTsKLSAgICAgIHByaW50ZXIud3JpdGUoIiAvKiAnIik7CisgICAgICBwcmludGVyLndyaXRlVHlwZShwcm9tb3RlZEJvdW5kKTsKKyAgICAgIHByaW50ZXIud3JpdGUoJyknKTsKKyAgICAgIHByaW50ZXIud3JpdGUobnVsbGFiaWxpdHlUb1N0cmluZyhudWxsYWJpbGl0eSkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLndyaXRlVHlwZVBhcmFtZXRlck5hbWUocGFyYW1ldGVyKTsKICAgICAgIHByaW50ZXIud3JpdGUobnVsbGFiaWxpdHlUb1N0cmluZyhkZWNsYXJlZE51bGxhYmlsaXR5KSk7Ci0gICAgICBwcmludGVyLndyaXRlKCInICYgJyIpOwotICAgICAgaWYgKHByb21vdGVkQm91bmQgaXMgSW52YWxpZFR5cGUpIHsKLSAgICAgICAgcHJpbnRlci53cml0ZShudWxsYWJpbGl0eVRvU3RyaW5nKE51bGxhYmlsaXR5LnVuZGV0ZXJtaW5lZCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRlci53cml0ZShudWxsYWJpbGl0eVRvU3RyaW5nKHByb21vdGVkQm91bmQubnVsbGFiaWxpdHkpKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZXIud3JpdGUoIicgPSAnIik7Ci0gICAgICBwcmludGVyLndyaXRlKG51bGxhYmlsaXR5VG9TdHJpbmcoZGVjbGFyZWROdWxsYWJpbGl0eSkpOwotICAgICAgcHJpbnRlci53cml0ZSgiJyAqLyIpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC9saWIvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvYmluYXJ5L2FzdF9mcm9tX2JpbmFyeS5kYXJ0CmluZGV4IDlhMzI2NzcuLmI1ZTcwYjYgMTAwNjQ0Ci0tLSBhL3BrZy9rZXJuZWwvbGliL2JpbmFyeS9hc3RfZnJvbV9iaW5hcnkuZGFydAorKysgYi9wa2cva2VybmVsL2xpYi9iaW5hcnkvYXN0X2Zyb21fYmluYXJ5LmRhcnQKQEAgLTUsNiArNSw3IEBACiAKIGltcG9ydCAnZGFydDpjb3JlJyBoaWRlIE1hcEVudHJ5OwogaW1wb3J0ICdkYXJ0OmRldmVsb3Blcic7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CiBpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CiAKIGltcG9ydCAnLi4vYXN0LmRhcnQnOwpAQCAtMjgsMTEgKzI5LDIyIEBACiAgIEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IodGhpcy52ZXJzaW9uKTsKIAogICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdVbmV4cGVjdGVkIEtlcm5lbCB2ZXJzaW9uICR7dmVyc2lvbn0gJworICAgIHJldHVybiAnVW5leHBlY3RlZCBLZXJuZWwgRm9ybWF0IFZlcnNpb24gJHt2ZXJzaW9ufSAnCiAgICAgICAgICcoZXhwZWN0ZWQgJHtUYWcuQmluYXJ5Rm9ybWF0VmVyc2lvbn0pLic7CiAgIH0KIH0KIAorY2xhc3MgSW52YWxpZEtlcm5lbFNka1ZlcnNpb25FcnJvciB7CisgIGZpbmFsIFN0cmluZyB2ZXJzaW9uOworCisgIEludmFsaWRLZXJuZWxTZGtWZXJzaW9uRXJyb3IodGhpcy52ZXJzaW9uKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICdVbmV4cGVjdGVkIEtlcm5lbCBTREsgVmVyc2lvbiAke3ZlcnNpb259ICcKKyAgICAgICAgJyhleHBlY3RlZCAke2V4cGVjdGVkU2RrSGFzaH0pLic7CisgIH0KK30KKwogY2xhc3MgQ29tcGlsYXRpb25Nb2RlRXJyb3IgewogICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKIApAQCAtNDg0LDYgKzQ5NiwxMyBAQAogICAgIGlmIChfYnl0ZXMubGVuZ3RoID09IDApIHRocm93IG5ldyBTdGF0ZUVycm9yKCJFbXB0eSBpbnB1dCBnaXZlbi4iKTsKICAgfQogCisgIHZvaWQgX3JlYWRBbmRWZXJpZnlTZGtIYXNoKCkgeworICAgIGZpbmFsIHNka0hhc2ggPSBhc2NpaS5kZWNvZGUocmVhZEJ5dGVzKHNka0hhc2hMZW5ndGgpKTsKKyAgICBpZiAoIWlzVmFsaWRTZGtIYXNoKHNka0hhc2gpKSB7CisgICAgICB0aHJvdyBJbnZhbGlkS2VybmVsU2RrVmVyc2lvbkVycm9yKHNka0hhc2gpOworICAgIH0KKyAgfQorCiAgIC8vLyBEZXNlcmlhbGl6ZXMgYSBrZXJuZWwgY29tcG9uZW50IGFuZCBzdG9yZXMgaXQgaW4gW2NvbXBvbmVudF0uCiAgIC8vLwogICAvLy8gV2hlbiBsaW5raW5nIHdpdGggYSBub24tZW1wdHkgY29tcG9uZW50LCBjYW5vbmljYWwgbmFtZXMgbXVzdCBoYXZlIGJlZW4KQEAgLTUxMSw2ICs1MzAsOSBAQAogICAgICAgaWYgKHZlcnNpb24gIT0gVGFnLkJpbmFyeUZvcm1hdFZlcnNpb24pIHsKICAgICAgICAgdGhyb3cgSW52YWxpZEtlcm5lbFZlcnNpb25FcnJvcih2ZXJzaW9uKTsKICAgICAgIH0KKworICAgICAgX3JlYWRBbmRWZXJpZnlTZGtIYXNoKCk7CisKICAgICAgIF9ieXRlT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgTGlzdDxpbnQ+IGNvbXBvbmVudEZpbGVTaXplcyA9IF9pbmRleENvbXBvbmVudHMoKTsKICAgICAgIGlmIChjb21wb25lbnRGaWxlU2l6ZXMubGVuZ3RoID4gMSkgewpAQCAtNjk0LDYgKzcxNiw4IEBACiAgICAgICB0aHJvdyBJbnZhbGlkS2VybmVsVmVyc2lvbkVycm9yKGZvcm1hdFZlcnNpb24pOwogICAgIH0KIAorICAgIF9yZWFkQW5kVmVyaWZ5U2RrSGFzaCgpOworCiAgICAgLy8gUmVhZCBjb21wb25lbnQgaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoaXMgQ29tcG9uZW50RmlsZXMgc2VyaWFsaXplZCBkYXRhLgogICAgIF9Db21wb25lbnRJbmRleCBpbmRleCA9IF9yZWFkQ29tcG9uZW50SW5kZXgoY29tcG9uZW50RmlsZVNpemUpOwogCkBAIC03MTgsNiArNzQyLDggQEAKICAgICAgIHRocm93IEludmFsaWRLZXJuZWxWZXJzaW9uRXJyb3IoZm9ybWF0VmVyc2lvbik7CiAgICAgfQogCisgICAgX3JlYWRBbmRWZXJpZnlTZGtIYXNoKCk7CisKICAgICBMaXN0PFN0cmluZz4gcHJvYmxlbXNBc0pzb24gPSByZWFkTGlzdE9mU3RyaW5ncygpOwogICAgIGlmIChwcm9ibGVtc0FzSnNvbiAhPSBudWxsKSB7CiAgICAgICBjb21wb25lbnQucHJvYmxlbXNBc0pzb24gPz89IDxTdHJpbmc+W107CmRpZmYgLS1naXQgYS9wa2cva2VybmVsL2xpYi9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvYmluYXJ5L2FzdF90b19iaW5hcnkuZGFydAppbmRleCA1N2NjZDJmLi5kYzNiZTFlIDEwMDY0NAotLS0gYS9wa2cva2VybmVsL2xpYi9iaW5hcnkvYXN0X3RvX2JpbmFyeS5kYXJ0CisrKyBiL3BrZy9rZXJuZWwvbGliL2JpbmFyeS9hc3RfdG9fYmluYXJ5LmRhcnQKQEAgLTQsNiArNCw3IEBACiBsaWJyYXJ5IGtlcm5lbC5hc3RfdG9fYmluYXJ5OwogCiBpbXBvcnQgJ2RhcnQ6Y29yZScgaGlkZSBNYXBFbnRyeTsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKIGltcG9ydCAnZGFydDpkZXZlbG9wZXInOwogaW1wb3J0ICdkYXJ0OmlvJyBzaG93IEJ5dGVzQnVpbGRlcjsKIGltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKQEAgLTUzNyw2ICs1MzgsNyBAQAogICAgICAgZmluYWwgY29tcG9uZW50T2Zmc2V0ID0gZ2V0QnVmZmVyT2Zmc2V0KCk7CiAgICAgICB3cml0ZVVJbnQzMihUYWcuQ29tcG9uZW50RmlsZSk7CiAgICAgICB3cml0ZVVJbnQzMihUYWcuQmluYXJ5Rm9ybWF0VmVyc2lvbik7CisgICAgICB3cml0ZUJ5dGVzKGFzY2lpLmVuY29kZShleHBlY3RlZFNka0hhc2gpKTsKICAgICAgIHdyaXRlTGlzdE9mU3RyaW5ncyhjb21wb25lbnQucHJvYmxlbXNBc0pzb24pOwogICAgICAgaW5kZXhMaW5rVGFibGUoY29tcG9uZW50KTsKICAgICAgIF9jb2xsZWN0TWV0YWRhdGEoY29tcG9uZW50KTsKZGlmZiAtLWdpdCBhL3BrZy9rZXJuZWwvbGliL2JpbmFyeS90YWcuZGFydCBiL3BrZy9rZXJuZWwvbGliL2JpbmFyeS90YWcuZGFydAppbmRleCBjZWMyMzA4Li43OWNlYTMyIDEwMDY0NAotLS0gYS9wa2cva2VybmVsL2xpYi9iaW5hcnkvdGFnLmRhcnQKKysrIGIvcGtnL2tlcm5lbC9saWIvYmluYXJ5L3RhZy5kYXJ0CkBAIC0xNDksNyArMTQ5LDcgQEAKICAgLy8vIEludGVybmFsIHZlcnNpb24gb2Yga2VybmVsIGJpbmFyeSBmb3JtYXQuCiAgIC8vLyBCdW1wIGl0IHdoZW4gbWFraW5nIGluY29tcGF0aWJsZSBjaGFuZ2VzIGluIGtlcm5lbCBiaW5hcmllcy4KICAgLy8vIEtlZXAgaW4gc3luYyB3aXRoIHJ1bnRpbWUvdm0va2VybmVsX2JpbmFyeS5oLCBwa2cva2VybmVsL2JpbmFyeS5tZC4KLSAgc3RhdGljIGNvbnN0IGludCBCaW5hcnlGb3JtYXRWZXJzaW9uID0gNDI7CisgIHN0YXRpYyBjb25zdCBpbnQgQmluYXJ5Rm9ybWF0VmVyc2lvbiA9IDQzOwogfQogCiBhYnN0cmFjdCBjbGFzcyBDb25zdGFudFRhZyB7CkBAIC0xNjksMyArMTY5LDI3IEBACiAgIHN0YXRpYyBjb25zdCBpbnQgVW5ldmFsdWF0ZWRDb25zdGFudCA9IDEyOwogICAvLyAxMyBpcyBvY2N1cGllZCBieSBbU2V0Q29uc3RhbnRdCiB9CisKK2NvbnN0IGludCBzZGtIYXNoTGVuZ3RoID0gMTA7IC8vIEJ5dGVzLCBhIEdpdCAic2hvcnQgaGFzaCIuCisKK2NvbnN0IFN0cmluZyBzZGtIYXNoTnVsbCA9ICcwMDAwMDAwMDAwJzsKKworLy8gV2lsbCBiZSBjb3JyZWN0IGhhc2ggZm9yIEZsdXR0ZXIgU0RLIC8gRGFydCBTREsgd2UgZGlzdHJpYnV0ZS4KKy8vIElmIG5vbi1udWxsIHdlIHdpbGwgdmFsaWRhdGUgd2hlbiBjb25zdW1pbmcga2VybmVsLCB3aWxsIHVzZSB3aGVuIHByb2R1Y2luZworLy8ga2VybmVsLgorLy8gSWYgbnVsbCwgbG9jYWwgZGV2ZWxvcG1lbnQgc2V0dGluZyAoZS5nLiBydW4gZ2VuX2tlcm5lbC5kYXJ0IGZyb20gc291cmNlKSwKKy8vIHdlIHB1dCAweDAwLi4wMCBpbnRvIHdoZW4gcHJvZHVjaW5nLCBkbyBub3QgdmFsaWRhdGUgd2hlbiBjb25zdW1pbmcuCitTdHJpbmcgZ2V0IGV4cGVjdGVkU2RrSGFzaCB7CisgIGZpbmFsIHNka0hhc2ggPQorICAgICAgY29uc3QgU3RyaW5nLmZyb21FbnZpcm9ubWVudCgnc2RrX2hhc2gnLCBkZWZhdWx0VmFsdWU6IHNka0hhc2hOdWxsKTsKKyAgaWYgKHNka0hhc2gubGVuZ3RoICE9IHNka0hhc2hMZW5ndGgpIHsKKyAgICB0aHJvdyAnLURzZGtfaGFzaD08aGFzaD4gbXVzdCBiZSBhICR7c2RrSGFzaExlbmd0aH0gYnl0ZSBzdHJpbmchJzsKKyAgfQorICByZXR1cm4gc2RrSGFzaDsKK30KKworYm9vbCBpc1ZhbGlkU2RrSGFzaChTdHJpbmcgc2RrSGFzaCkgeworICByZXR1cm4gKHNka0hhc2ggPT0gc2RrSGFzaE51bGwgfHwKKyAgICAgIGV4cGVjdGVkU2RrSGFzaCA9PSBzZGtIYXNoTnVsbCB8fAorICAgICAgc2RrSGFzaCA9PSBleHBlY3RlZFNka0hhc2gpOworfQpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC9saWIvc3JjL2RhcnRfdHlwZV9lcXVpdmFsZW5jZS5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvc3JjL2RhcnRfdHlwZV9lcXVpdmFsZW5jZS5kYXJ0CmluZGV4IGNkYjY1ODYuLjM1ZGVmNDkgMTAwNjQ0Ci0tLSBhL3BrZy9rZXJuZWwvbGliL3NyYy9kYXJ0X3R5cGVfZXF1aXZhbGVuY2UuZGFydAorKysgYi9wa2cva2VybmVsL2xpYi9zcmMvZGFydF90eXBlX2VxdWl2YWxlbmNlLmRhcnQKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgfQogICAgICAgYXNzZXJ0KG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgaWYgKCFub2RlLnR5cGVBcmd1bWVudHNbaV0uYWNjZXB0MSh0aGlzLCBub2RlLnR5cGVBcmd1bWVudHNbaV0pKSB7CisgICAgICAgIGlmICghbm9kZS50eXBlQXJndW1lbnRzW2ldLmFjY2VwdDEodGhpcywgb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkpIHsKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL3BrZy9rZXJuZWwvbGliL3NyYy9mdXR1cmVfdmFsdWVfdHlwZS5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvc3JjL2Z1dHVyZV92YWx1ZV90eXBlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5YmI2OQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9rZXJuZWwvbGliL3NyYy9mdXR1cmVfdmFsdWVfdHlwZS5kYXJ0CkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnLi4vYXN0LmRhcnQnOworaW1wb3J0ICcuLi9jb3JlX3R5cGVzLmRhcnQnOworCitEYXJ0VHlwZSBjb21wdXRlRnV0dXJlVmFsdWVUeXBlKENvcmVUeXBlcyBjb3JlVHlwZXMsIERhcnRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIHR5cGUuYWNjZXB0MShjb25zdCBGdXR1cmVWYWx1ZVR5cGVWaXNpdG9yKCksIGNvcmVUeXBlcyk7Cit9CisKK2NsYXNzIEZ1dHVyZVZhbHVlVHlwZVZpc2l0b3IgaW1wbGVtZW50cyBEYXJ0VHlwZVZpc2l0b3IxPERhcnRUeXBlLCBDb3JlVHlwZXM+IHsKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiBpbnZva2VkIG9uIHVua25vd24gaW1wbGVtZW50ZXJzIG9mIFtEYXJ0VHlwZV0uCisgIC8vLworICAvLy8gSXRzIGFyZ3VtZW50cyBhcmUgdGhlIHVuaGFuZGxlZCB0eXBlIGFuZCB0aGUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgaW52b2tlZAorICAvLy8gZnJvbSB3aXRoaW4gdGhlIGhhbmRsZXIgb24gcGFydHMgb2YgdGhlIHVua25vd24gdHlwZSB0byByZWN1cnNpdmVseSBjYWxsCisgIC8vLyB0aGUgdmlzaXRvci4gIElmIG5vdCBzZXQsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gdGhlbiBhbiB1bmhhbmRsZWQKKyAgLy8vIGltcGxlbWVudGVyIG9mIFtEYXJ0VHlwZV0gaXMgZW5jb3VudGVyZWQuCisgIGZpbmFsIERhcnRUeXBlIEZ1bmN0aW9uKERhcnRUeXBlIG5vZGUsIENvcmVUeXBlcyBjb3JlVHlwZXMsCisgICAgICAgICAgRGFydFR5cGUgRnVuY3Rpb24oRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgcmVjdXJzb3IpCisgICAgICB1bmhhbmRsZWRUeXBlSGFuZGxlcjsKKworICBjb25zdCBGdXR1cmVWYWx1ZVR5cGVWaXNpdG9yKHt0aGlzLnVuaGFuZGxlZFR5cGVIYW5kbGVyfSk7CisKKyAgRGFydFR5cGUgdmlzaXQoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgPT4KKyAgICAgIG5vZGUuYWNjZXB0MSh0aGlzLCBjb3JlVHlwZXMpOworCisgIEBvdmVycmlkZQorICBEYXJ0VHlwZSBkZWZhdWx0RGFydFR5cGUoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIGlmICh1bmhhbmRsZWRUeXBlSGFuZGxlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSAnJHtub2RlLnJ1bnRpbWVUeXBlfScuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1bmhhbmRsZWRUeXBlSGFuZGxlcihub2RlLCBjb3JlVHlwZXMsIHZpc2l0KTsKKyAgICB9CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgdmlzaXRCb3R0b21UeXBlKEJvdHRvbVR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBTLCBmdXR1cmVWYWx1ZVR5cGUoUykgPSBPYmplY3Q/LgorICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOworICB9CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHZpc2l0RHluYW1pY1R5cGUoRHluYW1pY1R5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIGZ1dHVyZVZhbHVlVHlwZShkeW5hbWljKSA9IGR5bmFtaWMuCisgICAgcmV0dXJuIG5vZGU7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgdmlzaXRGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlIG5vZGUsIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKKyAgICAvLyBPdGhlcndpc2UsIGZvciBhbGwgUywgZnV0dXJlVmFsdWVUeXBlKFMpID0gT2JqZWN0Py4KKyAgICByZXR1cm4gY29yZVR5cGVzLm9iamVjdE51bGxhYmxlUmF3VHlwZTsKKyAgfQorCisgIEBvdmVycmlkZQorICBEYXJ0VHlwZSB2aXNpdEludGVyZmFjZVR5cGUoSW50ZXJmYWNlVHlwZSBub2RlLCBDb3JlVHlwZXMgY29yZVR5cGVzKSB7CisgICAgaWYgKG5vZGUuY2xhc3NOb2RlID09IGNvcmVUeXBlcy5mdXR1cmVDbGFzcykgeworICAgICAgLy8gZnV0dXJlVmFsdWVUeXBlKEZ1dHVyZTxTPikgPSBTLCBmb3IgYWxsIFMuCisgICAgICByZXR1cm4gbm9kZS50eXBlQXJndW1lbnRzLnNpbmdsZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlLCBmb3IgYWxsIFMsIGZ1dHVyZVZhbHVlVHlwZShTKSA9IE9iamVjdD8uCisgICAgcmV0dXJuIGNvcmVUeXBlcy5vYmplY3ROdWxsYWJsZVJhd1R5cGU7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgdmlzaXRGdXR1cmVPclR5cGUoRnV0dXJlT3JUeXBlIG5vZGUsIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKKyAgICAvLyBmdXR1cmVWYWx1ZVR5cGUoRnV0dXJlT3I8Uz4pID0gUywgZm9yIGFsbCBTLgorICAgIHJldHVybiBub2RlLnR5cGVBcmd1bWVudDsKKyAgfQorCisgIEBvdmVycmlkZQorICBEYXJ0VHlwZSB2aXNpdEludmFsaWRUeXBlKEludmFsaWRUeXBlIG5vZGUsIENvcmVUeXBlcyBjb3JlVHlwZXMpIHsKKyAgICAvLyBSZXR1cm4gdGhlIGludmFsaWQgdHlwZSBpdHNlbGYgdG8gY29udGludWUgdGhlIGVuY2Fwc3VsYXRpb24gb2YgdGhlCisgICAgLy8gZXJyb3Igc3RhdGUuCisgICAgcmV0dXJuIG5vZGU7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRGFydFR5cGUgdmlzaXROZXZlclR5cGUoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBTLCBmdXR1cmVWYWx1ZVR5cGUoUykgPSBPYmplY3Q/LgorICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOworICB9CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHZpc2l0VHlwZVBhcmFtZXRlclR5cGUoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBTLCBmdXR1cmVWYWx1ZVR5cGUoUykgPSBPYmplY3Q/LgorICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOworICB9CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHZpc2l0VHlwZWRlZlR5cGUoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIE90aGVyd2lzZSwgZm9yIGFsbCBTLCBmdXR1cmVWYWx1ZVR5cGUoUykgPSBPYmplY3Q/LgorICAgIHJldHVybiBjb3JlVHlwZXMub2JqZWN0TnVsbGFibGVSYXdUeXBlOworICB9CisKKyAgQG92ZXJyaWRlCisgIERhcnRUeXBlIHZpc2l0Vm9pZFR5cGUoRGFydFR5cGUgbm9kZSwgQ29yZVR5cGVzIGNvcmVUeXBlcykgeworICAgIC8vIGZ1dHVyZVZhbHVlVHlwZSh2b2lkKSA9IHZvaWQuCisgICAgcmV0dXJuIG5vZGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9rZXJuZWwvbGliL3NyYy9wcmludGVyLmRhcnQgYi9wa2cva2VybmVsL2xpYi9zcmMvcHJpbnRlci5kYXJ0CmluZGV4IDgyNjcwYzQuLjBlOTIyM2QgMTAwNjQ0Ci0tLSBhL3BrZy9rZXJuZWwvbGliL3NyYy9wcmludGVyLmRhcnQKKysrIGIvcGtnL2tlcm5lbC9saWIvc3JjL3ByaW50ZXIuZGFydApAQCAtMzYzLDcgKzM2MywxMCBAQAogICAvLy8gSWYgW2lzTGF0ZV0gYW5kIFt0eXBlXSBhcmUgcHJvdmlkZWQsIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCBpbnN0ZWFkIG9mCiAgIC8vLyB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9uIFtub2RlXS4KICAgdm9pZCB3cml0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlLAotICAgICAge2Jvb2wgaW5jbHVkZU1vZGlmaWVyc0FuZFR5cGU6IHRydWUsIGJvb2wgaXNMYXRlLCBEYXJ0VHlwZSB0eXBlfSkgeworICAgICAge2Jvb2wgaW5jbHVkZU1vZGlmaWVyc0FuZFR5cGU6IHRydWUsCisgICAgICBib29sIGlzTGF0ZSwKKyAgICAgIERhcnRUeXBlIHR5cGUsCisgICAgICBib29sIGluY2x1ZGVJbml0aWFsaXplcjogdHJ1ZX0pIHsKICAgICBpZiAoaW5jbHVkZU1vZGlmaWVyc0FuZFR5cGUpIHsKICAgICAgIGlmIChub2RlLmlzUmVxdWlyZWQpIHsKICAgICAgICAgX3NiLndyaXRlKCdyZXF1aXJlZCAnKTsKQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAgX3NiLndyaXRlKCcgJyk7CiAgICAgfQogICAgIF9zYi53cml0ZShnZXRWYXJpYWJsZU5hbWUobm9kZSkpOwotICAgIGlmIChub2RlLmluaXRpYWxpemVyICE9IG51bGwgJiYgIW5vZGUuaXNSZXF1aXJlZCkgeworICAgIGlmIChpbmNsdWRlSW5pdGlhbGl6ZXIgJiYgbm9kZS5pbml0aWFsaXplciAhPSBudWxsICYmICFub2RlLmlzUmVxdWlyZWQpIHsKICAgICAgIF9zYi53cml0ZSgnID0gJyk7CiAgICAgICB3cml0ZUV4cHJlc3Npb24obm9kZS5pbml0aWFsaXplcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC9saWIvdGVzdGluZy90eXBlX3BhcnNlcl9lbnZpcm9ubWVudC5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvdGVzdGluZy90eXBlX3BhcnNlcl9lbnZpcm9ubWVudC5kYXJ0CmluZGV4IDJlMDdhM2UuLjEwZmZjNTlmIDEwMDY0NAotLS0gYS9wa2cva2VybmVsL2xpYi90ZXN0aW5nL3R5cGVfcGFyc2VyX2Vudmlyb25tZW50LmRhcnQKKysrIGIvcGtnL2tlcm5lbC9saWIvdGVzdGluZy90eXBlX3BhcnNlcl9lbnZpcm9ubWVudC5kYXJ0CkBAIC0xMjEsNiArMTIxLDEzIEBACiAgICAgX2xpYnJhcnlFbnZpcm9ubWVudCA9CiAgICAgICAgIF9saWJyYXJ5RW52aXJvbm1lbnQuZXh0ZW5kV2l0aFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKICAgfQorCisgIHZvaWQgd2l0aFR5cGVQYXJhbWV0ZXJzKFN0cmluZyB0eXBlUGFyYW1ldGVycywgdm9pZCBGdW5jdGlvbigpIGYpIHsKKyAgICBUeXBlUGFyc2VyRW52aXJvbm1lbnQgb2xkTGlicmFyeUVudmlyb25tZW50ID0gX2xpYnJhcnlFbnZpcm9ubWVudDsKKyAgICBleHRlbmRXaXRoVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworICAgIGYoKTsKKyAgICBfbGlicmFyeUVudmlyb25tZW50ID0gb2xkTGlicmFyeUVudmlyb25tZW50OworICB9CiB9CiAKIGNsYXNzIFR5cGVQYXJzZXJFbnZpcm9ubWVudCB7CmRpZmYgLS1naXQgYS9wa2cva2VybmVsL2xpYi90eXBlX2NoZWNrZXIuZGFydCBiL3BrZy9rZXJuZWwvbGliL3R5cGVfY2hlY2tlci5kYXJ0CmluZGV4IDk2MzFiMmMuLmQ1YTBhMmUgMTAwNjQ0Ci0tLSBhL3BrZy9rZXJuZWwvbGliL3R5cGVfY2hlY2tlci5kYXJ0CisrKyBiL3BrZy9rZXJuZWwvbGliL3R5cGVfY2hlY2tlci5kYXJ0CkBAIC00MjMsNyArNDIzLDcgQEAKIAogICBAb3ZlcnJpZGUKICAgRGFydFR5cGUgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKLSAgICByZXR1cm4gZW52aXJvbm1lbnQudW5mdXR1cmVUeXBlKHZpc2l0RXhwcmVzc2lvbihub2RlLm9wZXJhbmQpKTsKKyAgICByZXR1cm4gZW52aXJvbm1lbnQuZmxhdHRlbih2aXNpdEV4cHJlc3Npb24obm9kZS5vcGVyYW5kKSk7CiAgIH0KIAogICBAb3ZlcnJpZGUKQEAgLTk5Myw3ICs5OTMsNyBAQAogICAgICAgfSBlbHNlIHsKICAgICAgICAgdmFyIHR5cGUgPSB2aXNpdEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKTsKICAgICAgICAgaWYgKGN1cnJlbnRBc3luY01hcmtlciA9PSBBc3luY01hcmtlci5Bc3luYykgewotICAgICAgICAgIHR5cGUgPSBlbnZpcm9ubWVudC51bmZ1dHVyZVR5cGUodHlwZSk7CisgICAgICAgICAgdHlwZSA9IGVudmlyb25tZW50LmZsYXR0ZW4odHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tBc3NpZ25hYmxlKG5vZGUuZXhwcmVzc2lvbiwgdHlwZSwgY3VycmVudFJldHVyblR5cGUpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC9saWIvdHlwZV9lbnZpcm9ubWVudC5kYXJ0IGIvcGtnL2tlcm5lbC9saWIvdHlwZV9lbnZpcm9ubWVudC5kYXJ0CmluZGV4IDI0MjZmMzEuLjE0YmI1OWQgMTAwNjQ0Ci0tLSBhL3BrZy9rZXJuZWwvbGliL3R5cGVfZW52aXJvbm1lbnQuZGFydAorKysgYi9wa2cva2VybmVsL2xpYi90eXBlX2Vudmlyb25tZW50LmRhcnQKQEAgLTMsNiArMyw4IEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogbGlicmFyeSBrZXJuZWwudHlwZV9lbnZpcm9ubWVudDsKIAoraW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2FsZ2VicmEuZGFydCc7CisKIGltcG9ydCAnYXN0LmRhcnQnOwogaW1wb3J0ICdjbGFzc19oaWVyYXJjaHkuZGFydCc7CiBpbXBvcnQgJ2NvcmVfdHlwZXMuZGFydCc7CkBAIC03OSwyNyArODEsMzggQEAKICAgICAgICAgY29yZVR5cGVzLmZ1dHVyZUNsYXNzLCBudWxsYWJpbGl0eSwgPERhcnRUeXBlPlt0eXBlXSk7CiAgIH0KIAotICAvLy8gUmVtb3ZlcyBhIGxldmVsIG9mIGBGdXR1cmU8PmAgdHlwZXMgd3JhcHBpbmcgYSB0eXBlLgotICAvLy8KLSAgLy8vIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24gYGZsYXR0ZW5gIGZyb20gdGhlIHNwZWMsIHdoaWNoIHVud3JhcHMgYQorICBEYXJ0VHlwZSBfd2l0aERlY2xhcmVkTnVsbGFiaWxpdHkoRGFydFR5cGUgdHlwZSwgTnVsbGFiaWxpdHkgbnVsbGFiaWxpdHkpIHsKKyAgICBpZiAodHlwZSA9PSBudWxsVHlwZSkgcmV0dXJuIHR5cGU7CisgICAgcmV0dXJuIHR5cGUud2l0aERlY2xhcmVkTnVsbGFiaWxpdHkoCisgICAgICAgIHVuaXRlTnVsbGFiaWxpdGllcyh0eXBlLmRlY2xhcmVkTnVsbGFiaWxpdHksIG51bGxhYmlsaXR5KSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYGZsYXR0ZW5gIG9mIFt0eXBlXSBhcyBkZWZpbmVkIGluIHRoZSBzcGVjLCB3aGljaCB1bndyYXBzIGEKICAgLy8vIGxheWVyIG9mIEZ1dHVyZSBvciBGdXR1cmVPciBmcm9tIGEgdHlwZS4KLSAgRGFydFR5cGUgdW5mdXR1cmVUeXBlKERhcnRUeXBlIHR5cGUpIHsKLSAgICBpZiAodHlwZSBpcyBGdXR1cmVPclR5cGUpIHJldHVybiB0eXBlLnR5cGVBcmd1bWVudDsKLSAgICBpZiAodHlwZSBpcyBJbnRlcmZhY2VUeXBlKSB7Ci0gICAgICBpZiAodHlwZS5jbGFzc05vZGUgPT0gY29yZVR5cGVzLmZ1dHVyZUNsYXNzKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLnR5cGVBcmd1bWVudHNbMF07Ci0gICAgICB9Ci0gICAgICAvLyBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciB0byBpbXBsZW1lbnQsIGV4dGVuZCwgb3IgbWl4aW4gRnV0dXJlT3Igc28KLSAgICAgIC8vIHdlIGFyZW4ndCBjb25jZXJuZWQgd2l0aCBpdC4gIElmIGEgY2xhc3MgaW1wbGVtZW50cyBtdWx0aXBsZQotICAgICAgLy8gaW5zdGFudGlhdGlvbnMgb2YgRnV0dXJlLCBnZXRUeXBlQXNJbnN0YW5jZU9mIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICAgLy8gcGlja2luZyB0aGUgbGVhc3Qgb25lIGluIHRoZSBzZW5zZSByZXF1aXJlZCBieSB0aGUgc3BlYy4KKyAgRGFydFR5cGUgZmxhdHRlbihEYXJ0VHlwZSB0KSB7CisgICAgLy8gaWYgVCBpcyBTPyB0aGVuIGZsYXR0ZW4oVCkgPSBmbGF0dGVuKFMpPworICAgIC8vIG90aGVyd2lzZSBpZiBUIGlzIFMqIHRoZW4gZmxhdHRlbihUKSA9IGZsYXR0ZW4oUykqCisgICAgLy8gLS0gdGhpcyBpcyBwcmVzZXJ2ZSB3aXRoIHRoZSBjYWxscyB0byBbX3dpdGhEZWNsYXJlZE51bGxhYmlsaXR5XSBiZWxvdy4KKworICAgIC8vIG90aGVyd2lzZSBpZiBUIGlzIEZ1dHVyZU9yPFM+IHRoZW4gZmxhdHRlbihUKSA9IFMKKyAgICBpZiAodCBpcyBGdXR1cmVPclR5cGUpIHsKKyAgICAgIHJldHVybiBfd2l0aERlY2xhcmVkTnVsbGFiaWxpdHkodC50eXBlQXJndW1lbnQsIHQuZGVjbGFyZWROdWxsYWJpbGl0eSk7CisgICAgfQorCisgICAgLy8gb3RoZXJ3aXNlIGlmIFQgPDogRnV0dXJlIHRoZW4gbGV0IFMgYmUgYSB0eXBlIHN1Y2ggdGhhdCBUIDw6IEZ1dHVyZTxTPgorICAgIC8vICAgYW5kIGZvciBhbGwgUiwgaWYgVCA8OiBGdXR1cmU8Uj4gdGhlbiBTIDw6IFI7IHRoZW4gZmxhdHRlbihUKSA9IFMKKyAgICBEYXJ0VHlwZSByZXNvbHZlZCA9IF9yZXNvbHZlVHlwZVBhcmFtZXRlclR5cGUodCk7CisgICAgaWYgKHJlc29sdmVkIGlzIEludGVyZmFjZVR5cGUpIHsKICAgICAgIExpc3Q8RGFydFR5cGU+IGZ1dHVyZUFyZ3VtZW50cyA9Ci0gICAgICAgICAgZ2V0VHlwZUFyZ3VtZW50c0FzSW5zdGFuY2VPZih0eXBlLCBjb3JlVHlwZXMuZnV0dXJlQ2xhc3MpOworICAgICAgICAgIGdldFR5cGVBcmd1bWVudHNBc0luc3RhbmNlT2YocmVzb2x2ZWQsIGNvcmVUeXBlcy5mdXR1cmVDbGFzcyk7CiAgICAgICBpZiAoZnV0dXJlQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGZ1dHVyZUFyZ3VtZW50c1swXTsKKyAgICAgICAgcmV0dXJuIF93aXRoRGVjbGFyZWROdWxsYWJpbGl0eSgKKyAgICAgICAgICAgIGZ1dHVyZUFyZ3VtZW50cy5zaW5nbGUsIHQuZGVjbGFyZWROdWxsYWJpbGl0eSk7CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0eXBlOworCisgICAgLy8gb3RoZXJ3aXNlIGZsYXR0ZW4oVCkgPSBUCisgICAgcmV0dXJuIHQ7CiAgIH0KIAogICAvLy8gUmV0dXJucyB0aGUgbm9uLXR5cGUgcGFyYW1ldGVyIHR5cGUgYm91bmQgb2YgW3R5cGVdLgpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC90ZXN0L2RhcnRfdHlwZV9lcXVpdmFsZW5jZV90ZXN0LmRhcnQgYi9wa2cva2VybmVsL3Rlc3QvZGFydF90eXBlX2VxdWl2YWxlbmNlX3Rlc3QuZGFydAppbmRleCA0ZWMwODk1Li40ZjI3NzY4IDEwMDY0NAotLS0gYS9wa2cva2VybmVsL3Rlc3QvZGFydF90eXBlX2VxdWl2YWxlbmNlX3Rlc3QuZGFydAorKysgYi9wa2cva2VybmVsL3Rlc3QvZGFydF90eXBlX2VxdWl2YWxlbmNlX3Rlc3QuZGFydApAQCAtMTQ3LDYgKzE0NywyMSBAQAogICAgICAgZXF1YXRlVG9wVHlwZXM6IHRydWUsIGlnbm9yZUFsbE51bGxhYmlsaXRpZXM6IHRydWUpOwogICBub3RFcXVhbCgiRnV0dXJlT3I8T2JqZWN0PiIsICJPYmplY3QiLAogICAgICAgZXF1YXRlVG9wVHlwZXM6IHRydWUsIGlnbm9yZUFsbE51bGxhYmlsaXRpZXM6IHRydWUpOworCisgIC8vIFR5cGVkZWYgdHlwZXMuCisgIGFyZUVxdWFsKCJUeXBlZGVmPGludD4iLCAiVHlwZWRlZjxpbnQ+Iik7CisgIG5vdEVxdWFsKCJUeXBlZGVmPFN0cmluZz4iLCAiVHlwZWRlZjxudW0+Iik7CisgIG5vdEVxdWFsKCJUeXBlZGVmPG51bT8+PyIsICJUeXBlZGVmPG51bT4iKTsKKyAgbm90RXF1YWwoIlR5cGVkZWY8bnVtPz4/IiwgIlR5cGVkZWY8bnVtPiIsIGlnbm9yZVRvcExldmVsTnVsbGFiaWxpdHk6IHRydWUpOworICBhcmVFcXVhbCgiVHlwZWRlZjxudW0/Pj8iLCAiVHlwZWRlZjxudW0+IiwgaWdub3JlQWxsTnVsbGFiaWxpdGllczogdHJ1ZSk7CisgIG5vdEVxdWFsKCJUeXBlZGVmPE9iamVjdD8+PyIsICJUeXBlZGVmPGR5bmFtaWM+Iik7CisgIG5vdEVxdWFsKCJUeXBlZGVmPE9iamVjdD8+PyIsICJUeXBlZGVmPGR5bmFtaWM+IiwKKyAgICAgIGlnbm9yZVRvcExldmVsTnVsbGFiaWxpdHk6IHRydWUpOworICBub3RFcXVhbCgiVHlwZWRlZjxPYmplY3Q/Pj8iLCAiVHlwZWRlZjxkeW5hbWljPiIsCisgICAgICBpZ25vcmVBbGxOdWxsYWJpbGl0aWVzOiB0cnVlKTsKKyAgbm90RXF1YWwoIlR5cGVkZWY8T2JqZWN0Pz4/IiwgIlR5cGVkZWY8ZHluYW1pYz4iLCBlcXVhdGVUb3BUeXBlczogdHJ1ZSk7CisgIGFyZUVxdWFsKCJUeXBlZGVmPE9iamVjdD8+PyIsICJUeXBlZGVmPGR5bmFtaWM+IiwKKyAgICAgIGVxdWF0ZVRvcFR5cGVzOiB0cnVlLCBpZ25vcmVUb3BMZXZlbE51bGxhYmlsaXR5OiB0cnVlKTsKIH0KIAogYXJlRXF1YWwoU3RyaW5nIHR5cGUxLCBTdHJpbmcgdHlwZTIsCkBAIC0xNTQsNyArMTY5LDggQEAKICAgICBib29sIGVxdWF0ZVRvcFR5cGVzID0gZmFsc2UsCiAgICAgYm9vbCBpZ25vcmVBbGxOdWxsYWJpbGl0aWVzID0gZmFsc2UsCiAgICAgYm9vbCBpZ25vcmVUb3BMZXZlbE51bGxhYmlsaXR5ID0gZmFsc2V9KSB7Ci0gIEVudiBlbnYgPSBuZXcgRW52KCcnKS4uZXh0ZW5kV2l0aFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgRW52IGVudiA9IG5ldyBFbnYoInR5cGVkZWYgVHlwZWRlZjxUPiAoKSAtPiBUO1xuIikKKyAgICAuLmV4dGVuZFdpdGhUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CiAgIERhcnRUeXBlIHQxID0gZW52LnBhcnNlVHlwZSh0eXBlMSk7CiAgIERhcnRUeXBlIHQyID0gZW52LnBhcnNlVHlwZSh0eXBlMik7CiAKQEAgLTE5Miw3ICsyMDgsOCBAQAogICAgIGJvb2wgZXF1YXRlVG9wVHlwZXMgPSBmYWxzZSwKICAgICBib29sIGlnbm9yZUFsbE51bGxhYmlsaXRpZXMgPSBmYWxzZSwKICAgICBib29sIGlnbm9yZVRvcExldmVsTnVsbGFiaWxpdHkgPSBmYWxzZX0pIHsKLSAgRW52IGVudiA9IG5ldyBFbnYoJycpLi5leHRlbmRXaXRoVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworICBFbnYgZW52ID0gbmV3IEVudigidHlwZWRlZiBUeXBlZGVmPFQ+ICgpIC0+IFQ7XG4iKQorICAgIC4uZXh0ZW5kV2l0aFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKICAgRGFydFR5cGUgdDEgPSBlbnYucGFyc2VUeXBlKHR5cGUxKTsKICAgRGFydFR5cGUgdDIgPSBlbnYucGFyc2VUeXBlKHR5cGUyKTsKIApkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC90ZXN0L2ZsYXR0ZW5fdGVzdC5kYXJ0IGIvcGtnL2tlcm5lbC90ZXN0L2ZsYXR0ZW5fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cva2VybmVsL3Rlc3QvZmxhdHRlbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IiBzaG93IEV4cGVjdDsKKworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKK2ltcG9ydCAncGFja2FnZTprZXJuZWwvY2xhc3NfaGllcmFyY2h5LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90ZXN0aW5nL3R5cGVfcGFyc2VyX2Vudmlyb25tZW50LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90eXBlX2Vudmlyb25tZW50LmRhcnQnOworCitjb25zdCBTZXQ8VGVzdD4gZGF0YSA9IHsKKyAgY29uc3QgVGVzdCgnTnVsbCcsICdOdWxsJyksCisgIGNvbnN0IFRlc3QoJ05ldmVyPycsICdOZXZlcj8nKSwKKyAgY29uc3QgVGVzdCgndm9pZCcsICd2b2lkJyksCisgIGNvbnN0IFRlc3QoJ2R5bmFtaWMnLCAnZHluYW1pYycpLAorICBjb25zdCBUZXN0KCdib29sJywgJ2Jvb2wnKSwKKyAgY29uc3QgVGVzdCgnYm9vbD8nLCAnYm9vbD8nKSwKKyAgY29uc3QgVGVzdCgnYm9vbConLCAnYm9vbConKSwKKyAgY29uc3QgVGVzdCgnTGlzdDxib29sPicsICdMaXN0PGJvb2w+JyksCisgIGNvbnN0IFRlc3QoJ0xpc3Q8Ym9vbD4/JywgJ0xpc3Q8Ym9vbD4/JyksCisgIGNvbnN0IFRlc3QoJ0xpc3Q8Ym9vbD4qJywgJ0xpc3Q8Ym9vbD4qJyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZU9yPGJvb2w+JywgJ2Jvb2wnKSwKKyAgY29uc3QgVGVzdCgnRnV0dXJlT3I8Ym9vbD4/JywgJ2Jvb2w/JyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZU9yPGJvb2w+KicsICdib29sKicpLAorICBjb25zdCBUZXN0KCdGdXR1cmVPcjxib29sPz4qJywgJ2Jvb2w/JyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZU9yPGJvb2w/Pj8nLCAnYm9vbD8nKSwKKyAgY29uc3QgVGVzdCgnRnV0dXJlT3I8Ym9vbCo+PycsICdib29sPycpLAorICBjb25zdCBUZXN0KCdGdXR1cmVPcjxOdWxsPicsICdOdWxsJyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZU9yPE51bGw+PycsICdOdWxsJyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZU9yPE51bGw+KicsICdOdWxsJyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZTxib29sPicsICdib29sJyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZTxib29sPj8nLCAnYm9vbD8nKSwKKyAgY29uc3QgVGVzdCgnRnV0dXJlPGJvb2w+KicsICdib29sKicpLAorICBjb25zdCBUZXN0KCdGdXR1cmU8Ym9vbD8+JywgJ2Jvb2w/JyksCisgIGNvbnN0IFRlc3QoJ0Z1dHVyZTxib29sKj4nLCAnYm9vbConKSwKKyAgY29uc3QgVGVzdCgnKCkgLT4qIGJvb2wqJywgJygpIC0+KiBib29sKicpLAorICBjb25zdCBUZXN0KCcoKSAtPiBib29sKicsICcoKSAtPiBib29sKicpLAorICBjb25zdCBUZXN0KCcoKSAtPj8gYm9vbConLCAnKCkgLT4/IGJvb2wqJyksCisgIGNvbnN0IFRlc3QoJygpIC0+KiBib29sJywgJygpIC0+KiBib29sJyksCisgIGNvbnN0IFRlc3QoJygpIC0+PyBib29sJywgJygpIC0+PyBib29sJyksCisgIGNvbnN0IFRlc3QoJygpIC0+IGJvb2wnLCAnKCkgLT4gYm9vbCcpLAorICBjb25zdCBUZXN0KCdUJywgJ1QnLCAnVCcpLAorICBjb25zdCBUZXN0KCdUPycsICdUPycsICdUJyksCisgIGNvbnN0IFRlc3QoJ1QqJywgJ1QqJywgJ1QnKSwKKyAgY29uc3QgVGVzdCgnVCcsICdUJywgJ1QgZXh0ZW5kcyBib29sJyksCisgIGNvbnN0IFRlc3QoJ1Q/JywgJ1Q/JywgJ1QgZXh0ZW5kcyBib29sJyksCisgIGNvbnN0IFRlc3QoJ1QqJywgJ1QqJywgJ1QgZXh0ZW5kcyBib29sJyksCisgIGNvbnN0IFRlc3QoJ1QnLCAnVCcsICdUIGV4dGVuZHMgRnV0dXJlT3I8Ym9vbD4nKSwKKyAgY29uc3QgVGVzdCgnVD8nLCAnVD8nLCAnVCBleHRlbmRzIEZ1dHVyZU9yPGJvb2w+JyksCisgIGNvbnN0IFRlc3QoJ1QqJywgJ1QqJywgJ1QgZXh0ZW5kcyBGdXR1cmVPcjxib29sPicpLAorICBjb25zdCBUZXN0KCdUJywgJ2Jvb2wnLCAnVCBleHRlbmRzIEZ1dHVyZTxib29sPicpLAorICBjb25zdCBUZXN0KCdUPycsICdib29sPycsICdUIGV4dGVuZHMgRnV0dXJlPGJvb2w+JyksCisgIGNvbnN0IFRlc3QoJ1QqJywgJ2Jvb2wqJywgJ1QgZXh0ZW5kcyBGdXR1cmU8Ym9vbD4nKSwKKyAgY29uc3QgVGVzdCgnVCAmIGJvb2wnLCAnVCAmIGJvb2wnLCAnVCcpLAorICBjb25zdCBUZXN0KCdUICYgYm9vbD8nLCAnVCAmIGJvb2w/JywgJ1QnKSwKKyAgY29uc3QgVGVzdCgnVCAmIGJvb2wqJywgJ1QgJiBib29sKicsICdUJyksCit9OworCitjbGFzcyBUZXN0IHsKKyAgZmluYWwgU3RyaW5nIGlucHV0OworICBmaW5hbCBTdHJpbmcgb3V0cHV0OworICBmaW5hbCBTdHJpbmcgdHlwZVBhcmFtZXRlcnM7CisKKyAgY29uc3QgVGVzdCh0aGlzLmlucHV0LCB0aGlzLm91dHB1dCwgW3RoaXMudHlwZVBhcmFtZXRlcnNdKTsKK30KKworbWFpbigpIHsKKyAgRW52IGVudiA9IG5ldyBFbnYoJycpOworICBDbGFzc0hpZXJhcmNoeSBjbGFzc0hpZXJhcmNoeSA9CisgICAgICBuZXcgQ2xhc3NIaWVyYXJjaHkoZW52LmNvbXBvbmVudCwgZW52LmNvcmVUeXBlcyk7CisgIFR5cGVFbnZpcm9ubWVudCB0eXBlRW52aXJvbm1lbnQgPQorICAgICAgbmV3IFR5cGVFbnZpcm9ubWVudChlbnYuY29yZVR5cGVzLCBjbGFzc0hpZXJhcmNoeSk7CisgIGRhdGEuZm9yRWFjaCgoVGVzdCB0ZXN0KSB7CisgICAgZW52LndpdGhUeXBlUGFyYW1ldGVycyh0ZXN0LnR5cGVQYXJhbWV0ZXJzLCAoKSB7CisgICAgICBTdHJpbmcgaW5wdXQgPSB0ZXN0LmlucHV0OworICAgICAgU3RyaW5nIG91dHB1dCA9IHRlc3Qub3V0cHV0OworICAgICAgRGFydFR5cGUgaW5wdXRUeXBlID0gZW52LnBhcnNlVHlwZShpbnB1dCk7CisgICAgICBEYXJ0VHlwZSBleHBlY3RlZE91dHB1dFR5cGUgPSBlbnYucGFyc2VUeXBlKG91dHB1dCk7CisgICAgICBEYXJ0VHlwZSBhY3R1YWxPdXRwdXRUeXBlID0gdHlwZUVudmlyb25tZW50LmZsYXR0ZW4oaW5wdXRUeXBlKTsKKyAgICAgIHByaW50KCdmbGF0dGVuKCRpbnB1dFR5cGUpICcKKyAgICAgICAgICAnJHt0ZXN0LnR5cGVQYXJhbWV0ZXJzICE9IG51bGwgPyAnd2l0aCAke3Rlc3QudHlwZVBhcmFtZXRlcnN9ICcgOiAnJ30nCisgICAgICAgICAgJz0gJGFjdHVhbE91dHB1dFR5cGUsIGV4cGVjdGVkICRleHBlY3RlZE91dHB1dFR5cGUnKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoCisgICAgICAgICAgZXhwZWN0ZWRPdXRwdXRUeXBlLAorICAgICAgICAgIGFjdHVhbE91dHB1dFR5cGUsCisgICAgICAgICAgIlVuZXhwZWN0ZWQgZmxhdHRlbiBvZiAkaW5wdXRUeXBlICgnJGlucHV0Jyk6XG4iCisgICAgICAgICAgIkV4cGVjdGVkOiAke2V4cGVjdGVkT3V0cHV0VHlwZX0gKCckb3V0cHV0JylcbiIKKyAgICAgICAgICAiQWN0dWFsOiAke2FjdHVhbE91dHB1dFR5cGV9Iik7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcGtnL2tlcm5lbC90ZXN0L2Z1dHVyZV92YWx1ZV90eXBlX3Rlc3QuZGFydCBiL3BrZy9rZXJuZWwvdGVzdC9mdXR1cmVfdmFsdWVfdHlwZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZjAzMgotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9rZXJuZWwvdGVzdC9mdXR1cmVfdmFsdWVfdHlwZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw4OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IiBzaG93IEV4cGVjdDsKKworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCcgaGlkZSBNYXBFbnRyeTsKK2ltcG9ydCAncGFja2FnZTprZXJuZWwvc3JjL2Z1dHVyZV92YWx1ZV90eXBlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC90ZXN0aW5nL3R5cGVfcGFyc2VyX2Vudmlyb25tZW50LmRhcnQnOworCitjb25zdCBNYXA8U3RyaW5nLCBTdHJpbmc+IGRhdGEgPSB7CisgICdOdWxsJzogJ09iamVjdD8nLAorICAnTmV2ZXInOiAnT2JqZWN0PycsCisgICdOZXZlcj8nOiAnT2JqZWN0PycsCisgICd2b2lkJzogJ3ZvaWQnLAorICAnZHluYW1pYyc6ICdkeW5hbWljJywKKyAgJ2Jvb2wnOiAnT2JqZWN0PycsCisgICdib29sPyc6ICdPYmplY3Q/JywKKyAgJ2Jvb2wqJzogJ09iamVjdD8nLAorICAnTGlzdDxib29sPic6ICdPYmplY3Q/JywKKyAgJygpIC0+IHZvaWQnOiAnT2JqZWN0PycsCisgICc8VD4oVCkgLT4gdm9pZCc6ICdPYmplY3Q/JywKKyAgJ1gnOiAnT2JqZWN0PycsCisgICdYX2V4dGVuZHNfRnV0dXJlSW50JzogJ09iamVjdD8nLAorICAnWF9leHRlbmRzX0Z1dHVyZU9ySW50JzogJ09iamVjdD8nLAorICAnRnV0dXJlPGR5bmFtaWM+JzogJ2R5bmFtaWMnLAorICAnRnV0dXJlPGR5bmFtaWM+Pyc6ICdkeW5hbWljJywKKyAgJ0Z1dHVyZTxkeW5hbWljPionOiAnZHluYW1pYycsCisgICdGdXR1cmU8T2JqZWN0Pic6ICdPYmplY3QnLAorICAnRnV0dXJlPE9iamVjdD4/JzogJ09iamVjdCcsCisgICdGdXR1cmU8T2JqZWN0PionOiAnT2JqZWN0JywKKyAgJ0Z1dHVyZTxpbnQ/Pic6ICdpbnQ/JywKKyAgJ0Z1dHVyZTxpbnQ/Pj8nOiAnaW50PycsCisgICdGdXR1cmU8aW50Pz4qJzogJ2ludD8nLAorICAnRnV0dXJlPEZ1dHVyZTxpbnQ+Pz4nOiAnRnV0dXJlPGludD4/JywKKyAgJ0Z1dHVyZTxGdXR1cmU8aW50Pj8+Pyc6ICdGdXR1cmU8aW50Pj8nLAorICAnRnV0dXJlPEZ1dHVyZTxpbnQ+Pz4qJzogJ0Z1dHVyZTxpbnQ+PycsCisgICdGdXR1cmU8RnV0dXJlT3I8aW50Pj8+JzogJ0Z1dHVyZU9yPGludD4/JywKKyAgJ0Z1dHVyZTxGdXR1cmVPcjxpbnQ+Pz4/JzogJ0Z1dHVyZU9yPGludD4/JywKKyAgJ0Z1dHVyZTxGdXR1cmVPcjxpbnQ+Pz4qJzogJ0Z1dHVyZU9yPGludD4/JywKKyAgJ0Z1dHVyZTxOdWxsPic6ICdOdWxsJywKKyAgJ0Z1dHVyZTxOdWxsPj8nOiAnTnVsbCcsCisgICdGdXR1cmU8TnVsbD4qJzogJ051bGwnLAorICAnRnV0dXJlPHZvaWQ+JzogJ3ZvaWQnLAorICAnRnV0dXJlPHZvaWQ+Pyc6ICd2b2lkJywKKyAgJ0Z1dHVyZTx2b2lkPionOiAndm9pZCcsCisgICdGdXR1cmVPcjxkeW5hbWljPic6ICdkeW5hbWljJywKKyAgJ0Z1dHVyZU9yPGR5bmFtaWM+Pyc6ICdkeW5hbWljJywKKyAgJ0Z1dHVyZU9yPGR5bmFtaWM+Kic6ICdkeW5hbWljJywKKyAgJ0Z1dHVyZU9yPE9iamVjdD4nOiAnT2JqZWN0JywKKyAgJ0Z1dHVyZU9yPE9iamVjdD4/JzogJ09iamVjdCcsCisgICdGdXR1cmVPcjxPYmplY3Q+Kic6ICdPYmplY3QnLAorICAnRnV0dXJlT3I8aW50Pz4nOiAnaW50PycsCisgICdGdXR1cmVPcjxpbnQ/Pj8nOiAnaW50PycsCisgICdGdXR1cmVPcjxpbnQ/PionOiAnaW50PycsCisgICdGdXR1cmVPcjxGdXR1cmU8aW50Pj8+JzogJ0Z1dHVyZTxpbnQ+PycsCisgICdGdXR1cmVPcjxGdXR1cmU8aW50Pj8+Pyc6ICdGdXR1cmU8aW50Pj8nLAorICAnRnV0dXJlT3I8RnV0dXJlPGludD4/PionOiAnRnV0dXJlPGludD4/JywKKyAgJ0Z1dHVyZU9yPEZ1dHVyZU9yPGludD4/Pic6ICdGdXR1cmVPcjxpbnQ+PycsCisgICdGdXR1cmVPcjxGdXR1cmVPcjxpbnQ+Pz4/JzogJ0Z1dHVyZU9yPGludD4/JywKKyAgJ0Z1dHVyZU9yPEZ1dHVyZU9yPGludD4/PionOiAnRnV0dXJlT3I8aW50Pj8nLAorICAnRnV0dXJlT3I8TnVsbD4nOiAnTnVsbCcsCisgICdGdXR1cmVPcjxOdWxsPj8nOiAnTnVsbCcsCisgICdGdXR1cmVPcjxOdWxsPionOiAnTnVsbCcsCisgICdGdXR1cmVPcjx2b2lkPic6ICd2b2lkJywKKyAgJ0Z1dHVyZU9yPHZvaWQ+Pyc6ICd2b2lkJywKKyAgJ0Z1dHVyZU9yPHZvaWQ+Kic6ICd2b2lkJywKK307CisKK21haW4oKSB7CisgIEVudiBlbnYgPSBuZXcgRW52KCcnKQorICAgIC4uZXh0ZW5kV2l0aFR5cGVQYXJhbWV0ZXJzKCdYLCcKKyAgICAgICAgJ1hfZXh0ZW5kc19GdXR1cmVJbnQgZXh0ZW5kcyBGdXR1cmU8aW50PiwnCisgICAgICAgICdYX2V4dGVuZHNfRnV0dXJlT3JJbnQgZXh0ZW5kcyBGdXR1cmVPcjxpbnQ+Jyk7CisgIGRhdGEuZm9yRWFjaCgoU3RyaW5nIGlucHV0LCBTdHJpbmcgb3V0cHV0KSB7CisgICAgRGFydFR5cGUgaW5wdXRUeXBlID0gZW52LnBhcnNlVHlwZShpbnB1dCk7CisgICAgRGFydFR5cGUgZXhwZWN0ZWRPdXRwdXRUeXBlID0gZW52LnBhcnNlVHlwZShvdXRwdXQpOworICAgIERhcnRUeXBlIGFjdHVhbE91dHB1dFR5cGUgPQorICAgICAgICBjb21wdXRlRnV0dXJlVmFsdWVUeXBlKGVudi5jb3JlVHlwZXMsIGlucHV0VHlwZSk7CisgICAgcHJpbnQoCisgICAgICAgICdmdXR1cmVWYWx1ZVR5cGUoJGlucHV0VHlwZSkgPSAkYWN0dWFsT3V0cHV0VHlwZTogJGV4cGVjdGVkT3V0cHV0VHlwZScpOworICAgIEV4cGVjdC5lcXVhbHMoCisgICAgICAgIGV4cGVjdGVkT3V0cHV0VHlwZSwKKyAgICAgICAgYWN0dWFsT3V0cHV0VHlwZSwKKyAgICAgICAgIlVuZXhwZWN0ZWQgZnV0dXJlIHZhbHVlIHR5cGUgb2YgJGlucHV0VHlwZSAoJyRpbnB1dCcpOlxuIgorICAgICAgICAiRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRPdXRwdXRUeXBlfSAoJyRvdXRwdXQnKVxuIgorICAgICAgICAiQWN0dWFsOiAke2FjdHVhbE91dHB1dFR5cGV9Iik7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9taWdyYXRpb25fY2xpLmRhcnQgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL21pZ3JhdGlvbl9jbGkuZGFydAppbmRleCAzYzVhOGQ5Li44NTczOTkwIDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL21pZ3JhdGlvbl9jbGkuZGFydAorKysgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL21pZ3JhdGlvbl9jbGkuZGFydApAQCAtNTA5LDYgKzUwOSwxOSBAQAogICAgIHJldHVybiBzdHJlYW0uZmlyc3Q7CiAgIH0KIAorICAvLy8gQ29tcHV0ZXMgdGhlIGludGVybmV0IGFkZHJlc3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIGBIdHRwU2VydmVyLmJpbmRgCisgIC8vLyB3aGVuIHN0YXJ0aW5nIHRoZSBwcmV2aWV3IHNlcnZlci4gIE1heSBiZSBvdmVycmlkZGVuIGluIGRlcml2ZWQgY2xhc3Nlcy4KKyAgT2JqZWN0IGNvbXB1dGVCaW5kQWRkcmVzcygpIHsKKyAgICB2YXIgaG9zdG5hbWUgPSBvcHRpb25zLnByZXZpZXdIb3N0bmFtZTsKKyAgICBpZiAoaG9zdG5hbWUgPT0gJ2xvY2FsaG9zdCcpIHsKKyAgICAgIHJldHVybiBJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0OworICAgIH0gZWxzZSBpZiAoaG9zdG5hbWUgPT0gJ2FueScpIHsKKyAgICAgIHJldHVybiBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGhvc3RuYW1lOworICAgIH0KKyAgfQorCiAgIC8vLyBDb21wdXRlcyB0aGUgc2V0IG9mIGZpbGUgcGF0aHMgdGhhdCBzaG91bGQgYmUgYW5hbHl6ZWQgYnkgdGhlIG1pZ3JhdGlvbgogICAvLy8gZW5naW5lLiAgTWF5IGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzLgogICAvLy8KQEAgLTUyNSwxNSArNTM4LDE2IEBACiAgICAgICAgICAgLndoZXJlKChzKSA9PiBzLmVuZHNXaXRoKCcuZGFydCcpKQogICAgICAgICAgIC50b1NldCgpOwogCi0gIE5vbk51bGxhYmxlRml4IGNyZWF0ZU5vbk51bGxhYmxlRml4KERhcnRGaXhMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwgTGluZUluZm8gZ2V0TGluZUluZm8oU3RyaW5nIHBhdGgpLAorICBOb25OdWxsYWJsZUZpeCBjcmVhdGVOb25OdWxsYWJsZUZpeCgKKyAgICAgIERhcnRGaXhMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwKKyAgICAgIExpbmVJbmZvIGdldExpbmVJbmZvKFN0cmluZyBwYXRoKSwKKyAgICAgIE9iamVjdCBiaW5kQWRkcmVzcywKICAgICAgIHtMaXN0PFN0cmluZz4gaW5jbHVkZWQgPSBjb25zdCA8U3RyaW5nPltdLAotICAgICAgU3RyaW5nIGhvc3RuYW1lLAogICAgICAgaW50IHByZWZlcnJlZFBvcnQsCiAgICAgICBTdHJpbmcgc3VtbWFyeVBhdGh9KSB7Ci0gICAgcmV0dXJuIE5vbk51bGxhYmxlRml4KGxpc3RlbmVyLCByZXNvdXJjZVByb3ZpZGVyLCBnZXRMaW5lSW5mbywKKyAgICByZXR1cm4gTm9uTnVsbGFibGVGaXgobGlzdGVuZXIsIHJlc291cmNlUHJvdmlkZXIsIGdldExpbmVJbmZvLCBiaW5kQWRkcmVzcywKICAgICAgICAgaW5jbHVkZWQ6IGluY2x1ZGVkLAotICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUsCiAgICAgICAgIHByZWZlcnJlZFBvcnQ6IHByZWZlcnJlZFBvcnQsCiAgICAgICAgIHN1bW1hcnlQYXRoOiBzdW1tYXJ5UGF0aCk7CiAgIH0KQEAgLTU2NiwxMCArNTgwLDkgQEAKICAgICBfZml4Q29kZVByb2Nlc3NvciA9IF9GaXhDb2RlUHJvY2Vzc29yKGNvbnRleHQsIHRoaXMpOwogICAgIF9kYXJ0Rml4TGlzdGVuZXIgPSBEYXJ0Rml4TGlzdGVuZXIoCiAgICAgICAgIERyaXZlclByb3ZpZGVySW1wbChyZXNvdXJjZVByb3ZpZGVyLCBjb250ZXh0KSwgX2V4Y2VwdGlvblJlcG9ydGVkKTsKLSAgICBub25OdWxsYWJsZUZpeCA9IGNyZWF0ZU5vbk51bGxhYmxlRml4KAotICAgICAgICBfZGFydEZpeExpc3RlbmVyLCByZXNvdXJjZVByb3ZpZGVyLCBfZml4Q29kZVByb2Nlc3Nvci5nZXRMaW5lSW5mbywKKyAgICBub25OdWxsYWJsZUZpeCA9IGNyZWF0ZU5vbk51bGxhYmxlRml4KF9kYXJ0Rml4TGlzdGVuZXIsIHJlc291cmNlUHJvdmlkZXIsCisgICAgICAgIF9maXhDb2RlUHJvY2Vzc29yLmdldExpbmVJbmZvLCBjb21wdXRlQmluZEFkZHJlc3MoKSwKICAgICAgICAgaW5jbHVkZWQ6IFtvcHRpb25zLmRpcmVjdG9yeV0sCi0gICAgICAgIGhvc3RuYW1lOiBvcHRpb25zLnByZXZpZXdIb3N0bmFtZSwKICAgICAgICAgcHJlZmVycmVkUG9ydDogb3B0aW9ucy5wcmV2aWV3UG9ydCwKICAgICAgICAgc3VtbWFyeVBhdGg6IG9wdGlvbnMuc3VtbWFyeSk7CiAgICAgbm9uTnVsbGFibGVGaXgucmVydW5GdW5jdGlvbiA9IF9yZXJ1bkZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZWRnZV9idWlsZGVyLmRhcnQgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9lZGdlX2J1aWxkZXIuZGFydAppbmRleCBmMTU1NTYyLi5kNjAyNTJkIDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9lZGdlX2J1aWxkZXIuZGFydAorKysgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9lZGdlX2J1aWxkZXIuZGFydApAQCAtNzc2LDYgKzc3NiwxMSBAQAogICB9CiAKICAgQG92ZXJyaWRlCisgIERlY29yYXRlZFR5cGUgdmlzaXRFeHRlbnNpb25PdmVycmlkZShFeHRlbnNpb25PdmVycmlkZSBub2RlKSB7CisgICAgcmV0dXJuIF9kaXNwYXRjaChub2RlLmFyZ3VtZW50TGlzdC5hcmd1bWVudHMuc2luZ2xlKTsKKyAgfQorCisgIEBvdmVycmlkZQogICBEZWNvcmF0ZWRUeXBlIHZpc2l0RmllbGRGb3JtYWxQYXJhbWV0ZXIoRmllbGRGb3JtYWxQYXJhbWV0ZXIgbm9kZSkgewogICAgIF9kaXNwYXRjaExpc3Qobm9kZS5tZXRhZGF0YSk7CiAgICAgX2Rpc3BhdGNoKG5vZGUucGFyYW1ldGVycyk7CmRpZmYgLS1naXQgYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9maXhfYnVpbGRlci5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZml4X2J1aWxkZXIuZGFydAppbmRleCBhZDg3MTBkLi5jNTNkOWE1IDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9maXhfYnVpbGRlci5kYXJ0CisrKyBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL2ZpeF9idWlsZGVyLmRhcnQKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL21pZ3JhdGlvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvc291cmNlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvdHlwZV9zeXN0ZW0uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvdGFzay9zdHJvbmcvY2hlY2tlci5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpubmJkX21pZ3JhdGlvbi9maXhfcmVhc29uX3RhcmdldC5kYXJ0JzsKQEAgLTM4Miw2ICszODMsMTUgQEAKICAgICAgIH0pOwogCiAgIEBvdmVycmlkZQorICBEYXJ0VHlwZSBnZXRFeHRlbmRlZFR5cGUoRXh0ZW5zaW9uRWxlbWVudEltcGwgZWxlbWVudCkgeworICAgIHJldHVybiBfd3JhcEV4Y2VwdGlvbnMoCisgICAgICAgIF9maXhCdWlsZGVyLnVuaXQsCisgICAgICAgICgpID0+IGVsZW1lbnQuZXh0ZW5kZWRUeXBlSW50ZXJuYWwsCisgICAgICAgICgpID0+IF9maXhCdWlsZGVyLl92YXJpYWJsZXMKKyAgICAgICAgICAgIC50b0ZpbmFsVHlwZShfZml4QnVpbGRlci5fdmFyaWFibGVzLmRlY29yYXRlZEVsZW1lbnRUeXBlKGVsZW1lbnQpKSk7CisgIH0KKworICBAb3ZlcnJpZGUKICAgRGFydFR5cGUgZ2V0RmllbGRUeXBlKFByb3BlcnR5SW5kdWNpbmdFbGVtZW50SW1wbCBlbGVtZW50KSA9PgogICAgICAgX3dyYXBFeGNlcHRpb25zKF9maXhCdWlsZGVyLnVuaXQsICgpID0+IGVsZW1lbnQudHlwZUludGVybmFsLCAoKSB7CiAgICAgICAgIGFzc2VydCghZWxlbWVudC5pc1N5bnRoZXRpYyk7CmRpZmYgLS1naXQgYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9mcm9udF9lbmQvbm9uX251bGxhYmxlX2ZpeC5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZnJvbnRfZW5kL25vbl9udWxsYWJsZV9maXguZGFydAppbmRleCBmYjQzZDRlLi45ZTM4NWVlIDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9mcm9udF9lbmQvbm9uX251bGxhYmxlX2ZpeC5kYXJ0CisrKyBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL2Zyb250X2VuZC9ub25fbnVsbGFibGVfZml4LmRhcnQKQEAgLTM4LDcgKzM4LDEwIEBACiAKICAgc3RhdGljIGZpbmFsIExpc3Q8SHR0cFByZXZpZXdTZXJ2ZXI+IF9hbGxTZXJ2ZXJzID0gW107CiAKLSAgZmluYWwgU3RyaW5nIGhvc3RuYW1lOworICAvLy8gVGhlIGludGVybmV0IGFkZHJlc3MgdGhlIHNlcnZlciBzaG91bGQgYmluZCB0by4gIFNob3VsZCBiZSBzdWl0YWJsZSBmb3IKKyAgLy8vIHBhc3NpbmcgdG8gSHR0cFNlcnZlci5iaW5kLCBpLmUuIGVpdGhlciBhIFtTdHJpbmddIG9yIGFuCisgIC8vLyBbSW50ZXJuZXRBZGRyZXNzXS4KKyAgZmluYWwgT2JqZWN0IGJpbmRBZGRyZXNzOwogCiAgIGZpbmFsIGludCBwcmVmZXJyZWRQb3J0OwogCkBAIC04MCwxMSArODMsOSBAQAogICAvLy8gQSBsaXN0IG9mIHRoZSBVUkxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluY2x1ZGVkIHJvb3RzLgogICBMaXN0PFN0cmluZz4gcHJldmlld1VybHM7CiAKLSAgTm9uTnVsbGFibGVGaXgodGhpcy5saXN0ZW5lciwgdGhpcy5yZXNvdXJjZVByb3ZpZGVyLCB0aGlzLl9nZXRMaW5lSW5mbywKLSAgICAgIHtMaXN0PFN0cmluZz4gaW5jbHVkZWQgPSBjb25zdCBbXSwKLSAgICAgIHRoaXMuaG9zdG5hbWUsCi0gICAgICB0aGlzLnByZWZlcnJlZFBvcnQsCi0gICAgICB0aGlzLnN1bW1hcnlQYXRofSkKKyAgTm9uTnVsbGFibGVGaXgoCisgICAgICB0aGlzLmxpc3RlbmVyLCB0aGlzLnJlc291cmNlUHJvdmlkZXIsIHRoaXMuX2dldExpbmVJbmZvLCB0aGlzLmJpbmRBZGRyZXNzLAorICAgICAge0xpc3Q8U3RyaW5nPiBpbmNsdWRlZCA9IGNvbnN0IFtdLCB0aGlzLnByZWZlcnJlZFBvcnQsIHRoaXMuc3VtbWFyeVBhdGh9KQogICAgICAgOiBpbmNsdWRlZFJvb3QgPQogICAgICAgICAgICAgX2dldEluY2x1ZGVkUm9vdChpbmNsdWRlZCwgbGlzdGVuZXIuc2VydmVyLnJlc291cmNlUHJvdmlkZXIpIHsKICAgICByZXNldCgpOwpAQCAtMTg0LDcgKzE4NSw3IEBACiAKICAgRnV0dXJlPHZvaWQ+IHN0YXJ0UHJldmlld1NlcnZlcihNaWdyYXRpb25TdGF0ZSBzdGF0ZSkgYXN5bmMgewogICAgIGlmIChfc2VydmVyID09IG51bGwpIHsKLSAgICAgIF9zZXJ2ZXIgPSBIdHRwUHJldmlld1NlcnZlcihzdGF0ZSwgcmVydW4sIGhvc3RuYW1lLCBwcmVmZXJyZWRQb3J0KTsKKyAgICAgIF9zZXJ2ZXIgPSBIdHRwUHJldmlld1NlcnZlcihzdGF0ZSwgcmVydW4sIGJpbmRBZGRyZXNzLCBwcmVmZXJyZWRQb3J0KTsKICAgICAgIF9zZXJ2ZXIuc2VydmVIdHRwKCk7CiAgICAgICBfYWxsU2VydmVycy5hZGQoX3NlcnZlcik7CiAgICAgICB2YXIgc2VydmVySG9zdG5hbWUgPSBhd2FpdCBfc2VydmVyLmJvdW5kSG9zdG5hbWU7CmRpZmYgLS1naXQgYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9mcm9udF9lbmQvcmVzb3VyY2VzL21pZ3JhdGlvbi5jc3MgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9mcm9udF9lbmQvcmVzb3VyY2VzL21pZ3JhdGlvbi5jc3MKaW5kZXggNTNmYjdjYy4uMGQ1OTRmMCAxMDA2NDQKLS0tIGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZnJvbnRfZW5kL3Jlc291cmNlcy9taWdyYXRpb24uY3NzCisrKyBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL2Zyb250X2VuZC9yZXNvdXJjZXMvbWlncmF0aW9uLmNzcwpAQCAtMzg0LDkgKzM4NCw5IEBACiAgIGJhY2tncm91bmQtY29sb3I6ICMxNzhhZmQ7IC8qICRkYXJrLXNlbGVjdGlvbi1jb2xvciAqLwogICBjb2xvcjogI2ZmZjsKICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICBoZWlnaHQ6IDE4cHg7CisgIGhlaWdodDogMTRweDsKICAgcG9zaXRpb246IHJlbGF0aXZlOwotICB0b3A6IDNweDsKKyAgdG9wOiAxcHg7CiB9CiAKIC50YXJnZXQgewpkaWZmIC0tZ2l0IGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZnJvbnRfZW5kL3Jlc291cmNlcy9yZXNvdXJjZXMuZy5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvZnJvbnRfZW5kL3Jlc291cmNlcy9yZXNvdXJjZXMuZy5kYXJ0CmluZGV4IDUyYzY4NzEuLjkzMGZkYmQgMTAwNjQ0Ci0tLSBhL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL2Zyb250X2VuZC9yZXNvdXJjZXMvcmVzb3VyY2VzLmcuZGFydAorKysgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9mcm9udF9lbmQvcmVzb3VyY2VzL3Jlc291cmNlcy5nLmRhcnQKQEAgLTc0ODYsNyArNzQ4Niw3IEBACiAnJyc7CiAKIFN0cmluZyBfbWlncmF0aW9uX2NzczsKLS8vIG1pZ3JhdGlvbl9jc3MgbWQ1IGlzICdiMGM5NWVjODRjYmQ2ZGU1MDdjYTJlNmE3ZDZhNDViNycKKy8vIG1pZ3JhdGlvbl9jc3MgbWQ1IGlzICdjMzA0NWY1YThjMWY2MmI0ZThmNWVmZDkwZTA3OTAyOScKIFN0cmluZyBfbWlncmF0aW9uX2Nzc19iYXNlNjQgPSAnJycKIEx5b2dRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1ERTVMQ0IwYUdVZ1JHRnlkQ0J3Y205cVpXTjBJR0YxZEdodmNuTXVJRkJzWldGelpTQnpaV1VnCiBkR2hsSUVGVlZFaFBVbE1nWm1sc1pTQWdLaThLTHlvZ1ptOXlJR1JsZEdGcGJITXVJRUZzYkNCeWFXZG9kSE1nY21WelpYSjJaV1F1SUZWegpAQCAtNzU5NSw3ICs3NTk1LDcgQEAKIGRXNWtMV052Ykc5eU9pQWpSa0UxTlRka095QXZLaUFrWkdGeWF5MXdhVzVySUNvdkNpQWdZMjlzYjNJNklDTm1abVk3Q24wS0NpNXlaV2RwCiBiMjR1YVc1bWIzSnRZWFJwZG1VdGNtVm5hVzl1SUhzS0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpNVGM0WVdaa095QXZLaUFrWkdGeQogYXkxelpXeGxZM1JwYjI0dFkyOXNiM0lnS2k4S0lDQmpiMnh2Y2pvZ0kyWm1aanNLSUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczcKLUNpQWdhR1ZwWjJoME9pQXhPSEI0T3dvZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUc0tJQ0IwYjNBNklETndlRHNLZlFvS0xuUmhjbWRsCitDaUFnYUdWcFoyaDBPaUF4TkhCNE93b2dJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHNLSUNCMGIzQTZJREZ3ZURzS2ZRb0tMblJoY21kbAogZENCN0NpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJelEwTkRzS0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdDaUFnZG1semFXSnAKIGJHbDBlVG9nZG1semFXSnNaVHNLSUNCbWIyNTBMWGRsYVdkb2REb2dOakF3T3dwOUNnb3VhVzVtYnkxd1lXNWxiQ0I3Q2lBZ1pteGxlRG9nCiBNU0F5TURCd2VEc0tJQ0J0WVhKbmFXNDZJREE3Q2lBZ2FHVnBaMmgwT2lBeE1EQWxPd29nSUdScGMzQnNZWGs2SUdac1pYZzdDaUFnWm14bApkaWZmIC0tZ2l0IGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvbnVsbGFiaWxpdHlfbWlncmF0aW9uX2ltcGwuZGFydCBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL251bGxhYmlsaXR5X21pZ3JhdGlvbl9pbXBsLmRhcnQKaW5kZXggMzllNmM4NS4uODViN2UyYyAxMDA2NDQKLS0tIGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvbnVsbGFiaWxpdHlfbWlncmF0aW9uX2ltcGwuZGFydAorKysgYi9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy9udWxsYWJpbGl0eV9taWdyYXRpb25faW1wbC5kYXJ0CkBAIC01LDggKzUsOCBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL2RhcnQvYW5hbHlzaXMvcmVzdWx0cy5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9maWxlX3N5c3RlbS9waHlzaWNhbF9maWxlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZGFydC9hbmFseXNpcy9zZXNzaW9uLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplcl9wbHVnaW4vcHJvdG9jb2wvcHJvdG9jb2xfY29tbW9uLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm5uYmRfbWlncmF0aW9uL2luc3RydW1lbnRhdGlvbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpubmJkX21pZ3JhdGlvbi9ubmJkX21pZ3JhdGlvbi5kYXJ0JzsKZGlmZiAtLWdpdCBhL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL3ByZXZpZXcvaHR0cF9wcmV2aWV3X3NlcnZlci5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvcHJldmlldy9odHRwX3ByZXZpZXdfc2VydmVyLmRhcnQKaW5kZXggM2FmZGFkYi4uMThlZWZiYiAxMDA2NDQKLS0tIGEvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvcHJldmlldy9odHRwX3ByZXZpZXdfc2VydmVyLmRhcnQKKysrIGIvcGtnL25uYmRfbWlncmF0aW9uL2xpYi9zcmMvcHJldmlldy9odHRwX3ByZXZpZXdfc2VydmVyLmRhcnQKQEAgLTM1LDE1ICszNSwxOSBAQAogICAvLyBBIGZ1bmN0aW9uIHdoaWNoIGFsbG93cyB0aGUgbWlncmF0aW9uIHRvIGJlIHJlcnVuLCB0YWtpbmcgY2hhbmdlZCBwYXRocy4KICAgZmluYWwgRnV0dXJlPE1pZ3JhdGlvblN0YXRlPiBGdW5jdGlvbigpIHJlcnVuRnVuY3Rpb247CiAKLSAgZmluYWwgU3RyaW5nIGhvc3RuYW1lOworICAvLy8gVGhlIGludGVybmV0IGFkZHJlc3MgdGhlIHNlcnZlciBzaG91bGQgYmluZCB0by4gIFNob3VsZCBiZSBzdWl0YWJsZSBmb3IKKyAgLy8vIHBhc3NpbmcgdG8gSHR0cFNlcnZlci5iaW5kLCBpLmUuIGVpdGhlciBhIFtTdHJpbmddIG9yIGFuCisgIC8vLyBbSW50ZXJuZXRBZGRyZXNzXS4KKyAgZmluYWwgT2JqZWN0IGJpbmRBZGRyZXNzOwogCiAgIC8vLyBJbnRlZ2VyIGZvciBhIHBvcnQgdG8gcnVuIHRoZSBwcmV2aWV3IHNlcnZlciBvbi4gIElmIG51bGwgb3IgemVybywgYWxsb3cKICAgLy8vIFtIdHRwU2VydmVyLmJpbmRdIHRvIHBpY2sgb25lLgogICBmaW5hbCBpbnQgcHJlZmVycmVkUG9ydDsKIAogICAvLy8gSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgSFRUUCBzZXJ2ZXIuCi0gIEh0dHBQcmV2aWV3U2VydmVyKHRoaXMubWlncmF0aW9uU3RhdGUsIHRoaXMucmVydW5GdW5jdGlvbiwgdGhpcy5ob3N0bmFtZSwKLSAgICAgIHRoaXMucHJlZmVycmVkUG9ydCk7CisgIEh0dHBQcmV2aWV3U2VydmVyKHRoaXMubWlncmF0aW9uU3RhdGUsIHRoaXMucmVydW5GdW5jdGlvbiwgdGhpcy5iaW5kQWRkcmVzcywKKyAgICAgIHRoaXMucHJlZmVycmVkUG9ydCkKKyAgICAgIDogYXNzZXJ0KGJpbmRBZGRyZXNzIGlzIFN0cmluZyB8fCBiaW5kQWRkcmVzcyBpcyBJbnRlcm5ldEFkZHJlc3MpOwogCiAgIEZ1dHVyZTxTdHJpbmc+IGdldCBhdXRoVG9rZW4gYXN5bmMgewogICAgIGF3YWl0IF9zZXJ2ZXJGdXR1cmU7CkBAIC03NCwxNiArNzgsNyBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBpZiAoaG9zdG5hbWUgPT0gJ2xvY2FsaG9zdCcpIHsKLSAgICAgICAgX3NlcnZlckZ1dHVyZSA9Ci0gICAgICAgICAgICBIdHRwU2VydmVyLmJpbmQoSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NCwgcHJlZmVycmVkUG9ydCA/PyAwKTsKLSAgICAgIH0gZWxzZSBpZiAoaG9zdG5hbWUgPT0gJ2FueScpIHsKLSAgICAgICAgX3NlcnZlckZ1dHVyZSA9Ci0gICAgICAgICAgICBIdHRwU2VydmVyLmJpbmQoSW50ZXJuZXRBZGRyZXNzLmFueUlQdjYsIHByZWZlcnJlZFBvcnQgPz8gMCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBfc2VydmVyRnV0dXJlID0gSHR0cFNlcnZlci5iaW5kKGhvc3RuYW1lLCBwcmVmZXJyZWRQb3J0ID8/IDApOwotICAgICAgfQotCisgICAgICBfc2VydmVyRnV0dXJlID0gSHR0cFNlcnZlci5iaW5kKGJpbmRBZGRyZXNzLCBwcmVmZXJyZWRQb3J0ID8/IDApOwogICAgICAgdmFyIHNlcnZlciA9IGF3YWl0IF9zZXJ2ZXJGdXR1cmU7CiAgICAgICBfaGFuZGxlU2VydmVyKHNlcnZlcik7CiAgICAgICByZXR1cm4gc2VydmVyLnBvcnQ7CmRpZmYgLS1naXQgYS9wa2cvbm5iZF9taWdyYXRpb24vbGliL3NyYy92YXJpYWJsZXMuZGFydCBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL3ZhcmlhYmxlcy5kYXJ0CmluZGV4IDdmZjRmMjQuLjk3NDQ5NjggMTAwNjQ0Ci0tLSBhL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL3ZhcmlhYmxlcy5kYXJ0CisrKyBiL3BrZy9ubmJkX21pZ3JhdGlvbi9saWIvc3JjL3ZhcmlhYmxlcy5kYXJ0CkBAIC0xMyw3ICsxMyw2IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9tZW1iZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC90eXBlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudF90eXBlX3Byb3ZpZGVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC91dGlsaXRpZXNfZGFydC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTptZXRhL21ldGEuZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvbm5iZF9taWdyYXRpb24vdGVzdC9hcGlfdGVzdC5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL3Rlc3QvYXBpX3Rlc3QuZGFydAppbmRleCAyZTM1Y2UwLi5mMTk3OTQ3IDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vdGVzdC9hcGlfdGVzdC5kYXJ0CisrKyBiL3BrZy9ubmJkX21pZ3JhdGlvbi90ZXN0L2FwaV90ZXN0LmRhcnQKQEAgLTIwMjMsNyArMjAyMywzOSBAQAogICAgIGF3YWl0IF9jaGVja1NpbmdsZUZpbGVDaGFuZ2VzKGNvbnRlbnQsIGV4cGVjdGVkLCByZW1vdmVWaWFDb21tZW50czogdHJ1ZSk7CiAgIH0KIAotICBARmFpbGluZ1Rlc3QoaXNzdWU6ICdodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDAwMjMnKQorICBGdXR1cmU8dm9pZD4gdGVzdF9leHRlbnNpb25fbnVsbF9jaGVja190YXJnZXQoKSBhc3luYyB7CisgICAgdmFyIGNvbnRlbnQgPSAnJycKK2V4dGVuc2lvbiBFIG9uIGludC8qISovIHsKKyAgaW50IGdldCBwbHVzT25lID0+IHRoaXMgKyAxOworfQoraW50IGYoaW50Lyo/Ki8geCkgPT4geC5wbHVzT25lOworJycnOworICAgIHZhciBleHBlY3RlZCA9ICcnJworZXh0ZW5zaW9uIEUgb24gaW50IHsKKyAgaW50IGdldCBwbHVzT25lID0+IHRoaXMgKyAxOworfQoraW50IGYoaW50PyB4KSA9PiB4IS5wbHVzT25lOworJycnOworICAgIGF3YWl0IF9jaGVja1NpbmdsZUZpbGVDaGFuZ2VzKGNvbnRlbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEBGYWlsaW5nVGVzdChpc3N1ZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy80MjUyOScpCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2V4dGVuc2lvbl9udWxsYWJsZV90YXJnZXQoKSBhc3luYyB7CisgICAgdmFyIGNvbnRlbnQgPSAnJycKK2V4dGVuc2lvbiBFIG9uIGludCB7CisgIGludCBnZXQgb25lID0+IDE7Cit9CitpbnQgZihpbnQvKj8qLyB4KSA9PiB4Lm9uZTsKKycnJzsKKyAgICB2YXIgZXhwZWN0ZWQgPSAnJycKK2V4dGVuc2lvbiBFIG9uIGludD8geworICBpbnQgZ2V0IG9uZSA9PiAxOworfQoraW50IGYoaW50PyB4KSA9PiB4Lm9uZTsKKycnJzsKKyAgICBhd2FpdCBfY2hlY2tTaW5nbGVGaWxlQ2hhbmdlcyhjb250ZW50LCBleHBlY3RlZCk7CisgIH0KKwogICBGdXR1cmU8dm9pZD4gdGVzdF9leHRlbnNpb25fbnVsbGFibGVPblR5cGVfYWRkc051bGxDaGVja1RvVGhpcygpIGFzeW5jIHsKICAgICB2YXIgY29udGVudCA9ICcnJwogZXh0ZW5zaW9uIEUgb24gU3RyaW5nIC8qPyovIHsKQEAgLTIwNzUsNyArMjEwNyw2IEBACiAgICAgYXdhaXQgX2NoZWNrU2luZ2xlRmlsZUNoYW5nZXMoY29udGVudCwgZXhwZWN0ZWQpOwogICB9CiAKLSAgQEZhaWxpbmdUZXN0KGlzc3VlOiAnaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzQwMDIzJykKICAgRnV0dXJlPHZvaWQ+IHRlc3RfZXh0ZW5zaW9uX251bGxhYmxlT25UeXBlX3ZpYUV4cGxpY2l0SW52b2NhdGlvbigpIGFzeW5jIHsKICAgICB2YXIgY29udGVudCA9ICcnJwogY2xhc3MgQyB7fQpAQCAtMjE1Nyw2ICsyMTg4LDcxIEBACiAgICAgYXdhaXQgX2NoZWNrU2luZ2xlRmlsZUNoYW5nZXMoY29udGVudCwgZXhwZWN0ZWQpOwogICB9CiAKKyAgRnV0dXJlPHZvaWQ+IHRlc3RfZXh0ZW5zaW9uX292ZXJyaWRlKCkgYXN5bmMgeworICAgIHZhciBjb250ZW50ID0gJycnCitleHRlbnNpb24gRSBvbiBpbnQgeworICBpbnQgZ2V0IHBsdXNPbmUgPT4gdGhpcyArIDE7Cit9CitpbnQgZihpbnQgeCkgPT4gRSh4KS5wbHVzT25lOworJycnOworICAgIHZhciBleHBlY3RlZCA9ICcnJworZXh0ZW5zaW9uIEUgb24gaW50IHsKKyAgaW50IGdldCBwbHVzT25lID0+IHRoaXMgKyAxOworfQoraW50IGYoaW50IHgpID0+IEUoeCkucGx1c09uZTsKKycnJzsKKyAgICBhd2FpdCBfY2hlY2tTaW5nbGVGaWxlQ2hhbmdlcyhjb250ZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmU8dm9pZD4gdGVzdF9leHRlbnNpb25fb3ZlcnJpZGVfbnVsbF9jaGVja190YXJnZXQoKSBhc3luYyB7CisgICAgdmFyIGNvbnRlbnQgPSAnJycKK2V4dGVuc2lvbiBFIG9uIGludC8qISovIHsKKyAgaW50IGdldCBwbHVzT25lID0+IHRoaXMgKyAxOworfQoraW50IGYoaW50Lyo/Ki8geCkgPT4gRSh4KS5wbHVzT25lOworJycnOworICAgIHZhciBleHBlY3RlZCA9ICcnJworZXh0ZW5zaW9uIEUgb24gaW50IHsKKyAgaW50IGdldCBwbHVzT25lID0+IHRoaXMgKyAxOworfQoraW50IGYoaW50PyB4KSA9PiBFKHghKS5wbHVzT25lOworJycnOworICAgIGF3YWl0IF9jaGVja1NpbmdsZUZpbGVDaGFuZ2VzKGNvbnRlbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZTx2b2lkPiB0ZXN0X2V4dGVuc2lvbl9vdmVycmlkZV9udWxsYWJsZV9yZXN1bHRfdHlwZSgpIGFzeW5jIHsKKyAgICB2YXIgY29udGVudCA9ICcnJworZXh0ZW5zaW9uIEUgb24gaW50IHsKKyAgaW50IGdldCBudWxsVmFsdWUgPT4gbnVsbDsKK30KK2ludCBmKGludCB4KSA9PiBFKHgpLm51bGxWYWx1ZTsKKycnJzsKKyAgICB2YXIgZXhwZWN0ZWQgPSAnJycKK2V4dGVuc2lvbiBFIG9uIGludCB7CisgIGludD8gZ2V0IG51bGxWYWx1ZSA9PiBudWxsOworfQoraW50PyBmKGludCB4KSA9PiBFKHgpLm51bGxWYWx1ZTsKKycnJzsKKyAgICBhd2FpdCBfY2hlY2tTaW5nbGVGaWxlQ2hhbmdlcyhjb250ZW50LCBleHBlY3RlZCk7CisgIH0KKworICBARmFpbGluZ1Rlc3QoaXNzdWU6ICdodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDI1MjknKQorICBGdXR1cmU8dm9pZD4gdGVzdF9leHRlbnNpb25fb3ZlcnJpZGVfbnVsbGFibGVfdGFyZ2V0KCkgYXN5bmMgeworICAgIHZhciBjb250ZW50ID0gJycnCitleHRlbnNpb24gRSBvbiBpbnQgeworICBpbnQgZ2V0IG9uZSA9PiAxOworfQoraW50IGYoaW50Lyo/Ki8geCkgPT4gRSh4KS5vbmU7CisnJyc7CisgICAgdmFyIGV4cGVjdGVkID0gJycnCitleHRlbnNpb24gRSBvbiBpbnQ/IHsKKyAgaW50IGdldCBvbmUgPT4gMTsKK30KK2ludCBmKGludD8geCkgPT4gRSh4KS5vbmU7CisnJyc7CisgICAgYXdhaXQgX2NoZWNrU2luZ2xlRmlsZUNoYW5nZXMoY29udGVudCwgZXhwZWN0ZWQpOworICB9CisKICAgRnV0dXJlPHZvaWQ+IHRlc3RfZmllbGRfZmluYWxfdW5pbml0YWxpemVkX3VzZWQoKSBhc3luYyB7CiAgICAgdmFyIGNvbnRlbnQgPSAnJycKIGNsYXNzIEMgewpkaWZmIC0tZ2l0IGEvcGtnL25uYmRfbWlncmF0aW9uL3Rlc3QvbWlncmF0aW9uX2NsaV90ZXN0LmRhcnQgYi9wa2cvbm5iZF9taWdyYXRpb24vdGVzdC9taWdyYXRpb25fY2xpX3Rlc3QuZGFydAppbmRleCAxYzQzNzU0Li5jZGFjY2NmIDEwMDY0NAotLS0gYS9wa2cvbm5iZF9taWdyYXRpb24vdGVzdC9taWdyYXRpb25fY2xpX3Rlc3QuZGFydAorKysgYi9wa2cvbm5iZF9taWdyYXRpb24vdGVzdC9taWdyYXRpb25fY2xpX3Rlc3QuZGFydApAQCAtNTgsMTUgKzU4LDE2IEBACiAvLy8gU3BlY2lhbGl6YXRpb24gb2YgW05vbk51bGxhYmxlRml4XSB0aGF0IGdlbmVyYXRlcyBhcnRpZmljaWFsIGV4Y2VwdGlvbnMsIHNvCiAvLy8gdGhhdCB3ZSBjYW4gdGVzdCB0aGV5IGFyZSBwcm9wZXJseSBwcm9wYWdhdGVkIHRvIHRvcCBsZXZlbC4KIGNsYXNzIF9FeGNlcHRpb25HZW5lcmF0aW5nTm9uTnVsbGFibGVGaXggZXh0ZW5kcyBOb25OdWxsYWJsZUZpeCB7Ci0gIF9FeGNlcHRpb25HZW5lcmF0aW5nTm9uTnVsbGFibGVGaXgoRGFydEZpeExpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgUmVzb3VyY2VQcm92aWRlciByZXNvdXJjZVByb3ZpZGVyLCBMaW5lSW5mbyBGdW5jdGlvbihTdHJpbmcpIGdldExpbmVJbmZvLAorICBfRXhjZXB0aW9uR2VuZXJhdGluZ05vbk51bGxhYmxlRml4KAorICAgICAgRGFydEZpeExpc3RlbmVyIGxpc3RlbmVyLAorICAgICAgUmVzb3VyY2VQcm92aWRlciByZXNvdXJjZVByb3ZpZGVyLAorICAgICAgTGluZUluZm8gRnVuY3Rpb24oU3RyaW5nKSBnZXRMaW5lSW5mbywKKyAgICAgIE9iamVjdCBiaW5kQWRkcmVzcywKICAgICAgIHtMaXN0PFN0cmluZz4gaW5jbHVkZWQgPSBjb25zdCA8U3RyaW5nPltdLAotICAgICAgU3RyaW5nIGhvc3RuYW1lLAogICAgICAgaW50IHByZWZlcnJlZFBvcnQsCiAgICAgICBTdHJpbmcgc3VtbWFyeVBhdGh9KQotICAgICAgOiBzdXBlcihsaXN0ZW5lciwgcmVzb3VyY2VQcm92aWRlciwgZ2V0TGluZUluZm8sCisgICAgICA6IHN1cGVyKGxpc3RlbmVyLCByZXNvdXJjZVByb3ZpZGVyLCBnZXRMaW5lSW5mbywgYmluZEFkZHJlc3MsCiAgICAgICAgICAgICBpbmNsdWRlZDogaW5jbHVkZWQsCi0gICAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUsCiAgICAgICAgICAgICBwcmVmZXJyZWRQb3J0OiBwcmVmZXJyZWRQb3J0LAogICAgICAgICAgICAgc3VtbWFyeVBhdGg6IHN1bW1hcnlQYXRoKTsKIApAQCAtMTE2LDI3ICsxMTcsMzggQEAKICAgfQogCiAgIEBvdmVycmlkZQorICBPYmplY3QgY29tcHV0ZUJpbmRBZGRyZXNzKCkgeworICAgIHZhciBhZGRyZXNzID0gc3VwZXIuY29tcHV0ZUJpbmRBZGRyZXNzKCk7CisgICAgaWYgKFBsYXRmb3JtLmVudmlyb25tZW50LmNvbnRhaW5zS2V5KCdGT1JDRV9JUFY2JykgJiYKKyAgICAgICAgYWRkcmVzcyA9PSBJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0KSB7CisgICAgICByZXR1cm4gSW50ZXJuZXRBZGRyZXNzLmxvb3BiYWNrSVB2NjsKKyAgICB9CisgICAgcmV0dXJuIGFkZHJlc3M7CisgIH0KKworICBAb3ZlcnJpZGUKICAgU2V0PFN0cmluZz4gY29tcHV0ZVBhdGhzVG9Qcm9jZXNzKERyaXZlckJhc2VkQW5hbHlzaXNDb250ZXh0IGNvbnRleHQpID0+CiAgICAgICBjbGkuX3Rlc3Qub3ZlcnJpZGVQYXRoc1RvUHJvY2VzcyA/PyBzdXBlci5jb21wdXRlUGF0aHNUb1Byb2Nlc3MoY29udGV4dCk7CiAKICAgQG92ZXJyaWRlCi0gIE5vbk51bGxhYmxlRml4IGNyZWF0ZU5vbk51bGxhYmxlRml4KERhcnRGaXhMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwgTGluZUluZm8gZ2V0TGluZUluZm8oU3RyaW5nIHBhdGgpLAorICBOb25OdWxsYWJsZUZpeCBjcmVhdGVOb25OdWxsYWJsZUZpeCgKKyAgICAgIERhcnRGaXhMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgIFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciwKKyAgICAgIExpbmVJbmZvIGdldExpbmVJbmZvKFN0cmluZyBwYXRoKSwKKyAgICAgIE9iamVjdCBiaW5kQWRkcmVzcywKICAgICAgIHtMaXN0PFN0cmluZz4gaW5jbHVkZWQgPSBjb25zdCA8U3RyaW5nPltdLAotICAgICAgU3RyaW5nIGhvc3RuYW1lLAogICAgICAgaW50IHByZWZlcnJlZFBvcnQsCiAgICAgICBTdHJpbmcgc3VtbWFyeVBhdGh9KSB7CiAgICAgaWYgKGNsaS5fdGVzdC5pbmplY3RBcnRpZmljaWFsRXhjZXB0aW9uKSB7CiAgICAgICByZXR1cm4gX0V4Y2VwdGlvbkdlbmVyYXRpbmdOb25OdWxsYWJsZUZpeCgKLSAgICAgICAgICBsaXN0ZW5lciwgcmVzb3VyY2VQcm92aWRlciwgZ2V0TGluZUluZm8sCisgICAgICAgICAgbGlzdGVuZXIsIHJlc291cmNlUHJvdmlkZXIsIGdldExpbmVJbmZvLCBiaW5kQWRkcmVzcywKICAgICAgICAgICBpbmNsdWRlZDogaW5jbHVkZWQsCi0gICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lLAogICAgICAgICAgIHByZWZlcnJlZFBvcnQ6IHByZWZlcnJlZFBvcnQsCiAgICAgICAgICAgc3VtbWFyeVBhdGg6IHN1bW1hcnlQYXRoKTsKICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZU5vbk51bGxhYmxlRml4KGxpc3RlbmVyLCByZXNvdXJjZVByb3ZpZGVyLCBnZXRMaW5lSW5mbywKKyAgICAgIHJldHVybiBzdXBlci5jcmVhdGVOb25OdWxsYWJsZUZpeCgKKyAgICAgICAgICBsaXN0ZW5lciwgcmVzb3VyY2VQcm92aWRlciwgZ2V0TGluZUluZm8sIGJpbmRBZGRyZXNzLAogICAgICAgICAgIGluY2x1ZGVkOiBpbmNsdWRlZCwKLSAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUsCiAgICAgICAgICAgcHJlZmVycmVkUG9ydDogcHJlZmVycmVkUG9ydCwKICAgICAgICAgICBzdW1tYXJ5UGF0aDogc3VtbWFyeVBhdGgpOwogICAgIH0KQEAgLTc2Miw5ICs3NzQsMTIgQEAKICAgICB2YXIgcHJvamVjdERpciA9IGF3YWl0IGNyZWF0ZVByb2plY3REaXIocHJvamVjdENvbnRlbnRzKTsKICAgICB2YXIgY2xpID0gX2NyZWF0ZUNsaSgpOwogICAgIGF3YWl0IHJ1bldpdGhQcmV2aWV3U2VydmVyKGNsaSwgW3Byb2plY3REaXJdLCAodXJsKSBhc3luYyB7CisgICAgICB2YXIgbG9jYWxob3N0QWRkcmVzc1RleHQgPSBQbGF0Zm9ybS5lbnZpcm9ubWVudC5jb250YWluc0tleSgnRk9SQ0VfSVBWNicpCisgICAgICAgICAgPyAnWzo6MV0nCisgICAgICAgICAgOiAnMTI3LjAuMC4xJzsKICAgICAgIGV4cGVjdCgKICAgICAgICAgICBsb2dnZXIuc3Rkb3V0QnVmZmVyLnRvU3RyaW5nKCksIGNvbnRhaW5zKCdObyBhbmFseXNpcyBpc3N1ZXMgZm91bmQnKSk7Ci0gICAgICBleHBlY3QodXJsLCBzdGFydHNXaXRoKCdodHRwOi8vMTI3LjAuMC4xOicpKTsKKyAgICAgIGV4cGVjdCh1cmwsIHN0YXJ0c1dpdGgoJ2h0dHA6Ly8kbG9jYWxob3N0QWRkcmVzc1RleHQ6JykpOwogICAgICAgYXdhaXQgYXNzZXJ0UHJldmlld1NlcnZlclJlc3BvbnNpdmUodXJsKTsKICAgICB9KTsKICAgICAvLyBObyBjaGFuZ2VzIHNob3VsZCBoYXZlIGJlZW4gbWFkZS4KZGlmZiAtLWdpdCBhL3BrZy9ubmJkX21pZ3JhdGlvbi90ZXN0L21pZ3JhdGlvbl92aXNpdG9yX3Rlc3RfYmFzZS5kYXJ0IGIvcGtnL25uYmRfbWlncmF0aW9uL3Rlc3QvbWlncmF0aW9uX3Zpc2l0b3JfdGVzdF9iYXNlLmRhcnQKaW5kZXggM2UzY2Y0ZS4uZWE2NTg0NCAxMDA2NDQKLS0tIGEvcGtnL25uYmRfbWlncmF0aW9uL3Rlc3QvbWlncmF0aW9uX3Zpc2l0b3JfdGVzdF9iYXNlLmRhcnQKKysrIGIvcGtnL25uYmRfbWlncmF0aW9uL3Rlc3QvbWlncmF0aW9uX3Zpc2l0b3JfdGVzdF9iYXNlLmRhcnQKQEAgLTgsOCArOCw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvZGFydC9lbGVtZW50L3R5cGVfcHJvdmlkZXIuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2RhcnQvZWxlbWVudC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9kYXJ0L2VsZW1lbnQvdHlwZS5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3Jlc29sdmVyLmRhcnQnIHNob3cgVHlwZVN5c3RlbUltcGw7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC90eXBlX3N5c3RlbS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3V0aWxpdGllc19kYXJ0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTpubmJkX21pZ3JhdGlvbi9pbnN0cnVtZW50YXRpb24uZGFydCc7CmRpZmYgLS1naXQgYS9wa2cvcGtnLnN0YXR1cyBiL3BrZy9wa2cuc3RhdHVzCmluZGV4IDRjYzU4NzMuLjE4ZmU1YzIgMTAwNjQ0Ci0tLSBhL3BrZy9wa2cuc3RhdHVzCisrKyBiL3BrZy9wa2cuc3RhdHVzCkBAIC0xMzQsNiArMTM0LDcgQEAKIGNvbXBpbGVyL3Rlc3QvZW5kX3RvX2VuZC9kYXJ0MmpzX2JhdGNoX3Rlc3Q6IFNsb3csIFBhc3MKIGNvbXBpbGVyL3Rlc3QvZW5kX3RvX2VuZC9leGl0X2NvZGVfdGVzdDogU2xvdywgUGFzcwogY29tcGlsZXIvdGVzdC9lbmRfdG9fZW5kL2luX3VzZXJfY29kZV90ZXN0OiBTbG93LCBQYXNzCit2bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L3ByZWNvbXBpbGVyX3RyYWNlX3Rlc3Q6IFNraXBTbG93CiAKIFsgJHJ1bnRpbWUgPT0gZGFydF9wcmVjb21waWxlZCBdCiAqOiBTa2lwQnlEZXNpZ24gIyBUaGUgcGtnIHRlc3QgZnJhbWV3b3JrIGltcG9ydHMgZGFydDptaXJyb3JzLgpkaWZmIC0tZ2l0IGEvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvbGlzdF9mYWN0b3J5X3NwZWNpYWxpemVyLmRhcnQgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXIuZGFydAppbmRleCA2MGFmZjVmLi5hNzU5MTk5IDEwMDY0NAotLS0gYS9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXIuZGFydAorKysgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXIuZGFydApAQCAtMTMsMTMgKzEzLDE3IEBACiAvLy8gbmV3IExpc3QoKSA9PiBuZXcgX0dyb3dhYmxlTGlzdCgwKQogLy8vIG5ldyBMaXN0KG4pID0+IG5ldyBfTGlzdChuKQogLy8vIG5ldyBMaXN0LmZpbGxlZChuLCBudWxsLCBncm93YWJsZTogdHJ1ZSkgPT4gbmV3IF9Hcm93YWJsZUxpc3QobikKKy8vLyBuZXcgTGlzdC5maWxsZWQobiwgeCwgZ3Jvd2FibGU6IHRydWUpID0+IG5ldyBfR3Jvd2FibGVMaXN0LmZpbGxlZChuLCB4KQogLy8vIG5ldyBMaXN0LmZpbGxlZChuLCBudWxsKSA9PiBuZXcgX0xpc3QobikKKy8vLyBuZXcgTGlzdC5maWxsZWQobiwgeCkgPT4gbmV3IF9MaXN0LmZpbGxlZChuLCB4KQogLy8vCiBjbGFzcyBMaXN0RmFjdG9yeVNwZWNpYWxpemVyIHsKICAgZmluYWwgUHJvY2VkdXJlIF9kZWZhdWx0TGlzdEZhY3Rvcnk7CiAgIGZpbmFsIFByb2NlZHVyZSBfbGlzdEZpbGxlZEZhY3Rvcnk7CiAgIGZpbmFsIFByb2NlZHVyZSBfZ3Jvd2FibGVMaXN0RmFjdG9yeTsKKyAgZmluYWwgUHJvY2VkdXJlIF9ncm93YWJsZUxpc3RGaWxsZWRGYWN0b3J5OwogICBmaW5hbCBQcm9jZWR1cmUgX2ZpeGVkTGlzdEZhY3Rvcnk7CisgIGZpbmFsIFByb2NlZHVyZSBfZml4ZWRMaXN0RmlsbGVkRmFjdG9yeTsKIAogICBMaXN0RmFjdG9yeVNwZWNpYWxpemVyKENvcmVUeXBlcyBjb3JlVHlwZXMpCiAgICAgICA6IF9kZWZhdWx0TGlzdEZhY3RvcnkgPQpAQCAtMjgsMTIgKzMyLDE3IEBACiAgICAgICAgICAgICBjb3JlVHlwZXMuaW5kZXguZ2V0TWVtYmVyKCdkYXJ0OmNvcmUnLCAnTGlzdCcsICdmaWxsZWQnKSwKICAgICAgICAgX2dyb3dhYmxlTGlzdEZhY3RvcnkgPQogICAgICAgICAgICAgY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19Hcm93YWJsZUxpc3QnLCAnJyksCi0gICAgICAgIF9maXhlZExpc3RGYWN0b3J5ID0KLSAgICAgICAgICAgIGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfTGlzdCcsICcnKSB7CisgICAgICAgIF9ncm93YWJsZUxpc3RGaWxsZWRGYWN0b3J5ID0KKyAgICAgICAgICAgIGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfR3Jvd2FibGVMaXN0JywgJ2ZpbGxlZCcpLAorICAgICAgICBfZml4ZWRMaXN0RmFjdG9yeSA9IGNvcmVUeXBlcy5pbmRleC5nZXRNZW1iZXIoJ2RhcnQ6Y29yZScsICdfTGlzdCcsICcnKSwKKyAgICAgICAgX2ZpeGVkTGlzdEZpbGxlZEZhY3RvcnkgPQorICAgICAgICAgICAgY29yZVR5cGVzLmluZGV4LmdldE1lbWJlcignZGFydDpjb3JlJywgJ19MaXN0JywgJ2ZpbGxlZCcpIHsKICAgICBhc3NlcnQoX2RlZmF1bHRMaXN0RmFjdG9yeS5pc0ZhY3RvcnkpOwogICAgIGFzc2VydChfbGlzdEZpbGxlZEZhY3RvcnkuaXNGYWN0b3J5KTsKICAgICBhc3NlcnQoX2dyb3dhYmxlTGlzdEZhY3RvcnkuaXNGYWN0b3J5KTsKKyAgICBhc3NlcnQoX2dyb3dhYmxlTGlzdEZpbGxlZEZhY3RvcnkuaXNGYWN0b3J5KTsKICAgICBhc3NlcnQoX2ZpeGVkTGlzdEZhY3RvcnkuaXNGYWN0b3J5KTsKKyAgICBhc3NlcnQoX2ZpeGVkTGlzdEZpbGxlZEZhY3RvcnkuaXNGYWN0b3J5KTsKICAgfQogCiAgIFRyZWVOb2RlIHRyYW5zZm9ybVN0YXRpY0ludm9jYXRpb24oU3RhdGljSW52b2NhdGlvbiBub2RlKSB7CkBAIC01MywxMCArNjIsOCBAQAogICAgICAgYXNzZXJ0KGFyZ3MucG9zaXRpb25hbC5sZW5ndGggPT0gMik7CiAgICAgICBmaW5hbCBsZW5ndGggPSBhcmdzLnBvc2l0aW9uYWxbMF07CiAgICAgICBmaW5hbCBmaWxsID0gYXJncy5wb3NpdGlvbmFsWzFdOwotICAgICAgaWYgKGZpbGwgaXMhIE51bGxMaXRlcmFsICYmCi0gICAgICAgICAgIShmaWxsIGlzIENvbnN0YW50RXhwcmVzc2lvbiAmJiBmaWxsLmNvbnN0YW50IGlzIE51bGxDb25zdGFudCkpIHsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICB9CisgICAgICBmaW5hbCBmaWxsaW5nV2l0aE51bGwgPSBmaWxsIGlzIE51bGxMaXRlcmFsIHx8CisgICAgICAgICAgKGZpbGwgaXMgQ29uc3RhbnRFeHByZXNzaW9uICYmIGZpbGwuY29uc3RhbnQgaXMgTnVsbENvbnN0YW50KTsKICAgICAgIGJvb2wgZ3Jvd2FibGU7CiAgICAgICBpZiAoYXJncy5uYW1lZC5pc0VtcHR5KSB7CiAgICAgICAgIGdyb3dhYmxlID0gZmFsc2U7CkBAIC03OCwxMyArODUsMjUgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKGdyb3dhYmxlKSB7Ci0gICAgICAgIHJldHVybiBTdGF0aWNJbnZvY2F0aW9uKAotICAgICAgICAgICAgX2dyb3dhYmxlTGlzdEZhY3RvcnksIEFyZ3VtZW50cyhbbGVuZ3RoXSwgdHlwZXM6IGFyZ3MudHlwZXMpKQotICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKKyAgICAgICAgaWYgKGZpbGxpbmdXaXRoTnVsbCkgeworICAgICAgICAgIHJldHVybiBTdGF0aWNJbnZvY2F0aW9uKAorICAgICAgICAgICAgICBfZ3Jvd2FibGVMaXN0RmFjdG9yeSwgQXJndW1lbnRzKFtsZW5ndGhdLCB0eXBlczogYXJncy50eXBlcykpCisgICAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFN0YXRpY0ludm9jYXRpb24oX2dyb3dhYmxlTGlzdEZpbGxlZEZhY3RvcnksCisgICAgICAgICAgICAgIEFyZ3VtZW50cyhbbGVuZ3RoLCBmaWxsXSwgdHlwZXM6IGFyZ3MudHlwZXMpKQorICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU3RhdGljSW52b2NhdGlvbigKLSAgICAgICAgICAgIF9maXhlZExpc3RGYWN0b3J5LCBBcmd1bWVudHMoW2xlbmd0aF0sIHR5cGVzOiBhcmdzLnR5cGVzKSkKLSAgICAgICAgICAuLmZpbGVPZmZzZXQgPSBub2RlLmZpbGVPZmZzZXQ7CisgICAgICAgIGlmIChmaWxsaW5nV2l0aE51bGwpIHsKKyAgICAgICAgICByZXR1cm4gU3RhdGljSW52b2NhdGlvbigKKyAgICAgICAgICAgICAgX2ZpeGVkTGlzdEZhY3RvcnksIEFyZ3VtZW50cyhbbGVuZ3RoXSwgdHlwZXM6IGFyZ3MudHlwZXMpKQorICAgICAgICAgICAgLi5maWxlT2Zmc2V0ID0gbm9kZS5maWxlT2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBTdGF0aWNJbnZvY2F0aW9uKF9maXhlZExpc3RGaWxsZWRGYWN0b3J5LAorICAgICAgICAgICAgICBBcmd1bWVudHMoW2xlbmd0aCwgZmlsbF0sIHR5cGVzOiBhcmdzLnR5cGVzKSkKKyAgICAgICAgICAgIC4uZmlsZU9mZnNldCA9IG5vZGUuZmlsZU9mZnNldDsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RhYmxlX3NlbGVjdG9yLmRhcnQgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdGFibGVfc2VsZWN0b3IuZGFydAppbmRleCA1NzFmMTkwLi4wMGQ1NjUxIDEwMDY0NAotLS0gYS9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdGFibGVfc2VsZWN0b3IuZGFydAorKysgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdGFibGVfc2VsZWN0b3IuZGFydApAQCAtNCw2ICs0LDcgQEAKIAogaW1wb3J0ICdwYWNrYWdlOmtlcm5lbC9hc3QuZGFydCc7CiAKK2ltcG9ydCAndXRpbHMuZGFydCcgc2hvdyBhc3NlcnR4LCBVbmlvbkZpbmQ7CiBpbXBvcnQgJy4uLy4uL21ldGFkYXRhL3Byb2NlZHVyZV9hdHRyaWJ1dGVzLmRhcnQnOwogaW1wb3J0ICcuLi8uLi9tZXRhZGF0YS90YWJsZV9zZWxlY3Rvci5kYXJ0JzsKIApAQCAtMTMsNTEgKzE0LDEwMiBAQAogY2xhc3MgVGFibGVTZWxlY3RvckFzc2lnbmVyIHsKICAgZmluYWwgVGFibGVTZWxlY3Rvck1ldGFkYXRhIG1ldGFkYXRhID0gVGFibGVTZWxlY3Rvck1ldGFkYXRhKCk7CiAKLSAgZmluYWwgTWFwPE5hbWUsIGludD4gX21ldGhvZFNlbGVjdG9ySWQgPSB7fTsKLSAgZmluYWwgTWFwPE5hbWUsIGludD4gX2dldHRlclNlbGVjdG9ySWQgPSB7fTsKLSAgZmluYWwgTWFwPE5hbWUsIGludD4gX3NldHRlclNlbGVjdG9ySWQgPSB7fTsKKyAgZmluYWwgTWFwPENsYXNzLCBNYXA8TmFtZSwgaW50Pj4gX2dldHRlck1lbWJlcklkcyA9IHt9OworICBmaW5hbCBNYXA8Q2xhc3MsIE1hcDxOYW1lLCBpbnQ+PiBfbWV0aG9kT3JTZXR0ZXJNZW1iZXJJZHMgPSB7fTsKIAotICBpbnQgX3NlbGVjdG9ySWRGb3JNYXAoTWFwPE5hbWUsIGludD4gbWFwLCBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgcmV0dXJuIG1hcC5wdXRJZkFic2VudChtZW1iZXIubmFtZSwgKCkgPT4gbWV0YWRhdGEuYWRkU2VsZWN0b3IoKSk7CisgIGZpbmFsIFVuaW9uRmluZCBfdW5pb25GaW5kID0gVW5pb25GaW5kKCk7CisgIExpc3Q8aW50PiBfc2VsZWN0b3JJZEZvck1lbWJlcklkOworCisgIFRhYmxlU2VsZWN0b3JBc3NpZ25lcihDb21wb25lbnQgY29tcG9uZW50KSB7CisgICAgZm9yIChMaWJyYXJ5IGxpYnJhcnkgaW4gY29tcG9uZW50LmxpYnJhcmllcykgeworICAgICAgZm9yIChDbGFzcyBjbHMgaW4gbGlicmFyeS5jbGFzc2VzKSB7CisgICAgICAgIF9tZW1iZXJJZHNGb3JDbGFzcyhjbHMsIGdldHRlcjogZmFsc2UpOworICAgICAgICBfbWVtYmVySWRzRm9yQ2xhc3MoY2xzLCBnZXR0ZXI6IHRydWUpOworICAgICAgfQorICAgIH0KKyAgICBfc2VsZWN0b3JJZEZvck1lbWJlcklkID0gTGlzdChfdW5pb25GaW5kLnNpemUpOworICB9CisKKyAgTWFwPE5hbWUsIGludD4gX21lbWJlcklkc0ZvckNsYXNzKENsYXNzIGNscywge2Jvb2wgZ2V0dGVyfSkgeworICAgIGlmIChjbHMgPT0gbnVsbCkgcmV0dXJuIHt9OworCisgICAgZmluYWwgY2FjaGUgPSBnZXR0ZXIgPyBfZ2V0dGVyTWVtYmVySWRzIDogX21ldGhvZE9yU2V0dGVyTWVtYmVySWRzOworCisgICAgLy8gQWxyZWFkeSBjb21wdXRlZCBmb3IgdGhpcyBjbGFzcz8KKyAgICBNYXA8TmFtZSwgaW50PiBtZW1iZXJJZHMgPSBjYWNoZVtjbHNdOworICAgIGlmIChtZW1iZXJJZHMgIT0gbnVsbCkgcmV0dXJuIG1lbWJlcklkczsKKworICAgIC8vIE1lcmdlIG1hcHMgZnJvbSBzdXBlcnR5cGVzLgorICAgIG1lbWJlcklkcyA9IE1hcC5mcm9tKF9tZW1iZXJJZHNGb3JDbGFzcyhjbHMuc3VwZXJjbGFzcywgZ2V0dGVyOiBnZXR0ZXIpKTsKKyAgICBmb3IgKFN1cGVydHlwZSBpbXBsIGluIGNscy5pbXBsZW1lbnRlZFR5cGVzKSB7CisgICAgICBfbWVtYmVySWRzRm9yQ2xhc3MoaW1wbC5jbGFzc05vZGUsIGdldHRlcjogZ2V0dGVyKS5mb3JFYWNoKChuYW1lLCBpZCkgeworICAgICAgICBmaW5hbCBpbnQgZmlyc3RJZCA9IG1lbWJlcklkc1tuYW1lXTsKKyAgICAgICAgaWYgKGZpcnN0SWQgPT0gbnVsbCkgeworICAgICAgICAgIG1lbWJlcklkc1tuYW1lXSA9IGlkOworICAgICAgICB9IGVsc2UgaWYgKGZpcnN0SWQgIT0gaWQpIHsKKyAgICAgICAgICBfdW5pb25GaW5kLnVuaW9uKGZpcnN0SWQsIGlkKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisgICAgLy8gQWRkIGRlY2xhcmVkIGluc3RhbmNlIG1lbWJlcnMuCisgICAgZm9yIChNZW1iZXIgbWVtYmVyIGluIGNscy5tZW1iZXJzKSB7CisgICAgICBpZiAobWVtYmVyLmlzSW5zdGFuY2VNZW1iZXIpIHsKKyAgICAgICAgYm9vbCBhZGRUb01hcDsKKyAgICAgICAgaWYgKG1lbWJlciBpcyBQcm9jZWR1cmUpIHsKKyAgICAgICAgICBzd2l0Y2ggKG1lbWJlci5raW5kKSB7CisgICAgICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuTWV0aG9kOgorICAgICAgICAgICAgICBhZGRUb01hcCA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLk9wZXJhdG9yOgorICAgICAgICAgICAgY2FzZSBQcm9jZWR1cmVLaW5kLlNldHRlcjoKKyAgICAgICAgICAgICAgYWRkVG9NYXAgPSAhZ2V0dGVyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6CisgICAgICAgICAgICAgIGFkZFRvTWFwID0gZ2V0dGVyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHByb2NlZHVyZSBraW5kICcke21lbWJlci5raW5kfSciOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKKyAgICAgICAgICBhZGRUb01hcCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgbWVtYmVyIGtpbmQgJyR7bWVtYmVyLnJ1bnRpbWVUeXBlfSciOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRUb01hcCAmJiAhbWVtYmVySWRzLmNvbnRhaW5zS2V5KG1lbWJlci5uYW1lKSkgeworICAgICAgICAgIG1lbWJlcklkc1ttZW1iZXIubmFtZV0gPSBfdW5pb25GaW5kLmFkZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlW2Nsc10gPSBtZW1iZXJJZHM7CisgIH0KKworICBpbnQgX3NlbGVjdG9ySWRGb3JNYXAoTWFwPENsYXNzLCBNYXA8TmFtZSwgaW50Pj4gbWFwLCBNZW1iZXIgbWVtYmVyKSB7CisgICAgaW50IG1lbWJlcklkID0gbWFwW21lbWJlci5lbmNsb3NpbmdDbGFzc11bbWVtYmVyLm5hbWVdOworICAgIGlmIChtZW1iZXJJZCA9PSBudWxsKSB7CisgICAgICBhc3NlcnR4KG1lbWJlciBpcyBQcm9jZWR1cmUgJiYKKyAgICAgICAgICAoKGlkZW50aWNhbChtYXAsIF9nZXR0ZXJNZW1iZXJJZHMpICYmCisgICAgICAgICAgICAgICAgICAobWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5PcGVyYXRvciB8fAorICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5raW5kID09IFByb2NlZHVyZUtpbmQuU2V0dGVyKSkgfHwKKyAgICAgICAgICAgICAgaWRlbnRpY2FsKG1hcCwgX21ldGhvZE9yU2V0dGVyTWVtYmVySWRzKSAmJgorICAgICAgICAgICAgICAgICAgbWVtYmVyLmtpbmQgPT0gUHJvY2VkdXJlS2luZC5HZXR0ZXIpKTsKKyAgICAgIHJldHVybiBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEua0ludmFsaWRTZWxlY3RvcklkOworICAgIH0KKyAgICBtZW1iZXJJZCA9IF91bmlvbkZpbmQuZmluZChtZW1iZXJJZCk7CisgICAgaW50IHNlbGVjdG9ySWQgPSBfc2VsZWN0b3JJZEZvck1lbWJlcklkW21lbWJlcklkXTsKKyAgICBpZiAoc2VsZWN0b3JJZCA9PSBudWxsKSB7CisgICAgICBfc2VsZWN0b3JJZEZvck1lbWJlcklkW21lbWJlcklkXSA9IHNlbGVjdG9ySWQgPSBtZXRhZGF0YS5hZGRTZWxlY3RvcigpOworICAgIH0KKyAgICByZXR1cm4gc2VsZWN0b3JJZDsKICAgfQogCiAgIGludCBtZXRob2RPclNldHRlclNlbGVjdG9ySWQoTWVtYmVyIG1lbWJlcikgewotICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7Ci0gICAgICBzd2l0Y2ggKG1lbWJlci5raW5kKSB7Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5PcGVyYXRvcjoKLSAgICAgICAgICByZXR1cm4gX3NlbGVjdG9ySWRGb3JNYXAoX21ldGhvZFNlbGVjdG9ySWQsIG1lbWJlcik7Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6Ci0gICAgICAgICAgcmV0dXJuIF9zZWxlY3RvcklkRm9yTWFwKF9zZXR0ZXJTZWxlY3RvcklkLCBtZW1iZXIpOwotICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuR2V0dGVyOgotICAgICAgICAgIHJldHVybiBQcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEua0ludmFsaWRTZWxlY3RvcklkOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHByb2NlZHVyZSBraW5kICcke21lbWJlci5raW5kfSciOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobWVtYmVyIGlzIEZpZWxkKSB7Ci0gICAgICByZXR1cm4gX3NlbGVjdG9ySWRGb3JNYXAoX3NldHRlclNlbGVjdG9ySWQsIG1lbWJlcik7Ci0gICAgfQotICAgIHRocm93ICJVbmV4cGVjdGVkIG1lbWJlciBraW5kICcke21lbWJlci5ydW50aW1lVHlwZX0nIjsKKyAgICByZXR1cm4gX3NlbGVjdG9ySWRGb3JNYXAoX21ldGhvZE9yU2V0dGVyTWVtYmVySWRzLCBtZW1iZXIpOwogICB9CiAKICAgaW50IGdldHRlclNlbGVjdG9ySWQoTWVtYmVyIG1lbWJlcikgewotICAgIGlmIChtZW1iZXIgaXMgUHJvY2VkdXJlKSB7Ci0gICAgICBzd2l0Y2ggKG1lbWJlci5raW5kKSB7Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5HZXR0ZXI6Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5NZXRob2Q6Ci0gICAgICAgICAgcmV0dXJuIF9zZWxlY3RvcklkRm9yTWFwKF9nZXR0ZXJTZWxlY3RvcklkLCBtZW1iZXIpOwotICAgICAgICBjYXNlIFByb2NlZHVyZUtpbmQuT3BlcmF0b3I6Ci0gICAgICAgIGNhc2UgUHJvY2VkdXJlS2luZC5TZXR0ZXI6Ci0gICAgICAgICAgcmV0dXJuIFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YS5rSW52YWxpZFNlbGVjdG9ySWQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgcHJvY2VkdXJlIGtpbmQgJyR7bWVtYmVyLmtpbmR9JyI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtZW1iZXIgaXMgRmllbGQpIHsKLSAgICAgIHJldHVybiBfc2VsZWN0b3JJZEZvck1hcChfZ2V0dGVyU2VsZWN0b3JJZCwgbWVtYmVyKTsKLSAgICB9Ci0gICAgdGhyb3cgIlVuZXhwZWN0ZWQgbWVtYmVyIGtpbmQgJyR7bWVtYmVyLnJ1bnRpbWVUeXBlfSciOworICAgIHJldHVybiBfc2VsZWN0b3JJZEZvck1hcChfZ2V0dGVyTWVtYmVySWRzLCBtZW1iZXIpOwogICB9CiAKICAgdm9pZCByZWdpc3Rlck1ldGhvZE9yU2V0dGVyQ2FsbChNZW1iZXIgbWVtYmVyLCBib29sIGNhbGxlZE9uTnVsbCkgewpkaWZmIC0tZ2l0IGEvcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyLmRhcnQgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydAppbmRleCBjZTdmMDZlLi4wNTA5NjQ0IDEwMDY0NAotLS0gYS9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydAorKysgYi9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIuZGFydApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgIF9wcm9jZWR1cmVBdHRyaWJ1dGVzTWV0YWRhdGEgPQogICAgICAgICAgICAgbmV3IFByb2NlZHVyZUF0dHJpYnV0ZXNNZXRhZGF0YVJlcG9zaXRvcnkoKSwKICAgICAgICAgX3RhYmxlU2VsZWN0b3JNZXRhZGF0YSA9IG5ldyBUYWJsZVNlbGVjdG9yTWV0YWRhdGFSZXBvc2l0b3J5KCksCi0gICAgICAgIF90YWJsZVNlbGVjdG9yQXNzaWduZXIgPSBuZXcgVGFibGVTZWxlY3RvckFzc2lnbmVyKCksCisgICAgICAgIF90YWJsZVNlbGVjdG9yQXNzaWduZXIgPSBuZXcgVGFibGVTZWxlY3RvckFzc2lnbmVyKGNvbXBvbmVudCksCiAgICAgICAgIF91bmJveGluZ0luZm9NZXRhZGF0YSA9IG5ldyBVbmJveGluZ0luZm9NZXRhZGF0YVJlcG9zaXRvcnkoKSwKICAgICAgICAgX2ludENsYXNzID0gX3R5cGVGbG93QW5hbHlzaXMuZW52aXJvbm1lbnQuY29yZVR5cGVzLmludENsYXNzIHsKICAgICBjb21wb25lbnQuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KF9pbmZlcnJlZFR5cGVNZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9wa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdXRpbHMuZGFydCBiL3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy91dGlscy5kYXJ0CmluZGV4IDBkNjhiMzUuLmI3Y2ViZDcgMTAwNjQ0Ci0tLSBhL3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy91dGlscy5kYXJ0CisrKyBiL3BrZy92bS9saWIvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy91dGlscy5kYXJ0CkBAIC0yNjEsNiArMjYxLDQ4IEBACiAgIHJldHVybiBsaXN0Lmxlbmd0aDsKIH0KIAorLy8vIEEgVW5pb24tRmluZCBkYXRhIHN0cnVjdHVyZSBvdmVyIGludGVnZXJzLgorY2xhc3MgVW5pb25GaW5kIHsKKyAgLy8gTmVnYXRpdmUgd2VpZ2h0IGlmIHJvb3QsIHBhcmVudCBpbmRleCBvdGhlcndpc2UuCisgIGZpbmFsIExpc3Q8aW50PiBfZWxlbWVudHM7CisKKyAgVW5pb25GaW5kKFtpbnQgaW5pdGlhbFNpemUgPSAwXSkKKyAgICAgIDogX2VsZW1lbnRzID0gTGlzdDxpbnQ+LmZpbGxlZChpbml0aWFsU2l6ZSwgLTEsIGdyb3dhYmxlOiB0cnVlKTsKKworICAvLy8gQWRkIGEgbmV3IHNpbmdsZXRvbiBzZXQuCisgIGludCBhZGQoKSB7CisgICAgaW50IGlkID0gX2VsZW1lbnRzLmxlbmd0aDsKKyAgICBfZWxlbWVudHMuYWRkKC0xKTsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICAvLy8gRmluZCB0aGUgY2Fub25pY2FsIGVsZW1lbnQgZm9yIHRoZSBzZXQgY29udGFpbmluZyB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAgLy8vIFR3byBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgc2V0IGhhdmUgdGhlIHNhbWUgY2Fub25pY2FsIGVsZW1lbnQuCisgIGludCBmaW5kKGludCBpZCkgeworICAgIHJldHVybiBfZWxlbWVudHNbaWRdIDwgMCA/IGlkIDogX2VsZW1lbnRzW2lkXSA9IGZpbmQoX2VsZW1lbnRzW2lkXSk7CisgIH0KKworICAvLy8gTWVyZ2UgdGhlIHNldHMgY29udGFpbmluZyB0aGUgZ2l2ZW4gZWxlbWVudHMuCisgIHZvaWQgdW5pb24oaW50IGlkMSwgaW50IGlkMikgeworICAgIGlkMSA9IGZpbmQoaWQxKTsKKyAgICBpZDIgPSBmaW5kKGlkMik7CisgICAgaWYgKGlkMSA9PSBpZDIpIHJldHVybjsKKyAgICBmaW5hbCBpbnQgdzEgPSBfZWxlbWVudHNbaWQxXTsKKyAgICBmaW5hbCBpbnQgdzIgPSBfZWxlbWVudHNbaWQyXTsKKyAgICBhc3NlcnR4KHcxIDwgMCAmJiB3MiA8IDApOworICAgIGlmICh3MSA8IHcyKSB7CisgICAgICBfZWxlbWVudHNbaWQxXSArPSB3MjsKKyAgICAgIF9lbGVtZW50c1tpZDJdID0gaWQxOworICAgIH0gZWxzZSB7CisgICAgICBfZWxlbWVudHNbaWQyXSArPSB3MTsKKyAgICAgIF9lbGVtZW50c1tpZDFdID0gaWQyOworICAgIH0KKyAgfQorCisgIC8vLyBUb3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldHMuCisgIGludCBnZXQgc2l6ZSA9PiBfZWxlbWVudHMubGVuZ3RoOworfQorCiBjb25zdCBudWxsYWJpbGl0eVN1ZmZpeCA9IHsKICAgTnVsbGFiaWxpdHkubGVnYWN5OiAnKicsCiAgIE51bGxhYmlsaXR5Lm51bGxhYmxlOiAnPycsCmRpZmYgLS1naXQgYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX2ZpZWxkX2luaXRpYWxpemVyLmRhcnQuZXhwZWN0IGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL2ludmFsaWRhdGlvbl9maWVsZF9pbml0aWFsaXplci5kYXJ0LmV4cGVjdAppbmRleCBkMTE2ODhhLi4yNzM5YTRkIDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX2ZpZWxkX2luaXRpYWxpemVyLmRhcnQuZXhwZWN0CisrKyBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9pbnZhbGlkYXRpb25fZmllbGRfaW5pdGlhbGl6ZXIuZGFydC5leHBlY3QKQEAgLTUyLDEzICs1MiwxMyBAQAogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkRlZXBDYWxsZXIyKgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MyxnZXR0ZXJTZWxlY3RvcklkOjRdICBtZXRob2QgYmFyTDEoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkRdIHNlbGY6OkQqIGRkKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxMyxnZXR0ZXJTZWxlY3RvcklkOjE0XSAgbWV0aG9kIGJhckwxKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpEXSBzZWxmOjpEKiBkZCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpEZWVwQ2FsbGVyMi5iYXJMMl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSEgKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpEZWVwQ2FsbGVyMjo6YmFyTDJ9KGRkKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NSxnZXR0ZXJTZWxlY3RvcklkOjZdICBtZXRob2QgYmFyTDIoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkRdIHNlbGY6OkQqIGRkKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxNSxnZXR0ZXJTZWxlY3RvcklkOjE2XSAgbWV0aG9kIGJhckwyKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpEXSBzZWxmOjpEKiBkZCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpEZWVwQ2FsbGVyMi5iYXJMM10gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSEgKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpEZWVwQ2FsbGVyMjo6YmFyTDN9KGRkKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NyxnZXR0ZXJTZWxlY3RvcklkOjhdICBtZXRob2QgYmFyTDMoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkRdIHNlbGY6OkQqIGRkKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxNyxnZXR0ZXJTZWxlY3RvcklkOjE4XSAgbWV0aG9kIGJhckwzKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpEXSBzZWxmOjpEKiBkZCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpEZWVwQ2FsbGVyMi5iYXJMNF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSEgKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpEZWVwQ2FsbGVyMjo6YmFyTDR9KGRkKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OSxnZXR0ZXJTZWxlY3RvcklkOjEwXSAgbWV0aG9kIGJhckw0KFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpEXSBzZWxmOjpEKiBkZCkg4oaSIGR5bmFtaWMKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTksZ2V0dGVyU2VsZWN0b3JJZDoyMF0gIG1ldGhvZCBiYXJMNChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6RF0gc2VsZjo6RCogZGQpIOKGkiBkeW5hbWljCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6RC5maWVsZDJdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hXSBkZC57c2VsZjo6RDo6ZmllbGQyfTsKIH0KIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ok51bGw/ICh2YWx1ZTogbnVsbCldc3RhdGljIGZpZWxkIGNvcmU6OkZ1bmN0aW9uKiB1bmtub3duOwpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL2ludmFsaWRhdGlvbl9uZXdfZHluYW1pY190YXJnZXQuZGFydC5leHBlY3QgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX25ld19keW5hbWljX3RhcmdldC5kYXJ0LmV4cGVjdAppbmRleCBjODZkZTZlLi45ZGIyOGIzIDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX25ld19keW5hbWljX3RhcmdldC5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX25ld19keW5hbWljX3RhcmdldC5kYXJ0LmV4cGVjdApAQCAtMzIsMTEgKzMyLDExIEBACiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QioKICAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKICAgICA7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxLGdldHRlclNlbGVjdG9ySWQ6Ml0gIG1ldGhvZCBmb28oKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1nZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NyxnZXR0ZXJTZWxlY3RvcklkOjhdICBtZXRob2QgZm9vKCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gbmV3IHNlbGY6OlQxOjrigKIoKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjMsZ2V0dGVyU2VsZWN0b3JJZDo0XSAgbWV0aG9kIGJhcigpIOKGkiBkeW5hbWljCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo5LGdldHRlclNlbGVjdG9ySWQ6MTBdICBtZXRob2QgYmFyKCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gbmV3IHNlbGY6OlQyOjrigKIoKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgbWV0aG9kIGJhenooKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1nZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTEsZ2V0dGVyU2VsZWN0b3JJZDoxMl0gIG1ldGhvZCBiYXp6KCkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gbmV3IHNlbGY6OlQzOjrigKIoKTsKIH0KIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ok51bGw/ICh2YWx1ZTogbnVsbCldc3RhdGljIGZpZWxkIGNvcmU6OkZ1bmN0aW9uKiB1bmtub3duOwpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL2ludmFsaWRhdGlvbl9zZXRfZmllbGQuZGFydC5leHBlY3QgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX3NldF9maWVsZC5kYXJ0LmV4cGVjdAppbmRleCAwMzNlODIyLi42NDY1NWFlIDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX3NldF9maWVsZC5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvaW52YWxpZGF0aW9uX3NldF9maWVsZC5kYXJ0LmV4cGVjdApAQCAtMzYsMTMgKzM2LDEzIEBACiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6RGVlcENhbGxlcjIqCiAgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCiAgICAgOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo1LGdldHRlclNlbGVjdG9ySWQ6Nl0gIG1ldGhvZCBiYXJMMShbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6QT9dIHNlbGY6OkEqIGFhKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxMyxnZXR0ZXJTZWxlY3RvcklkOjE0XSAgbWV0aG9kIGJhckwxKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpBP10gc2VsZjo6QSogYWEpIOKGkiBkeW5hbWljCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6RGVlcENhbGxlcjIuYmFyTDJdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hIChza2lwIGNoZWNrKV0gdGhpcy57c2VsZjo6RGVlcENhbGxlcjI6OmJhckwyfShhYSk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjcsZ2V0dGVyU2VsZWN0b3JJZDo4XSAgbWV0aG9kIGJhckwyKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpBP10gc2VsZjo6QSogYWEpIOKGkiBkeW5hbWljCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjE1LGdldHRlclNlbGVjdG9ySWQ6MTZdICBtZXRob2QgYmFyTDIoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkE/XSBzZWxmOjpBKiBhYSkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpEZWVwQ2FsbGVyMi5iYXJMM10gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSEgKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpEZWVwQ2FsbGVyMjo6YmFyTDN9KGFhKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OSxnZXR0ZXJTZWxlY3RvcklkOjEwXSAgbWV0aG9kIGJhckwzKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpBP10gc2VsZjo6QSogYWEpIOKGkiBkeW5hbWljCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjE3LGdldHRlclNlbGVjdG9ySWQ6MThdICBtZXRob2QgYmFyTDMoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkE/XSBzZWxmOjpBKiBhYSkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpEZWVwQ2FsbGVyMi5iYXJMNF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSEgKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpEZWVwQ2FsbGVyMjo6YmFyTDR9KGFhKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTEsZ2V0dGVyU2VsZWN0b3JJZDoxMl0gIG1ldGhvZCBiYXJMNChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6QT9dIHNlbGY6OkEqIGFhKSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxOSxnZXR0ZXJTZWxlY3RvcklkOjIwXSAgbWV0aG9kIGJhckw0KFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpBP10gc2VsZjo6QSogYWEpIOKGkiBkeW5hbWljCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6QS5maWVsZDI/P10gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSFdIGFhLntzZWxmOjpBOjpmaWVsZDJ9OwogfQogW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6TnVsbD8gKHZhbHVlOiBudWxsKV1zdGF0aWMgZmllbGQgY29yZTo6RnVuY3Rpb24qIHVua25vd247CmRpZmYgLS1naXQgYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvbm9fc3VjaF9tZXRob2QuZGFydC5leHBlY3QgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvbm9fc3VjaF9tZXRob2QuZGFydC5leHBlY3QKaW5kZXggMmI1Nzg4NS4uNWU1ZTU1MCAxMDA2NDQKLS0tIGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL25vX3N1Y2hfbWV0aG9kLmRhcnQuZXhwZWN0CisrKyBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9ub19zdWNoX21ldGhvZC5kYXJ0LmV4cGVjdApAQCAtMTA0LDcgKzEwNCw3IEBACiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6SCoKICAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKICAgICA7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxLGdldHRlclNlbGVjdG9ySWQ6Ml0gIG1ldGhvZCBmb28oe1tAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWkgKHZhbHVlOiAxKV0gZHluYW1pYyBsZWZ0ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pICh2YWx1ZTogMildIGR5bmFtaWMgcmlnaHQgPSAjQzF9KSDihpIgZHluYW1pYworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1nZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OCxnZXR0ZXJTZWxlY3RvcklkOjldICBtZXRob2QgZm9vKHtbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pICh2YWx1ZTogMSldIGR5bmFtaWMgbGVmdCA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaSAodmFsdWU6IDIpXSBkeW5hbWljIHJpZ2h0ID0gI0MxfSkg4oaSIGR5bmFtaWMKICAgICByZXR1cm4gbmV3IHNlbGY6OlQ2OjrigKIoKTsKIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NixnZXR0ZXJTZWxlY3RvcklkOjddICBtZXRob2Qgbm9TdWNoTWV0aG9kKGNvcmU6Okludm9jYXRpb24qIGludm9jYXRpb24pIOKGkiBkeW5hbWljIHsKICAgICByZXR1cm4gbmV3IHNlbGY6OlQ3OjrigKIoKTsKZGlmZiAtLWdpdCBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9jcmVhdGVfdGVzdC5kYXJ0LmV4cGVjdCBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9jcmVhdGVfdGVzdC5kYXJ0LmV4cGVjdAppbmRleCBmMjNmNWY2Li44NDU5NWE2IDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvcHJvdG9idWZfaGFuZGxlci9saWIvY3JlYXRlX3Rlc3QuZGFydC5leHBlY3QKKysrIGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3Byb3RvYnVmX2hhbmRsZXIvbGliL2NyZWF0ZV90ZXN0LmRhcnQuZXhwZWN0CkBAIC01NSwyMCArNTUsMjAgQEAKICAgQCNDMTAKICAgc3RhdGljIG1ldGhvZCBjcmVhdGUoKSDihpIgc2VsZjo6Rm9vS2VlcCoKICAgICByZXR1cm4gbmV3IHNlbGY6OkZvb0tlZXA6Ol8oKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxnZXR0ZXJTZWxlY3RvcklkOjRdICBAI0MxMgorW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo0LGdldHRlclNlbGVjdG9ySWQ6NV0gIEAjQzEyCiAgIGdldCBiYXJLZWVwKCkg4oaSIHNlbGY6OkJhcktlZXAqCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9nZXROXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9Zm9vLnBiLmRhcnQ6OkJhcktlZXA/IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX2dldE59PHNlbGY6OkJhcktlZXAqPigwKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NV0gIEAjQzEyCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjQsZ2V0dGVyU2VsZWN0b3JJZDo1XSAgQCNDMTIKICAgc2V0IGJhcktlZXAoW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWZvby5wYi5kYXJ0OjpCYXJLZWVwXSBzZWxmOjpCYXJLZWVwKiB2KSDihpIgdm9pZCB7CiAgICAgW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1wcm90b2J1Zjo6R2VuZXJhdGVkTWVzc2FnZS5zZXRGaWVsZF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjpzZXRGaWVsZH0oMSwgdik7CiAgIH0KIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxnZXR0ZXJTZWxlY3RvcklkOjZdICBAI0MxNAogICBnZXQgbWFwS2VlcCgpIOKGkiBjb3JlOjpNYXA8Y29yZTo6U3RyaW5nKiwgc2VsZjo6QmFyS2VlcCo+KgogICAgIHJldHVybiBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLiRfZ2V0TWFwXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ISAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9nZXRNYXB9PGNvcmU6OlN0cmluZyosIHNlbGY6OkJhcktlZXAqPigyKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxnZXR0ZXJTZWxlY3RvcklkOjddICBAI0MxNgorW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo3LGdldHRlclNlbGVjdG9ySWQ6OF0gIEAjQzE2CiAgIGdldCBhS2VlcCgpIOKGkiBjb3JlOjppbnQqCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9nZXRJWl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWludCAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9nZXRJWn0oNCk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjhdICBAI0MxNgorW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo3LGdldHRlclNlbGVjdG9ySWQ6OF0gIEAjQzE2CiAgIHNldCBhS2VlcChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pICh2YWx1ZTogNDMpXSBjb3JlOjppbnQqIHYpIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLiRfc2V0U2lnbmVkSW50MzJdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hPyAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9zZXRTaWduZWRJbnQzMn0oNCwgdik7CiAgIH0KQEAgLTk1LDEwICs5NSwxMCBAQAogICBAI0MxMAogICBzdGF0aWMgbWV0aG9kIGNyZWF0ZSgpIOKGkiBzZWxmOjpCYXJLZWVwKgogICAgIHJldHVybiBuZXcgc2VsZjo6QmFyS2VlcDo6XygpOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6N10gIEAjQzEyCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjEzLGdldHRlclNlbGVjdG9ySWQ6MTRdICBAI0MxMgogICBnZXQgYUtlZXAoKSDihpIgY29yZTo6aW50KgogICAgIHJldHVybiBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLiRfZ2V0SVpdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1pbnQgKHNraXAgY2hlY2spXSB0aGlzLntwcm86OkdlbmVyYXRlZE1lc3NhZ2U6OiRfZ2V0SVp9KDApOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo4XSAgQCNDMTIKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTMsZ2V0dGVyU2VsZWN0b3JJZDoxNF0gIEAjQzEyCiAgIHNldCBhS2VlcChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pXSBjb3JlOjppbnQqIHYpIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLiRfc2V0U2lnbmVkSW50MzJdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hPyAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9zZXRTaWduZWRJbnQzMn0oMCwgdik7CiAgIH0KZGlmZiAtLWdpdCBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9kZWNvZGVfdGVzdC5kYXJ0LmV4cGVjdCBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9kZWNvZGVfdGVzdC5kYXJ0LmV4cGVjdAppbmRleCA2ZmZlNTIyLi43NzI3NTEyIDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvcHJvdG9idWZfaGFuZGxlci9saWIvZGVjb2RlX3Rlc3QuZGFydC5leHBlY3QKKysrIGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3Byb3RvYnVmX2hhbmRsZXIvbGliL2RlY29kZV90ZXN0LmRhcnQuZXhwZWN0CkBAIC05Miw3ICs5Miw3IEBACiAgIEAjQzExCiAgIHN0YXRpYyBtZXRob2QgY3JlYXRlKCkg4oaSIHNlbGY6OkJhcktlZXAqCiAgICAgcmV0dXJuIG5ldyBzZWxmOjpCYXJLZWVwOjpfKCk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsZ2V0dGVyU2VsZWN0b3JJZDo3XSAgQCNDMTMKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxnZXR0ZXJTZWxlY3RvcklkOjEyXSAgQCNDMTMKICAgZ2V0IGFLZWVwKCkg4oaSIGNvcmU6OmludCoKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1wcm90b2J1Zjo6R2VuZXJhdGVkTWVzc2FnZS4kX2dldElaXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9aW50IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX2dldElafSgwKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9lbmNvZGVfYWxsX2ZpZWxkcy5kYXJ0LmV4cGVjdCBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9lbmNvZGVfYWxsX2ZpZWxkcy5kYXJ0LmV4cGVjdAppbmRleCA1YWM5ZTUxLi4yYWNkNmU5IDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvcHJvdG9idWZfaGFuZGxlci9saWIvZW5jb2RlX2FsbF9maWVsZHMuZGFydC5leHBlY3QKKysrIGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3Byb3RvYnVmX2hhbmRsZXIvbGliL2VuY29kZV9hbGxfZmllbGRzLmRhcnQuZXhwZWN0CkBAIC0xMDEsMTEgKzEwMSwxMSBAQAogICBAI0MxMQogICBzdGF0aWMgbWV0aG9kIGNyZWF0ZSgpIOKGkiBzZWxmOjpCYXJLZWVwKgogICAgIHJldHVybiBuZXcgc2VsZjo6QmFyS2VlcDo6XygpOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo2XSAgQCNDMTMKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OV0gIEAjQzEzCiAgIHNldCBhS2VlcChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pXSBjb3JlOjppbnQqIHYpIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLiRfc2V0U2lnbmVkSW50MzJdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hPyAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9zZXRTaWduZWRJbnQzMn0oMCwgdik7CiAgIH0KLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OV0gIEAjQzI1CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjEwXSAgQCNDMjUKICAgc2V0IGJEcm9wKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWkgKHZhbHVlOiA0KV0gY29yZTo6aW50KiB2KSDihpIgdm9pZCB7CiAgICAgW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1wcm90b2J1Zjo6R2VuZXJhdGVkTWVzc2FnZS4kX3NldFNpZ25lZEludDMyXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9IT8gKHNraXAgY2hlY2spXSB0aGlzLntwcm86OkdlbmVyYXRlZE1lc3NhZ2U6OiRfc2V0U2lnbmVkSW50MzJ9KDEsIHYpOwogICB9CkBAIC0xNTcsNyArMTU3LDcgQEAKICAgQCNDMTEKICAgc3RhdGljIG1ldGhvZCBjcmVhdGUoKSDihpIgc2VsZjo6Wm9wRHJvcCoKICAgICByZXR1cm4gbmV3IHNlbGY6OlpvcERyb3A6Ol8oKTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTBdICBAI0MxMworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxMV0gIEAjQzEzCiAgIHNldCBhRHJvcChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pICh2YWx1ZTogMyldIGNvcmU6OmludCogdikg4oaSIHZvaWQgewogICAgIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9zZXRTaWduZWRJbnQzMl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX3NldFNpZ25lZEludDMyfSgwLCB2KTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3Byb3RvYnVmX2hhbmRsZXIvbGliL2ZyZWV6ZV90ZXN0LmRhcnQuZXhwZWN0IGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3Byb3RvYnVmX2hhbmRsZXIvbGliL2ZyZWV6ZV90ZXN0LmRhcnQuZXhwZWN0CmluZGV4IGVkMjQwMzYuLjc2OGExNTQgMTAwNjQ0Ci0tLSBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9wcm90b2J1Zl9oYW5kbGVyL2xpYi9mcmVlemVfdGVzdC5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvcHJvdG9idWZfaGFuZGxlci9saWIvZnJlZXplX3Rlc3QuZGFydC5leHBlY3QKQEAgLTU5LDIwICs1OSwyMCBAQAogICBAI0MxMAogICBzdGF0aWMgbWV0aG9kIGNyZWF0ZSgpIOKGkiBzZWxmOjpGb29LZWVwKgogICAgIHJldHVybiBuZXcgc2VsZjo6Rm9vS2VlcDo6XygpOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6NF0gIEAjQzEyCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjQsZ2V0dGVyU2VsZWN0b3JJZDo1XSAgQCNDMTIKICAgZ2V0IGJhcktlZXAoKSDihpIgc2VsZjo6QmFyS2VlcCoKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1wcm90b2J1Zjo6R2VuZXJhdGVkTWVzc2FnZS4kX2dldE5dIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1mb28ucGIuZGFydDo6QmFyS2VlcD8gKHNraXAgY2hlY2spXSB0aGlzLntwcm86OkdlbmVyYXRlZE1lc3NhZ2U6OiRfZ2V0Tn08c2VsZjo6QmFyS2VlcCo+KDApOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo1XSAgQCNDMTIKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NCxnZXR0ZXJTZWxlY3RvcklkOjVdICBAI0MxMgogICBzZXQgYmFyS2VlcChbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9Zm9vLnBiLmRhcnQ6OkJhcktlZXBdIHNlbGY6OkJhcktlZXAqIHYpIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPXByb3RvYnVmOjpHZW5lcmF0ZWRNZXNzYWdlLnNldEZpZWxkXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9IT8gKHNraXAgY2hlY2spXSB0aGlzLntwcm86OkdlbmVyYXRlZE1lc3NhZ2U6OnNldEZpZWxkfSgxLCB2KTsKICAgfQogW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6Nl0gIEAjQzE0CiAgIGdldCBtYXBLZWVwKCkg4oaSIGNvcmU6Ok1hcDxjb3JlOjpTdHJpbmcqLCBzZWxmOjpCYXJLZWVwKj4qCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9nZXRNYXBdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hIChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX2dldE1hcH08Y29yZTo6U3RyaW5nKiwgc2VsZjo6QmFyS2VlcCo+KDIpOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6N10gIEAjQzE2CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjcsZ2V0dGVyU2VsZWN0b3JJZDo4XSAgQCNDMTYKICAgZ2V0IGFLZWVwKCkg4oaSIGNvcmU6OmludCoKICAgICByZXR1cm4gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1wcm90b2J1Zjo6R2VuZXJhdGVkTWVzc2FnZS4kX2dldElaXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9aW50IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX2dldElafSg0KTsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6OF0gIEAjQzE2CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjcsZ2V0dGVyU2VsZWN0b3JJZDo4XSAgQCNDMTYKICAgc2V0IGFLZWVwKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWkgKHZhbHVlOiA0MyldIGNvcmU6OmludCogdikg4oaSIHZvaWQgewogICAgIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9zZXRTaWduZWRJbnQzMl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX3NldFNpZ25lZEludDMyfSg0LCB2KTsKICAgfQpAQCAtOTksMTAgKzk5LDEwIEBACiAgIEAjQzEwCiAgIHN0YXRpYyBtZXRob2QgY3JlYXRlKCkg4oaSIHNlbGY6OkJhcktlZXAqCiAgICAgcmV0dXJuIG5ldyBzZWxmOjpCYXJLZWVwOjpfKCk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsZ2V0dGVyU2VsZWN0b3JJZDo3XSAgQCNDMTIKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTMsZ2V0dGVyU2VsZWN0b3JJZDoxNF0gIEAjQzEyCiAgIGdldCBhS2VlcCgpIOKGkiBjb3JlOjppbnQqCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9nZXRJWl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWludCAoc2tpcCBjaGVjayldIHRoaXMue3Bybzo6R2VuZXJhdGVkTWVzc2FnZTo6JF9nZXRJWn0oMCk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjhdICBAI0MxMgorW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxMyxnZXR0ZXJTZWxlY3RvcklkOjE0XSAgQCNDMTIKICAgc2V0IGFLZWVwKFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWldIGNvcmU6OmludCogdikg4oaSIHZvaWQgewogICAgIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9cHJvdG9idWY6OkdlbmVyYXRlZE1lc3NhZ2UuJF9zZXRTaWduZWRJbnQzMl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57cHJvOjpHZW5lcmF0ZWRNZXNzYWdlOjokX3NldFNpZ25lZEludDMyfSgwLCB2KTsKICAgfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3JlZ3Jlc3NfZmx1dHRlcjE2MTgyLmRhcnQuZXhwZWN0IGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3JlZ3Jlc3NfZmx1dHRlcjE2MTgyLmRhcnQuZXhwZWN0CmluZGV4IGZmMDcyY2IuLjhiMzI5MTMgMTAwNjQ0Ci0tLSBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9yZWdyZXNzX2ZsdXR0ZXIxNjE4Mi5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvcmVncmVzc19mbHV0dGVyMTYxODIuZGFydC5leHBlY3QKQEAgLTM4LDI3ICszOCwyNyBAQAogICB9CiB9CiBjbGFzcyBBMiBleHRlbmRzIGNvcmU6Ok9iamVjdCB7Ci1bQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6VDI/XSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgZmllbGQgZHluYW1pYyBmb28gPSBudWxsOworW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQyP10gW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxMyxnZXR0ZXJTZWxlY3RvcklkOjE0XSAgZmllbGQgZHluYW1pYyBmb28gPSBudWxsOwogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkEyKgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjMsZ2V0dGVyU2VsZWN0b3JJZDo0XSAgbWV0aG9kIGNhbGwoW2R5bmFtaWMgYTEgPSAjQzEsIGR5bmFtaWMgYTIgPSAjQzEsIGR5bmFtaWMgYTMgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE0ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNSA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQyP10gZHluYW1pYyBhNiA9ICNDMV0pIOKGkiB2b2lkIHsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjExLGdldHRlclNlbGVjdG9ySWQ6MTJdICBtZXRob2QgY2FsbChbZHluYW1pYyBhMSA9ICNDMSwgZHluYW1pYyBhMiA9ICNDMSwgZHluYW1pYyBhMyA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaT9dIGR5bmFtaWMgYTQgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE1ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6VDI/XSBkeW5hbWljIGE2ID0gI0MxXSkg4oaSIHZvaWQgewogICAgIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6QTIuZm9vXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9IT8gKHNraXAgY2hlY2spXSB0aGlzLntzZWxmOjpBMjo6Zm9vfSA9IGE2OwogICB9CiB9CiBhYnN0cmFjdCBjbGFzcyBCMkJhc2UgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkEyXSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjEyLGdldHRlclNlbGVjdG9ySWQ6MTNdICBmaWVsZCBkeW5hbWljIF9hYSA9IG5ldyBzZWxmOjpBMjo64oCiKCk7CitbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6QTJdIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MTYsZ2V0dGVyU2VsZWN0b3JJZDoxN10gIGZpZWxkIGR5bmFtaWMgX2FhID0gbmV3IHNlbGY6OkEyOjrigKIoKTsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCMkJhc2UqCiAgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCiAgICAgOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6MTFdICBnZXQgYWEyKCkg4oaSIGR5bmFtaWMKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxnZXR0ZXJTZWxlY3RvcklkOjE1XSAgZ2V0IGFhMigpIOKGkiBkeW5hbWljCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6QjJCYXNlLl9hYV0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkEyXSB0aGlzLntzZWxmOjpCMkJhc2U6Ol9hYX07CiB9CiBjbGFzcyBCMiBleHRlbmRzIHNlbGY6OkIyQmFzZSB7CiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QjIqCiAgICAgOiBzdXBlciBzZWxmOjpCMkJhc2U6OuKAoigpCiAgICAgOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxNCxnZXR0ZXJTZWxlY3RvcklkOjE1XSAgbWV0aG9kIGRvU3VwZXJDYWxsKCkg4oaSIHZvaWQgeworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxOCxnZXR0ZXJTZWxlY3RvcklkOjE5XSAgbWV0aG9kIGRvU3VwZXJDYWxsKCkg4oaSIHZvaWQgewogICAgIFtAdm0uY2FsbC1zaXRlLWF0dHJpYnV0ZXMubWV0YWRhdGE9cmVjZWl2ZXJUeXBlOmR5bmFtaWNdIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6QTIuY2FsbF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChyZWNlaXZlciBub3QgaW50KV0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkEyXSBzdXBlci57c2VsZjo6QjJCYXNlOjphYTJ9LmNhbGwoMSwgMiwgMywgNCwgNSwgbmV3IHNlbGY6OlQyOjrigKIoKSk7CiAgIH0KIH0KQEAgLTY2LDIxICs2NiwyMSBAQAogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OlQzKgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjE2LGdldHRlclNlbGVjdG9ySWQ6MTddICBtZXRob2QgZG9UZXN0MygpIOKGkiB2b2lkIHsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjIwLGdldHRlclNlbGVjdG9ySWQ6MjFdICBtZXRob2QgZG9UZXN0MygpIOKGkiB2b2lkIHsKICAgICBzZWxmOjpvayA9IHRydWU7CiAgIH0KIH0KIGNsYXNzIEEzIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKLVtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0jbGliOjpUMz9dIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NSxnZXR0ZXJTZWxlY3RvcklkOjZdICBmaWVsZCBkeW5hbWljIGZvbyA9IG51bGw7CitbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6VDM/XSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjI0LGdldHRlclNlbGVjdG9ySWQ6MjVdICBmaWVsZCBkeW5hbWljIGZvbyA9IG51bGw7CiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QTMqCiAgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCiAgICAgOwotW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1nZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MyxnZXR0ZXJTZWxlY3RvcklkOjRdICBtZXRob2QgY2FsbChbZHluYW1pYyBhMSA9ICNDMSwgZHluYW1pYyBhMiA9ICNDMSwgZHluYW1pYyBhMyA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaT9dIGR5bmFtaWMgYTQgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE1ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNiA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQzP10gZHluYW1pYyBhNyA9ICNDMV0pIOKGkiB2b2lkIHsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjIyLGdldHRlclNlbGVjdG9ySWQ6MjNdICBtZXRob2QgY2FsbChbZHluYW1pYyBhMSA9ICNDMSwgZHluYW1pYyBhMiA9ICNDMSwgZHluYW1pYyBhMyA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaT9dIGR5bmFtaWMgYTQgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE1ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNiA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQzP10gZHluYW1pYyBhNyA9ICNDMV0pIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPSNsaWI6OkEzLmZvb10gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57c2VsZjo6QTM6OmZvb30gPSBhNzsKICAgfQogfQogY2xhc3MgQjMgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkEzXSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoxOCxnZXR0ZXJTZWxlY3RvcklkOjE5XSAgZmllbGQgc2VsZjo6QTMqIGFhMyA9IG5ldyBzZWxmOjpBMzo64oCiKCk7CitbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6QTNdIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9aGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjI2LGdldHRlclNlbGVjdG9ySWQ6MjddICBmaWVsZCBzZWxmOjpBMyogYWEzID0gbmV3IHNlbGY6OkEzOjrigKIoKTsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCMyoKICAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKICAgICA7CkBAIC04OSwyNSArODksMjUgQEAKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpUNCoKICAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKICAgICA7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoyMCxnZXR0ZXJTZWxlY3RvcklkOjIxXSAgbWV0aG9kIGRvVGVzdDQoKSDihpIgdm9pZCB7CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDoyOCxnZXR0ZXJTZWxlY3RvcklkOjI5XSAgbWV0aG9kIGRvVGVzdDQoKSDihpIgdm9pZCB7CiAgICAgc2VsZjo6b2sgPSB0cnVlOwogICB9CiB9CiBjbGFzcyBBNCBleHRlbmRzIGNvcmU6Ok9iamVjdCB7Ci1bQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6VDQ/XSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgZmllbGQgZHluYW1pYyBmb28gPSBudWxsOworW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQ0P10gW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDozMixnZXR0ZXJTZWxlY3RvcklkOjMzXSAgZmllbGQgZHluYW1pYyBmb28gPSBudWxsOwogICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkE0KgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9Z2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjMsZ2V0dGVyU2VsZWN0b3JJZDo0XSAgbWV0aG9kIGNhbGwoW2R5bmFtaWMgYTEgPSAjQzEsIGR5bmFtaWMgYTIgPSAjQzEsIGR5bmFtaWMgYTMgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE0ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNSA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaT9dIGR5bmFtaWMgYTYgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE3ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6VDQ/XSBkeW5hbWljIGE4ID0gI0MxXSkg4oaSIHZvaWQgeworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1nZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MzAsZ2V0dGVyU2VsZWN0b3JJZDozMV0gIG1ldGhvZCBjYWxsKFtkeW5hbWljIGExID0gI0MxLCBkeW5hbWljIGEyID0gI0MxLCBkeW5hbWljIGEzID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNCA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6X1NtaT9dIGR5bmFtaWMgYTUgPSAjQzEsIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9TbWk/XSBkeW5hbWljIGE2ID0gI0MxLCBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gZHluYW1pYyBhNyA9ICNDMSwgW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OlQ0P10gZHluYW1pYyBhOCA9ICNDMV0pIOKGkiB2b2lkIHsKICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPSNsaWI6OkE0LmZvb10gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSE/IChza2lwIGNoZWNrKV0gdGhpcy57c2VsZjo6QTQ6OmZvb30gPSBhODsKICAgfQogfQogY2xhc3MgQjQgZXh0ZW5kcyBjb3JlOjpPYmplY3QgewotW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkE0XSBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjEyLGdldHRlclNlbGVjdG9ySWQ6MTNdICBmaWVsZCBkeW5hbWljIF9hYSA9IG5ldyBzZWxmOjpBNDo64oCiKCk7CitbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6QTRdIFtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MzUsZ2V0dGVyU2VsZWN0b3JJZDozNl0gIGZpZWxkIGR5bmFtaWMgX2FhID0gbmV3IHNlbGY6OkE0OjrigKIoKTsKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCNCoKICAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKICAgICA7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPWhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLGdldHRlclNlbGVjdG9ySWQ6MjJdICBnZXQgYWE0KCkg4oaSIGR5bmFtaWMKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9aGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsZ2V0dGVyU2VsZWN0b3JJZDozNF0gIGdldCBhYTQoKSDihpIgZHluYW1pYwogICAgIHJldHVybiBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPSNsaWI6OkI0Ll9hYV0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkE0XSB0aGlzLntzZWxmOjpCNDo6X2FhfTsKIH0KIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6OmJvb2w/XXN0YXRpYyBmaWVsZCBjb3JlOjpib29sKiBvazsKZGlmZiAtLWdpdCBhL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9zZWxlY3Rvcl9pZF9hc3NpZ25tZW50cy5kYXJ0IGIvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3NlbGVjdG9yX2lkX2Fzc2lnbm1lbnRzLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlZTFhZAotLS0gL2Rldi9udWxsCisrKyBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9zZWxlY3Rvcl9pZF9hc3NpZ25tZW50cy5kYXJ0CkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVmFsaWRhdGUgdGhlIHBhcnRpdGlvbmluZyBvZiBtZXRob2RzIGZvciBzZWxlY3RvciBJRCBhc3NpZ25tZW50LgorLy8gVHdvIG1lbWJlcnMgc2hvdWxkIGdldCB0aGUgc2FtZSBzZWxlY3RvciBJRChzKSBpZmYgdGhleSBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vIGFuZCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbnVtYmVyLgorCitjbGFzcyBYIHt9CisKK2NsYXNzIEExIHsKKyAgdm9pZCBmb28oKSB7CisgICAgcHJpbnQoIkExIik7CisgIH0KK30KKworY2xhc3MgQjEgZXh0ZW5kcyBBMSB7fQorCitjbGFzcyBDMSBleHRlbmRzIEIxIHsKKyAgdm9pZCBmb28oKSB7CisgICAgcHJpbnQoIkMxIik7CisgIH0KK30KKworY2xhc3MgQTIgeworICB2b2lkIGZvbygpIHsKKyAgICBwcmludCgiQTIiKTsKKyAgfQorfQorCitjbGFzcyBCMiBleHRlbmRzIEEyIGltcGxlbWVudHMgWCB7CisgIHZvaWQgZm9vKCkgeworICAgIHByaW50KCJCMiIpOworICB9Cit9CisKK2Fic3RyYWN0IGNsYXNzIEEzIHsKKyAgdm9pZCBmb28oKTsKK30KKworY2xhc3MgQjMgZXh0ZW5kcyBBMyBpbXBsZW1lbnRzIFggeworICB2b2lkIGZvbygpIHsKKyAgICBwcmludCgiQjMiKTsKKyAgfQorfQorCitjbGFzcyBDMyBpbXBsZW1lbnRzIEEzIHsKKyAgdm9pZCBmb28oKSB7CisgICAgcHJpbnQoIkMzIik7CisgIH0KK30KKworY2xhc3MgQTQgeworICB2b2lkIGZvbygpIHsKKyAgICBwcmludCgiQTQiKTsKKyAgfQorfQorCitjbGFzcyBCNCB7CisgIHZvaWQgZm9vKCkgeworICAgIHByaW50KCJCNCIpOworICB9Cit9CisKK2NsYXNzIEM0IHsKKyAgdm9pZCBmb28oKSB7CisgICAgcHJpbnQoIkM0Iik7CisgIH0KK30KKworY2xhc3MgRDQgZXh0ZW5kcyBBNCBpbXBsZW1lbnRzIEI0IHsKKyAgdm9pZCBmb28oKSB7CisgICAgcHJpbnQoIkQ0Iik7CisgIH0KK30KKworY2xhc3MgRTQgZXh0ZW5kcyBDNCBpbXBsZW1lbnRzIEI0IHt9CisKK21haW4oKSB7CisgIExpc3Q8QTE+IHgxID0gW0ExKCksIEIxKCksIEMxKCldOworICBmb3IgKEExIG8gaW4geDEpIG8uZm9vKCk7CisgIExpc3Q8QTI+IHgyID0gW0EyKCksIEIyKCldOworICBmb3IgKEEyIG8gaW4geDIpIG8uZm9vKCk7CisgIExpc3Q8QTM+IHgzID0gW0IzKCksIEMzKCldOworICBmb3IgKEEzIG8gaW4geDMpIG8uZm9vKCk7CisgIExpc3Q8QTQ+IHg0ID0gW0E0KCksIEQ0KCldOworICBmb3IgKEE0IG8gaW4geDQpIG8uZm9vKCk7CisgIExpc3Q8QjQ+IHk0ID0gW0I0KCksIEQ0KCksIEU0KCldOworICBmb3IgKEI0IG8gaW4geTQpIG8uZm9vKCk7CisgIExpc3Q8QzQ+IHo0ID0gW0M0KCksIEU0KCldOworICBmb3IgKEM0IG8gaW4gejQpIG8uZm9vKCk7Cit9CmRpZmYgLS1naXQgYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvc2VsZWN0b3JfaWRfYXNzaWdubWVudHMuZGFydC5leHBlY3QgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvc2VsZWN0b3JfaWRfYXNzaWdubWVudHMuZGFydC5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci9zZWxlY3Rvcl9pZF9hc3NpZ25tZW50cy5kYXJ0LmV4cGVjdApAQCAtMCwwICsxLDE1MiBAQAorbGlicmFyeSAjbGliOworaW1wb3J0IHNlbGYgYXMgc2VsZjsKK2ltcG9ydCAiZGFydDpjb3JlIiBhcyBjb3JlOworCithYnN0cmFjdCBjbGFzcyBYIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKK30KK2NsYXNzIEExIGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpBMSoKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjEsZ2V0dGVyU2VsZWN0b3JJZDoyXSAgbWV0aG9kIGZvbygpIOKGkiB2b2lkIHsKKyAgICBjb3JlOjpwcmludCgiQTEiKTsKKyAgfQorfQorY2xhc3MgQjEgZXh0ZW5kcyBzZWxmOjpBMSB7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QjEqCisgICAgOiBzdXBlciBzZWxmOjpBMTo64oCiKCkKKyAgICA7Cit9CitjbGFzcyBDMSBleHRlbmRzIHNlbGY6OkIxIHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpDMSoKKyAgICA6IHN1cGVyIHNlbGY6OkIxOjrigKIoKQorICAgIDsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MSxnZXR0ZXJTZWxlY3RvcklkOjJdICBtZXRob2QgZm9vKCkg4oaSIHZvaWQgeworICAgIGNvcmU6OnByaW50KCJDMSIpOworICB9Cit9CitjbGFzcyBBMiBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QTIqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDozLGdldHRlclNlbGVjdG9ySWQ6NF0gIG1ldGhvZCBmb28oKSDihpIgdm9pZCB7CisgICAgY29yZTo6cHJpbnQoIkEyIik7CisgIH0KK30KK2NsYXNzIEIyIGV4dGVuZHMgc2VsZjo6QTIgaW1wbGVtZW50cyBzZWxmOjpYIHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCMioKKyAgICA6IHN1cGVyIHNlbGY6OkEyOjrigKIoKQorICAgIDsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MyxnZXR0ZXJTZWxlY3RvcklkOjRdICBtZXRob2QgZm9vKCkg4oaSIHZvaWQgeworICAgIGNvcmU6OnByaW50KCJCMiIpOworICB9Cit9CithYnN0cmFjdCBjbGFzcyBBMyBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QTMqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo1LGdldHRlclNlbGVjdG9ySWQ6Nl0gIGFic3RyYWN0IG1ldGhvZCBmb28oKSDihpIgdm9pZDsKK30KK2NsYXNzIEIzIGV4dGVuZHMgc2VsZjo6QTMgaW1wbGVtZW50cyBzZWxmOjpYIHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCMyoKKyAgICA6IHN1cGVyIHNlbGY6OkEzOjrigKIoKQorICAgIDsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NSxnZXR0ZXJTZWxlY3RvcklkOjZdICBtZXRob2QgZm9vKCkg4oaSIHZvaWQgeworICAgIGNvcmU6OnByaW50KCJCMyIpOworICB9Cit9CitjbGFzcyBDMyBleHRlbmRzIGNvcmU6Ok9iamVjdCBpbXBsZW1lbnRzIHNlbGY6OkEzIHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpDMyoKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgbWV0aG9kIGZvbygpIOKGkiB2b2lkIHsKKyAgICBjb3JlOjpwcmludCgiQzMiKTsKKyAgfQorfQorY2xhc3MgQTQgZXh0ZW5kcyBjb3JlOjpPYmplY3QgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkE0KgorICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQorICAgIDsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NyxnZXR0ZXJTZWxlY3RvcklkOjhdICBtZXRob2QgZm9vKCkg4oaSIHZvaWQgeworICAgIGNvcmU6OnByaW50KCJBNCIpOworICB9Cit9CitjbGFzcyBCNCBleHRlbmRzIGNvcmU6Ok9iamVjdCB7CisgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QjQqCisgICAgOiBzdXBlciBjb3JlOjpPYmplY3Q6OuKAoigpCisgICAgOworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo3LGdldHRlclNlbGVjdG9ySWQ6OF0gIG1ldGhvZCBmb28oKSDihpIgdm9pZCB7CisgICAgY29yZTo6cHJpbnQoIkI0Iik7CisgIH0KK30KK2NsYXNzIEM0IGV4dGVuZHMgY29yZTo6T2JqZWN0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpDNCoKKyAgICA6IHN1cGVyIGNvcmU6Ok9iamVjdDo64oCiKCkKKyAgICA7CitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjcsZ2V0dGVyU2VsZWN0b3JJZDo4XSAgbWV0aG9kIGZvbygpIOKGkiB2b2lkIHsKKyAgICBjb3JlOjpwcmludCgiQzQiKTsKKyAgfQorfQorY2xhc3MgRDQgZXh0ZW5kcyBzZWxmOjpBNCBpbXBsZW1lbnRzIHNlbGY6OkI0IHsKKyAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpENCoKKyAgICA6IHN1cGVyIHNlbGY6OkE0OjrigKIoKQorICAgIDsKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6NyxnZXR0ZXJTZWxlY3RvcklkOjhdICBtZXRob2QgZm9vKCkg4oaSIHZvaWQgeworICAgIGNvcmU6OnByaW50KCJENCIpOworICB9Cit9CitjbGFzcyBFNCBleHRlbmRzIHNlbGY6OkM0IGltcGxlbWVudHMgc2VsZjo6QjQgeworICBzeW50aGV0aWMgY29uc3RydWN0b3Ig4oCiKCkg4oaSIHNlbGY6OkU0KgorICAgIDogc3VwZXIgc2VsZjo6QzQ6OuKAoigpCisgICAgOworfQorc3RhdGljIG1ldGhvZCBtYWluKCkg4oaSIGR5bmFtaWMgeworICBjb3JlOjpMaXN0PHNlbGY6OkExKj4qIHgxID0gPHNlbGY6OkExKj5bbmV3IHNlbGY6OkExOjrigKIoKSwgbmV3IHNlbGY6OkIxOjrigKIoKSwgbmV3IHNlbGY6OkMxOjrigKIoKV07CisgIHsKKyAgICBjb3JlOjpJdGVyYXRvcjxzZWxmOjpBMSo+KiA6c3luYy1mb3ItaXRlcmF0b3IgPSBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuY29yZTo6X0dyb3dhYmxlTGlzdC5pdGVyYXRvcl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3I8I2xpYjo6QTEqPl0geDEue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgZm9yICg7IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvci5tb3ZlTmV4dF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6Ym9vbCAoc2tpcCBjaGVjayldIDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgIHNlbGY6OkExKiBvID0gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yLmN1cnJlbnRdIDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgby57c2VsZjo6QTE6OmZvb30oKTsKKyAgICB9CisgIH0KKyAgY29yZTo6TGlzdDxzZWxmOjpBMio+KiB4MiA9IDxzZWxmOjpBMio+W25ldyBzZWxmOjpBMjo64oCiKCksIG5ldyBzZWxmOjpCMjo64oCiKCldOworICB7CisgICAgY29yZTo6SXRlcmF0b3I8c2VsZjo6QTIqPiogOnN5bmMtZm9yLWl0ZXJhdG9yID0gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9Hcm93YWJsZUxpc3QuaXRlcmF0b3JdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yPCNsaWI6OkEyKj5dIHgyLntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgIGZvciAoOyBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3IubW92ZU5leHRdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6OmJvb2wgKHNraXAgY2hlY2spXSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICBzZWxmOjpBMiogbyA9IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvci5jdXJyZW50XSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgIG8ue3NlbGY6OkEyOjpmb299KCk7CisgICAgfQorICB9CisgIGNvcmU6Okxpc3Q8c2VsZjo6QTMqPiogeDMgPSA8c2VsZjo6QTMqPltuZXcgc2VsZjo6QjM6OuKAoigpLCBuZXcgc2VsZjo6QzM6OuKAoigpXTsKKyAgeworICAgIGNvcmU6Okl0ZXJhdG9yPHNlbGY6OkEzKj4qIDpzeW5jLWZvci1pdGVyYXRvciA9IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5jb3JlOjpfR3Jvd2FibGVMaXN0Lml0ZXJhdG9yXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvcjwjbGliOjpBMyo+XSB4My57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICBmb3IgKDsgW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yLm1vdmVOZXh0XSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpib29sIChza2lwIGNoZWNrKV0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgc2VsZjo6QTMqIG8gPSBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3IuY3VycmVudF0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICBvLntzZWxmOjpBMzo6Zm9vfSgpOworICAgIH0KKyAgfQorICBjb3JlOjpMaXN0PHNlbGY6OkE0Kj4qIHg0ID0gPHNlbGY6OkE0Kj5bbmV3IHNlbGY6OkE0OjrigKIoKSwgbmV3IHNlbGY6OkQ0OjrigKIoKV07CisgIHsKKyAgICBjb3JlOjpJdGVyYXRvcjxzZWxmOjpBNCo+KiA6c3luYy1mb3ItaXRlcmF0b3IgPSBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuY29yZTo6X0dyb3dhYmxlTGlzdC5pdGVyYXRvcl0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3I8I2xpYjo6QTQqPl0geDQue2NvcmU6Okl0ZXJhYmxlOjppdGVyYXRvcn07CisgICAgZm9yICg7IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvci5tb3ZlTmV4dF0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPWRhcnQuY29yZTo6Ym9vbCAoc2tpcCBjaGVjayldIDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6Om1vdmVOZXh0fSgpOyApIHsKKyAgICAgIHNlbGY6OkE0KiBvID0gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yLmN1cnJlbnRdIDpzeW5jLWZvci1pdGVyYXRvci57Y29yZTo6SXRlcmF0b3I6OmN1cnJlbnR9OworICAgICAgby57c2VsZjo6QTQ6OmZvb30oKTsKKyAgICB9CisgIH0KKyAgY29yZTo6TGlzdDxzZWxmOjpCNCo+KiB5NCA9IDxzZWxmOjpCNCo+W25ldyBzZWxmOjpCNDo64oCiKCksIG5ldyBzZWxmOjpENDo64oCiKCksIG5ldyBzZWxmOjpFNDo64oCiKCldOworICB7CisgICAgY29yZTo6SXRlcmF0b3I8c2VsZjo6QjQqPiogOnN5bmMtZm9yLWl0ZXJhdG9yID0gW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0LmNvcmU6Ol9Hcm93YWJsZUxpc3QuaXRlcmF0b3JdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yPCNsaWI6OkI0Kj5dIHk0Lntjb3JlOjpJdGVyYWJsZTo6aXRlcmF0b3J9OworICAgIGZvciAoOyBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3IubW92ZU5leHRdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1kYXJ0LmNvcmU6OmJvb2wgKHNraXAgY2hlY2spXSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjptb3ZlTmV4dH0oKTsgKSB7CisgICAgICBzZWxmOjpCNCogbyA9IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvci5jdXJyZW50XSA6c3luYy1mb3ItaXRlcmF0b3Iue2NvcmU6Okl0ZXJhdG9yOjpjdXJyZW50fTsKKyAgICAgIG8ue3NlbGY6OkI0Ojpmb299KCk7CisgICAgfQorICB9CisgIGNvcmU6Okxpc3Q8c2VsZjo6QzQqPiogejQgPSA8c2VsZjo6QzQqPltuZXcgc2VsZjo6QzQ6OuKAoigpLCBuZXcgc2VsZjo6RTQ6OuKAoigpXTsKKyAgeworICAgIGNvcmU6Okl0ZXJhdG9yPHNlbGY6OkM0Kj4qIDpzeW5jLWZvci1pdGVyYXRvciA9IFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5jb3JlOjpfR3Jvd2FibGVMaXN0Lml0ZXJhdG9yXSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5faW50ZXJuYWw6Okxpc3RJdGVyYXRvcjwjbGliOjpDNCo+XSB6NC57Y29yZTo6SXRlcmFibGU6Oml0ZXJhdG9yfTsKKyAgICBmb3IgKDsgW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT1kYXJ0Ll9pbnRlcm5hbDo6TGlzdEl0ZXJhdG9yLm1vdmVOZXh0XSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpib29sIChza2lwIGNoZWNrKV0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6bW92ZU5leHR9KCk7ICkgeworICAgICAgc2VsZjo6QzQqIG8gPSBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPWRhcnQuX2ludGVybmFsOjpMaXN0SXRlcmF0b3IuY3VycmVudF0gOnN5bmMtZm9yLWl0ZXJhdG9yLntjb3JlOjpJdGVyYXRvcjo6Y3VycmVudH07CisgICAgICBbQHZtLmRpcmVjdC1jYWxsLm1ldGFkYXRhPSNsaWI6OkM0LmZvbz8/XSBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9IT8gKHNraXAgY2hlY2spXSBvLntzZWxmOjpDNDo6Zm9vfSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3RlYXJfb2ZmX3N1cGVyX21ldGhvZC5kYXJ0LmV4cGVjdCBiL3BrZy92bS90ZXN0Y2FzZXMvdHJhbnNmb3JtYXRpb25zL3R5cGVfZmxvdy90cmFuc2Zvcm1lci90ZWFyX29mZl9zdXBlcl9tZXRob2QuZGFydC5leHBlY3QKaW5kZXggYjdmZGFiOC4uZTYzMGE4OCAxMDA2NDQKLS0tIGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3RlYXJfb2ZmX3N1cGVyX21ldGhvZC5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvdGVhcl9vZmZfc3VwZXJfbWV0aG9kLmRhcnQuZXhwZWN0CkBAIC0yMCwxNiArMjAsMTYgQEAKICAgc3ludGhldGljIGNvbnN0cnVjdG9yIOKAoigpIOKGkiBzZWxmOjpCYXNlKgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MSxnZXR0ZXJTZWxlY3RvcklkOjJdICBtZXRob2QgZm9vKCkg4oaSIGNvcmU6OmludCoKK1tAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNOb25UaGlzVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MyxnZXR0ZXJTZWxlY3RvcklkOjRdICBtZXRob2QgZm9vKCkg4oaSIGNvcmU6OmludCoKICAgICByZXR1cm4gX2luOjp1bnNhZmVDYXN0PGNvcmU6OmludCo+KFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9ZGFydC5jb3JlOjpfSW50ZWdlckltcGxlbWVudGF0aW9uLitdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1pbnQgKHNraXAgY2hlY2spXSAzLntjb3JlOjpudW06Oit9KF9pbjo6dW5zYWZlQ2FzdDxjb3JlOjpudW0+KFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6Qi5mb29dIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1pbnQ/IChyZWNlaXZlciBub3QgaW50KV0gW0B2bS5pbmZlcnJlZC10eXBlLm1ldGFkYXRhPSNsaWI6OkJdIHNlbGY6Omtub3duUmVzdWx0KCkuZm9vKCkpKSk7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjMsZ2V0dGVyU2VsZWN0b3JJZDo0XSAgbWV0aG9kIGRvQ2FsbChkeW5hbWljIHgpIOKGkiBjb3JlOjppbnQqCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgbWV0aG9kIGRvQ2FsbChkeW5hbWljIHgpIOKGkiBjb3JlOjppbnQqCiAgICAgcmV0dXJuIFtAdm0uY2FsbC1zaXRlLWF0dHJpYnV0ZXMubWV0YWRhdGE9cmVjZWl2ZXJUeXBlOmR5bmFtaWNdIHguY2FsbCgpIGFze1R5cGVFcnJvcixGb3JEeW5hbWljfSBjb3JlOjppbnQqOwogfQogY2xhc3MgVGVhck9mZlN1cGVyTWV0aG9kIGV4dGVuZHMgc2VsZjo6QmFzZSB7CiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6VGVhck9mZlN1cGVyTWV0aG9kKgogICAgIDogc3VwZXIgc2VsZjo6QmFzZTo64oCiKCkKICAgICA7Ci1bQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjUsZ2V0dGVyU2VsZWN0b3JJZDo2XSAgbWV0aG9kIGJhcigpIOKGkiBjb3JlOjppbnQqCitbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjcsZ2V0dGVyU2VsZWN0b3JJZDo4XSAgbWV0aG9kIGJhcigpIOKGkiBjb3JlOjppbnQqCiAgICAgcmV0dXJuIFtAdm0uZGlyZWN0LWNhbGwubWV0YWRhdGE9I2xpYjo6QmFzZS5kb0NhbGxdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT1pbnQ/IChza2lwIGNoZWNrKV0gdGhpcy57c2VsZjo6QmFzZTo6ZG9DYWxsfShzdXBlci57c2VsZjo6QmFzZTo6Zm9vfSk7CiB9CiBbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9I2xpYjo6Qj9dc3RhdGljIGZpZWxkIHNlbGY6OkEqIGFhID0gbmV3IHNlbGY6OkI6OuKAoigpOwpkaWZmIC0tZ2l0IGEvcGtnL3ZtL3Rlc3RjYXNlcy90cmFuc2Zvcm1hdGlvbnMvdHlwZV9mbG93L3RyYW5zZm9ybWVyL3dyaXRlX29ubHlfZmllbGQzX25uYmQuZGFydC5leHBlY3QgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvd3JpdGVfb25seV9maWVsZDNfbm5iZC5kYXJ0LmV4cGVjdAppbmRleCBiOTUxMzA3Li5mMDhmODA0IDEwMDY0NAotLS0gYS9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvd3JpdGVfb25seV9maWVsZDNfbm5iZC5kYXJ0LmV4cGVjdAorKysgYi9wa2cvdm0vdGVzdGNhc2VzL3RyYW5zZm9ybWF0aW9ucy90eXBlX2Zsb3cvdHJhbnNmb3JtZXIvd3JpdGVfb25seV9maWVsZDNfbm5iZC5kYXJ0LmV4cGVjdApAQCAtMTIsMTEgKzEyLDExIEBACiBbQHZtLnByb2NlZHVyZS1hdHRyaWJ1dGVzLm1ldGFkYXRhPW1ldGhvZE9yU2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsZ2V0dGVyQ2FsbGVkRHluYW1pY2FsbHk6ZmFsc2UsaGFzTm9uVGhpc1VzZXM6ZmFsc2UsaGFzVGVhck9mZlVzZXM6ZmFsc2UsbWV0aG9kT3JTZXR0ZXJTZWxlY3RvcklkOjNdICBzZXQgLyppc051bGxhYmxlQnlEZWZhdWx0Ki8geChjb3JlOjppbnQgdmFsdWUpIOKGkiB2b2lkOwogfQogY2xhc3MgQiBleHRlbmRzIGNvcmU6Ok9iamVjdCB7Ci1bQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDozLGdldHRlclNlbGVjdG9ySWQ6NF0gIGxhdGUgZmluYWwgW3NldHRlcl0gZmllbGQgY29yZTo6aW50IHg7CitbQHZtLmluZmVycmVkLXR5cGUubWV0YWRhdGE9ZGFydC5jb3JlOjpfU21pP10gW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc05vblRoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo2LGdldHRlclNlbGVjdG9ySWQ6N10gIGxhdGUgZmluYWwgW3NldHRlcl0gZmllbGQgY29yZTo6aW50IHg7CiAgIHN5bnRoZXRpYyBjb25zdHJ1Y3RvciDigKIoKSDihpIgc2VsZjo6QgogICAgIDogc3VwZXIgY29yZTo6T2JqZWN0OjrigKIoKQogICAgIDsKLVtAdm0ucHJvY2VkdXJlLWF0dHJpYnV0ZXMubWV0YWRhdGE9bWV0aG9kT3JTZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxnZXR0ZXJDYWxsZWREeW5hbWljYWxseTpmYWxzZSxoYXNUaGlzVXNlczpmYWxzZSxoYXNUZWFyT2ZmVXNlczpmYWxzZSxtZXRob2RPclNldHRlclNlbGVjdG9ySWQ6MSxnZXR0ZXJTZWxlY3RvcklkOjJdICBtZXRob2QgdXNlKCkg4oaSIGR5bmFtaWMgeworW0B2bS5wcm9jZWR1cmUtYXR0cmlidXRlcy5tZXRhZGF0YT1tZXRob2RPclNldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGdldHRlckNhbGxlZER5bmFtaWNhbGx5OmZhbHNlLGhhc1RoaXNVc2VzOmZhbHNlLGhhc1RlYXJPZmZVc2VzOmZhbHNlLG1ldGhvZE9yU2V0dGVyU2VsZWN0b3JJZDo0LGdldHRlclNlbGVjdG9ySWQ6NV0gIG1ldGhvZCB1c2UoKSDihpIgZHluYW1pYyB7CiAgICAgW0B2bS5kaXJlY3QtY2FsbC5tZXRhZGF0YT0jbGliOjpCLnhdIFtAdm0uaW5mZXJyZWQtdHlwZS5tZXRhZGF0YT0hPyAoc2tpcCBjaGVjayldIHRoaXMue3NlbGY6OkI6Onh9ID0gMzsKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL0NIQU5HRUxPRy5tZCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9DSEFOR0VMT0cubWQKaW5kZXggNTc5YzU5MC4uNGMxZmMzOSAxMDA2NDQKLS0tIGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL0NIQU5HRUxPRy5tZAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvQ0hBTkdFTE9HLm1kCkBAIC0xLDUgKzEsMTggQEAKICMgQ2hhbmdlbG9nCiAKKyMjIDAuNC4wCisKKy0gQWRkIGBidWlsZENvbXBhcmlzb25UcmVlbWFwYCBmb3IgY29uc3RydWN0aW5nIHRyZWVtYXAgcmVwcmVzZW50aW5nIHRoZSBkaWZmCitiZXR3ZWVuIHR3byBzaXplIHByb2ZpbGVzLgorLSBJbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBleHRyYWN0aW5nIGNhbGwgZ3JhcGggaW5mb3JtYXRpb24gZnJvbSB0aGUgQU9UCitjb21waWxlciB0cmFjZSAoYC0tdHJhY2UtcHJlY29tcGlsZXItdG9gIGZsYWcpLCBzZWUgYHByZWNvbXBpbGVyX3RyYWNlLmRhcnRgLgorLSBOZXcgY29tbWFuZCBgZXhwbGFpbiBkeW5hbWljLWNhbGxzYCB3aGljaCBlc3RpbWF0ZXMgdGhlIGltcGFjdCBvZiBkaWZmZXJlbnQKK2R5bmFtaWMgY2FsbHMgb24gdGhlIHJlc3VsdGluZyBBT1Qgc25hcHNob3Qgc2l6ZSB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorc2l6ZSBkdW1wIChlLmcuIFY4IHNuYXBzaG90IHByb2ZpbGUpIGFuZCBBT1QgY29tcGlsZXIgdHJhY2UuCistIGBzdW1tYXJ5YCBjb21tYW5kIGNhbiBub3cgdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlIEFPVCBjb21waWxlciB0cmFjZSB0bworZ3JvdXAgcGFja2FnZXMvbGlicmFyaWVzIHRvZ2V0aGVyIHdpdGggdGhlaXIgZGVwZW5kZW5jaWVzIHRvIGdpdmVuIG1vcmUgcHJlY2lzZQorZXN0aW1hdGUgb2YgaG93IG11Y2ggYSBzcGVjaWZpYyBwYWNrYWdlL2xpYnJhcnkgYnJpbmdzIGludG8gdGhlIHNuYXBzaG90LgorCiAjIyAwLjMuMAogCiAtIEV4dHJhY3QgdHJlZW1hcCBjb25zdHJ1Y3Rpb24gY29kZSBpbnRvIGEgc2VwYXJhdGUgbGlicmFyeSwgdG8gbWFrZSBpdApkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL1JFQURNRS5tZCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9SRUFETUUubWQKaW5kZXggMWU1N2JmOS4uNTQ4NGI5MSAxMDA2NDQKLS0tIGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL1JFQURNRS5tZAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvUkVBRE1FLm1kCkBAIC0yLDcgKzIsOCBAQAogCiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgbGlicmFyaWVzIGFuZCBhIHV0aWxpdHkgZm9yIGFuYWx5c2luZyB0aGUgc2l6ZSBhbmQKIGNvbnRlbnRzIG9mIERhcnQgVk0gQU9UIHNuYXBzaG90cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mCi1gLS1wcmludC1pbnN0cnVjdGlvbnMtc2l6ZXMtdG9gIGFuZCBgLS13cml0ZS12OC1zbmFwc2hvdC1wcm9maWxlLXRvYCBWTSBmbGFncy4KK2AtLXByaW50LWluc3RydWN0aW9ucy1zaXplcy10b2AsIGAtLXdyaXRlLXY4LXNuYXBzaG90LXByb2ZpbGUtdG9gIGFuZAorYC0tdHJhY2UtcHJlY29tcGlsZXItdG9gIFZNIGZsYWdzLgogCiAjIyBBT1QgU25hcHNob3QgQmFzaWNzCiAKQEAgLTI0LDYgKzI1LDkgQEAKICogYC0td3JpdGUtdjgtc25hcHNob3QtcHJvZmlsZS10b2AgaXMgYSBncmFwaCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc25hcHNob3QsCiBpdCBhdHRyaWJ1dGVzIGJ5dGVzIHdyaXR0ZW4gaW50byBhIHNuYXBzaG90IHRvIGEgbm9kZSBpbiB0aGUgaGVhcCBncmFwaC4gVGhpcwogZm9ybWF0IGNvdmVycyBib3RoIGRhdGEgYW5kIGNvZGUgc2VjdGlvbnMgb2YgdGhlIHNuYXBzaG90LgorKiBgLS10cmFjZS1wcmVjb21waWxlci10b2AgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgZGVwZW5kZW5jaWVzIGJldHdlZW4KK2NvbXBpbGVkIGZ1bmN0aW9ucywgYWxsb3dpbmcgdG8gZGV0ZXJtaW5lIHdoeSBjZXJ0YWluIGZ1bmN0aW9uIHdhcyBwdWxsZWQgaW50bwordGhlIHNuYXBzaG90LgogCiAjIyMgUGFzc2luZyBmbGFncyB0byB0aGUgQU9UIGNvbXBpbGVyCiAKQEAgLTkyLDYgKzk2LDQ1IEBACiBhdCB0aGUgc2FtZSB0aW1lIG9iamVjdHMgd2hpY2ggY2FuIGJlIGF0dHJpYnV0ZWQgdG8gYGRhcnQ6Y29yZWAgbGlicmFyeQogYnV0IG5vdCB0byBhbnkgc3BlY2lmaWMgY2xhc3Mgd2l0aGluIHRoaXMgbGlicmFyeSB0YWtlIGAzLjMzJWAgb2YgdGhlIHNuYXBzaG90LgogCitUaGlzIGNvbW1hbmQgYWxzbyBzdXBwb3J0cyBfZXN0aW1hdGluZ18gY3VtdWxhdGl2ZSBpbXBhY3Qgb2YgYSBsaWJyYXJ5IG9yIGEKK3BhY2thZ2UgdG9nZXRoZXIgd2l0aCBpdHMgZGVwZW5kZW5jaWVzIC0gd2hpY2ggY2FuIGJlIGNvbXB1dGVkIGZyb20KK2EgcHJlY29tcGlsZXIgdHJhY2UgKGAtLXRyYWNlLXByZWNvbXBpbGVyLXRvYCBvcHRpb25zKS4gRm9yIGV4YW1wbGU6CisKK2BgYGNvbnNvbGUKKyQgc25hcHNob3RfYW5hbHlzaXMgc3VtbWFyeSAtYiBwYWNrYWdlIC90bXAvcHJvZmlsZS5qc29uCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworfCBQYWNrYWdlICAgICAgICAgICAgICAgICAgICAgfCBTaXplIChCeXRlcykgfCBQZXJjZW50IHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCit8IHBhY2thZ2U6Y29tcGlsZXIgICAgICAgICAgICB8ICAgICAgNTM2OTkzMyB8ICAzOC45MyUgfAorfCBwYWNrYWdlOmZyb250X2VuZCAgICAgICAgICAgfCAgICAgIDI2NDQ5NDIgfCAgMTkuMTglIHwKK3wgcGFja2FnZTprZXJuZWwgICAgICAgICAgICAgIHwgICAgICAxNDQzNTY4IHwgIDEwLjQ3JSB8Cit8IHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZCB8ICAgICAgIDk0NDU1NSB8ICAgNi44NSUgfAorLi4uCiskIHNuYXBzaG90X2FuYWx5c2lzIHN1bW1hcnkgLWIgcGFja2FnZSAtZCAxIC0tcHJlY29tcGlsZXItdHJhY2U9L3RtcC90cmFjZS5qc29uIC90bXAvcHJvZmlsZS5qc29uCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKK3wgUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICB8IFNpemUgKEJ5dGVzKSB8IFBlcmNlbnQgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCit8IHBhY2thZ2U6Y29tcGlsZXIgKCsgOCBkZXBzKSAgfCAgICAgIDU3NjI3NjEgfCAgNDEuNzglIHwKK3wgcGFja2FnZTpmcm9udF9lbmQgKCsgMSBkZXBzKSB8ICAgICAgMjcwODk4MSB8ICAxOS42NCUgfAorfCBwYWNrYWdlOmtlcm5lbCAgICAgICAgICAgICAgIHwgICAgICAxNDQzNTY4IHwgIDEwLjQ3JSB8Cit8IHBhY2thZ2U6X2ZlX2FuYWx5emVyX3NoYXJlZCAgfCAgICAgICA5NDQ1NTUgfCAgIDYuODUlIHwKKy4uLgorRGVwZW5kZW5jeSB0cmVlczoKKworcGFja2FnZTpjb21waWxlciAodG90YWwgNTc2Mjc2MSBieXRlcykKK+KUnOKUgOKUgCBwYWNrYWdlOmpzX2FzdCAodG90YWwgMjQyNDkwIGJ5dGVzKQor4pSc4pSA4pSAIHBhY2thZ2U6ZGFydDJqc19pbmZvICh0b3RhbCAxMDEyODAgYnl0ZXMpCivilJzilIDilIAgcGFja2FnZTpjcnlwdG8gKHRvdGFsIDI3NDM0IGJ5dGVzKQor4pSCICAg4pSc4pSA4pSAIHBhY2thZ2U6dHlwZWRfZGF0YSAodG90YWwgMTE4NTAgYnl0ZXMpCivilIIgICDilJTilIDilIAgcGFja2FnZTpjb252ZXJ0ICh0b3RhbCA1MTg1IGJ5dGVzKQor4pSc4pSA4pSAIHBhY2thZ2U6Y29sbGVjdGlvbiAodG90YWwgMTUxODIgYnl0ZXMpCivilJzilIDilIAgcGFja2FnZTpfanNfaW50ZXJvcF9jaGVja3MgKHRvdGFsIDQ2MjcgYnl0ZXMpCivilJTilIDilIAgcGFja2FnZTpqc19ydW50aW1lICh0b3RhbCAxODE1IGJ5dGVzKQorCitwYWNrYWdlOmZyb250X2VuZCAodG90YWwgMjcwODk4MSBieXRlcykKK+KUlOKUgOKUgCBwYWNrYWdlOnBhY2thZ2VfY29uZmlnICh0b3RhbCA2NDAzOSBieXRlcykKK2BgYAorCiAKICMjIyBgY29tcGFyZWAKIApAQCAtMTQxLDYgKzE4NCwzMSBAQAogZGF0YSBvciBleGVjdXRhYmxlIGNvZGUuCiAqIGBvYmplY3QtdHlwZWAgKGRlZmF1bHQpIGNvbGxhcHNlcyBzbmFwc2hvdCBub2RlcyBiYXNlZCBvbiB0aGVpciB0eXBlIG9ubHkuCiAKKyMjIyBgZXhwbGFpbmAKKworIyMjIyBgZXhwbGFpbiBkeW5hbWljLWNhbGxzYAorCitgYGBjb25zb2xlCiskIHNuYXBzaG90X2FuYWx5c2lzIGV4cGxhaW4gZHluYW1pYy1jYWxscyA8cHJvZmlsZS5qc29uPiA8dHJhY2UuanNvbj4KK2BgYAorCitUaGlzIGNvbW1hbmQgZ2VuZXJhdGVzIGEgcmVwb3J0IGxpc3RpbmcgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBzZWxlY3RvcnMKK2FuZCB0aGVpciBhcHByb3hpbWF0ZSBpbXBhY3Qgb24gdGhlIGNvZGUgc2l6ZS4KKworYGBgY29uc29sZQorc25hcHNob3RfYW5hbHlzaXMgZXhwbGFpbiBkeW5hbWljLWNhbGxzIC90bXAvcHJvZmlsZS5qc29uIC90bXAvdHJhY2UuanNvbgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLSsKK3wgU2VsZWN0b3IgICAgICAgICAgICAgICAgICAgICB8IFNpemUgKEJ5dGVzKSB8IFBlcmNlbnQgfCBPZiB0b3RhbCB8CisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tKworfCBzZXQ6cmVxdWVzdEhlYWRlciAgICAgICAgICAgIHwgICAgICAgIDEwMDU0IHwgIDI4LjAwJSB8ICAgIDAuMDMlIHwKK3wgZ2V0OnNjYWxlICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgMzYzMCB8ICAxMC4xMSUgfCAgICAwLjAxJSB8CisuLi4KK0R5bmFtaWMgY2FsbCB0byBzZXQ6cmVxdWVzdEhlYWRlciAocmV0YWluaW5nIH4xMDA1NCBieXRlcykgb2NjdXJzIGluOgorICAgIHBhY2thZ2U6bXktc3VwZXItYXBwL3NyYy9pbmplY3Rvci5kYXJ0OjpJbmplY3Rvci5oYW5kbGV7Ym9keX0KKworRHluYW1pYyBjYWxsIHRvIGdldDpzY2FsZSAocmV0YWluaW5nIH4zNjMwIGJ5dGVzKSBvY2N1cnMgaW46CisgICAgcGFja2FnZTpzb21lLWRlcGVuZGVuY3kvc3JjL2ltYWdlLmRhcnQ6OkltYWdlLj09CitgYGAKIAogIyMgQVBJCiAKQEAgLTE2Miw2ICsyMzAsNDggQEAKIGFuZCBjcmVhdGVzIGBQcm9ncmFtSW5mb2AgaW4gYW4gYXBwcm9wcmlhdGUgd2F5LCBhbGxvd2luZyB0byB3cml0ZSBjb2RlCiB3aGljaCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgd2l0aCBib3RoIGZvcm1hdHMuCiAKKyMjIFByZWNvbXBpbGVyIFRyYWNlIEZvcm1hdCAoYC0td3JpdGUtcHJlY29tcGlsZXItdHJhY2UtdG89Li4uYCkKKworQU9UIGNvbXBpbGVyIGNhbiBwcm9kdWNlIGEgSlNPTiBmaWxlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgY29tcGlsZWQKK2Z1bmN0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbS4gVGhpcyBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworYGBganNvbgoreworICAgICJ0cmFjZSI6IHRyYWNlQXJyYXksCisgICAgImVudGl0aWVzIjogZW50aXRpZXNBcnJheSwKKyAgICAic3RyaW5ncyI6IHN0cmluZ3NBcnJheSwKK30KK2BgYAorCistIGBzdHJpbmdzQXJyYXlgIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVmZXJlbmNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgdHJhY2UKK2J5IHRoZWlyIGluZGV4IGluIHRoaXMgYXJyYXkuCistIGBlbnRpdGllc0FycmF5YCBpcyBhbiBmbGF0dGVuZWQgYXJyYXkgb2YgZW50aXRpZXM6CisKKyAgICAtIGAiQyIsIDxsaWJyYXJ5LXVyaS1pZHg+LCA8Y2xhc3MtbmFtZS1pZHg+LCAwYCAtIGNsYXNzIHJlY29yZDsKKyAgICAtIGAiViIsIDxjbGFzcy1pZHg+LCA8bmFtZS1pZHg+LCAwYCAtIHN0YXRpYyBmaWVsZCByZWNvcmQ7CisgICAgLSBgIkYifCJTIiwgPGNsYXNzLWlkeD4sIDxuYW1lLWlkeD4sIDxzZWxlY3Rvci1pZD5gIC0gZnVuY3Rpb24gcmVjb3JkIChgRmAgZm9yIGR5bmFtaWMgZnVuY3Rpb25zIGFuZCBgU2AgZm9yIHN0YXRpYyBmdW5jdGlvbnMpOworCisgIE5vdGUgdGhhdCBhbGwgcmVjb3JkcyBpbiB0aGlzIGFycmF5IG9jY3VweSB0aGUgc2FtZSBhbW91bnQgb2YgZWxlbWVudHMgKGA0YCkKKyAgdG8gbWFrZSByYW5kb20gYWNjZXNzIGJ5IGluZGV4IHBvc3NpYmxlLgorCistIGB0cmFjZUFycmF5YCBpcyBhbiBmbGF0dGVuZWQgYXJyYXkgb2YgcHJlY29tcGlsYXRpb24gZXZlbnRzOgorCisgICAgLSBgIlIiYCAtIHJvb3QgZXZlbnQgKGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudCkKKyAgICAtIGAiRSJgIC0gZW5kIGV2ZW50IChhbHdheXMgdGhlIGxhc3QgZWxlbWVudCkKKyAgICAtIGAiQyIsIDxmdW5jdGlvbi1pZHg+YCAtIGZ1bmN0aW9uIGNvbXBpbGF0aW9uIGV2ZW50CisKKyAgUm9vdCBhbmQgZnVuY3Rpb24gY29tcGlsYXRpb24gZXZlbnRzIGNhbiBhZGRpdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgYQorICBzZXF1ZW5jZSBvZiByZWZlcmVuY2VzIHdoaWNoIGVudW1lcmF0ZSBvdXRnb2luZyBkZXBlbmRlbmNpZXMgZGlzY292ZXJlZAorICBieSB0aGUgQU9UIGNvbXBpbGVyOgorCisgICAgLSBgPGVudGl0eS1pZHg+YCAtIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gb3IgYSBzdGF0aWMgZmllbGQ7CisgICAgLSBgIlMiLCA8c2VsZWN0b3ItaWR4PmAgLSBhIGR5bmFtaWMgY2FsbCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvcjsKKyAgICAtIGAiVCIsIDxzZWxlY3Rvci1pZD5gIC0gZGlzcGF0Y2ggdGFibGUgY2FsbCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciBpZDsKKworKkZsYXR0ZW5lZCBhcnJheSogaXMgYW4gYXJyYXkgb2YgcmVjb3JkcyBmb3JtZWQgYnkgY29uc2VjdXRpdmUgZWxlbWVudHM6CitgW1IwXzAsIFIwXzEsIFIwXzIsIFIxXzAsIFIxXzEsIFIxXzIsIC4uLl1gIGhlcmUgYFIwXypgIGlzIHRoZSBmaXJzdCByZWNvcmQKK2FuZCBgUjFfKmAgaXMgdGhlIHNlY29uZCByZWNvcmQgYW5kIHNvIG9uLgorCiAjIyBGZWF0dXJlcyBhbmQgYnVncwogCiBQbGVhc2UgZmlsZSBmZWF0dXJlIHJlcXVlc3RzIGFuZCBidWdzIGF0IHRoZSBbaXNzdWUgdHJhY2tlcl1bdHJhY2tlcl0uCmRpZmYgLS1naXQgYS9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvYmluL2FuYWx5c2UuZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9iaW4vYW5hbHlzZS5kYXJ0CmluZGV4IGI4ZDZhMmMuLmE3OWJlYmQgMTAwNzU1Ci0tLSBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9iaW4vYW5hbHlzZS5kYXJ0CisrKyBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9iaW4vYW5hbHlzZS5kYXJ0CkBAIC04LDYgKzgsNyBAQAogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvY29tbWFuZF9ydW5uZXIuZGFydCc7CiAKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9zcmMvY29tbWFuZHMvY29tcGFyZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9zcmMvY29tbWFuZHMvZXhwbGFpbi5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9zcmMvY29tbWFuZHMvc3VtbWFyeS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9zcmMvY29tbWFuZHMvdHJlZW1hcC5kYXJ0JzsKIApAQCAtMzQsNyArMzUsOCBAQAogICAgIF9leGVjdXRhYmxlTmFtZSwgJ1Rvb2xzIGZvciBiaW5hcnkgc2l6ZSBhbmFseXNpcyBvZiBEYXJ0IFZNIEFPVCBzbmFwc2hvdHMuJykKICAgLi5hZGRDb21tYW5kKFRyZWVtYXBDb21tYW5kKCkpCiAgIC4uYWRkQ29tbWFuZChDb21wYXJlQ29tbWFuZCgpKQotICAuLmFkZENvbW1hbmQoU3VtbWFyeUNvbW1hbmQoKSk7CisgIC4uYWRkQ29tbWFuZChTdW1tYXJ5Q29tbWFuZCgpKQorICAuLmFkZENvbW1hbmQoRXhwbGFpbkNvbW1hbmQoKSk7CiAKIHZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgewogICB0cnkgewpkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9uYW1lLmRhcnQgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL25hbWUuZGFydAppbmRleCAwOWI3ODkzLi4zYjE3YmQxIDEwMDY0NAotLS0gYS9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL25hbWUuZGFydAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL25hbWUuZGFydApAQCAtNTUsNiArNTUsMjMgQEAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKKyAgLy8vIFNwbGl0IHJhdyBuYW1lIGludG8gaW5kaXZpZHVhbCAnLicgc2VwYXJhdGVkIGNvbXBvbmVudHMgKGUuZy4gbmFtZXMgb2YKKyAgLy8vIGl0cyBwYXJlbnQgZnVuY3Rpb25zKS4KKyAgTGlzdDxTdHJpbmc+IGdldCByYXdDb21wb25lbnRzIHsKKyAgICAvLyBCcmVhayB0aGUgcmVzdCBvZiB0aGUgbmFtZSBpbnRvIGNvbXBvbmVudHMuCisgICAgZmluYWwgcmVzdWx0ID0gcmF3LnNwbGl0KCcuJyk7CisKKyAgICAvLyBDb25zdHJ1Y3RvciBuYW1lcyBsb29rIGxpa2UgdGhpcyAnbmV3IDxDbGFzc05hbWU+LjxDdG9yTmFtZT4nIHNvCisgICAgLy8gd2UgbmVlZCB0byBjb25jYXRlbmF0ZSB0aGUgZmlyc3QgdHdvIGNvbXBvbmVudHMgYmFjayB0byBmb3JtCisgICAgLy8gdGhlIGNvbnN0cnVjdG9yIG5hbWUuCisgICAgaWYgKHJlc3VsdC5maXJzdC5zdGFydHNXaXRoKCduZXcgJykpIHsKKyAgICAgIHJlc3VsdFswXSA9ICcke3Jlc3VsdFswXX0uJHtyZXN1bHRbMV19JzsKKyAgICAgIHJlc3VsdC5yZW1vdmVBdCgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKICAgc3RhdGljIFN0cmluZyBjb2xsYXBzZShTdHJpbmcgbmFtZSkgPT4KICAgICAgIG5hbWUucmVwbGFjZUFsbChfY29sbGFwc2VSZSwgJzxhbm9ueW1vdXMgY2xvc3VyZT4nKTsKIH0KZGlmZiAtLWdpdCBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvcHJlY29tcGlsZXJfdHJhY2UuZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvcHJlY29tcGlsZXJfdHJhY2UuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjg2NzEzCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9wcmVjb21waWxlcl90cmFjZS5kYXJ0CkBAIC0wLDAgKzEsNTI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vLyBIZWxwZXJzIGZvciB3b3JraW5nIHdpdGggdGhlIG91dHB1dCBvZiBgLS10cmFjZS1wcmVjb21waWxlci10b2AgVk0gZmxhZy4KK2xpYnJhcnkgdm1fc25hcHNob3RfYW5hbHlzaXMucHJlY29tcGlsZXJfdHJhY2U7CisKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKKworaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL25hbWUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJvZ3JhbV9pbmZvLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3V0aWxzLmRhcnQnOworCisvLy8gQnVpbGQgW0NhbGxHcmFwaF0gYmFzZWQgb24gdGhlIHRyYWNlIHdyaXR0ZW4gYnkgYC0tdHJhY2UtcHJlY29tcGlsZXItdG9gCisvLy8gZmxhZy4KK0Z1dHVyZTxDYWxsR3JhcGg+IGxvYWRUcmFjZShGaWxlIGlucHV0KSBhc3luYyA9PgorICAgIF9UcmFjZVJlYWRlcihhd2FpdCBsb2FkSnNvbihpbnB1dCkpLnJlYWRUcmFjZSgpOworCisvLy8gW0NhbGxHcmFwaE5vZGVdIHJlcHJlc2VudHMgYSBub2RlIG9mIHRoZSBjYWxsLWdyYXBoLiBJdCBjYW4gZWl0aGVyIGJlOgorLy8vCisvLy8gICAtIGEgZnVuY3Rpb24sIGluIHdoaWNoIGNhc2UgW2RhdGFdIHdpbGwgYmUgW1Byb2dyYW1JbmZvTm9kZV0gb2YgdHlwZQorLy8vICAgICBbTm9kZVR5cGUuZnVuY3Rpb25Ob2RlXTsKKy8vLyAgIC0gYSBkeW5hbWljIGNhbGwgbm9kZSwgaW4gd2hpY2ggY2FzZSBbZGF0YV0gd2lsbCBiZSBhIFtTdHJpbmddIHNlbGVjdG9yOworLy8vICAgLSBhIGRpc3BhdGNoIHRhYmxlIGNhbGwgbm9kZSwgaW4gd2hpY2ggY2FzZSBbZGF0YV0gd2lsbCBiZSBhbiBbaW50XQorLy8vICAgICBzZWxlY3RvciBpZC4KKy8vLworY2xhc3MgQ2FsbEdyYXBoTm9kZSB7CisgIC8vLyBBbiBpbmRleCBvZiB0aGlzIG5vZGUgaW4gW0NhbGxHcmFwaC5ub2Rlc10uCisgIGZpbmFsIGludCBpZDsKKworICAvLy8gU3VjY2Vzc29ycyBvZiB0aGlzIG5vZGUuCisgIGZpbmFsIExpc3Q8Q2FsbEdyYXBoTm9kZT4gc3VjYyA9IFtdOworCisgIC8vLyBQcmVkZWNlc3NvcnMgb2YgdGhpcyBub2RlLgorICBmaW5hbCBMaXN0PENhbGxHcmFwaE5vZGU+IHByZWQgPSBbXTsKKworICAvLy8gRGF0dW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZTogYSBbUHJvZ3JhbUluZm9Ob2RlXSAoZnVuY3Rpb24pLAorICAvLy8gYSBbU3RyaW5nXSAoZHluYW1pYyBjYWxsIHNlbGVjdG9yKSBvciBhbiBbaW50XSAoZGlzcGF0Y2ggdGFibGUKKyAgLy8vIHNlbGVjdG9yIGlkKS4KKyAgZmluYWwgZGF0YTsKKworICAvLy8gUHJlb3JkZXIgbnVtYmVyIG9mIHRoaXMgbm9kZS4KKyAgLy8vCisgIC8vLyBDb21wdXRlZCBieSBbQ2FsbEdyYXBoLmNvbXB1dGVEb21pbmF0b3JzXS4KKyAgaW50IF9wcmVvcmRlck51bWJlcjsKKworICAvLy8gRG9taW5hdG9yIG9mIHRoaXMgbm9kZS4KKyAgLy8vCisgIC8vLyBDb21wdXRlZCBieSBbQ2FsbEdyYXBoLmNvbXB1dGVEb21pbmF0b3JzXS4KKyAgQ2FsbEdyYXBoTm9kZSBkb21pbmF0b3I7CisKKyAgLy8vIE5vZGVzIGRvbWluYXRlZCBieSB0aGlzIG5vZGUuCisgIC8vLworICAvLy8gQ29tcHV0ZWQgYnkgW0NhbGxHcmFwaC5jb21wdXRlRG9taW5hdG9yc10uCisgIExpc3Q8Q2FsbEdyYXBoTm9kZT4gZG9taW5hdGVkID0gX2VtcHR5Tm9kZUxpc3Q7CisKKyAgQ2FsbEdyYXBoTm9kZSh0aGlzLmlkLCB7dGhpcy5kYXRhfSk7CisKKyAgYm9vbCBnZXQgaXNGdW5jdGlvbk5vZGUgPT4KKyAgICAgIGRhdGEgaXMgUHJvZ3JhbUluZm9Ob2RlICYmIGRhdGEudHlwZSA9PSBOb2RlVHlwZS5mdW5jdGlvbk5vZGU7CisKKyAgYm9vbCBnZXQgaXNDbGFzc05vZGUgPT4KKyAgICAgIGRhdGEgaXMgUHJvZ3JhbUluZm9Ob2RlICYmIGRhdGEudHlwZSA9PSBOb2RlVHlwZS5jbGFzc05vZGU7CisKKyAgYm9vbCBnZXQgaXNEeW5hbWljQ2FsbE5vZGUgPT4gZGF0YSBpcyBTdHJpbmc7CisKKyAgLy8vIENyZWF0ZSBvdXRnb2luZyBlZGdlIGZyb20gdGhpcyBub2RlIHRvIHRoZSBnaXZlbiBub2RlIFtuXS4KKyAgdm9pZCBjb25uZWN0VG8oQ2FsbEdyYXBoTm9kZSBuKSB7CisgICAgaWYgKG4gPT0gdGhpcykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3VjYy5jb250YWlucyhuKSkgeworICAgICAgbi5wcmVkLmFkZCh0aGlzKTsKKyAgICAgIHN1Y2MuYWRkKG4pOworICAgIH0KKyAgfQorCisgIHZvaWQgX2FkZERvbWluYXRlZEJsb2NrKENhbGxHcmFwaE5vZGUgbikgeworICAgIGlmIChpZGVudGljYWwoZG9taW5hdGVkLCBfZW1wdHlOb2RlTGlzdCkpIHsKKyAgICAgIGRvbWluYXRlZCA9IFtdOworICAgIH0KKyAgICBkb21pbmF0ZWQuYWRkKG4pOworICAgIG4uZG9taW5hdG9yID0gdGhpczsKKyAgfQorCisgIHZvaWQgdmlzaXREb21pbmF0b3JUcmVlKGJvb2wgRnVuY3Rpb24oQ2FsbEdyYXBoTm9kZSBuLCBpbnQgZGVwdGgpIGNhbGxiYWNrLAorICAgICAgW2ludCBkZXB0aCA9IDBdKSB7CisgICAgaWYgKGNhbGxiYWNrKHRoaXMsIGRlcHRoKSkgeworICAgICAgZm9yICh2YXIgbiBpbiBkb21pbmF0ZWQpIHsKKyAgICAgICAgbi52aXNpdERvbWluYXRvclRyZWUoY2FsbGJhY2ssIGRlcHRoICsgMSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJ0NhbGxHcmFwaE5vZGUoJHtkYXRhIGlzIFByb2dyYW1JbmZvTm9kZSA/IGRhdGEucXVhbGlmaWVkTmFtZSA6IGRhdGF9KSc7CisgIH0KK30KKworY29uc3QgX2VtcHR5Tm9kZUxpc3QgPSA8Q2FsbEdyYXBoTm9kZT5bXTsKKworY2xhc3MgQ2FsbEdyYXBoIHsKKyAgZmluYWwgUHJvZ3JhbUluZm8gcHJvZ3JhbTsKKyAgZmluYWwgTGlzdDxDYWxsR3JhcGhOb2RlPiBub2RlczsKKworICAvLyBNYXBwaW5nIGZyb20gW1Byb2dyYW1JbmZvTm9kZV0gdG8gYSBjb3JyZXNwb25kaW5nIFtDYWxsR3JhcGhOb2RlXSAoaWYgYW55KQorICAvLyB2aWEgW1Byb2dyYW1JbmZvTm9kZS5pZF0uCisgIGZpbmFsIExpc3Q8Q2FsbEdyYXBoTm9kZT4gX25vZGVCeUVudGl0eUlkOworCisgIENhbGxHcmFwaC5fKHRoaXMucHJvZ3JhbSwgdGhpcy5ub2RlcywgdGhpcy5fbm9kZUJ5RW50aXR5SWQpOworCisgIENhbGxHcmFwaE5vZGUgZ2V0IHJvb3QgPT4gbm9kZXMuZmlyc3Q7CisKKyAgQ2FsbEdyYXBoTm9kZSBsb29rdXAoUHJvZ3JhbUluZm9Ob2RlIG5vZGUpID0+IF9ub2RlQnlFbnRpdHlJZFtub2RlLmlkXTsKKworICBJdGVyYWJsZTxDYWxsR3JhcGhOb2RlPiBnZXQgZHluYW1pY0NhbGxzID0+CisgICAgICBub2Rlcy53aGVyZSgobikgPT4gbi5pc0R5bmFtaWNDYWxsTm9kZSk7CisKKyAgLy8vIENvbXB1dGUgYSBjb2xsYXBzZWQgdmVyc2lvbiBvZiB0aGUgY2FsbC1ncmFwaCwgd2hlcmUKKyAgQ2FsbEdyYXBoIGNvbGxhcHNlKE5vZGVUeXBlIHR5cGUsIHtib29sIGRyb3BDYWxsTm9kZXMgPSBmYWxzZX0pIHsKKyAgICBmaW5hbCBub2Rlc0J5RGF0YSA9IDxPYmplY3QsIENhbGxHcmFwaE5vZGU+e307CisgICAgZmluYWwgbm9kZUJ5RW50aXR5SWQgPSA8Q2FsbEdyYXBoTm9kZT5bXTsKKworICAgIFByb2dyYW1JbmZvTm9kZSBjb2xsYXBzZWQoUHJvZ3JhbUluZm9Ob2RlIG5uKSB7CisgICAgICB2YXIgbiA9IG5uOworICAgICAgd2hpbGUgKG4ucGFyZW50ICE9IG51bGwgJiYgbi50eXBlICE9IHR5cGUpIHsKKyAgICAgICAgbiA9IG4ucGFyZW50OworICAgICAgfQorICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQ2FsbEdyYXBoTm9kZSBub2RlRm9yKE9iamVjdCBkYXRhKSB7CisgICAgICByZXR1cm4gbm9kZXNCeURhdGEucHV0SWZBYnNlbnQoZGF0YSwgKCkgeworICAgICAgICBmaW5hbCBuID0gQ2FsbEdyYXBoTm9kZShub2Rlc0J5RGF0YS5sZW5ndGgsIGRhdGE6IGRhdGEpOworICAgICAgICBpZiAoZGF0YSBpcyBQcm9ncmFtSW5mb05vZGUpIHsKKyAgICAgICAgICBpZiAobm9kZUJ5RW50aXR5SWQubGVuZ3RoIDw9IGRhdGEuaWQpIHsKKyAgICAgICAgICAgIG5vZGVCeUVudGl0eUlkLmxlbmd0aCA9IGRhdGEuaWQgKiAyICsgMTsKKyAgICAgICAgICB9CisgICAgICAgICAgbm9kZUJ5RW50aXR5SWRbZGF0YS5pZF0gPSBuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuOworICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgbmV3Tm9kZXMgPSBub2Rlcy5tYXAoKG4pIHsKKyAgICAgIGlmIChuLmRhdGEgaXMgUHJvZ3JhbUluZm9Ob2RlKSB7CisgICAgICAgIHJldHVybiBub2RlRm9yKGNvbGxhcHNlZChuLmRhdGEpKTsKKyAgICAgIH0gZWxzZSBpZiAoIWRyb3BDYWxsTm9kZXMpIHsKKyAgICAgICAgcmV0dXJuIG5vZGVGb3Iobi5kYXRhKTsKKyAgICAgIH0KKyAgICB9KS50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKTsKKworICAgIGZvciAodmFyIG4gaW4gbm9kZXMpIHsKKyAgICAgIGZvciAodmFyIHN1Y2MgaW4gbi5zdWNjKSB7CisgICAgICAgIGZpbmFsIGZyb20gPSBuZXdOb2Rlc1tuLmlkXTsKKyAgICAgICAgZmluYWwgdG8gPSBuZXdOb2Rlc1tzdWNjLmlkXTsKKworICAgICAgICBpZiAoZnJvbSAhPSBudWxsICYmIHRvICE9IG51bGwpIHsKKyAgICAgICAgICBmcm9tLmNvbm5lY3RUbyh0byk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ2FsbEdyYXBoLl8oCisgICAgICAgIHByb2dyYW0sIG5vZGVzQnlEYXRhLnZhbHVlcy50b0xpc3QoZ3Jvd2FibGU6IGZhbHNlKSwgbm9kZUJ5RW50aXR5SWQpOworICB9CisKKyAgLy8vIENvbXB1dGUgZG9taW5hdG9yIHRyZWUgb2YgdGhlIGNhbGwtZ3JhcGguCisgIC8vLworICAvLy8gVGhlIGNvZGUgZm9yIGRvbWluYXRvciB0cmVlIGNvbXB1dGF0aW9uIGlzIHRha2VuIHZlcmJhdGltIGZyb20gdGhlCisgIC8vLyBuYXRpdmUgY29tcGlsZXIgKHNlZSBydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvZmxvd19ncmFwaC5jYykuCisgIHZvaWQgY29tcHV0ZURvbWluYXRvcnMoKSB7CisgICAgZmluYWwgc2l6ZSA9IG5vZGVzLmxlbmd0aDsKKworICAgIC8vIENvbXB1dGUgcHJlb3JkZXIgbnVtYmVyaW5nIGZvciB0aGUgZ3JhcGggdXNpbmcgREZTLgorICAgIGZpbmFsIHBhcmVudCA9IExpc3Q8aW50Pi5maWxsZWQoc2l6ZSwgLTEpOworICAgIGZpbmFsIHByZW9yZGVyID0gTGlzdDxDYWxsR3JhcGhOb2RlPi5maWxsZWQoc2l6ZSwgbnVsbCk7CisKKyAgICB2YXIgTiA9IDA7CisgICAgdm9pZCBkZnMoKSB7CisgICAgICBmaW5hbCBzdGFjayA9IFtfRGZzU3RhdGUocDogLTEsIG46IG5vZGVzLmZpcnN0KV07CisgICAgICB3aGlsZSAoc3RhY2suaXNOb3RFbXB0eSkgeworICAgICAgICBmaW5hbCBzID0gc3RhY2sucmVtb3ZlTGFzdCgpOworICAgICAgICBmaW5hbCBwID0gcy5wOworICAgICAgICBmaW5hbCBuID0gcy5uOworICAgICAgICBpZiAobi5fcHJlb3JkZXJOdW1iZXIgPT0gbnVsbCkgeworICAgICAgICAgIG4uX3ByZW9yZGVyTnVtYmVyID0gTjsKKyAgICAgICAgICBwcmVvcmRlcltuLl9wcmVvcmRlck51bWJlcl0gPSBuOworICAgICAgICAgIHBhcmVudFtuLl9wcmVvcmRlck51bWJlcl0gPSBwOworCisgICAgICAgICAgZm9yICh2YXIgdyBpbiBuLnN1Y2MpIHsKKyAgICAgICAgICAgIHN0YWNrLmFkZChfRGZzU3RhdGUocDogbi5fcHJlb3JkZXJOdW1iZXIsIG46IHcpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBOKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBkZnMoKTsKKworICAgIGZvciAodmFyIG5vZGUgaW4gbm9kZXMpIHsKKyAgICAgIGlmIChub2RlLl9wcmVvcmRlck51bWJlciA9PSBudWxsKSB7CisgICAgICAgIHByaW50KCcke25vZGV9IGlzIHVucmVhY2hhYmxlJyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVXNlIHRoZSBTRU1JLU5DQSBhbGdvcml0aG0gdG8gY29tcHV0ZSBkb21pbmF0b3JzLiAgVGhpcyBpcyBhIHR3by1wYXNzCisgICAgLy8gdmVyc2lvbiBvZiB0aGUgTGVuZ2F1ZXItVGFyamFuIGFsZ29yaXRobSAoTFQgaXMgbm9ybWFsbHkgdGhyZWUgcGFzc2VzKQorICAgIC8vIHRoYXQgZWxpbWluYXRlcyBhIHBhc3MgYnkgdXNpbmcgbmVhcmVzdC1jb21tb24gYW5jZXN0b3IgKE5DQSkgdG8KKyAgICAvLyBjb21wdXRlIGltbWVkaWF0ZSBkb21pbmF0b3JzIGZyb20gc2VtaWRvbWluYXRvcnMuICBJdCBhbHNvIHJlbW92ZXMgYQorICAgIC8vIGxldmVsIG9mIGluZGlyZWN0aW9uIGluIHRoZSBsaW5rLWV2YWwgZm9yZXN0IGRhdGEgc3RydWN0dXJlLgorICAgIC8vCisgICAgLy8gVGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gR2VvcmdpYWRpcywgVGFyamFuLCBhbmQgV2VybmVjaydzCisgICAgLy8gIkZpbmRpbmcgRG9taW5hdG9ycyBpbiBQcmFjdGljZSIuCisgICAgLy8gU2VlIGh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+cndlcm5lY2svZG9taW5hdG9ycy8gLgorCisgICAgLy8gQWxsIGFycmF5cyBhcmUgbWFwcyBiZXR3ZWVuIHByZW9yZGVyIGJhc2ljLWJsb2NrIG51bWJlcnMuCisgICAgZmluYWwgaWRvbSA9IHBhcmVudC50b0xpc3QoKTsgLy8gSW1tZWRpYXRlIGRvbWluYXRvci4KKyAgICBmaW5hbCBzZW1pID0gTGlzdDxpbnQ+LmdlbmVyYXRlKHNpemUsIChpKSA9PiBpKTsgLy8gU2VtaWRvbWluYXRvci4KKyAgICBmaW5hbCBsYWJlbCA9CisgICAgICAgIExpc3Q8aW50Pi5nZW5lcmF0ZShzaXplLCAoaSkgPT4gaSk7IC8vIExhYmVsIGZvciBsaW5rLWV2YWwgZm9yZXN0LgorCisgICAgdm9pZCBjb21wcmVzc1BhdGgoaW50IHN0YXJ0LCBpbnQgY3VycmVudCkgeworICAgICAgZmluYWwgbmV4dCA9IHBhcmVudFtjdXJyZW50XTsKKyAgICAgIGlmIChuZXh0ID4gc3RhcnQpIHsKKyAgICAgICAgY29tcHJlc3NQYXRoKHN0YXJ0LCBuZXh0KTsKKyAgICAgICAgbGFiZWxbY3VycmVudF0gPSBtYXRoLm1pbihsYWJlbFtjdXJyZW50XSwgbGFiZWxbbmV4dF0pOworICAgICAgICBwYXJlbnRbY3VycmVudF0gPSBwYXJlbnRbbmV4dF07CisgICAgICB9CisgICAgfQorCisgICAgLy8gMS4gRmlyc3QgcGFzczogY29tcHV0ZSBzZW1pZG9taW5hdG9ycyBhcyBpbiBMZW5nYXVlci1UYXJqYW4uCisgICAgLy8gU2VtaWRvbWluYXRvcnMgYXJlIGNvbXB1dGVkIGZyb20gYSBkZXB0aC1maXJzdCBzcGFubmluZyB0cmVlIGFuZCBhcmUgYW4KKyAgICAvLyBhcHByb3hpbWF0aW9uIG9mIGltbWVkaWF0ZSBkb21pbmF0b3JzLgorCisgICAgLy8gVXNlIGEgbGluay1ldmFsIGRhdGEgc3RydWN0dXJlIHdpdGggcGF0aCBjb21wcmVzc2lvbi4gIEltcGxlbWVudCBwYXRoCisgICAgLy8gY29tcHJlc3Npb24gaW4gcGxhY2UgYnkgbXV0YXRpbmcgdGhlIHBhcmVudCBhcnJheS4gIEVhY2ggYmxvY2sgaGFzIGEKKyAgICAvLyBsYWJlbCwgd2hpY2ggaXMgdGhlIG1pbmltdW0gYmxvY2sgbnVtYmVyIG9uIHRoZSBjb21wcmVzc2VkIHBhdGguCisKKyAgICAvLyBMb29wIG92ZXIgdGhlIGJsb2NrcyBpbiByZXZlcnNlIHByZW9yZGVyIChub3QgaW5jbHVkaW5nIHRoZSBncmFwaAorICAgIC8vIGVudHJ5KS4KKyAgICBmb3IgKHZhciBibG9ja19pbmRleCA9IHNpemUgLSAxOyBibG9ja19pbmRleCA+PSAxOyAtLWJsb2NrX2luZGV4KSB7CisgICAgICAvLyBMb29wIG92ZXIgdGhlIHByZWRlY2Vzc29ycy4KKyAgICAgIGZpbmFsIGJsb2NrID0gcHJlb3JkZXJbYmxvY2tfaW5kZXhdOworICAgICAgLy8gQ2xlYXIgdGhlIGltbWVkaWF0ZWx5IGRvbWluYXRlZCBibG9ja3MgaW4gY2FzZSBDb21wdXRlRG9taW5hdG9ycyBpcworICAgICAgLy8gdXNlZCB0byByZWNvbXB1dGUgdGhlbS4KKyAgICAgIGZvciAoZmluYWwgcHJlZCBpbiBibG9jay5wcmVkKSB7CisgICAgICAgIC8vIExvb2sgZm9yIHRoZSBzZW1pZG9taW5hdG9yIGJ5IGFzY2VuZGluZyB0aGUgc2VtaWRvbWluYXRvciBwYXRoCisgICAgICAgIC8vIHN0YXJ0aW5nIGZyb20gcHJlZC4KKyAgICAgICAgZmluYWwgcHJlZF9pbmRleCA9IHByZWQuX3ByZW9yZGVyTnVtYmVyOworICAgICAgICB2YXIgYmVzdCA9IHByZWRfaW5kZXg7CisgICAgICAgIGlmIChwcmVkX2luZGV4ID4gYmxvY2tfaW5kZXgpIHsKKyAgICAgICAgICBjb21wcmVzc1BhdGgoYmxvY2tfaW5kZXgsIHByZWRfaW5kZXgpOworICAgICAgICAgIGJlc3QgPSBsYWJlbFtwcmVkX2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VtaWRvbWluYXRvciBpZiB3ZSd2ZSBmb3VuZCBhIGJldHRlciBvbmUuCisgICAgICAgIHNlbWlbYmxvY2tfaW5kZXhdID0gbWF0aC5taW4oc2VtaVtibG9ja19pbmRleF0sIHNlbWlbYmVzdF0pOworICAgICAgfQorCisgICAgICAvLyBOb3cgdXNlIGxhYmVsIGZvciB0aGUgc2VtaWRvbWluYXRvci4KKyAgICAgIGxhYmVsW2Jsb2NrX2luZGV4XSA9IHNlbWlbYmxvY2tfaW5kZXhdOworICAgIH0KKworICAgIC8vIDIuIENvbXB1dGUgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3JzIGFzIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBvZgorICAgIC8vIHNwYW5uaW5nIHRyZWUgcGFyZW50IGFuZCBzZW1pZG9taW5hdG9yLCBmb3IgYWxsIGJsb2NrcyBleGNlcHQgdGhlIGVudHJ5LgorICAgIGZvciAodmFyIGJsb2NrX2luZGV4ID0gMTsgYmxvY2tfaW5kZXggPCBzaXplOyArK2Jsb2NrX2luZGV4KSB7CisgICAgICB2YXIgZG9tX2luZGV4ID0gaWRvbVtibG9ja19pbmRleF07CisgICAgICB3aGlsZSAoZG9tX2luZGV4ID4gc2VtaVtibG9ja19pbmRleF0pIHsKKyAgICAgICAgZG9tX2luZGV4ID0gaWRvbVtkb21faW5kZXhdOworICAgICAgfQorICAgICAgaWRvbVtibG9ja19pbmRleF0gPSBkb21faW5kZXg7CisgICAgICBwcmVvcmRlcltkb21faW5kZXhdLl9hZGREb21pbmF0ZWRCbG9jayhwcmVvcmRlcltibG9ja19pbmRleF0pOworICAgIH0KKyAgfQorfQorCitjbGFzcyBfRGZzU3RhdGUgeworICBmaW5hbCBpbnQgcDsKKyAgZmluYWwgQ2FsbEdyYXBoTm9kZSBuOworICBfRGZzU3RhdGUoe3RoaXMucCwgdGhpcy5ufSk7Cit9CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIHJlYWRpbmcgYC0tdHJhY2UtcHJlY29tcGlsZXItdG9gIG91dHB1dC4KKy8vLworLy8vIFNlZSBSRUFETUUubWQgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuCitjbGFzcyBfVHJhY2VSZWFkZXIgeworICBmaW5hbCBMaXN0PE9iamVjdD4gdHJhY2U7CisgIGZpbmFsIExpc3Q8T2JqZWN0PiBzdHJpbmdzOworICBmaW5hbCBMaXN0PE9iamVjdD4gZW50aXRpZXM7CisKKyAgZmluYWwgcHJvZ3JhbSA9IFByb2dyYW1JbmZvKCk7CisKKyAgLy8vIE1hcHBpbmcgYmV0d2VlbiBlbnRpdHkgaWRzIGFuZCBjb3JyZXNwb25kaW5nIFtQcm9ncmFtSW5mb05vZGVdIG5vZGVzLgorICBmaW5hbCBlbnRpdHlCeUlkID0gTGlzdDxQcm9ncmFtSW5mb05vZGU+LmZpbGxlZCgxMDI0LCBudWxsLCBncm93YWJsZTogdHJ1ZSk7CisKKyAgLy8vIE1hcHBpbmcgYmV0d2VlbiBmdW5jdGlvbnMgKHJlcHJlc2VudGVkIGFzIFtQcm9ncmFtSW5mb05vZGVdcykgYW5kCisgIC8vLyB0aGVpciBzZWxlY3RvciBpZHMuCisgIGZpbmFsIHNlbGVjdG9ySWRNYXAgPSA8UHJvZ3JhbUluZm9Ob2RlLCBpbnQ+e307CisKKyAgLy8vIFNldCBvZiBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIHJlYWNoZWQgdGhyb3VnaCBkeW5hbWljIGRpc3BhdGNoLgorICBmaW5hbCBkeW5hbWljRnVuY3Rpb25zID0gU2V0PFByb2dyYW1JbmZvTm9kZT4oKTsKKworICBfVHJhY2VSZWFkZXIoTWFwPFN0cmluZywgZHluYW1pYz4gZGF0YSkKKyAgICAgIDogc3RyaW5ncyA9IGRhdGFbJ3N0cmluZ3MnXSwKKyAgICAgICAgZW50aXRpZXMgPSBkYXRhWydlbnRpdGllcyddLAorICAgICAgICB0cmFjZSA9IGRhdGFbJ3RyYWNlJ107CisKKyAgLy8vIFJlYWQgYWxsIHRyYWNlIGV2ZW50cyBhbmQgY29uc3RydWN0IHRoZSBjYWxsIGdyYXBoIGJhc2VkIG9uIHRoZW0uCisgIENhbGxHcmFwaCByZWFkVHJhY2UoKSB7CisgICAgdmFyIHBvcyA9IDA7IC8vIFBvc2l0aW9uIGluIHRoZSBbdHJhY2VdIGFycmF5LgorICAgIENhbGxHcmFwaE5vZGUgY3VycmVudE5vZGU7CisKKyAgICBmaW5hbCBub2RlcyA9IDxDYWxsR3JhcGhOb2RlPltdOworICAgIGZpbmFsIG5vZGVCeUVudGl0eUlkID0gPENhbGxHcmFwaE5vZGU+W107CisgICAgZmluYWwgY2FsbE5vZGVzQnlTZWxlY3RvciA9IDxkeW5hbWljLCBDYWxsR3JhcGhOb2RlPnt9OworICAgIGZpbmFsIGFsbG9jYXRlZCA9IFNldDxQcm9ncmFtSW5mb05vZGU+KCk7CisKKyAgICBPYmplY3QgbmV4dCgpID0+IHRyYWNlW3BvcysrXTsKKworICAgIENhbGxHcmFwaE5vZGUgbWFrZU5vZGUoe2R5bmFtaWMgZGF0YX0pIHsKKyAgICAgIGZpbmFsIG4gPSBDYWxsR3JhcGhOb2RlKG5vZGVzLmxlbmd0aCwgZGF0YTogZGF0YSk7CisgICAgICBub2Rlcy5hZGQobik7CisgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBDYWxsR3JhcGhOb2RlIG1ha2VDYWxsTm9kZShkeW5hbWljIHNlbGVjdG9yKSA9PiBjYWxsTm9kZXNCeVNlbGVjdG9yCisgICAgICAgIC5wdXRJZkFic2VudChzZWxlY3RvciwgKCkgPT4gbWFrZU5vZGUoZGF0YTogc2VsZWN0b3IpKTsKKworICAgIENhbGxHcmFwaE5vZGUgbm9kZUZvcihQcm9ncmFtSW5mb05vZGUgbikgeworICAgICAgaWYgKG5vZGVCeUVudGl0eUlkLmxlbmd0aCA8PSBuLmlkKSB7CisgICAgICAgIG5vZGVCeUVudGl0eUlkLmxlbmd0aCA9IG4uaWQgKiAyICsgMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBub2RlQnlFbnRpdHlJZFtuLmlkXSA/Pz0gbWFrZU5vZGUoZGF0YTogbik7CisgICAgfQorCisgICAgdm9pZCByZWNvcmREeW5hbWljQ2FsbChTdHJpbmcgc2VsZWN0b3IpIHsKKyAgICAgIGN1cnJlbnROb2RlLmNvbm5lY3RUbyhtYWtlQ2FsbE5vZGUoc2VsZWN0b3IpKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY29yZEludGVyZmFjZUNhbGwoaW50IHNlbGVjdG9yKSB7CisgICAgICBjdXJyZW50Tm9kZS5jb25uZWN0VG8obWFrZUNhbGxOb2RlKHNlbGVjdG9yKSk7CisgICAgfQorCisgICAgdm9pZCByZWNvcmRTdGF0aWNDYWxsKFByb2dyYW1JbmZvTm9kZSB0bykgeworICAgICAgY3VycmVudE5vZGUuY29ubmVjdFRvKG5vZGVGb3IodG8pKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY29yZEZpZWxkUmVmKFByb2dyYW1JbmZvTm9kZSBmaWVsZCkgeworICAgICAgY3VycmVudE5vZGUuY29ubmVjdFRvKG5vZGVGb3IoZmllbGQpKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY29yZEFsbG9jYXRpb24oUHJvZ3JhbUluZm9Ob2RlIGNscykgeworICAgICAgY3VycmVudE5vZGUuY29ubmVjdFRvKG5vZGVGb3IoY2xzKSk7CisgICAgICBhbGxvY2F0ZWQuYWRkKGNscyk7CisgICAgfQorCisgICAgYm9vbCByZWFkUmVmKCkgeworICAgICAgZmluYWwgcmVmID0gbmV4dCgpOworICAgICAgaWYgKHJlZiBpcyBpbnQpIHsKKyAgICAgICAgZmluYWwgZW50aXR5ID0gZ2V0RW50aXR5QXQocmVmKTsKKyAgICAgICAgaWYgKGVudGl0eS50eXBlID09IE5vZGVUeXBlLmNsYXNzTm9kZSkgeworICAgICAgICAgIHJlY29yZEFsbG9jYXRpb24oZW50aXR5KTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRpdHkudHlwZSA9PSBOb2RlVHlwZS5mdW5jdGlvbk5vZGUpIHsKKyAgICAgICAgICByZWNvcmRTdGF0aWNDYWxsKGVudGl0eSk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50aXR5LnR5cGUgPT0gTm9kZVR5cGUub3RoZXIpIHsKKyAgICAgICAgICByZWNvcmRGaWVsZFJlZihlbnRpdHkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHJlZiA9PSAnUycpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdG9yID0gc3RyaW5nc1tuZXh0KCldOworICAgICAgICByZWNvcmREeW5hbWljQ2FsbChzZWxlY3Rvcik7CisgICAgICB9IGVsc2UgaWYgKHJlZiA9PSAnVCcpIHsKKyAgICAgICAgcmVjb3JkSW50ZXJmYWNlQ2FsbChuZXh0KCkpOworICAgICAgfSBlbHNlIGlmIChyZWYgPT0gJ0MnIHx8IHJlZiA9PSAnRScpIHsKKyAgICAgICAgcG9zLS07CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IEZvcm1hdEV4Y2VwdGlvbigndW5leHBlY3RlZCByZWY6ICR7cmVmfScpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCByZWFkUmVmcygpIHsKKyAgICAgIHdoaWxlIChyZWFkUmVmKCkpIHt9CisgICAgfQorCisgICAgdm9pZCByZWFkRXZlbnRzKCkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmluYWwgb3AgPSBuZXh0KCk7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICBjYXNlICdFJzogLy8gRW5kLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGNhc2UgJ1InOiAvLyBSb290cy4KKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbm9kZUZvcihwcm9ncmFtLnJvb3QpOworICAgICAgICAgICAgcmVhZFJlZnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0MnOiAvLyBGdW5jdGlvbiBjb21waWxhdGlvbi4KKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbm9kZUZvcihnZXRFbnRpdHlBdChuZXh0KCkpKTsKKyAgICAgICAgICAgIHJlYWRSZWZzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCdVbmtub3duIGV2ZW50OiAke29wfSBhdCAke3BvcyAtIDF9Jyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkRXZlbnRzKCk7CisKKyAgICAvLyBGaW5hbGx5IGNvbm5lY3Qgbm9kZXMgcmVwcmVzZW50aW5nIGR5bmFtaWMgYW5kIGRpc3BhdGNoIHRhYmxlIGNhbGxzCisgICAgLy8gdG8gdGhlaXIgcG90ZW50aWFsIHRhcmdldHMuCisgICAgZm9yICh2YXIgY2xzIGluIGFsbG9jYXRlZCkgeworICAgICAgZm9yICh2YXIgZnVuIGluIGNscy5jaGlsZHJlbi52YWx1ZXMud2hlcmUoZHluYW1pY0Z1bmN0aW9ucy5jb250YWlucykpIHsKKyAgICAgICAgZmluYWwgZnVuTm9kZSA9IG5vZGVGb3IoZnVuKTsKKworICAgICAgICBjYWxsTm9kZXNCeVNlbGVjdG9yW3NlbGVjdG9ySWRNYXBbZnVuXV0/LmNvbm5lY3RUbyhmdW5Ob2RlKTsKKworICAgICAgICBmaW5hbCBuYW1lID0gZnVuLm5hbWU7CisgICAgICAgIGNhbGxOb2Rlc0J5U2VsZWN0b3JbbmFtZV0/LmNvbm5lY3RUbyhmdW5Ob2RlKTsKKworICAgICAgICBjb25zdCBkeW5QcmVmaXggPSAnZHluOic7CisgICAgICAgIGNvbnN0IGdldHRlclByZWZpeCA9ICdnZXQ6JzsKKyAgICAgICAgY29uc3QgZXh0cmFjdG9yUHJlZml4ID0gJ1t0ZWFyLW9mZi1leHRyYWN0b3JdICc7CisKKyAgICAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoZHluUHJlZml4KSkgeworICAgICAgICAgIC8vIE5vcm1hbCBtZXRob2RzIGNhbiBiZSBoaXQgYnkgZHluOiBzZWxlY3RvcnMgaWYgdGhlIGNsYXNzCisgICAgICAgICAgLy8gZG9lcyBub3QgY29udGFpbiBhIGRlZGljYXRlZCBkeW46IGZvcndhcmRlciBmb3IgdGhpcyBuYW1lLgorICAgICAgICAgIGlmICghY2xzLmNoaWxkcmVuLmNvbnRhaW5zS2V5KCckZHluUHJlZml4JG5hbWUnKSkgeworICAgICAgICAgICAgY2FsbE5vZGVzQnlTZWxlY3RvclsnJGR5blByZWZpeCRuYW1lJ10/LmNvbm5lY3RUbyhmdW5Ob2RlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGdldHRlclByZWZpeCkpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZSBwb3RlbnRpYWwgY2FsbHMgdGhyb3VnaCBnZXR0ZXJzOiBnZXR0ZXIgZ2V0OmZvbyBjYW4gYmUKKyAgICAgICAgICAgIC8vIGhpdCBieSBkeW46Zm9vIGFuZCBmb28gc2VsZWN0b3JzLgorICAgICAgICAgICAgZmluYWwgdGFyZ2V0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKGdldHRlclByZWZpeC5sZW5ndGgpOworICAgICAgICAgICAgY2FsbE5vZGVzQnlTZWxlY3Rvclt0YXJnZXROYW1lXT8uY29ubmVjdFRvKGZ1bk5vZGUpOworICAgICAgICAgICAgY2FsbE5vZGVzQnlTZWxlY3RvclsnJGR5blByZWZpeCR0YXJnZXROYW1lJ10/LmNvbm5lY3RUbyhmdW5Ob2RlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChleHRyYWN0b3JQcmVmaXgpKSB7CisgICAgICAgICAgICAvLyBIYW5kbGUgbWV0aG9kIHRlYXItb2ZmOiBbdGVhci1vZmYtZXh0cmFjdG9yXSBnZXQ6Zm9vIGlzIGhpdAorICAgICAgICAgICAgLy8gYnkgZ2V0OmZvby4KKyAgICAgICAgICAgIGNhbGxOb2Rlc0J5U2VsZWN0b3JbbmFtZS5zdWJzdHJpbmcoZXh0cmFjdG9yUHJlZml4Lmxlbmd0aCldCisgICAgICAgICAgICAgICAgPy5jb25uZWN0VG8oZnVuTm9kZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENhbGxHcmFwaC5fKHByb2dyYW0sIG5vZGVzLCBub2RlQnlFbnRpdHlJZCk7CisgIH0KKworICAvLy8gUmV0dXJuIFtQcm9ncmFtSW5mb05vZGVdIHJlcHJlc2VudGluZyB0aGUgZW50aXR5IHdpdGggdGhlIGdpdmVuIFtpZF0uCisgIFByb2dyYW1JbmZvTm9kZSBnZXRFbnRpdHlBdChpbnQgaWQpIHsKKyAgICBpZiAoZW50aXR5QnlJZC5sZW5ndGggPD0gaWQpIHsKKyAgICAgIGVudGl0eUJ5SWQubGVuZ3RoID0gaWQgKiAyOworICAgIH0KKworICAgIC8vIEVudGl0eSByZWNvcmRzIGhhdmUgZml4ZWQgc2l6ZSB3aGljaCBhbGxvd3MgdXMgdG8gcGVyZm9ybSByYW5kb20gYWNjZXNzLgorICAgIGNvbnN0IGVsZW1lbnRzUGVyRW50aXR5ID0gNDsKKyAgICByZXR1cm4gZW50aXR5QnlJZFtpZF0gPz89IHJlYWRFbnRpdHlBdChpZCAqIGVsZW1lbnRzUGVyRW50aXR5KTsKKyAgfQorCisgIC8vLyBSZWFkIHRoZSBlbnRpdHkgYXQgdGhlIGdpdmVuIFtpbmRleF0gaW4gW2VudGl0aWVzXS4KKyAgUHJvZ3JhbUluZm9Ob2RlIHJlYWRFbnRpdHlBdChpbnQgaW5kZXgpIHsKKyAgICBmaW5hbCB0eXBlID0gZW50aXRpZXNbaW5kZXhdOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSAnQyc6IC8vIENsYXNzOiAnQycsIDxsaWJyYXJ5LXVyaS1pZHg+LCA8bmFtZS1pZHg+LCAwCisgICAgICAgIGZpbmFsIGxpYnJhcnlVcmkgPSBzdHJpbmdzW2VudGl0aWVzW2luZGV4ICsgMV1dOworICAgICAgICBmaW5hbCBjbGFzc05hbWUgPSBzdHJpbmdzW2VudGl0aWVzW2luZGV4ICsgMl1dOworCisgICAgICAgIHJldHVybiBwcm9ncmFtLm1ha2VOb2RlKAorICAgICAgICAgICAgbmFtZTogY2xhc3NOYW1lLAorICAgICAgICAgICAgcGFyZW50OiBnZXRMaWJyYXJ5Tm9kZShsaWJyYXJ5VXJpKSwKKyAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLmNsYXNzTm9kZSk7CisKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgY2FzZSAnRic6IC8vIEZ1bmN0aW9uOiAnRid8J1MnLCA8Y2xhc3MtaWR4PiwgPG5hbWUtaWR4PiwgPHNlbGVjdG9yLWlkPgorICAgICAgICBmaW5hbCBjbGFzc05vZGUgPSBnZXRFbnRpdHlBdChlbnRpdGllc1tpbmRleCArIDFdKTsKKyAgICAgICAgZmluYWwgZnVuY3Rpb25OYW1lID0gc3RyaW5nc1tlbnRpdGllc1tpbmRleCArIDJdXTsKKyAgICAgICAgZmluYWwgaW50IHNlbGVjdG9ySWQgPSBlbnRpdGllc1tpbmRleCArIDNdOworCisgICAgICAgIGZpbmFsIHBhdGggPSBOYW1lKGZ1bmN0aW9uTmFtZSkucmF3Q29tcG9uZW50czsKKyAgICAgICAgaWYgKHBhdGgubGFzdCA9PSAnRmZpVHJhbXBvbGluZScpIHsKKyAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPSAnJHtwYXRoLmxhc3R9QCRpbmRleCc7CisgICAgICAgIH0KKyAgICAgICAgdmFyIG5vZGUgPSBwcm9ncmFtLm1ha2VOb2RlKAorICAgICAgICAgICAgbmFtZTogcGF0aC5maXJzdCwgcGFyZW50OiBjbGFzc05vZGUsIHR5cGU6IE5vZGVUeXBlLmZ1bmN0aW9uTm9kZSk7CisgICAgICAgIGZvciAodmFyIG5hbWUgaW4gcGF0aC5za2lwKDEpKSB7CisgICAgICAgICAgbm9kZSA9IHByb2dyYW0ubWFrZU5vZGUoCisgICAgICAgICAgICAgIG5hbWU6IG5hbWUsIHBhcmVudDogbm9kZSwgdHlwZTogTm9kZVR5cGUuZnVuY3Rpb25Ob2RlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0b3JJZCA+PSAwKSB7CisgICAgICAgICAgc2VsZWN0b3JJZE1hcFtub2RlXSA9IHNlbGVjdG9ySWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gJ0YnKSB7CisgICAgICAgICAgZHluYW1pY0Z1bmN0aW9ucy5hZGQobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGU7CisKKyAgICAgIGNhc2UgJ1YnOiAvLyBGaWVsZDogJ1YnLCA8Y2xhc3MtaWR4PiwgPG5hbWUtaWR4PiwgMAorICAgICAgICBmaW5hbCBjbGFzc05vZGUgPSBnZXRFbnRpdHlBdChlbnRpdGllc1tpbmRleCArIDFdKTsKKyAgICAgICAgZmluYWwgZmllbGROYW1lID0gc3RyaW5nc1tlbnRpdGllc1tpbmRleCArIDJdXTsKKworICAgICAgICByZXR1cm4gcHJvZ3JhbS5tYWtlTm9kZSgKKyAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZSwgcGFyZW50OiBjbGFzc05vZGUsIHR5cGU6IE5vZGVUeXBlLm90aGVyKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKCd1bnJlY29nbml6ZWQgZW50aXR5IHR5cGUgJHt0eXBlfScpOworICAgIH0KKyAgfQorCisgIFByb2dyYW1JbmZvTm9kZSBnZXRMaWJyYXJ5Tm9kZShTdHJpbmcgbGlicmFyeVVyaSkgeworICAgIGZpbmFsIHBhY2thZ2UgPSBwYWNrYWdlT2YobGlicmFyeVVyaSk7CisgICAgdmFyIG5vZGUgPSBwcm9ncmFtLnJvb3Q7CisgICAgaWYgKHBhY2thZ2UgIT0gbGlicmFyeVVyaSkgeworICAgICAgbm9kZSA9IHByb2dyYW0ubWFrZU5vZGUoCisgICAgICAgICAgbmFtZTogcGFja2FnZSwgcGFyZW50OiBub2RlLCB0eXBlOiBOb2RlVHlwZS5wYWNrYWdlTm9kZSk7CisgICAgfQorICAgIHJldHVybiBwcm9ncmFtLm1ha2VOb2RlKAorICAgICAgICBuYW1lOiBsaWJyYXJ5VXJpLCBwYXJlbnQ6IG5vZGUsIHR5cGU6IE5vZGVUeXBlLmxpYnJhcnlOb2RlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9wcm9ncmFtX2luZm8uZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvcHJvZ3JhbV9pbmZvLmRhcnQKaW5kZXggNzhhNGU4Ny4uYzEzOWYwMiAxMDA2NDQKLS0tIGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9wcm9ncmFtX2luZm8uZGFydAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3Byb2dyYW1faW5mby5kYXJ0CkBAIC04OCwxNyArODgsMjMgQEAKICAgICByZWN1cnNlKHJvb3QpOwogICB9CiAKLSAgaW50IGdldCB0b3RhbFNpemUgewotICAgIHZhciByZXN1bHQgPSAwOwotICAgIHZpc2l0KChwa2csIGxpYiwgY2xzLCBmdW4sIG5vZGUpIHsKLSAgICAgIHJlc3VsdCArPSBub2RlLnNpemUgPz8gMDsKLSAgICB9KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9CisgIC8vLyBUb3RhbCBzaXplIG9mIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHByb2dyYW0uCisgIGludCBnZXQgdG90YWxTaXplID0+IHJvb3QudG90YWxTaXplOwogCiAgIC8vLyBDb252ZXJ0IHRoaXMgcHJvZ3JhbSBpbmZvIHRvIGEgSlNPTiBtYXAgdXNpbmcgW2luZm9Ub0pzb25dIHRvIGNvbnZlcnQKICAgLy8vIGRhdGEgYXR0YWNoZWQgdG8gbm9kZXMgaW50byBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4KICAgTWFwPFN0cmluZywgZHluYW1pYz4gdG9Kc29uKCkgPT4gcm9vdC50b0pzb24oKTsKKworICAvLy8gTG9va3VwIGEgbm9kZSBpbiB0aGUgcHJvZ3JhbSBnaXZlbiBhIHBhdGggdG8gaXQuCisgIFByb2dyYW1JbmZvTm9kZSBsb29rdXAoTGlzdDxTdHJpbmc+IHBhdGgpIHsKKyAgICB2YXIgbiA9IHJvb3Q7CisgICAgZm9yICh2YXIgcCBpbiBwYXRoKSB7CisgICAgICBpZiAoKG4gPSBuLmNoaWxkcmVuW3BdKSA9PSBudWxsKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKKyAgfQogfQogCiBlbnVtIE5vZGVUeXBlIHsKQEAgLTExNCw2ICsxMjAsNyBAQAogICAgICAgTm9kZVR5cGUubGlicmFyeU5vZGU6ICdsaWJyYXJ5JywKICAgICAgIE5vZGVUeXBlLmNsYXNzTm9kZTogJ2NsYXNzJywKICAgICAgIE5vZGVUeXBlLmZ1bmN0aW9uTm9kZTogJ2Z1bmN0aW9uJywKKyAgICAgIE5vZGVUeXBlLm90aGVyOiAnb3RoZXInLAogICAgIH1bdHlwZV07CiAKIGNsYXNzIFByb2dyYW1JbmZvTm9kZSB7CkBAIC0xNjEsNiArMTY4LDQ2IEBACiAgICAgICAgIGlmIChjaGlsZHJlbi5pc05vdEVtcHR5KQogICAgICAgICAgIGZvciAodmFyIGNsbyBpbiBjaGlsZHJlbi5lbnRyaWVzKSBjbG8ua2V5OiBjbG8udmFsdWUudG9Kc29uKCkKICAgICAgIH07CisKKyAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBub2RlIHByZWZpeGVkIGJ5IHRoZSBbcXVhbGlmaWVkTmFtZV0gb2YgaXRzCisgIC8vLyBbcGFyZW50XS4KKyAgU3RyaW5nIGdldCBxdWFsaWZpZWROYW1lIHsKKyAgICB2YXIgcHJlZml4ID0gJyc7CisgICAgLy8gRG8gbm90IGluY2x1ZGUgcm9vdCBuYW1lIG9yIHBhY2thZ2UgbmFtZSAobGlicmFyeSB1cmkgYWxyZWFkeSBjb250YWlucworICAgIC8vIHBhY2thZ2UgbmFtZSkuCisgICAgaWYgKHBhcmVudD8ucGFyZW50ICE9IG51bGwgJiYgcGFyZW50Py50eXBlICE9IE5vZGVUeXBlLnBhY2thZ2VOb2RlKSB7CisgICAgICBwcmVmaXggPSBwYXJlbnQucXVhbGlmaWVkTmFtZTsKKyAgICAgIGlmIChwYXJlbnQudHlwZSAhPSBOb2RlVHlwZS5saWJyYXJ5Tm9kZSkgeworICAgICAgICBwcmVmaXggKz0gJy4nOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZml4ICs9ICc6Oic7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAnJHByZWZpeCRuYW1lJzsKKyAgfQorCisgIEBvdmVycmlkZQorICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICcke190eXBlVG9Kc29uKHR5cGUpfSAke3F1YWxpZmllZE5hbWV9JzsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHBhdGggdG8gdGhpcyBub2RlIHN1Y2ggdGhhdCBbUHJvZ3JhbUluZm8ubG9va3VwXSB3b3VsZCByZXR1cm4KKyAgLy8vIHRoaXMgbm9kZSBnaXZlbiBpdHMgW3BhdGhdLgorICBMaXN0PFN0cmluZz4gZ2V0IHBhdGggeworICAgIGZpbmFsIHJlc3VsdCA9IDxTdHJpbmc+W107CisgICAgdmFyIG4gPSB0aGlzOworICAgIHdoaWxlIChuLnBhcmVudCAhPSBudWxsKSB7CisgICAgICByZXN1bHQuYWRkKG4ubmFtZSk7CisgICAgICBuID0gbi5wYXJlbnQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQucmV2ZXJzZWQudG9MaXN0KCk7CisgIH0KKworICAvLy8gQ3VtdWxhdGl2ZSBzaXplIG9mIHRoaXMgbm9kZSBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbi4KKyAgaW50IGdldCB0b3RhbFNpemUgeworICAgIHJldHVybiAoc2l6ZSA/PyAwKSArCisgICAgICAgIGNoaWxkcmVuLnZhbHVlcy5mb2xkPGludD4oMCwgKHMsIG4pID0+IHMgKyBuLnRvdGFsU2l6ZSk7CisgIH0KIH0KIAogLy8vIENvbXB1dGVzIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gW1Byb2dyYW1JbmZvXS4KQEAgLTIzOSw2ICsyODYsMTQgQEAKIAogICAgIHJldHVybiBIaXN0b2dyYW0uXyhidWNrZXRJbmZvLCBidWNrZXRzKTsKICAgfQorCisgIC8vLyBSZWJ1Y2tldHMgdGhlIGhpc3RvZ3JhbSBnaXZlbiB0aGUgbmV3IGJ1Y2tldGluZyBydWxlLgorICBIaXN0b2dyYW0gbWFwKFN0cmluZyBGdW5jdGlvbihTdHJpbmcpIGJ1Y2tldEZvcikgeworICAgIHJldHVybiBIaXN0b2dyYW0uZnJvbUl0ZXJhYmxlKGJ1Y2tldHMua2V5cywKKyAgICAgICAgc2l6ZU9mOiAoa2V5KSA9PiBidWNrZXRzW2tleV0sCisgICAgICAgIGJ1Y2tldEZvcjogYnVja2V0Rm9yLAorICAgICAgICBidWNrZXRJbmZvOiBidWNrZXRJbmZvKTsKKyAgfQogfQogCiAvLy8gQ29uc3RydWN0IHRoZSBoaXN0b2dyYW0gb2Ygc3BlY2lmaWMgW3R5cGVdIGdpdmVuIGEgW1Byb2dyYW1JbmZvXS4KQEAgLTI4MCwxMSArMzM1LDEwIEBACiAgICAgICBpZiAobm9kZS5zaXplID09IG51bGwgfHwgbm9kZS5zaXplID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQotCi0gICAgICBmaW5hbCBidWNrZXQgPSBidWNrZXRpbmcuYnVja2V0Rm9yKHBrZywgbGliLCBjbHMsIGZ1bik7CiAgICAgICBpZiAoIW1hdGNoZXNGaWx0ZXIobGliLCBjbHMsIGZ1bikpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQorICAgICAgZmluYWwgYnVja2V0ID0gYnVja2V0aW5nLmJ1Y2tldEZvcihwa2csIGxpYiwgY2xzLCBmdW4pOwogICAgICAgYnVja2V0c1tidWNrZXRdID0gKGJ1Y2tldHNbYnVja2V0XSA/PyAwKSArIG5vZGUuc2l6ZTsKICAgICB9KTsKIApkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9zcmMvY29tbWFuZHMvZXhwbGFpbi5kYXJ0IGIvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9zcmMvY29tbWFuZHMvZXhwbGFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODg2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3NyYy9jb21tYW5kcy9leHBsYWluLmRhcnQKQEAgLTAsMCArMSwxMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8vIFRoaXMgY29tbWFuZCBhbGxvd3MgdG8gaW5zcGVjdCBpbmZvcm1hdGlvbiB3cml0dGVuIGludG8gdGhlCisvLy8gcHJlY29tcGlsZXIgdHJhY2UgKGAtLXRyYWNlLXByZWNvbXBpbGVyLXRvYCBvdXRwdXQpLgorbGlicmFyeSB2bV9zbmFwc2hvdF9hbmFseXNpcy5leHBsYWluOworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9jb21tYW5kX3J1bm5lci5kYXJ0JzsKKworaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL25hbWUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJlY29tcGlsZXJfdHJhY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJvZ3JhbV9pbmZvLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3V0aWxzLmRhcnQnOworCitjbGFzcyBFeHBsYWluQ29tbWFuZCBleHRlbmRzIENvbW1hbmQ8dm9pZD4geworICBAb3ZlcnJpZGUKKyAgZmluYWwgbmFtZSA9ICdleHBsYWluJzsKKworICBAb3ZlcnJpZGUKKyAgZmluYWwgZGVzY3JpcHRpb24gPSAnJycKK0V4cGxhaW4gd2h5IGNlcnRhaW4gbWV0aG9kcyB3ZXJlIHB1bGxlZCBpbnRvIHRoZSBiaW5hcnkuCisnJyc7CisKKyAgRXhwbGFpbkNvbW1hbmQoKSB7CisgICAgYWRkU3ViY29tbWFuZChFeHBsYWluRHluYW1pY0NhbGxzQ29tbWFuZCgpKTsKKyAgfQorfQorCisvLy8gR2VuZXJhdGVzIGEgc3VtbWFyeSByZXBvcnQgYWJvdXQgZHluYW1pYyBjYWxscyBzb3J0ZWQgYnkgYXBwcm94aW1hdGlvbgorLy8vIG9mIHRoZWlyIHJldGFpbmVkIHNpemUsIGkuZS4gdGhlIGFtb3VudCBvZiBieXRlcyB0aGVzZSBjYWxscyBhcmUgcHVsbGluZworLy8vIGludG8gdGhlIHNuYXBzaG90LgorY2xhc3MgRXhwbGFpbkR5bmFtaWNDYWxsc0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kPHZvaWQ+IHsKKyAgQG92ZXJyaWRlCisgIGZpbmFsIG5hbWUgPSAnZHluYW1pYy1jYWxscyc7CisKKyAgQG92ZXJyaWRlCisgIGZpbmFsIGRlc2NyaXB0aW9uID0gJycnCitUaGlzIGNvbW1hbmQgZXhwbGFpbnMgaW1wYWN0IG9mIHRoZSBkeW5hbWljIGNhbGxzIG9uIHRoZSBiaW5hcnkgc2l6ZS4KKworSXQgbmVlZHMgQU9UIHNuYXBzaG90IHNpemUgcHJvZmlsZSAoYW4gb3V0cHV0IG9mIGVpdGhlcgorLS13cml0ZS12OC1zbmFwc2hvdC1wcm9maWxlLXRvIG9yIC0tcHJpbnQtaW5zdHJ1Y3Rpb25zLXNpemVzLXRvIGZsYWdzKSBhbmQKK3ByZWNvbXBpbGVyIHRyYWNlIChhbiBvdXRwdXQgb2YgLS10cmFjZS1wcmVjb21waWxlci10byBmbGFnKS4KKycnJzsKKworICBFeHBsYWluQ29tbWFuZCgpIHt9CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZTx2b2lkPiBydW4oKSBhc3luYyB7CisgICAgZmluYWwgc2l6ZXNKc29uID0gRmlsZShhcmdSZXN1bHRzLnJlc3RbMF0pOworICAgIGlmICghc2l6ZXNKc29uLmV4aXN0c1N5bmMoKSkgeworICAgICAgdXNhZ2VFeGNlcHRpb24oJ1NpemUgcHJvZmlsZSAke3NpemVzSnNvbi5wYXRofSBkb2VzIG5vdCBleGlzdCEnKTsKKyAgICB9CisKKyAgICBmaW5hbCB0cmFjZUpzb24gPSBGaWxlKGFyZ1Jlc3VsdHMucmVzdFsxXSk7CisgICAgaWYgKCF0cmFjZUpzb24uZXhpc3RzU3luYygpKSB7CisgICAgICB1c2FnZUV4Y2VwdGlvbignU2l6ZSBwcm9maWxlICR7dHJhY2VKc29uLnBhdGh9IGRvZXMgbm90IGV4aXN0IScpOworICAgIH0KKworICAgIGZpbmFsIGNhbGxHcmFwaCA9IGF3YWl0IGxvYWRUcmFjZSh0cmFjZUpzb24pOworICAgIGNhbGxHcmFwaC5jb21wdXRlRG9taW5hdG9ycygpOworCisgICAgZmluYWwgcHJvZ3JhbUluZm8gPSBhd2FpdCBsb2FkUHJvZ3JhbUluZm8oc2l6ZXNKc29uKTsKKworICAgIGZpbmFsIGhpc3RvZ3JhbSA9IEhpc3RvZ3JhbS5mcm9tSXRlcmFibGU8Q2FsbEdyYXBoTm9kZT4oCisgICAgICAgIGNhbGxHcmFwaC5keW5hbWljQ2FsbHMsIHNpemVPZjogKGR5bmFtaWNDYWxsKSB7CisgICAgICAvLyBDb21wdXRlIGFwcHJveGltYXRlIHJldGFpbmVkIHNpemUgYnkgdHJhdmVyc2luZyB0aGUgZG9taW5hdG9yIHRyZWUKKyAgICAgIC8vIGFuZCBjb25zdWx0aW5nIHNuYXBzaG90IHByb2ZpbGUuCisgICAgICB2YXIgdG90YWxTaXplID0gMDsKKyAgICAgIGR5bmFtaWNDYWxsLnZpc2l0RG9taW5hdG9yVHJlZSgocmV0YWluZWQsIGRlcHRoKSB7CisgICAgICAgIGlmIChyZXRhaW5lZC5pc0Z1bmN0aW9uTm9kZSkgeworICAgICAgICAgIC8vIE5vdGUgdGhhdCBjYWxsIGdyYXBoIGtlZXBzIHByaXZhdGUgbGlicmFyeSBrZXlzIGludGFjdCBpbiB0aGUKKyAgICAgICAgICAvLyBuYW1lcyAoYmVjYXVzZSB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGR5bmFtaWMgaW52b2NhdGlvbnMKKyAgICAgICAgICAvLyB0aHJvdWdoIHdpdGggdGhlIHNhbWUgcHJpdmF0ZSBuYW1lIGluIGRpZmZlcmVudCBsaWJyYXJpZXMpLgorICAgICAgICAgIC8vIFNvIHdlIG5lZWQgdG8gc2NydWIgdGhlIHBhdGggYmVmb3JlIHdlIGxvb2t1cCBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICAgICAgICAvLyBwcm9maWxlLgorICAgICAgICAgIGZpbmFsIHBhdGggPSAocmV0YWluZWQuZGF0YSBhcyBQcm9ncmFtSW5mb05vZGUpCisgICAgICAgICAgICAgIC5wYXRoCisgICAgICAgICAgICAgIC5tYXAoKG4pID0+IE5hbWUobikuc2NydWJiZWQpCisgICAgICAgICAgICAgIC50b0xpc3QoKTsKKyAgICAgICAgICBpZiAocGF0aC5sYXN0LnN0YXJ0c1dpdGgoJ1t0ZWFyLW9mZl0gJykpIHsKKyAgICAgICAgICAgIC8vIFRlYXItb2ZmIGZvcndhcmRlciBpcyBwbGFjZWQgaW50byB0aGUgZnVuY3Rpb24gdGhhdCBpcyB0b3JuIHNvCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNsaWdodGx5IHR3ZWFrIHRoZSBwYXRoIHRvIGJlIGFibGUgdG8gZmluZCBpdC4KKyAgICAgICAgICAgIHBhdGguaW5zZXJ0KAorICAgICAgICAgICAgICAgIHBhdGgubGVuZ3RoIC0gMSwgcGF0aC5sYXN0LnJlcGxhY2VBbGwoJ1t0ZWFyLW9mZl0gJywgJycpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmluYWwgcmV0YWluZWRTaXplID0gcHJvZ3JhbUluZm8ubG9va3VwKHBhdGgpOworICAgICAgICAgIHRvdGFsU2l6ZSArPSAocmV0YWluZWRTaXplPy50b3RhbFNpemUgPz8gMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9KTsKKyAgICAgIHJldHVybiB0b3RhbFNpemU7CisgICAgfSwgYnVja2V0Rm9yOiAobikgeworICAgICAgcmV0dXJuIChuLmRhdGEgYXMgU3RyaW5nKS5yZXBsYWNlQWxsKCdkeW46JywgJycpOworICAgIH0sIGJ1Y2tldEluZm86IEJ1Y2tldEluZm8obmFtZUNvbXBvbmVudHM6IFsnU2VsZWN0b3InXSkpOworCisgICAgcHJpbnRIaXN0b2dyYW0ocHJvZ3JhbUluZm8sIGhpc3RvZ3JhbSwKKyAgICAgICAgcHJlZml4OiBoaXN0b2dyYW0uYnlTaXplLndoZXJlKChrZXkpID0+IGhpc3RvZ3JhbS5idWNrZXRzW2tleV0gPiAwKSk7CisKKyAgICAvLyBGb3IgdG9wIDEwIGR5bmFtaWMgc2VsZWN0b3JzIHByaW50IHRoZSBmdW5jdGlvbnMgd2hpY2ggY29udGFpbiB0aGVzZQorICAgIC8vIGR5bmFtaWMgY2FsbHMuCisgICAgZm9yICh2YXIgc2VsZWN0b3IKKyAgICAgICAgaW4gaGlzdG9ncmFtLmJ5U2l6ZS50YWtlKG1hdGgubWluKDEwLCBoaXN0b2dyYW0ubGVuZ3RoKSkpIHsKKyAgICAgIGZpbmFsIGR5blNlbGVjdG9yID0gJ2R5bjokc2VsZWN0b3InOworICAgICAgZmluYWwgY2FsbE5vZGVzID0gY2FsbEdyYXBoLm5vZGVzCisgICAgICAgICAgLndoZXJlKChuKSA9PiBuLmRhdGEgPT0gc2VsZWN0b3IgfHwgbi5kYXRhID09IGR5blNlbGVjdG9yKTsKKworICAgICAgcHJpbnQoJ1xuRHluYW1pYyBjYWxsIHRvICR7c2VsZWN0b3J9JworICAgICAgICAgICcgKHJldGFpbmluZyB+JHtoaXN0b2dyYW0uYnVja2V0c1tzZWxlY3Rvcl19IGJ5dGVzKSBvY2N1cnMgaW46Jyk7CisgICAgICBmb3IgKHZhciBub2RlIGluIGNhbGxOb2RlcykgeworICAgICAgICBmb3IgKHZhciBwcmVkIGluIG5vZGUucHJlZCkgeworICAgICAgICAgIHByaW50KCcgICAgJHtwcmVkLmRhdGEucXVhbGlmaWVkTmFtZX0nKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIEBvdmVycmlkZQorICBTdHJpbmcgZ2V0IGludm9jYXRpb24gPT4KKyAgICAgIHN1cGVyLmludm9jYXRpb24ucmVwbGFjZUFsbCgnW2FyZ3VtZW50c10nLCAnPHNpemVzLmpzb24+IDx0cmFjZS5qc29uPicpOworfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9zcmMvY29tbWFuZHMvc3VtbWFyeS5kYXJ0IGIvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi9zcmMvY29tbWFuZHMvc3VtbWFyeS5kYXJ0CmluZGV4IDE5Zjg1YTguLmU3ZTAxMmIgMTAwNjQ0Ci0tLSBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvc3JjL2NvbW1hbmRzL3N1bW1hcnkuZGFydAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3NyYy9jb21tYW5kcy9zdW1tYXJ5LmRhcnQKQEAgLTksMTAgKzksMTMgQEAKIAogaW1wb3J0ICdkYXJ0OmFzeW5jJzsKIGltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgbWF0aDsKIAogaW1wb3J0ICdwYWNrYWdlOmFyZ3MvY29tbWFuZF9ydW5uZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bWV0YS9tZXRhLmRhcnQnOwogCiBpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvYXNjaWlfdGFibGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJlY29tcGlsZXJfdHJhY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJvZ3JhbV9pbmZvLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3V0aWxzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3Y4X3Byb2ZpbGUuZGFydCc7CkBAIC00Niw2ICs0OSwyMiBAQAogICAgICAgICBhYmJyOiAndycsCiAgICAgICAgIGhlbHA6ICdGaWx0ZXIgb3V0cHV0IHVzaW5nIHRoZSBnaXZlbiBnbG9iLicsCiAgICAgICApCisgICAgICAuLmFkZE9wdGlvbigKKyAgICAgICAgJ3ByZWNvbXBpbGVyLXRyYWNlJywKKyAgICAgICAgYWJicjogJ3QnLAorICAgICAgICBoZWxwOiAnJycKK1ByZWNvbXBpbGVyIHRyYWNlIHRvIGVzdGFibGlzaCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBsaWJyYXJpZXMvcGFja2FnZXMuCisnJycsCisgICAgICApCisgICAgICAuLmFkZE9wdGlvbigKKyAgICAgICAgJ2RlcHMtY29sbGFwc2UtZGVwdGgnLAorICAgICAgICBhYmJyOiAnZCcsCisgICAgICAgIGRlZmF1bHRzVG86ICczJywKKyAgICAgICAgaGVscDogJycnCitEZXB0aCBhdCB3aGljaCBub2RlcyBpbiB0aGUgZGVwZW5kZW5jeSB0cmVlIGFyZSBjb2xsYXBzZWQgdG9nZXRoZXIuCitPbmx5IGhhcyBhZmZlY3QgaWYgLS1wcmVjb21waWxlci10cmFjZSBpcyBhbHNvIHBhc3NlZC4KKycnJywKKyAgICAgICkKICAgICAgIC4uYWRkRmxhZygnY29sbGFwc2UtYW5vbnltb3VzLWNsb3N1cmVzJywgaGVscDogJycnCiBDb2xsYXBzZSBhbGwgYW5vbnltb3VzIGNsb3N1cmVzIGZyb20gdGhlIHNhbWUgc2NvcGUgaW50byBhIHNpbmdsZSBlbnRyeS4KIFdoZW4gY29tcGFyaW5nIHNpemUgb2YgQU9UIHNuYXBzaG90cyBmb3IgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhCkBAIC03NCw2ICs5MywyMSBAQAogICAgICAgdXNhZ2VFeGNlcHRpb24oJ0lucHV0IGZpbGUgJHtpbnB1dC5wYXRofSBkb2VzIG5vdCBleGlzdCEnKTsKICAgICB9CiAKKyAgICBmaW5hbCBncmFudWxhcml0eSA9IF9wYXJzZUhpc3RvZ3JhbVR5cGUoYXJnUmVzdWx0c1snYnknXSk7CisKKyAgICBmaW5hbCB0cmFjZUpzb24gPSBhcmdSZXN1bHRzWydwcmVjb21waWxlci10cmFjZSddOworICAgIGlmICh0cmFjZUpzb24gIT0gbnVsbCkgeworICAgICAgaWYgKCFGaWxlKHRyYWNlSnNvbikuZXhpc3RzU3luYygpKSB7CisgICAgICAgIHVzYWdlRXhjZXB0aW9uKCdUcmFjZSAke3RyYWNlSnNvbn0gZG9lcyBub3QgZXhpc3QhJyk7CisgICAgICB9CisKKyAgICAgIGlmIChncmFudWxhcml0eSAhPSBIaXN0b2dyYW1UeXBlLmJ5UGFja2FnZSAmJgorICAgICAgICAgIGdyYW51bGFyaXR5ICE9IEhpc3RvZ3JhbVR5cGUuYnlMaWJyYXJ5KSB7CisgICAgICAgIHVzYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgJy0tcHJlY29tcGlsZXItdHJhY2Ugb25seSBoYXMgZWZmZWN0IHdoZW4gc3VtbWFyaXppbmcgYnkgbGlicmFyeSBvciBwYWNrYWdlJyk7CisgICAgICB9CisgICAgfQorCiAgICAgZmluYWwgY29sdW1uV2lkdGggPSBhcmdSZXN1bHRzWydjb2x1bW4td2lkdGgnXTsKICAgICBmaW5hbCBtYXhXaWR0aCA9IGludC50cnlQYXJzZShjb2x1bW5XaWR0aCk7CiAgICAgaWYgKG1heFdpZHRoID09IG51bGwpIHsKQEAgLTgxLDExICsxMTUsMjAgQEAKICAgICAgICAgICAnU3BlY2lmaWVkIGNvbHVtbiB3aWR0aCAoJHtjb2x1bW5XaWR0aH0pIGlzIG5vdCBhbiBpbnRlZ2VyJyk7CiAgICAgfQogCisgICAgZmluYWwgZGVwdGhDb2xsYXBzZURlcHRoU3RyID0gYXJnUmVzdWx0c1snZGVwcy1jb2xsYXBzZS1kZXB0aCddOworICAgIGZpbmFsIGRlcHNDb2xsYXBzZURlcHRoID0gaW50LnRyeVBhcnNlKGRlcHRoQ29sbGFwc2VEZXB0aFN0cik7CisgICAgaWYgKGRlcHNDb2xsYXBzZURlcHRoID09IG51bGwpIHsKKyAgICAgIHVzYWdlRXhjZXB0aW9uKCdTcGVjaWZpZWQgZGVwdGhDb2xsYXBzZURlcHRoICgke2RlcHRoQ29sbGFwc2VEZXB0aFN0cn0pJworICAgICAgICAgICcgaXMgbm90IGFuIGludGVnZXInKTsKKyAgICB9CisKICAgICBhd2FpdCBvdXRwdXRTdW1tYXJ5KGlucHV0LAogICAgICAgICBtYXhXaWR0aDogbWF4V2lkdGgsCi0gICAgICAgIGdyYW51bGFyaXR5OiBfcGFyc2VIaXN0b2dyYW1UeXBlKGFyZ1Jlc3VsdHNbJ2J5J10pLAorICAgICAgICBncmFudWxhcml0eTogZ3JhbnVsYXJpdHksCiAgICAgICAgIGNvbGxhcHNlQW5vbnltb3VzQ2xvc3VyZXM6IGFyZ1Jlc3VsdHNbJ2NvbGxhcHNlLWFub255bW91cy1jbG9zdXJlcyddLAotICAgICAgICBmaWx0ZXI6IGFyZ1Jlc3VsdHNbJ3doZXJlJ10pOworICAgICAgICBmaWx0ZXI6IGFyZ1Jlc3VsdHNbJ3doZXJlJ10sCisgICAgICAgIHRyYWNlSnNvbjogdHJhY2VKc29uICE9IG51bGwgPyBGaWxlKHRyYWNlSnNvbikgOiBudWxsLAorICAgICAgICBkZXBzQ29sbGFwc2VEZXB0aDogZGVwc0NvbGxhcHNlRGVwdGgpOwogICB9CiAKICAgc3RhdGljIEhpc3RvZ3JhbVR5cGUgX3BhcnNlSGlzdG9ncmFtVHlwZShTdHJpbmcgdmFsdWUpIHsKQEAgLTEwNywxNCArMTUwLDEwNyBAQAogICAgIHtpbnQgbWF4V2lkdGggPSAwLAogICAgIGJvb2wgY29sbGFwc2VBbm9ueW1vdXNDbG9zdXJlcyA9IGZhbHNlLAogICAgIEhpc3RvZ3JhbVR5cGUgZ3JhbnVsYXJpdHkgPSBIaXN0b2dyYW1UeXBlLmJ5U3ltYm9sLAotICAgIFN0cmluZyBmaWx0ZXJ9KSBhc3luYyB7CisgICAgU3RyaW5nIGZpbHRlciwKKyAgICBGaWxlIHRyYWNlSnNvbiwKKyAgICBpbnQgZGVwc0NvbGxhcHNlRGVwdGggPSAzLAorICAgIGludCB0b3BUb1JlcG9ydCA9IDMwfSkgYXN5bmMgewogICBmaW5hbCBpbmZvID0gYXdhaXQgbG9hZFByb2dyYW1JbmZvKGlucHV0KTsKIAogICAvLyBDb21wdXRlIGhpc3RvZ3JhbS4KLSAgZmluYWwgaGlzdG9ncmFtID0gY29tcHV0ZUhpc3RvZ3JhbShpbmZvLCBncmFudWxhcml0eSwgZmlsdGVyOiBmaWx0ZXIpOworICB2YXIgaGlzdG9ncmFtID0gY29tcHV0ZUhpc3RvZ3JhbShpbmZvLCBncmFudWxhcml0eSwgZmlsdGVyOiBmaWx0ZXIpOworCisgIC8vIElmIHByZWNvbXBpbGVyIHRyYWNlIGlzIHByb3ZpZGUgY29sbGFwc2UgZW50cmllcyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeQorICAvLyBncmFwaCAoZG9taW5hdG9yIHRyZWUpIGV4dHJhY3RlZCBmcm9tIHRoZSB0cmFjZS4KKyAgdm9pZCBGdW5jdGlvbigpIHByaW50RGVwZW5kZW5jeVRyZWVzOworICBpZiAodHJhY2VKc29uICE9IG51bGwgJiYKKyAgICAgIChncmFudWxhcml0eSA9PSBIaXN0b2dyYW1UeXBlLmJ5TGlicmFyeSB8fAorICAgICAgICAgIGdyYW51bGFyaXR5ID09IEhpc3RvZ3JhbVR5cGUuYnlQYWNrYWdlKSkgeworICAgIHZhciBjYWxsR3JhcGggPSBhd2FpdCBsb2FkVHJhY2UodHJhY2VKc29uKTsKKworICAgIC8vIENvbnZlcnQgY2FsbCBncmFwaCBpbnRvIHRoZSBhcHByb3hpbWF0ZSBkZXBlbmRlbmN5IGdyYXBoLCBkcm9wcGluZyBhbnkKKyAgICAvLyBkeW5hbWljIGFuZCBkaXNwYXRjaCB0YWJsZSBiYXNlZCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgZ3JhcGggYW5kIG9ubHkKKyAgICAvLyBmb2xsb3dpbmcgdGhlIHN0YXRpYyBjYWxsLCBmaWVsZCBhY2Nlc3MgYW5kIGFsbG9jYXRpb24gZWRnZXMuCisgICAgY2FsbEdyYXBoID0gY2FsbEdyYXBoLmNvbGxhcHNlKAorICAgICAgICBncmFudWxhcml0eSA9PSBIaXN0b2dyYW1UeXBlLmJ5TGlicmFyeQorICAgICAgICAgICAgPyBOb2RlVHlwZS5saWJyYXJ5Tm9kZQorICAgICAgICAgICAgOiBOb2RlVHlwZS5wYWNrYWdlTm9kZSwKKyAgICAgICAgZHJvcENhbGxOb2RlczogdHJ1ZSk7CisgICAgY2FsbEdyYXBoLmNvbXB1dGVEb21pbmF0b3JzKCk7CisKKyAgICAvLyBDb21wdXRlIG5hbWUgbWFwcGluZyBmcm9tIGhpc3RvZ3JhbSBidWNrZXRzIHRvIG5ldyBjb2Fyc2VyIGJ1Y2tldHMsIGJ5CisgICAgLy8gY29sbGFwc2luZyBkZXBlbmRlbmN5IHRyZWUgYXQgW2RlcHNDb2xsYXBzZURlcHRoXSBsZXZlbDogbm9kZSAnRm9vJyB3aXRoCisgICAgLy8gayBkb21pbmF0ZWQgY2hpbGRyZW4gKGsgPiAwKSBiZWNvbWVzICdGb28gKCtrIGRlcHMpJyBhbmQgYWxsIGl0cyBjaGlsZHJlbgorICAgIC8vIGFyZSByZW1hcHBlZCB0byB0aGlzIGJ1Y2tldC4KKyAgICBmaW5hbCBtYXBwaW5nID0gPFN0cmluZywgU3RyaW5nPnt9OworICAgIGZpbmFsIGNvbGxhcHNlZCA9IDxTdHJpbmcsIENhbGxHcmFwaE5vZGU+e307CisgICAgY2FsbEdyYXBoLnJvb3QudmlzaXREb21pbmF0b3JUcmVlKChuLCBkZXB0aCkgeworICAgICAgaWYgKGRlcHRoID49IGRlcHNDb2xsYXBzZURlcHRoKSB7CisgICAgICAgIGZpbmFsIGNoaWxkcmVuID0gPFN0cmluZz5bXTsKKyAgICAgICAgbi52aXNpdERvbWluYXRvclRyZWUoKGNoaWxkLCBkZXB0aCkgeworICAgICAgICAgIGlmIChuICE9IGNoaWxkICYmIGNoaWxkLmRhdGEgaXMgUHJvZ3JhbUluZm9Ob2RlKSB7CisgICAgICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQuZGF0YS5uYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0sIGRlcHRoICsgMSk7CisKKyAgICAgICAgaWYgKGNoaWxkcmVuLmlzTm90RW1wdHkpIHsKKyAgICAgICAgICBmaW5hbCBuZXdOYW1lID0gJyR7bi5kYXRhLm5hbWV9ICgrICR7Y2hpbGRyZW4ubGVuZ3RofSBkZXBzKSc7CisgICAgICAgICAgbWFwcGluZ1tuLmRhdGEubmFtZV0gPSBuZXdOYW1lOworICAgICAgICAgIGNvbGxhcHNlZFtuZXdOYW1lXSA9IG47CisgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZHJlbikgeworICAgICAgICAgICAgbWFwcGluZ1tuYW1lXSA9IG5ld05hbWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworCisgICAgLy8gQ29tcHV0ZSBjdW11bGF0aXZlIHNpemVzIGFuZCBub2RlIGNvdW50cyBmb3IgZWFjaCBub2RlIGluIHRoZSBkb21pbmF0b3IKKyAgICAvLyB0cmVlLiBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gbGF0ZXIgdG8gZGlzcGxheSBkZXBlbmRlbmN5CisgICAgLy8gdHJlZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3VtbWFyeSByZXBvcnQuCisgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSB3ZSBsb29zZSBvcmlnaW5hbCBoaXN0b2dyYW0uCisgICAgZmluYWwgdG90YWxTaXplcyA9IDxTdHJpbmcsIGludD57fTsKKyAgICBmaW5hbCB0b3RhbENvdW50cyA9IDxTdHJpbmcsIGludD57fTsKKyAgICB2b2lkIGNvbXB1dGVUb3RhbHNSZWN1cnNpdmVseShDYWxsR3JhcGhOb2RlIG5vZGUpIHsKKyAgICAgIHZhciB0b3RhbFNpemUgPSBoaXN0b2dyYW0uYnVja2V0c1tub2RlLmRhdGEubmFtZV0gPz8gMDsKKyAgICAgIHZhciB0b3RhbENvdW50ID0gMTsKKyAgICAgIGZvciAodmFyIG4gaW4gbm9kZS5kb21pbmF0ZWQpIHsKKyAgICAgICAgY29tcHV0ZVRvdGFsc1JlY3Vyc2l2ZWx5KG4pOworICAgICAgICB0b3RhbFNpemUgKz0gdG90YWxTaXplc1tuLmRhdGEubmFtZV07CisgICAgICAgIHRvdGFsQ291bnQgKz0gdG90YWxDb3VudHNbbi5kYXRhLm5hbWVdOworICAgICAgfQorICAgICAgdG90YWxTaXplc1tub2RlLmRhdGEubmFtZV0gPSB0b3RhbFNpemU7CisgICAgICB0b3RhbENvdW50c1tub2RlLmRhdGEubmFtZV0gPSB0b3RhbENvdW50OworICAgIH0KKworICAgIGNvbXB1dGVUb3RhbHNSZWN1cnNpdmVseShjYWxsR3JhcGgucm9vdCk7CisKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGhpc3RvZ3JhbSB1c2luZyB0aGUgbWFwcGluZyB3aGljaCB3ZSBjb21wdXRlZC4KKyAgICBoaXN0b2dyYW0gPSBoaXN0b2dyYW0ubWFwKChidWNrZXQpID0+IG1hcHBpbmdbYnVja2V0XSA/PyBidWNrZXQpOworCisgICAgLy8gQ3JlYXRlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGRlcGVuZGVuY3kgdHJlZXMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByZXBvcnQuCisgICAgcHJpbnREZXBlbmRlbmN5VHJlZXMgPSAoKSB7CisgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGxpc3Qgb2YgY29sbGFwc2VkIGVudHJpZXMgd2hpY2ggd2VyZSBhbW9uZyB0aG9zZQorICAgICAgLy8gW3RvcFRvUmVwb3J0XSBwcmludGVkIGJ5IFtwcmludEhpc3RvZ3JhbV0gYmVsb3cuCisgICAgICBmaW5hbCBjb2xsYXBzZWRFbnRyaWVzID0gaGlzdG9ncmFtLmJ5U2l6ZQorICAgICAgICAgIC50YWtlKHRvcFRvUmVwb3J0KQorICAgICAgICAgIC5tYXAoKGspID0+IGNvbGxhcHNlZFtrXSkKKyAgICAgICAgICAud2hlcmUoKG4pID0+IG4gIT0gbnVsbCk7CisgICAgICBpZiAoY29sbGFwc2VkRW50cmllcy5pc05vdEVtcHR5KSB7CisgICAgICAgIHByaW50KCdcYkRlcGVuZGVuY3kgdHJlZXM6Jyk7CisgICAgICAgIGZvciAodmFyIG4gaW4gY29sbGFwc2VkRW50cmllcykgeworICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAnXG4ke24uZGF0YS5xdWFsaWZpZWROYW1lfSAodG90YWwgJHt0b3RhbFNpemVzW24uZGF0YS5uYW1lXX0gYnl0ZXMpJyk7CisgICAgICAgICAgX3ByaW50RG9taW5hdGVkTm9kZXMobiwKKyAgICAgICAgICAgICAgdG90YWxTaXplczogdG90YWxTaXplcywgdG90YWxDb3VudHM6IHRvdGFsQ291bnRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIH0KIAogICAvLyBOb3cgcHJvZHVjZSB0aGUgcmVwb3J0IHRhYmxlLgotICBjb25zdCB0b3BUb1JlcG9ydCA9IDMwOwogICBwcmludEhpc3RvZ3JhbShpbmZvLCBoaXN0b2dyYW0sCiAgICAgICBwcmVmaXg6IGhpc3RvZ3JhbS5ieVNpemUudGFrZSh0b3BUb1JlcG9ydCksIG1heFdpZHRoOiBtYXhXaWR0aCk7CiAKQEAgLTEyNyw0ICsyNjMsNzAgQEAKIAogICAgIHByaW50KGJ1Y2tldExlZ2VuZCk7CiAgIH0KKworICBwcmludERlcGVuZGVuY3lUcmVlcz8uY2FsbCgpOworfQorCisvLy8gSGVscGVyIG1ldGhvZCBmb3IgcHJpbnRpbmcgZG9taW5hdG9yIHRyZWUgaW4gdGhlIGZvcm06CisvLy8KKy8vLyBBICh0b3RhbCAuLi4gYnl0ZXMpCisvLy8g4pSc4pSA4pSAIEIgKHRvdGFsIC4uLiBieXRlcykKKy8vLyDilJzilIDilIAgQyAodG90YWwgLi4uIGJ5dGVzKQorLy8vIOKUgiAgIOKUnOKUgOKUgCBEICh0b3RhbCAuLi4gYnl0ZXMpCisvLy8g4pSCICAg4pSU4pSA4pSAIEUgKHRvdGFsIC4uLiBieXRlcykKKy8vLyDilJzilIDilIAgRiAodG90YWwgLi4uIGJ5dGVzKQorLy8vIOKUlOKUgOKUgCBHICh0b3RhbCAuLi4gYnl0ZXMpCisvLy8KKy8vLyBDdXRzIHRoZSBwcmludGluZyBvZmYgYXQgdGhlIGdpdmVuIGRlcHRoIChbY3V0T2ZmRGVwdGhdKSBhbmQgYWZ0ZXIgdGhlCisvLy8gZ2l2ZW4gYW1vdW50IG9mIGNoaWxkcmVuIGF0IGVhY2ggbm9kZSAoW21heENoaWxkcmVuVG9QcmludF0pLgordm9pZCBfcHJpbnREb21pbmF0ZWROb2RlcyhDYWxsR3JhcGhOb2RlIG5vZGUsCisgICAge2ludCBjdXRPZmZEZXB0aCA9IDIsCisgICAgaW50IG1heENoaWxkcmVuVG9QcmludCA9IDEwLAorICAgIExpc3Q8Ym9vbD4gaXNMYXN0UGVyTGV2ZWwsCisgICAgQHJlcXVpcmVkIE1hcDxTdHJpbmcsIGludD4gdG90YWxTaXplcywKKyAgICBAcmVxdWlyZWQgTWFwPFN0cmluZywgaW50PiB0b3RhbENvdW50c30pIHsKKyAgaXNMYXN0UGVyTGV2ZWwgPz89IFtdOworCisgIGlmIChpc0xhc3RQZXJMZXZlbC5sZW5ndGggPj0gY3V0T2ZmRGVwdGgpIHsKKyAgICBtYXhDaGlsZHJlblRvUHJpbnQgPSAwOworICB9CisKKyAgZmluYWwgc2l6ZXMgPSBub2RlLmRvbWluYXRlZC5tYXAoKG4pID0+IHRvdGFsU2l6ZXNbbi5kYXRhLm5hbWVdKS50b0xpc3QoKTsKKyAgZmluYWwgb3JkZXIgPSBMaXN0LmdlbmVyYXRlKG5vZGUuZG9taW5hdGVkLmxlbmd0aCwgKGkpID0+IGkpCisgICAgLi5zb3J0KChhLCBiKSA9PiBzaXplc1tiXSAtIHNpemVzW2FdKTsKKyAgZmluYWwgbGFzdEluZGV4ID0gb3JkZXIubGFzdEluZGV4V2hlcmUoKGkpID0+IHNpemVzW2ldID4gMCk7CisKKyAgZm9yICh2YXIgaiA9IDAsIG4gPSBtYXRoLm1pbihtYXhDaGlsZHJlblRvUHJpbnQgLSAxLCBsYXN0SW5kZXgpOworICAgICAgaiA8PSBuOworICAgICAgaisrKSB7CisgICAgZmluYWwgaXNMYXN0ID0gaiA9PSBsYXN0SW5kZXg7CisgICAgZmluYWwgaSA9IG9yZGVyW2pdOworICAgIGZpbmFsIG4gPSBub2RlLmRvbWluYXRlZFtpXTsKKyAgICBmaW5hbCBzaXplID0gc2l6ZXNbaV07CisgICAgaXNMYXN0UGVyTGV2ZWwuYWRkKGlzTGFzdCk7CisgICAgcHJpbnQoCisgICAgICAgICcke190cmVlTGluZXMoaXNMYXN0UGVyTGV2ZWwpfSR7bi5kYXRhLnF1YWxpZmllZE5hbWV9ICh0b3RhbCAke3NpemV9IGJ5dGVzKScpOworICAgIF9wcmludERvbWluYXRlZE5vZGVzKG4sCisgICAgICAgIGN1dE9mZkRlcHRoOiBjdXRPZmZEZXB0aCwKKyAgICAgICAgaXNMYXN0UGVyTGV2ZWw6IGlzTGFzdFBlckxldmVsLAorICAgICAgICB0b3RhbENvdW50czogdG90YWxDb3VudHMsCisgICAgICAgIHRvdGFsU2l6ZXM6IHRvdGFsU2l6ZXMpOworICAgIGlzTGFzdFBlckxldmVsLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIGlmIChtYXhDaGlsZHJlblRvUHJpbnQgPCBsYXN0SW5kZXgpIHsKKyAgICBpc0xhc3RQZXJMZXZlbC5hZGQodHJ1ZSk7CisgICAgcHJpbnQoCisgICAgICAgICcke190cmVlTGluZXMoaXNMYXN0UGVyTGV2ZWwpfSAuLi4gKCske3RvdGFsQ291bnRzW25vZGUuZGF0YS5uYW1lXSAtIDF9IGRlcHMpJyk7CisgICAgaXNMYXN0UGVyTGV2ZWwucmVtb3ZlTGFzdCgpOworICB9Cit9CisKK1N0cmluZyBfdHJlZUxpbmVzKExpc3Q8Ym9vbD4gaXNMYXN0UGVyTGV2ZWwpIHsKKyAgZmluYWwgc2IgPSBTdHJpbmdCdWZmZXIoKTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBpc0xhc3RQZXJMZXZlbC5sZW5ndGggLSAxOyBpKyspIHsKKyAgICBzYi53cml0ZShpc0xhc3RQZXJMZXZlbFtpXSA/ICcgICAgJyA6ICfilIIgICAnKTsKKyAgfQorICBzYi53cml0ZShpc0xhc3RQZXJMZXZlbC5sYXN0ID8gJ+KUlOKUgOKUgCAnIDogJ+KUnOKUgOKUgCAnKTsKKyAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3RyZWVtYXAuZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvdHJlZW1hcC5kYXJ0CmluZGV4IDhjY2MxNjcuLjQ3OTg3NmEgMTAwNjQ0Ci0tLSBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvdHJlZW1hcC5kYXJ0CisrKyBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvdHJlZW1hcC5kYXJ0CkBAIC05Myw2ICs5Myw1NyBAQAogICAgICAgY29sbGFwc2VTaW5nbGVDaGlsZFBhdGhOb2RlczogY29sbGFwc2VTaW5nbGVDaGlsZFBhdGhOb2Rlcyk7CiB9CiAKKy8vLyBDb252ZXJ0IHRoZSBnaXZlbiBbUHJvZ3JhbUluZm9dIG9iamVjdCBpbnRvIGEgdHJlZW1hcCBpbiBlaXRoZXIKKy8vLyBbVHJlZW1hcEZvcm1hdC5jb2xsYXBzZWRdIG9yIFtUcmVlbWFwRm9ybWF0LnNpbXBsaWZpZWRdIGZvcm1hdC4KKy8vLworLy8vIFNlZSBbdHJlZW1hcEZyb21Kc29uXSBmb3IgdGhlIHNjaGVtYSBvZiB0aGUgcmV0dXJuZWQgbWFwIG9iamVjdC4KK01hcDxTdHJpbmcsIGR5bmFtaWM+IHRyZWVtYXBGcm9tSW5mbyhQcm9ncmFtSW5mbyBpbmZvLAorICAgIHtUcmVlbWFwRm9ybWF0IGZvcm1hdCA9IFRyZWVtYXBGb3JtYXQuY29sbGFwc2VkLAorICAgIGJvb2wgY29sbGFwc2VTaW5nbGVDaGlsZFBhdGhOb2RlcyA9IHRydWV9KSB7CisgIGZpbmFsIHJvb3QgPSB7J24nOiAnJywgJ2NoaWxkcmVuJzoge30sICdrJzoga2luZFBhdGgsICdtYXhEZXB0aCc6IDB9OworICBfdHJlZW1hcEZyb21JbmZvKHJvb3QsIGluZm8sIGZvcm1hdDogZm9ybWF0KTsKKyAgcmV0dXJuIF9mbGF0dGVuKHJvb3QsCisgICAgICBjb2xsYXBzZVNpbmdsZUNoaWxkUGF0aE5vZGVzOiBjb2xsYXBzZVNpbmdsZUNoaWxkUGF0aE5vZGVzKTsKK30KKwordm9pZCBfdHJlZW1hcEZyb21JbmZvKE1hcDxTdHJpbmcsIGR5bmFtaWM+IHJvb3QsIFByb2dyYW1JbmZvIGluZm8sCisgICAge1RyZWVtYXBGb3JtYXQgZm9ybWF0ID0gVHJlZW1hcEZvcm1hdC5zaW1wbGlmaWVkfSkgeworICBpZiAoZm9ybWF0ICE9IFRyZWVtYXBGb3JtYXQuY29sbGFwc2VkICYmIGZvcm1hdCAhPSBUcmVlbWFwRm9ybWF0LnNpbXBsaWZpZWQpIHsKKyAgICB0aHJvdyBBcmd1bWVudEVycm9yKAorICAgICAgJ2NhbiBvbmx5IGJ1aWxkIHNpbXBsaWZpZWQgb3IgY29sbGFwc2VkIGZvcm1hdHMgZnJvbSB0aGUgcHJvZ3JhbSBpbmZvJywKKyAgICApOworICB9CisKKyAgaW50IGN1bXVsYXRpdmVTaXplKFByb2dyYW1JbmZvTm9kZSBub2RlKSB7CisgICAgcmV0dXJuIChub2RlLnNpemUgPz8gMCkgKworICAgICAgICBub2RlLmNoaWxkcmVuLnZhbHVlcworICAgICAgICAgICAgLmZvbGQ8aW50PigwLCAoc3VtLCBjaGlsZCkgPT4gc3VtICsgY3VtdWxhdGl2ZVNpemUoY2hpbGQpKTsKKyAgfQorCisgIHZvaWQgcmVjdXJzZShQcm9ncmFtSW5mb05vZGUgbm9kZSwgU3RyaW5nIHBhdGgsIE1hcDxTdHJpbmcsIGR5bmFtaWM+IHJvb3QsCisgICAgICBUcmVlbWFwRm9ybWF0IGZvcm1hdCkgeworICAgIGlmIChub2RlLmNoaWxkcmVuLmlzRW1wdHkgfHwKKyAgICAgICAgKG5vZGUudHlwZSA9PSBOb2RlVHlwZS5mdW5jdGlvbk5vZGUgJiYKKyAgICAgICAgICAgIGZvcm1hdCA9PSBUcmVlbWFwRm9ybWF0LnNpbXBsaWZpZWQpKSB7CisgICAgICAvLyBGb3Igc2ltcGxlIGZvcm1hdCB3ZSByZW1vdmUgaW5mb3JtYXRpb24gYWJvdXQgbmVzdGVkIGZ1bmN0aW9ucyBmcm9tCisgICAgICAvLyB0aGUgb3V0cHV0LgorICAgICAgX2FkZFN5bWJvbChyb290LCBwYXRoLCBub2RlLm5hbWUsIGN1bXVsYXRpdmVTaXplKG5vZGUpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwYXRoID0gcGF0aCAhPSAnJyA/ICckcGF0aC8ke25vZGUubmFtZX0nIDogbm9kZS5uYW1lOworICAgIF9hZGRTeW1ib2wocm9vdCwgcGF0aCwgJzxzZWxmPicsIG5vZGUuc2l6ZSk7CisgICAgZm9yICh2YXIgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbi52YWx1ZXMpIHsKKyAgICAgIHJlY3Vyc2UoY2hpbGQsIHBhdGgsIHJvb3QsIGZvcm1hdCk7CisgICAgfQorICB9CisKKyAgX2FkZFN5bWJvbChyb290LCAnJywgaW5mby5yb290Lm5hbWUsIGluZm8ucm9vdC5zaXplKTsKKyAgZm9yICh2YXIgY2hpbGQgaW4gaW5mby5yb290LmNoaWxkcmVuLnZhbHVlcykgeworICAgIHJlY3Vyc2UoY2hpbGQsICcnLCByb290LCBmb3JtYXQpOworICB9Cit9CisKIHZvaWQgX3RyZWVtYXBGcm9tU25hcHNob3QoTWFwPFN0cmluZywgZHluYW1pYz4gcm9vdCwgdjhfcHJvZmlsZS5TbmFwc2hvdCBzbmFwLAogICAgIHtUcmVlbWFwRm9ybWF0IGZvcm1hdCA9IFRyZWVtYXBGb3JtYXQub2JqZWN0VHlwZX0pIHsKICAgZmluYWwgaW5mbyA9IHY4X3Byb2ZpbGUudG9Qcm9ncmFtSW5mbyhzbmFwKTsKQEAgLTEwMCwzMyArMTUxLDcgQEAKICAgLy8gRm9yIGNvbGxhcHNlZCBhbmQgc2ltcGxlIGZvcm1hdHMgdGhlcmUgaXMgbm8gbmVlZCB0byB0cmF2ZXJzZSBzbmFwc2hvdAogICAvLyBub2Rlcy4gSnVzdCByZWN1cnNlIGludG8gW1Byb2dyYW1JbmZvXSBzdHJ1Y3R1cmUgaW5zdGVhZC4KICAgaWYgKGZvcm1hdCA9PSBUcmVlbWFwRm9ybWF0LmNvbGxhcHNlZCB8fCBmb3JtYXQgPT0gVHJlZW1hcEZvcm1hdC5zaW1wbGlmaWVkKSB7Ci0gICAgaW50IGN1bXVsYXRpdmVTaXplKFByb2dyYW1JbmZvTm9kZSBub2RlKSB7Ci0gICAgICByZXR1cm4gKG5vZGUuc2l6ZSA/PyAwKSArCi0gICAgICAgICAgbm9kZS5jaGlsZHJlbi52YWx1ZXMKLSAgICAgICAgICAgICAgLmZvbGQ8aW50PigwLCAoc3VtLCBjaGlsZCkgPT4gc3VtICsgY3VtdWxhdGl2ZVNpemUoY2hpbGQpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlY3Vyc2UoUHJvZ3JhbUluZm9Ob2RlIG5vZGUsIFN0cmluZyBwYXRoKSB7Ci0gICAgICBpZiAobm9kZS5jaGlsZHJlbi5pc0VtcHR5IHx8Ci0gICAgICAgICAgKG5vZGUudHlwZSA9PSBOb2RlVHlwZS5mdW5jdGlvbk5vZGUgJiYKLSAgICAgICAgICAgICAgZm9ybWF0ID09IFRyZWVtYXBGb3JtYXQuc2ltcGxpZmllZCkpIHsKLSAgICAgICAgLy8gRm9yIHNpbXBsZSBmb3JtYXQgd2UgcmVtb3ZlIGluZm9ybWF0aW9uIGFib3V0IG5lc3RlZCBmdW5jdGlvbnMgZnJvbQotICAgICAgICAvLyB0aGUgb3V0cHV0LgotICAgICAgICBfYWRkU3ltYm9sKHJvb3QsIHBhdGgsIG5vZGUubmFtZSwgY3VtdWxhdGl2ZVNpemUobm9kZSkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHBhdGggPSBwYXRoICE9ICcnID8gJyRwYXRoLyR7bm9kZS5uYW1lfScgOiBub2RlLm5hbWU7Ci0gICAgICBfYWRkU3ltYm9sKHJvb3QsIHBhdGgsICc8c2VsZj4nLCBub2RlLnNpemUpOwotICAgICAgZm9yICh2YXIgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbi52YWx1ZXMpIHsKLSAgICAgICAgcmVjdXJzZShjaGlsZCwgcGF0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX2FkZFN5bWJvbChyb290LCAnJywgaW5mby5yb290Lm5hbWUsIGluZm8ucm9vdC5zaXplKTsKLSAgICBmb3IgKHZhciBjaGlsZCBpbiBpbmZvLnJvb3QuY2hpbGRyZW4udmFsdWVzKSB7Ci0gICAgICByZWN1cnNlKGNoaWxkLCAnJyk7Ci0gICAgfQorICAgIF90cmVlbWFwRnJvbUluZm8ocm9vdCwgaW5mbywgZm9ybWF0OiBmb3JtYXQpOwogICAgIHJldHVybjsKICAgfQogCmRpZmYgLS1naXQgYS9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3V0aWxzLmRhcnQgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvbGliL3V0aWxzLmRhcnQKaW5kZXggMmY2NzQ2YS4uMzNlMWQ4NCAxMDA2NDQKLS0tIGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL2xpYi91dGlscy5kYXJ0CisrKyBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9saWIvdXRpbHMuZGFydApAQCAtMTAsNiArMTAsNyBAQAogaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3Byb2dyYW1faW5mby5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9pbnN0cnVjdGlvbl9zaXplcy5kYXJ0JwogICAgIGFzIGluc3RydWN0aW9uX3NpemVzOworaW1wb3J0ICdwYWNrYWdlOnZtX3NuYXBzaG90X2FuYWx5c2lzL3RyZWVtYXAuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvdjhfcHJvZmlsZS5kYXJ0JyBhcyB2OF9wcm9maWxlOwogCiBGdXR1cmU8T2JqZWN0PiBsb2FkSnNvbihGaWxlIGlucHV0KSBhc3luYyB7CkBAIC0zMiw2ICszMywyMCBAQAogICB9CiB9CiAKKy8vLyBDb21wYXJlIHR3byBzaXplIHByb2ZpbGVzIGFuZCByZXR1cm4gcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGFzIGEgdHJlZW1hcC4KK0Z1dHVyZTxNYXA8U3RyaW5nLCBkeW5hbWljPj4gYnVpbGRDb21wYXJpc29uVHJlZW1hcChGaWxlIG9sZEpzb24sIEZpbGUgbmV3SnNvbiwKKyAgICB7VHJlZW1hcEZvcm1hdCBmb3JtYXQgPSBUcmVlbWFwRm9ybWF0LmNvbGxhcHNlZCwKKyAgICBib29sIGNvbGxhcHNlQW5vbnltb3VzQ2xvc3VyZXMgPSBmYWxzZX0pIGFzeW5jIHsKKyAgZmluYWwgb2xkU2l6ZXMgPSBhd2FpdCBsb2FkUHJvZ3JhbUluZm8ob2xkSnNvbiwKKyAgICAgIGNvbGxhcHNlQW5vbnltb3VzQ2xvc3VyZXM6IGNvbGxhcHNlQW5vbnltb3VzQ2xvc3VyZXMpOworICBmaW5hbCBuZXdTaXplcyA9IGF3YWl0IGxvYWRQcm9ncmFtSW5mbyhuZXdKc29uLAorICAgICAgY29sbGFwc2VBbm9ueW1vdXNDbG9zdXJlczogY29sbGFwc2VBbm9ueW1vdXNDbG9zdXJlcyk7CisKKyAgZmluYWwgZGlmZiA9IGNvbXB1dGVEaWZmKG9sZFNpemVzLCBuZXdTaXplcyk7CisKKyAgcmV0dXJuIHRyZWVtYXBGcm9tSW5mbyhkaWZmLCBmb3JtYXQ6IGZvcm1hdCk7Cit9CisKIHZvaWQgcHJpbnRIaXN0b2dyYW0oUHJvZ3JhbUluZm8gaW5mbywgSGlzdG9ncmFtIGhpc3RvZ3JhbSwKICAgICB7SXRlcmFibGU8U3RyaW5nPiBwcmVmaXggPSBjb25zdCBbXSwKICAgICBJdGVyYWJsZTxTdHJpbmc+IHN1ZmZpeCA9IGNvbnN0IFtdLApkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3B1YnNwZWMueWFtbCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9wdWJzcGVjLnlhbWwKaW5kZXggOGJkYzExOS4uNGUwYmY5NSAxMDA2NDQKLS0tIGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3B1YnNwZWMueWFtbAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvcHVic3BlYy55YW1sCkBAIC0xLDYgKzEsNiBAQAogbmFtZTogdm1fc25hcHNob3RfYW5hbHlzaXMKLWRlc2NyaXB0aW9uOiBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBub24tc3ltYm9saWMgc3RhY2sgdHJhY2VzLgotdmVyc2lvbjogMC4zLjAKK2Rlc2NyaXB0aW9uOiBVdGlsaXRpZXMgZm9yIGFuYWx5c2luZyBBT1Qgc25hcHNob3Qgc2l6ZS4KK3ZlcnNpb246IDAuNC4wCiAKIGhvbWVwYWdlOiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay90cmVlL21hc3Rlci9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMKIApkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3Rlc3QvaW5zdHJ1Y3Rpb25fc2l6ZXNfdGVzdC5kYXJ0IGIvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3Rlc3QvaW5zdHJ1Y3Rpb25fc2l6ZXNfdGVzdC5kYXJ0CmluZGV4IGEyZTI2ZGEuLmYyYTc3NDEgMTAwNjQ0Ci0tLSBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L2luc3RydWN0aW9uX3NpemVzX3Rlc3QuZGFydAorKysgYi9wa2cvdm1fc25hcHNob3RfYW5hbHlzaXMvdGVzdC9pbnN0cnVjdGlvbl9zaXplc190ZXN0LmRhcnQKQEAgLTQsNyArNCw2IEBACiAKIGltcG9ydCAnZGFydDppbyc7CiAKLWltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKIGltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CiAKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9pbnN0cnVjdGlvbl9zaXplcy5kYXJ0JwpAQCAtMTIsMTcgKzExLDcgQEAKIGltcG9ydCAncGFja2FnZTp2bV9zbmFwc2hvdF9hbmFseXNpcy9wcm9ncmFtX2luZm8uZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvdXRpbHMuZGFydCc7CiAKLWZpbmFsIGRhcnQybmF0aXZlID0gKCkgewotICBmaW5hbCBzZGtCaW4gPSBwYXRoLmRpcm5hbWUoUGxhdGZvcm0uZXhlY3V0YWJsZSk7Ci0gIGZpbmFsIGRhcnQybmF0aXZlID0KLSAgICAgIHBhdGguam9pbihzZGtCaW4sIFBsYXRmb3JtLmlzV2luZG93cyA/ICdkYXJ0Mm5hdGl2ZS5iYXQnIDogJ2RhcnQybmF0aXZlJyk7Ci0KLSAgaWYgKCFGaWxlKGRhcnQybmF0aXZlKS5leGlzdHNTeW5jKCkpIHsKLSAgICB0aHJvdyAnRmFpbGVkIHRvIGxvY2F0ZSBkYXJ0Mm5hdGl2ZSBpbiB0aGUgU0RLJzsKLSAgfQotCi0gIHJldHVybiBwYXRoLmNhbm9uaWNhbGl6ZShkYXJ0Mm5hdGl2ZSk7Ci19KCk7CitpbXBvcnQgJ3V0aWxzLmRhcnQnOwogCiBmaW5hbCB0ZXN0U291cmNlID0gewogICAnaW5wdXQuZGFydCc6ICIiIgpAQCAtNjUxLDYxICs2NDAsNiBAQAogICAgICAgICBGdXR1cmUgRnVuY3Rpb24oU3RyaW5nIHNpemVzSnNvbikgZikgPT4KICAgICB3aXRoRmxhZyhwcmVmaXgsIHNvdXJjZSwgJy0td3JpdGVfdjhfc25hcHNob3RfcHJvZmlsZV90bycsIGYpOwogCi1GdXR1cmUgd2l0aEZsYWcoU3RyaW5nIHByZWZpeCwgTWFwPFN0cmluZywgU3RyaW5nPiBzb3VyY2UsIFN0cmluZyBmbGFnLAotICAgIEZ1dHVyZSBGdW5jdGlvbihTdHJpbmcgc2l6ZXNKc29uKSBmKSB7Ci0gIHJldHVybiB3aXRoVGVtcERpcihwcmVmaXgsIChkaXIpIGFzeW5jIHsKLSAgICBmaW5hbCBvdXRwdXRCaW5hcnkgPSBwYXRoLmpvaW4oZGlyLCAnb3V0cHV0LmV4ZScpOwotICAgIGZpbmFsIHNpemVzSnNvbiA9IHBhdGguam9pbihkaXIsICdzaXplcy5qc29uJyk7Ci0gICAgZmluYWwgcGFja2FnZXMgPSBwYXRoLmpvaW4oZGlyLCAnLnBhY2thZ2VzJyk7Ci0gICAgZmluYWwgbWFpbkRhcnQgPSBwYXRoLmpvaW4oZGlyLCAnbWFpbi5kYXJ0Jyk7Ci0KLSAgICAvLyBDcmVhdGUgdGVzdCBpbnB1dC4KLSAgICBmb3IgKHZhciBmaWxlIGluIHNvdXJjZS5lbnRyaWVzKSB7Ci0gICAgICBhd2FpdCBGaWxlKHBhdGguam9pbihkaXIsIGZpbGUua2V5KSkud3JpdGVBc1N0cmluZyhmaWxlLnZhbHVlKTsKLSAgICB9Ci0gICAgYXdhaXQgRmlsZShwYWNrYWdlcykud3JpdGVBc1N0cmluZygnJycKLWlucHV0Oi4vCi0nJycpOwotICAgIGF3YWl0IEZpbGUobWFpbkRhcnQpLndyaXRlQXNTdHJpbmcoJycnCi1pbXBvcnQgJ3BhY2thZ2U6aW5wdXQvaW5wdXQuZGFydCcgYXMgaW5wdXQ7Ci0KLXZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgPT4gaW5wdXQubWFpbihhcmdzKTsKLScnJyk7Ci0KLSAgICAvLyBDb21waWxlIGlucHV0LmRhcnQgdG8gbmF0aXZlIGFuZCBvdXRwdXQgaW5zdHJ1Y3Rpb24gc2l6ZXMuCi0gICAgZmluYWwgcmVzdWx0ID0gYXdhaXQgUHJvY2Vzcy5ydW4oZGFydDJuYXRpdmUsIFsKLSAgICAgICctbycsCi0gICAgICBvdXRwdXRCaW5hcnksCi0gICAgICAnLS1wYWNrYWdlcz0kcGFja2FnZXMnLAotICAgICAgJy0tZXh0cmEtZ2VuLXNuYXBzaG90LW9wdGlvbnM9JGZsYWc9JHNpemVzSnNvbicsCi0gICAgICBtYWluRGFydCwKLSAgICBdKTsKLQotICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIGVxdWFscygwKSwgcmVhc29uOiAnJycKLUNvbXBpbGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi0KLXN0ZG91dDogJHtyZXN1bHQuc3Rkb3V0fQotc3RkZXJyOiAke3Jlc3VsdC5zdGRlcnJ9Ci0nJycpOwotICAgIGV4cGVjdChGaWxlKG91dHB1dEJpbmFyeSkuZXhpc3RzU3luYygpLCBpc1RydWUsCi0gICAgICAgIHJlYXNvbjogJ091dHB1dCBiaW5hcnkgZXhpc3RzJyk7Ci0gICAgZXhwZWN0KEZpbGUoc2l6ZXNKc29uKS5leGlzdHNTeW5jKCksIGlzVHJ1ZSwKLSAgICAgICAgcmVhc29uOiAnSW5zdHJ1Y3Rpb24gc2l6ZXMgb3V0cHV0IGV4aXN0cycpOwotCi0gICAgYXdhaXQgZihzaXplc0pzb24pOwotICB9KTsKLX0KLQotRnV0dXJlIHdpdGhUZW1wRGlyKFN0cmluZyBwcmVmaXgsIEZ1dHVyZSBGdW5jdGlvbihTdHJpbmcgZGlyKSBmKSBhc3luYyB7Ci0gIGZpbmFsIHRlbXBEaXIgPQotICAgICAgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoJ2luc3RydWN0aW9uLXNpemVzLXRlc3QtJHtwcmVmaXh9Jyk7Ci0gIHRyeSB7Ci0gICAgYXdhaXQgZih0ZW1wRGlyLnBhdGgpOwotICB9IGZpbmFsbHkgewotICAgIHRlbXBEaXIuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwotICB9Ci19Ci0KIC8vIE9uIFdpbmRvd3MgdGhlcmUgaXMgc29tZSBpc3N1ZSB3aXRoIGludGVycHJldGluZyBlbnRyeSBwb2ludCBVUkkgYXMgYSBwYWNrYWdlIFVSSQogLy8gaXQgaW5zdGVhZCBnZXRzIGludGVycHJldGVkIGFzIGEgZmlsZSBVUkkgLSB3aGljaCBicmVha3MgY29tcGFyaXNvbi4gU28gd2UKIC8vIHNpbXBseSBpZ25vcmUgZW50cnkgcG9pbnQgbGlicmFyeSAobWFpbi5kYXJ0KS4KZGlmZiAtLWdpdCBhL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L3ByZWNvbXBpbGVyX3RyYWNlX3Rlc3QuZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L3ByZWNvbXBpbGVyX3RyYWNlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJmZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3Rlc3QvcHJlY29tcGlsZXJfdHJhY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dm1fc25hcHNob3RfYW5hbHlzaXMvcHJlY29tcGlsZXJfdHJhY2UuZGFydCc7CisKK2ltcG9ydCAndXRpbHMuZGFydCc7CisKK2ZpbmFsIHRlc3RTb3VyY2UgPSB7CisgICdpbnB1dC5kYXJ0JzogIiIiCitjbGFzcyBLIHsKKyAgZmluYWwgdmFsdWU7CisgIGNvbnN0IEsodGhpcy52YWx1ZSk7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitkeW5hbWljIG1ha2VTb21lQ2xvc3VyZXMoKSB7CisgIHJldHVybiBbCisgICAgKCkgPT4gY29uc3QgSygwKSwKKyAgICAoKSA9PiBjb25zdCBLKDEpLAorICAgICgpID0+IDExLAorICBdOworfQorCitjbGFzcyBBIHsKKyAgQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKKyAgZHluYW1pYyB0b3JuT2ZmKCkgeworICAgIHJldHVybiBjb25zdCBLKDIpOworICB9Cit9CisKK2NsYXNzIEIgeworICBAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQorICBkeW5hbWljIHRvcm5PZmYoKSB7CisgICAgcmV0dXJuIGNvbnN0IEsoMyk7CisgIH0KK30KKworY2xhc3MgQyB7CisgIHN0YXRpYyBkeW5hbWljIHRvcm5PZmYoKSBhc3luYyB7CisgICAgcmV0dXJuIGNvbnN0IEsoNCk7CisgIH0KK30KKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK0Z1bmN0aW9uIHRlYXJPZmYoZHluYW1pYyBvKSB7CisgIHJldHVybiBvLnRvcm5PZmY7Cit9CisKK3ZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBmb3IgKHZhciBjbCBpbiBtYWtlU29tZUNsb3N1cmVzKCkpIHsKKyAgICBwcmludChjbCgpKTsKKyAgfQorICBwcmludCh0ZWFyT2ZmKGFyZ3MuaXNFbXB0eSA/IEEoKSA6IEIoKSkpOworICBwcmludChDLnRvcm5PZmYpOworfQorIiIiCit9OworCit2b2lkIG1haW4oKSBhc3luYyB7CisgIGlmICghUGxhdGZvcm0uZXhlY3V0YWJsZS5jb250YWlucygnZGFydC1zZGsnKSkgeworICAgIC8vIElmIHdlIGFyZSBub3QgcnVubmluZyBmcm9tIHRoZSBwcmVidWlsdCBTREsgdGhlbiB0aGlzIHRlc3QgZG9lcyBub3RoaW5nLgorICAgIHJldHVybjsKKyAgfQorCisgIGdyb3VwKCdwcmVjb21waWxlci10cmFjZScsICgpIHsKKyAgICB0ZXN0KCdiYXNpYy1wYXJzaW5nJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgd2l0aEZsYWcoJ2Jhc2ljLXBhcnNpbmcnLCB0ZXN0U291cmNlLCAnLS10cmFjZV9wcmVjb21waWxlcl90bycsCisgICAgICAgICAgKGpzb24pIGFzeW5jIHsKKyAgICAgICAgZmluYWwgY2FsbEdyYXBoID0gYXdhaXQgbG9hZFRyYWNlKEZpbGUoanNvbikpOworICAgICAgICBjYWxsR3JhcGguY29tcHV0ZURvbWluYXRvcnMoKTsKKworICAgICAgICBmaW5hbCBtYWluID0gY2FsbEdyYXBoLnByb2dyYW0KKyAgICAgICAgICAgIC5sb29rdXAoWydwYWNrYWdlOmlucHV0JywgJ3BhY2thZ2U6aW5wdXQvaW5wdXQuZGFydCcsICcnLCAnbWFpbiddKTsKKyAgICAgICAgZmluYWwgbWFpbk5vZGUgPSBjYWxsR3JhcGgubG9va3VwKG1haW4pOworCisgICAgICAgIGZpbmFsIHJldGFpbmVkQ2xhc3NlcyA9IG1haW5Ob2RlLmRvbWluYXRlZAorICAgICAgICAgICAgLndoZXJlKChuKSA9PiBuLmlzQ2xhc3NOb2RlKQorICAgICAgICAgICAgLm1hcCgobikgPT4gbi5kYXRhLm5hbWUpCisgICAgICAgICAgICAudG9MaXN0KCk7CisgICAgICAgIGZpbmFsIHJldGFpbmVkRnVuY3Rpb25zID0gbWFpbk5vZGUuZG9taW5hdGVkCisgICAgICAgICAgICAud2hlcmUoKG4pID0+IG4uaXNGdW5jdGlvbk5vZGUpCisgICAgICAgICAgICAubWFwKChuKSA9PiBuLmRhdGEubmFtZSkKKyAgICAgICAgICAgIC50b0xpc3QoKTsKKyAgICAgICAgZXhwZWN0KHJldGFpbmVkQ2xhc3NlcywgY29udGFpbnNBbGwoWydBJywgJ0InLCAnSyddKSk7CisgICAgICAgIGV4cGVjdChyZXRhaW5lZEZ1bmN0aW9ucywgY29udGFpbnNBbGwoWydwcmludCcsICd0ZWFyT2ZmJ10pKTsKKworICAgICAgICBmaW5hbCBnZXRUZWFyT2ZmQ2FsbCA9CisgICAgICAgICAgICBjYWxsR3JhcGguZHluYW1pY0NhbGxzLmZpcnN0V2hlcmUoKG4pID0+IG4uZGF0YSA9PSAnZ2V0OnRvcm5PZmYnKTsKKyAgICAgICAgZXhwZWN0KAorICAgICAgICAgICAgZ2V0VGVhck9mZkNhbGwuZG9taW5hdGVkLm1hcCgobikgPT4gbi5kYXRhLnF1YWxpZmllZE5hbWUpLAorICAgICAgICAgICAgZXF1YWxzKFsKKyAgICAgICAgICAgICAgJ3BhY2thZ2U6aW5wdXQvaW5wdXQuZGFydDo6Qi5bdGVhci1vZmYtZXh0cmFjdG9yXSBnZXQ6dG9ybk9mZicsCisgICAgICAgICAgICAgICdwYWNrYWdlOmlucHV0L2lucHV0LmRhcnQ6OkEuW3RlYXItb2ZmLWV4dHJhY3Rvcl0gZ2V0OnRvcm5PZmYnLAorICAgICAgICAgICAgXSkpOworICAgICAgfSk7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcGtnL3ZtX3NuYXBzaG90X2FuYWx5c2lzL3Rlc3QvdXRpbHMuZGFydCBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L3V0aWxzLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YTkwNAotLS0gL2Rldi9udWxsCisrKyBiL3BrZy92bV9zbmFwc2hvdF9hbmFseXNpcy90ZXN0L3V0aWxzLmRhcnQKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworCitmaW5hbCBkYXJ0Mm5hdGl2ZSA9ICgpIHsKKyAgZmluYWwgc2RrQmluID0gcGF0aC5kaXJuYW1lKFBsYXRmb3JtLmV4ZWN1dGFibGUpOworICBmaW5hbCBkYXJ0Mm5hdGl2ZSA9CisgICAgICBwYXRoLmpvaW4oc2RrQmluLCBQbGF0Zm9ybS5pc1dpbmRvd3MgPyAnZGFydDJuYXRpdmUuYmF0JyA6ICdkYXJ0Mm5hdGl2ZScpOworCisgIGlmICghRmlsZShkYXJ0Mm5hdGl2ZSkuZXhpc3RzU3luYygpKSB7CisgICAgdGhyb3cgJ0ZhaWxlZCB0byBsb2NhdGUgZGFydDJuYXRpdmUgaW4gdGhlIFNESyc7CisgIH0KKworICByZXR1cm4gcGF0aC5jYW5vbmljYWxpemUoZGFydDJuYXRpdmUpOworfSgpOworCitGdXR1cmUgd2l0aEZsYWcoU3RyaW5nIHByZWZpeCwgTWFwPFN0cmluZywgU3RyaW5nPiBzb3VyY2UsIFN0cmluZyBmbGFnLAorICAgIEZ1dHVyZSBGdW5jdGlvbihTdHJpbmcgc2l6ZXNKc29uKSBmKSB7CisgIHJldHVybiB3aXRoVGVtcERpcihwcmVmaXgsIChkaXIpIGFzeW5jIHsKKyAgICBmaW5hbCBvdXRwdXRCaW5hcnkgPSBwYXRoLmpvaW4oZGlyLCAnb3V0cHV0LmV4ZScpOworICAgIGZpbmFsIHNpemVzSnNvbiA9IHBhdGguam9pbihkaXIsICdzaXplcy5qc29uJyk7CisgICAgZmluYWwgcGFja2FnZXMgPSBwYXRoLmpvaW4oZGlyLCAnLnBhY2thZ2VzJyk7CisgICAgZmluYWwgbWFpbkRhcnQgPSBwYXRoLmpvaW4oZGlyLCAnbWFpbi5kYXJ0Jyk7CisKKyAgICAvLyBDcmVhdGUgdGVzdCBpbnB1dC4KKyAgICBmb3IgKHZhciBmaWxlIGluIHNvdXJjZS5lbnRyaWVzKSB7CisgICAgICBhd2FpdCBGaWxlKHBhdGguam9pbihkaXIsIGZpbGUua2V5KSkud3JpdGVBc1N0cmluZyhmaWxlLnZhbHVlKTsKKyAgICB9CisgICAgYXdhaXQgRmlsZShwYWNrYWdlcykud3JpdGVBc1N0cmluZygnJycKK2lucHV0Oi4vCisnJycpOworICAgIGF3YWl0IEZpbGUobWFpbkRhcnQpLndyaXRlQXNTdHJpbmcoJycnCitpbXBvcnQgJ3BhY2thZ2U6aW5wdXQvaW5wdXQuZGFydCcgYXMgaW5wdXQ7CisKK3ZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJncykgPT4gaW5wdXQubWFpbihhcmdzKTsKKycnJyk7CisKKyAgICAvLyBDb21waWxlIGlucHV0LmRhcnQgdG8gbmF0aXZlIGFuZCBvdXRwdXQgaW5zdHJ1Y3Rpb24gc2l6ZXMuCisgICAgZmluYWwgcmVzdWx0ID0gYXdhaXQgUHJvY2Vzcy5ydW4oZGFydDJuYXRpdmUsIFsKKyAgICAgICctbycsCisgICAgICBvdXRwdXRCaW5hcnksCisgICAgICAnLS1wYWNrYWdlcz0kcGFja2FnZXMnLAorICAgICAgJy0tZXh0cmEtZ2VuLXNuYXBzaG90LW9wdGlvbnM9JGZsYWc9JHNpemVzSnNvbicsCisgICAgICBtYWluRGFydCwKKyAgICBdKTsKKworICAgIGV4cGVjdChyZXN1bHQuZXhpdENvZGUsIGVxdWFscygwKSwgcmVhc29uOiAnJycKK0NvbXBpbGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisKK3N0ZG91dDogJHtyZXN1bHQuc3Rkb3V0fQorc3RkZXJyOiAke3Jlc3VsdC5zdGRlcnJ9CisnJycpOworICAgIGV4cGVjdChGaWxlKG91dHB1dEJpbmFyeSkuZXhpc3RzU3luYygpLCBpc1RydWUsCisgICAgICAgIHJlYXNvbjogJ091dHB1dCBiaW5hcnkgZXhpc3RzJyk7CisgICAgZXhwZWN0KEZpbGUoc2l6ZXNKc29uKS5leGlzdHNTeW5jKCksIGlzVHJ1ZSwKKyAgICAgICAgcmVhc29uOiAnSW5zdHJ1Y3Rpb24gc2l6ZXMgb3V0cHV0IGV4aXN0cycpOworCisgICAgYXdhaXQgZihzaXplc0pzb24pOworICB9KTsKK30KKworRnV0dXJlIHdpdGhUZW1wRGlyKFN0cmluZyBwcmVmaXgsIEZ1dHVyZSBGdW5jdGlvbihTdHJpbmcgZGlyKSBmKSBhc3luYyB7CisgIGZpbmFsIHRlbXBEaXIgPQorICAgICAgRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoJ2luc3RydWN0aW9uLXNpemVzLXRlc3QtJHtwcmVmaXh9Jyk7CisgIHRyeSB7CisgICAgYXdhaXQgZih0ZW1wRGlyLnBhdGgpOworICB9IGZpbmFsbHkgeworICAgIHRlbXBEaXIuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9ydW50aW1lL0JVSUxELmduIGIvcnVudGltZS9CVUlMRC5nbgppbmRleCAxNGUwYjE3Li42ZGEyMmZiIDEwMDY0NAotLS0gYS9ydW50aW1lL0JVSUxELmduCisrKyBiL3J1bnRpbWUvQlVJTEQuZ24KQEAgLTEwMSw5ICsxMDEsNiBAQAogCiAgIGlmIChkYXJ0X3RhcmdldF9hcmNoID09ICJhcm0iKSB7CiAgICAgZGVmaW5lcyArPSBbICJUQVJHRVRfQVJDSF9BUk0iIF0KLSAgfSBlbHNlIGlmIChkYXJ0X3RhcmdldF9hcmNoID09ICJhcm12NiIpIHsKLSAgICBkZWZpbmVzICs9IFsgIlRBUkdFVF9BUkNIX0FSTSIgXQotICAgIGRlZmluZXMgKz0gWyAiVEFSR0VUX0FSQ0hfQVJNXzYiIF0KICAgfSBlbHNlIGlmIChkYXJ0X3RhcmdldF9hcmNoID09ICJhcm02NCIpIHsKICAgICBkZWZpbmVzICs9IFsgIlRBUkdFVF9BUkNIX0FSTTY0IiBdCiAgIH0gZWxzZSBpZiAoZGFydF90YXJnZXRfYXJjaCA9PSAieDY0IikgewpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vQlVJTEQuZ24gYi9ydW50aW1lL2Jpbi9CVUlMRC5nbgppbmRleCAwZmQ1YWNkLi43NDMxYjY0IDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi9CVUlMRC5nbgorKysgYi9ydW50aW1lL2Jpbi9CVUlMRC5nbgpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgfSBlbHNlIGlmICh1c2luZ19mdWNoc2lhX3NkaykgewogICAgICAgICBwdWJsaWNfZGVwcyA9IFsgIiRmdWNoc2lhX3Nka19yb290L3BrZzpmZGlvIiBdCiAgICAgICB9IGVsc2UgewotICAgICAgICBwdWJsaWNfZGVwcyA9IFsgIi8vemlyY29uL3B1YmxpYy9saWIvZmRpbyIgXQorICAgICAgICBwdWJsaWNfZGVwcyA9IFsgIi8vc2RrL2xpYi9mZGlvIiBdCiAgICAgICB9CiAgICAgfQogICAgIGluY2x1ZGVfZGlycyA9IFsgIi4uIiBdCkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICAgICAgICAiLy9zZGsvZmlkbC9mdWNoc2lhLm5ldHN0YWNrIiwKICAgICAgICAgICAiLy9zZGsvbGliL3N5cy9jcHAiLAogICAgICAgICBdCi0gICAgICAgIHB1YmxpY19kZXBzID0gWyAiLy96aXJjb24vcHVibGljL2xpYi9mZGlvIiBdCisgICAgICAgIHB1YmxpY19kZXBzID0gWyAiLy9zZGsvbGliL2ZkaW8iIF0KICAgICAgIH0KICAgICB9CiAKQEAgLTQ3NSw3ICs0NzUsNyBAQAogICAgICAgICAgICIvL3Nkay9maWRsL2Z1Y2hzaWEubmV0c3RhY2siLAogICAgICAgICAgICIvL3Nkay9saWIvc3lzL2NwcCIsCiAgICAgICAgIF0KLSAgICAgICAgcHVibGljX2RlcHMgPSBbICIvL3ppcmNvbi9wdWJsaWMvbGliL2ZkaW8iIF0KKyAgICAgICAgcHVibGljX2RlcHMgPSBbICIvL3Nkay9saWIvZmRpbyIgXQogICAgICAgfQogICAgIH0KIApAQCAtOTY0LDkgKzk2NCwxMSBAQAogCiAgIGFic19kZXBmaWxlID0gcmViYXNlX3BhdGgoZGVwZmlsZSkKICAgcmViYXNlZF9vdXRwdXQgPSByZWJhc2VfcGF0aChvdXRwdXQsIHJvb3RfYnVpbGRfZGlyKQorCiAgIHZtX2FyZ3MgPSBbCiAgICAgIi0tZGVwZmlsZT0kYWJzX2RlcGZpbGUiLAogICAgICItLWRlcGZpbGVfb3V0cHV0X2ZpbGVuYW1lPSRyZWJhc2VkX291dHB1dCIsCisgICAgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiwKICAgXQogCiAgIGFyZ3MgPSBbCmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi9mZmlfdGVzdC9mZmlfdGVzdF9mdW5jdGlvbnNfdm1zcGVjaWZpYy5jYyBiL3J1bnRpbWUvYmluL2ZmaV90ZXN0L2ZmaV90ZXN0X2Z1bmN0aW9uc192bXNwZWNpZmljLmNjCmluZGV4IDA1Yjg5NTIuLmU1NzYyNzcwIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi9mZmlfdGVzdC9mZmlfdGVzdF9mdW5jdGlvbnNfdm1zcGVjaWZpYy5jYworKysgYi9ydW50aW1lL2Jpbi9mZmlfdGVzdC9mZmlfdGVzdF9mdW5jdGlvbnNfdm1zcGVjaWZpYy5jYwpAQCAtODg5LDYgKzg4OSwxOCBAQAogICByZXR1cm4gdmFsdWU7CiB9CiAKKy8vIERvZXMgbm90IGhhdmUgYSBoYW5kbGUgaW4gaXQncyBvd24gc2lnbmF0dXJlLCBzbyBkb2VzIG5vdCBlbnRlciBhbmQgZXhpdAorLy8gc2NvcGUgaW4gdGhlIHRyYW1wb2xpbmUuCitEQVJUX0VYUE9SVCBpbnQ2NF90IFByb3BhZ2F0ZUVycm9yV2l0aG91dEhhbmRsZShEYXJ0X0hhbmRsZSAoKmNhbGxiYWNrKSgpKSB7CisgIERhcnRfRW50ZXJTY29wZSgpOworICBEYXJ0X0hhbmRsZSByZXN1bHQgPSBjYWxsYmFjaygpOworICBpZiAoRGFydF9Jc0Vycm9yKHJlc3VsdCkpIHsKKyAgICBEYXJ0X1Byb3BhZ2F0ZUVycm9yKHJlc3VsdCk7CisgIH0KKyAgRGFydF9FeGl0U2NvcGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKIERBUlRfRVhQT1JUIERhcnRfSGFuZGxlIFRydWVIYW5kbGUoKSB7CiAgIHJldHVybiBEYXJ0X1RydWUoKTsKIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL2dlbl9zbmFwc2hvdC5jYyBiL3J1bnRpbWUvYmluL2dlbl9zbmFwc2hvdC5jYwppbmRleCBhZmJjODk2Li5mNDlkZWZjIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi9nZW5fc25hcHNob3QuY2MKKysrIGIvcnVudGltZS9iaW4vZ2VuX3NuYXBzaG90LmNjCkBAIC0xNTcsNyArMTU3LDcgQEAKICItLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAiICBEaXNwbGF5IHRoaXMgbWVzc2FnZSAoYWRkIC0tdmVyYm9zZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYWxsIFZNIG9wdGlvbnMpLlxuIgogIi0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSIgIFByaW50IHRoZSBWTSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisiICBQcmludCB0aGUgU0RLIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKICJUbyBjcmVhdGUgYSBjb3JlIHNuYXBzaG90OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAiLS1zbmFwc2hvdF9raW5kPWNvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgUHJpbnRVc2FnZSgpOwogICAgIFBsYXRmb3JtOjpFeGl0KDApOwogICB9IGVsc2UgaWYgKHZlcnNpb24pIHsKLSAgICBTeXNsb2c6OlByaW50RXJyKCJEYXJ0IFZNIHZlcnNpb246ICVzXG4iLCBEYXJ0X1ZlcnNpb25TdHJpbmcoKSk7CisgICAgU3lzbG9nOjpQcmludEVycigiRGFydCBTREsgdmVyc2lvbjogJXNcbiIsIERhcnRfVmVyc2lvblN0cmluZygpKTsKICAgICBQbGF0Zm9ybTo6RXhpdCgwKTsKICAgfQogCmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi9tYWluLmNjIGIvcnVudGltZS9iaW4vbWFpbi5jYwppbmRleCBkMjQxZTY5Li4yNWU3YzJiIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi9tYWluLmNjCisrKyBiL3J1bnRpbWUvYmluL21haW4uY2MKQEAgLTUxNSwxNiArNTE1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIGVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZXhpdF9jb2RlKSB7CiAjaWYgIWRlZmluZWQoUFJPRFVDVCkKLSAgQVNTRVJUKHNjcmlwdF91cmkgIT0gTlVMTCk7Ci0gIERhcnRfSXNvbGF0ZSBpc29sYXRlID0gTlVMTDsKKyAgQVNTRVJUKHNjcmlwdF91cmkgIT0gbnVsbHB0cik7CisgIERhcnRfSXNvbGF0ZSBpc29sYXRlID0gbnVsbHB0cjsKICAgYXV0byBpc29sYXRlX2dyb3VwX2RhdGEgPQogICAgICAgbmV3IElzb2xhdGVHcm91cERhdGEoc2NyaXB0X3VyaSwgcGFja2FnZXNfY29uZmlnLCBudWxscHRyLCBmYWxzZSk7CisgIEFTU0VSVChmbGFncyAhPSBudWxscHRyKTsKIAogI2lmIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogICAvLyBBT1Q6IEFsbCBpc29sYXRlcyBzdGFydCBmcm9tIHRoZSBhcHAgc25hcHNob3QuCiAgIGNvbnN0IHVpbnQ4X3QqIGlzb2xhdGVfc25hcHNob3RfZGF0YSA9IGFwcF9pc29sYXRlX3NuYXBzaG90X2RhdGE7CiAgIGNvbnN0IHVpbnQ4X3QqIGlzb2xhdGVfc25hcHNob3RfaW5zdHJ1Y3Rpb25zID0KICAgICAgIGFwcF9pc29sYXRlX3NuYXBzaG90X2luc3RydWN0aW9uczsKKyAgZmxhZ3MtPm51bGxfc2FmZXR5ID0KKyAgICAgIERhcnRfRGV0ZWN0TnVsbFNhZmV0eShudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBpc29sYXRlX3NuYXBzaG90X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZV9zbmFwc2hvdF9pbnN0cnVjdGlvbnMsIG51bGxwdHIsIC0xKTsKICAgaXNvbGF0ZSA9IERhcnRfQ3JlYXRlSXNvbGF0ZUdyb3VwKAogICAgICAgc2NyaXB0X3VyaSwgREFSVF9WTV9TRVJWSUNFX0lTT0xBVEVfTkFNRSwgaXNvbGF0ZV9zbmFwc2hvdF9kYXRhLAogICAgICAgaXNvbGF0ZV9zbmFwc2hvdF9pbnN0cnVjdGlvbnMsIGZsYWdzLCBpc29sYXRlX2dyb3VwX2RhdGEsCkBAIC01MzMsNyArNTM3LDYgQEAKICAgLy8gSklUOiBTZXJ2aWNlIGlzb2xhdGUgdXNlcyB0aGUgY29yZSBsaWJyYXJpZXMgc25hcHNob3QuCiAKICAgLy8gU2V0IGZsYWcgdG8gbG9hZCBhbmQgcmV0YWluIHRoZSB2bXNlcnZpY2UgbGlicmFyeS4KLSAgQVNTRVJUKGZsYWdzICE9IE5VTEwpOwogICBmbGFncy0+bG9hZF92bXNlcnZpY2VfbGlicmFyeSA9IHRydWU7CiAgIGNvbnN0IHVpbnQ4X3QqIGlzb2xhdGVfc25hcHNob3RfZGF0YSA9IGNvcmVfaXNvbGF0ZV9zbmFwc2hvdF9kYXRhOwogICBjb25zdCB1aW50OF90KiBpc29sYXRlX3NuYXBzaG90X2luc3RydWN0aW9ucyA9CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi9tYWluX29wdGlvbnMuY2MgYi9ydW50aW1lL2Jpbi9tYWluX29wdGlvbnMuY2MKaW5kZXggOTM1MjM5My4uZTNmMTk1YiAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vbWFpbl9vcHRpb25zLmNjCisrKyBiL3J1bnRpbWUvYmluL21haW5fb3B0aW9ucy5jYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgaG90X3JlbG9hZF9yb2xsYmFja190ZXN0X21vZGVfY2FsbGJhY2spOwogCiB2b2lkIE9wdGlvbnM6OlByaW50VmVyc2lvbigpIHsKLSAgU3lzbG9nOjpQcmludEVycigiRGFydCBWTSB2ZXJzaW9uOiAlc1xuIiwgRGFydF9WZXJzaW9uU3RyaW5nKCkpOworICBTeXNsb2c6OlByaW50RXJyKCJEYXJ0IFNESyB2ZXJzaW9uOiAlc1xuIiwgRGFydF9WZXJzaW9uU3RyaW5nKCkpOwogfQogCiAvLyBjbGFuZy1mb3JtYXQgb2ZmCkBAIC0xNjksNyArMTY5LDcgQEAKICIgICAgICAgICAgICAgICAgICAgIGtlcm5lbChkZWZhdWx0KSBvciBhcHAtaml0XG4iCiAiICAgIDxmaWxlX25hbWU+IHNwZWNpZmllcyB0aGUgZmlsZSBpbnRvIHdoaWNoIHRoZSBzbmFwc2hvdCBpcyB3cml0dGVuXG4iCiAiLS12ZXJzaW9uXG4iCi0iICBQcmludCB0aGUgVk0gdmVyc2lvbi5cbiIpOworIiAgUHJpbnQgdGhlIFNESyB2ZXJzaW9uLlxuIik7CiAgIH0gZWxzZSB7CiAgICAgU3lzbG9nOjpQcmludEVycigKICJTdXBwb3J0ZWQgb3B0aW9uczpcbiIKZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3NuYXBzaG90X3V0aWxzLmNjIGIvcnVudGltZS9iaW4vc25hcHNob3RfdXRpbHMuY2MKaW5kZXggN2U4MzY5YS4uNDM5MGQyNCAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vc25hcHNob3RfdXRpbHMuY2MKKysrIGIvcnVudGltZS9iaW4vc25hcHNob3RfdXRpbHMuY2MKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBiaW4gewogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrQXBwU25hcHNob3RIZWFkZXJTaXplID0gNSAqIGtJbnQ2NFNpemU7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrQXBwU25hcHNob3RQYWdlU2l6ZSA9IDQgKiBLQjsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtBcHBTbmFwc2hvdFBhZ2VTaXplID0gMTYgKiBLQjsKIAogY2xhc3MgTWFwcGVkQXBwU25hcHNob3QgOiBwdWJsaWMgQXBwU25hcHNob3QgewogIHB1YmxpYzoKZGlmZiAtLWdpdCBhL3J1bnRpbWUvaW5jbHVkZS9kYXJ0X2FwaS5oIGIvcnVudGltZS9pbmNsdWRlL2RhcnRfYXBpLmgKaW5kZXggYTU4MDk1Yy4uZGI3OGM3NiAxMDA2NDQKLS0tIGEvcnVudGltZS9pbmNsdWRlL2RhcnRfYXBpLmgKKysrIGIvcnVudGltZS9pbmNsdWRlL2RhcnRfYXBpLmgKQEAgLTE5ODQsNiArMTk4NCwxMCBAQAogLyoqCiAgKiBHZXRzIGEgVVRGLTggZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiBhIFN0cmluZy4KICAqCisgKiBBbnkgdW5wYWlyZWQgc3Vycm9nYXRlIGNvZGUgcG9pbnRzIGluIHRoZSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgYXMKKyAqIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgKFUrRkZGRCwgMHhFRiAweEJGIDB4QkQgaW4gVVRGLTgpLiBJZiB5b3UgbmVlZAorICogdG8gcHJlc2VydmUgdW5wYWlyZWQgc3Vycm9nYXRlcywgdXNlIHRoZSBEYXJ0X1N0cmluZ1RvVVRGMTYgZnVuY3Rpb24uCisgKgogICogXHBhcmFtIHN0ciBBIHN0cmluZy4KICAqIFxwYXJhbSB1dGY4X2FycmF5IFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRlZCBhcyBVVEYtOCBjb2RlCiAgKiAgIHVuaXRzLiAgVGhpcyBVVEYtOCBhcnJheSBpcyBzY29wZSBhbGxvY2F0ZWQgYW5kIGlzIG9ubHkgdmFsaWQKZGlmZiAtLWdpdCBhL3J1bnRpbWUvcGxhdGZvcm0vdW5pY29kZS5oIGIvcnVudGltZS9wbGF0Zm9ybS91bmljb2RlLmgKaW5kZXggNTgzMzhlZC4uNjRkODk1MiAxMDA2NDQKLS0tIGEvcnVudGltZS9wbGF0Zm9ybS91bmljb2RlLmgKKysrIGIvcnVudGltZS9wbGF0Zm9ybS91bmljb2RlLmgKQEAgLTE4LDYgKzE4LDggQEAKICAgc3RhdGljIGNvbnN0IGludDMyX3Qga01heENvZGVQb2ludCA9IDB4MTBGRkZGOwogICBzdGF0aWMgY29uc3QgaW50MzJfdCBrSW52YWxpZENoYXIgPSAweEZGRkZGRkZGOwogCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtSZXBsYWNlbWVudENoYXIgPSAweEZGRkQ7CisKICAgc3RhdGljIGJvb2wgSXNMYXRpbjEoaW50MzJfdCBjb2RlX3BvaW50KSB7CiAgICAgcmV0dXJuIChjb2RlX3BvaW50ID49IDApICYmIChjb2RlX3BvaW50IDw9IDB4RkYpOwogICB9CmRpZmYgLS1naXQgYS9ydW50aW1lL3Rlc3RzL3ZtL2RhcnQvc2RrX2hhc2hfdGVzdC5kYXJ0IGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3Nka19oYXNoX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA1ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3Nka19oYXNoX3Rlc3QuZGFydApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCitpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworaW1wb3J0ICdzbmFwc2hvdF90ZXN0X2hlbHBlci5kYXJ0JzsKKworLy8gS2VlcCBpbiBzeW5jIHdpdGggcGtnL2tlcm5lbC9saWIvYmluYXJ5L3RhZy5kYXJ0OgorY29uc3QgdGFnQ29tcG9uZW50RmlsZSA9IFsweDkwLCAweEFCLCAweENELCAweEVGXTsKK2NvbnN0IHRhZ0JpbmFyeUZvcm1hdFZlcnNpb24gPSBbMHgwMCwgMHgwMCwgMHgwMCwgNDNdOworCitGdXR1cmU8dm9pZD4gbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgeworICBpZiAoYXJncy5sZW5ndGggPT0gMSAmJiBhcmdzWzBdID09ICctLWNoaWxkJykgeworICAgIHByaW50KCdIZWxsbywgU0RLIEhhc2ghJyk7CisgICAgcmV0dXJuOworICB9CisKKyAgZmluYWwgU3RyaW5nIHNvdXJjZVBhdGggPQorICAgICAgcGF0aC5qb2luKCdydW50aW1lJywgJ3Rlc3RzJywgJ3ZtJywgJ2RhcnRfMicsICdzZGtfaGFzaF90ZXN0LmRhcnQnKTsKKworICBhd2FpdCB3aXRoVGVtcERpcigoU3RyaW5nIHRtcCkgYXN5bmMgeworICAgIGZpbmFsIFN0cmluZyBkaWxsUGF0aCA9IHBhdGguam9pbih0bXAsICd0ZXN0LmRpbGwnKTsKKworICAgIHsKKyAgICAgIGZpbmFsIHJlc3VsdCA9IGF3YWl0IFByb2Nlc3MucnVuKGRhcnQsIFsKKyAgICAgICAgZ2VuS2VybmVsLAorICAgICAgICAnLS1wbGF0Zm9ybScsCisgICAgICAgIHBsYXRmb3JtRGlsbCwKKyAgICAgICAgJy1vJywKKyAgICAgICAgZGlsbFBhdGgsCisgICAgICAgIHNvdXJjZVBhdGgsCisgICAgICBdKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoJycsIHJlc3VsdC5zdGRlcnIpOworICAgICAgRXhwZWN0LmVxdWFscygwLCByZXN1bHQuZXhpdENvZGUpOworICAgICAgRXhwZWN0LmVxdWFscygnJywgcmVzdWx0LnN0ZG91dCk7CisgICAgfQorCisgICAgeworICAgICAgZmluYWwgcmVzdWx0ID0gYXdhaXQgUHJvY2Vzcy5ydW4oZGFydCwgW2RpbGxQYXRoLCAnLS1jaGlsZCddKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoJycsIHJlc3VsdC5zdGRlcnIpOworICAgICAgRXhwZWN0LmVxdWFscygwLCByZXN1bHQuZXhpdENvZGUpOworICAgICAgRXhwZWN0LmVxdWFscygnSGVsbG8sIFNESyBIYXNoIScsIHJlc3VsdC5zdGRvdXQudHJpbSgpKTsKKyAgICB9CisKKyAgICAvLyBJbnZhbGlkYXRlIHRoZSBTREsgaGFzaCBpbiB0aGUga2VybmVsIGRpbGw6CisgICAgeworICAgICAgZmluYWwgbXlGaWxlID0gRmlsZShkaWxsUGF0aCk7CisgICAgICBVaW50OExpc3QgYnl0ZXMgPSBteUZpbGUucmVhZEFzQnl0ZXNTeW5jKCk7CisgICAgICAvLyBUaGUgU0RLIEhhc2ggaXMgbG9jYXRlZCBhZnRlciB0aGUgQ29tcG9uZW50RmlsZSBhbmQgQmluYXJ5Rm9ybWF0VmVyc2lvbgorICAgICAgLy8gdGFncyAoYm90aCBVSW50MzIpLgorICAgICAgRXhwZWN0Lmxpc3RFcXVhbHModGFnQ29tcG9uZW50RmlsZSwgYnl0ZXMuc3VibGlzdCgwLCA0KSk7CisgICAgICBFeHBlY3QubGlzdEVxdWFscyh0YWdCaW5hcnlGb3JtYXRWZXJzaW9uLCBieXRlcy5zdWJsaXN0KDQsIDgpKTsKKyAgICAgIC8vIEZsaXAgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGhhc2g6CisgICAgICBieXRlc1s4XSBePSBieXRlc1s4XTsKKyAgICAgIG15RmlsZS53cml0ZUFzQnl0ZXNTeW5jKGJ5dGVzKTsKKyAgICB9CisKKyAgICB7CisgICAgICBmaW5hbCByZXN1bHQgPSBhd2FpdCBQcm9jZXNzLnJ1bihkYXJ0LCBbZGlsbFBhdGgsICctLWNoaWxkJ10pOworICAgICAgRXhwZWN0LmVxdWFscygKKyAgICAgICAgICAnQ2FuXCd0IGxvYWQgS2VybmVsIGJpbmFyeTogSW52YWxpZCBTREsgaGFzaC4nLCByZXN1bHQuc3RkZXJyLnRyaW0oKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKDI1MywgcmVzdWx0LmV4aXRDb2RlKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoJycsIHJlc3VsdC5zdGRvdXQpOworICAgIH0KKworICAgIC8vIFplcm8gb3V0IHRoZSBTREsgaGFzaCBpbiB0aGUga2VybmVsIGRpbGwgdG8gZGlzYWJsZSB0aGUgY2hlY2s6CisgICAgeworICAgICAgZmluYWwgbXlGaWxlID0gRmlsZShkaWxsUGF0aCk7CisgICAgICBVaW50OExpc3QgYnl0ZXMgPSBteUZpbGUucmVhZEFzQnl0ZXNTeW5jKCk7CisgICAgICBieXRlcy5zZXRSYW5nZSg4LCAxOCwgYXNjaWkuZW5jb2RlKCcwMDAwMDAwMDAwJykpOworICAgICAgbXlGaWxlLndyaXRlQXNCeXRlc1N5bmMoYnl0ZXMpOworICAgIH0KKworICAgIHsKKyAgICAgIGZpbmFsIHJlc3VsdCA9IGF3YWl0IFByb2Nlc3MucnVuKGRhcnQsIFtkaWxsUGF0aCwgJy0tY2hpbGQnXSk7CisgICAgICBFeHBlY3QuZXF1YWxzKCcnLCByZXN1bHQuc3RkZXJyKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMCwgcmVzdWx0LmV4aXRDb2RlKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoJ0hlbGxvLCBTREsgSGFzaCEnLCByZXN1bHQuc3Rkb3V0LnRyaW0oKSk7CisgICAgfQorICB9KTsKK30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdGVzdHMvdm0vZGFydC9zbmFwc2hvdF90ZXN0X2hlbHBlci5kYXJ0IGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3NuYXBzaG90X3Rlc3RfaGVscGVyLmRhcnQKaW5kZXggODUzZmMzMy4uOTc0MDUwZSAxMDA2NDQKLS0tIGEvcnVudGltZS90ZXN0cy92bS9kYXJ0L3NuYXBzaG90X3Rlc3RfaGVscGVyLmRhcnQKKysrIGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3NuYXBzaG90X3Rlc3RfaGVscGVyLmRhcnQKQEAgLTQ4LDYgKzQ4LDcgQEAKIGZpbmFsIFN0cmluZyBidWlsZERpciA9IHAuZGlybmFtZShQbGF0Zm9ybS5leGVjdXRhYmxlKTsKIGZpbmFsIFN0cmluZyBwbGF0Zm9ybURpbGwgPSBwLmpvaW4oYnVpbGREaXIsICJ2bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbCIpOwogZmluYWwgU3RyaW5nIGdlblNuYXBzaG90ID0gcC5qb2luKGJ1aWxkRGlyLCAiZ2VuX3NuYXBzaG90JHtleGVjdXRhYmxlU3VmZml4fSIpOworZmluYWwgU3RyaW5nIGRhcnQgPSBwLmpvaW4oYnVpbGREaXIsICJkYXJ0JHtleGVjdXRhYmxlU3VmZml4fSIpOwogZmluYWwgU3RyaW5nIGRhcnRQcmVjb21waWxlZFJ1bnRpbWUgPQogICAgIHAuam9pbihidWlsZERpciwgImRhcnRfcHJlY29tcGlsZWRfcnVudGltZSR7ZXhlY3V0YWJsZVN1ZmZpeH0iKTsKIGZpbmFsIFN0cmluZyBnZW5LZXJuZWwgPSBwLmpvaW4oInBrZyIsICJ2bSIsICJiaW4iLCAiZ2VuX2tlcm5lbC5kYXJ0Iik7CmRpZmYgLS1naXQgYS9ydW50aW1lL3Rlc3RzL3ZtL2RhcnQvc3dpdGNoYWJsZV9jYWxsX21vbm9tb3JwaGljX3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0IGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3N3aXRjaGFibGVfY2FsbF9tb25vbW9ycGhpY19yZWdyZXNzaW9uXzQyNTE3X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ0YjMyCi0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3N3aXRjaGFibGVfY2FsbF9tb25vbW9ycGhpY19yZWdyZXNzaW9uXzQyNTE3X3Rlc3QuZGFydApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitmaW5hbCBkeW5hbWljIGwgPSA8ZHluYW1pYz5bQSgpLCBCKCldOworCittYWluKCkgeworICAvLyBTd2l0Y2hhYmxlIGNhbGwgc2l0ZSBnb2VzIGZyb20gVW5saW5rZWRDYWxsIC0+IE1vbm9tb3JwaGljLgorICBFeHBlY3QuZXF1YWxzKCdDKDQyKScsIGJhcigwLCA0MikpOworICAvLyBTd2l0Y2hhYmxlIGNhbGwgc2l0ZSBnb2VzIGZyb20gTW9ub21vcnBoaWMgLT4gUG9seW1vcnBoaWMuCisgIC8vIEl0IGhhcyB0byByZXRhaW4gdGhlIGZhY3QgdGhhdCBjYWxsIHNpdGUgaXMgZHluOiouCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgPT4gYmFyKDEsICdhJykpOworICBFeHBlY3QuZXF1YWxzKCdCKDQzKScsIGJhcigxLCA0MikpOworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQorYmFyKGludCBqLCBkeW5hbWljIGFyZykgPT4gbFtqXS5mb28oYXJnKTsKKworY2xhc3MgQSB7CisgIC8vIFRoaXMgd2lsbCBub3QgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcworICAvLyB0b3AtdHlwZS4KKyAgU3RyaW5nIGZvbyhPYmplY3Q/IGEpID0+ICdDKCRhKSc7Cit9CisKK2NsYXNzIEIgeworICAvLyBUaGlzIHdpbGwgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKKyAgLy8gdG9wLXR5cGUgKGFuZCBuZWl0aGVyIGNvdmFyaWFudCkKKyAgU3RyaW5nIGZvbyhpbnQgYSkgPT4gJ0IoJHthICsgMX0pJzsKK30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdGVzdHMvdm0vZGFydC9zd2l0Y2hhYmxlX2NhbGxfc2luZ2xlX3RhcmdldF9yZWdyZXNzaW9uXzQyNTE3X3Rlc3QuZGFydCBiL3J1bnRpbWUvdGVzdHMvdm0vZGFydC9zd2l0Y2hhYmxlX2NhbGxfc2luZ2xlX3RhcmdldF9yZWdyZXNzaW9uXzQyNTE3X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODc5YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS90ZXN0cy92bS9kYXJ0L3N3aXRjaGFibGVfY2FsbF9zaW5nbGVfdGFyZ2V0X3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2ZpbmFsIGR5bmFtaWMgbCA9IDxkeW5hbWljPltBKCksIEExKCksIEIoKV07CisKK21haW4oKSB7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBVbmxpbmtlZENhbGwgLT4gTW9ub21vcnBoaWMuCisgIEV4cGVjdC5lcXVhbHMoJ0MoNDIpJywgYmFyKDAsIDQyKSk7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBNb25vbW9ycGhpYyAtPiBTaW5nbGVUYXJnZXQuCisgIEV4cGVjdC5lcXVhbHMoJ0MoNDIpJywgYmFyKDEsIDQyKSk7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBTaW5nbGVUYXJnZXQgLT4gUG9seW1vcnBoaWMuCisgIC8vIEl0IGhhcyB0byByZXRhaW4gdGhlIGZhY3QgdGhhdCBjYWxsIHNpdGUgaXMgZHluOiouCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgPT4gYmFyKDIsICdhJykpOworICBFeHBlY3QuZXF1YWxzKCdCKDQzKScsIGJhcigyLCA0MikpOworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQorYmFyKGludCBqLCBkeW5hbWljIGFyZykgPT4gbFtqXS5mb28oYXJnKTsKKworY2xhc3MgQSB7CisgIC8vIFRoaXMgd2lsbCBub3QgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcworICAvLyB0b3AtdHlwZS4KKyAgU3RyaW5nIGZvbyhPYmplY3Q/IGEpID0+ICdDKCRhKSc7Cit9CisKK2NsYXNzIEExIGV4dGVuZHMgQSB7CisgIC8vIEEgZGlmZmVyZW50IHJlY2VpdmVyIGNpZCBidXQgd2l0aCBzYW1lIHRhcmdldCAoaS5lLiB3ZSBkbyBub3Qgb3ZlcnJpZGUgQSkuCit9CisKK2NsYXNzIEIgeworICAvLyBUaGlzIHdpbGwgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKKyAgLy8gdG9wLXR5cGUgKGFuZCBuZWl0aGVyIGNvdmFyaWFudCkKKyAgU3RyaW5nIGZvbyhpbnQgYSkgPT4gJ0IoJHthICsgMX0pJzsKK30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdGVzdHMvdm0vZGFydF8yL3Nka19oYXNoX3Rlc3QuZGFydCBiL3J1bnRpbWUvdGVzdHMvdm0vZGFydF8yL3Nka19oYXNoX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA1ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc2RrX2hhc2hfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK2ltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitpbXBvcnQgJ3NuYXBzaG90X3Rlc3RfaGVscGVyLmRhcnQnOworCisvLyBLZWVwIGluIHN5bmMgd2l0aCBwa2cva2VybmVsL2xpYi9iaW5hcnkvdGFnLmRhcnQ6Citjb25zdCB0YWdDb21wb25lbnRGaWxlID0gWzB4OTAsIDB4QUIsIDB4Q0QsIDB4RUZdOworY29uc3QgdGFnQmluYXJ5Rm9ybWF0VmVyc2lvbiA9IFsweDAwLCAweDAwLCAweDAwLCA0M107CisKK0Z1dHVyZTx2b2lkPiBtYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIGlmIChhcmdzLmxlbmd0aCA9PSAxICYmIGFyZ3NbMF0gPT0gJy0tY2hpbGQnKSB7CisgICAgcHJpbnQoJ0hlbGxvLCBTREsgSGFzaCEnKTsKKyAgICByZXR1cm47CisgIH0KKworICBmaW5hbCBTdHJpbmcgc291cmNlUGF0aCA9CisgICAgICBwYXRoLmpvaW4oJ3J1bnRpbWUnLCAndGVzdHMnLCAndm0nLCAnZGFydF8yJywgJ3Nka19oYXNoX3Rlc3QuZGFydCcpOworCisgIGF3YWl0IHdpdGhUZW1wRGlyKChTdHJpbmcgdG1wKSBhc3luYyB7CisgICAgZmluYWwgU3RyaW5nIGRpbGxQYXRoID0gcGF0aC5qb2luKHRtcCwgJ3Rlc3QuZGlsbCcpOworCisgICAgeworICAgICAgZmluYWwgcmVzdWx0ID0gYXdhaXQgUHJvY2Vzcy5ydW4oZGFydCwgWworICAgICAgICBnZW5LZXJuZWwsCisgICAgICAgICctLXBsYXRmb3JtJywKKyAgICAgICAgcGxhdGZvcm1EaWxsLAorICAgICAgICAnLW8nLAorICAgICAgICBkaWxsUGF0aCwKKyAgICAgICAgc291cmNlUGF0aCwKKyAgICAgIF0pOworICAgICAgRXhwZWN0LmVxdWFscygnJywgcmVzdWx0LnN0ZGVycik7CisgICAgICBFeHBlY3QuZXF1YWxzKDAsIHJlc3VsdC5leGl0Q29kZSk7CisgICAgICBFeHBlY3QuZXF1YWxzKCcnLCByZXN1bHQuc3Rkb3V0KTsKKyAgICB9CisKKyAgICB7CisgICAgICBmaW5hbCByZXN1bHQgPSBhd2FpdCBQcm9jZXNzLnJ1bihkYXJ0LCBbZGlsbFBhdGgsICctLWNoaWxkJ10pOworICAgICAgRXhwZWN0LmVxdWFscygnJywgcmVzdWx0LnN0ZGVycik7CisgICAgICBFeHBlY3QuZXF1YWxzKDAsIHJlc3VsdC5leGl0Q29kZSk7CisgICAgICBFeHBlY3QuZXF1YWxzKCdIZWxsbywgU0RLIEhhc2ghJywgcmVzdWx0LnN0ZG91dC50cmltKCkpOworICAgIH0KKworICAgIC8vIEludmFsaWRhdGUgdGhlIFNESyBoYXNoIGluIHRoZSBrZXJuZWwgZGlsbDoKKyAgICB7CisgICAgICBmaW5hbCBteUZpbGUgPSBGaWxlKGRpbGxQYXRoKTsKKyAgICAgIFVpbnQ4TGlzdCBieXRlcyA9IG15RmlsZS5yZWFkQXNCeXRlc1N5bmMoKTsKKyAgICAgIC8vIFRoZSBTREsgSGFzaCBpcyBsb2NhdGVkIGFmdGVyIHRoZSBDb21wb25lbnRGaWxlIGFuZCBCaW5hcnlGb3JtYXRWZXJzaW9uCisgICAgICAvLyB0YWdzIChib3RoIFVJbnQzMikuCisgICAgICBFeHBlY3QubGlzdEVxdWFscyh0YWdDb21wb25lbnRGaWxlLCBieXRlcy5zdWJsaXN0KDAsIDQpKTsKKyAgICAgIEV4cGVjdC5saXN0RXF1YWxzKHRhZ0JpbmFyeUZvcm1hdFZlcnNpb24sIGJ5dGVzLnN1Ymxpc3QoNCwgOCkpOworICAgICAgLy8gRmxpcCB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaGFzaDoKKyAgICAgIGJ5dGVzWzhdIF49IGJ5dGVzWzhdOworICAgICAgbXlGaWxlLndyaXRlQXNCeXRlc1N5bmMoYnl0ZXMpOworICAgIH0KKworICAgIHsKKyAgICAgIGZpbmFsIHJlc3VsdCA9IGF3YWl0IFByb2Nlc3MucnVuKGRhcnQsIFtkaWxsUGF0aCwgJy0tY2hpbGQnXSk7CisgICAgICBFeHBlY3QuZXF1YWxzKAorICAgICAgICAgICdDYW5cJ3QgbG9hZCBLZXJuZWwgYmluYXJ5OiBJbnZhbGlkIFNESyBoYXNoLicsIHJlc3VsdC5zdGRlcnIudHJpbSgpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMjUzLCByZXN1bHQuZXhpdENvZGUpOworICAgICAgRXhwZWN0LmVxdWFscygnJywgcmVzdWx0LnN0ZG91dCk7CisgICAgfQorCisgICAgLy8gWmVybyBvdXQgdGhlIFNESyBoYXNoIGluIHRoZSBrZXJuZWwgZGlsbCB0byBkaXNhYmxlIHRoZSBjaGVjazoKKyAgICB7CisgICAgICBmaW5hbCBteUZpbGUgPSBGaWxlKGRpbGxQYXRoKTsKKyAgICAgIFVpbnQ4TGlzdCBieXRlcyA9IG15RmlsZS5yZWFkQXNCeXRlc1N5bmMoKTsKKyAgICAgIGJ5dGVzLnNldFJhbmdlKDgsIDE4LCBhc2NpaS5lbmNvZGUoJzAwMDAwMDAwMDAnKSk7CisgICAgICBteUZpbGUud3JpdGVBc0J5dGVzU3luYyhieXRlcyk7CisgICAgfQorCisgICAgeworICAgICAgZmluYWwgcmVzdWx0ID0gYXdhaXQgUHJvY2Vzcy5ydW4oZGFydCwgW2RpbGxQYXRoLCAnLS1jaGlsZCddKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoJycsIHJlc3VsdC5zdGRlcnIpOworICAgICAgRXhwZWN0LmVxdWFscygwLCByZXN1bHQuZXhpdENvZGUpOworICAgICAgRXhwZWN0LmVxdWFscygnSGVsbG8sIFNESyBIYXNoIScsIHJlc3VsdC5zdGRvdXQudHJpbSgpKTsKKyAgICB9CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc25hcHNob3RfdGVzdF9oZWxwZXIuZGFydCBiL3J1bnRpbWUvdGVzdHMvdm0vZGFydF8yL3NuYXBzaG90X3Rlc3RfaGVscGVyLmRhcnQKaW5kZXggOWJlODEwYS4uYjI3NTRkMCAxMDA2NDQKLS0tIGEvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc25hcHNob3RfdGVzdF9oZWxwZXIuZGFydAorKysgYi9ydW50aW1lL3Rlc3RzL3ZtL2RhcnRfMi9zbmFwc2hvdF90ZXN0X2hlbHBlci5kYXJ0CkBAIC00OCw2ICs0OCw3IEBACiBmaW5hbCBTdHJpbmcgYnVpbGREaXIgPSBwLmRpcm5hbWUoUGxhdGZvcm0uZXhlY3V0YWJsZSk7CiBmaW5hbCBTdHJpbmcgcGxhdGZvcm1EaWxsID0gcC5qb2luKGJ1aWxkRGlyLCAidm1fcGxhdGZvcm1fc3Ryb25nLmRpbGwiKTsKIGZpbmFsIFN0cmluZyBnZW5TbmFwc2hvdCA9IHAuam9pbihidWlsZERpciwgImdlbl9zbmFwc2hvdCR7ZXhlY3V0YWJsZVN1ZmZpeH0iKTsKK2ZpbmFsIFN0cmluZyBkYXJ0ID0gcC5qb2luKGJ1aWxkRGlyLCAiZGFydCR7ZXhlY3V0YWJsZVN1ZmZpeH0iKTsKIGZpbmFsIFN0cmluZyBkYXJ0UHJlY29tcGlsZWRSdW50aW1lID0KICAgICBwLmpvaW4oYnVpbGREaXIsICJkYXJ0X3ByZWNvbXBpbGVkX3J1bnRpbWUke2V4ZWN1dGFibGVTdWZmaXh9Iik7CiBmaW5hbCBTdHJpbmcgZ2VuS2VybmVsID0gcC5qb2luKCJwa2ciLCAidm0iLCAiYmluIiwgImdlbl9rZXJuZWwuZGFydCIpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc3dpdGNoYWJsZV9jYWxsX21vbm9tb3JwaGljX3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0IGIvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc3dpdGNoYWJsZV9jYWxsX21vbm9tb3JwaGljX3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzhmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL3Rlc3RzL3ZtL2RhcnRfMi9zd2l0Y2hhYmxlX2NhbGxfbW9ub21vcnBoaWNfcmVncmVzc2lvbl80MjUxN190ZXN0LmRhcnQKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworZmluYWwgZHluYW1pYyBsID0gPGR5bmFtaWM+W0EoKSwgQigpXTsKKworbWFpbigpIHsKKyAgLy8gU3dpdGNoYWJsZSBjYWxsIHNpdGUgZ29lcyBmcm9tIFVubGlua2VkQ2FsbCAtPiBNb25vbW9ycGhpYy4KKyAgRXhwZWN0LmVxdWFscygnQyg0MiknLCBiYXIoMCwgNDIpKTsKKyAgLy8gU3dpdGNoYWJsZSBjYWxsIHNpdGUgZ29lcyBmcm9tIE1vbm9tb3JwaGljIC0+IFBvbHltb3JwaGljLgorICAvLyBJdCBoYXMgdG8gcmV0YWluIHRoZSBmYWN0IHRoYXQgY2FsbCBzaXRlIGlzIGR5bjoqLgorICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpID0+IGJhcigxLCAnYScpKTsKKyAgRXhwZWN0LmVxdWFscygnQig0MyknLCBiYXIoMSwgNDIpKTsKK30KKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK2JhcihpbnQgaiwgZHluYW1pYyBhcmcpID0+IGxbal0uZm9vKGFyZyk7CisKK2NsYXNzIEEgeworICAvLyBUaGlzIHdpbGwgbm90IGdldCBhIGR5bjoqIGZvcndhcmRlciBiZWNhdXNlIGl0J3MgcGFyYW1ldGVyIHR5cGUgaXMKKyAgLy8gdG9wLXR5cGUuCisgIFN0cmluZyBmb28oT2JqZWN0IGEpID0+ICdDKCRhKSc7Cit9CisKK2NsYXNzIEIgeworICAvLyBUaGlzIHdpbGwgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKKyAgLy8gdG9wLXR5cGUgKGFuZCBuZWl0aGVyIGNvdmFyaWFudCkKKyAgU3RyaW5nIGZvbyhpbnQgYSkgPT4gJ0IoJHthICsgMX0pJzsKK30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdGVzdHMvdm0vZGFydF8yL3N3aXRjaGFibGVfY2FsbF9zaW5nbGVfdGFyZ2V0X3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0IGIvcnVudGltZS90ZXN0cy92bS9kYXJ0XzIvc3dpdGNoYWJsZV9jYWxsX3NpbmdsZV90YXJnZXRfcmVncmVzc2lvbl80MjUxN190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4YWI3NQotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvdGVzdHMvdm0vZGFydF8yL3N3aXRjaGFibGVfY2FsbF9zaW5nbGVfdGFyZ2V0X3JlZ3Jlc3Npb25fNDI1MTdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2ZpbmFsIGR5bmFtaWMgbCA9IDxkeW5hbWljPltBKCksIEExKCksIEIoKV07CisKK21haW4oKSB7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBVbmxpbmtlZENhbGwgLT4gTW9ub21vcnBoaWMuCisgIEV4cGVjdC5lcXVhbHMoJ0MoNDIpJywgYmFyKDAsIDQyKSk7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBNb25vbW9ycGhpYyAtPiBTaW5nbGVUYXJnZXQuCisgIEV4cGVjdC5lcXVhbHMoJ0MoNDIpJywgYmFyKDEsIDQyKSk7CisgIC8vIFN3aXRjaGFibGUgY2FsbCBzaXRlIGdvZXMgZnJvbSBTaW5nbGVUYXJnZXQgLT4gUG9seW1vcnBoaWMuCisgIC8vIEl0IGhhcyB0byByZXRhaW4gdGhlIGZhY3QgdGhhdCBjYWxsIHNpdGUgaXMgZHluOiouCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgPT4gYmFyKDIsICdhJykpOworICBFeHBlY3QuZXF1YWxzKCdCKDQzKScsIGJhcigyLCA0MikpOworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQorYmFyKGludCBqLCBkeW5hbWljIGFyZykgPT4gbFtqXS5mb28oYXJnKTsKKworY2xhc3MgQSB7CisgIC8vIFRoaXMgd2lsbCBub3QgZ2V0IGEgZHluOiogZm9yd2FyZGVyIGJlY2F1c2UgaXQncyBwYXJhbWV0ZXIgdHlwZSBpcworICAvLyB0b3AtdHlwZS4KKyAgU3RyaW5nIGZvbyhPYmplY3QgYSkgPT4gJ0MoJGEpJzsKK30KKworY2xhc3MgQTEgZXh0ZW5kcyBBIHsKKyAgLy8gQSBkaWZmZXJlbnQgcmVjZWl2ZXIgY2lkIGJ1dCB3aXRoIHNhbWUgdGFyZ2V0IChpLmUuIHdlIGRvIG5vdCBvdmVycmlkZSBBKS4KK30KKworY2xhc3MgQiB7CisgIC8vIFRoaXMgd2lsbCBnZXQgYSBkeW46KiBmb3J3YXJkZXIgYmVjYXVzZSBpdCdzIHBhcmFtZXRlciB0eXBlIGlzIG5vdAorICAvLyB0b3AtdHlwZSAoYW5kIG5laXRoZXIgY292YXJpYW50KQorICBTdHJpbmcgZm9vKGludCBhKSA9PiAnQigke2EgKyAxfSknOworfQpkaWZmIC0tZ2l0IGEvcnVudGltZS90ZXN0cy92bS92bS5zdGF0dXMgYi9ydW50aW1lL3Rlc3RzL3ZtL3ZtLnN0YXR1cwppbmRleCA3MmNlOWM4Li4wYWI0MTcyIDEwMDY0NAotLS0gYS9ydW50aW1lL3Rlc3RzL3ZtL3ZtLnN0YXR1cworKysgYi9ydW50aW1lL3Rlc3RzL3ZtL3ZtLnN0YXR1cwpAQCAtMiw5ICsyLDYgQEAKICMgZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKICMgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotZGFydC9pc29sYXRlcy8qOiBQYXNzLCBTbG93ICMgVGVzdHMgdXNlIG1hbnkgaXNvbGF0ZXMgYW5kIHRha2UgYSBsb25nZXIgdGltZS4KLWRhcnRfMi9pc29sYXRlcy8qOiBQYXNzLCBTbG93ICMgVGVzdHMgdXNlIG1hbnkgaXNvbGF0ZXMgYW5kIHRha2UgYSBsb25nZXIgdGltZS4KLQogY2MvRmFpbDA6IEZhaWwgIyBUaGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gY3Jhc2ggb24gYWxsIHBsYXRmb3Jtcy4KIGNjL0ZhaWwxOiBGYWlsICMgVGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGNyYXNoIG9uIGFsbCBwbGF0Zm9ybXMuCiBjYy9GYWlsMjogRmFpbCAjIFRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBjcmFzaCBvbiBhbGwgcGxhdGZvcm1zLgpAQCAtMTYsNiArMTMsNyBAQAogY2MvSXNvbGF0ZVJlbG9hZF9QZW5kaW5nVW5xdWFsaWZpZWRDYWxsX1N0YXRpY1RvSW5zdGFuY2U6IEZhaWwgIyBJc3N1ZSAzMjk4MQogZGFydC9kYXRhX3VyaV9pbXBvcnRfdGVzdC9ub25lOiBTa2lwQnlEZXNpZ24KIGRhcnQvZW1pdF9hb3Rfc2l6ZV9pbmZvX2ZsYWdfdGVzdDogUGFzcywgU2xvdyAjIFNwYXducyBzZXZlcmFsIHN1YnByb2Nlc3NlcworZGFydC9pc29sYXRlcy8qOiBQYXNzLCBTbG93ICMgVGVzdHMgdXNlIG1hbnkgaXNvbGF0ZXMgYW5kIHRha2UgYSBsb25nZXIgdGltZS4KIGRhcnQvbWluaW1hbF9rZXJuZWxfYnl0ZWNvZGVfdGVzdDogUGFzcywgU2xvdyAjIFNwYXducyBzZXZlcmFsIHN1YnByb2Nlc3NlcwogZGFydC9taW5pbWFsX2tlcm5lbF90ZXN0OiBQYXNzLCBTbG93ICMgU3Bhd25zIHNldmVyYWwgc3VicHJvY2Vzc2VzCiBkYXJ0L251bGxfc2FmZXR5X2F1dG9kZXRlY3Rpb25faW5fa2VybmVsX2NvbXBpbGVyX3Rlc3Q6IFBhc3MsIFNsb3cgIyBTcGF3bnMgc2V2ZXJhbCBzdWJwcm9jZXNzZXMKQEAgLTI1LDYgKzIzLDcgQEAKIGRhcnQvdXNlX2JhcmVfaW5zdHJ1Y3Rpb25zX2ZsYWdfdGVzdDogUGFzcywgU2xvdyAjIFNwYXducyBzZXZlcmFsIHN1YnByb2Nlc3NlcwogZGFydF8yL2RhdGFfdXJpX2ltcG9ydF90ZXN0L25vbmU6IFNraXBCeURlc2lnbgogZGFydF8yL2VtaXRfYW90X3NpemVfaW5mb19mbGFnX3Rlc3Q6IFBhc3MsIFNsb3cgIyBTcGF3bnMgc2V2ZXJhbCBzdWJwcm9jZXNzZXMKK2RhcnRfMi9pc29sYXRlcy8qOiBQYXNzLCBTbG93ICMgVGVzdHMgdXNlIG1hbnkgaXNvbGF0ZXMgYW5kIHRha2UgYSBsb25nZXIgdGltZS4KIGRhcnRfMi9taW5pbWFsX2tlcm5lbF9ieXRlY29kZV90ZXN0OiBQYXNzLCBTbG93ICMgU3Bhd25zIHNldmVyYWwgc3VicHJvY2Vzc2VzCiBkYXJ0XzIvbWluaW1hbF9rZXJuZWxfdGVzdDogUGFzcywgU2xvdyAjIFNwYXducyBzZXZlcmFsIHN1YnByb2Nlc3NlcwogZGFydF8yL251bGxfc2FmZXR5X2F1dG9kZXRlY3Rpb25faW5fa2VybmVsX2NvbXBpbGVyX3Rlc3Q6IFBhc3MsIFNsb3cgIyBTcGF3bnMgc2V2ZXJhbCBzdWJwcm9jZXNzZXMKQEAgLTMzLDY4ICszMiwxMCBAQAogZGFydF8yL3N0YWNrX292ZXJmbG93X3NoYXJlZF90ZXN0OiBQYXNzLCBTbG93ICMgVXNlcyAtLXNoYXJlZC1zbG93LXBhdGgtdHJpZ2dlcnMtZ2MgZmxhZy4KIGRhcnRfMi91c2VfYmFyZV9pbnN0cnVjdGlvbnNfZmxhZ190ZXN0OiBQYXNzLCBTbG93ICMgU3Bhd25zIHNldmVyYWwgc3VicHJvY2Vzc2VzCiAKLVsgJHN5c3RlbSAhPSBtYWNvcyB8fCAkYXJjaCA9PSBzaW1hcm0gfHwgJGFyY2ggPT0gc2ltYXJtNjQgXQotZGFydC90aHJlYWRfcHJpb3JpdHlfbWFjb3NfdGVzdDogU2tpcEJ5RGVzaWduCi1kYXJ0XzIvdGhyZWFkX3ByaW9yaXR5X21hY29zX3Rlc3Q6IFNraXBCeURlc2lnbgotCi1bICgkc3lzdGVtICE9IGxpbnV4ICYmICRzeXN0ZW0gIT0gYW5kcm9pZCkgfHwgJGFyY2ggPT0gc2ltYXJtIHx8ICRhcmNoID09IHNpbWFybTY0IF0KLWRhcnQvdGhyZWFkX3ByaW9yaXR5X2xpbnV4X3Rlc3Q6IFNraXBCeURlc2lnbgotZGFydF8yL3RocmVhZF9wcmlvcml0eV9saW51eF90ZXN0OiBTa2lwQnlEZXNpZ24KLQotWyAkc3lzdGVtICE9IHdpbmRvd3MgfHwgJGFyY2ggPT0gc2ltYXJtIHx8ICRhcmNoID09IHNpbWFybTY0IF0KLWRhcnQvdGhyZWFkX3ByaW9yaXR5X3dpbmRvd3NfdGVzdDogU2tpcEJ5RGVzaWduCi1kYXJ0XzIvdGhyZWFkX3ByaW9yaXR5X3dpbmRvd3NfdGVzdDogU2tpcEJ5RGVzaWduCi0KLVsgJHJ1bnRpbWUgIT0gZGFydF9wcmVjb21waWxlZCB8fCAkc3lzdGVtID09IGFuZHJvaWQgXQotZGFydC9pc29sYXRlcy9maWJvbmFjY2lfY2FsbF9pZ190ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMsIEpJVCB3b3JrIGlzIHBlbmRpbmcuCi1kYXJ0L2lzb2xhdGVzL2ZpYm9uYWNjaV9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnQvaXNvbGF0ZXMvaW50ZXJuYWw6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnQvaXNvbGF0ZXMvbGltaXRlZF9hY3RpdmVfbXV0YXRvcl90ZXN0OiAgU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgotZGFydC9pc29sYXRlcy9yaW5nX2djX3NlbmRBbmRFeGl0X3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnQvaXNvbGF0ZXMvcmluZ19nY190ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi1kYXJ0L2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfY2FsbF9pZ190ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi1kYXJ0L2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfY2FsbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi1kYXJ0L2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfdGFpbF9jYWxsX2lnX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnQvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV90YWlsX2NhbGxfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgotZGFydC9pc29sYXRlcy90aHJlYWRfcG9vbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi1kYXJ0XzIvaXNvbGF0ZXMvZmlib25hY2NpX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLCBKSVQgd29yayBpcyBwZW5kaW5nLgotZGFydF8yL2lzb2xhdGVzL2ZpYm9uYWNjaV9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnRfMi9pc29sYXRlcy9pbnRlcm5hbDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgotZGFydF8yL2lzb2xhdGVzL2xpbWl0ZWRfYWN0aXZlX211dGF0b3JfdGVzdDogIFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnRfMi9pc29sYXRlcy9yaW5nX2djX3NlbmRBbmRFeGl0X3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnRfMi9pc29sYXRlcy9yaW5nX2djX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnRfMi9pc29sYXRlcy9zdW1fcmVjdXJzaXZlX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgotZGFydF8yL2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfY2FsbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi1kYXJ0XzIvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV90YWlsX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgotZGFydF8yL2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfdGFpbF9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KLWRhcnRfMi9pc29sYXRlcy90aHJlYWRfcG9vbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCi0KLVsgJGFyY2ggPT0gc2ltYXJtIHx8ICRhcmNoID09IHNpbWFybTY0IF0KLWRhcnQvaXNvbGF0ZXMvdGhyZWFkX3Bvb2xfdGVzdDogU2tpcEJ5RGVzaWduICMgVGVzdCB1c2VzIGRhcnQ6ZmZpIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgb24gc2ltdWxhdG9ycy4KLWRhcnQvdW5ib3hlZF9wYXJhbV9hcmdzX2Rlc2NyaXB0b3JfdGVzdDogU2tpcEJ5RGVzaWduICMgRkZJIGhlbHBlciBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcgotZGFydC91bmJveGVkX3BhcmFtX3RlYXJfb2ZmX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEZGSSBoZWxwZXIgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKLWRhcnQvdW5ib3hlZF9wYXJhbV90ZXN0OiBTa2lwQnlEZXNpZ24gIyBGRkkgaGVscGVyIG5vdCBzdXBwb3J0ZWQgb24gc2ltdWxhdG9yCi1kYXJ0L3JlZ3Jlc3NfNDE5NzFfdGVzdDogU2tpcEJ5RGVzaWduICMgZGFydDpmZmkgaXMgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKLWRhcnRfMi9pc29sYXRlcy90aHJlYWRfcG9vbF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUZXN0IHVzZXMgZGFydDpmZmkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3JzLgotZGFydF8yL3VuYm94ZWRfcGFyYW1fYXJnc19kZXNjcmlwdG9yX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEZGSSBoZWxwZXIgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKLWRhcnRfMi91bmJveGVkX3BhcmFtX3RlYXJfb2ZmX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEZGSSBoZWxwZXIgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKLWRhcnRfMi91bmJveGVkX3BhcmFtX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEZGSSBoZWxwZXIgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKLWRhcnRfMi9yZWdyZXNzXzQxOTcxX3Rlc3Q6IFNraXBCeURlc2lnbiAjIGRhcnQ6ZmZpIGlzIG5vdCBzdXBwb3J0ZWQgb24gc2ltdWxhdG9yCi0KIFsgJGJ1aWxkZXJfdGFnID09IGFzYW4gXQogZGFydC90cmFuc2ZlcmFibGVfdGhyb3dzX29vbV90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgdHJpZXMgdG8gYWxsb2NhdGUgdG9vIG11Y2ggbWVtb3J5IG9uIHB1cnBvc2UuIFN0aWxsIGRhcnRidWcuY29tLzM3MTg4CiBkYXJ0XzIvdHJhbnNmZXJhYmxlX3Rocm93c19vb21fdGVzdDogU2tpcEJ5RGVzaWduICMgVGhpcyB0ZXN0IHRyaWVzIHRvIGFsbG9jYXRlIHRvbyBtdWNoIG1lbW9yeSBvbiBwdXJwb3NlLiBTdGlsbCBkYXJ0YnVnLmNvbS8zNzE4OAogCi1bICRidWlsZGVyX3RhZyA9PSBjcm9zc3dvcmQgfHwgJGJ1aWxkZXJfdGFnID09IGNyb3Nzd29yZF9hc3QgXQotZGFydC9lbWl0X2FvdF9zaXplX2luZm9fZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBpdHNlbGYgY2Fubm90IGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgZ2VuX3NuYXBzaG90IChvbmx5IHRvb2xzL3Rlc3QucHkga25vd3Mgd2hlcmUgaXQgaXMpLgotZGFydC9ieXRlY29kZV93aXRoX2FzdF9pbl9hb3RfdGVzdDogU2tpcEJ5RGVzaWduICMgVGhlIHRlc3QgZG9lc24ndCBrbm93IGxvY2F0aW9uIG9mIGNyb3NzLXBsYXRmb3JtIGdlbl9zbmFwc2hvdAotZGFydC9zcGxpdF9hb3Rfa2VybmVsX2dlbmVyYXRpb25fdGVzdDogU2tpcEJ5RGVzaWduICMgVGhlIHRlc3QgZG9lc24ndCBrbm93IGxvY2F0aW9uIG9mIGNyb3NzLXBsYXRmb3JtIGdlbl9zbmFwc2hvdAotZGFydC9zcGxpdF9hb3Rfa2VybmVsX2dlbmVyYXRpb24yX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKLWRhcnRfMi9lbWl0X2FvdF9zaXplX2luZm9fZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBpdHNlbGYgY2Fubm90IGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgZ2VuX3NuYXBzaG90IChvbmx5IHRvb2xzL3Rlc3QucHkga25vd3Mgd2hlcmUgaXQgaXMpLgotZGFydF8yL2J5dGVjb2RlX3dpdGhfYXN0X2luX2FvdF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBkb2Vzbid0IGtub3cgbG9jYXRpb24gb2YgY3Jvc3MtcGxhdGZvcm0gZ2VuX3NuYXBzaG90Ci1kYXJ0XzIvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKLWRhcnRfMi9zcGxpdF9hb3Rfa2VybmVsX2dlbmVyYXRpb24yX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKLQogWyAkYnVpbGRlcl90YWcgPT0gb2JmdXNjYXRlZCBdCiBkYXJ0L2NhdXNhbF9zdGFja3MvYXN5bmNfdGhyb3dzX3N0YWNrX2xhenlfdGVzdDogU2tpcEJ5RGVzaWduICMgQXNzZXJ0cyBleGFjdCBzdGFja3RyYWNlIG91dHB1dC4KIGRhcnQvY2F1c2FsX3N0YWNrcy9hc3luY190aHJvd3Nfc3RhY2tfbm9fY2F1c2FsX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEFzc2VydHMgZXhhY3Qgc3RhY2t0cmFjZSBvdXRwdXQuCkBAIC0xMzgsOCArNzksMjAgQEAKIGRhcnRfMi9yZWRpcmVjdGlvbl90eXBlX3NodWZmbGluZ190ZXN0L25vbmU6IFJ1bnRpbWVFcnJvcgogZGFydF8yL3NuYXBzaG90X3ZlcnNpb25fdGVzdDogUnVudGltZUVycm9yCiAKK1sgJGNvbXBpbGVyID09IGRhcnRrYiBdCitkYXJ0L2dlbmVyaWNfZmllbGRfaW52b2NhdGlvbl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBLQkMgaW50ZXJwcmV0ZXJzIGRvIG5vdCBzdXBwb3J0IC0tbm9fbGF6eV9kaXNwYXRjaGVycworZGFydF8yL2dlbmVyaWNfZmllbGRfaW52b2NhdGlvbl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBLQkMgaW50ZXJwcmV0ZXJzIGRvIG5vdCBzdXBwb3J0IC0tbm9fbGF6eV9kaXNwYXRjaGVycworCiBbICRjb21waWxlciA9PSBkYXJ0a3AgXQorZGFydC9jYXVzYWxfc3RhY2tzL2FzeW5jX3Rocm93c19zdGFja19ub19jYXVzYWxfbm9uX3N5bWJvbGljX3Rlc3Q6IFNraXBCeURlc2lnbiAjIC0tbm8tbGF6eS4uLiBkb2VzIG5vdGhpbmcgb24gcHJlY29tcGlsZXIuCitkYXJ0L2NhdXNhbF9zdGFja3MvYXN5bmNfdGhyb3dzX3N0YWNrX25vX2NhdXNhbF90ZXN0OiBTa2lwQnlEZXNpZ24gIyAtLW5vLWxhenkuLi4gZG9lcyBub3RoaW5nIG9uIHByZWNvbXBpbGVyLgorZGFydC9jYXVzYWxfc3RhY2tzL2FzeW5jX3Rocm93c19zdGFja19ub25fc3ltYm9saWNfdGVzdDogU2tpcEJ5RGVzaWduICMgLS1uby1sYXp5Li4uIGRvZXMgbm90aGluZyBvbiBwcmVjb21waWxlci4KK2RhcnQvY2F1c2FsX3N0YWNrcy9hc3luY190aHJvd3Nfc3RhY2tfdGVzdDogU2tpcEJ5RGVzaWduICMgLS1uby1sYXp5Li4uIGRvZXMgbm90aGluZyBvbiBwcmVjb21waWxlci4KIGRhcnQvdjhfc25hcHNob3RfcHJvZmlsZV93cml0ZXJfdGVzdDogUGFzcywgU2xvdyAjIENhbiBiZSBzbG93IGR1ZSB0byByZS1pbnZva2luZyB0aGUgcHJlY29tcGlsZXIuCitkYXJ0XzIvY2F1c2FsX3N0YWNrcy9hc3luY190aHJvd3Nfc3RhY2tfbm9fY2F1c2FsX25vbl9zeW1ib2xpY190ZXN0OiBTa2lwQnlEZXNpZ24gIyAtLW5vLWxhenkuLi4gZG9lcyBub3RoaW5nIG9uIHByZWNvbXBpbGVyLgorZGFydF8yL2NhdXNhbF9zdGFja3MvYXN5bmNfdGhyb3dzX3N0YWNrX25vX2NhdXNhbF90ZXN0OiBTa2lwQnlEZXNpZ24gIyAtLW5vLWxhenkuLi4gZG9lcyBub3RoaW5nIG9uIHByZWNvbXBpbGVyLgorZGFydF8yL2NhdXNhbF9zdGFja3MvYXN5bmNfdGhyb3dzX3N0YWNrX25vbl9zeW1ib2xpY190ZXN0OiBTa2lwQnlEZXNpZ24gIyAtLW5vLWxhenkuLi4gZG9lcyBub3RoaW5nIG9uIHByZWNvbXBpbGVyLgorZGFydF8yL2NhdXNhbF9zdGFja3MvYXN5bmNfdGhyb3dzX3N0YWNrX3Rlc3Q6IFNraXBCeURlc2lnbiAjIC0tbm8tbGF6eS4uLiBkb2VzIG5vdGhpbmcgb24gcHJlY29tcGlsZXIuCiBkYXJ0XzIvdjhfc25hcHNob3RfcHJvZmlsZV93cml0ZXJfdGVzdDogUGFzcywgU2xvdyAjIENhbiBiZSBzbG93IGR1ZSB0byByZS1pbnZva2luZyB0aGUgcHJlY29tcGlsZXIuCiAKIFsgJGNvbXBpbGVyICE9IGRhcnRrcCBdCkBAIC0zMTAsNiArMjYzLDkgQEAKIGRhcnQvc3Bhd25fc2h1dGRvd25fdGVzdDogU2tpcFNsb3cKIGRhcnRfMi9zcGF3bl9zaHV0ZG93bl90ZXN0OiBTa2lwU2xvdwogCitbICRzeXN0ZW0gIT0gZnVjaHNpYSAmJiAoJGFyY2ggIT0geDY0IHx8ICRzeXN0ZW0gIT0gbGludXgpIF0KK2NjL0NvZGVFeGVjdXRhYmlsaXR5OiBTa2lwQnlEZXNpZ24gIyAtLWR1YWwtbWFwLWNvZGUgbm90IHN1cHBvcnRlZCBvbiBub24tTGludXgvRnVjaHNpYQorCiBbICRzeXN0ZW0gPT0gbGludXggJiYgKCRjb21waWxlciA9PSBkYXJ0ayB8fCAkY29tcGlsZXIgPT0gZGFydGtiKSBdCiBjYy9Jc29sYXRlUmVsb2FkX0xpYnJhcnlMb29rdXA6IEZhaWwsIENyYXNoCiAKQEAgLTMzNCwxMCArMjkwLDYgQEAKIGRhcnRfMi9udWxsX3NhZmV0eV9hdXRvZGV0ZWN0aW9uX2luX2tlcm5lbF9jb21waWxlcl90ZXN0OiBTa2lwU2xvdyAjIGdlbl9rZXJuZWwgaXMgdG9vIHNsb3cgb24gc2ltdWxhdGVkIGFyY2hpdGVjdHVyZXMKIGRhcnRfMi9zbmFwc2hvdF92ZXJzaW9uX3Rlc3Q6IFJ1bnRpbWVFcnJvciAjIFBsZWFzZSB0cmlhZ2UuCiAKLVsgJGhvdF9yZWxvYWQgfHwgJGhvdF9yZWxvYWRfcm9sbGJhY2sgXQotZGFydC9pc29sYXRlcy9zcGF3bl9mdW5jdGlvbl90ZXN0OiBTa2lwICMgVGhpcyB0ZXN0IGV4cGxpY2l0bHkgZW5hYmxlcyBpc29sYXRlIGdyb3VwcyAob2ZmLWJ5LWRlZmF1bHQgYXRtKS4gSXQgd2lsbCBiZSBlbmFibGVkIG9uY2UgZnVsbCBJRyByZWxvYWRpbmcgaXMgaW1wbGVtZW50ZWQuCi1kYXJ0XzIvaXNvbGF0ZXMvc3Bhd25fZnVuY3Rpb25fdGVzdDogU2tpcCAjIFRoaXMgdGVzdCBleHBsaWNpdGx5IGVuYWJsZXMgaXNvbGF0ZSBncm91cHMgKG9mZi1ieS1kZWZhdWx0IGF0bSkuIEl0IHdpbGwgYmUgZW5hYmxlZCBvbmNlIGZ1bGwgSUcgcmVsb2FkaW5nIGlzIGltcGxlbWVudGVkLgotCiBbICgkY29tcGlsZXIgPT0gZGFydGsgfHwgJGNvbXBpbGVyID09IGRhcnRrYikgJiYgKCRob3RfcmVsb2FkIHx8ICRob3RfcmVsb2FkX3JvbGxiYWNrKSBdCiBkYXJ0L2RhdGFfdXJpX3NwYXduX3Rlc3Q6IFNraXAgIyBUaW1lb3V0CiBkYXJ0L2tlcm5lbF9kZXRlcm1pbmlzbV90ZXN0OiBTa2lwU2xvdwpAQCAtMzU3LDcgKzMwOSw3IEBACiAjIE9uIHRoZSBzaW1sdWF0b3Igc3RhY2sgdHJhY2VzIHByb2R1Y2VkIGJ5IHRoZSBQcm9maWxlciBkbyBub3QgbWF0Y2gKICMgdXAgd2l0aCB0aGUgcmVhbCBEYXJ0IHN0YWNrIHRyYWNlIGFuZCBoZW5jZSB3ZSBkb24ndCBnZXQgY29ycmVjdAogIyBzeW1ib2wgbmFtZXMuCi1bICRhcmNoID09IHNpbWFybSB8fCAkYXJjaCA9PSBzaW1hcm02NCB8fCAkYXJjaCA9PSBzaW1hcm12NiBdCitbICRhcmNoID09IHNpbWFybSB8fCAkYXJjaCA9PSBzaW1hcm02NCBdCiBjYy9MYXJnZU1hcDogU2tpcEJ5RGVzaWduCiBjYy9Qcm9maWxlcl9BbGxvY2F0aW9uU2FtcGxlVGVzdDogU2tpcEJ5RGVzaWduCiBjYy9Qcm9maWxlcl9BcnJheUFsbG9jYXRpb246IFNraXBCeURlc2lnbgpAQCAtMzg0LDE1ICszMzYsNDcgQEAKIGNjL1Byb2ZpbGVyX1RyaXZpYWxSZWNvcmRBbGxvY2F0aW9uOiBTa2lwQnlEZXNpZ24KIGNjL1Byb2ZpbGVyX1R5cGVkQXJyYXlBbGxvY2F0aW9uOiBTa2lwQnlEZXNpZ24KIGNjL1NlcnZpY2VfUHJvZmlsZTogU2tpcEJ5RGVzaWduCitkYXJ0L2lzb2xhdGVzL3RocmVhZF9wb29sX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRlc3QgdXNlcyBkYXJ0OmZmaSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcnMuCitkYXJ0L3JlZ3Jlc3NfNDE5NzFfdGVzdDogU2tpcEJ5RGVzaWduICMgZGFydDpmZmkgaXMgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKK2RhcnQvc2RrX2hhc2hfdGVzdDogU2tpcFNsb3cgIyBnZW5fa2VybmVsIGlzIHNsb3cgdG8gcnVuIG9uIHNpbWFybQorZGFydC91bmJveGVkX3BhcmFtX2FyZ3NfZGVzY3JpcHRvcl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBGRkkgaGVscGVyIG5vdCBzdXBwb3J0ZWQgb24gc2ltdWxhdG9yCitkYXJ0L3VuYm94ZWRfcGFyYW1fdGVhcl9vZmZfdGVzdDogU2tpcEJ5RGVzaWduICMgRkZJIGhlbHBlciBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcgorZGFydC91bmJveGVkX3BhcmFtX3Rlc3Q6IFNraXBCeURlc2lnbiAjIEZGSSBoZWxwZXIgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKK2RhcnRfMi9pc29sYXRlcy90aHJlYWRfcG9vbF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUZXN0IHVzZXMgZGFydDpmZmkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3JzLgorZGFydF8yL3JlZ3Jlc3NfNDE5NzFfdGVzdDogU2tpcEJ5RGVzaWduICMgZGFydDpmZmkgaXMgbm90IHN1cHBvcnRlZCBvbiBzaW11bGF0b3IKK2RhcnRfMi9zZGtfaGFzaF90ZXN0OiBTa2lwU2xvdyAjIGdlbl9rZXJuZWwgaXMgc2xvdyB0byBydW4gb24gc2ltYXJtCitkYXJ0XzIvdW5ib3hlZF9wYXJhbV9hcmdzX2Rlc2NyaXB0b3JfdGVzdDogU2tpcEJ5RGVzaWduICMgRkZJIGhlbHBlciBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcgorZGFydF8yL3VuYm94ZWRfcGFyYW1fdGVhcl9vZmZfdGVzdDogU2tpcEJ5RGVzaWduICMgRkZJIGhlbHBlciBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcgorZGFydF8yL3VuYm94ZWRfcGFyYW1fdGVzdDogU2tpcEJ5RGVzaWduICMgRkZJIGhlbHBlciBub3Qgc3VwcG9ydGVkIG9uIHNpbXVsYXRvcgogCi1bICRjb21waWxlciA9PSBkYXJ0a2IgXQotZGFydC9nZW5lcmljX2ZpZWxkX2ludm9jYXRpb25fdGVzdDogU2tpcEJ5RGVzaWduICMgS0JDIGludGVycHJldGVycyBkbyBub3Qgc3VwcG9ydCAtLW5vX2xhenlfZGlzcGF0Y2hlcnMKLWRhcnRfMi9nZW5lcmljX2ZpZWxkX2ludm9jYXRpb25fdGVzdDogU2tpcEJ5RGVzaWduICMgS0JDIGludGVycHJldGVycyBkbyBub3Qgc3VwcG9ydCAtLW5vX2xhenlfZGlzcGF0Y2hlcnMKK1sgJGFyY2ggPT0gc2ltYXJtIHx8ICRhcmNoID09IHNpbWFybTY0IHx8ICRzeXN0ZW0gIT0gbWFjb3MgXQorZGFydC90aHJlYWRfcHJpb3JpdHlfbWFjb3NfdGVzdDogU2tpcEJ5RGVzaWduCitkYXJ0XzIvdGhyZWFkX3ByaW9yaXR5X21hY29zX3Rlc3Q6IFNraXBCeURlc2lnbgogCi1bICRidWlsZGVyX3RhZyA9PSBieXRlY29kZV9pbnRlcnByZXRlciB8fCAkaG90X3JlbG9hZCB8fCAkaG90X3JlbG9hZF9yb2xsYmFjayB8fCAkY29tcGlsZXIgIT0gZGFydGsgJiYgJGNvbXBpbGVyICE9IGRhcnRrcCAmJiAkY29tcGlsZXIgIT0gZGFydGtiIF0KK1sgJGFyY2ggPT0gc2ltYXJtIHx8ICRhcmNoID09IHNpbWFybTY0IHx8ICRzeXN0ZW0gIT0gd2luZG93cyBdCitkYXJ0L3RocmVhZF9wcmlvcml0eV93aW5kb3dzX3Rlc3Q6IFNraXBCeURlc2lnbgorZGFydF8yL3RocmVhZF9wcmlvcml0eV93aW5kb3dzX3Rlc3Q6IFNraXBCeURlc2lnbgorCitbICRhcmNoID09IHNpbWFybSB8fCAkYXJjaCA9PSBzaW1hcm02NCB8fCAkc3lzdGVtICE9IGFuZHJvaWQgJiYgJHN5c3RlbSAhPSBsaW51eCBdCitkYXJ0L3RocmVhZF9wcmlvcml0eV9saW51eF90ZXN0OiBTa2lwQnlEZXNpZ24KK2RhcnRfMi90aHJlYWRfcHJpb3JpdHlfbGludXhfdGVzdDogU2tpcEJ5RGVzaWduCisKK1sgJGJ1aWxkZXJfdGFnID09IGJ5dGVjb2RlX2ludGVycHJldGVyIHx8ICRob3RfcmVsb2FkIHx8ICRob3RfcmVsb2FkX3JvbGxiYWNrIHx8ICRjb21waWxlciAhPSBkYXJ0ayAmJiAkY29tcGlsZXIgIT0gZGFydGtiICYmICRjb21waWxlciAhPSBkYXJ0a3AgXQogZGFydC9lbnRyeXBvaW50cy8qOiBTa2lwQnlEZXNpZ24gIyBUaGVzZSB0ZXN0cyBhcmUgZm9yIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgYW5kIHZlcnkgc2Vuc2l0aXZlIHRvIHdoZW4gZnVuY3Rpb25zIGFyZSBvcHRpbWl6ZWQsIHNvIHRoZXkgYXJlIGRpc2FibGVkIG9uIGhvdHJlbG9hZCBhbmQgb3B0Y291bnRlciBib3RzLgogZGFydF8yL2VudHJ5cG9pbnRzLyo6IFNraXBCeURlc2lnbiAjIFRoZXNlIHRlc3RzIGFyZSBmb3IgY29tcGlsZXIgb3B0aW1pemF0aW9ucyBhbmQgdmVyeSBzZW5zaXRpdmUgdG8gd2hlbiBmdW5jdGlvbnMgYXJlIG9wdGltaXplZCwgc28gdGhleSBhcmUgZGlzYWJsZWQgb24gaG90cmVsb2FkIGFuZCBvcHRjb3VudGVyIGJvdHMuCiAKK1sgJGJ1aWxkZXJfdGFnID09IGNyb3Nzd29yZCB8fCAkYnVpbGRlcl90YWcgPT0gY3Jvc3N3b3JkX2FzdCBdCitkYXJ0L2J5dGVjb2RlX3dpdGhfYXN0X2luX2FvdF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBkb2Vzbid0IGtub3cgbG9jYXRpb24gb2YgY3Jvc3MtcGxhdGZvcm0gZ2VuX3NuYXBzaG90CitkYXJ0L2VtaXRfYW90X3NpemVfaW5mb19mbGFnX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGl0c2VsZiBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiBnZW5fc25hcHNob3QgKG9ubHkgdG9vbHMvdGVzdC5weSBrbm93cyB3aGVyZSBpdCBpcykuCitkYXJ0L3Nka19oYXNoX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKK2RhcnQvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uMl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBkb2Vzbid0IGtub3cgbG9jYXRpb24gb2YgY3Jvc3MtcGxhdGZvcm0gZ2VuX3NuYXBzaG90CitkYXJ0L3NwbGl0X2FvdF9rZXJuZWxfZ2VuZXJhdGlvbl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBkb2Vzbid0IGtub3cgbG9jYXRpb24gb2YgY3Jvc3MtcGxhdGZvcm0gZ2VuX3NuYXBzaG90CitkYXJ0XzIvYnl0ZWNvZGVfd2l0aF9hc3RfaW5fYW90X3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKK2RhcnRfMi9lbWl0X2FvdF9zaXplX2luZm9fZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGUgdGVzdCBpdHNlbGYgY2Fubm90IGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgZ2VuX3NuYXBzaG90IChvbmx5IHRvb2xzL3Rlc3QucHkga25vd3Mgd2hlcmUgaXQgaXMpLgorZGFydF8yL3Nka19oYXNoX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKK2RhcnRfMi9zcGxpdF9hb3Rfa2VybmVsX2dlbmVyYXRpb24yX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoZSB0ZXN0IGRvZXNuJ3Qga25vdyBsb2NhdGlvbiBvZiBjcm9zcy1wbGF0Zm9ybSBnZW5fc25hcHNob3QKK2RhcnRfMi9zcGxpdF9hb3Rfa2VybmVsX2dlbmVyYXRpb25fdGVzdDogU2tpcEJ5RGVzaWduICMgVGhlIHRlc3QgZG9lc24ndCBrbm93IGxvY2F0aW9uIG9mIGNyb3NzLXBsYXRmb3JtIGdlbl9zbmFwc2hvdAorCiBbICRidWlsZGVyX3RhZyA9PSBjcm9zc3dvcmQgfHwgJGJ1aWxkZXJfdGFnID09IGNyb3Nzd29yZF9hc3QgfHwgJGNvbXBpbGVyICE9IGRhcnRrcCB8fCAkc3lzdGVtICE9IGxpbnV4ICYmICRzeXN0ZW0gIT0gbWFjb3MgJiYgJHN5c3RlbSAhPSB3aW5kb3dzIF0KIGRhcnQvcnVuX2FwcGVuZGVkX2FvdF9zbmFwc2hvdF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUZXN0cyB0aGUgcHJlY29tcGlsZWQgcnVudGltZS4KIGRhcnRfMi9ydW5fYXBwZW5kZWRfYW90X3NuYXBzaG90X3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRlc3RzIHRoZSBwcmVjb21waWxlZCBydW50aW1lLgpAQCAtNDEwLDE2ICszOTQsMTkgQEAKIGRhcnRfMi9yZWRpcmVjdGlvbl90eXBlX3NodWZmbGluZ190ZXN0L25vbmU6IFJ1bnRpbWVFcnJvcgogCiBbICRtb2RlID09IGRlYnVnIHx8ICRydW50aW1lICE9IGRhcnRfcHJlY29tcGlsZWQgfHwgJHN5c3RlbSA9PSBhbmRyb2lkIF0KLWRhcnQvZW1pdF9hb3Rfc2l6ZV9pbmZvX2ZsYWdfdGVzdDogU2tpcEJ5RGVzaWduICMgVGhpcyB0ZXN0IGlzIGZvciBWTSBBT1Qgb25seSBhbmQgaXMgcXVpdGUgc2xvdyAoc28gd2UgZG9uJ3QgcnVuIGl0IGluIGRlYnVnIG1vZGUpLgotZGFydC91c2VfYmFyZV9pbnN0cnVjdGlvbnNfZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCiBkYXJ0L2J5dGVjb2RlX3dpdGhfYXN0X2luX2FvdF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCi1kYXJ0L3NwbGl0X2FvdF9rZXJuZWxfZ2VuZXJhdGlvbl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCitkYXJ0L2VtaXRfYW90X3NpemVfaW5mb19mbGFnX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoaXMgdGVzdCBpcyBmb3IgVk0gQU9UIG9ubHkgYW5kIGlzIHF1aXRlIHNsb3cgKHNvIHdlIGRvbid0IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlKS4KIGRhcnQvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uMl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCi1kYXJ0XzIvZW1pdF9hb3Rfc2l6ZV9pbmZvX2ZsYWdfdGVzdDogU2tpcEJ5RGVzaWduICMgVGhpcyB0ZXN0IGlzIGZvciBWTSBBT1Qgb25seSBhbmQgaXMgcXVpdGUgc2xvdyAoc28gd2UgZG9uJ3QgcnVuIGl0IGluIGRlYnVnIG1vZGUpLgotZGFydF8yL3VzZV9iYXJlX2luc3RydWN0aW9uc19mbGFnX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoaXMgdGVzdCBpcyBmb3IgVk0gQU9UIG9ubHkgYW5kIGlzIHF1aXRlIHNsb3cgKHNvIHdlIGRvbid0IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlKS4KK2RhcnQvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoaXMgdGVzdCBpcyBmb3IgVk0gQU9UIG9ubHkgYW5kIGlzIHF1aXRlIHNsb3cgKHNvIHdlIGRvbid0IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlKS4KK2RhcnQvdXNlX2JhcmVfaW5zdHJ1Y3Rpb25zX2ZsYWdfdGVzdDogU2tpcEJ5RGVzaWduICMgVGhpcyB0ZXN0IGlzIGZvciBWTSBBT1Qgb25seSBhbmQgaXMgcXVpdGUgc2xvdyAoc28gd2UgZG9uJ3QgcnVuIGl0IGluIGRlYnVnIG1vZGUpLgogZGFydF8yL2J5dGVjb2RlX3dpdGhfYXN0X2luX2FvdF90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCi1kYXJ0XzIvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoaXMgdGVzdCBpcyBmb3IgVk0gQU9UIG9ubHkgYW5kIGlzIHF1aXRlIHNsb3cgKHNvIHdlIGRvbid0IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlKS4KK2RhcnRfMi9lbWl0X2FvdF9zaXplX2luZm9fZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCiBkYXJ0XzIvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uMl90ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCitkYXJ0XzIvc3BsaXRfYW90X2tlcm5lbF9nZW5lcmF0aW9uX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFRoaXMgdGVzdCBpcyBmb3IgVk0gQU9UIG9ubHkgYW5kIGlzIHF1aXRlIHNsb3cgKHNvIHdlIGRvbid0IHJ1biBpdCBpbiBkZWJ1ZyBtb2RlKS4KK2RhcnRfMi91c2VfYmFyZV9pbnN0cnVjdGlvbnNfZmxhZ190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IGFuZCBpcyBxdWl0ZSBzbG93IChzbyB3ZSBkb24ndCBydW4gaXQgaW4gZGVidWcgbW9kZSkuCisKK1sgJG1vZGUgIT0gZGVidWcgfHwgJHJ1bnRpbWUgIT0gZGFydF9wcmVjb21waWxlZCBdCitpbl9tZW1vcnlfZWxmX3Rlc3Q6IFNraXAgIyBUZXN0cyBhIGRlYnVnLW1vZGUgZmxhZyB0byBkYXJ0X3ByZWNvbXBpbGVkX3J1bnRpbWUuCiAKICMgSXQgbWFrZXMgbm8gc2Vuc2UgdG8gcnVuIGFueSB0ZXN0IHRoYXQgdXNlcyBzcGF3blVSSSB1bmRlciB0aGUgc2ltdWxhdG9yCiAjIGFzIHRoYXQgd291bGQgaW52b2x2ZSBydW5uaW5nIENGRSAodGhlIGZyb250IGVuZCkgaW4gc2ltdWxhdG9yIG1vZGUKQEAgLTQzMywxMiArNDIwLDM1IEBACiAKIFsgJHJ1bnRpbWUgIT0gZGFydF9wcmVjb21waWxlZCB8fCAkc3lzdGVtID09IGFuZHJvaWQgXQogZGFydC9iYXJlX2luc3RydWN0aW9uc190cmFtcG9saW5lc190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IChhbmRyb2lkIGZhaWxzIGR1ZSB0byBsaXN0aW5nIGludGVyZmFjZXMpLgorZGFydC9pc29sYXRlcy9maWJvbmFjY2lfY2FsbF9pZ190ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMsIEpJVCB3b3JrIGlzIHBlbmRpbmcuCitkYXJ0L2lzb2xhdGVzL2ZpYm9uYWNjaV9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnQvaXNvbGF0ZXMvaW50ZXJuYWw6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnQvaXNvbGF0ZXMvbGltaXRlZF9hY3RpdmVfbXV0YXRvcl90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCitkYXJ0L2lzb2xhdGVzL3JpbmdfZ2Nfc2VuZEFuZEV4aXRfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgorZGFydC9pc29sYXRlcy9yaW5nX2djX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnQvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV9jYWxsX2lnX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnQvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnQvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV90YWlsX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgorZGFydC9pc29sYXRlcy9zdW1fcmVjdXJzaXZlX3RhaWxfY2FsbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCitkYXJ0L2lzb2xhdGVzL3RocmVhZF9wb29sX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KIGRhcnRfMi9iYXJlX2luc3RydWN0aW9uc190cmFtcG9saW5lc190ZXN0OiBTa2lwQnlEZXNpZ24gIyBUaGlzIHRlc3QgaXMgZm9yIFZNIEFPVCBvbmx5IChhbmRyb2lkIGZhaWxzIGR1ZSB0byBsaXN0aW5nIGludGVyZmFjZXMpLgorZGFydF8yL2lzb2xhdGVzL2ZpYm9uYWNjaV9jYWxsX2lnX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cywgSklUIHdvcmsgaXMgcGVuZGluZy4KK2RhcnRfMi9pc29sYXRlcy9maWJvbmFjY2lfY2FsbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCitkYXJ0XzIvaXNvbGF0ZXMvaW50ZXJuYWw6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnRfMi9pc29sYXRlcy9saW1pdGVkX2FjdGl2ZV9tdXRhdG9yX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnRfMi9pc29sYXRlcy9yaW5nX2djX3NlbmRBbmRFeGl0X3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnRfMi9pc29sYXRlcy9yaW5nX2djX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnRfMi9pc29sYXRlcy9zdW1fcmVjdXJzaXZlX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgorZGFydF8yL2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfY2FsbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCitkYXJ0XzIvaXNvbGF0ZXMvc3VtX3JlY3Vyc2l2ZV90YWlsX2NhbGxfaWdfdGVzdDogU2tpcCAjIE9ubHkgQU9UIGhhcyBsaWdodHdlaWdodCBlbm91Z2ggaXNvbGF0ZXMgdG8gcnVuIHRob3NlIHRlc3RzLgorZGFydF8yL2lzb2xhdGVzL3N1bV9yZWN1cnNpdmVfdGFpbF9jYWxsX3Rlc3Q6IFNraXAgIyBPbmx5IEFPVCBoYXMgbGlnaHR3ZWlnaHQgZW5vdWdoIGlzb2xhdGVzIHRvIHJ1biB0aG9zZSB0ZXN0cy4KK2RhcnRfMi9pc29sYXRlcy90aHJlYWRfcG9vbF90ZXN0OiBTa2lwICMgT25seSBBT1QgaGFzIGxpZ2h0d2VpZ2h0IGVub3VnaCBpc29sYXRlcyB0byBydW4gdGhvc2UgdGVzdHMuCiAKIFsgJGhvdF9yZWxvYWQgfHwgJGhvdF9yZWxvYWRfcm9sbGJhY2sgXQogZGFydC9hcHBqaXQqOiBTa2lwQnlEZXNpZ24gIyBDYW5ub3QgcmVsb2FkIHdpdGggVVJJIHBvaW50aW5nIHRvIGFwcCBzbmFwc2hvdC4KIGRhcnQvY29tcGlsYXRpb25fdHJhY2VfdGVzdDogUGFzcywgU2xvdwogZGFydC9kaXNhc3NlbWJsZV9kZXRlcm1pbmlzbV90ZXN0OiBTa2lwU2xvdyAjIFJ1bnMgZXhwZW5zaXZlIGZpYm9uYWNjaSgzMikgY29tcHV0YXRpb24gaW4gMiBzdWJwcm9jZXNzZXMKK2RhcnQvaXNvbGF0ZXMvc3Bhd25fZnVuY3Rpb25fdGVzdDogU2tpcCAjIFRoaXMgdGVzdCBleHBsaWNpdGx5IGVuYWJsZXMgaXNvbGF0ZSBncm91cHMgKG9mZi1ieS1kZWZhdWx0IGF0bSkuIEl0IHdpbGwgYmUgZW5hYmxlZCBvbmNlIGZ1bGwgSUcgcmVsb2FkaW5nIGlzIGltcGxlbWVudGVkLgogZGFydC9pc3N1ZV8zMTk1OV8zMTk2MF90ZXN0OiBTa2lwU2xvdwogZGFydC9taW5pbWFsX2tlcm5lbF9ieXRlY29kZV90ZXN0OiBTa2lwU2xvdyAjIGdlbl9rZXJuZWwgaXMgdG9vIHNsb3cgaW4gaG90IHJlbG9hZCB0ZXN0aW5nIG1vZGUKIGRhcnQvbWluaW1hbF9rZXJuZWxfdGVzdDogU2tpcFNsb3cgIyBnZW5fa2VybmVsIGlzIHRvbyBzbG93IGluIGhvdCByZWxvYWQgdGVzdGluZyBtb2RlCkBAIC00NTMsNiArNDYzLDcgQEAKIGRhcnRfMi9hcHBqaXQqOiBTa2lwQnlEZXNpZ24gIyBDYW5ub3QgcmVsb2FkIHdpdGggVVJJIHBvaW50aW5nIHRvIGFwcCBzbmFwc2hvdC4KIGRhcnRfMi9jb21waWxhdGlvbl90cmFjZV90ZXN0OiBQYXNzLCBTbG93CiBkYXJ0XzIvZGlzYXNzZW1ibGVfZGV0ZXJtaW5pc21fdGVzdDogU2tpcFNsb3cgIyBSdW5zIGV4cGVuc2l2ZSBmaWJvbmFjY2koMzIpIGNvbXB1dGF0aW9uIGluIDIgc3VicHJvY2Vzc2VzCitkYXJ0XzIvaXNvbGF0ZXMvc3Bhd25fZnVuY3Rpb25fdGVzdDogU2tpcCAjIFRoaXMgdGVzdCBleHBsaWNpdGx5IGVuYWJsZXMgaXNvbGF0ZSBncm91cHMgKG9mZi1ieS1kZWZhdWx0IGF0bSkuIEl0IHdpbGwgYmUgZW5hYmxlZCBvbmNlIGZ1bGwgSUcgcmVsb2FkaW5nIGlzIGltcGxlbWVudGVkLgogZGFydF8yL2lzc3VlXzMxOTU5XzMxOTYwX3Rlc3Q6IFNraXBTbG93CiBkYXJ0XzIvbWluaW1hbF9rZXJuZWxfYnl0ZWNvZGVfdGVzdDogU2tpcFNsb3cgIyBnZW5fa2VybmVsIGlzIHRvbyBzbG93IGluIGhvdCByZWxvYWQgdGVzdGluZyBtb2RlCiBkYXJ0XzIvbWluaW1hbF9rZXJuZWxfdGVzdDogU2tpcFNsb3cgIyBnZW5fa2VybmVsIGlzIHRvbyBzbG93IGluIGhvdCByZWxvYWQgdGVzdGluZyBtb2RlCkBAIC00NjQsNiArNDc1LDMgQEAKIGRhcnRfMi9zcGxheV90ZXN0OiBTa2lwU2xvdwogZGFydF8yL3N0YWNrX292ZXJmbG93X3NoYXJlZF90ZXN0OiBTa2lwU2xvdyAjIFRvbyBzbG93IHdpdGggLS1zaGFyZWQtc2xvdy1wYXRoLXRyaWdnZXJzLWdjIGZsYWcgYW5kIG5vdCByZWxldmFudCBvdXRzaWRlIHByZWNvbXBpbGVkLgogZGFydF8yL3R5cGVfZmVlZGJhY2tfdGVzdDogUGFzcywgU2xvdwotCi1bICRtb2RlICE9IGRlYnVnIHx8ICRydW50aW1lICE9IGRhcnRfcHJlY29tcGlsZWQgXQotaW5fbWVtb3J5X2VsZl90ZXN0OiBTa2lwICAjIFRlc3RzIGEgZGVidWctbW9kZSBmbGFnIHRvIGRhcnRfcHJlY29tcGlsZWRfcnVudGltZS4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY2x1c3RlcmVkX3NuYXBzaG90LmNjIGIvcnVudGltZS92bS9jbHVzdGVyZWRfc25hcHNob3QuY2MKaW5kZXggYzYyNjExNS4uYzllMTMxOSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jbHVzdGVyZWRfc25hcHNob3QuY2MKKysrIGIvcnVudGltZS92bS9jbHVzdGVyZWRfc25hcHNob3QuY2MKQEAgLTUzMzMsNyArNTMzMyw3IEBACiAKICAgaW50cHRyX3QgY29kZV9vcmRlcl9sZW5ndGggPSAwOwogI2lmIGRlZmluZWQoREFSVF9QUkVDT01QSUxFUikgJiYgIWRlZmluZWQoVEFSR0VUX0FSQ0hfSUEzMikKLSAgaWYgKGtpbmRfID09IFNuYXBzaG90OjprRnVsbEFPVCkgeworICBpZiAoKGtpbmRfID09IFNuYXBzaG90OjprRnVsbEFPVCkgJiYgRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMpIHsKICAgICBhdXRvIGNvZGVfb2JqZWN0cyA9CiAgICAgICAgIHN0YXRpY19jYXN0PENvZGVTZXJpYWxpemF0aW9uQ2x1c3Rlcio+KGNsdXN0ZXJzX2J5X2NpZF9ba0NvZGVDaWRdKQogICAgICAgICAgICAgLT5kaXNjb3ZlcmVkX29iamVjdHMoKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L2Rpc3BhdGNoX3RhYmxlX2dlbmVyYXRvci5oIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLmgKaW5kZXggMjBiNmNhMy4uZTkxNmEzYyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9hb3QvZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLmgKKysrIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLmgKQEAgLTE2LDYgKzE2LDcgQEAKIAogY2xhc3MgQ2xhc3NUYWJsZTsKIGNsYXNzIFByZWNvbXBpbGVyOworY2xhc3MgUHJlY29tcGlsZXJUcmFjZXI7CiAKIG5hbWVzcGFjZSBjb21waWxlciB7CiAKQEAgLTc1LDYgKzc2LDcgQEAKICAgaW50MzJfdCBOdW1JZHMoKSBjb25zdCB7IHJldHVybiBzZWxlY3RvcnNfLmxlbmd0aCgpOyB9CiAKICAgZnJpZW5kIGNsYXNzIGRhcnQ6OlByZWNvbXBpbGVyOworICBmcmllbmQgY2xhc3MgZGFydDo6UHJlY29tcGlsZXJUcmFjZXI7CiAgIGZyaWVuZCBjbGFzcyBEaXNwYXRjaFRhYmxlR2VuZXJhdG9yOwogICBmcmllbmQgY2xhc3MgU2VsZWN0b3JSb3c7CiAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyLmNjIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvcHJlY29tcGlsZXIuY2MKaW5kZXggNTJiZjM0NC4uZTRhZjVkMyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9hb3QvcHJlY29tcGlsZXIuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvcHJlY29tcGlsZXIuY2MKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSAidm0vY2xhc3NfZmluYWxpemVyLmgiCiAjaW5jbHVkZSAidm0vY29kZV9wYXRjaGVyLmgiCiAjaW5jbHVkZSAidm0vY29tcGlsZXIvYW90L2FvdF9jYWxsX3NwZWNpYWxpemVyLmgiCisjaW5jbHVkZSAidm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyX3RyYWNlci5oIgogI2luY2x1ZGUgInZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXIuaCIKICNpbmNsdWRlICJ2bS9jb21waWxlci9hc3NlbWJsZXIvZGlzYXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAidm0vY29tcGlsZXIvYmFja2VuZC9icmFuY2hfb3B0aW1pemVyLmgiCkBAIC01MCw2ICs1MSw3IEBACiAjaW5jbHVkZSAidm0vdHlwZV90YWJsZS5oIgogI2luY2x1ZGUgInZtL3R5cGVfdGVzdGluZ19zdHVicy5oIgogI2luY2x1ZGUgInZtL3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ2bS96b25lX3RleHRfYnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBkYXJ0IHsKIApAQCAtMjY4LDYgKzI3MCw4IEBACiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgdHJhY2VyXyA9IFByZWNvbXBpbGVyVHJhY2VyOjpTdGFydFRyYWNpbmdJZlJlcXVlc3RlZCh0aGlzKTsKKwogICAgICAgLy8gQWxsIHN0dWJzIGhhdmUgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCwgYWxsIG9mIHRoZW0gc2hhcmUgdGhlIHNhbWUgcG9vbC4KICAgICAgIC8vIFdlIHVzZSB0aGF0IHBvb2wgdG8gaW5pdGlhbGl6ZSBvdXIgZ2xvYmFsIG9iamVjdCBwb29sLCB0byBndWFyYW50ZWUKICAgICAgIC8vIHN0dWJzIGFzIHdlbGwgYXMgY29kZSBjb21waWxlZCBmcm9tIGhlcmUgb24gd2lsbCBoYXZlIHRoZSBzYW1lIHBvb2wuCkBAIC0yOTgsOCArMzAyLDExIEBACiAgICAgICBDb2xsZWN0RHluYW1pY0Z1bmN0aW9uTmFtZXMoKTsKIAogICAgICAgLy8gU3RhcnQgd2l0aCB0aGUgYWxsb2NhdGlvbnMgYW5kIGludm9jYXRpb25zIHRoYXQgaGFwcGVuIGZyb20gQysrLgotICAgICAgQWRkUm9vdHMoKTsKLSAgICAgIEFkZEFubm90YXRlZFJvb3RzKCk7CisgICAgICB7CisgICAgICAgIFRyYWNpbmdTY29wZSBzY29wZSh0aGlzKTsKKyAgICAgICAgQWRkUm9vdHMoKTsKKyAgICAgICAgQWRkQW5ub3RhdGVkUm9vdHMoKTsKKyAgICAgIH0KIAogICAgICAgLy8gV2l0aCB0aGUgbm5iZCBleHBlcmltZW50IGVuYWJsZWQsIHRoZXNlIG5vbi1udWxsYWJsZSB0eXBlIGFyZ3VtZW50cyBtYXkKICAgICAgIC8vIG5vdCBiZSByZXRhaW5lZCwgYWx0aG91Z2ggdGhleSB3aWxsIGJlIHVzZWQgYW5kIGV4cGVjdGVkIHRvIGJlCkBAIC0zNzcsNiArMzg0LDExIEBACiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgaWYgKHRyYWNlcl8gIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjZXJfLT5GaW5hbGl6ZSgpOworICAgICAgICB0cmFjZXJfID0gbnVsbHB0cjsKKyAgICAgIH0KKwogICAgICAgVHJhY2VGb3JSZXRhaW5lZEZ1bmN0aW9ucygpOwogICAgICAgRmluYWxpemVEaXNwYXRjaFRhYmxlKCk7CiAgICAgICBSZXBsYWNlRnVuY3Rpb25QQ1JlbGF0aXZlQ2FsbEVudHJpZXMoKTsKQEAgLTYxMSwzOCArNjIzLDI3IEBACiAgIGNvbnN0IGludHB0cl90IGdvcF9vZmZzZXQgPQogICAgICAgRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMgPyBnbG9iYWxfb2JqZWN0X3Bvb2xfYnVpbGRlcigpLT5DdXJyZW50TGVuZ3RoKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uLkhhc0NvZGUoKSk7CiAKLSAgaWYgKCFmdW5jdGlvbi5IYXNDb2RlKCkpIHsKLSAgICBmdW5jdGlvbl9jb3VudF8rKzsKKyAgVHJhY2luZ1Njb3BlIHRyYWNpbmdfc2NvcGUodGhpcyk7CisgIGZ1bmN0aW9uX2NvdW50XysrOwogCi0gICAgaWYgKEZMQUdfdHJhY2VfcHJlY29tcGlsZXIpIHsKLSAgICAgIFRIUl9QcmludCgiUHJlY29tcGlsaW5nICUiIFBkICIgJXMgKCVzLCAlcylcbiIsIGZ1bmN0aW9uX2NvdW50XywKLSAgICAgICAgICAgICAgICBmdW5jdGlvbi5Ub0xpYk5hbWVQcmVmaXhlZFF1YWxpZmllZENTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBmdW5jdGlvbi50b2tlbl9wb3MoKS5Ub0NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBGdW5jdGlvbjo6S2luZFRvQ1N0cmluZyhmdW5jdGlvbi5raW5kKCkpKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoIWZ1bmN0aW9uLmlzX2Fic3RyYWN0KCkpOwotICAgIEFTU0VSVCghZnVuY3Rpb24uSXNSZWRpcmVjdGluZ0ZhY3RvcnkoKSk7Ci0KLSAgICBlcnJvcl8gPSBDb21waWxlRnVuY3Rpb24odGhpcywgdGhyZWFkXywgem9uZV8sIGZ1bmN0aW9uKTsKLSAgICBpZiAoIWVycm9yXy5Jc051bGwoKSkgewotICAgICAgSnVtcChlcnJvcl8pOwotICAgIH0KLSAgICAvLyBVc2VkIGluIHRoZSBKSVQgdG8gc2F2ZSB0eXBlLWZlZWRiYWNrIGFjcm9zcyBjb21waWxhdGlvbnMuCi0gICAgZnVuY3Rpb24uQ2xlYXJJQ0RhdGFBcnJheSgpOwotICB9IGVsc2UgewotICAgIGlmIChGTEFHX3RyYWNlX3ByZWNvbXBpbGVyKSB7Ci0gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBmcm9tIHNvbWV3aGVyZSBvdGhlciB0aGFuIFByZWNvbXBpbGVyLAotICAgICAgLy8gc3VjaCBhcyBjb25zdCBjb25zdHJ1Y3RvcnMgY29tcGlsZWQgYnkgdGhlIHBhcnNlci4KLSAgICAgIFRIUl9QcmludCgiQWxyZWFkeSBoYXMgY29kZTogJXMgKCVzLCAlcylcbiIsCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24uVG9MaWJOYW1lUHJlZml4ZWRRdWFsaWZpZWRDU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24udG9rZW5fcG9zKCkuVG9DU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgRnVuY3Rpb246OktpbmRUb0NTdHJpbmcoZnVuY3Rpb24ua2luZCgpKSk7Ci0gICAgfQorICBpZiAoRkxBR190cmFjZV9wcmVjb21waWxlcikgeworICAgIFRIUl9QcmludCgiUHJlY29tcGlsaW5nICUiIFBkICIgJXMgKCVzLCAlcylcbiIsIGZ1bmN0aW9uX2NvdW50XywKKyAgICAgICAgICAgICAgZnVuY3Rpb24uVG9MaWJOYW1lUHJlZml4ZWRRdWFsaWZpZWRDU3RyaW5nKCksCisgICAgICAgICAgICAgIGZ1bmN0aW9uLnRva2VuX3BvcygpLlRvQ1N0cmluZygpLAorICAgICAgICAgICAgICBGdW5jdGlvbjo6S2luZFRvQ1N0cmluZyhmdW5jdGlvbi5raW5kKCkpKTsKICAgfQogCi0gIEFTU0VSVChmdW5jdGlvbi5IYXNDb2RlKCkpOworICBBU1NFUlQoIWZ1bmN0aW9uLmlzX2Fic3RyYWN0KCkpOworICBBU1NFUlQoIWZ1bmN0aW9uLklzUmVkaXJlY3RpbmdGYWN0b3J5KCkpOworCisgIGVycm9yXyA9IENvbXBpbGVGdW5jdGlvbih0aGlzLCB0aHJlYWRfLCB6b25lXywgZnVuY3Rpb24pOworICBpZiAoIWVycm9yXy5Jc051bGwoKSkgeworICAgIEp1bXAoZXJyb3JfKTsKKyAgfQorICAvLyBVc2VkIGluIHRoZSBKSVQgdG8gc2F2ZSB0eXBlLWZlZWRiYWNrIGFjcm9zcyBjb21waWxhdGlvbnMuCisgIGZ1bmN0aW9uLkNsZWFySUNEYXRhQXJyYXkoKTsKICAgQWRkQ2FsbGVlc09mKGZ1bmN0aW9uLCBnb3Bfb2Zmc2V0KTsKIH0KIApAQCAtNjc2LDcgKzY3NywxMSBAQAogI2VuZGlmCiAKICAgU3RyaW5nJiBzZWxlY3RvciA9IFN0cmluZzo6SGFuZGxlKFopOwotICBpZiAoRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMpIHsKKyAgLy8gV2hlbiB0cmFjaW5nIHdlIHdhbnQgdG8gc2NhbiB0aGUgb2JqZWN0IHBvb2wgYXR0YWNoZWQgdG8gdGhlIGNvZGUgb2JqZWN0CisgIC8vIHJhdGhlciB0aGFuIHNjYW5uaW5nIGdsb2JhbCBvYmplY3QgcG9vbCAtIGJlY2F1c2Ugd2Ugd2FudCB0byBpbmNsdWRlCisgIC8vICphbGwqIG91dGdvaW5nIHJlZmVyZW5jZXMgaW50byB0aGUgdHJhY2UuIFNjYW5uaW5nIEdPUCB3b3VsZCBleGNsdWRlCisgIC8vIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGJlZW4gZGVkdXBsaWNhdGVkLgorICBpZiAoRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMgJiYgIWlzX3RyYWNpbmcoKSkgewogICAgIGZvciAoaW50cHRyX3QgaSA9IGdvcF9vZmZzZXQ7CiAgICAgICAgICBpIDwgZ2xvYmFsX29iamVjdF9wb29sX2J1aWxkZXIoKS0+Q3VycmVudExlbmd0aCgpOyBpKyspIHsKICAgICAgIGNvbnN0IGF1dG8mIHdyYXBwZXJfZW50cnkgPSBnbG9iYWxfb2JqZWN0X3Bvb2xfYnVpbGRlcigpLT5FbnRyeUF0KGkpOwpAQCAtNzA1LDYgKzcxMCwxMSBAQAogICB9CiB9CiAKK3N0YXRpYyBib29sIElzUG90ZW50aWFsQ2xvc3VyZUNhbGwoY29uc3QgU3RyaW5nJiBzZWxlY3RvcikgeworICByZXR1cm4gc2VsZWN0b3IucmF3KCkgPT0gU3ltYm9sczo6Q2FsbCgpLnJhdygpIHx8CisgICAgICAgICBzZWxlY3Rvci5yYXcoKSA9PSBTeW1ib2xzOjpEeW5hbWljQ2FsbCgpLnJhdygpOworfQorCiB2b2lkIFByZWNvbXBpbGVyOjpBZGRDYWxsZWVzT2ZIZWxwZXIoY29uc3QgT2JqZWN0JiBlbnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcqIHRlbXBfc2VsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MqIHRlbXBfY2xzKSB7CkBAIC03MTMsMjIgKzcyMywyMCBAQAogICAgIC8vIEEgZHluYW1pYyBjYWxsLgogICAgICp0ZW1wX3NlbGVjdG9yID0gY2FsbF9zaXRlLnRhcmdldF9uYW1lKCk7CiAgICAgQWRkU2VsZWN0b3IoKnRlbXBfc2VsZWN0b3IpOwotICAgIGlmICh0ZW1wX3NlbGVjdG9yLT5yYXcoKSA9PSBTeW1ib2xzOjpDYWxsKCkucmF3KCkpIHsKLSAgICAgIC8vIFBvdGVudGlhbCBjbG9zdXJlIGNhbGwuCisgICAgaWYgKElzUG90ZW50aWFsQ2xvc3VyZUNhbGwoKnRlbXBfc2VsZWN0b3IpKSB7CiAgICAgICBjb25zdCBBcnJheSYgYXJndW1lbnRzX2Rlc2NyaXB0b3IgPQotICAgICAgICAgIEFycmF5OjpIYW5kbGUoWiwgY2FsbF9zaXRlLmFyZ3NfZGVzY3JpcHRvcigpKTsKLSAgICAgIEFkZENsb3N1cmVDYWxsKGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKKyAgICAgICAgICBBcnJheTo6SGFuZGxlKFosIGNhbGxfc2l0ZS5hcmd1bWVudHNfZGVzY3JpcHRvcigpKTsKKyAgICAgIEFkZENsb3N1cmVDYWxsKCp0ZW1wX3NlbGVjdG9yLCBhcmd1bWVudHNfZGVzY3JpcHRvcik7CiAgICAgfQogICB9IGVsc2UgaWYgKGVudHJ5LklzTWVnYW1vcnBoaWNDYWNoZSgpKSB7CiAgICAgLy8gQSBkeW5hbWljIGNhbGwuCiAgICAgY29uc3QgYXV0byYgY2FjaGUgPSBNZWdhbW9ycGhpY0NhY2hlOjpDYXN0KGVudHJ5KTsKICAgICAqdGVtcF9zZWxlY3RvciA9IGNhY2hlLnRhcmdldF9uYW1lKCk7CiAgICAgQWRkU2VsZWN0b3IoKnRlbXBfc2VsZWN0b3IpOwotICAgIGlmICh0ZW1wX3NlbGVjdG9yLT5yYXcoKSA9PSBTeW1ib2xzOjpDYWxsKCkucmF3KCkpIHsKLSAgICAgIC8vIFBvdGVudGlhbCBjbG9zdXJlIGNhbGwuCisgICAgaWYgKElzUG90ZW50aWFsQ2xvc3VyZUNhbGwoKnRlbXBfc2VsZWN0b3IpKSB7CiAgICAgICBjb25zdCBBcnJheSYgYXJndW1lbnRzX2Rlc2NyaXB0b3IgPQogICAgICAgICAgIEFycmF5OjpIYW5kbGUoWiwgY2FjaGUuYXJndW1lbnRzX2Rlc2NyaXB0b3IoKSk7Ci0gICAgICBBZGRDbG9zdXJlQ2FsbChhcmd1bWVudHNfZGVzY3JpcHRvcik7CisgICAgICBBZGRDbG9zdXJlQ2FsbCgqdGVtcF9zZWxlY3RvciwgYXJndW1lbnRzX2Rlc2NyaXB0b3IpOwogICAgIH0KICAgfSBlbHNlIGlmIChlbnRyeS5Jc0ZpZWxkKCkpIHsKICAgICAvLyBQb3RlbnRpYWwgbmVlZCBmb3IgZmllbGQgaW5pdGlhbGl6ZXIuCkBAIC05NTIsMTggKzk2MCwyMyBAQAogICBpbnN0YW5jZS5yYXcoKS0+cHRyKCktPlZpc2l0UG9pbnRlcnMoJnZpc2l0b3IpOwogfQogCi12b2lkIFByZWNvbXBpbGVyOjpBZGRDbG9zdXJlQ2FsbChjb25zdCBBcnJheSYgYXJndW1lbnRzX2Rlc2NyaXB0b3IpIHsKK3ZvaWQgUHJlY29tcGlsZXI6OkFkZENsb3N1cmVDYWxsKGNvbnN0IFN0cmluZyYgY2FsbF9zZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvcikgewogICBjb25zdCBDbGFzcyYgY2FjaGVfY2xhc3MgPQogICAgICAgQ2xhc3M6OkhhbmRsZShaLCBJLT5vYmplY3Rfc3RvcmUoKS0+Y2xvc3VyZV9jbGFzcygpKTsKICAgY29uc3QgRnVuY3Rpb24mIGRpc3BhdGNoZXIgPQogICAgICAgRnVuY3Rpb246OkhhbmRsZShaLCBjYWNoZV9jbGFzcy5HZXRJbnZvY2F0aW9uRGlzcGF0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbHM6OkNhbGwoKSwgYXJndW1lbnRzX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3NlbGVjdG9yLCBhcmd1bWVudHNfZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTGF5b3V0OjprSW52b2tlRmllbGREaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVfaWZfYWJzZW50ICovKSk7CiAgIEFkZEZ1bmN0aW9uKGRpc3BhdGNoZXIpOwogfQogCiB2b2lkIFByZWNvbXBpbGVyOjpBZGRGaWVsZChjb25zdCBGaWVsZCYgZmllbGQpIHsKKyAgaWYgKGlzX3RyYWNpbmcoKSkgeworICAgIHRyYWNlcl8tPldyaXRlRmllbGRSZWYoZmllbGQpOworICB9CisKICAgaWYgKGZpZWxkc190b19yZXRhaW5fLkhhc0tleSgmZmllbGQpKSByZXR1cm47CiAKICAgZmllbGRzX3RvX3JldGFpbl8uSW5zZXJ0KCZGaWVsZDo6Wm9uZUhhbmRsZShaLCBmaWVsZC5yYXcoKSkpOwpAQCAtMTAxOSw2ICsxMDMyLDEwIEBACiB9CiAKIHZvaWQgUHJlY29tcGlsZXI6OkFkZEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwgYm9vbCByZXRhaW4pIHsKKyAgaWYgKGlzX3RyYWNpbmcoKSkgeworICAgIHRyYWNlcl8tPldyaXRlRnVuY3Rpb25SZWYoZnVuY3Rpb24pOworICB9CisKICAgaWYgKHBvc3NpYmx5X3JldGFpbmVkX2Z1bmN0aW9uc18uQ29udGFpbnNLZXkoZnVuY3Rpb24pKSByZXR1cm47CiAgIGlmIChyZXRhaW4gfHwgTXVzdFJldGFpbkZ1bmN0aW9uKGZ1bmN0aW9uKSkgewogICAgIHBvc3NpYmx5X3JldGFpbmVkX2Z1bmN0aW9uc18uSW5zZXJ0KGZ1bmN0aW9uKTsKQEAgLTEwMzgsOCArMTA1NSwxMSBAQAogfQogCiB2b2lkIFByZWNvbXBpbGVyOjpBZGRTZWxlY3Rvcihjb25zdCBTdHJpbmcmIHNlbGVjdG9yKSB7Ci0gIEFTU0VSVCghc2VsZWN0b3IuSXNOdWxsKCkpOworICBpZiAoaXNfdHJhY2luZygpKSB7CisgICAgdHJhY2VyXy0+V3JpdGVTZWxlY3RvclJlZihzZWxlY3Rvcik7CisgIH0KIAorICBBU1NFUlQoIXNlbGVjdG9yLklzTnVsbCgpKTsKICAgaWYgKCFJc1NlbnQoc2VsZWN0b3IpKSB7CiAgICAgc2VudF9zZWxlY3RvcnNfLkluc2VydCgmU3RyaW5nOjpab25lSGFuZGxlKFosIHNlbGVjdG9yLnJhdygpKSk7CiAgICAgc2VsZWN0b3JfY291bnRfKys7CkBAIC0xMDU1LDYgKzEwNzUsMTAgQEAKIHZvaWQgUHJlY29tcGlsZXI6OkFkZFRhYmxlU2VsZWN0b3IoY29uc3QgY29tcGlsZXI6OlRhYmxlU2VsZWN0b3IqIHNlbGVjdG9yKSB7CiAgIEFTU0VSVChGTEFHX3VzZV9iYXJlX2luc3RydWN0aW9ucyAmJiBGTEFHX3VzZV90YWJsZV9kaXNwYXRjaCk7CiAKKyAgaWYgKGlzX3RyYWNpbmcoKSkgeworICAgIHRyYWNlcl8tPldyaXRlVGFibGVTZWxlY3RvclJlZihzZWxlY3Rvci0+aWQpOworICB9CisKICAgaWYgKHNlZW5fdGFibGVfc2VsZWN0b3JzXy5IYXNLZXkoc2VsZWN0b3ItPmlkKSkgcmV0dXJuOwogCiAgIHNlZW5fdGFibGVfc2VsZWN0b3JzXy5JbnNlcnQoc2VsZWN0b3ItPmlkKTsKQEAgLTEwNzIsNiArMTA5NiwxMCBAQAogfQogCiB2b2lkIFByZWNvbXBpbGVyOjpBZGRJbnN0YW50aWF0ZWRDbGFzcyhjb25zdCBDbGFzcyYgY2xzKSB7CisgIGlmIChpc190cmFjaW5nKCkpIHsKKyAgICB0cmFjZXJfLT5Xcml0ZUNsYXNzSW5zdGFudGlhdGlvblJlZihjbHMpOworICB9CisKICAgaWYgKGNscy5pc19hbGxvY2F0ZWQoKSkgcmV0dXJuOwogCiAgIGNsYXNzX2NvdW50XysrOwpAQCAtMTI2Miw5ICsxMjkwLDE0IEBACiAgICAgICAgIGtlcm5lbDo6UHJvY2VkdXJlQXR0cmlidXRlc01ldGFkYXRhIG1ldGFkYXRhOwogCiAgICAgICAgIC8vIEhhbmRsZSB0aGUgaW1wbGljaXQgY2FsbCB0eXBlIGNvbnZlcnNpb25zLgotICAgICAgICBpZiAoRmllbGQ6OklzR2V0dGVyTmFtZShzZWxlY3RvcikpIHsKKyAgICAgICAgaWYgKEZpZWxkOjpJc0dldHRlck5hbWUoc2VsZWN0b3IpICYmCisgICAgICAgICAgICAoZnVuY3Rpb24ua2luZCgpICE9IEZ1bmN0aW9uTGF5b3V0OjprTWV0aG9kRXh0cmFjdG9yKSkgewogICAgICAgICAgIC8vIENhbGwtdGhyb3VnaC1nZXR0ZXIuCiAgICAgICAgICAgLy8gRnVuY3Rpb24gaXMgZ2V0OmZvbyBhbmQgc29tZXdoZXJlIGZvbyAob3IgZHluOmZvbykgaXMgY2FsbGVkLgorICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHNraXAgbWV0aG9kIGV4dHJhY3RvcnMgKHdoaWNoIHdlcmUgcG90ZW50aWFsbHkKKyAgICAgICAgICAvLyBjcmVhdGVkIGJ5IERpc3BhdGNoVGFibGVHZW5lcmF0b3IpOiBjYWxsIG9mIGZvbyB3aWxsIG5ldmVyCisgICAgICAgICAgLy8gaGl0IG1ldGhvZCBleHRyYWN0b3IgZ2V0OmZvbywgYmVjYXVzZSBpdCB3aWxsIGhpdCBhbiBleGlzdGluZworICAgICAgICAgIC8vIG1ldGhvZCBmb28gZmlyc3QuCiAgICAgICAgICAgc2VsZWN0b3IyID0gRmllbGQ6Ok5hbWVGcm9tR2V0dGVyKHNlbGVjdG9yKTsKICAgICAgICAgICBzZWxlY3RvcjMgPSBTeW1ib2xzOjpMb29rdXAodGhyZWFkKCksIHNlbGVjdG9yMik7CiAgICAgICAgICAgaWYgKElzU2VudChzZWxlY3RvcjMpKSB7CkBAIC0yNjg5LDYgKzI3MjIsMTAgQEAKICAgQVNTRVJUKENvbXBpbGVyU3RhdGU6OkN1cnJlbnQoKS5pc19hb3QoKSk7CiAgIGNvbnN0IGJvb2wgb3B0aW1pemVkID0gZnVuY3Rpb24uSXNPcHRpbWl6YWJsZSgpOyAgLy8gRmFsc2UgZm9yIG5hdGl2ZXMuCiAgIERhcnRDb21waWxhdGlvblBpcGVsaW5lIHBpcGVsaW5lOworICBpZiAocHJlY29tcGlsZXItPmlzX3RyYWNpbmcoKSkgeworICAgIHByZWNvbXBpbGVyLT50cmFjZXJfLT5Xcml0ZUNvbXBpbGVGdW5jdGlvbkV2ZW50KGZ1bmN0aW9uKTsKKyAgfQorCiAgIHJldHVybiBQcmVjb21waWxlRnVuY3Rpb25IZWxwZXIocHJlY29tcGlsZXIsICZwaXBlbGluZSwgZnVuY3Rpb24sIG9wdGltaXplZCk7CiB9CiAKQEAgLTI5NjcsODMgKzMwMDQsNiBAQAogICB9CiB9CiAKLXZvaWQgT2JmdXNjYXRvcjo6T2JmdXNjYXRlU3ltYm9sSW5zdGFuY2UoVGhyZWFkKiB0aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RhbmNlJiBzeW1ib2wpIHsKLSAgLy8gTm90ZTogdGhpcyBtdXN0IG1hdGNoIGRhcnQ6aW50ZXJuYWwuU3ltYm9sIGRlY2xhcmF0aW9uLgotICBjb25zdCBpbnRwdHJfdCBrU3ltYm9sTmFtZU9mZnNldCA9IGtXb3JkU2l6ZTsKLQotICBPYmplY3QmIG5hbWVfdmFsdWUgPSBTdHJpbmc6OkhhbmRsZSgpOwotICBuYW1lX3ZhbHVlID0gc3ltYm9sLlJhd0dldEZpZWxkQXRPZmZzZXQoa1N5bWJvbE5hbWVPZmZzZXQpOwotICBpZiAoIW5hbWVfdmFsdWUuSXNTdHJpbmcoKSkgewotICAgIC8vIGRhcnQ6aW50ZXJuYWwuU3ltYm9sIGNvbnN0cnVjdG9yIGRvZXMgbm90IHZhbGlkYXRlIGl0cyBpbnB1dC4KLSAgICByZXR1cm47Ci0gIH0KLQotICBTdHJpbmcmIG5hbWUgPSBTdHJpbmc6OkhhbmRsZSgpOwotICBuYW1lIF49IG5hbWVfdmFsdWUucmF3KCk7Ci0KLSAgLy8gVE9ETyh2ZWdvcm92KSBpdCBpcyBxdWl0ZSB3YXN0ZWZ1bCB0byBjcmVhdGUgYW4gb2JmdXNjYXRvciBwZXItc3ltYm9sLgotICBPYmZ1c2NhdG9yIG9iZnVzY2F0b3IodGhyZWFkLCAvKnByaXZhdGVfa2V5PSovU3RyaW5nOjpIYW5kbGUoKSk7Ci0KLSAgLy8gU3ltYm9sIGNhbiBiZSBhIHNlcXVlbmNlIG9mIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBkb3RzLgotICAvLyBXZSBzcGxpdCBzdWNoIHN5bWJvbHMgaW50byBjb21wb25lbnRzIGFuZCBvYmZ1c2NhdGUgaW5kaXZpZHVhbCBpZGVudGlmaWVycwotICAvLyBzZXBhcmF0ZWx5LgotICBTdHJpbmcmIGNvbXBvbmVudCA9IFN0cmluZzo6SGFuZGxlKCk7Ci0gIEdyb3dhYmxlSGFuZGxlUHRyQXJyYXk8Y29uc3QgU3RyaW5nPiByZW5hbWVkKHRocmVhZC0+em9uZSgpLCAyKTsKLQotICBjb25zdCBpbnRwdHJfdCBsZW5ndGggPSBuYW1lLkxlbmd0aCgpOwotICBpbnRwdHJfdCBpID0gMCwgc3RhcnQgPSAwOwotICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgIC8vIEZpcnN0IGxvb2sgZm9yIGEgJy4nIGluIHRoZSBzeW1ib2wuCi0gICAgc3RhcnQgPSBpOwotICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIG5hbWUuQ2hhckF0KGkpICE9ICcuJykgewotICAgICAgaSsrOwotICAgIH0KLSAgICBjb25zdCBpbnRwdHJfdCBlbmQgPSBpOwotICAgIGlmIChlbmQgPT0gbGVuZ3RoKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICBjb21wb25lbnQgPSBTeW1ib2xzOjpOZXcodGhyZWFkLCBuYW1lLCBzdGFydCwgZW5kIC0gc3RhcnQpOwotICAgICAgY29tcG9uZW50ID0gb2JmdXNjYXRvci5SZW5hbWUoY29tcG9uZW50LCAvKmF0b21pYz0qL3RydWUpOwotICAgICAgcmVuYW1lZC5BZGQoY29tcG9uZW50KTsKLSAgICB9Ci0KLSAgICByZW5hbWVkLkFkZChTeW1ib2xzOjpEb3QoKSk7Ci0gICAgaSsrOyAgLy8gU2tpcCAnLicKLSAgfQotCi0gIC8vIEhhbmRsZSB0aGUgbGFzdCBjb21wb25lbnQgW3N0YXJ0LCBsZW5ndGgpLgotICAvLyBJZiBzeW1ib2wgZW5kcyB1cCBhdCA9IGFuZCBpdCBpcyBub3Qgb25lIG9mICdbXT0nLCAnPT0nLCAnPD0nIG9yCi0gIC8vICc+PScgdGhlbiB3ZSB0cmVhdCBpdCBhcyBhIHNldHRlciBzeW1ib2wgYW5kIGZvbGxvdyB0aGUgcnVsZToKLSAgLy8KLSAgLy8gICAgICAgICAgICAgIFJlbmFtZSgnaWRlbnQ9JykgPSBSZW5hbWUoJ2lkZW50JykgJz0nCi0gIC8vCi0gIGNvbnN0IGJvb2wgaXNfc2V0dGVyID0gKGxlbmd0aCAtIHN0YXJ0KSA+IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLkNoYXJBdChsZW5ndGggLSAxKSA9PSAnPScgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAhKG5hbWUuRXF1YWxzKFN5bWJvbHM6OkFzc2lnbkluZGV4VG9rZW4oKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuRXF1YWxzKFN5bWJvbHM6OkVxdWFsT3BlcmF0b3IoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuRXF1YWxzKFN5bWJvbHM6OkdyZWF0ZXJFcXVhbE9wZXJhdG9yKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLkVxdWFscyhTeW1ib2xzOjpMZXNzRXF1YWxPcGVyYXRvcigpKSk7Ci0gIGNvbnN0IGludHB0cl90IGVuZCA9IGxlbmd0aCAtIChpc19zZXR0ZXIgPyAxIDogMCk7Ci0KLSAgaWYgKChzdGFydCA9PSAwKSAmJiAoZW5kID09IGxlbmd0aCkgJiYgbmFtZS5Jc1N5bWJvbCgpKSB7Ci0gICAgY29tcG9uZW50ID0gbmFtZS5yYXcoKTsKLSAgfSBlbHNlIHsKLSAgICBjb21wb25lbnQgPSBTeW1ib2xzOjpOZXcodGhyZWFkLCBuYW1lLCBzdGFydCwgZW5kIC0gc3RhcnQpOwotICB9Ci0gIGNvbXBvbmVudCA9IG9iZnVzY2F0b3IuUmVuYW1lKGNvbXBvbmVudCwgLyphdG9taWM9Ki90cnVlKTsKLSAgcmVuYW1lZC5BZGQoY29tcG9uZW50KTsKLQotICBpZiAoaXNfc2V0dGVyKSB7Ci0gICAgcmVuYW1lZC5BZGQoU3ltYm9sczo6RXF1YWxzKCkpOwotICB9Ci0KLSAgbmFtZSA9IFN5bWJvbHM6OkZyb21Db25jYXRBbGwodGhyZWFkLCByZW5hbWVkKTsKLSAgc3ltYm9sLlJhd1NldEZpZWxkQXRPZmZzZXQoa1N5bWJvbE5hbWVPZmZzZXQsIG5hbWUpOwotfQotCiB2b2lkIE9iZnVzY2F0b3I6OkRlb2JmdXNjYXRlKFRocmVhZCogdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcm93YWJsZU9iamVjdEFycmF5JiBwaWVjZXMpIHsKICAgY29uc3QgQXJyYXkmIG9iZnVzY2F0aW9uX3N0YXRlID0gQXJyYXk6OkhhbmRsZSgKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2FvdC9wcmVjb21waWxlci5oCmluZGV4IGQ2Y2MyMTkuLjVmZGJjMzcgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyLmgKKysrIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvcHJlY29tcGlsZXIuaApAQCAtMjUsMTMgKzI1LDEwIEBACiBjbGFzcyBGaWVsZDsKIGNsYXNzIEZ1bmN0aW9uOwogY2xhc3MgR3Jvd2FibGVPYmplY3RBcnJheTsKLWNsYXNzIFNlcXVlbmNlTm9kZTsKIGNsYXNzIFN0cmluZzsKLWNsYXNzIFBhcnNlZEpTT05PYmplY3Q7Ci1jbGFzcyBQYXJzZWRKU09OQXJyYXk7CiBjbGFzcyBQcmVjb21waWxlcjsKIGNsYXNzIEZsb3dHcmFwaDsKLWNsYXNzIFByZWNvbXBpbGVyRW50cnlQb2ludHNQcmludGVyOworY2xhc3MgUHJlY29tcGlsZXJUcmFjZXI7CiAKIGNsYXNzIFRhYmxlU2VsZWN0b3JLZXlWYWx1ZVRyYWl0IHsKICBwdWJsaWM6CkBAIC0yNDksOSArMjQ2LDI3IEBACiAKICAgUGhhc2UgcGhhc2UoKSBjb25zdCB7IHJldHVybiBwaGFzZV87IH0KIAorICBib29sIGlzX3RyYWNpbmcoKSBjb25zdCB7IHJldHVybiBpc190cmFjaW5nXzsgfQorCiAgcHJpdmF0ZToKICAgc3RhdGljIFByZWNvbXBpbGVyKiBzaW5nbGV0b25fOwogCisgIC8vIFNjb3BlIHdoaWNoIGFjdGl2YXRlcyBtYWNoaW5lIHJlYWRhYmxlIHByZWNvbXBpbGVyIHRyYWNpbmcgaWYgdHJhY2VyCisgIC8vIGlzIGF2YWlsYWJsZS4KKyAgY2xhc3MgVHJhY2luZ1Njb3BlIDogcHVibGljIFZhbHVlT2JqZWN0IHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBUcmFjaW5nU2NvcGUoUHJlY29tcGlsZXIqIHByZWNvbXBpbGVyKQorICAgICAgICA6IHByZWNvbXBpbGVyXyhwcmVjb21waWxlciksIHdhc190cmFjaW5nXyhwcmVjb21waWxlci0+aXNfdHJhY2luZ18pIHsKKyAgICAgIHByZWNvbXBpbGVyLT5pc190cmFjaW5nXyA9IChwcmVjb21waWxlci0+dHJhY2VyXyAhPSBudWxscHRyKTsKKyAgICB9CisKKyAgICB+VHJhY2luZ1Njb3BlKCkgeyBwcmVjb21waWxlcl8tPmlzX3RyYWNpbmdfID0gd2FzX3RyYWNpbmdfOyB9CisKKyAgIHByaXZhdGU6CisgICAgUHJlY29tcGlsZXIqIGNvbnN0IHByZWNvbXBpbGVyXzsKKyAgICBjb25zdCBib29sIHdhc190cmFjaW5nXzsKKyAgfTsKKwogICBleHBsaWNpdCBQcmVjb21waWxlcihUaHJlYWQqIHRocmVhZCk7CiAgIH5QcmVjb21waWxlcigpOwogCkBAIC0yNjksNyArMjg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKiB0ZW1wX3NlbGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyogdGVtcF9jbHMpOwogICB2b2lkIEFkZENvbnN0T2JqZWN0KGNvbnN0IGNsYXNzIEluc3RhbmNlJiBpbnN0YW5jZSk7Ci0gIHZvaWQgQWRkQ2xvc3VyZUNhbGwoY29uc3QgQXJyYXkmIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKKyAgdm9pZCBBZGRDbG9zdXJlQ2FsbChjb25zdCBTdHJpbmcmIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvcik7CiAgIHZvaWQgQWRkRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLCBib29sIHJldGFpbiA9IHRydWUpOwogICB2b2lkIEFkZEluc3RhbnRpYXRlZENsYXNzKGNvbnN0IENsYXNzJiBjbHMpOwogICB2b2lkIEFkZFNlbGVjdG9yKGNvbnN0IFN0cmluZyYgc2VsZWN0b3IpOwpAQCAtMzU1LDYgKzM3MSw4IEBACiAgIHZvaWQqIGlsX3NlcmlhbGl6YXRpb25fc3RyZWFtXzsKIAogICBQaGFzZSBwaGFzZV8gPSBQaGFzZTo6a1ByZXBhcmF0aW9uOworICBQcmVjb21waWxlclRyYWNlciogdHJhY2VyXyA9IG51bGxwdHI7CisgIGJvb2wgaXNfdHJhY2luZ18gPSBmYWxzZTsKIH07CiAKIGNsYXNzIEZ1bmN0aW9uc1RyYWl0cyB7CkBAIC00NDUsMTAgKzQ2Myw2IEBACiAgICAgcmV0dXJuIHN0YXRlXy0+UmVuYW1lSW1wbChuYW1lLCBhdG9taWMpOwogICB9CiAKLSAgLy8gR2l2ZW4gYSBjb25zdGFudCB8aW5zdGFuY2V8IG9mIGRhcnQ6aW50ZXJuYWwuU3ltYm9sIHJlbmFtZSBpdCBieSB1cGRhdGluZwotICAvLyBpdHMgfG5hbWV8IGZpZWxkLgotICBzdGF0aWMgdm9pZCBPYmZ1c2NhdGVTeW1ib2xJbnN0YW5jZShUaHJlYWQqIHRocmVhZCwgY29uc3QgSW5zdGFuY2UmIGluc3RhbmNlKTsKLQogICAvLyBHaXZlbiBhIHNlcXVlbmNlIG9mIG9iZnVzY2F0ZWQgaWRlbnRpZmllcnMgZGVvYmZ1c2NhdGUgaXQuCiAgIC8vCiAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBieSBwYXJzZXIgd2hlbiByZXNvbHZpbmcgY29uZGl0aW9uYWwgaW1wb3J0cwpAQCAtNTg1LDggKzU5OSw2IEBACiAgIH0KIAogICB2b2lkIFByZXZlbnRSZW5hbWluZyhjb25zdCBTdHJpbmcmIG5hbWUpIHt9Ci0gIHN0YXRpYyB2b2lkIE9iZnVzY2F0ZVN5bWJvbEluc3RhbmNlKFRocmVhZCogdGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0YW5jZSYgaW5zdGFuY2UpIHt9CiAKICAgc3RhdGljIHZvaWQgRGVvYmZ1c2NhdGUoVGhyZWFkKiB0aHJlYWQsIGNvbnN0IEdyb3dhYmxlT2JqZWN0QXJyYXkmIHBpZWNlcykge30KIH07CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2FvdC9wcmVjb21waWxlcl90cmFjZXIuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2FvdC9wcmVjb21waWxlcl90cmFjZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyX3RyYWNlci5jYwpAQCAtMCwwICsxLDE2OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyX3RyYWNlci5oIgorCisjaW5jbHVkZSAidm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyLmgiCisjaW5jbHVkZSAidm0vem9uZV90ZXh0X2J1ZmZlci5oIgorCituYW1lc3BhY2UgZGFydCB7CisKKyNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRVIpCisKK0RFRklORV9GTEFHKGNoYXJwLAorICAgICAgICAgICAgdHJhY2VfcHJlY29tcGlsZXJfdG8sCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgIk91dHB1dCBtYWNoaW5lIHJlYWRhYmxlIHByZWNvbXBpbGF0aW9uIHRyYWNlIGludG8gdGhlIGdpdmVuIGZpbGUiKTsKKworUHJlY29tcGlsZXJUcmFjZXIqIFByZWNvbXBpbGVyVHJhY2VyOjpTdGFydFRyYWNpbmdJZlJlcXVlc3RlZCgKKyAgICBQcmVjb21waWxlciogcHJlY29tcGlsZXIpIHsKKyAgaWYgKEZMQUdfdHJhY2VfcHJlY29tcGlsZXJfdG8gIT0gbnVsbHB0ciAmJgorICAgICAgRGFydDo6ZmlsZV93cml0ZV9jYWxsYmFjaygpICE9IG51bGxwdHIgJiYKKyAgICAgIERhcnQ6OmZpbGVfb3Blbl9jYWxsYmFjaygpICE9IG51bGxwdHIgJiYKKyAgICAgIERhcnQ6OmZpbGVfY2xvc2VfY2FsbGJhY2soKSAhPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBQcmVjb21waWxlclRyYWNlcigKKyAgICAgICAgcHJlY29tcGlsZXIsIERhcnQ6OmZpbGVfb3Blbl9jYWxsYmFjaygpKEZMQUdfdHJhY2VfcHJlY29tcGlsZXJfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndyaXRlPSovdHJ1ZSkpOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitQcmVjb21waWxlclRyYWNlcjo6UHJlY29tcGlsZXJUcmFjZXIoUHJlY29tcGlsZXIqIHByZWNvbXBpbGVyLCB2b2lkKiBzdHJlYW0pCisgICAgOiB6b25lXyhUaHJlYWQ6OkN1cnJlbnQoKS0+em9uZSgpKSwKKyAgICAgIHByZWNvbXBpbGVyXyhwcmVjb21waWxlciksCisgICAgICBzdHJlYW1fKHN0cmVhbSksCisgICAgICBzdHJpbmdzXyhIYXNoVGFibGVzOjpOZXc8U3RyaW5nVGFibGU+KDEwMjQpKSwKKyAgICAgIGVudGl0aWVzXyhIYXNoVGFibGVzOjpOZXc8RW50aXR5VGFibGU+KDEwMjQpKSwKKyAgICAgIG9iamVjdF8oT2JqZWN0OjpIYW5kbGUoKSksCisgICAgICBjbHNfKENsYXNzOjpIYW5kbGUoKSkgeworICBXcml0ZSgie1widHJhY2VcIjpbXCJSXCIsIik7Cit9CisKK3ZvaWQgUHJlY29tcGlsZXJUcmFjZXI6OkZpbmFsaXplKCkgeworICBXcml0ZSgiXCJFXCJdLCIpOworICBXcml0ZUVudGl0eVRhYmxlKCk7CisgIFdyaXRlKCIsIik7CisgIFdyaXRlU3RyaW5nVGFibGUoKTsKKyAgV3JpdGUoIn1cbiIpOworICBEYXJ0OjpmaWxlX2Nsb3NlX2NhbGxiYWNrKCkoc3RyZWFtXyk7CisKKyAgc3RyaW5nc18uUmVsZWFzZSgpOworICBlbnRpdGllc18uUmVsZWFzZSgpOworfQorCit2b2lkIFByZWNvbXBpbGVyVHJhY2VyOjpXcml0ZUVudGl0eVRhYmxlKCkgeworICBXcml0ZSgiXCJlbnRpdGllc1wiOlsiKTsKKyAgY29uc3QgYXV0byYgZW50aXRpZXNfYnlfaWQgPQorICAgICAgQXJyYXk6OkhhbmRsZSh6b25lXywgQXJyYXk6Ok5ldyhlbnRpdGllc18uTnVtT2NjdXBpZWQoKSkpOworCisgIEVudGl0eVRhYmxlOjpJdGVyYXRvciBpdCgmZW50aXRpZXNfKTsKKyAgd2hpbGUgKGl0Lk1vdmVOZXh0KCkpIHsKKyAgICBvYmplY3RfID0gZW50aXRpZXNfLkdldFBheWxvYWQoaXQuQ3VycmVudCgpLCAwKTsKKyAgICBjb25zdCBpbnRwdHJfdCBpbmRleCA9IFNtaTo6Q2FzdChvYmplY3RfKS5WYWx1ZSgpOworICAgIG9iamVjdF8gPSBlbnRpdGllc18uR2V0S2V5KGl0LkN1cnJlbnQoKSk7CisgICAgZW50aXRpZXNfYnlfaWQuU2V0QXQoaW5kZXgsIG9iamVjdF8pOworICB9CisKKyAgYXV0byYgb2JqID0gT2JqZWN0OjpIYW5kbGUoem9uZV8pOworICBhdXRvJiBsaWIgPSBMaWJyYXJ5OjpIYW5kbGUoem9uZV8pOworICBhdXRvJiBzdHIgPSBTdHJpbmc6OkhhbmRsZSh6b25lXyk7CisgIGZvciAoaW50cHRyX3QgaSA9IDA7IGkgPCBlbnRpdGllc19ieV9pZC5MZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBXcml0ZSgiLCIpOworICAgIH0KKyAgICBvYmogPSBlbnRpdGllc19ieV9pZC5BdChpKTsKKyAgICBpZiAob2JqLklzRnVuY3Rpb24oKSkgeworICAgICAgY29uc3QgYXV0byYgZnVuID0gRnVuY3Rpb246OkNhc3Qob2JqKTsKKyAgICAgIGNsc18gPSBmdW4uT3duZXIoKTsKKyAgICAgIGNvbnN0IGludHB0cl90IHNlbGVjdG9yX2lkID0KKyAgICAgICAgICBGTEFHX3VzZV9iYXJlX2luc3RydWN0aW9ucyAmJiBGTEFHX3VzZV90YWJsZV9kaXNwYXRjaAorICAgICAgICAgICAgICA/IHByZWNvbXBpbGVyXy0+c2VsZWN0b3JfbWFwKCktPlNlbGVjdG9ySWQoZnVuKQorICAgICAgICAgICAgICA6IC0xOworICAgICAgV3JpdGUoIlwiJWNcIiwlIiBQZCAiLCUiIFBkICIsJSIgUGQgIiIsCisgICAgICAgICAgICBmdW4uSXNEeW5hbWljRnVuY3Rpb24oKSA/ICdGJyA6ICdTJywgSW50ZXJuRW50aXR5KGNsc18pLAorICAgICAgICAgICAgSW50ZXJuU3RyaW5nKE5hbWVGb3JUcmFjZShmdW4pKSwgc2VsZWN0b3JfaWQpOworICAgIH0gZWxzZSBpZiAob2JqLklzRmllbGQoKSkgeworICAgICAgY29uc3QgYXV0byYgZmllbGQgPSBGaWVsZDo6Q2FzdChvYmopOworICAgICAgY2xzXyA9IGZpZWxkLk93bmVyKCk7CisgICAgICBzdHIgPSBmaWVsZC5uYW1lKCk7CisgICAgICBXcml0ZSgiXCJWXCIsJSIgUGQgIiwlIiBQZCAiLDAiLCBJbnRlcm5FbnRpdHkoY2xzXyksIEludGVyblN0cmluZyhzdHIpKTsKKyAgICB9IGVsc2UgaWYgKG9iai5Jc0NsYXNzKCkpIHsKKyAgICAgIGNvbnN0IGF1dG8mIGNscyA9IENsYXNzOjpDYXN0KG9iaik7CisgICAgICBsaWIgPSBjbHMubGlicmFyeSgpOworICAgICAgc3RyID0gbGliLnVybCgpOworICAgICAgY29uc3QgYXV0byB1cmxfaWQgPSBJbnRlcm5TdHJpbmcoc3RyKTsKKyAgICAgIHN0ciA9IGNscy5TY3J1YmJlZE5hbWUoKTsKKyAgICAgIGNvbnN0IGF1dG8gbmFtZV9pZCA9IEludGVyblN0cmluZyhzdHIpOworICAgICAgV3JpdGUoIlwiQ1wiLCUiIFBkICIsJSIgUGQgIiwwIiwgdXJsX2lkLCBuYW1lX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgVU5SRUFDSEFCTEUoKTsKKyAgICB9CisgIH0KKyAgV3JpdGUoIl0iKTsKK30KKwordm9pZCBQcmVjb21waWxlclRyYWNlcjo6V3JpdGVTdHJpbmdUYWJsZSgpIHsKKyAgV3JpdGUoIlwic3RyaW5nc1wiOlsiKTsKKyAgR3Jvd2FibGVBcnJheTxjb25zdCBjaGFyKj4gc3RyaW5nc19ieV9pZChzdHJpbmdzXy5OdW1PY2N1cGllZCgpKTsKKyAgc3RyaW5nc19ieV9pZC5FbnN1cmVMZW5ndGgoc3RyaW5nc18uTnVtT2NjdXBpZWQoKSwgbnVsbHB0cik7CisgIFN0cmluZ1RhYmxlOjpJdGVyYXRvciBpdCgmc3RyaW5nc18pOworICB3aGlsZSAoaXQuTW92ZU5leHQoKSkgeworICAgIG9iamVjdF8gPSBzdHJpbmdzXy5HZXRQYXlsb2FkKGl0LkN1cnJlbnQoKSwgMCk7CisgICAgY29uc3QgYXV0byBpbmRleCA9IFNtaTo6Q2FzdChvYmplY3RfKS5WYWx1ZSgpOworICAgIG9iamVjdF8gPSBzdHJpbmdzXy5HZXRLZXkoaXQuQ3VycmVudCgpKTsKKyAgICBzdHJpbmdzX2J5X2lkW2luZGV4XSA9IFN0cmluZzo6Q2FzdChvYmplY3RfKS5Ub0NTdHJpbmcoKTsKKyAgfQorICBhdXRvIGNvbW1hID0gZmFsc2U7CisgIGZvciAoYXV0byBzdHIgOiBzdHJpbmdzX2J5X2lkKSB7CisgICAgV3JpdGUoIiVzXCIlc1wiIiwgY29tbWEgPyAiLCIgOiAiIiwgc3RyKTsKKyAgICBjb21tYSA9IHRydWU7CisgIH0KKyAgV3JpdGUoIl0iKTsKK30KKworaW50cHRyX3QgUHJlY29tcGlsZXJUcmFjZXI6OkludGVyblN0cmluZyhjb25zdCBDU3RyaW5nJiBjc3RyKSB7CisgIG9iamVjdF8gPSBTbWk6Ok5ldyhzdHJpbmdzXy5OdW1PY2N1cGllZCgpKTsKKyAgb2JqZWN0XyA9IHN0cmluZ3NfLkluc2VydE5ld09yR2V0VmFsdWUoY3N0ciwgb2JqZWN0Xyk7CisgIHJldHVybiBTbWk6OkNhc3Qob2JqZWN0XykuVmFsdWUoKTsKK30KKworaW50cHRyX3QgUHJlY29tcGlsZXJUcmFjZXI6OkludGVyblN0cmluZyhjb25zdCBTdHJpbmcmIHN0cikgeworICBvYmplY3RfID0gU21pOjpOZXcoc3RyaW5nc18uTnVtT2NjdXBpZWQoKSk7CisgIG9iamVjdF8gPSBzdHJpbmdzXy5JbnNlcnRPckdldFZhbHVlKHN0ciwgb2JqZWN0Xyk7CisgIHJldHVybiBTbWk6OkNhc3Qob2JqZWN0XykuVmFsdWUoKTsKK30KKworaW50cHRyX3QgUHJlY29tcGlsZXJUcmFjZXI6OkludGVybkVudGl0eShjb25zdCBPYmplY3QmIG9iaikgeworICBBU1NFUlQob2JqLklzRnVuY3Rpb24oKSB8fCBvYmouSXNDbGFzcygpIHx8IG9iai5Jc0ZpZWxkKCkpOworICBjb25zdCBhdXRvIG51bV9vY2N1cGllZCA9IGVudGl0aWVzXy5OdW1PY2N1cGllZCgpOworICBvYmplY3RfID0gU21pOjpOZXcobnVtX29jY3VwaWVkKTsKKyAgb2JqZWN0XyA9IGVudGl0aWVzXy5JbnNlcnRPckdldFZhbHVlKG9iaiwgb2JqZWN0Xyk7CisgIGNvbnN0IGF1dG8gaWQgPSBTbWk6OkNhc3Qob2JqZWN0XykuVmFsdWUoKTsKKyAgaWYgKGlkID09IG51bV9vY2N1cGllZCkgeworICAgIGNsc18gPSBDbGFzczo6bnVsbCgpOworICAgIGlmIChvYmouSXNGdW5jdGlvbigpKSB7CisgICAgICBjbHNfID0gRnVuY3Rpb246OkNhc3Qob2JqKS5Pd25lcigpOworICAgIH0gZWxzZSBpZiAob2JqLklzRmllbGQoKSkgeworICAgICAgY2xzXyA9IEZpZWxkOjpDYXN0KG9iaikuT3duZXIoKTsKKyAgICB9CisgICAgaWYgKGNsc18ucmF3KCkgIT0gQ2xhc3M6Om51bGwoKSkgeworICAgICAgSW50ZXJuRW50aXR5KGNsc18pOworICAgIH0KKyAgfQorICByZXR1cm4gaWQ7Cit9CisKK1ByZWNvbXBpbGVyVHJhY2VyOjpDU3RyaW5nIFByZWNvbXBpbGVyVHJhY2VyOjpOYW1lRm9yVHJhY2UoY29uc3QgRnVuY3Rpb24mIGYpIHsKKyAgWm9uZVRleHRCdWZmZXIgYnVmZmVyKHpvbmVfKTsKKyAgZi5QcmludE5hbWUoTmFtZUZvcm1hdHRpbmdQYXJhbXM6OkRpc2FtYmlndWF0ZWRXaXRob3V0Q2xhc3NOYW1lKAorICAgICAgICAgICAgICAgICAgT2JqZWN0OjpOYW1lVmlzaWJpbGl0eTo6a0ludGVybmFsTmFtZSksCisgICAgICAgICAgICAgICZidWZmZXIpOworICByZXR1cm4ge2J1ZmZlci5idWZmZXIoKSwgYnVmZmVyLmxlbmd0aCgpLAorICAgICAgICAgIFN0cmluZzo6SGFzaChidWZmZXIuYnVmZmVyKCksIGJ1ZmZlci5sZW5ndGgoKSl9OworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoREFSVF9QUkVDT01QSUxFUikKKworfSAgLy8gbmFtZXNwYWNlIGRhcnQKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyX3RyYWNlci5oIGIvcnVudGltZS92bS9jb21waWxlci9hb3QvcHJlY29tcGlsZXJfdHJhY2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NDQ1NwotLS0gL2Rldi9udWxsCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYW90L3ByZWNvbXBpbGVyX3RyYWNlci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUlVOVElNRV9WTV9DT01QSUxFUl9BT1RfUFJFQ09NUElMRVJfVFJBQ0VSX0hfCisjZGVmaW5lIFJVTlRJTUVfVk1fQ09NUElMRVJfQU9UX1BSRUNPTVBJTEVSX1RSQUNFUl9IXworCisjaWYgZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCisjZXJyb3IgIkFPVCBydW50aW1lIHNob3VsZCBub3QgdXNlIGNvbXBpbGVyIHNvdXJjZXMgKGluY2x1ZGluZyBoZWFkZXIgZmlsZXMpIgorI2VuZGlmICAvLyBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKKworI2luY2x1ZGUgInZtL2FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJ2bS9oYXNoX3RhYmxlLmgiCisjaW5jbHVkZSAidm0vc3ltYm9scy5oIgorCituYW1lc3BhY2UgZGFydCB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorY2xhc3MgUHJlY29tcGlsZXI7CisKKyNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRVIpCisvLyBUcmFjZXIgd2hpY2ggcHJvZHVjZXMgbWFjaGluZSByZWFkYWJsZSBwcmVjb21waWxlciB0cmFjZXIsIHdoaWNoIGNhcHR1cmVzCisvLyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29tcGlsZWQgZnVuY3Rpb25zIGFuZCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtLgorLy8gU2VlIHBrZy92bV9zbmFwc2hvdF9hbmFseXNpcy9SRUFETUUubWQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorLy8gZm9ybWF0LgorY2xhc3MgUHJlY29tcGlsZXJUcmFjZXIgOiBwdWJsaWMgWm9uZUFsbG9jYXRlZCB7CisgcHVibGljOgorICBzdGF0aWMgUHJlY29tcGlsZXJUcmFjZXIqIFN0YXJ0VHJhY2luZ0lmUmVxdWVzdGVkKFByZWNvbXBpbGVyKiBwcmVjb21waWxlcik7CisKKyAgdm9pZCBGaW5hbGl6ZSgpOworCisgIHZvaWQgV3JpdGVFbnRpdHlSZWYoY29uc3QgT2JqZWN0JiBmaWVsZCkgeworICAgIFdyaXRlKCIlIiBQZCAiLCIsIEludGVybkVudGl0eShmaWVsZCkpOworICB9CisKKyAgdm9pZCBXcml0ZUZpZWxkUmVmKGNvbnN0IEZpZWxkJiBmaWVsZCkgeyBXcml0ZUVudGl0eVJlZihmaWVsZCk7IH0KKworICB2b2lkIFdyaXRlRnVuY3Rpb25SZWYoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uKSB7IFdyaXRlRW50aXR5UmVmKGZ1bmN0aW9uKTsgfQorCisgIHZvaWQgV3JpdGVTZWxlY3RvclJlZihjb25zdCBTdHJpbmcmIHNlbGVjdG9yKSB7CisgICAgV3JpdGUoIlwiU1wiLCUiIFBkICIsIiwgSW50ZXJuU3RyaW5nKHNlbGVjdG9yKSk7CisgIH0KKworICB2b2lkIFdyaXRlVGFibGVTZWxlY3RvclJlZihpbnRwdHJfdCBpZCkgeyBXcml0ZSgiXCJUXCIsJSIgUGQgIiwiLCBpZCk7IH0KKworICB2b2lkIFdyaXRlQ2xhc3NJbnN0YW50aWF0aW9uUmVmKGNvbnN0IENsYXNzJiBjbHMpIHsgV3JpdGVFbnRpdHlSZWYoY2xzKTsgfQorCisgIHZvaWQgV3JpdGVDb21waWxlRnVuY3Rpb25FdmVudChjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24pIHsKKyAgICBXcml0ZSgiXCJDXCIsIik7CisgICAgV3JpdGVFbnRpdHlSZWYoZnVuY3Rpb24pOworICB9CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgQ1N0cmluZyB7CisgICAgY29uc3QgY2hhciogc3RyOworICAgIGNvbnN0IGludHB0cl90IGxlbmd0aDsKKyAgICBpbnRwdHJfdCBoYXNoOworICB9OworCisgIHN0cnVjdCBTdHJpbmdUYWJsZVRyYWl0cyB7CisgICAgc3RhdGljIGJvb2wgUmVwb3J0U3RhdHMoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBOYW1lKCkgeyByZXR1cm4gIlN0cmluZ1RhYmxlVHJhaXRzIjsgfQorCisgICAgc3RhdGljIGJvb2wgSXNNYXRjaChjb25zdCBPYmplY3QmIGEsIGNvbnN0IE9iamVjdCYgYikgeworICAgICAgcmV0dXJuIFN0cmluZzo6Q2FzdChhKS5FcXVhbHMoU3RyaW5nOjpDYXN0KGIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBJc01hdGNoKGNvbnN0IENTdHJpbmcmIGNzdHIsIGNvbnN0IE9iamVjdCYgb3RoZXIpIHsKKyAgICAgIGNvbnN0IFN0cmluZyYgb3RoZXJfc3RyID0gU3RyaW5nOjpDYXN0KG90aGVyKTsKKyAgICAgIGlmIChvdGhlcl9zdHIuSGFzaCgpICE9IGNzdHIuaGFzaCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChvdGhlcl9zdHIuTGVuZ3RoKCkgIT0gY3N0ci5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gb3RoZXJfc3RyLkVxdWFscyhjc3RyLnN0cik7CisgICAgfQorCisgICAgc3RhdGljIHV3b3JkIEhhc2goY29uc3QgQ1N0cmluZyYgY3N0cikgeyByZXR1cm4gY3N0ci5oYXNoOyB9CisKKyAgICBzdGF0aWMgdXdvcmQgSGFzaChjb25zdCBPYmplY3QmIG9iaikgeyByZXR1cm4gU3RyaW5nOjpDYXN0KG9iaikuSGFzaCgpOyB9CisKKyAgICBzdGF0aWMgT2JqZWN0UHRyIE5ld0tleShjb25zdCBDU3RyaW5nJiBjc3RyKSB7CisgICAgICByZXR1cm4gU3ltYm9sczo6TmV3KFRocmVhZDo6Q3VycmVudCgpLCBjc3RyLnN0cik7CisgICAgfQorICB9OworCisgIHN0cnVjdCBFbnRpdHlUYWJsZVRyYWl0cyB7CisgICAgc3RhdGljIGJvb2wgUmVwb3J0U3RhdHMoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBOYW1lKCkgeyByZXR1cm4gIkVudGl0eVRhYmxlVHJhaXRzIjsgfQorCisgICAgc3RhdGljIGJvb2wgSXNNYXRjaChjb25zdCBPYmplY3QmIGEsIGNvbnN0IE9iamVjdCYgYikgeworICAgICAgcmV0dXJuIGEucmF3KCkgPT0gYi5yYXcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdXdvcmQgSGFzaChjb25zdCBPYmplY3QmIG9iaikgeworICAgICAgaWYgKG9iai5Jc0Z1bmN0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIEZ1bmN0aW9uOjpDYXN0KG9iaikuSGFzaCgpOworICAgICAgfSBlbHNlIGlmIChvYmouSXNDbGFzcygpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc6Okhhc2hSYXdTeW1ib2woQ2xhc3M6OkNhc3Qob2JqKS5OYW1lKCkpOworICAgICAgfSBlbHNlIGlmIChvYmouSXNGaWVsZCgpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc6Okhhc2hSYXdTeW1ib2woRmllbGQ6OkNhc3Qob2JqKS5uYW1lKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIG9iai5HZXRDbGFzc0lkKCk7CisgICAgfQorICB9OworCisgIHVzaW5nIFN0cmluZ1RhYmxlID0gVW5vcmRlcmVkSGFzaE1hcDxTdHJpbmdUYWJsZVRyYWl0cz47CisgIHVzaW5nIEVudGl0eVRhYmxlID0gVW5vcmRlcmVkSGFzaE1hcDxFbnRpdHlUYWJsZVRyYWl0cz47CisKKyAgUHJlY29tcGlsZXJUcmFjZXIoUHJlY29tcGlsZXIqIHByZWNvbXBpbGVyLCB2b2lkKiBzdHJlYW0pOworCisgIGludHB0cl90IEludGVyblN0cmluZyhjb25zdCBDU3RyaW5nJiBjc3RyKTsKKyAgaW50cHRyX3QgSW50ZXJuU3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyKTsKKyAgaW50cHRyX3QgSW50ZXJuRW50aXR5KGNvbnN0IE9iamVjdCYgb2JqKTsKKworICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSBQUklOVEZfQVRUUklCVVRFKDIsIDMpIHsKKyAgICB2YV9saXN0IHZhOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIGNvbnN0IGNoYXIqIGxpbmUgPSBPUzo6VlNDcmVhdGUoem9uZV8sIGZvcm1hdCwgdmEpOworICAgIERhcnQ6OmZpbGVfd3JpdGVfY2FsbGJhY2soKShsaW5lLCBzdHJsZW4obGluZSksIHN0cmVhbV8pOworICAgIHZhX2VuZCh2YSk7CisgIH0KKworICBDU3RyaW5nIE5hbWVGb3JUcmFjZShjb25zdCBGdW5jdGlvbiYgZik7CisKKyAgdm9pZCBXcml0ZUVudGl0eVRhYmxlKCk7CisgIHZvaWQgV3JpdGVTdHJpbmdUYWJsZSgpOworCisgIFpvbmUqIHpvbmVfOworICBQcmVjb21waWxlciogcHJlY29tcGlsZXJfOworICB2b2lkKiBzdHJlYW1fOworICBTdHJpbmdUYWJsZSBzdHJpbmdzXzsKKyAgRW50aXR5VGFibGUgZW50aXRpZXNfOworCisgIE9iamVjdCYgb2JqZWN0XzsKKyAgQ2xhc3MmIGNsc187Cit9OworI2VuZGlmICAvLyBkZWZpbmVkKERBUlRfUFJFQ09NUElMRVIpCisKK30gIC8vIG5hbWVzcGFjZSBkYXJ0CisKKyNlbmRpZiAgLy8gUlVOVElNRV9WTV9DT01QSUxFUl9BT1RfUFJFQ09NUElMRVJfVFJBQ0VSX0hfCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXJfYXJtLmNjIGIvcnVudGltZS92bS9jb21waWxlci9hc3NlbWJsZXIvYXNzZW1ibGVyX2FybS5jYwppbmRleCA1YzcxZjk0Li4xOTczNzkwIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXJfYXJtLmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYXNzZW1ibGVyL2Fzc2VtYmxlcl9hcm0uY2MKQEAgLTM2NCwxMyArMzY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgcmEsCiAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiBjb25kKSB7CiAgIC8vIHJkIDwtIHJhIC0gcm4gKiBybS4KLSAgaWYgKFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpID09IEFSTXY3KSB7Ci0gICAgLy8gQXNzZW1ibGVyIHJlZ2lzdGVycyByZCwgcm4sIHJtLCByYSBhcmUgZW5jb2RlZCBhcyBybiwgcm0sIHJzLCByZC4KLSAgICBFbWl0TXVsT3AoY29uZCwgQjIyIHwgQjIxLCByYSwgcmQsIHJuLCBybSk7Ci0gIH0gZWxzZSB7Ci0gICAgbXVsKElQLCBybiwgcm0sIGNvbmQpOwotICAgIHN1YihyZCwgcmEsIE9wZXJhbmQoSVApLCBjb25kKTsKLSAgfQorICAvLyBBc3NlbWJsZXIgcmVnaXN0ZXJzIHJkLCBybiwgcm0sIHJhIGFyZSBlbmNvZGVkIGFzIHJuLCBybSwgcnMsIHJkLgorICBFbWl0TXVsT3AoY29uZCwgQjIyIHwgQjIxLCByYSwgcmQsIHJuLCBybSk7CiB9CiAKIHZvaWQgQXNzZW1ibGVyOjpzbXVsbChSZWdpc3RlciByZF9sbywKQEAgLTk3OCw5ICs5NzMsNiBAQAogfQogCiBib29sIEFzc2VtYmxlcjo6dm1vdnMoU1JlZ2lzdGVyIHNkLCBmbG9hdCBzX2ltbSwgQ29uZGl0aW9uIGNvbmQpIHsKLSAgaWYgKFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpICE9IEFSTXY3KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CiAgIHVpbnQzMl90IGltbTMyID0gYml0X2Nhc3Q8dWludDMyX3QsIGZsb2F0PihzX2ltbSk7CiAgIGlmICgoKGltbTMyICYgKCgxIDw8IDE5KSAtIDEpKSA9PSAwKSAmJgogICAgICAgKCgoKGltbTMyID4+IDI1KSAmICgoMSA8PCA2KSAtIDEpKSA9PSAoMSA8PCA1KSkgfHwKQEAgLTk5NSw5ICs5ODcsNiBAQAogfQogCiBib29sIEFzc2VtYmxlcjo6dm1vdmQoRFJlZ2lzdGVyIGRkLCBkb3VibGUgZF9pbW0sIENvbmRpdGlvbiBjb25kKSB7Ci0gIGlmIChUYXJnZXRDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb24oKSAhPSBBUk12NykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQogICB1aW50NjRfdCBpbW02NCA9IGJpdF9jYXN0PHVpbnQ2NF90LCBkb3VibGU+KGRfaW1tKTsKICAgaWYgKCgoaW1tNjQgJiAoKDFMTCA8PCA0OCkgLSAxKSkgPT0gMCkgJiYKICAgICAgICgoKChpbW02NCA+PiA1NCkgJiAoKDEgPDwgOSkgLSAxKSkgPT0gKDEgPDwgOCkpIHx8CkBAIC0yMDc0LDY5ICsyMDYzLDE1IEBACiAgIHJldHVybiBvZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbnQzMl90IERlY29kZUFSTXY2TG9hZEltbWVkaWF0ZShpbnQzMl90IG1vdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9yMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9yMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9yMykgewotICBpbnQzMl90IG9mZnNldCA9IDA7Ci0gIG9mZnNldCB8PSAobW92ICYgMHhmZikgPDwgMjQ7Ci0gIG9mZnNldCB8PSAob3IxICYgMHhmZikgPDwgMTY7Ci0gIG9mZnNldCB8PSAob3IyICYgMHhmZikgPDwgODsKLSAgb2Zmc2V0IHw9IChvcjMgJiAweGZmKTsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQogY2xhc3MgUGF0Y2hGYXJCcmFuY2ggOiBwdWJsaWMgQXNzZW1ibGVyRml4dXAgewogIHB1YmxpYzoKICAgUGF0Y2hGYXJCcmFuY2goKSB7fQogCiAgIHZvaWQgUHJvY2Vzcyhjb25zdCBNZW1vcnlSZWdpb24mIHJlZ2lvbiwgaW50cHRyX3QgcG9zaXRpb24pIHsKLSAgICBjb25zdCBBUk1WZXJzaW9uIHZlcnNpb24gPSBUYXJnZXRDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb24oKTsKLSAgICBpZiAodmVyc2lvbiA9PSBBUk12NikgewotICAgICAgUHJvY2Vzc0FSTXY2KHJlZ2lvbiwgcG9zaXRpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlQodmVyc2lvbiA9PSBBUk12Nyk7Ci0gICAgICBQcm9jZXNzQVJNdjcocmVnaW9uLCBwb3NpdGlvbik7Ci0gICAgfQorICAgIFByb2Nlc3NBUk12NyhyZWdpb24sIHBvc2l0aW9uKTsKICAgfQogCiAgcHJpdmF0ZToKLSAgdm9pZCBQcm9jZXNzQVJNdjYoY29uc3QgTWVtb3J5UmVnaW9uJiByZWdpb24sIGludHB0cl90IHBvc2l0aW9uKSB7Ci0gICAgY29uc3QgaW50MzJfdCBtb3YgPSByZWdpb24uTG9hZDxpbnQzMl90Pihwb3NpdGlvbik7Ci0gICAgY29uc3QgaW50MzJfdCBvcjEgPSByZWdpb24uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDEgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0gICAgY29uc3QgaW50MzJfdCBvcjIgPSByZWdpb24uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDIgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0gICAgY29uc3QgaW50MzJfdCBvcjMgPSByZWdpb24uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDMgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0gICAgY29uc3QgaW50MzJfdCBieCA9IHJlZ2lvbi5Mb2FkPGludDMyX3Q+KHBvc2l0aW9uICsgNCAqIEluc3RyOjprSW5zdHJTaXplKTsKLQotICAgIGlmICgoKG1vdiAmIDB4ZmZmZmZmMDApID09IDB4ZTNhMGM0MDApICYmICAvLyBtb3YgSVAsIChieXRlMyByb3QgNCkKLSAgICAgICAgKChvcjEgJiAweGZmZmZmZjAwKSA9PSAweGUzOGNjODAwKSAmJiAgLy8gb3JyIElQLCBJUCwgKGJ5dGUyIHJvdCA4KQotICAgICAgICAoKG9yMiAmIDB4ZmZmZmZmMDApID09IDB4ZTM4Y2NjMDApICYmICAvLyBvcnIgSVAsIElQLCAoYnl0ZTEgcm90IDEyKQotICAgICAgICAoKG9yMyAmIDB4ZmZmZmZmMDApID09IDB4ZTM4Y2MwMDApKSB7ICAvLyBvcnIgSVAsIElQLCBieXRlMAotICAgICAgY29uc3QgaW50MzJfdCBvZmZzZXQgPSBEZWNvZGVBUk12NkxvYWRJbW1lZGlhdGUobW92LCBvcjEsIG9yMiwgb3IzKTsKLSAgICAgIGNvbnN0IGludDMyX3QgZGVzdCA9IHJlZ2lvbi5zdGFydCgpICsgb2Zmc2V0OwotICAgICAgY29uc3QgaW50MzJfdCBkZXN0MCA9IChkZXN0ICYgMHgwMDAwMDBmZik7Ci0gICAgICBjb25zdCBpbnQzMl90IGRlc3QxID0gKGRlc3QgJiAweDAwMDBmZjAwKSA+PiA4OwotICAgICAgY29uc3QgaW50MzJfdCBkZXN0MiA9IChkZXN0ICYgMHgwMGZmMDAwMCkgPj4gMTY7Ci0gICAgICBjb25zdCBpbnQzMl90IGRlc3QzID0gKGRlc3QgJiAweGZmMDAwMDAwKSA+PiAyNDsKLSAgICAgIGNvbnN0IGludDMyX3QgcGF0Y2hlZF9tb3YgPSAweGUzYTBjNDAwIHwgZGVzdDM7Ci0gICAgICBjb25zdCBpbnQzMl90IHBhdGNoZWRfb3IxID0gMHhlMzhjYzgwMCB8IGRlc3QyOwotICAgICAgY29uc3QgaW50MzJfdCBwYXRjaGVkX29yMiA9IDB4ZTM4Y2NjMDAgfCBkZXN0MTsKLSAgICAgIGNvbnN0IGludDMyX3QgcGF0Y2hlZF9vcjMgPSAweGUzOGNjMDAwIHwgZGVzdDA7Ci0KLSAgICAgIHJlZ2lvbi5TdG9yZTxpbnQzMl90Pihwb3NpdGlvbiArIDAgKiBJbnN0cjo6a0luc3RyU2l6ZSwgcGF0Y2hlZF9tb3YpOwotICAgICAgcmVnaW9uLlN0b3JlPGludDMyX3Q+KHBvc2l0aW9uICsgMSAqIEluc3RyOjprSW5zdHJTaXplLCBwYXRjaGVkX29yMSk7Ci0gICAgICByZWdpb24uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAyICogSW5zdHI6OmtJbnN0clNpemUsIHBhdGNoZWRfb3IyKTsKLSAgICAgIHJlZ2lvbi5TdG9yZTxpbnQzMl90Pihwb3NpdGlvbiArIDMgKiBJbnN0cjo6a0luc3RyU2l6ZSwgcGF0Y2hlZF9vcjMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBvZmZzZXQgbG9hZGluZyBpbnN0cnVjdGlvbnMgYXJlbid0IHRoZXJlLCB3ZSBtdXN0IGhhdmUgcmVwbGFjZWQKLSAgICAvLyB0aGUgZmFyIGJyYW5jaCB3aXRoIGEgbmVhciBvbmUsIGFuZCBzbyB0aGVzZSBpbnN0cnVjdGlvbnMKLSAgICAvLyBzaG91bGQgYmUgTk9Qcy4KLSAgICBBU1NFUlQoKG9yMSA9PSBJbnN0cjo6a05vcEluc3RydWN0aW9uKSAmJiAob3IyID09IEluc3RyOjprTm9wSW5zdHJ1Y3Rpb24pICYmCi0gICAgICAgICAgIChvcjMgPT0gSW5zdHI6OmtOb3BJbnN0cnVjdGlvbikgJiYgKGJ4ID09IEluc3RyOjprTm9wSW5zdHJ1Y3Rpb24pKTsKLSAgfQotCiAgIHZvaWQgUHJvY2Vzc0FSTXY3KGNvbnN0IE1lbW9yeVJlZ2lvbiYgcmVnaW9uLCBpbnRwdHJfdCBwb3NpdGlvbikgewogICAgIGNvbnN0IGludDMyX3QgbW92dyA9IHJlZ2lvbi5Mb2FkPGludDMyX3Q+KHBvc2l0aW9uKTsKICAgICBjb25zdCBpbnQzMl90IG1vdnQgPSByZWdpb24uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIEluc3RyOjprSW5zdHJTaXplKTsKQEAgLTIxOTgsODUgKzIxMzMsNiBAQAogICB9CiB9CiAKLXZvaWQgQXNzZW1ibGVyOjpCaW5kQVJNdjYoTGFiZWwqIGxhYmVsKSB7Ci0gIEFTU0VSVCghbGFiZWwtPklzQm91bmQoKSk7Ci0gIGludHB0cl90IGJvdW5kX3BjID0gYnVmZmVyXy5TaXplKCk7Ci0gIHdoaWxlIChsYWJlbC0+SXNMaW5rZWQoKSkgewotICAgIGNvbnN0IGludDMyX3QgcG9zaXRpb24gPSBsYWJlbC0+UG9zaXRpb24oKTsKLSAgICBpbnQzMl90IGRlc3QgPSBib3VuZF9wYyAtIHBvc2l0aW9uOwotICAgIGlmICh1c2VfZmFyX2JyYW5jaGVzKCkgJiYgIUNhbkVuY29kZUJyYW5jaERpc3RhbmNlKGRlc3QpKSB7Ci0gICAgICAvLyBGYXIgYnJhbmNoZXMgYXJlIGVuYWJsZWQgYW5kIHdlIGNhbid0IGVuY29kZSB0aGUgYnJhbmNoIG9mZnNldC4KLQotICAgICAgLy8gR3JhYiBpbnN0cnVjdGlvbnMgdGhhdCBsb2FkIHRoZSBvZmZzZXQuCi0gICAgICBjb25zdCBpbnQzMl90IG1vdiA9IGJ1ZmZlcl8uTG9hZDxpbnQzMl90Pihwb3NpdGlvbik7Ci0gICAgICBjb25zdCBpbnQzMl90IG9yMSA9Ci0gICAgICAgICAgYnVmZmVyXy5Mb2FkPGludDMyX3Q+KHBvc2l0aW9uICsgMSAqIEluc3RyOjprSW5zdHJTaXplKTsKLSAgICAgIGNvbnN0IGludDMyX3Qgb3IyID0KLSAgICAgICAgICBidWZmZXJfLkxvYWQ8aW50MzJfdD4ocG9zaXRpb24gKyAyICogSW5zdHI6OmtJbnN0clNpemUpOwotICAgICAgY29uc3QgaW50MzJfdCBvcjMgPQotICAgICAgICAgIGJ1ZmZlcl8uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDMgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0KLSAgICAgIC8vIENoYW5nZSBmcm9tIHJlbGF0aXZlIHRvIHRoZSBicmFuY2ggdG8gcmVsYXRpdmUgdG8gdGhlIGFzc2VtYmxlcgotICAgICAgLy8gYnVmZmVyLgotICAgICAgZGVzdCA9IGJ1ZmZlcl8uU2l6ZSgpOwotICAgICAgY29uc3QgaW50MzJfdCBkZXN0MCA9IChkZXN0ICYgMHgwMDAwMDBmZik7Ci0gICAgICBjb25zdCBpbnQzMl90IGRlc3QxID0gKGRlc3QgJiAweDAwMDBmZjAwKSA+PiA4OwotICAgICAgY29uc3QgaW50MzJfdCBkZXN0MiA9IChkZXN0ICYgMHgwMGZmMDAwMCkgPj4gMTY7Ci0gICAgICBjb25zdCBpbnQzMl90IGRlc3QzID0gKGRlc3QgJiAweGZmMDAwMDAwKSA+PiAyNDsKLSAgICAgIGNvbnN0IGludDMyX3QgcGF0Y2hlZF9tb3YgPSAweGUzYTBjNDAwIHwgZGVzdDM7Ci0gICAgICBjb25zdCBpbnQzMl90IHBhdGNoZWRfb3IxID0gMHhlMzhjYzgwMCB8IGRlc3QyOwotICAgICAgY29uc3QgaW50MzJfdCBwYXRjaGVkX29yMiA9IDB4ZTM4Y2NjMDAgfCBkZXN0MTsKLSAgICAgIGNvbnN0IGludDMyX3QgcGF0Y2hlZF9vcjMgPSAweGUzOGNjMDAwIHwgZGVzdDA7Ci0KLSAgICAgIC8vIFJld3JpdGUgdGhlIGluc3RydWN0aW9ucy4KLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAwICogSW5zdHI6OmtJbnN0clNpemUsIHBhdGNoZWRfbW92KTsKLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAxICogSW5zdHI6OmtJbnN0clNpemUsIHBhdGNoZWRfb3IxKTsKLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAyICogSW5zdHI6OmtJbnN0clNpemUsIHBhdGNoZWRfb3IyKTsKLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAzICogSW5zdHI6OmtJbnN0clNpemUsIHBhdGNoZWRfb3IzKTsKLSAgICAgIGxhYmVsLT5wb3NpdGlvbl8gPSBEZWNvZGVBUk12NkxvYWRJbW1lZGlhdGUobW92LCBvcjEsIG9yMiwgb3IzKTsKLSAgICB9IGVsc2UgaWYgKHVzZV9mYXJfYnJhbmNoZXMoKSAmJiBDYW5FbmNvZGVCcmFuY2hEaXN0YW5jZShkZXN0KSkgewotICAgICAgLy8gR3JhYiBpbnN0cnVjdGlvbnMgdGhhdCBsb2FkIHRoZSBvZmZzZXQsIGFuZCB0aGUgYnJhbmNoLgotICAgICAgY29uc3QgaW50MzJfdCBtb3YgPSBidWZmZXJfLkxvYWQ8aW50MzJfdD4ocG9zaXRpb24pOwotICAgICAgY29uc3QgaW50MzJfdCBvcjEgPQotICAgICAgICAgIGJ1ZmZlcl8uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDEgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0gICAgICBjb25zdCBpbnQzMl90IG9yMiA9Ci0gICAgICAgICAgYnVmZmVyXy5Mb2FkPGludDMyX3Q+KHBvc2l0aW9uICsgMiAqIEluc3RyOjprSW5zdHJTaXplKTsKLSAgICAgIGNvbnN0IGludDMyX3Qgb3IzID0KLSAgICAgICAgICBidWZmZXJfLkxvYWQ8aW50MzJfdD4ocG9zaXRpb24gKyAzICogSW5zdHI6OmtJbnN0clNpemUpOwotICAgICAgY29uc3QgaW50MzJfdCBicmFuY2ggPQotICAgICAgICAgIGJ1ZmZlcl8uTG9hZDxpbnQzMl90Pihwb3NpdGlvbiArIDQgKiBJbnN0cjo6a0luc3RyU2l6ZSk7Ci0KLSAgICAgIC8vIEdyYWIgdGhlIGJyYW5jaCBjb25kaXRpb24sIGFuZCBlbmNvZGUgdGhlIGxpbmsgYml0LgotICAgICAgY29uc3QgaW50MzJfdCBjb25kID0gYnJhbmNoICYgMHhmMDAwMDAwMDsKLSAgICAgIGNvbnN0IGludDMyX3QgbGluayA9IChicmFuY2ggJiAweDIwKSA8PCAxOTsKLQotICAgICAgLy8gRW5jb2RlIHRoZSBicmFuY2ggYW5kIHRoZSBvZmZzZXQuCi0gICAgICBjb25zdCBpbnQzMl90IG5ld19icmFuY2ggPSBjb25kIHwgbGluayB8IDB4MGEwMDAwMDA7Ci0gICAgICBjb25zdCBpbnQzMl90IGVuY29kZWQgPSBFbmNvZGVCcmFuY2hPZmZzZXQoZGVzdCwgbmV3X2JyYW5jaCk7Ci0KLSAgICAgIC8vIFdyaXRlIHRoZSBlbmNvZGVkIGJyYW5jaCBpbnN0cnVjdGlvbiBmb2xsb3dlZCBieSB0d28gbm9wcy4KLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24sIGVuY29kZWQpOwotICAgICAgYnVmZmVyXy5TdG9yZTxpbnQzMl90Pihwb3NpdGlvbiArIDEgKiBJbnN0cjo6a0luc3RyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHI6OmtOb3BJbnN0cnVjdGlvbik7Ci0gICAgICBidWZmZXJfLlN0b3JlPGludDMyX3Q+KHBvc2l0aW9uICsgMiAqIEluc3RyOjprSW5zdHJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cjo6a05vcEluc3RydWN0aW9uKTsKLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24gKyAzICogSW5zdHI6OmtJbnN0clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyOjprTm9wSW5zdHJ1Y3Rpb24pOwotICAgICAgYnVmZmVyXy5TdG9yZTxpbnQzMl90Pihwb3NpdGlvbiArIDQgKiBJbnN0cjo6a0luc3RyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHI6OmtOb3BJbnN0cnVjdGlvbik7Ci0KLSAgICAgIGxhYmVsLT5wb3NpdGlvbl8gPSBEZWNvZGVBUk12NkxvYWRJbW1lZGlhdGUobW92LCBvcjEsIG9yMiwgb3IzKTsKLSAgICB9IGVsc2UgewotICAgICAgQmFpbG91dElmSW52YWxpZEJyYW5jaE9mZnNldChkZXN0KTsKLSAgICAgIGludDMyX3QgbmV4dCA9IGJ1ZmZlcl8uTG9hZDxpbnQzMl90Pihwb3NpdGlvbik7Ci0gICAgICBpbnQzMl90IGVuY29kZWQgPSBBc3NlbWJsZXI6OkVuY29kZUJyYW5jaE9mZnNldChkZXN0LCBuZXh0KTsKLSAgICAgIGJ1ZmZlcl8uU3RvcmU8aW50MzJfdD4ocG9zaXRpb24sIGVuY29kZWQpOwotICAgICAgbGFiZWwtPnBvc2l0aW9uXyA9IEFzc2VtYmxlcjo6RGVjb2RlQnJhbmNoT2Zmc2V0KG5leHQpOwotICAgIH0KLSAgfQotICBsYWJlbC0+QmluZFRvKGJvdW5kX3BjKTsKLX0KLQogdm9pZCBBc3NlbWJsZXI6OkJpbmRBUk12NyhMYWJlbCogbGFiZWwpIHsKICAgQVNTRVJUKCFsYWJlbC0+SXNCb3VuZCgpKTsKICAgaW50cHRyX3QgYm91bmRfcGMgPSBidWZmZXJfLlNpemUoKTsKQEAgLTIzNDUsMTMgKzIyMDEsNyBAQAogfQogCiB2b2lkIEFzc2VtYmxlcjo6QmluZChMYWJlbCogbGFiZWwpIHsKLSAgY29uc3QgQVJNVmVyc2lvbiB2ZXJzaW9uID0gVGFyZ2V0Q1BVRmVhdHVyZXM6OmFybV92ZXJzaW9uKCk7Ci0gIGlmICh2ZXJzaW9uID09IEFSTXY2KSB7Ci0gICAgQmluZEFSTXY2KGxhYmVsKTsKLSAgfSBlbHNlIHsKLSAgICBBU1NFUlQodmVyc2lvbiA9PSBBUk12Nyk7Ci0gICAgQmluZEFSTXY3KGxhYmVsKTsKLSAgfQorICBCaW5kQVJNdjcobGFiZWwpOwogfQogCiBPcGVyYW5kU2l6ZSBBZGRyZXNzOjpPcGVyYW5kU2l6ZUZvcihpbnRwdHJfdCBjaWQpIHsKQEAgLTI3OTQsNDUgKzI2NDQsMTkgQEAKIHZvaWQgQXNzZW1ibGVyOjpMb2FkUGF0Y2hhYmxlSW1tZWRpYXRlKFJlZ2lzdGVyIHJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiBjb25kKSB7Ci0gIGNvbnN0IEFSTVZlcnNpb24gdmVyc2lvbiA9IFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpOwotICBpZiAodmVyc2lvbiA9PSBBUk12NikgewotICAgIC8vIFRoaXMgc2VxdWVuY2UgaXMgcGF0Y2hlZCBpbiBhIGZldyBwbGFjZXMsIGFuZCBzaG91bGQgcmVtYWluIGZpeGVkLgotICAgIGNvbnN0IHVpbnQzMl90IGJ5dGUwID0gKHZhbHVlICYgMHgwMDAwMDBmZik7Ci0gICAgY29uc3QgdWludDMyX3QgYnl0ZTEgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OwotICAgIGNvbnN0IHVpbnQzMl90IGJ5dGUyID0gKHZhbHVlICYgMHgwMGZmMDAwMCkgPj4gMTY7Ci0gICAgY29uc3QgdWludDMyX3QgYnl0ZTMgPSAodmFsdWUgJiAweGZmMDAwMDAwKSA+PiAyNDsKLSAgICBtb3YocmQsIE9wZXJhbmQoNCwgYnl0ZTMpLCBjb25kKTsKLSAgICBvcnIocmQsIHJkLCBPcGVyYW5kKDgsIGJ5dGUyKSwgY29uZCk7Ci0gICAgb3JyKHJkLCByZCwgT3BlcmFuZCgxMiwgYnl0ZTEpLCBjb25kKTsKLSAgICBvcnIocmQsIHJkLCBPcGVyYW5kKGJ5dGUwKSwgY29uZCk7Ci0gIH0gZWxzZSB7Ci0gICAgQVNTRVJUKHZlcnNpb24gPT0gQVJNdjcpOwotICAgIGNvbnN0IHVpbnQxNl90IHZhbHVlX2xvdyA9IFV0aWxzOjpMb3cxNkJpdHModmFsdWUpOwotICAgIGNvbnN0IHVpbnQxNl90IHZhbHVlX2hpZ2ggPSBVdGlsczo6SGlnaDE2Qml0cyh2YWx1ZSk7Ci0gICAgbW92dyhyZCwgdmFsdWVfbG93LCBjb25kKTsKLSAgICBtb3Z0KHJkLCB2YWx1ZV9oaWdoLCBjb25kKTsKLSAgfQorICBjb25zdCB1aW50MTZfdCB2YWx1ZV9sb3cgPSBVdGlsczo6TG93MTZCaXRzKHZhbHVlKTsKKyAgY29uc3QgdWludDE2X3QgdmFsdWVfaGlnaCA9IFV0aWxzOjpIaWdoMTZCaXRzKHZhbHVlKTsKKyAgbW92dyhyZCwgdmFsdWVfbG93LCBjb25kKTsKKyAgbW92dChyZCwgdmFsdWVfaGlnaCwgY29uZCk7CiB9CiAKIHZvaWQgQXNzZW1ibGVyOjpMb2FkRGVjb2RhYmxlSW1tZWRpYXRlKFJlZ2lzdGVyIHJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiBjb25kKSB7Ci0gIGNvbnN0IEFSTVZlcnNpb24gdmVyc2lvbiA9IFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpOwotICBpZiAodmVyc2lvbiA9PSBBUk12NikgewotICAgIGlmIChjb25zdGFudF9wb29sX2FsbG93ZWQoKSkgewotICAgICAgY29uc3QgaW50MzJfdCBvZmZzZXQgPQotICAgICAgICAgIHRhcmdldDo6T2JqZWN0UG9vbDo6ZWxlbWVudF9vZmZzZXQoRmluZEltbWVkaWF0ZSh2YWx1ZSkpOwotICAgICAgTG9hZFdvcmRGcm9tUG9vbE9mZnNldChyZCwgb2Zmc2V0IC0ga0hlYXBPYmplY3RUYWcsIFBQLCBjb25kKTsKLSAgICB9IGVsc2UgewotICAgICAgTG9hZFBhdGNoYWJsZUltbWVkaWF0ZShyZCwgdmFsdWUsIGNvbmQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBBU1NFUlQodmVyc2lvbiA9PSBBUk12Nyk7Ci0gICAgbW92dyhyZCwgVXRpbHM6OkxvdzE2Qml0cyh2YWx1ZSksIGNvbmQpOwotICAgIGNvbnN0IHVpbnQxNl90IHZhbHVlX2hpZ2ggPSBVdGlsczo6SGlnaDE2Qml0cyh2YWx1ZSk7Ci0gICAgaWYgKHZhbHVlX2hpZ2ggIT0gMCkgewotICAgICAgbW92dChyZCwgdmFsdWVfaGlnaCwgY29uZCk7Ci0gICAgfQorICBtb3Z3KHJkLCBVdGlsczo6TG93MTZCaXRzKHZhbHVlKSwgY29uZCk7CisgIGNvbnN0IHVpbnQxNl90IHZhbHVlX2hpZ2ggPSBVdGlsczo6SGlnaDE2Qml0cyh2YWx1ZSk7CisgIGlmICh2YWx1ZV9oaWdoICE9IDApIHsKKyAgICBtb3Z0KHJkLCB2YWx1ZV9oaWdoLCBjb25kKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXJfYXJtLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXJfYXJtLmgKaW5kZXggNWQzNmU1MS4uOTcwN2UwNyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9hc3NlbWJsZXIvYXNzZW1ibGVyX2FybS5oCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYXNzZW1ibGVyL2Fzc2VtYmxlcl9hcm0uaApAQCAtMTI4Myw3ICsxMjgzLDYgQEAKICAgdm9pZCBtb3Z3KFJlZ2lzdGVyIHJkLCB1aW50MTZfdCBpbW0xNiwgQ29uZGl0aW9uIGNvbmQgPSBBTCk7CiAgIHZvaWQgbW92dChSZWdpc3RlciByZCwgdWludDE2X3QgaW1tMTYsIENvbmRpdGlvbiBjb25kID0gQUwpOwogCi0gIHZvaWQgQmluZEFSTXY2KExhYmVsKiBsYWJlbCk7CiAgIHZvaWQgQmluZEFSTXY3KExhYmVsKiBsYWJlbCk7CiAKICAgdm9pZCBCcmFuY2hMaW5rKGNvbnN0IEV4dGVybmFsTGFiZWwqIGxhYmVsKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYXNzZW1ibGVyL2Fzc2VtYmxlcl9hcm1fdGVzdC5jYyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYXNzZW1ibGVyL2Fzc2VtYmxlcl9hcm1fdGVzdC5jYwppbmRleCA3ZjVmODVkLi41NTg4OTVlIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9hc3NlbWJsZXJfYXJtX3Rlc3QuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9hc3NlbWJsZXIvYXNzZW1ibGVyX2FybV90ZXN0LmNjCkBAIC0xMDEsMTggKzEwMSw4IEBACiB9CiAKIEFTU0VNQkxFUl9URVNUX0dFTkVSQVRFKE1vdkltbTE2LCBhc3NlbWJsZXIpIHsKLSNpZiBkZWZpbmVkKFVTSU5HX1NJTVVMQVRPUikKLSAgLy8gQVJNdjcgaXMgdGhlIGRlZmF1bHQuCi0gIEhvc3RDUFVGZWF0dXJlczo6c2V0X2FybV92ZXJzaW9uKEFSTXY2KTsKLSAgX18gTG9hZFBhdGNoYWJsZUltbWVkaWF0ZShSMCwgMHgxMjM0NTY3OCA8PCAxKTsKLSAgSG9zdENQVUZlYXR1cmVzOjpzZXRfYXJtX3ZlcnNpb24oQVJNdjcpOwotICBfXyBMb2FkUGF0Y2hhYmxlSW1tZWRpYXRlKFIxLCAweDEyMzQ1Njc4KTsKLSAgX18gc3ViKFIwLCBSMCwgT3BlcmFuZChSMSkpOwotICBfXyBieChMUik7Ci0jZWxzZQogICBfXyBMb2FkUGF0Y2hhYmxlSW1tZWRpYXRlKFIwLCAweDEyMzQ1Njc4KTsKICAgX18gYngoTFIpOwotI2VuZGlmCiB9CiAKIEFTU0VNQkxFUl9URVNUX1JVTihNb3ZJbW0xNiwgdGVzdCkgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9hc3NlbWJsZXIvZGlzYXNzZW1ibGVyX2FybS5jYyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYXNzZW1ibGVyL2Rpc2Fzc2VtYmxlcl9hcm0uY2MKaW5kZXggZGI1MWQxZS4uMjE5NTA3MCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9hc3NlbWJsZXIvZGlzYXNzZW1ibGVyX2FybS5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2Fzc2VtYmxlci9kaXNhc3NlbWJsZXJfYXJtLmNjCkBAIC02OTMsMTAgKzY5Myw2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICBpZiAoVGFyZ2V0Q1BVRmVhdHVyZXM6OmFybV92ZXJzaW9uKCkgIT0gQVJNdjcpIHsKLSAgICAgICAgICAgICAgVW5rbm93bihpbnN0cik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEFzc2VtYmxlciByZWdpc3RlcnMgcmQsIHJuLCBybSwgcmEgYXJlIGVuY29kZWQgYXMgcm4sIHJtLCBycywgcmQuCiAgICAgICAgICAgICBGb3JtYXQoaW5zdHIsICJtbHMnY29uZCdzICdybiwgJ3JtLCAncnMsICdyZCIpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC03NDIsMTEgKzczOCw3IEBACiAgICAgICAvLyAxNi1iaXQgaW1tZWRpYXRlIGxvYWRzLCBtc3IgKGltbWVkaWF0ZSksIGFuZCBoaW50cwogICAgICAgc3dpdGNoIChpbnN0ci0+Qml0cygyMCwgNSkpIHsKICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgIGlmIChUYXJnZXRDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb24oKSA9PSBBUk12NykgewotICAgICAgICAgICAgRm9ybWF0KGluc3RyLCAibW92dydjb25kICdyZCwgIydpbW00XzEyIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFVua25vd24oaW5zdHIpOwotICAgICAgICAgIH0KKyAgICAgICAgICBGb3JtYXQoaW5zdHIsICJtb3Z3J2NvbmQgJ3JkLCAjJ2ltbTRfMTIiKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIDE4OiB7CkBAIC03NTgsMTEgKzc1MCw3IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSAyMDogewotICAgICAgICAgIGlmIChUYXJnZXRDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb24oKSA9PSBBUk12NykgewotICAgICAgICAgICAgRm9ybWF0KGluc3RyLCAibW92dCdjb25kICdyZCwgIydpbW00XzEyIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFVua25vd24oaW5zdHIpOwotICAgICAgICAgIH0KKyAgICAgICAgICBGb3JtYXQoaW5zdHIsICJtb3Z0J2NvbmQgJ3JkLCAjJ2ltbTRfMTIiKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OiB7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvZmxvd19ncmFwaF9jb21waWxlci5jYyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9mbG93X2dyYXBoX2NvbXBpbGVyLmNjCmluZGV4IGY2N2Y5MjQuLjNiNGFjOTE3IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvZmxvd19ncmFwaF9jb21waWxlci5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvZmxvd19ncmFwaF9jb21waWxlci5jYwpAQCAtMjU3Niw2ICsyNTc2LDY0IEBACiAgIH0KIH0KIAorY29uc3QgY2hhciogTnVsbEVycm9yU2xvd1BhdGg6Om5hbWUoKSB7CisgIHN3aXRjaCAoZXhjZXB0aW9uX3R5cGUoKSkgeworICAgIGNhc2UgQ2hlY2tOdWxsSW5zdHI6OmtOb1N1Y2hNZXRob2Q6CisgICAgICByZXR1cm4gImNoZWNrIG51bGwgKG5zbSkiOworICAgIGNhc2UgQ2hlY2tOdWxsSW5zdHI6OmtBcmd1bWVudEVycm9yOgorICAgICAgcmV0dXJuICJjaGVjayBudWxsIChhcmcpIjsKKyAgICBjYXNlIENoZWNrTnVsbEluc3RyOjprQ2FzdEVycm9yOgorICAgICAgcmV0dXJuICJjaGVjayBudWxsIChjYXN0KSI7CisgIH0KKyAgVU5SRUFDSEFCTEUoKTsKK30KKworY29uc3QgUnVudGltZUVudHJ5JiBOdWxsRXJyb3JTbG93UGF0aDo6R2V0UnVudGltZUVudHJ5KAorICAgIENoZWNrTnVsbEluc3RyOjpFeGNlcHRpb25UeXBlIGV4Y2VwdGlvbl90eXBlKSB7CisgIHN3aXRjaCAoZXhjZXB0aW9uX3R5cGUpIHsKKyAgICBjYXNlIENoZWNrTnVsbEluc3RyOjprTm9TdWNoTWV0aG9kOgorICAgICAgcmV0dXJuIGtOdWxsRXJyb3JSdW50aW1lRW50cnk7CisgICAgY2FzZSBDaGVja051bGxJbnN0cjo6a0FyZ3VtZW50RXJyb3I6CisgICAgICByZXR1cm4ga0FyZ3VtZW50TnVsbEVycm9yUnVudGltZUVudHJ5OworICAgIGNhc2UgQ2hlY2tOdWxsSW5zdHI6OmtDYXN0RXJyb3I6CisgICAgICByZXR1cm4ga051bGxDYXN0RXJyb3JSdW50aW1lRW50cnk7CisgIH0KKyAgVU5SRUFDSEFCTEUoKTsKK30KKworQ29kZVB0ciBOdWxsRXJyb3JTbG93UGF0aDo6R2V0U3R1YihGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrTnVsbEluc3RyOjpFeGNlcHRpb25UeXBlIGV4Y2VwdGlvbl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNhdmVfZnB1X3JlZ2lzdGVycykgeworICBhdXRvIG9iamVjdF9zdG9yZSA9IGNvbXBpbGVyLT5pc29sYXRlKCktPm9iamVjdF9zdG9yZSgpOworICBzd2l0Y2ggKGV4Y2VwdGlvbl90eXBlKSB7CisgICAgY2FzZSBDaGVja051bGxJbnN0cjo6a05vU3VjaE1ldGhvZDoKKyAgICAgIHJldHVybiBzYXZlX2ZwdV9yZWdpc3RlcnMKKyAgICAgICAgICAgICAgICAgPyBvYmplY3Rfc3RvcmUtPm51bGxfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIoKQorICAgICAgICAgICAgICAgICA6IG9iamVjdF9zdG9yZS0+bnVsbF9lcnJvcl9zdHViX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1YigpOworICAgIGNhc2UgQ2hlY2tOdWxsSW5zdHI6OmtBcmd1bWVudEVycm9yOgorICAgICAgcmV0dXJuIHNhdmVfZnB1X3JlZ2lzdGVycworICAgICAgICAgICAgICAgICA/IG9iamVjdF9zdG9yZS0+bnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIoKQorICAgICAgICAgICAgICAgICA6IG9iamVjdF9zdG9yZS0+bnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIoKTsKKyAgICBjYXNlIENoZWNrTnVsbEluc3RyOjprQ2FzdEVycm9yOgorICAgICAgcmV0dXJuIHNhdmVfZnB1X3JlZ2lzdGVycworICAgICAgICAgICAgICAgICA/IG9iamVjdF9zdG9yZS0+bnVsbF9jYXN0X2Vycm9yX3N0dWJfd2l0aF9mcHVfcmVnc19zdHViKCkKKyAgICAgICAgICAgICAgICAgOiBvYmplY3Rfc3RvcmUtPm51bGxfY2FzdF9lcnJvcl9zdHViX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1YigpOworICB9CisgIFVOUkVBQ0hBQkxFKCk7Cit9CisKK3ZvaWQgTnVsbEVycm9yU2xvd1BhdGg6OkVtaXRTaGFyZWRTdHViQ2FsbChGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYXZlX2ZwdV9yZWdpc3RlcnMpIHsKKyNpZiBkZWZpbmVkKFRBUkdFVF9BUkNIX0lBMzIpCisgIFVOUkVBQ0hBQkxFKCk7CisjZWxzZQorICBjb25zdCBhdXRvJiBzdHViID0KKyAgICAgIENvZGU6OlpvbmVIYW5kbGUoY29tcGlsZXItPnpvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0U3R1Yihjb21waWxlciwgZXhjZXB0aW9uX3R5cGUoKSwgc2F2ZV9mcHVfcmVnaXN0ZXJzKSk7CisgIGNvbXBpbGVyLT5FbWl0Q2FsbFRvU3R1YihzdHViKTsKKyNlbmRpZgorfQorCiB2b2lkIEZsb3dHcmFwaENvbXBpbGVyOjpFbWl0TmF0aXZlTW92ZSgKICAgICBjb25zdCBjb21waWxlcjo6ZmZpOjpOYXRpdmVMb2NhdGlvbiYgZGVzdGluYXRpb24sCiAgICAgY29uc3QgY29tcGlsZXI6OmZmaTo6TmF0aXZlTG9jYXRpb24mIHNvdXJjZSwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9mbG93X2dyYXBoX2NvbXBpbGVyLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvZmxvd19ncmFwaF9jb21waWxlci5oCmluZGV4IGJhMDY0YjcuLjI3MDY2NDggMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9mbG93X2dyYXBoX2NvbXBpbGVyLmgKKysrIGIvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2Zsb3dfZ3JhcGhfY29tcGlsZXIuaApAQCAtMzE2LDExICszMTYsMTUgQEAKIAogICBOdWxsRXJyb3JTbG93UGF0aChDaGVja051bGxJbnN0ciogaW5zdHJ1Y3Rpb24sIGludHB0cl90IHRyeV9pbmRleCkKICAgICAgIDogVGhyb3dFcnJvclNsb3dQYXRoQ29kZShpbnN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVsbEVycm9yUnVudGltZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJ1bnRpbWVFbnRyeShpbnN0cnVjdGlvbi0+ZXhjZXB0aW9uX3R5cGUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga051bWJlck9mQXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9pbmRleCkge30KIAotICBjb25zdCBjaGFyKiBuYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gImNoZWNrIG51bGwgKG5zbSkiOyB9CisgIENoZWNrTnVsbEluc3RyOjpFeGNlcHRpb25UeXBlIGV4Y2VwdGlvbl90eXBlKCkgY29uc3QgeworICAgIHJldHVybiBpbnN0cnVjdGlvbigpLT5Bc0NoZWNrTnVsbCgpLT5leGNlcHRpb25fdHlwZSgpOworICB9CisKKyAgY29uc3QgY2hhciogbmFtZSgpIG92ZXJyaWRlOwogCiAgIHZvaWQgRW1pdFNoYXJlZFN0dWJDYWxsKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYXZlX2ZwdV9yZWdpc3RlcnMpIG92ZXJyaWRlOwpAQCAtMzI5LDI3ICszMzMsMTQgQEAKICAgICBDaGVja051bGxJbnN0cjo6QWRkTWV0YWRhdGFGb3JSdW50aW1lQ2FsbChpbnN0cnVjdGlvbigpLT5Bc0NoZWNrTnVsbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyKTsKICAgfQotfTsKIAotY2xhc3MgTnVsbEFyZ0Vycm9yU2xvd1BhdGggOiBwdWJsaWMgVGhyb3dFcnJvclNsb3dQYXRoQ29kZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29uc3QgaW50cHRyX3Qga051bWJlck9mQXJndW1lbnRzID0gMDsKKyAgc3RhdGljIENvZGVQdHIgR2V0U3R1YihGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tOdWxsSW5zdHI6OkV4Y2VwdGlvblR5cGUgZXhjZXB0aW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYXZlX2ZwdV9yZWdpc3RlcnMpOwogCi0gIE51bGxBcmdFcnJvclNsb3dQYXRoKENoZWNrTnVsbEluc3RyKiBpbnN0cnVjdGlvbiwgaW50cHRyX3QgdHJ5X2luZGV4KQotICAgICAgOiBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKGluc3RydWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBcmd1bWVudE51bGxFcnJvclJ1bnRpbWVFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTnVtYmVyT2ZBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5X2luZGV4KSB7fQotCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBvdmVycmlkZSB7IHJldHVybiAiY2hlY2sgbnVsbCAoYXJnKSI7IH0KLQotICB2b2lkIEVtaXRTaGFyZWRTdHViQ2FsbChGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2F2ZV9mcHVfcmVnaXN0ZXJzKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZE1ldGFkYXRhRm9yUnVudGltZUNhbGwoRmxvd0dyYXBoQ29tcGlsZXIqIGNvbXBpbGVyKSBvdmVycmlkZSB7Ci0gICAgQ2hlY2tOdWxsSW5zdHI6OkFkZE1ldGFkYXRhRm9yUnVudGltZUNhbGwoaW5zdHJ1Y3Rpb24oKS0+QXNDaGVja051bGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcik7Ci0gIH0KKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgUnVudGltZUVudHJ5JiBHZXRSdW50aW1lRW50cnkoCisgICAgICBDaGVja051bGxJbnN0cjo6RXhjZXB0aW9uVHlwZSBleGNlcHRpb25fdHlwZSk7CiB9OwogCiBjbGFzcyBSYW5nZUVycm9yU2xvd1BhdGggOiBwdWJsaWMgVGhyb3dFcnJvclNsb3dQYXRoQ29kZSB7CkBAIC05NjAsNyArOTUxLDYgQEAKICAgZnJpZW5kIGNsYXNzIEJveEludDY0SW5zdHI7ICAgICAgICAgICAgLy8gRm9yIEFkZFBjUmVsYXRpdmVDYWxsU3R1YlRhcmdldCgpLgogICBmcmllbmQgY2xhc3MgQ2hlY2tOdWxsSW5zdHI7ICAgICAgICAgICAvLyBGb3IgQWRkUGNSZWxhdGl2ZUNhbGxTdHViVGFyZ2V0KCkuCiAgIGZyaWVuZCBjbGFzcyBOdWxsRXJyb3JTbG93UGF0aDsgICAgICAgIC8vIEZvciBBZGRQY1JlbGF0aXZlQ2FsbFN0dWJUYXJnZXQoKS4KLSAgZnJpZW5kIGNsYXNzIE51bGxBcmdFcnJvclNsb3dQYXRoOyAgICAgLy8gRm9yIEFkZFBjUmVsYXRpdmVDYWxsU3R1YlRhcmdldCgpLgogICBmcmllbmQgY2xhc3MgQ2hlY2tTdGFja092ZXJmbG93SW5zdHI7ICAvLyBGb3IgQWRkUGNSZWxhdGl2ZUNhbGxTdHViVGFyZ2V0KCkuCiAgIGZyaWVuZCBjbGFzcyBTdG9yZUluZGV4ZWRJbnN0cjsgICAgICAgIC8vIEZvciBBZGRQY1JlbGF0aXZlQ2FsbFN0dWJUYXJnZXQoKS4KICAgZnJpZW5kIGNsYXNzIFN0b3JlSW5zdGFuY2VGaWVsZEluc3RyOyAgLy8gRm9yIEFkZFBjUmVsYXRpdmVDYWxsU3R1YlRhcmdldCgpLgpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsLmNjIGIvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsLmNjCmluZGV4IGE3NTY1Y2QuLjhlNDZhOGMgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbC5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWwuY2MKQEAgLTUxOTUsMzYgKzUxOTUsNiBAQAogICBjb21waWxlci0+QWRkTnVsbENoZWNrKGNoZWNrX251bGwtPnRva2VuX3BvcygpLCBjaGVja19udWxsLT5mdW5jdGlvbl9uYW1lKCkpOwogfQogCi12b2lkIE51bGxFcnJvclNsb3dQYXRoOjpFbWl0U2hhcmVkU3R1YkNhbGwoRmxvd0dyYXBoQ29tcGlsZXIqIGNvbXBpbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2F2ZV9mcHVfcmVnaXN0ZXJzKSB7Ci0jaWYgZGVmaW5lZChUQVJHRVRfQVJDSF9JQTMyKQotICBVTlJFQUNIQUJMRSgpOwotI2Vsc2UKLSAgYXV0byBvYmplY3Rfc3RvcmUgPSBjb21waWxlci0+aXNvbGF0ZSgpLT5vYmplY3Rfc3RvcmUoKTsKLSAgY29uc3QgYXV0byYgc3R1YiA9IENvZGU6OlpvbmVIYW5kbGUoCi0gICAgICBjb21waWxlci0+em9uZSgpLAotICAgICAgc2F2ZV9mcHVfcmVnaXN0ZXJzCi0gICAgICAgICAgPyBvYmplY3Rfc3RvcmUtPm51bGxfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIoKQotICAgICAgICAgIDogb2JqZWN0X3N0b3JlLT5udWxsX2Vycm9yX3N0dWJfd2l0aG91dF9mcHVfcmVnc19zdHViKCkpOwotICBjb21waWxlci0+RW1pdENhbGxUb1N0dWIoc3R1Yik7Ci0jZW5kaWYKLX0KLQotdm9pZCBOdWxsQXJnRXJyb3JTbG93UGF0aDo6RW1pdFNoYXJlZFN0dWJDYWxsKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNhdmVfZnB1X3JlZ2lzdGVycykgewotI2lmIGRlZmluZWQoVEFSR0VUX0FSQ0hfSUEzMikKLSAgVU5SRUFDSEFCTEUoKTsKLSNlbHNlCi0gIGF1dG8gb2JqZWN0X3N0b3JlID0gY29tcGlsZXItPmlzb2xhdGUoKS0+b2JqZWN0X3N0b3JlKCk7Ci0gIGNvbnN0IGF1dG8mIHN0dWIgPSBDb2RlOjpab25lSGFuZGxlKAotICAgICAgY29tcGlsZXItPnpvbmUoKSwKLSAgICAgIHNhdmVfZnB1X3JlZ2lzdGVycwotICAgICAgICAgID8gb2JqZWN0X3N0b3JlLT5udWxsX2FyZ19lcnJvcl9zdHViX3dpdGhfZnB1X3JlZ3Nfc3R1YigpCi0gICAgICAgICAgOiBvYmplY3Rfc3RvcmUtPm51bGxfYXJnX2Vycm9yX3N0dWJfd2l0aG91dF9mcHVfcmVnc19zdHViKCkpOwotICBjb21waWxlci0+RW1pdENhbGxUb1N0dWIoc3R1Yik7Ci0jZW5kaWYKLX0KLQogdm9pZCBSYW5nZUVycm9yU2xvd1BhdGg6OkVtaXRTaGFyZWRTdHViQ2FsbChGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2F2ZV9mcHVfcmVnaXN0ZXJzKSB7CiAjaWYgZGVmaW5lZChUQVJHRVRfQVJDSF9JQTMyKQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWwuaAppbmRleCAxZDI4ZjMxLi5mMjZhNmVlIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWwuaAorKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWwuaApAQCAtODUzOCw2ICs4NTM4LDcgQEAKICAgZW51bSBFeGNlcHRpb25UeXBlIHsKICAgICBrTm9TdWNoTWV0aG9kLAogICAgIGtBcmd1bWVudEVycm9yLAorICAgIGtDYXN0RXJyb3IsCiAgIH07CiAKICAgQ2hlY2tOdWxsSW5zdHIoVmFsdWUqIHZhbHVlLApAQCAtODU1Niw3ICs4NTU3LDYgQEAKICAgVmFsdWUqIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW5wdXRzX1swXTsgfQogICB2aXJ0dWFsIFRva2VuUG9zaXRpb24gdG9rZW5fcG9zKCkgY29uc3QgeyByZXR1cm4gdG9rZW5fcG9zXzsgfQogICBjb25zdCBTdHJpbmcmIGZ1bmN0aW9uX25hbWUoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbl9uYW1lXzsgfQotICBib29sIElzQXJndW1lbnRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIGV4Y2VwdGlvbl90eXBlXyA9PSBrQXJndW1lbnRFcnJvcjsgfQogICBFeGNlcHRpb25UeXBlIGV4Y2VwdGlvbl90eXBlKCkgY29uc3QgeyByZXR1cm4gZXhjZXB0aW9uX3R5cGVfOyB9CiAKICAgdmlydHVhbCBib29sIFVzZVNoYXJlZFNsb3dQYXRoU3R1Yihib29sIGlzX29wdGltaXppbmcpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbF9hcm0uY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfYXJtLmNjCmluZGV4IGRlNTkyNGYuLjZjM2Y5MTcgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbF9hcm0uY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsX2FybS5jYwpAQCAtMjY3Nyw3ICsyNjc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0KSBjb25zdCB7CiAgIGNvbnN0IGJvb2wgbWlnaHRfYm94ID0gKHJlcHJlc2VudGF0aW9uKCkgPT0ga1RhZ2dlZCkgJiYgIWNhbl9wYWNrX2ludG9fc21pKCk7CiAgIGNvbnN0IGludHB0cl90IGtOdW1JbnB1dHMgPSAyOwotICBjb25zdCBpbnRwdHJfdCBrTnVtVGVtcHMgPSBtaWdodF9ib3ggPyAxIDogMDsKKyAgY29uc3QgaW50cHRyX3Qga051bVRlbXBzID0gbWlnaHRfYm94ID8gMiA6IDA7CiAgIExvY2F0aW9uU3VtbWFyeSogc3VtbWFyeSA9IG5ldyAoem9uZSkgTG9jYXRpb25TdW1tYXJ5KAogICAgICAgem9uZSwga051bUlucHV0cywga051bVRlbXBzLAogICAgICAgbWlnaHRfYm94ID8gTG9jYXRpb25TdW1tYXJ5OjprQ2FsbE9uU2xvd1BhdGggOiBMb2NhdGlvblN1bW1hcnk6OmtOb0NhbGwpOwpAQCAtMjY4Niw2ICsyNjg2LDcgQEAKIAogICBpZiAobWlnaHRfYm94KSB7CiAgICAgc3VtbWFyeS0+c2V0X3RlbXAoMCwgTG9jYXRpb246OlJlcXVpcmVzUmVnaXN0ZXIoKSk7CisgICAgc3VtbWFyeS0+c2V0X3RlbXAoMSwgTG9jYXRpb246OlJlcXVpcmVzUmVnaXN0ZXIoKSk7CiAgIH0KIAogICBpZiAocmVwcmVzZW50YXRpb24oKSA9PSBrVW5ib3hlZEludDY0KSB7CkBAIC02NTU5LDE3ICs2NTYwLDEwIEBACiAgIC8vIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgaXQgb24gcmVnaXN0ZXIuCiAgIF9fIENvbXBhcmVPYmplY3QodmFsdWVfcmVnLCBPYmplY3Q6Om51bGxfb2JqZWN0KCkpOwogCi0gIGF1dG8gb2JqZWN0X3N0b3JlID0gY29tcGlsZXItPmlzb2xhdGUoKS0+b2JqZWN0X3N0b3JlKCk7CiAgIGNvbnN0IGJvb2wgbGl2ZV9mcHVfcmVncyA9IGxvY3MoKS0+bGl2ZV9yZWdpc3RlcnMoKS0+RnB1UmVnaXN0ZXJDb3VudCgpID4gMDsKLSAgY29uc3QgQ29kZSYgc3R1YiA9IENvZGU6OlpvbmVIYW5kbGUoCisgIENvZGUmIHN0dWIgPSBDb2RlOjpab25lSGFuZGxlKAogICAgICAgY29tcGlsZXItPnpvbmUoKSwKLSAgICAgIElzQXJndW1lbnRDaGVjaygpCi0gICAgICAgICAgPyAobGl2ZV9mcHVfcmVncwotICAgICAgICAgICAgICAgICA/IG9iamVjdF9zdG9yZS0+bnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIoKQotICAgICAgICAgICAgICAgICA6IG9iamVjdF9zdG9yZS0+bnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIoKSkKLSAgICAgICAgICA6IChsaXZlX2ZwdV9yZWdzCi0gICAgICAgICAgICAgICAgID8gb2JqZWN0X3N0b3JlLT5udWxsX2Vycm9yX3N0dWJfd2l0aF9mcHVfcmVnc19zdHViKCkKLSAgICAgICAgICAgICAgICAgOiBvYmplY3Rfc3RvcmUtPm51bGxfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIoKSkpOworICAgICAgTnVsbEVycm9yU2xvd1BhdGg6OkdldFN0dWIoY29tcGlsZXIsIGV4Y2VwdGlvbl90eXBlKCksIGxpdmVfZnB1X3JlZ3MpKTsKICAgY29uc3QgYm9vbCB1c2luZ19zaGFyZWRfc3R1YiA9IGxvY3MoKS0+Y2FsbF9vbl9zaGFyZWRfc2xvd19wYXRoKCk7CiAKICAgaWYgKEZMQUdfcHJlY29tcGlsZWRfbW9kZSAmJiBGTEFHX3VzZV9iYXJlX2luc3RydWN0aW9ucyAmJgpAQCAtNjU4OCwxMiArNjU4Miw4IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgVGhyb3dFcnJvclNsb3dQYXRoQ29kZSogc2xvd19wYXRoID0gbnVsbHB0cjsKLSAgaWYgKElzQXJndW1lbnRDaGVjaygpKSB7Ci0gICAgc2xvd19wYXRoID0gbmV3IE51bGxBcmdFcnJvclNsb3dQYXRoKHRoaXMsIGNvbXBpbGVyLT5DdXJyZW50VHJ5SW5kZXgoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc2xvd19wYXRoID0gbmV3IE51bGxFcnJvclNsb3dQYXRoKHRoaXMsIGNvbXBpbGVyLT5DdXJyZW50VHJ5SW5kZXgoKSk7Ci0gIH0KKyAgVGhyb3dFcnJvclNsb3dQYXRoQ29kZSogc2xvd19wYXRoID0KKyAgICAgIG5ldyBOdWxsRXJyb3JTbG93UGF0aCh0aGlzLCBjb21waWxlci0+Q3VycmVudFRyeUluZGV4KCkpOwogICBjb21waWxlci0+QWRkU2xvd1BhdGhDb2RlKHNsb3dfcGF0aCk7CiAKICAgX18gQnJhbmNoSWYoRVFVQUwsIHNsb3dfcGF0aC0+ZW50cnlfbGFiZWwoKSk7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfYXJtNjQuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfYXJtNjQuY2MKaW5kZXggMTU4ZWMyNi4uMjczYmJhMCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsX2FybTY0LmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbF9hcm02NC5jYwpAQCAtNTU1MiwxMiArNTU1Miw4IEBACiB9CiAKIHZvaWQgQ2hlY2tOdWxsSW5zdHI6OkVtaXROYXRpdmVDb2RlKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlcikgewotICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPSBudWxscHRyOwotICBpZiAoSXNBcmd1bWVudENoZWNrKCkpIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEFyZ0Vycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfSBlbHNlIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEVycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfQorICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPQorICAgICAgbmV3IE51bGxFcnJvclNsb3dQYXRoKHRoaXMsIGNvbXBpbGVyLT5DdXJyZW50VHJ5SW5kZXgoKSk7CiAgIGNvbXBpbGVyLT5BZGRTbG93UGF0aENvZGUoc2xvd19wYXRoKTsKIAogICBSZWdpc3RlciB2YWx1ZV9yZWcgPSBsb2NzKCktPmluKDApLnJlZygpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsX2lhMzIuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfaWEzMi5jYwppbmRleCAyMzk4MjRmLi4yMTllYzQ1IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfaWEzMi5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfaWEzMi5jYwpAQCAtNTUwNiwxMiArNTUwNiw4IEBACiB9CiAKIHZvaWQgQ2hlY2tOdWxsSW5zdHI6OkVtaXROYXRpdmVDb2RlKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlcikgewotICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPSBudWxscHRyOwotICBpZiAoSXNBcmd1bWVudENoZWNrKCkpIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEFyZ0Vycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfSBlbHNlIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEVycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfQorICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPQorICAgICAgbmV3IE51bGxFcnJvclNsb3dQYXRoKHRoaXMsIGNvbXBpbGVyLT5DdXJyZW50VHJ5SW5kZXgoKSk7CiAgIGNvbXBpbGVyLT5BZGRTbG93UGF0aENvZGUoc2xvd19wYXRoKTsKIAogICBSZWdpc3RlciB2YWx1ZV9yZWcgPSBsb2NzKCktPmluKDApLnJlZygpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsX3ByaW50ZXIuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfcHJpbnRlci5jYwppbmRleCBjYjlkMmM3Li5hMTI4OWE5IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfcHJpbnRlci5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfcHJpbnRlci5jYwpAQCAtMzA3LDcgKzMwNywxNyBAQAogCiB2b2lkIENoZWNrTnVsbEluc3RyOjpQcmludE9wZXJhbmRzVG8oQnVmZmVyRm9ybWF0dGVyKiBmKSBjb25zdCB7CiAgIERlZmluaXRpb246OlByaW50T3BlcmFuZHNUbyhmKTsKLSAgZi0+UHJpbnQoSXNBcmd1bWVudENoZWNrKCkgPyAiLCBBcmd1bWVudEVycm9yIiA6ICIsIE5vU3VjaE1ldGhvZEVycm9yIik7CisgIHN3aXRjaCAoZXhjZXB0aW9uX3R5cGUoKSkgeworICAgIGNhc2Uga05vU3VjaE1ldGhvZDoKKyAgICAgIGYtPlByaW50KCIsIE5vU3VjaE1ldGhvZEVycm9yIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtBcmd1bWVudEVycm9yOgorICAgICAgZi0+UHJpbnQoIiwgQXJndW1lbnRFcnJvciIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ2FzdEVycm9yOgorICAgICAgZi0+UHJpbnQoIiwgQ2FzdEVycm9yIik7CisgICAgICBicmVhazsKKyAgfQogfQogCiB2b2lkIERlZmluaXRpb246OlByaW50T3BlcmFuZHNUbyhCdWZmZXJGb3JtYXR0ZXIqIGYpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbF94NjQuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2JhY2tlbmQvaWxfeDY0LmNjCmluZGV4IDg4OTE1YWUuLmQwMWYzNGYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvYmFja2VuZC9pbF94NjQuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9iYWNrZW5kL2lsX3g2NC5jYwpAQCAtNTc3MSwxMiArNTc3MSw4IEBACiB9CiAKIHZvaWQgQ2hlY2tOdWxsSW5zdHI6OkVtaXROYXRpdmVDb2RlKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlcikgewotICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPSBudWxscHRyOwotICBpZiAoSXNBcmd1bWVudENoZWNrKCkpIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEFyZ0Vycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfSBlbHNlIHsKLSAgICBzbG93X3BhdGggPSBuZXcgTnVsbEVycm9yU2xvd1BhdGgodGhpcywgY29tcGlsZXItPkN1cnJlbnRUcnlJbmRleCgpKTsKLSAgfQorICBUaHJvd0Vycm9yU2xvd1BhdGhDb2RlKiBzbG93X3BhdGggPQorICAgICAgbmV3IE51bGxFcnJvclNsb3dQYXRoKHRoaXMsIGNvbXBpbGVyLT5DdXJyZW50VHJ5SW5kZXgoKSk7CiAgIGNvbXBpbGVyLT5BZGRTbG93UGF0aENvZGUoc2xvd19wYXRoKTsKIAogICBSZWdpc3RlciB2YWx1ZV9yZWcgPSBsb2NzKCktPmluKDApLnJlZygpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9jb21waWxlcl9zb3VyY2VzLmduaSBiL3J1bnRpbWUvdm0vY29tcGlsZXIvY29tcGlsZXJfc291cmNlcy5nbmkKaW5kZXggOTQ0NWRmYi4uM2M3MjEyNSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9jb21waWxlcl9zb3VyY2VzLmduaQorKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2NvbXBpbGVyX3NvdXJjZXMuZ25pCkBAIC0xMSw2ICsxMSw4IEBACiAgICJhb3QvZGlzcGF0Y2hfdGFibGVfZ2VuZXJhdG9yLmgiLAogICAiYW90L3ByZWNvbXBpbGVyLmNjIiwKICAgImFvdC9wcmVjb21waWxlci5oIiwKKyAgImFvdC9wcmVjb21waWxlcl90cmFjZXIuY2MiLAorICAiYW90L3ByZWNvbXBpbGVyX3RyYWNlci5oIiwKICAgImFzbV9pbnRyaW5zaWZpZXIuY2MiLAogICAiYXNtX2ludHJpbnNpZmllci5oIiwKICAgImFzbV9pbnRyaW5zaWZpZXJfYXJtLmNjIiwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvZmZpL21hcnNoYWxsZXIuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2ZmaS9tYXJzaGFsbGVyLmNjCmluZGV4IDIxZWZmMmMuLjA5ZGQ1NmQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvZmZpL21hcnNoYWxsZXIuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9mZmkvbWFyc2hhbGxlci5jYwpAQCAtMTgsMTUgKzE4LDcgQEAKIG5hbWVzcGFjZSBmZmkgewogCiBib29sIEJhc2VNYXJzaGFsbGVyOjpDb250YWluc0hhbmRsZXMoKSBjb25zdCB7Ci0gIGlmIChJc0hhbmRsZShrUmVzdWx0SW5kZXgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZm9yIChpbnRwdHJfdCBpID0gMDsgaSA8IG51bV9hcmdzKCk7IGkrKykgewotICAgIGlmIChJc0hhbmRsZShpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIGRhcnRfc2lnbmF0dXJlXy5GZmlDU2lnbmF0dXJlQ29udGFpbnNIYW5kbGVzKCk7CiB9CiAKIExvY2F0aW9uIENhbGxNYXJzaGFsbGVyOjpMb2NJbkZmaUNhbGwoaW50cHRyX3QgYXJnX2luZGV4KSBjb25zdCB7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2ZmaS9uYXRpdmVfY2FsbGluZ19jb252ZW50aW9uLmNjIGIvcnVudGltZS92bS9jb21waWxlci9mZmkvbmF0aXZlX2NhbGxpbmdfY29udmVudGlvbi5jYwppbmRleCBkNzUzYWJiLi40N2Y2YWRjIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2ZmaS9uYXRpdmVfY2FsbGluZ19jb252ZW50aW9uLmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvZmZpL25hdGl2ZV9jYWxsaW5nX2NvbnZlbnRpb24uY2MKQEAgLTIwOSw3ICsyMDksNiBAQAogICAvLyA+IFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkIGlzIHVzZWQuIEluIHRoaXMgdmFyaWFudCwgZmxvYXRpbmctcG9pbnQKICAgLy8gPiAoYW5kIHZlY3RvcikgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycwogICAvLyA+IChHUFJzKSBpbnN0ZWFkIG9mIGluIFZGUCByZWdpc3RlcnMpCi0gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2FyY2hpdmUvZG9jdW1lbnRhdGlvbi9YY29kZS9Db25jZXB0dWFsL2lQaG9uZU9TQUJJUmVmZXJlbmNlL0FydGljbGVzL0FSTXY2RnVuY3Rpb25DYWxsaW5nQ29udmVudGlvbnMuaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL1RQNDAwMDkwMjEtU1cxCiAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2FyY2hpdmUvZG9jdW1lbnRhdGlvbi9YY29kZS9Db25jZXB0dWFsL2lQaG9uZU9TQUJJUmVmZXJlbmNlL0FydGljbGVzL0FSTXY3RnVuY3Rpb25DYWxsaW5nQ29udmVudGlvbnMuaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL1RQNDAwMDkwMjItU1cxCiAgIHZvaWQgQmxvY2tBbGxGcHVSZWdpc3RlcnMoKSB7CiAgICAgLy8gU2V0IGFsbCBiaXRzIHRvIDEuCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2Jhc2VfZmxvd19ncmFwaF9idWlsZGVyLmNjIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9iYXNlX2Zsb3dfZ3JhcGhfYnVpbGRlci5jYwppbmRleCAyNjJkNTk1Li5mNGE1ZWM3IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2Jhc2VfZmxvd19ncmFwaF9idWlsZGVyLmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQvYmFzZV9mbG93X2dyYXBoX2J1aWxkZXIuY2MKQEAgLTEwMTEsOCArMTAxMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNsZWFyX3RoZV90ZW1wIC8qID0gdHJ1ZSAqLykgewogICBGcmFnbWVudCBpbnN0cnVjdGlvbnMgPSBMb2FkTG9jYWwocmVjZWl2ZXIpOwogCi0gIENoZWNrTnVsbEluc3RyKiBjaGVja19udWxsID0KLSAgICAgIG5ldyAoWikgQ2hlY2tOdWxsSW5zdHIoUG9wKCksIGZ1bmN0aW9uX25hbWUsIEdldE5leHREZW9wdElkKCksIHBvc2l0aW9uKTsKKyAgQ2hlY2tOdWxsSW5zdHIqIGNoZWNrX251bGwgPSBuZXcgKFopCisgICAgICBDaGVja051bGxJbnN0cihQb3AoKSwgZnVuY3Rpb25fbmFtZSwgR2V0TmV4dERlb3B0SWQoKSwgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLklzTnVsbCgpID8gQ2hlY2tOdWxsSW5zdHI6OmtDYXN0RXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDaGVja051bGxJbnN0cjo6a05vU3VjaE1ldGhvZCk7CiAKICAgLy8gRG9lcyBub3QgdXNlIHRoZSByZWRlZmluaXRpb24sIG5vIGBQdXNoKGNoZWNrX251bGwpYC4KICAgaW5zdHJ1Y3Rpb25zIDw8PSBjaGVja19udWxsOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9ieXRlY29kZV9yZWFkZXIuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2J5dGVjb2RlX3JlYWRlci5jYwppbmRleCA1MjExMjA4Li5iYTFmMzZjIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2J5dGVjb2RlX3JlYWRlci5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2J5dGVjb2RlX3JlYWRlci5jYwpAQCAtOTExLDE0ICs5MTEsMTIgQEAKICAgICAgIGNhc2UgQ29uc3RhbnRQb29sVGFnOjprRHluYW1pY0NhbGw6IHsKICAgICAgICAgbmFtZSBePSBSZWFkT2JqZWN0KCk7CiAgICAgICAgIEFTU0VSVChuYW1lLklzU3ltYm9sKCkpOwotICAgICAgICAvLyBEbyBub3QgbWFuZ2xlID09IG9yIGNhbGw6CisgICAgICAgIC8vIERvIG5vdCBtYW5nbGUgPT06CiAgICAgICAgIC8vICAgKiBvcGVyYXRvciA9PSB0YWtlcyBhbiBPYmplY3Qgc28gaXQgaXMgZWl0aGVyIG5vdCBjaGVja2VkIG9yCiAgICAgICAgIC8vICAgICBjaGVja2VkIGF0IHRoZSBlbnRyeSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgaXMgbWFya2VkIGNvdmFyaWFudCwKLSAgICAgICAgLy8gICAgIG5laXRoZXIgb2YgdGhvc2UgY2FzZXMgcmVxdWlyZSBhIGR5bmFtaWMgaW52b2NhdGlvbiBmb3J3YXJkZXI7Ci0gICAgICAgIC8vICAgKiB3ZSBhc3N1bWUgdGhhdCBhbGwgY2xvc3VyZXMgYXJlIGVudGVyZWQgaW4gYSBjaGVja2VkIHdheS4KKyAgICAgICAgLy8gICAgIG5laXRoZXIgb2YgdGhvc2UgY2FzZXMgcmVxdWlyZSBhIGR5bmFtaWMgaW52b2NhdGlvbiBmb3J3YXJkZXIKICAgICAgICAgaWYgKCFGaWVsZDo6SXNHZXR0ZXJOYW1lKG5hbWUpICYmCi0gICAgICAgICAgICAobmFtZS5yYXcoKSAhPSBTeW1ib2xzOjpFcXVhbE9wZXJhdG9yKCkucmF3KCkpICYmCi0gICAgICAgICAgICAobmFtZS5yYXcoKSAhPSBTeW1ib2xzOjpDYWxsKCkucmF3KCkpKSB7CisgICAgICAgICAgICAobmFtZS5yYXcoKSAhPSBTeW1ib2xzOjpFcXVhbE9wZXJhdG9yKCkucmF3KCkpKSB7CiAgICAgICAgICAgbmFtZSA9IEZ1bmN0aW9uOjpDcmVhdGVEeW5hbWljSW52b2NhdGlvbkZvcndhcmRlck5hbWUobmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gRHluYW1pY0NhbGwgY29uc3RhbnQgb2NjdXBpZXMgMiBlbnRyaWVzOiBzZWxlY3RvciBhbmQgYXJndW1lbnRzCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2tlcm5lbF9iaW5hcnlfZmxvd2dyYXBoLmNjIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9rZXJuZWxfYmluYXJ5X2Zsb3dncmFwaC5jYwppbmRleCBiNjgyMzNkLi5hN2NiYzA1IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2tlcm5lbF9iaW5hcnlfZmxvd2dyYXBoLmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQva2VybmVsX2JpbmFyeV9mbG93Z3JhcGguY2MKQEAgLTI5ODksMTQgKzI5ODksMTMgQEAKICAgfQogCiAgIGNvbnN0IFN0cmluZyogbWFuZ2xlZF9uYW1lID0gJm5hbWU7Ci0gIC8vIERvIG5vdCBtYW5nbGUgPT0gb3IgY2FsbDoKKyAgLy8gRG8gbm90IG1hbmdsZSA9PToKICAgLy8gICAqIG9wZXJhdG9yID09IHRha2VzIGFuIE9iamVjdCBzbyBpdHMgZWl0aGVyIG5vdCBjaGVja2VkIG9yIGNoZWNrZWQKICAgLy8gICAgIGF0IHRoZSBlbnRyeSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgaXMgbWFya2VkIGNvdmFyaWFudCwgbmVpdGhlciBvZgotICAvLyAgICAgdGhvc2UgY2FzZXMgcmVxdWlyZSBhIGR5bmFtaWMgaW52b2NhdGlvbiBmb3J3YXJkZXI7Ci0gIC8vICAgKiB3ZSBhc3N1bWUgdGhhdCBhbGwgY2xvc3VyZXMgYXJlIGVudGVyZWQgaW4gYSBjaGVja2VkIHdheS4KKyAgLy8gICAgIHRob3NlIGNhc2VzIHJlcXVpcmUgYSBkeW5hbWljIGludm9jYXRpb24gZm9yd2FyZGVyLgogICBjb25zdCBGdW5jdGlvbiogZGlyZWN0X2NhbGxfdGFyZ2V0ID0gJmRpcmVjdF9jYWxsLnRhcmdldF87Ci0gIGlmICgobmFtZS5yYXcoKSAhPSBTeW1ib2xzOjpFcXVhbE9wZXJhdG9yKCkucmF3KCkpICYmCi0gICAgICAobmFtZS5yYXcoKSAhPSBTeW1ib2xzOjpDYWxsKCkucmF3KCkpICYmIEguSXNSb290KGl0YXJnZXRfbmFtZSkpIHsKKyAgaWYgKEguSXNSb290KGl0YXJnZXRfbmFtZSkgJiYKKyAgICAgIChuYW1lLnJhdygpICE9IFN5bWJvbHM6OkVxdWFsT3BlcmF0b3IoKS5yYXcoKSkpIHsKICAgICBtYW5nbGVkX25hbWUgPSAmU3RyaW5nOjpab25lSGFuZGxlKAogICAgICAgICBaLCBGdW5jdGlvbjo6Q3JlYXRlRHluYW1pY0ludm9jYXRpb25Gb3J3YXJkZXJOYW1lKG5hbWUpKTsKICAgICBpZiAoIWRpcmVjdF9jYWxsX3RhcmdldC0+SXNOdWxsKCkpIHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQva2VybmVsX3RvX2lsLmNjIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9rZXJuZWxfdG9faWwuY2MKaW5kZXggMTY3NmI5MS4uNGVjYzg3MyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9rZXJuZWxfdG9faWwuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9rZXJuZWxfdG9faWwuY2MKQEAgLTE5MzMsNyArMTkzMywxNSBAQAogICAvLyBGaW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB3ZSBzaG91bGQgZGlzcGF0Y2ggdG8uCiAgIGNvbnN0IENsYXNzJiBvd25lciA9IENsYXNzOjpIYW5kbGUoWiwgZnVuY3Rpb24uT3duZXIoKSk7CiAgIEFTU0VSVCghb3duZXIuSXNOdWxsKCkpOwotICBjb25zdCBTdHJpbmcmIGZpZWxkX25hbWUgPSBTdHJpbmc6OkhhbmRsZShaLCBmdW5jdGlvbi5uYW1lKCkpOworICBhdXRvJiBmaWVsZF9uYW1lID0gU3RyaW5nOjpIYW5kbGUoWiwgZnVuY3Rpb24ubmFtZSgpKTsKKyAgLy8gSWYgdGhlIGZpZWxkIG5hbWUgaGFzIGEgZHluOiB0YWcsIHRoZW4gcmVtb3ZlIGl0LiBXZSBkb24ndCBhZGQgZHluYW1pYworICAvLyBpbnZvY2F0aW9uIGZvcndhcmRlcnMgZm9yIGZpZWxkIGdldHRlcnMgdXNlZCBmb3IgaW52b2tpbmcsIHdlIGp1c3QgdXNlCisgIC8vIHRoZSB0YWcgaW4gdGhlIG5hbWUgb2YgdGhlIGludm9rZSBmaWVsZCBkaXNwYXRjaGVyIHRvIGRldGVjdCBkeW5hbWljIGNhbGxzLgorICBjb25zdCBib29sIGlzX2R5bmFtaWNfY2FsbCA9CisgICAgICBGdW5jdGlvbjo6SXNEeW5hbWljSW52b2NhdGlvbkZvcndhcmRlck5hbWUoZmllbGRfbmFtZSk7CisgIGlmIChpc19keW5hbWljX2NhbGwpIHsKKyAgICBmaWVsZF9uYW1lID0gRnVuY3Rpb246OkRlbWFuZ2xlRHluYW1pY0ludm9jYXRpb25Gb3J3YXJkZXJOYW1lKGZpZWxkX25hbWUpOworICB9CiAgIGNvbnN0IFN0cmluZyYgZ2V0dGVyX25hbWUgPSBTdHJpbmc6OlpvbmVIYW5kbGUoCiAgICAgICBaLCBTeW1ib2xzOjpOZXcodGhyZWFkXywKICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc6OkhhbmRsZShaLCBGaWVsZDo6R2V0dGVyU3ltYm9sKGZpZWxkX25hbWUpKSkpOwpAQCAtMTk5MCw2ICsxOTk4LDEzIEBACiAKICAgICAvLyBUaGUgY2xvc3VyZSBpdHNlbGYgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAgIGJvZHkgKz0gTG9hZExvY2FsKGNsb3N1cmUpOworCisgICAgaWYgKGlzX2R5bmFtaWNfY2FsbCkgeworICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS80MDgxMyk6IE1vdmUgY2hlY2tzIHRoYXQgYXJlIGN1cnJlbnRseSBjb21waWxlZAorICAgICAgLy8gaW4gdGhlIGNsb3N1cmUgYm9keSB0byBoZXJlLCB1c2luZyB0aGUgZHluYW1pYyB2ZXJzaW9ucyBvZgorICAgICAgLy8gQXNzZXJ0U3VidHlwZSB0byB0eXBlY2hlY2sgdGhlIHR5cGUgYXJndW1lbnRzIHVzaW5nIHRoZSBydW50aW1lIHR5cGVzCisgICAgICAvLyBhdmFpbGFibGUgaW4gdGhlIGNsb3N1cmUgb2JqZWN0LgorICAgIH0KICAgfSBlbHNlIHsKICAgICAvLyBJbnZva2UgdGhlIGdldHRlciB0byBnZXQgdGhlIGZpZWxkIHZhbHVlLgogICAgIGJvZHkgKz0gTG9hZExvY2FsKHBhcnNlZF9mdW5jdGlvbl8tPlBhcmFtZXRlclZhcmlhYmxlKDApKTsKQEAgLTIwMDMsNiArMjAxOCwxMiBAQAogICBpbnRwdHJfdCBwb3MgPSAxOwogICBmb3IgKDsgcG9zIDwgZGVzY3JpcHRvci5Db3VudCgpOyBwb3MrKykgewogICAgIGJvZHkgKz0gTG9hZExvY2FsKHBhcnNlZF9mdW5jdGlvbl8tPlBhcmFtZXRlclZhcmlhYmxlKHBvcykpOworICAgIGlmIChpc19jbG9zdXJlX2NhbGwgJiYgaXNfZHluYW1pY19jYWxsKSB7CisgICAgICAvLyBUT0RPKGRhcnRidWcuY29tLzQwODEzKTogTW92ZSBjaGVja3MgdGhhdCBhcmUgY3VycmVudGx5IGNvbXBpbGVkCisgICAgICAvLyBpbiB0aGUgY2xvc3VyZSBib2R5IHRvIGhlcmUsIHVzaW5nIHRoZSBkeW5hbWljIHZlcnNpb25zIG9mCisgICAgICAvLyBBc3NlcnRBc3NpZ25hYmxlIHRvIHR5cGVjaGVjayB0aGUgcGFyYW1ldGVycyB1c2luZyB0aGUgcnVudGltZSB0eXBlcworICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBjbG9zdXJlIG9iamVjdC4KKyAgICB9CiAgIH0KIAogICBpZiAoaXNfY2xvc3VyZV9jYWxsKSB7CkBAIC0yOTUzLDYgKzI5NzQsOCBAQAogCiAgIGNvbnN0IGF1dG8mIG1hcnNoYWxsZXIgPSAqbmV3IChaKSBjb21waWxlcjo6ZmZpOjpDYWxsTWFyc2hhbGxlcihaLCBmdW5jdGlvbik7CiAKKyAgY29uc3QgYm9vbCBzaWduYXR1cmVfY29udGFpbnNfaGFuZGxlcyA9IG1hcnNoYWxsZXIuQ29udGFpbnNIYW5kbGVzKCk7CisKICAgQnVpbGRBcmd1bWVudFR5cGVDaGVja3MoVHlwZUNoZWNrc1RvQnVpbGQ6OmtDaGVja0FsbFR5cGVQYXJhbWV0ZXJCb3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZmdW5jdGlvbl9ib2R5LCAmZnVuY3Rpb25fYm9keSwgJmZ1bmN0aW9uX2JvZHkpOwogCkBAIC0yOTc2LDE0ICsyOTk5LDE2IEBACiAgICAgZnVuY3Rpb25fYm9keSArPSBEcm9wKCk7CiAgIH0KIAotICAvLyBXcmFwIGluIFRyeSBjYXRjaCB0byB0cmFuc2l0aW9uIGZyb20gTmF0aXZlIHRvIEdlbmVyYXRlZCBvbiBhIHRocm93IGZyb20KLSAgLy8gdGhlIGRhcnRfYXBpLgotICBjb25zdCBpbnRwdHJfdCB0cnlfaGFuZGxlcl9pbmRleCA9IEFsbG9jYXRlVHJ5SW5kZXgoKTsKLSAgRnJhZ21lbnQgYm9keSA9IFRyeUNhdGNoKHRyeV9oYW5kbGVyX2luZGV4KTsKLSAgKyt0cnlfZGVwdGhfOwotCisgIEZyYWdtZW50IGJvZHk7CisgIGludHB0cl90IHRyeV9oYW5kbGVyX2luZGV4ID0gLTE7CiAgIExvY2FsVmFyaWFibGUqIGFwaV9sb2NhbF9zY29wZSA9IG51bGxwdHI7Ci0gIGlmIChtYXJzaGFsbGVyLkNvbnRhaW5zSGFuZGxlcygpKSB7CisgIGlmIChzaWduYXR1cmVfY29udGFpbnNfaGFuZGxlcykgeworICAgIC8vIFdyYXAgaW4gVHJ5IGNhdGNoIHRvIHRyYW5zaXRpb24gZnJvbSBOYXRpdmUgdG8gR2VuZXJhdGVkIG9uIGEgdGhyb3cgZnJvbQorICAgIC8vIHRoZSBkYXJ0X2FwaS4KKyAgICB0cnlfaGFuZGxlcl9pbmRleCA9IEFsbG9jYXRlVHJ5SW5kZXgoKTsKKyAgICBib2R5ICs9IFRyeUNhdGNoKHRyeV9oYW5kbGVyX2luZGV4KTsKKyAgICArK3RyeV9kZXB0aF87CisKICAgICBib2R5ICs9IEVudGVySGFuZGxlU2NvcGUoKTsKICAgICBhcGlfbG9jYWxfc2NvcGUgPSBNYWtlVGVtcG9yYXJ5KCk7CiAgIH0KQEAgLTMwMjAsMjkgKzMwNDUsMzQgQEAKIAogICBib2R5ICs9IEZmaUNvbnZlcnRBcmd1bWVudFRvRGFydChtYXJzaGFsbGVyLCBjb21waWxlcjo6ZmZpOjprUmVzdWx0SW5kZXgpOwogCi0gIGlmIChtYXJzaGFsbGVyLkNvbnRhaW5zSGFuZGxlcygpKSB7CisgIGlmIChzaWduYXR1cmVfY29udGFpbnNfaGFuZGxlcykgewogICAgIGJvZHkgKz0gRHJvcFRlbXBzUHJlc2VydmVUb3AoMSk7ICAvLyBEcm9wIGFwaV9sb2NhbF9zY29wZS4KICAgICBib2R5ICs9IEV4aXRIYW5kbGVTY29wZSgpOwogICB9CiAKICAgYm9keSArPSBSZXR1cm4oVG9rZW5Qb3NpdGlvbjo6a05vU291cmNlKTsKIAotICAtLXRyeV9kZXB0aF87CisgIGlmIChzaWduYXR1cmVfY29udGFpbnNfaGFuZGxlcykgeworICAgIC0tdHJ5X2RlcHRoXzsKKyAgfQorCiAgIGZ1bmN0aW9uX2JvZHkgKz0gYm9keTsKIAotICArK2NhdGNoX2RlcHRoXzsKLSAgRnJhZ21lbnQgY2F0Y2hfYm9keSA9Ci0gICAgICBDYXRjaEJsb2NrRW50cnkoQXJyYXk6OmVtcHR5X2FycmF5KCksIHRyeV9oYW5kbGVyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIC8qbmVlZHNfc3RhY2t0cmFjZT0qL3RydWUsIC8qaXNfc3ludGhlc2l6ZWQ9Ki90cnVlKTsKLSAgaWYgKG1hcnNoYWxsZXIuQ29udGFpbnNIYW5kbGVzKCkpIHsKKyAgaWYgKHNpZ25hdHVyZV9jb250YWluc19oYW5kbGVzKSB7CisgICAgKytjYXRjaF9kZXB0aF87CisgICAgRnJhZ21lbnQgY2F0Y2hfYm9keSA9CisgICAgICAgIENhdGNoQmxvY2tFbnRyeShBcnJheTo6ZW1wdHlfYXJyYXkoKSwgdHJ5X2hhbmRsZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKm5lZWRzX3N0YWNrdHJhY2U9Ki90cnVlLCAvKmlzX3N5bnRoZXNpemVkPSovdHJ1ZSk7CisKICAgICAvLyBUT0RPKDQxOTg0KTogSWYgd2Ugd2FudCB0byBwYXNzIGluIHRoZSBoYW5kbGUgc2NvcGUsIG1vdmUgaXQgb3V0CiAgICAgLy8gb2YgdGhlIHRyeSBjYXRjaC4KICAgICBjYXRjaF9ib2R5ICs9IEV4aXRIYW5kbGVTY29wZSgpOworCisgICAgY2F0Y2hfYm9keSArPSBMb2FkTG9jYWwoQ3VycmVudEV4Y2VwdGlvbigpKTsKKyAgICBjYXRjaF9ib2R5ICs9IExvYWRMb2NhbChDdXJyZW50U3RhY2tUcmFjZSgpKTsKKyAgICBjYXRjaF9ib2R5ICs9IFJldGhyb3dFeGNlcHRpb24oVG9rZW5Qb3NpdGlvbjo6a05vU291cmNlLCB0cnlfaGFuZGxlcl9pbmRleCk7CisgICAgLS1jYXRjaF9kZXB0aF87CiAgIH0KLSAgY2F0Y2hfYm9keSArPSBMb2FkTG9jYWwoQ3VycmVudEV4Y2VwdGlvbigpKTsKLSAgY2F0Y2hfYm9keSArPSBMb2FkTG9jYWwoQ3VycmVudFN0YWNrVHJhY2UoKSk7Ci0gIGNhdGNoX2JvZHkgKz0gUmV0aHJvd0V4Y2VwdGlvbihUb2tlblBvc2l0aW9uOjprTm9Tb3VyY2UsIHRyeV9oYW5kbGVyX2luZGV4KTsKLSAgLS1jYXRjaF9kZXB0aF87CiAKICAgcmV0dXJuIG5ldyAoWikgRmxvd0dyYXBoKCpwYXJzZWRfZnVuY3Rpb25fLCBncmFwaF9lbnRyeV8sIGxhc3RfdXNlZF9ibG9ja19pZF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9sb2d1ZV9pbmZvKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQva2VybmVsX3RyYW5zbGF0aW9uX2hlbHBlci5jYyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQva2VybmVsX3RyYW5zbGF0aW9uX2hlbHBlci5jYwppbmRleCA1ODQwNzY4Li45M2E5YjQ5IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL2tlcm5lbF90cmFuc2xhdGlvbl9oZWxwZXIuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9rZXJuZWxfdHJhbnNsYXRpb25faGVscGVyLmNjCkBAIC0yNjU0LDE4ICsyNjU0LDcgQEAKIH0KIAogaW50cHRyX3QgS2VybmVsUmVhZGVySGVscGVyOjpTb3VyY2VUYWJsZUZpZWxkQ291bnRGcm9tRmlyc3RMaWJyYXJ5T2Zmc2V0KCkgewotICAvLyB0cmFuc2xhdGlvbl9oZWxwZXJfLmluZm8oKSBtaWdodCBub3QgYmUgaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludCBzbyB3ZQotICAvLyBjYW4ndCB1c2UgdHJhbnNsYXRpb25faGVscGVyXy5pbmZvKCkua2VybmVsX2JpbmFyeV92ZXJzaW9uKCkuCi0gIFNldE9mZnNldChLZXJuZWxGb3JtYXRWZXJzaW9uT2Zmc2V0KTsKLSAgdWludDMyX3QgZm9ybWF0VmVyc2lvbiA9IHJlYWRlcl8uUmVhZFVJbnQzMigpOwotICBpbnRwdHJfdCBjb3VudF9mcm9tX2ZpcnN0X2xpYnJhcnlfb2Zmc2V0ID0KLSAgICAgIFNvdXJjZVRhYmxlRmllbGRDb3VudEZyb21GaXJzdExpYnJhcnlPZmZzZXRQcmU0MTsKLSAgc3RhdGljX2Fzc2VydChrTWluU3VwcG9ydGVkS2VybmVsRm9ybWF0VmVyc2lvbiA8IDQxLCAiY2xlYW51cCB0aGlzIGNvZGUiKTsKLSAgaWYgKGZvcm1hdFZlcnNpb24gPj0gNDEpIHsKLSAgICBjb3VudF9mcm9tX2ZpcnN0X2xpYnJhcnlfb2Zmc2V0ID0KLSAgICAgICAgU291cmNlVGFibGVGaWVsZENvdW50RnJvbUZpcnN0TGlicmFyeU9mZnNldDQxUGx1czsKLSAgfQotICByZXR1cm4gY291bnRfZnJvbV9maXJzdF9saWJyYXJ5X29mZnNldDsKKyAgcmV0dXJuIFNvdXJjZVRhYmxlRmllbGRDb3VudEZyb21GaXJzdExpYnJhcnlPZmZzZXQ0MVBsdXM7CiB9CiAKIGludHB0cl90IEtlcm5lbFJlYWRlckhlbHBlcjo6U291cmNlVGFibGVTaXplKCkgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9zY29wZV9idWlsZGVyLmNjIGIvcnVudGltZS92bS9jb21waWxlci9mcm9udGVuZC9zY29wZV9idWlsZGVyLmNjCmluZGV4IDM1Y2FlZTkuLmU4YjhhMmMgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvZnJvbnRlbmQvc2NvcGVfYnVpbGRlci5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL2Zyb250ZW5kL3Njb3BlX2J1aWxkZXIuY2MKQEAgLTQyMCwxNCArNDIwLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogT2JqZWN0OjpkeW5hbWljX3R5cGUoKS5yYXcoKSkpOwogICAgICAgICBzY29wZV8tPkluc2VydFBhcmFtZXRlckF0KGksIHZhcmlhYmxlKTsKICAgICAgIH0KLSAgICAgIGN1cnJlbnRfZnVuY3Rpb25fYXN5bmNfbWFya2VyXyA9IEZ1bmN0aW9uTm9kZUhlbHBlcjo6a1N5bmM7Ci0gICAgICArK2RlcHRoXy50cnlfOwotICAgICAgQWRkVHJ5VmFyaWFibGVzKCk7Ci0gICAgICAtLWRlcHRoXy50cnlfOwotICAgICAgKytkZXB0aF8uY2F0Y2hfOwotICAgICAgQWRkQ2F0Y2hWYXJpYWJsZXMoKTsKLSAgICAgIEZpbmFsaXplQ2F0Y2hWYXJpYWJsZXMoKTsKLSAgICAgIC0tZGVwdGhfLmNhdGNoXzsKKyAgICAgIC8vIENhbGxiYWNrcyBhbmQgY2FsbHMgd2l0aCBoYW5kbGVzIG5lZWQgdHJ5L2NhdGNoIHZhcmlhYmxlcy4KKyAgICAgIGlmIChmdW5jdGlvbi5Jc0ZmaVRyYW1wb2xpbmUoKSAmJgorICAgICAgICAgIChmdW5jdGlvbi5GZmlDYWxsYmFja1RhcmdldCgpICE9IEZ1bmN0aW9uOjpudWxsKCkgfHwKKyAgICAgICAgICAgZnVuY3Rpb24uRmZpQ1NpZ25hdHVyZUNvbnRhaW5zSGFuZGxlcygpKSkgeworICAgICAgICBjdXJyZW50X2Z1bmN0aW9uX2FzeW5jX21hcmtlcl8gPSBGdW5jdGlvbk5vZGVIZWxwZXI6OmtTeW5jOworICAgICAgICArK2RlcHRoXy50cnlfOworICAgICAgICBBZGRUcnlWYXJpYWJsZXMoKTsKKyAgICAgICAgLS1kZXB0aF8udHJ5XzsKKyAgICAgICAgKytkZXB0aF8uY2F0Y2hfOworICAgICAgICBBZGRDYXRjaFZhcmlhYmxlcygpOworICAgICAgICBGaW5hbGl6ZUNhdGNoVmFyaWFibGVzKCk7CisgICAgICAgIC0tZGVwdGhfLmNhdGNoXzsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgRnVuY3Rpb25MYXlvdXQ6OmtTaWduYXR1cmVGdW5jdGlvbjoKICAgICBjYXNlIEZ1bmN0aW9uTGF5b3V0OjprSXJyZWdleHBGdW5jdGlvbjoKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvaml0L2NvbXBpbGVyLmNjIGIvcnVudGltZS92bS9jb21waWxlci9qaXQvY29tcGlsZXIuY2MKaW5kZXggNzAyMTVlMi4uZmJiNzU1NyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9qaXQvY29tcGlsZXIuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9qaXQvY29tcGlsZXIuY2MKQEAgLTEwNiw2ICsxMDYsOCBAQAogICAgIEZMQUdfcmVvcmRlcl9iYXNpY19ibG9ja3MgPSB0cnVlOwogICAgIEZMQUdfdXNlX2ZpZWxkX2d1YXJkcyA9IGZhbHNlOwogICAgIEZMQUdfdXNlX2NoYV9kZW9wdCA9IGZhbHNlOworICAgIEZMQUdfY2F1c2FsX2FzeW5jX3N0YWNrcyA9IGZhbHNlOworICAgIEZMQUdfbGF6eV9hc3luY19zdGFja3MgPSB0cnVlOwogCiAjaWYgIWRlZmluZWQoUFJPRFVDVCkgJiYgIWRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogICAgIC8vIFNldCBmbGFncyBhZmZlY3RpbmcgcnVudGltZSBhY2NvcmRpbmdseSBmb3IgZ2VuX3NuYXBzaG90LgpAQCAtNjU4LDEyICs2NjAsMTEgQEAKICAgICAgICAgLy8KICAgICAgICAgdGhyZWFkKCktPmlzb2xhdGVfZ3JvdXAoKS0+UnVuV2l0aFN0b3BwZWRNdXRhdG9ycygKICAgICAgICAgICAgIGluc3RhbGxfY29kZV9mdW4sIGluc3RhbGxfY29kZV9mdW4sIC8qdXNlX2ZvcmNlX2dyb3d0aD0qL3RydWUpOwotCi0gICAgICAgIC8vIFdlIG5vdGlmeSBjb2RlIG9ic2VydmVycyBhZnRlciBmaW5hbGl6aW5nIHRoZSBjb2RlIGluIG9yZGVyIHRvIGJlCi0gICAgICAgIC8vIG91dHNpZGUgYSBbU2FmZXBvaW50T3BlcmF0aW9uU2NvcGVdLgotICAgICAgICBDb2RlOjpOb3RpZnlDb2RlT2JzZXJ2ZXJzKGZ1bmN0aW9uLCAqcmVzdWx0LCBvcHRpbWl6ZWQoKSk7CiAgICAgICB9CiAgICAgICBpZiAoIXJlc3VsdC0+SXNOdWxsKCkpIHsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBzYWZlcG9pbnQuCisgICAgICAgIENvZGU6Ok5vdGlmeUNvZGVPYnNlcnZlcnMoZnVuY3Rpb24sICpyZXN1bHQsIG9wdGltaXplZCgpKTsKKwogI2lmICFkZWZpbmVkKFBST0RVQ1QpCiAgICAgICAgIGlmICghZnVuY3Rpb24uSGFzT3B0aW1pemVkQ29kZSgpKSB7CiAgICAgICAgICAgaXNvbGF0ZSgpLT5kZWJ1Z2dlcigpLT5Ob3RpZnlDb21waWxhdGlvbihmdW5jdGlvbik7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL3JlY29nbml6ZWRfbWV0aG9kc19saXN0LmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3JlY29nbml6ZWRfbWV0aG9kc19saXN0LmgKaW5kZXggZmM2ODgzMi4uODQ5Y2ZmNyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9yZWNvZ25pemVkX21ldGhvZHNfbGlzdC5oCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvcmVjb2duaXplZF9tZXRob2RzX2xpc3QuaApAQCAtNDQ0LDggKzQ0NCwxMSBAQAogLy8gIHJlc3VsdC1jaWQsIGZpbmdlcnByaW50KS4KICNkZWZpbmUgUkVDT0dOSVpFRF9MSVNUX0ZBQ1RPUllfTElTVChWKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX0xpc3RGYWN0b3J5LCBfTGlzdCwgLiwga0FycmF5Q2lkLCAweDAzZGRiZDNhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKF9MaXN0RmlsbGVkRmFjdG9yeSwgX0xpc3QsIC5maWxsZWQsIGtBcnJheUNpZCwgMHgwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfR3Jvd2FibGVMaXN0V2l0aERhdGEsIF9Hcm93YWJsZUxpc3QsIC5fd2l0aERhdGEsIGtHcm93YWJsZU9iamVjdEFycmF5Q2lkLCBcCiAgICAgMHg1Y2ZkNmE3ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKF9Hcm93YWJsZUxpc3RGaWxsZWRGYWN0b3J5LCBfR3Jvd2FibGVMaXN0LCAuZmlsbGVkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrR3Jvd2FibGVPYmplY3RBcnJheUNpZCwgMHgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX0dyb3dhYmxlTGlzdEZhY3RvcnksIF9Hcm93YWJsZUxpc3QsIC4sIGtHcm93YWJsZU9iamVjdEFycmF5Q2lkLCAgICAgICAgICAgXAogICAgIDB4M2VlZDY4MGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfSW50OEFycmF5RmFjdG9yeSwgSW50OExpc3QsIC4sIGtUeXBlZERhdGFJbnQ4QXJyYXlDaWQsIDB4NmNlMmYxMDIpICAgICAgICBcCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfYXBpLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfYXBpLmgKaW5kZXggYjVmMWI3NC4uZDI0ZTM2ZCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9ydW50aW1lX2FwaS5oCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvcnVudGltZV9hcGkuaApAQCAtMTAyOCw2ICsxMDI4LDggQEAKICAgc3RhdGljIHdvcmQgbnVsbF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCgpOwogICBzdGF0aWMgd29yZCBudWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCgpOwogICBzdGF0aWMgd29yZCBudWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCgpOworICBzdGF0aWMgd29yZCBudWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQoKTsKKyAgc3RhdGljIHdvcmQgbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KCk7CiAgIHN0YXRpYyB3b3JkIHJhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KCk7CiAgIHN0YXRpYyB3b3JkIHJhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KCk7CiAgIHN0YXRpYyB3b3JkIHN0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCgpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9ydW50aW1lX29mZnNldHNfZXh0cmFjdGVkLmggYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfb2Zmc2V0c19leHRyYWN0ZWQuaAppbmRleCAwMGMwZTcxLi45MTg2NDNjIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfb2Zmc2V0c19leHRyYWN0ZWQuaAorKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfb2Zmc2V0c19leHRyYWN0ZWQuaApAQCAtMTk2LDE1MSArMTk2LDE1NSBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFN0cmluZ19sZW5ndGhfb2Zmc2V0ID0gNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBTdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSAzNjg7CisgICAgVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hY3RpdmVfZXhjZXB0aW9uX29mZnNldCA9Ci0gICAgNzAwOworICAgIDcxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0KLSAgICA3MDQ7CisgICAgNzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAxMjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjA7CisgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjg7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTc2OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI3MjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI4MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxODA7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjc2OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDE4NDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDI4MDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMTg4OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDE5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSAyODQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDE5MjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPSA3MzY7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMjAwOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hcGlfdG9wX3Njb3BlX29mZnNldCA9IDc0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0KICAgICA5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyODsKKyAgICBUaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Jvb2xfZmFsc2Vfb2Zmc2V0ID0gMTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9ib29sX3RydWVfb2Zmc2V0ID0gMTE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjA7CisgICAgVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKKyAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDI3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfc3R1Yl9vZmZzZXQgPSAxNDg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9IDc0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gNzU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDMwNDsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSAyMjA7CisgICAgMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9IDIyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDMwODsKKyAgICAzMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDIyNDsKKyAgICAyMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RvdWJsZV9hYnNfYWRkcmVzc19vZmZzZXQgPQotICAgIDM0ODsKKyAgICAzNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM0NDsKKyAgICBUaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZW5kX29mZnNldCA9IDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2VudGVyX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI0NDsKKyAgICBUaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9leGVjdXRpb25fc3RhdGVfb2Zmc2V0ID0KLSAgICA3MjA7CisgICAgNzMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjQ4OworICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1MjsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzEyOworICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDEzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9maXhfY2FsbGVyc190YXJnZXRfY29kZV9vZmZzZXQgPSAxMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSAzNjA7CisgICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1NjsKKyAgICBUaHJlYWRfZmxvYXRfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9mbG9hdF9ub3RfYWRkcmVzc19vZmZzZXQgPQotICAgIDM1MjsKKyAgICAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSAzNjQ7CisgICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gMzcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0KLSAgICA3MDg7CisgICAgNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDMzMjsKKyAgICBUaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfZnJvbV9ieXRlY29kZV9zdHViX29mZnNldCA9IDE0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX3N0dWJfb2Zmc2V0ID0gMTQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9leGl0X3Rocm91Z2hfZmZpX29mZnNldCA9Ci0gICAgNzMyOworICAgIDc0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfaXNvbGF0ZV9vZmZzZXQgPSA0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmllbGRfdGFibGVfdmFsdWVzX29mZnNldCA9CiAgICAgNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDIyODsKKyAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDIzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyMzI7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV90aHJvd19zdHViX29mZnNldCA9IDI0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjQwOworICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX21hcmtpbmdfc3RhY2tfYmxvY2tfb2Zmc2V0ID0gODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDI5NjsKKyAgICBUaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSAzMDA7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDMwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDIwNDsKKyAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAyMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzI0OworICAgIFRocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2NDsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY0Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY4OworICAgIFRocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzI7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTgwOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vYmplY3RfbnVsbF9vZmZzZXQgPSAxMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gMzM2Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9yZXN1bWVfcGNfb2Zmc2V0ID0gNzEyOworICAgIFRocmVhZF9wcmVkZWZpbmVkX3N5bWJvbHNfYWRkcmVzc19vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSA3MjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gNzE2OworICAgIFRocmVhZF9zYXZlZF9zaGFkb3dfY2FsbF9zdGFja19vZmZzZXQgPSA3Mjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPQotICAgIDcyNDsKKyAgICA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyMzY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMxNjsKKyAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zdGFja19saW1pdF9vZmZzZXQgPSAzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc2F2ZWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0KICAgICA2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19mbGFnc19vZmZzZXQgPSA2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyOTI7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDMwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwMDsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg4OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxOTY7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zdG9yZV9idWZmZXJfYmxvY2tfb2Zmc2V0ID0KICAgICA4MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtMzUzLDEwICszNTcsMTAgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMTI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjU2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgNDA7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0gNzI4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9IDc0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaW1lbGluZVN0cmVhbV9lbmFibGVkX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVHdvQnl0ZVN0cmluZ19kYXRhX29mZnNldCA9IDEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR5cGVfYXJndW1lbnRzX29mZnNldCA9IDE2OwpAQCAtMzk4LDcgKzQwMiw3IEBACiAgICAgNCwgMTIsIDgsIDE2fTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX3dyYXBwZXJzX3RocmVhZF9vZmZzZXRbXSA9IHsKLSAgICAgICAgNjY4LCA2NzIsIDY3NiwgNjgwLCA2ODQsIC0xLCA2ODgsIC0xLCA2OTIsIDY5NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisgICAgICAgIDY4MCwgNjg0LCA2ODgsIDY5MiwgNjk2LCAtMSwgNzAwLCAtMSwgNzA0LCA3MDgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFwaUVycm9yX0luc3RhbmNlU2l6ZSA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXJyYXlfSW5zdGFuY2VTaXplID0gMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXJyYXlfaGVhZGVyX3NpemUgPSAxMjsKQEAgLTY4NiwxNTIgKzY5MCwxNTYgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBTdHJpbmdfbGVuZ3RoX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3VidHlwZVRlc3RDYWNoZV9jYWNoZV9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzIwOworICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDczNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYWN0aXZlX2V4Y2VwdGlvbl9vZmZzZXQgPQotICAgIDE0MDg7CisgICAgMTQzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0KLSAgICAxNDE2OworICAgIDE0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9IDI0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDUwNDsKKyAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDUyMDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDUzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTI4OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM0NDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1NTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMzUyOworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1NjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNjA7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMzc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDU1MjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzY4OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPQotICAgIDE0ODA7CisgICAgMTUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0KICAgICAxOTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NDA7CisgICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9ib29sX2ZhbHNlX29mZnNldCA9IDIyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF90cnVlX29mZnNldCA9IDIxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjI0OworICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MTI7CisgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMjgwOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kYXJ0X3N0cmVhbV9vZmZzZXQgPSAxNDk2Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kYXJ0X3N0cmVhbV9vZmZzZXQgPSAxNTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDU5MjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0MjQ7CisgICAgNjA4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9IDQ0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDYwMDsKKyAgICA2MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDQzMjsKKyAgICA0NDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RvdWJsZV9hYnNfYWRkcmVzc19vZmZzZXQgPQotICAgIDY4MDsKKyAgICA2OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY3MjsKKyAgICBUaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZW5kX29mZnNldCA9IDExMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0NzI7CisgICAgVGhyZWFkX2VudGVyX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9Ci0gICAgMTQ0ODsKKyAgICAxNDcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDgwOworICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ4ODsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjA4OworICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9maXhfY2FsbGVyc190YXJnZXRfY29kZV9vZmZzZXQgPSAyNDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSA3MDQ7CisgICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY5NjsKKyAgICBUaHJlYWRfZmxvYXRfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9mbG9hdF9ub3RfYWRkcmVzc19vZmZzZXQgPQotICAgIDY4ODsKKyAgICA3MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3MTI7CisgICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gNzI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0KLSAgICAxNDI0OworICAgIDE0NDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4OworICAgIFRocmVhZF9pbnRlcnByZXRfY2FsbF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfaW52b2tlX2RhcnRfY29kZV9mcm9tX2J5dGVjb2RlX3N0dWJfb2Zmc2V0ID0gMjcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0KLSAgICAxNDcyOworICAgIDE0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPQogICAgIDEzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDQwOworICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV90aHJvd19zdHViX29mZnNldCA9IDQ0ODsKKyAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3Rocm93X3N0dWJfb2Zmc2V0ID0gNDY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NjQ7CisgICAgVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0ODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbWFya2luZ19zdGFja19ibG9ja19vZmZzZXQgPSAxNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU3NjsKKyAgICBUaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSA1ODQ7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDYwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDM5MjsKKyAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSA0MDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOworICAgIFRocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDI5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyODsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzIwOworICAgIFRocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzIwOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzQ0Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vYmplY3RfbnVsbF9vZmZzZXQgPSAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gNjU2Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9yZXN1bWVfcGNfb2Zmc2V0ID0gMTQzMjsKKyAgICBUaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gNjcyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9yZXN1bWVfcGNfb2Zmc2V0ID0gMTQ1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zYXZlZF9zaGFkb3dfY2FsbF9zdGFja19vZmZzZXQgPSAxNDQwOworICAgIFRocmVhZF9zYXZlZF9zaGFkb3dfY2FsbF9zdGFja19vZmZzZXQgPSAxNDY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zYWZlcG9pbnRfc3RhdGVfb2Zmc2V0ID0KLSAgICAxNDU2OworICAgIDE0ODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NTY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYxNjsKKyAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zdGFja19saW1pdF9vZmZzZXQgPSA3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc2F2ZWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0KICAgICAxMjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2ODsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzg0OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDQwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NjA7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM3NjsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3N0b3JlX2J1ZmZlcl9ibG9ja19vZmZzZXQgPQogICAgIDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtODQ0LDExICs4NTIsMTEgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNDk2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDUxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0KLSAgICAxNDY0OworICAgIDE0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPQogICAgIDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPSAxNjsKQEAgLTg5MSw4ICs4OTksOCBAQAogICAgIDgsIDI0LCAxNiwgMzJ9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfd3JhcHBlcnNfdGhyZWFkX29mZnNldFtdID0gewotICAgICAgICAxMzIwLCAxMzI4LCAxMzM2LCAxMzQ0LCAtMSwgICAtMSwgICAxMzUyLCAxMzYwLAotICAgICAgICAxMzY4LCAxMzc2LCAxMzg0LCAtMSwgICAxMzkyLCAxNDAwLCAtMSwgICAtMX07CisgICAgICAgIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIC0xLCAgIC0xLCAgIDEzNzYsIDEzODQsCisgICAgICAgIDEzOTIsIDE0MDAsIDE0MDgsIC0xLCAgIDE0MTYsIDE0MjQsIC0xLCAgIC0xfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBcGlFcnJvcl9JbnN0YW5jZVNpemUgPSAxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBcnJheV9JbnN0YW5jZVNpemUgPSAyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBcnJheV9oZWFkZXJfc2l6ZSA9IDI0OwpAQCAtMTE3OCwxNTEgKzExODYsMTU1IEBACiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3RyaW5nX2xlbmd0aF9vZmZzZXQgPSA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFN1YnR5cGVUZXN0Q2FjaGVfY2FjaGVfb2Zmc2V0ID0gNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDM2ODsKKyAgICBUaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSAzNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0KLSAgICA2Njg7CisgICAgNjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hY3RpdmVfc3RhY2t0cmFjZV9vZmZzZXQgPQotICAgIDY3MjsKKyAgICA2ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9IDEyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2MDsKKyAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI2ODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzY7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjcyOworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4MDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzY7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTg0OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAxOTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjgwOworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAxODg7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMTk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMTkyOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hcGlfdG9wX3Njb3BlX29mZnNldCA9IDcwNDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAyMDA7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0gNzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hc3luY19zdGFja190cmFjZV9vZmZzZXQgPQogICAgIDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzI4OworICAgIFRocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPSAxMjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAxMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyMDsKKyAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY0OworICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9zdHViX29mZnNldCA9IDE0ODsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gNzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kYXJ0X3N0cmVhbV9vZmZzZXQgPSA3MjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZGlzcGF0Y2hfdGFibGVfYXJyYXlfb2Zmc2V0ID0gNDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX2VudHJ5X29mZnNldCA9Ci0gICAgMzA0Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9IDIyMDsKKyAgICAzMTI7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gMjI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX2VudHJ5X29mZnNldCA9Ci0gICAgMzA4OworICAgIDMxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGVvcHRpbWl6ZV9zdHViX29mZnNldCA9Ci0gICAgMjI0OworICAgIDIzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9Ci0gICAgMzQ4OworICAgIDM1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzQ0OworICAgIFRocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9lbmRfb2Zmc2V0ID0gNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjQ0OworICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPQotICAgIDY4ODsKKyAgICA3MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNDg7CisgICAgVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjUyOworICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMTI7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDMyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9maXhfYWxsb2NhdGlvbl9zdHViX2NvZGVfb2Zmc2V0ID0gMTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9jYWxsZXJzX3RhcmdldF9jb2RlX29mZnNldCA9IDEzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDM2MDsKKyAgICBUaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzU2OworICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9Ci0gICAgMzUyOworICAgIDM2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDM2NDsKKyAgICBUaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSAzNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2dsb2JhbF9vYmplY3RfcG9vbF9vZmZzZXQgPQotICAgIDY3NjsKKyAgICA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzMyOworICAgIFRocmVhZF9pbnRlcnByZXRfY2FsbF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfaW52b2tlX2RhcnRfY29kZV9mcm9tX2J5dGVjb2RlX3N0dWJfb2Zmc2V0ID0gMTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAxNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0KLSAgICA3MDA7CisgICAgNzEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9pc29sYXRlX29mZnNldCA9IDQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9maWVsZF90YWJsZV92YWx1ZXNfb2Zmc2V0ID0KICAgICA2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gMjI4OworICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gMjM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV90aHJvd19zdHViX29mZnNldCA9IDIzMjsKKyAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3Rocm93X3N0dWJfb2Zmc2V0ID0gMjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDA7CisgICAgVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbWFya2luZ19zdGFja19ibG9ja19vZmZzZXQgPSA4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gMjk2OworICAgIFRocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gMzA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDMwMDsKKyAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMjA0OworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDIxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjQ7CisgICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY0Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTcyOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjg7CisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxODA7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29iamVjdF9udWxsX29mZnNldCA9IDExMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9wcmVkZWZpbmVkX3N5bWJvbHNfYWRkcmVzc19vZmZzZXQgPSAzMzY7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSA2ODA7CisgICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDM0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDY5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zYXZlZF9zaGFkb3dfY2FsbF9zdGFja19vZmZzZXQgPSA2ODQ7CisgICAgVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9Ci0gICAgNjkyOworICAgIDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDIzNjsKKyAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzE2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9IDM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zYXZlZF9zdGFja19saW1pdF9vZmZzZXQgPQogICAgIDYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X2ZsYWdzX29mZnNldCA9IDY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzAwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjAwOworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyODg7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE5NjsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3N0b3JlX2J1ZmZlcl9ibG9ja19vZmZzZXQgPQogICAgIDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCkBAIC0xMzM1LDEwICsxMzQ3LDEwIEBACiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPQogICAgIDEyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI1NjsKKyAgICBUaHJlYWRfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3dyaXRlX2JhcnJpZXJfbWFza19vZmZzZXQgPQogICAgIDQwOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9IDY5NjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfY2FsbGJhY2tfY29kZV9vZmZzZXQgPSA3MDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPSAxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUeXBlX2FyZ3VtZW50c19vZmZzZXQgPSAxNjsKQEAgLTE2NjUsMTUyICsxNjc3LDE1NiBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFN0cmluZ19sZW5ndGhfb2Zmc2V0ID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBTdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MjA7CisgICAgVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hY3RpdmVfZXhjZXB0aW9uX29mZnNldCA9Ci0gICAgMTQ4MDsKKyAgICAxNTA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hY3RpdmVfc3RhY2t0cmFjZV9vZmZzZXQgPQotICAgIDE0ODg7CisgICAgMTUxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTA0OworICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDUyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTIwOworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMzNjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzQ0OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDUzNjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDU1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNTI7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDM2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1NDQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM2MDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAzNjg7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hcGlfdG9wX3Njb3BlX29mZnNldCA9Ci0gICAgMTU1MjsKKyAgICAxNTc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9hc3luY19zdGFja190cmFjZV9vZmZzZXQgPQogICAgIDE5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKKyAgICBUaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Jvb2xfZmFsc2Vfb2Zmc2V0ID0gMjI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9ib29sX3RydWVfb2Zmc2V0ID0gMjE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CisgICAgVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUxMjsKKyAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfc3R1Yl9vZmZzZXQgPSAyODA7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9IDE1Njg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9IDE1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZGlzcGF0Y2hfdGFibGVfYXJyYXlfb2Zmc2V0ID0gOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX2VudHJ5X29mZnNldCA9Ci0gICAgNTkyOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9IDQyNDsKKyAgICA2MDg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX2VudHJ5X29mZnNldCA9Ci0gICAgNjAwOworICAgIDYxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGVvcHRpbWl6ZV9zdHViX29mZnNldCA9Ci0gICAgNDMyOworICAgIDQ0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9Ci0gICAgNjgwOworICAgIDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNjcyOworICAgIFRocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNjg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9lbmRfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2VudGVyX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ3MjsKKyAgICBUaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9leGVjdXRpb25fc3RhdGVfb2Zmc2V0ID0KLSAgICAxNTIwOworICAgIDE1NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODA7CisgICAgVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4OworICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MDg7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9maXhfYWxsb2NhdGlvbl9zdHViX2NvZGVfb2Zmc2V0ID0gMjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9jYWxsZXJzX3RhcmdldF9jb2RlX29mZnNldCA9IDI0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcwNDsKKyAgICBUaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSA3MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZmxvYXRfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNjk2OworICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9Ci0gICAgNjg4OworICAgIDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcxMjsKKyAgICBUaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3Mjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2dsb2JhbF9vYmplY3RfcG9vbF9vZmZzZXQgPQotICAgIDE0OTY7CisgICAgMTUyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9pbnRlcnByZXRfY2FsbF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2NDg7CisgICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDY2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfaW52b2tlX2RhcnRfY29kZV9zdHViX29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhpdF90aHJvdWdoX2ZmaV9vZmZzZXQgPQotICAgIDE1NDQ7CisgICAgMTU2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfaXNvbGF0ZV9vZmZzZXQgPSA4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmllbGRfdGFibGVfdmFsdWVzX29mZnNldCA9CiAgICAgMTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NDA7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3Rocm93X3N0dWJfb2Zmc2V0ID0gNDQ4OworICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDQ2NDsKKyAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDQ4MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDE2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gNTc2OworICAgIFRocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gNTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDU4NDsKKyAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gNjAwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMzkyOworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDQwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MzI7CisgICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOwotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzI4Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMTI7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29iamVjdF9udWxsX29mZnNldCA9IDIwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9wcmVkZWZpbmVkX3N5bWJvbHNfYWRkcmVzc19vZmZzZXQgPSA2NTY7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSAxNTA0OworICAgIFRocmVhZF9wcmVkZWZpbmVkX3N5bWJvbHNfYWRkcmVzc19vZmZzZXQgPSA2NzI7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSAxNTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE1MTI7CisgICAgVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE1MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPQotICAgIDE1Mjg7CisgICAgMTU1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDQ1NjsKKyAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2xvd190eXBlX3Rlc3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjE2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9IDcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zYXZlZF9zdGFja19saW1pdF9vZmZzZXQgPQogICAgIDEyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19mbGFnc19vZmZzZXQgPSAxMjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzODQ7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gNDAwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzc2OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9CiAgICAgMTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCkBAIC0xODIzLDExICsxODM5LDExIEBACiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPQogICAgIDIzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDQ5NjsKKyAgICBUaHJlYWRfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3dyaXRlX2JhcnJpZXJfbWFza19vZmZzZXQgPQogICAgIDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9Ci0gICAgMTUzNjsKKyAgICAxNTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRpbWVsaW5lU3RyZWFtX2VuYWJsZWRfb2Zmc2V0ID0KICAgICAxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUd29CeXRlU3RyaW5nX2RhdGFfb2Zmc2V0ID0gMTY7CkBAIC0xODcwLDkgKzE4ODYsOSBAQAogICAgIDgsIDI0LCAxNiwgMzJ9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfd3JhcHBlcnNfdGhyZWFkX29mZnNldFtdID0gewotICAgICAgICAxMzIwLCAxMzI4LCAxMzM2LCAxMzQ0LCAxMzUyLCAxMzYwLCAxMzY4LCAxMzc2LCAxMzg0LCAxMzkyLCAxNDAwLAotICAgICAgICAxNDA4LCAxNDE2LCAxNDI0LCAxNDMyLCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAxNDQwLCAxNDQ4LCAtMSwKLSAgICAgICAgLTEsICAgMTQ1NiwgMTQ2NCwgMTQ3MiwgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTF9OworICAgICAgICAxMzQ0LCAxMzUyLCAxMzYwLCAxMzY4LCAxMzc2LCAxMzg0LCAxMzkyLCAxNDAwLCAxNDA4LCAxNDE2LCAxNDI0LAorICAgICAgICAxNDMyLCAxNDQwLCAxNDQ4LCAxNDU2LCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAxNDY0LCAxNDcyLCAtMSwKKyAgICAgICAgLTEsICAgMTQ4MCwgMTQ4OCwgMTQ5NiwgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTF9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFwaUVycm9yX0luc3RhbmNlU2l6ZSA9IDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFycmF5X0luc3RhbmNlU2l6ZSA9IDI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFycmF5X2hlYWRlcl9zaXplID0gMjQ7CkBAIC0yMTU3LDE1MSArMjE3MywxNTUgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBTdHJpbmdfbGVuZ3RoX29mZnNldCA9IDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3VidHlwZVRlc3RDYWNoZV9jYWNoZV9vZmZzZXQgPSA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzY4OworICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYWN0aXZlX2V4Y2VwdGlvbl9vZmZzZXQgPQotICAgIDcwMDsKKyAgICA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9Ci0gICAgNzA0OworICAgIDcxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjYwOworICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3NjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTgwOworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI3NjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAxODQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDE5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDI4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDE4ODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAxOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg0OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSAyOTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAxOTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0gNzM2OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDIwMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPSA3NDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FzeW5jX3N0YWNrX3RyYWNlX29mZnNldCA9CiAgICAgOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjg7CisgICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9ib29sX2ZhbHNlX29mZnNldCA9IDEyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF90cnVlX29mZnNldCA9IDExNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOworICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjQ7CisgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMTQ4Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kYXJ0X3N0cmVhbV9vZmZzZXQgPSA3NDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9IDc1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9kaXNwYXRjaF90YWJsZV9hcnJheV9vZmZzZXQgPSA0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICAzMDQ7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gMjIwOworICAgIDMxMjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSAyMjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICAzMDg7CisgICAgMzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0KLSAgICAyMjQ7CisgICAgMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICAzNDg7CisgICAgMzU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNDQ7CisgICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2VuZF9vZmZzZXQgPSA1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNDQ7CisgICAgVGhyZWFkX2VudGVyX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9Ci0gICAgNzIwOworICAgIDczMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI0ODsKKyAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTI7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDMxMjsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9hbGxvY2F0aW9uX3N0dWJfY29kZV9vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMTMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOworICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDM2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNTY7CisgICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICAzNTI7CisgICAgMzYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gMzY0OworICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDM3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9Ci0gICAgNzA4OworICAgIDcyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9pbnRlcnByZXRfY2FsbF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzI7CisgICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDM0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAxNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfaW52b2tlX2RhcnRfY29kZV9zdHViX29mZnNldCA9IDE0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhpdF90aHJvdWdoX2ZmaV9vZmZzZXQgPQotICAgIDczMjsKKyAgICA3NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPQogICAgIDY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMjg7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3Rocm93X3N0dWJfb2Zmc2V0ID0gMjMyOworICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0MDsKKyAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSAyOTY7CisgICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSAzMDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzAwOworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSAzMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAyMDQ7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMjEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKKyAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjQ7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTcyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4MDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDMzNjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDcxMjsKKyAgICBUaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gMzQ0Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9yZXN1bWVfcGNfb2Zmc2V0ID0gNzI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDcxNjsKKyAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gNzI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zYWZlcG9pbnRfc3RhdGVfb2Zmc2V0ID0KLSAgICA3MjQ7CisgICAgNzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjM2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMTY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0gMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhdmVkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjkyOworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAzMDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDA7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI4ODsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTk2OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9CiAgICAgODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTIzMTQsMTAgKzIzMzQsMTAgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMTI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjU2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgNDA7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0gNzI4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9IDc0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaW1lbGluZVN0cmVhbV9lbmFibGVkX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVHdvQnl0ZVN0cmluZ19kYXRhX29mZnNldCA9IDEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR5cGVfYXJndW1lbnRzX29mZnNldCA9IDE2OwpAQCAtMjM1Niw3ICsyMzc2LDcgQEAKICAgICA0LCAxMiwgOCwgMTZ9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfd3JhcHBlcnNfdGhyZWFkX29mZnNldFtdID0gewotICAgICAgICA2NjgsIDY3MiwgNjc2LCA2ODAsIDY4NCwgLTEsIDY4OCwgLTEsIDY5MiwgNjk2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKyAgICAgICAgNjgwLCA2ODQsIDY4OCwgNjkyLCA2OTYsIC0xLCA3MDAsIC0xLCA3MDQsIDcwOCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXBpRXJyb3JfSW5zdGFuY2VTaXplID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBcnJheV9JbnN0YW5jZVNpemUgPSAxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBcnJheV9oZWFkZXJfc2l6ZSA9IDEyOwpAQCAtMjY0MSwxNTIgKzI2NjEsMTU2IEBACiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3RyaW5nX2xlbmd0aF9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFN1YnR5cGVUZXN0Q2FjaGVfY2FjaGVfb2Zmc2V0ID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDcyMDsKKyAgICBUaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0KLSAgICAxNDA4OworICAgIDE0MzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9Ci0gICAgMTQxNjsKKyAgICAxNDQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MDQ7CisgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDM1MjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMzY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMzYwOworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NTI7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDU2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAzODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0KLSAgICAxNDgwOworICAgIDE1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FzeW5jX3N0YWNrX3RyYWNlX29mZnNldCA9CiAgICAgMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOworICAgIFRocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPSAyMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKKyAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9zdHViX29mZnNldCA9IDI4MDsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gMTQ5NjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gMTUyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9kaXNwYXRjaF90YWJsZV9hcnJheV9vZmZzZXQgPSA5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDI0OworICAgIDYwODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA2MDA7CisgICAgNjE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0KLSAgICA0MzI7CisgICAgNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICA2ODA7CisgICAgNjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2NzI7CisgICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2VuZF9vZmZzZXQgPSAxMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDcyOworICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPQotICAgIDE0NDg7CisgICAgMTQ3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ4MDsKKyAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNTA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9hbGxvY2F0aW9uX3N0dWJfY29kZV9vZmZzZXQgPSAyNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzA0OworICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDcxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICA2ODg7CisgICAgNzA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gNzEyOworICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9Ci0gICAgMTQyNDsKKyAgICAxNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDY0ODsKKyAgICBUaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfZnJvbV9ieXRlY29kZV9zdHViX29mZnNldCA9IDI3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX3N0dWJfb2Zmc2V0ID0gMjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9leGl0X3Rocm91Z2hfZmZpX29mZnNldCA9Ci0gICAgMTQ3MjsKKyAgICAxNDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9pc29sYXRlX29mZnNldCA9IDg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9maWVsZF90YWJsZV92YWx1ZXNfb2Zmc2V0ID0KICAgICAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDQ0MDsKKyAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDQ1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV90aHJvd19zdHViX29mZnNldCA9IDQ2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDY0OworICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX21hcmtpbmdfc3RhY2tfYmxvY2tfb2Zmc2V0ID0gMTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1NzY7CisgICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gNTg0OworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSA2MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gNDA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKKyAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDI4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzI4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0gMjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDE0MzI7CisgICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDE0NTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTQ0MDsKKyAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTQ2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9Ci0gICAgMTQ1NjsKKyAgICAxNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDQ3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MTY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0gNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhdmVkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgMTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X2ZsYWdzX29mZnNldCA9IDEyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM4NDsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTYwOworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zdG9yZV9idWZmZXJfYmxvY2tfb2Zmc2V0ID0KICAgICAxNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTI3OTksMTEgKzI4MjMsMTEgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNDk2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDUxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0KLSAgICAxNDY0OworICAgIDE0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPQogICAgIDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPSAxNjsKQEAgLTI4NDMsOCArMjg2Nyw4IEBACiAgICAgOCwgMjQsIDE2LCAzMn07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIC0xLCAgIC0xLCAgIDEzNTIsIDEzNjAsCi0gICAgICAgIDEzNjgsIDEzNzYsIDEzODQsIC0xLCAgIDEzOTIsIDE0MDAsIC0xLCAgIC0xfTsKKyAgICAgICAgMTM0NCwgMTM1MiwgMTM2MCwgMTM2OCwgLTEsICAgLTEsICAgMTM3NiwgMTM4NCwKKyAgICAgICAgMTM5MiwgMTQwMCwgMTQwOCwgLTEsICAgMTQxNiwgMTQyNCwgLTEsICAgLTF9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFwaUVycm9yX0luc3RhbmNlU2l6ZSA9IDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFycmF5X0luc3RhbmNlU2l6ZSA9IDI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFycmF5X2hlYWRlcl9zaXplID0gMjQ7CkBAIC0zMTI3LDE1MSArMzE1MSwxNTUgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBTdHJpbmdfbGVuZ3RoX29mZnNldCA9IDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3VidHlwZVRlc3RDYWNoZV9jYWNoZV9vZmZzZXQgPSA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzY4OworICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYWN0aXZlX2V4Y2VwdGlvbl9vZmZzZXQgPQotICAgIDY2ODsKKyAgICA2ODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9Ci0gICAgNjcyOworICAgIDY4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjYwOworICAgIFRocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjc2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3NjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTgwOworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI3NjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAxODQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDE5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDI4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDE4ODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAxOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg0OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSAyOTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAxOTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0gNzA0OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDIwMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPSA3MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FzeW5jX3N0YWNrX3RyYWNlX29mZnNldCA9CiAgICAgOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjg7CisgICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9ib29sX2ZhbHNlX29mZnNldCA9IDEyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF90cnVlX29mZnNldCA9IDExNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOworICAgIFRocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNjQ7CisgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMTQ4Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kYXJ0X3N0cmVhbV9vZmZzZXQgPSA3MTI7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9IDcyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9kaXNwYXRjaF90YWJsZV9hcnJheV9vZmZzZXQgPSA0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICAzMDQ7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gMjIwOworICAgIDMxMjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSAyMjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICAzMDg7CisgICAgMzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0KLSAgICAyMjQ7CisgICAgMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICAzNDg7CisgICAgMzU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNDQ7CisgICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2VuZF9vZmZzZXQgPSA1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNDQ7CisgICAgVGhyZWFkX2VudGVyX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9Ci0gICAgNjg4OworICAgIDcwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI0ODsKKyAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTI7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDMxMjsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9hbGxvY2F0aW9uX3N0dWJfY29kZV9vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMTMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOworICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDM2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSAzNTY7CisgICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICAzNTI7CisgICAgMzYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gMzY0OworICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDM3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9Ci0gICAgNjc2OworICAgIDY4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9pbnRlcnByZXRfY2FsbF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzI7CisgICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDM0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAxNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfaW52b2tlX2RhcnRfY29kZV9zdHViX29mZnNldCA9IDE0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZXhpdF90aHJvdWdoX2ZmaV9vZmZzZXQgPQotICAgIDcwMDsKKyAgICA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPQogICAgIDY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMjg7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3Rocm93X3N0dWJfb2Zmc2V0ID0gMjMyOworICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0MDsKKyAgICBUaHJlYWRfbGF6eV9zcGVjaWFsaXplX3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSAyOTY7CisgICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSAzMDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzAwOworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSAzMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAyMDQ7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMjEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKKyAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjQ7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTcyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4MDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDMzNjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDY4MDsKKyAgICBUaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gMzQ0Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9yZXN1bWVfcGNfb2Zmc2V0ID0gNjkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDY4NDsKKyAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gNjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zYWZlcG9pbnRfc3RhdGVfb2Zmc2V0ID0KLSAgICA2OTI7CisgICAgNzA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjM2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDI0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMTY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0gMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhdmVkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjkyOworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSAzMDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDA7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI4ODsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTk2OworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9CiAgICAgODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTMyODQsMTAgKzMzMTIsMTAgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMTI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjU2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgNDA7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0gNjk2Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9IDcwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaW1lbGluZVN0cmVhbV9lbmFibGVkX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVHdvQnl0ZVN0cmluZ19kYXRhX29mZnNldCA9IDEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR5cGVfYXJndW1lbnRzX29mZnNldCA9IDE2OwpAQCAtMzYwOCwxNTIgKzM2MzYsMTU2IEBACiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgU3RyaW5nX2xlbmd0aF9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFN1YnR5cGVUZXN0Q2FjaGVfY2FjaGVfb2Zmc2V0ID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDcyMDsKKyAgICBUaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0KLSAgICAxNDgwOworICAgIDE1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9Ci0gICAgMTQ4ODsKKyAgICAxNTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MDQ7CisgICAgVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2OworICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2OworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zdHViX29mZnNldCA9IDM1MjsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMzY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMzYwOworICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NTI7CisgICAgVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDU2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBUaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAzODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0KLSAgICAxNTUyOworICAgIDE1NzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2FzeW5jX3N0YWNrX3RyYWNlX29mZnNldCA9CiAgICAgMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOworICAgIFRocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPSAyMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKKyAgICBUaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIFRocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2NhbGxfdG9fcnVudGltZV9zdHViX29mZnNldCA9IDI4MDsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gMTU2ODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0gMTU5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9kaXNwYXRjaF90YWJsZV9hcnJheV9vZmZzZXQgPSA5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX29wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDI0OworICAgIDYwODsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA2MDA7CisgICAgNjE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0KLSAgICA0MzI7CisgICAgNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICA2ODA7CisgICAgNjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2NzI7CisgICAgVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2VuZF9vZmZzZXQgPSAxMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDcyOworICAgIFRocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPQotICAgIDE1MjA7CisgICAgMTU0NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDQ4MDsKKyAgICBUaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CisgICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNTA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBUaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjI0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ZpeF9hbGxvY2F0aW9uX3N0dWJfY29kZV9vZmZzZXQgPSAyNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzA0OworICAgIFRocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDcxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0KLSAgICA2ODg7CisgICAgNzA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gNzEyOworICAgIFRocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9Ci0gICAgMTQ5NjsKKyAgICAxNTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX2ludGVycHJldF9jYWxsX2VudHJ5X3BvaW50X29mZnNldCA9IDY0ODsKKyAgICBUaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfZnJvbV9ieXRlY29kZV9zdHViX29mZnNldCA9IDI3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9pbnZva2VfZGFydF9jb2RlX3N0dWJfb2Zmc2V0ID0gMjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9leGl0X3Rocm91Z2hfZmZpX29mZnNldCA9Ci0gICAgMTU0NDsKKyAgICAxNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9pc29sYXRlX29mZnNldCA9IDg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9maWVsZF90YWJsZV92YWx1ZXNfb2Zmc2V0ID0KICAgICAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDQ0MDsKKyAgICBUaHJlYWRfbGF6eV9kZW9wdF9mcm9tX3JldHVybl9zdHViX29mZnNldCA9IDQ1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgVGhyZWFkX2xhenlfZGVvcHRfZnJvbV90aHJvd19zdHViX29mZnNldCA9IDQ2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDY0OworICAgIFRocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX21hcmtpbmdfc3RhY2tfYmxvY2tfb2Zmc2V0ID0gMTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1NzY7CisgICAgVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gNTg0OworICAgIFRocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19lbnRyeV9vZmZzZXQgPSA2MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gNDA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX25vX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKKyAgICBUaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMTI7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDI4ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIFRocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKKyAgICBUaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzI4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIFRocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0gMjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDE1MDQ7CisgICAgVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDE1Mjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTUxMjsKKyAgICBUaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTUzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9Ci0gICAgMTUyODsKKyAgICAxNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9zdHViX29mZnNldCA9IDQ3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zbG93X3R5cGVfdGVzdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MTY7CisgICAgVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfc3RhY2tfbGltaXRfb2Zmc2V0ID0gNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX3NhdmVkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgMTIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X2ZsYWdzX29mZnNldCA9IDEyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM4NDsKKyAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTYwOworICAgIFRocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1NzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBUaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFRocmVhZF9zdG9yZV9idWZmZXJfYmxvY2tfb2Zmc2V0ID0KICAgICAxNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTM3NjYsMTEgKzM3OTgsMTEgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9CiAgICAgMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNDk2OworICAgIFRocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDUxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBUaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9CiAgICAgODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGhyZWFkX2NhbGxiYWNrX2NvZGVfb2Zmc2V0ID0KLSAgICAxNTM2OworICAgIDE1NjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPQogICAgIDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIFR3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPSAxNjsKQEAgLTM4MTAsOSArMzg0Miw5IEBACiAgICAgOCwgMjQsIDE2LCAzMn07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBUaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsCi0gICAgICAgIDE0MDgsIDE0MTYsIDE0MjQsIDE0MzIsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NDAsIDE0NDgsIC0xLAotICAgICAgICAtMSwgICAxNDU2LCAxNDY0LCAxNDcyLCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CisgICAgICAgIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsIDE0MDgsIDE0MTYsIDE0MjQsCisgICAgICAgIDE0MzIsIDE0NDAsIDE0NDgsIDE0NTYsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NjQsIDE0NzIsIC0xLAorICAgICAgICAtMSwgICAxNDgwLCAxNDg4LCAxNDk2LCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXBpRXJyb3JfSW5zdGFuY2VTaXplID0gMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXJyYXlfSW5zdGFuY2VTaXplID0gMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQXJyYXlfaGVhZGVyX3NpemUgPSAyNDsKQEAgLTQxMTEsMTQzICs0MTQzLDE0NyBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1N1YnR5cGVUZXN0Q2FjaGVfY2FjaGVfb2Zmc2V0ID0gNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSAzNjg7CisgICAgQU9UX1RocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX2V4Y2VwdGlvbl9vZmZzZXQgPSA3MDA7CisgICAgQU9UX1RocmVhZF9hY3RpdmVfZXhjZXB0aW9uX29mZnNldCA9IDcxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gNzA0OworICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gNzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2MDsKKyAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTc2OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjcyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI4MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTgwOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjc2OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTg0OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMTg4OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAxOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAxOTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDIwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0KLSAgICA3MzY7CisgICAgNzQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9hc3luY19zdGFja190cmFjZV9vZmZzZXQgPSA5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjg7CisgICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfZmFsc2Vfb2Zmc2V0ID0KICAgICAxMjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9ib29sX3RydWVfb2Zmc2V0ID0gMTE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOworICAgIEFPVF9UaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKKyAgICBBT1RfVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2NhbGxfdG9fcnVudGltZV9zdHViX29mZnNldCA9IDE0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9Ci0gICAgNzQ0OworICAgIDc1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZGlzcGF0Y2hfdGFibGVfYXJyYXlfb2Zmc2V0ID0gNDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDMwNDsKKyAgICAzMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9Ci0gICAgMjIwOworICAgIDIyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSAzMDg7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX2VudHJ5X29mZnNldCA9IDMxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9zdHViX29mZnNldCA9IDIyNDsKKyAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSAyMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2RvdWJsZV9hYnNfYWRkcmVzc19vZmZzZXQgPSAzNDg7CisgICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gMzU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzQ0OworICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2VuZF9vZmZzZXQgPSA1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjQ0OworICAgIEFPVF9UaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9leGVjdXRpb25fc3RhdGVfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDczMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNDg7CisgICAgQU9UX1RocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTI7CisgICAgQU9UX1RocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzEyOworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maXhfYWxsb2NhdGlvbl9zdHViX2NvZGVfb2Zmc2V0ID0gMTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maXhfY2FsbGVyc190YXJnZXRfY29kZV9vZmZzZXQgPSAxMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOworICAgIEFPVF9UaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1NjsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0gMzUyOworICAgIEFPVF9UaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDM2NDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gMzcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gNzA4OworICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDcyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzMyOworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAxNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAxNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gNzMyOworICAgIEFPVF9UaHJlYWRfZXhpdF90aHJvdWdoX2ZmaV9vZmZzZXQgPSA3NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9pc29sYXRlX29mZnNldCA9IDQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maWVsZF90YWJsZV92YWx1ZXNfb2Zmc2V0ID0gNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMjg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gMjM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyMzI7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDA7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gMjk2OworICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzAwOworICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDIwNDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMjEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjQ7CisgICAgQU9UX1RocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY0Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4MDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vYmplY3RfbnVsbF9vZmZzZXQgPQogICAgIDExMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gMzM2Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDcxMjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDM0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSA3MjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDcxNjsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDcyNDsKKyAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjM2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTQyNTUsMTMgKzQyOTEsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDMwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDA7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg4OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE5NjsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9zdG9yZV9idWZmZXJfYmxvY2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTQyNzUsMTEgKzQzMTEsMTEgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9IDEyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNTY7CisgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9IDQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfY2FsbGJhY2tfY29kZV9vZmZzZXQgPQotICAgIDcyODsKKyAgICA3NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9Ud29CeXRlU3RyaW5nX2RhdGFfb2Zmc2V0ID0KQEAgLTQzMjgsNyArNDM2NCw3IEBACiAgICAgNCwgMTIsIDgsIDE2fTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDY2OCwgNjcyLCA2NzYsIDY4MCwgNjg0LCAtMSwgNjg4LCAtMSwgNjkyLCA2OTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworICAgICAgICA2ODAsIDY4NCwgNjg4LCA2OTIsIDY5NiwgLTEsIDcwMCwgLTEsIDcwNCwgNzA4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXBpRXJyb3JfSW5zdGFuY2VTaXplID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfSW5zdGFuY2VTaXplID0gMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FycmF5X2hlYWRlcl9zaXplID0gMTI7CkBAIC00NjQzLDE0NCArNDY3OSwxNDggQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9TdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQwODsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gMTQxNjsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9IDE0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTA0OworICAgIEFPVF9UaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPQotICAgIDE0ODA7CisgICAgMTUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKKyAgICBBT1RfVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPQogICAgIDIyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CisgICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0KLSAgICAxNDk2OworICAgIDE1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7CisgICAgNjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDQyNDsKKyAgICA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0gNjAwOworICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSA2MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0MzI7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gNjgwOworICAgIEFPVF9UaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9IDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY3MjsKKyAgICBBT1RfVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9lbmRfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0NzI7CisgICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPSAxNDQ4OworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDE0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDgwOworICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4OworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcwNDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDY4ODsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3MTI7CisgICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDE0MjQ7CisgICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gMTQ0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4OworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTQ3MjsKKyAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTQ5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NDA7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NjQ7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDE2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU3NjsKKyAgICBBT1RfVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDU4NDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDYwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDQwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOworICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CisgICAgQU9UX1RocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0KICAgICAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPQotICAgIDE0MzI7CisgICAgMTQ1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTQ0MDsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSAxNDU2OworICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDE0ODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTQ3ODgsMTMgKzQ4MjgsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzg0OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtNDgwOCwxMSArNDg0OCwxMSBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDQ5NjsKKyAgICBBT1RfVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX21hc2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9Ci0gICAgMTQ2NDsKKyAgICAxNDg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RpbWVsaW5lU3RyZWFtX2VuYWJsZWRfb2Zmc2V0ID0gMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1R3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPQpAQCAtNDg2MSw4ICs0OTAxLDggQEAKICAgICA4LCAyNCwgMTYsIDMyfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIC0xLCAgIC0xLCAgIDEzNTIsIDEzNjAsCi0gICAgICAgIDEzNjgsIDEzNzYsIDEzODQsIC0xLCAgIDEzOTIsIDE0MDAsIC0xLCAgIC0xfTsKKyAgICAgICAgMTM0NCwgMTM1MiwgMTM2MCwgMTM2OCwgLTEsICAgLTEsICAgMTM3NiwgMTM4NCwKKyAgICAgICAgMTM5MiwgMTQwMCwgMTQwOCwgLTEsICAgMTQxNiwgMTQyNCwgLTEsICAgLTF9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9BcGlFcnJvcl9JbnN0YW5jZVNpemUgPSAxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfSW5zdGFuY2VTaXplID0gMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FycmF5X2hlYWRlcl9zaXplID0gMjQ7CkBAIC01MTgxLDE0NCArNTIyMSwxNDggQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9TdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQ4MDsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gMTQ4ODsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9IDE1MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTA0OworICAgIEFPVF9UaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPQotICAgIDE1NTI7CisgICAgMTU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKKyAgICBBT1RfVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPQogICAgIDIyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CisgICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0KLSAgICAxNTY4OworICAgIDE1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7CisgICAgNjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDQyNDsKKyAgICA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0gNjAwOworICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSA2MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0MzI7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gNjgwOworICAgIEFPVF9UaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9IDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY3MjsKKyAgICBBT1RfVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9lbmRfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0NzI7CisgICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPSAxNTIwOworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDE1NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDgwOworICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4OworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcwNDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDY4ODsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3MTI7CisgICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDE0OTY7CisgICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gMTUyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4OworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTU0NDsKKyAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTU2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NDA7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NjQ7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDE2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU3NjsKKyAgICBBT1RfVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDU4NDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDYwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDQwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOworICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CisgICAgQU9UX1RocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0KICAgICAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPQotICAgIDE1MDQ7CisgICAgMTUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTUxMjsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE1MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSAxNTI4OworICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDE1NTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTUzMjYsMTMgKzUzNzAsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzg0OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtNTM0NiwxMSArNTM5MCwxMSBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDQ5NjsKKyAgICBBT1RfVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX21hc2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9Ci0gICAgMTUzNjsKKyAgICAxNTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RpbWVsaW5lU3RyZWFtX2VuYWJsZWRfb2Zmc2V0ID0gMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1R3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPQpAQCAtNTM5OSw5ICs1NDQzLDkgQEAKICAgICA4LCAyNCwgMTYsIDMyfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsCi0gICAgICAgIDE0MDgsIDE0MTYsIDE0MjQsIDE0MzIsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NDAsIDE0NDgsIC0xLAotICAgICAgICAtMSwgICAxNDU2LCAxNDY0LCAxNDcyLCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CisgICAgICAgIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsIDE0MDgsIDE0MTYsIDE0MjQsCisgICAgICAgIDE0MzIsIDE0NDAsIDE0NDgsIDE0NTYsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NjQsIDE0NzIsIC0xLAorICAgICAgICAtMSwgICAxNDgwLCAxNDg4LCAxNDk2LCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FwaUVycm9yX0luc3RhbmNlU2l6ZSA9IDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9BcnJheV9JbnN0YW5jZVNpemUgPSAyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfaGVhZGVyX3NpemUgPSAyNDsKQEAgLTU3MTQsMTQzICs1NzU4LDE0NyBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1N1YnR5cGVUZXN0Q2FjaGVfY2FjaGVfb2Zmc2V0ID0gNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSAzNjg7CisgICAgQU9UX1RocmVhZF9BbGxvY2F0ZUFycmF5X2VudHJ5X3BvaW50X29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX2V4Y2VwdGlvbl9vZmZzZXQgPSA3MDA7CisgICAgQU9UX1RocmVhZF9hY3RpdmVfZXhjZXB0aW9uX29mZnNldCA9IDcxMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gNzA0OworICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gNzE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hcnJheV93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2MDsKKyAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjY4OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTc2OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjcyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI4MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTgwOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfbWludF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjc2OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTg0OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3N0dWJfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9lbnRyeV9wb2ludF9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX3N0dWJfb2Zmc2V0ID0gMTg4OworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAxOTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI4NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfc3R1Yl9vZmZzZXQgPSAxOTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDIwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2FwaV90b3Bfc2NvcGVfb2Zmc2V0ID0KLSAgICA3MzY7CisgICAgNzQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9hc3luY19zdGFja190cmFjZV9vZmZzZXQgPSA5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYXV0b19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjg7CisgICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMzNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfZmFsc2Vfb2Zmc2V0ID0KICAgICAxMjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9ib29sX3RydWVfb2Zmc2V0ID0gMTE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOworICAgIEFPVF9UaHJlYWRfYm9vdHN0cmFwX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDMyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKKyAgICBBT1RfVGhyZWFkX2NhbGxfdG9fcnVudGltZV9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2NhbGxfdG9fcnVudGltZV9zdHViX29mZnNldCA9IDE0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2RhcnRfc3RyZWFtX29mZnNldCA9Ci0gICAgNzQ0OworICAgIDc1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZGlzcGF0Y2hfdGFibGVfYXJyYXlfb2Zmc2V0ID0gNDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPQotICAgIDMwNDsKKyAgICAzMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vcHRpbWl6ZV9zdHViX29mZnNldCA9Ci0gICAgMjIwOworICAgIDIyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSAzMDg7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX2VudHJ5X29mZnNldCA9IDMxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9zdHViX29mZnNldCA9IDIyNDsKKyAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSAyMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2RvdWJsZV9hYnNfYWRkcmVzc19vZmZzZXQgPSAzNDg7CisgICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gMzU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfbmVnYXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzQ0OworICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2VuZF9vZmZzZXQgPSA1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjQ0OworICAgIEFPVF9UaHJlYWRfZW50ZXJfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gMjUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9leGVjdXRpb25fc3RhdGVfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDczMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNDg7CisgICAgQU9UX1RocmVhZF9leGl0X3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSAyNTI7CisgICAgQU9UX1RocmVhZF9jYWxsX25hdGl2ZV90aHJvdWdoX3NhZmVwb2ludF9zdHViX29mZnNldCA9IDI2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzEyOworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maXhfYWxsb2NhdGlvbl9zdHViX2NvZGVfb2Zmc2V0ID0gMTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maXhfY2FsbGVyc190YXJnZXRfY29kZV9vZmZzZXQgPSAxMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOworICAgIEFPVF9UaHJlYWRfZmxvYXRfYWJzb2x1dGVfYWRkcmVzc19vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM1NjsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDM2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0gMzUyOworICAgIEFPVF9UaHJlYWRfZmxvYXRfbm90X2FkZHJlc3Nfb2Zmc2V0ID0gMzYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDM2NDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X3plcm93X2FkZHJlc3Nfb2Zmc2V0ID0gMzcyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gNzA4OworICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDcyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzMyOworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMzQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAxNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAxNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gNzMyOworICAgIEFPVF9UaHJlYWRfZXhpdF90aHJvdWdoX2ZmaV9vZmZzZXQgPSA3NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9pc29sYXRlX29mZnNldCA9IDQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9maWVsZF90YWJsZV92YWx1ZXNfb2Zmc2V0ID0gNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSAyMjg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gMjM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyMzI7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDA7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9tZWdhbW9ycGhpY19jYWxsX2NoZWNrZWRfZW50cnlfb2Zmc2V0ID0gMjk2OworICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzAwOworICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3NfZW50cnlfb2Zmc2V0ID0gMzA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDIwNDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0ID0gMjEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMjQ7CisgICAgQU9UX1RocmVhZF9ub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAzMzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY0Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfbnVsbF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE1MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNjQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE2ODsKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE3MjsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMTY4Oworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCisgICAgQU9UX1RocmVhZF9yYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE4MDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAxNzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9vYmplY3RfbnVsbF9vZmZzZXQgPQogICAgIDExMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcHJlZGVmaW5lZF9zeW1ib2xzX2FkZHJlc3Nfb2Zmc2V0ID0gMzM2Owotc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfcmVzdW1lX3BjX29mZnNldCA9IDcxMjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDM0NDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPSA3MjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDcxNjsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDcyNDsKKyAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gMjM2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSAyNDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDMyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTU4NTgsMTMgKzU5MDYsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDI5MjsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDMwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyMDA7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDIwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjg4OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDE5NjsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjA0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9zdG9yZV9idWZmZXJfYmxvY2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTU4NzgsMTEgKzU5MjYsMTEgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9jb2RlX29mZnNldCA9IDEyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSAyNTY7CisgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDI2NDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl9tYXNrX29mZnNldCA9IDQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfY2FsbGJhY2tfY29kZV9vZmZzZXQgPQotICAgIDcyODsKKyAgICA3NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGltZWxpbmVTdHJlYW1fZW5hYmxlZF9vZmZzZXQgPSA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9Ud29CeXRlU3RyaW5nX2RhdGFfb2Zmc2V0ID0KQEAgLTU5MjgsNyArNTk3Niw3IEBACiAgICAgNCwgMTIsIDgsIDE2fTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDY2OCwgNjcyLCA2NzYsIDY4MCwgNjg0LCAtMSwgNjg4LCAtMSwgNjkyLCA2OTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworICAgICAgICA2ODAsIDY4NCwgNjg4LCA2OTIsIDY5NiwgLTEsIDcwMCwgLTEsIDcwNCwgNzA4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXBpRXJyb3JfSW5zdGFuY2VTaXplID0gODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfSW5zdGFuY2VTaXplID0gMTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FycmF5X2hlYWRlcl9zaXplID0gMTI7CkBAIC02MjM5LDE0NCArNjI4NywxNDggQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9TdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQwODsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gMTQxNjsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9IDE0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTA0OworICAgIEFPVF9UaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPQotICAgIDE0ODA7CisgICAgMTUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKKyAgICBBT1RfVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPQogICAgIDIyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CisgICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0KLSAgICAxNDk2OworICAgIDE1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7CisgICAgNjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDQyNDsKKyAgICA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0gNjAwOworICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSA2MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0MzI7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gNjgwOworICAgIEFPVF9UaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9IDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY3MjsKKyAgICBBT1RfVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9lbmRfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0NzI7CisgICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPSAxNDQ4OworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDE0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDgwOworICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4OworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcwNDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDY4ODsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3MTI7CisgICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDE0MjQ7CisgICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gMTQ0ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4OworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTQ3MjsKKyAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTQ5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NDA7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NjQ7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDE2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU3NjsKKyAgICBBT1RfVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDU4NDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDYwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDQwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOworICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CisgICAgQU9UX1RocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0KICAgICAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPQotICAgIDE0MzI7CisgICAgMTQ1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTQ0MDsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSAxNDU2OworICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDE0ODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTYzODQsMTMgKzY0MzYsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzg0OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtNjQwNCwxMSArNjQ1NiwxMSBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDQ5NjsKKyAgICBBT1RfVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX21hc2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9Ci0gICAgMTQ2NDsKKyAgICAxNDg4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RpbWVsaW5lU3RyZWFtX2VuYWJsZWRfb2Zmc2V0ID0gMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1R3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPQpAQCAtNjQ1NCw4ICs2NTA2LDggQEAKICAgICA4LCAyNCwgMTYsIDMyfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIC0xLCAgIC0xLCAgIDEzNTIsIDEzNjAsCi0gICAgICAgIDEzNjgsIDEzNzYsIDEzODQsIC0xLCAgIDEzOTIsIDE0MDAsIC0xLCAgIC0xfTsKKyAgICAgICAgMTM0NCwgMTM1MiwgMTM2MCwgMTM2OCwgLTEsICAgLTEsICAgMTM3NiwgMTM4NCwKKyAgICAgICAgMTM5MiwgMTQwMCwgMTQwOCwgLTEsICAgMTQxNiwgMTQyNCwgLTEsICAgLTF9Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9BcGlFcnJvcl9JbnN0YW5jZVNpemUgPSAxNjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfSW5zdGFuY2VTaXplID0gMjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FycmF5X2hlYWRlcl9zaXplID0gMjQ7CkBAIC02NzcwLDE0NCArNjgyMiwxNDggQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9TdWJ0eXBlVGVzdENhY2hlX2NhY2hlX29mZnNldCA9IDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX0FsbG9jYXRlQXJyYXlfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNzIwOworICAgIEFPVF9UaHJlYWRfQWxsb2NhdGVBcnJheV9lbnRyeV9wb2ludF9vZmZzZXQgPSA3MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTQ4MDsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9leGNlcHRpb25fb2Zmc2V0ID0gMTUwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWN0aXZlX3N0YWNrdHJhY2Vfb2Zmc2V0ID0gMTQ4ODsKKyAgICBBT1RfVGhyZWFkX2FjdGl2ZV9zdGFja3RyYWNlX29mZnNldCA9IDE1MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfY29kZV9vZmZzZXQgPSAyNDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FycmF5X3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTA0OworICAgIEFPVF9UaHJlYWRfYXJyYXlfd3JpdGVfYmFycmllcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1MjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX21pbnRfd2l0aG91dF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Mjg7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3NfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTQ0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9taW50X3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNjA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9lbnRyeV9wb2ludF9vZmZzZXQgPSA1MzY7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNTI7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc3R1Yl9vZmZzZXQgPSAzNjg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU0NDsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9wYXJhbWV0ZXJpemVkX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3BhcmFtZXRlcml6ZWRfc3R1Yl9vZmZzZXQgPSAzNjA7CisgICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3RfcGFyYW1ldGVyaXplZF9zdHViX29mZnNldCA9IDM3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTUyOworICAgIEFPVF9UaHJlYWRfYWxsb2NhdGVfb2JqZWN0X3Nsb3dfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTY4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hbGxvY2F0ZV9vYmplY3Rfc2xvd19zdHViX29mZnNldCA9IDM2ODsKKyAgICBBT1RfVGhyZWFkX2FsbG9jYXRlX29iamVjdF9zbG93X3N0dWJfb2Zmc2V0ID0gMzg0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYXBpX3RvcF9zY29wZV9vZmZzZXQgPQotICAgIDE1NTI7CisgICAgMTU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfYXN5bmNfc3RhY2tfdHJhY2Vfb2Zmc2V0ID0gMTkyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9hdXRvX3Njb3BlX25hdGl2ZV93cmFwcGVyX2VudHJ5X3BvaW50X29mZnNldCA9IDY0MDsKKyAgICBBT1RfVGhyZWFkX2F1dG9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfYm9vbF9mYWxzZV9vZmZzZXQgPQogICAgIDIyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2Jvb2xfdHJ1ZV9vZmZzZXQgPSAyMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Jvb3RzdHJhcF9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQgPSA2MjQ7CisgICAgQU9UX1RocmVhZF9ib290c3RyYXBfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9jYWxsX3RvX3J1bnRpbWVfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOworICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX2VudHJ5X3BvaW50X29mZnNldCA9IDUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfY2FsbF90b19ydW50aW1lX3N0dWJfb2Zmc2V0ID0gMjgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfZGFydF9zdHJlYW1fb2Zmc2V0ID0KLSAgICAxNTY4OworICAgIDE1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2Rpc3BhdGNoX3RhYmxlX2FycmF5X29mZnNldCA9IDk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0KLSAgICA1OTI7CisgICAgNjA4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb3B0aW1pemVfc3R1Yl9vZmZzZXQgPQotICAgIDQyNDsKKyAgICA0NDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfZW50cnlfb2Zmc2V0ID0gNjAwOworICAgIEFPVF9UaHJlYWRfZGVvcHRpbWl6ZV9lbnRyeV9vZmZzZXQgPSA2MTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Rlb3B0aW1pemVfc3R1Yl9vZmZzZXQgPSA0MzI7CisgICAgQU9UX1RocmVhZF9kZW9wdGltaXplX3N0dWJfb2Zmc2V0ID0gNDQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9kb3VibGVfYWJzX2FkZHJlc3Nfb2Zmc2V0ID0gNjgwOworICAgIEFPVF9UaHJlYWRfZG91YmxlX2Fic19hZGRyZXNzX29mZnNldCA9IDY5NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZG91YmxlX25lZ2F0ZV9hZGRyZXNzX29mZnNldCA9IDY3MjsKKyAgICBBT1RfVGhyZWFkX2RvdWJsZV9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9lbmRfb2Zmc2V0ID0gMTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0NzI7CisgICAgQU9UX1RocmVhZF9lbnRlcl9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0ODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4ZWN1dGlvbl9zdGF0ZV9vZmZzZXQgPSAxNTIwOworICAgIEFPVF9UaHJlYWRfZXhlY3V0aW9uX3N0YXRlX29mZnNldCA9IDE1NDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDgwOworICAgIEFPVF9UaHJlYWRfZXhpdF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA0OTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X3N0dWJfb2Zmc2V0ID0gNDg4OworICAgIEFPVF9UaHJlYWRfY2FsbF9uYXRpdmVfdGhyb3VnaF9zYWZlcG9pbnRfc3R1Yl9vZmZzZXQgPSA1MDQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYwODsKKyAgICBBT1RfVGhyZWFkX2NhbGxfbmF0aXZlX3Rocm91Z2hfc2FmZXBvaW50X2VudHJ5X3BvaW50X29mZnNldCA9IDYyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2FsbG9jYXRpb25fc3R1Yl9jb2RlX29mZnNldCA9IDI1NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfZml4X2NhbGxlcnNfdGFyZ2V0X2NvZGVfb2Zmc2V0ID0gMjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9hYnNvbHV0ZV9hZGRyZXNzX29mZnNldCA9IDcwNDsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X2Fic29sdXRlX2FkZHJlc3Nfb2Zmc2V0ID0gNzIwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA2OTY7CisgICAgQU9UX1RocmVhZF9mbG9hdF9uZWdhdGVfYWRkcmVzc19vZmZzZXQgPSA3MTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDY4ODsKKyAgICBBT1RfVGhyZWFkX2Zsb2F0X25vdF9hZGRyZXNzX29mZnNldCA9IDcwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZmxvYXRfemVyb3dfYWRkcmVzc19vZmZzZXQgPSA3MTI7CisgICAgQU9UX1RocmVhZF9mbG9hdF96ZXJvd19hZGRyZXNzX29mZnNldCA9IDcyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfZ2xvYmFsX29iamVjdF9wb29sX29mZnNldCA9IDE0OTY7CisgICAgQU9UX1RocmVhZF9nbG9iYWxfb2JqZWN0X3Bvb2xfb2Zmc2V0ID0gMTUyMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4OworICAgIEFPVF9UaHJlYWRfaW50ZXJwcmV0X2NhbGxfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjY0Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9pbnZva2VfZGFydF9jb2RlX2Zyb21fYnl0ZWNvZGVfc3R1Yl9vZmZzZXQgPSAyNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ludm9rZV9kYXJ0X2NvZGVfc3R1Yl9vZmZzZXQgPSAyNjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTU0NDsKKyAgICBBT1RfVGhyZWFkX2V4aXRfdGhyb3VnaF9mZmlfb2Zmc2V0ID0gMTU2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX2lzb2xhdGVfb2Zmc2V0ID0gODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX2ZpZWxkX3RhYmxlX3ZhbHVlc19vZmZzZXQgPSAxMzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfZGVvcHRfZnJvbV9yZXR1cm5fc3R1Yl9vZmZzZXQgPSA0NDA7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fcmV0dXJuX3N0dWJfb2Zmc2V0ID0gNDU2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NDg7CisgICAgQU9UX1RocmVhZF9sYXp5X2Rlb3B0X2Zyb21fdGhyb3dfc3R1Yl9vZmZzZXQgPSA0NjQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX2xhenlfc3BlY2lhbGl6ZV90eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NjQ7CisgICAgQU9UX1RocmVhZF9sYXp5X3NwZWNpYWxpemVfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDgwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9tYXJraW5nX3N0YWNrX2Jsb2NrX29mZnNldCA9IDE2ODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbWVnYW1vcnBoaWNfY2FsbF9jaGVja2VkX2VudHJ5X29mZnNldCA9IDU3NjsKKyAgICBBT1RfVGhyZWFkX21lZ2Ftb3JwaGljX2NhbGxfY2hlY2tlZF9lbnRyeV9vZmZzZXQgPSA1OTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDU4NDsKKyAgICBBT1RfVGhyZWFkX3N3aXRjaGFibGVfY2FsbF9taXNzX2VudHJ5X29mZnNldCA9IDYwMDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3dpdGNoYWJsZV9jYWxsX21pc3Nfc3R1Yl9vZmZzZXQgPSAzOTI7CisgICAgQU9UX1RocmVhZF9zd2l0Y2hhYmxlX2NhbGxfbWlzc19zdHViX29mZnNldCA9IDQwODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjMyOworICAgIEFPVF9UaHJlYWRfbm9fc2NvcGVfbmF0aXZlX3dyYXBwZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNjQ4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMjk2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMxMjsKLXN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7Ci1zdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKICAgICBBT1RfVGhyZWFkX251bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAyODg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzEyOworc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF9udWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMwNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjA7CisgICAgQU9UX1RocmVhZF9udWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzMjg7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX251bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDMyMDsKK3N0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAorICAgIEFPVF9UaHJlYWRfcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNDQ7CitzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKKyAgICBBT1RfVGhyZWFkX3JhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzM2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9UaHJlYWRfb2JqZWN0X251bGxfb2Zmc2V0ID0KICAgICAyMDg7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY1NjsKKyAgICBBT1RfVGhyZWFkX3ByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCA9IDY3MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3Jlc3VtZV9wY19vZmZzZXQgPQotICAgIDE1MDQ7CisgICAgMTUyODsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc2F2ZWRfc2hhZG93X2NhbGxfc3RhY2tfb2Zmc2V0ID0gMTUxMjsKKyAgICBBT1RfVGhyZWFkX3NhdmVkX3NoYWRvd19jYWxsX3N0YWNrX29mZnNldCA9IDE1MzY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3NhZmVwb2ludF9zdGF0ZV9vZmZzZXQgPSAxNTI4OworICAgIEFPVF9UaHJlYWRfc2FmZXBvaW50X3N0YXRlX29mZnNldCA9IDE1NTI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X3N0dWJfb2Zmc2V0ID0gNDU2OworICAgIEFPVF9UaHJlYWRfc2xvd190eXBlX3Rlc3Rfc3R1Yl9vZmZzZXQgPSA0NzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYxNjsKKyAgICBBT1RfVGhyZWFkX3Nsb3dfdHlwZV90ZXN0X2VudHJ5X3BvaW50X29mZnNldCA9IDYzMjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfVGhyZWFkX3N0YWNrX2xpbWl0X29mZnNldCA9CiAgICAgNzI7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKQEAgLTY5MTUsMTMgKzY5NzEsMTMgQEAKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfZmxhZ3Nfb2Zmc2V0ID0gMTI4Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1Njg7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aF9mcHVfcmVnc19lbnRyeV9wb2ludF9vZmZzZXQgPSA1ODQ7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0ID0gMzg0OworICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSA0MDA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQKLSAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU2MDsKKyAgICBBT1RfVGhyZWFkX3N0YWNrX292ZXJmbG93X3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX2VudHJ5X3BvaW50X29mZnNldCA9IDU3NjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAotICAgIEFPVF9UaHJlYWRfc3RhY2tfb3ZlcmZsb3dfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQgPSAzNzY7CisgICAgQU9UX1RocmVhZF9zdGFja19vdmVyZmxvd19zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCA9IDM5MjsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfc3RvcmVfYnVmZmVyX2Jsb2NrX29mZnNldCA9IDE2MDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZApAQCAtNjkzNSwxMSArNjk5MSwxMSBAQAogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2NvZGVfb2Zmc2V0ID0gMjMyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCi0gICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX2VudHJ5X3BvaW50X29mZnNldCA9IDQ5NjsKKyAgICBBT1RfVGhyZWFkX3dyaXRlX2JhcnJpZXJfZW50cnlfcG9pbnRfb2Zmc2V0ID0gNTEyOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RocmVhZF93cml0ZV9iYXJyaWVyX21hc2tfb2Zmc2V0ID0gODA7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1RocmVhZF9jYWxsYmFja19jb2RlX29mZnNldCA9Ci0gICAgMTUzNjsKKyAgICAxNTYwOwogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkCiAgICAgQU9UX1RpbWVsaW5lU3RyZWFtX2VuYWJsZWRfb2Zmc2V0ID0gMTY7CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX1R3b0J5dGVTdHJpbmdfZGF0YV9vZmZzZXQgPQpAQCAtNjk4NSw5ICs3MDQxLDkgQEAKICAgICA4LCAyNCwgMTYsIDMyfTsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZAogICAgIEFPVF9UaHJlYWRfd3JpdGVfYmFycmllcl93cmFwcGVyc190aHJlYWRfb2Zmc2V0W10gPSB7Ci0gICAgICAgIDEzMjAsIDEzMjgsIDEzMzYsIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsCi0gICAgICAgIDE0MDgsIDE0MTYsIDE0MjQsIDE0MzIsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NDAsIDE0NDgsIC0xLAotICAgICAgICAtMSwgICAxNDU2LCAxNDY0LCAxNDcyLCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CisgICAgICAgIDEzNDQsIDEzNTIsIDEzNjAsIDEzNjgsIDEzNzYsIDEzODQsIDEzOTIsIDE0MDAsIDE0MDgsIDE0MTYsIDE0MjQsCisgICAgICAgIDE0MzIsIDE0NDAsIDE0NDgsIDE0NTYsIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIDE0NjQsIDE0NzIsIC0xLAorICAgICAgICAtMSwgICAxNDgwLCAxNDg4LCAxNDk2LCAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMX07CiBzdGF0aWMgY29uc3RleHByIGRhcnQ6OmNvbXBpbGVyOjp0YXJnZXQ6OndvcmQgQU9UX0FwaUVycm9yX0luc3RhbmNlU2l6ZSA9IDE2Owogc3RhdGljIGNvbnN0ZXhwciBkYXJ0Ojpjb21waWxlcjo6dGFyZ2V0Ojp3b3JkIEFPVF9BcnJheV9JbnN0YW5jZVNpemUgPSAyNDsKIHN0YXRpYyBjb25zdGV4cHIgZGFydDo6Y29tcGlsZXI6OnRhcmdldDo6d29yZCBBT1RfQXJyYXlfaGVhZGVyX3NpemUgPSAyNDsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvcnVudGltZV9vZmZzZXRzX2xpc3QuaCBiL3J1bnRpbWUvdm0vY29tcGlsZXIvcnVudGltZV9vZmZzZXRzX2xpc3QuaAppbmRleCAzY2JiMTlkLi45NThhZGMxIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvbXBpbGVyL3J1bnRpbWVfb2Zmc2V0c19saXN0LmgKKysrIGIvcnVudGltZS92bS9jb21waWxlci9ydW50aW1lX29mZnNldHNfbGlzdC5oCkBAIC0yMDQsMTIgKzIwNCwxNCBAQAogICBGSUVMRChUaHJlYWQsIHN3aXRjaGFibGVfY2FsbF9taXNzX3N0dWJfb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgRklFTEQoVGhyZWFkLCBub19zY29wZV9uYXRpdmVfd3JhcHBlcl9lbnRyeV9wb2ludF9vZmZzZXQpICAgICAgICAgICAgICAgICAgICBcCiAgIEZJRUxEKFRocmVhZCwgbnVsbF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCkgICAgICAgICAgICAgICAgICAgXAotICBGSUVMRChUaHJlYWQsIG51bGxfYXJnX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KSAgICAgICAgICAgICAgIFwKLSAgRklFTEQoVGhyZWFkLCByYW5nZV9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBGSUVMRChUaHJlYWQsIG51bGxfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQpICAgICAgICAgICAgICAgIFwKKyAgRklFTEQoVGhyZWFkLCBudWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCkgICAgICAgICAgICAgICBcCiAgIEZJRUxEKFRocmVhZCwgbnVsbF9hcmdfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQpICAgICAgICAgICAgXAorICBGSUVMRChUaHJlYWQsIG51bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCkgICAgICAgICAgICAgIFwKKyAgRklFTEQoVGhyZWFkLCBudWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQpICAgICAgICAgICBcCisgIEZJRUxEKFRocmVhZCwgcmFuZ2VfZXJyb3Jfc2hhcmVkX3dpdGhfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQpICAgICAgICAgICAgICAgICAgXAogICBGSUVMRChUaHJlYWQsIHJhbmdlX2Vycm9yX3NoYXJlZF93aXRob3V0X2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEZJRUxEKFRocmVhZCwgb2JqZWN0X251bGxfb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBGSUVMRChUaHJlYWQsIHByZWRlZmluZWRfc3ltYm9sc19hZGRyZXNzX29mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgRklFTEQoVGhyZWFkLCByZXN1bWVfcGNfb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyL3N0dWJfY29kZV9jb21waWxlcl9hcm0uY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3N0dWJfY29kZV9jb21waWxlcl9hcm0uY2MKaW5kZXggNjc1ZGIxNi4uZTg1OGM3ZCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfYXJtLmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvc3R1Yl9jb2RlX2NvbXBpbGVyX2FybS5jYwpAQCAtNTIzLDYgKzUyMywyMiBAQAogICAgICAgLyphbGxvd19yZXR1cm49Ki9mYWxzZSk7CiB9CiAKK3ZvaWQgU3R1YkNvZGVDb21waWxlcjo6R2VuZXJhdGVOdWxsQ2FzdEVycm9yU2hhcmVkV2l0aG91dEZQVVJlZ3NTdHViKAorICAgIEFzc2VtYmxlciogYXNzZW1ibGVyKSB7CisgIEdlbmVyYXRlU2hhcmVkU3R1YigKKyAgICAgIGFzc2VtYmxlciwgLypzYXZlX2ZwdV9yZWdpc3RlcnM9Ki9mYWxzZSwgJmtOdWxsQ2FzdEVycm9yUnVudGltZUVudHJ5LAorICAgICAgdGFyZ2V0OjpUaHJlYWQ6Om51bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViX29mZnNldCgpLAorICAgICAgLyphbGxvd19yZXR1cm49Ki9mYWxzZSk7Cit9CisKK3ZvaWQgU3R1YkNvZGVDb21waWxlcjo6R2VuZXJhdGVOdWxsQ2FzdEVycm9yU2hhcmVkV2l0aEZQVVJlZ3NTdHViKAorICAgIEFzc2VtYmxlciogYXNzZW1ibGVyKSB7CisgIEdlbmVyYXRlU2hhcmVkU3R1YigKKyAgICAgIGFzc2VtYmxlciwgLypzYXZlX2ZwdV9yZWdpc3RlcnM9Ki90cnVlLCAma051bGxDYXN0RXJyb3JSdW50aW1lRW50cnksCisgICAgICB0YXJnZXQ6OlRocmVhZDo6bnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfb2Zmc2V0KCksCisgICAgICAvKmFsbG93X3JldHVybj0qL2ZhbHNlKTsKK30KKwogc3RhdGljIHZvaWQgR2VuZXJhdGVSYW5nZUVycm9yKEFzc2VtYmxlciogYXNzZW1ibGVyLCBib29sIHdpdGhfZnB1X3JlZ3MpIHsKICAgYXV0byBwZXJmb3JtX3J1bnRpbWVfY2FsbCA9IFsmXSgpIHsKICAgICBBU1NFUlQoIUdlbmVyaWNDaGVja0JvdW5kSW5zdHI6OlVzZVVuYm94ZWRSZXByZXNlbnRhdGlvbigpKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vY29tcGlsZXIvc3R1Yl9jb2RlX2NvbXBpbGVyX2FybTY0LmNjIGIvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfYXJtNjQuY2MKaW5kZXggMzJlYzJiMC4uMjBlYjk3MCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfYXJtNjQuY2MKKysrIGIvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfYXJtNjQuY2MKQEAgLTU4MCw2ICs1ODAsMjIgQEAKICAgICAgIC8qYWxsb3dfcmV0dXJuPSovZmFsc2UpOwogfQogCit2b2lkIFN0dWJDb2RlQ29tcGlsZXI6OkdlbmVyYXRlTnVsbENhc3RFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzU3R1YigKKyAgICBBc3NlbWJsZXIqIGFzc2VtYmxlcikgeworICBHZW5lcmF0ZVNoYXJlZFN0dWIoCisgICAgICBhc3NlbWJsZXIsIC8qc2F2ZV9mcHVfcmVnaXN0ZXJzPSovZmFsc2UsICZrTnVsbENhc3RFcnJvclJ1bnRpbWVFbnRyeSwKKyAgICAgIHRhcmdldDo6VGhyZWFkOjpudWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQoKSwKKyAgICAgIC8qYWxsb3dfcmV0dXJuPSovZmFsc2UpOworfQorCit2b2lkIFN0dWJDb2RlQ29tcGlsZXI6OkdlbmVyYXRlTnVsbENhc3RFcnJvclNoYXJlZFdpdGhGUFVSZWdzU3R1YigKKyAgICBBc3NlbWJsZXIqIGFzc2VtYmxlcikgeworICBHZW5lcmF0ZVNoYXJlZFN0dWIoCisgICAgICBhc3NlbWJsZXIsIC8qc2F2ZV9mcHVfcmVnaXN0ZXJzPSovdHJ1ZSwgJmtOdWxsQ2FzdEVycm9yUnVudGltZUVudHJ5LAorICAgICAgdGFyZ2V0OjpUaHJlYWQ6Om51bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCgpLAorICAgICAgLyphbGxvd19yZXR1cm49Ki9mYWxzZSk7Cit9CisKIHN0YXRpYyB2b2lkIEdlbmVyYXRlUmFuZ2VFcnJvcihBc3NlbWJsZXIqIGFzc2VtYmxlciwgYm9vbCB3aXRoX2ZwdV9yZWdzKSB7CiAgIGF1dG8gcGVyZm9ybV9ydW50aW1lX2NhbGwgPSBbJl0oKSB7CiAgICAgLy8gSWYgdGhlIGdlbmVyYXRlZCBjb2RlIGhhcyB1bmJveGVkIGluZGV4L2xlbmd0aCB3ZSBuZWVkIHRvIGJveCB0aGVtIGJlZm9yZQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfaWEzMi5jYyBiL3J1bnRpbWUvdm0vY29tcGlsZXIvc3R1Yl9jb2RlX2NvbXBpbGVyX2lhMzIuY2MKaW5kZXggYTYxZjgzZC4uNjY0OWRmNCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfaWEzMi5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3N0dWJfY29kZV9jb21waWxlcl9pYTMyLmNjCkBAIC0zMjMsNiArMzIzLDE3IEBACiAgICAgQXNzZW1ibGVyKiBhc3NlbWJsZXIpIHsKICAgX18gQnJlYWtwb2ludCgpOwogfQorCit2b2lkIFN0dWJDb2RlQ29tcGlsZXI6OkdlbmVyYXRlTnVsbENhc3RFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzU3R1YigKKyAgICBBc3NlbWJsZXIqIGFzc2VtYmxlcikgeworICBfXyBCcmVha3BvaW50KCk7Cit9CisKK3ZvaWQgU3R1YkNvZGVDb21waWxlcjo6R2VuZXJhdGVOdWxsQ2FzdEVycm9yU2hhcmVkV2l0aEZQVVJlZ3NTdHViKAorICAgIEFzc2VtYmxlciogYXNzZW1ibGVyKSB7CisgIF9fIEJyZWFrcG9pbnQoKTsKK30KKwogdm9pZCBTdHViQ29kZUNvbXBpbGVyOjpHZW5lcmF0ZVJhbmdlRXJyb3JTaGFyZWRXaXRob3V0RlBVUmVnc1N0dWIoCiAgICAgQXNzZW1ibGVyKiBhc3NlbWJsZXIpIHsKICAgX18gQnJlYWtwb2ludCgpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfeDY0LmNjIGIvcnVudGltZS92bS9jb21waWxlci9zdHViX2NvZGVfY29tcGlsZXJfeDY0LmNjCmluZGV4IGU3NTgzODYuLjIzZWMzNDIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29tcGlsZXIvc3R1Yl9jb2RlX2NvbXBpbGVyX3g2NC5jYworKysgYi9ydW50aW1lL3ZtL2NvbXBpbGVyL3N0dWJfY29kZV9jb21waWxlcl94NjQuY2MKQEAgLTUxNiw2ICs1MTYsMjIgQEAKICAgICAgIC8qYWxsb3dfcmV0dXJuPSovZmFsc2UpOwogfQogCit2b2lkIFN0dWJDb2RlQ29tcGlsZXI6OkdlbmVyYXRlTnVsbENhc3RFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzU3R1YigKKyAgICBBc3NlbWJsZXIqIGFzc2VtYmxlcikgeworICBHZW5lcmF0ZVNoYXJlZFN0dWIoCisgICAgICBhc3NlbWJsZXIsIC8qc2F2ZV9mcHVfcmVnaXN0ZXJzPSovZmFsc2UsICZrTnVsbENhc3RFcnJvclJ1bnRpbWVFbnRyeSwKKyAgICAgIHRhcmdldDo6VGhyZWFkOjpudWxsX2Nhc3RfZXJyb3Jfc2hhcmVkX3dpdGhvdXRfZnB1X3JlZ3Nfc3R1Yl9vZmZzZXQoKSwKKyAgICAgIC8qYWxsb3dfcmV0dXJuPSovZmFsc2UpOworfQorCit2b2lkIFN0dWJDb2RlQ29tcGlsZXI6OkdlbmVyYXRlTnVsbENhc3RFcnJvclNoYXJlZFdpdGhGUFVSZWdzU3R1YigKKyAgICBBc3NlbWJsZXIqIGFzc2VtYmxlcikgeworICBHZW5lcmF0ZVNoYXJlZFN0dWIoCisgICAgICBhc3NlbWJsZXIsIC8qc2F2ZV9mcHVfcmVnaXN0ZXJzPSovdHJ1ZSwgJmtOdWxsQ2FzdEVycm9yUnVudGltZUVudHJ5LAorICAgICAgdGFyZ2V0OjpUaHJlYWQ6Om51bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViX29mZnNldCgpLAorICAgICAgLyphbGxvd19yZXR1cm49Ki9mYWxzZSk7Cit9CisKIHN0YXRpYyB2b2lkIEdlbmVyYXRlUmFuZ2VFcnJvcihBc3NlbWJsZXIqIGFzc2VtYmxlciwgYm9vbCB3aXRoX2ZwdV9yZWdzKSB7CiAgIGF1dG8gcGVyZm9ybV9ydW50aW1lX2NhbGwgPSBbJl0oKSB7CiAgICAgLy8gSWYgdGhlIGdlbmVyYXRlZCBjb2RlIGhhcyB1bmJveGVkIGluZGV4L2xlbmd0aCB3ZSBuZWVkIHRvIGJveCB0aGVtIGJlZm9yZQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jcHVfYXJtLmNjIGIvcnVudGltZS92bS9jcHVfYXJtLmNjCmluZGV4IGM5ZGNkYzUuLmE1NDE5MzQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY3B1X2FybS5jYworKysgYi9ydW50aW1lL3ZtL2NwdV9hcm0uY2MKQEAgLTI0LDggKzI0LDcgQEAKICNlbmRpZgogCiAvLyBBUk0gdmVyc2lvbiBkaWZmZXJlbmNlcy4KLS8vIFdlIHN1cHBvcnQgdHdvIG1ham9yIDMyLWJpdCBBUk0gSVNBIHZlcnNpb25zOiBBUk12NiBhbmQgdmFyaWFudHMsCi0vLyBhbmQgQVJNdjcgYW5kIHZhcmlhbnRzLiBGb3IgZWFjaCBvZiB0aGVzZSB3ZSBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIHZmcCwKKy8vIFdlIHN1cHBvcnQgb25seSBBUk12NyBhbmQgdmFyaWFudHMuIFdlIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgdmZwLAogLy8gbmVvbiwgYW5kIGludGVnZXIgZGl2aXNpb24gaW5zdHJ1Y3Rpb25zLiBDb25zaWRlcmluZyBBUk12NVRFIGFzIHRoZSBiYXNlbGluZSwKIC8vIGxhdGVyIHZlcnNpb25zIGFkZCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzL2luc3RydWN0aW9ucyB0aGF0IHdlIHVzZToKIC8vCkBAIC00MSwzNyArNDAsMjEgQEAKIC8vCiAvLyBJZiBhbiBhYXJjaDY0IENQVSBpcyBkZXRlY3RlZCwgd2UgZ2VuZXJhdGUgQVJNdjcgY29kZS4KIC8vCi0vLyBJZiBhbiBpbnN0cnVjdGlvbiBpcyBtaXNzaW5nIG9uIEFSTXY2LCB3ZSBlbXVsYXRlIGl0LCBpZiBwb3NzaWJsZS4KIC8vIFdoZXJlIHdlIGFyZSBtaXNzaW5nIHZmcCwgd2UgZG8gbm90IHVuYm94IGRvdWJsZXMsIG9yIGdlbmVyYXRlIGludHJpbnNpY3MgZm9yCiAvLyBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLiBXaGVyZSB3ZSBhcmUgbWlzc2luZyBuZW9uLCB3ZSBkbyBub3QgdW5ib3ggU0lNRAogLy8gdmFsdWVzLCBvciBpbmxpbmUgb3BlcmF0aW9ucyBvbiBTSU1EIHZhbHVlcy4gV2hlcmUgd2UgYXJlIG1pc3NpbmcgaW50ZWdlcgogLy8gZGl2aXNpb24sIHdlIGRvIG5vdCBpbmxpbmUgZGl2aXNpb24gb3BlcmF0aW9ucywgYW5kIHdlIGRvIG5vdCBnZW5lcmF0ZQogLy8gaW50cmluc2ljcyB0aGF0IGRvIGRpdmlzaW9uLiBTZWUgdGhlIGZlYXR1cmUgdGVzdHMgaW4gZmxvd19ncmFwaF9vcHRpbWl6ZXIuY2MKIC8vIGZvciBkZXRhaWxzLgotLy8KLS8vIEFsaWdubWVudDoKLS8vCi0vLyBPbiBBUk12NiBhbmQgb24sIHdlIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgaXMgc2V0IHVwIHRvIGZpeHVwIHVuYWxpZ25lZAotLy8gYWNjZXNzZXMuIFRoaXMgY2FuIGJlIHZlcmlmaWVkIGJ5IGNoZWNraW5nIC9wcm9jL2NwdS9hbGlnbm1lbnQgb24gbW9kZXJuCi0vLyBMaW51eCBzeXN0ZW1zLgogCiBuYW1lc3BhY2UgZGFydCB7CiAKLSNpZiBkZWZpbmVkKFRBUkdFVF9BUkNIX0FSTV82KQotREVGSU5FX0ZMQUcoYm9vbCwgdXNlX3ZmcCwgdHJ1ZSwgIlVzZSB2ZnAgaW5zdHJ1Y3Rpb25zIGlmIHN1cHBvcnRlZCIpOwotREVGSU5FX0ZMQUcoYm9vbCwgdXNlX25lb24sIGZhbHNlLCAiVXNlIG5lb24gaW5zdHJ1Y3Rpb25zIGlmIHN1cHBvcnRlZCIpOwotREVGSU5FX0ZMQUcoYm9vbCwKLSAgICAgICAgICAgIHVzZV9pbnRlZ2VyX2RpdmlzaW9uLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAiVXNlIGludGVnZXIgZGl2aXNpb24gaW5zdHJ1Y3Rpb24gaWYgc3VwcG9ydGVkIik7Ci0jZWxzZQogREVGSU5FX0ZMQUcoYm9vbCwgdXNlX3ZmcCwgdHJ1ZSwgIlVzZSB2ZnAgaW5zdHJ1Y3Rpb25zIGlmIHN1cHBvcnRlZCIpOwogREVGSU5FX0ZMQUcoYm9vbCwgdXNlX25lb24sIHRydWUsICJVc2UgbmVvbiBpbnN0cnVjdGlvbnMgaWYgc3VwcG9ydGVkIik7CiBERUZJTkVfRkxBRyhib29sLAogICAgICAgICAgICAgdXNlX2ludGVnZXJfZGl2aXNpb24sCiAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgIlVzZSBpbnRlZ2VyIGRpdmlzaW9uIGluc3RydWN0aW9uIGlmIHN1cHBvcnRlZCIpOwotI2VuZGlmCiAKICNpZiBkZWZpbmVkKFRBUkdFVF9IT1NUX01JU01BVENIKQogI2lmIGRlZmluZWQoVEFSR0VUX09TX0FORFJPSUQpIHx8IGRlZmluZWQoVEFSR0VUX09TX0lPUykKQEAgLTEyNiw3ICsxMDksNiBAQAogYm9vbCBIb3N0Q1BVRmVhdHVyZXM6Om5lb25fc3VwcG9ydGVkXyA9IGZhbHNlOwogYm9vbCBIb3N0Q1BVRmVhdHVyZXM6OmhhcmRmcF9zdXBwb3J0ZWRfID0gZmFsc2U7CiBjb25zdCBjaGFyKiBIb3N0Q1BVRmVhdHVyZXM6OmhhcmR3YXJlXyA9IE5VTEw7Ci1BUk1WZXJzaW9uIEhvc3RDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb25fID0gQVJNdlVua25vd247CiBpbnRwdHJfdCBIb3N0Q1BVRmVhdHVyZXM6OnN0b3JlX3BjX3JlYWRfb2Zmc2V0XyA9IDg7CiAjaWYgZGVmaW5lZChERUJVRykKIGJvb2wgSG9zdENQVUZlYXR1cmVzOjppbml0aWFsaXplZF8gPSBmYWxzZTsKQEAgLTE0MCw5ICsxMjIsNiBAQAogICBoYXJkd2FyZV8gPSAiIjsKICAgLy8gV2hlbiB0aGUgVk0gaXMgdGFyZ2V0dGVkIHRvIEFSTXY3LCBwcmV0ZW5kIHRoYXQgdGhlIENQVSBpcyBBUk12NyBldmVuIGlmCiAgIC8vIHRoZSBDUFUgaXMgYWN0dWFsbHkgQUFyY2g2NC4KLSAgYXJtX3ZlcnNpb25fID0gQVJNdjc7Ci0gIC8vIEFsd2F5cyBhc3N1bWUgd2UgaGF2ZSBmbG9hdGluZyBwb2ludCB1bml0IHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgQVJNdjYgaW4KLSAgLy8gdGhpcyBwYXRoLgogICB2ZnBfc3VwcG9ydGVkXyA9IEZMQUdfdXNlX3ZmcDsKICAgaW50ZWdlcl9kaXZpc2lvbl9zdXBwb3J0ZWRfID0gRkxBR191c2VfaW50ZWdlcl9kaXZpc2lvbjsKICAgbmVvbl9zdXBwb3J0ZWRfID0gRkxBR191c2VfbmVvbjsKQEAgLTE1NywyNyArMTM2LDE4IEBACiAgIENwdUluZm86OkluaXQoKTsKICAgaGFyZHdhcmVfID0gQ3B1SW5mbzo6R2V0Q3B1TW9kZWwoKTsKIAotICAvLyBDaGVjayBmb3IgQVJNdjYsIEFSTXY3LCBvciBhYXJjaDY0LgorICAvLyBDaGVjayBmb3IgQVJNdjcsIG9yIGFhcmNoNjQuCiAgIC8vIEl0IGNhbiBiZSBpbiBlaXRoZXIgdGhlIFByb2Nlc3NvciBvciBNb2RlbCBpbmZvcm1hdGlvbiBmaWVsZHMuCiAgIGlmIChDcHVJbmZvOjpGaWVsZENvbnRhaW5zKGtDcHVJbmZvUHJvY2Vzc29yLCAiYWFyY2g2NCIpIHx8CiAgICAgICBDcHVJbmZvOjpGaWVsZENvbnRhaW5zKGtDcHVJbmZvTW9kZWwsICJhYXJjaDY0IikgfHwKICAgICAgIENwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9BcmNoaXRlY3R1cmUsICI4IikgfHwKICAgICAgIENwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9BcmNoaXRlY3R1cmUsICJBQXJjaDY0IikpIHsKICAgICAvLyBwcmV0ZW5kIHRoYXQgdGhpcyBhcm02NCBjcHUgaXMgcmVhbGx5IGFuIEFSTXY3Ci0gICAgYXJtX3ZlcnNpb25fID0gQVJNdjc7CiAgICAgaXNfYXJtNjQgPSB0cnVlOwotICB9IGVsc2UgaWYgKENwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9Qcm9jZXNzb3IsICJBUk12NiIpIHx8Ci0gICAgICAgICAgICAgQ3B1SW5mbzo6RmllbGRDb250YWlucyhrQ3B1SW5mb01vZGVsLCAiQVJNdjYiKSkgewotICAgIC8vIFJhc3BiZXJyeSBQaSwgZXRjLgotICAgIGFybV92ZXJzaW9uXyA9IEFSTXY2OwotICB9IGVsc2UgaWYgKENwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9Qcm9jZXNzb3IsICJBUk12NyIpIHx8Ci0gICAgICAgICAgICAgQ3B1SW5mbzo6RmllbGRDb250YWlucyhrQ3B1SW5mb01vZGVsLCAiQVJNdjciKSB8fAotICAgICAgICAgICAgIENwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9BcmNoaXRlY3R1cmUsICI3IikpIHsKLSAgICBhcm1fdmVyc2lvbl8gPSBBUk12NzsKLSAgfSBlbHNlIHsKLSNpZiBkZWZpbmVkKERBUlRfUlVOX0lOX1FFTVVfQVJNdjcpCi0gICAgYXJtX3ZlcnNpb25fID0gQVJNdjc7Ci0jZWxzZQorICB9IGVsc2UgaWYgKCFDcHVJbmZvOjpGaWVsZENvbnRhaW5zKGtDcHVJbmZvUHJvY2Vzc29yLCAiQVJNdjciKSAmJgorICAgICAgICAgICAgICFDcHVJbmZvOjpGaWVsZENvbnRhaW5zKGtDcHVJbmZvTW9kZWwsICJBUk12NyIpICYmCisgICAgICAgICAgICAgIUNwdUluZm86OkZpZWxkQ29udGFpbnMoa0NwdUluZm9BcmNoaXRlY3R1cmUsICI3IikpIHsKKyNpZiAhZGVmaW5lZChEQVJUX1JVTl9JTl9RRU1VX0FSTXY3KQogICAgIEZBVEFMKCJVbnJlY29nbml6ZWQgQVJNIENQVSBhcmNoaXRlY3R1cmUuIik7CiAjZW5kaWYKICAgfQpAQCAtMjYyLDEyICsyMzIsNiBAQAogICBDcHVJbmZvOjpJbml0KCk7CiAgIGhhcmR3YXJlXyA9IENwdUluZm86OkdldENwdU1vZGVsKCk7CiAKLSNpZiBkZWZpbmVkKFRBUkdFVF9BUkNIX0FSTV82KQotICBhcm1fdmVyc2lvbl8gPSBBUk12NjsKLSNlbHNlCi0gIGFybV92ZXJzaW9uXyA9IEFSTXY3OwotI2VuZGlmCi0KICAgaW50ZWdlcl9kaXZpc2lvbl9zdXBwb3J0ZWRfID0gRkxBR191c2VfaW50ZWdlcl9kaXZpc2lvbjsKICAgdmZwX3N1cHBvcnRlZF8gPSBGTEFHX3VzZV92ZnA7CiAgIG5lb25fc3VwcG9ydGVkXyA9IEZMQUdfdXNlX3ZmcCAmJiBGTEFHX3VzZV9uZW9uOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9jcHVfYXJtLmggYi9ydW50aW1lL3ZtL2NwdV9hcm0uaAppbmRleCAxOGQ1NWZjLi4yZWFmNGFhIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NwdV9hcm0uaAorKysgYi9ydW50aW1lL3ZtL2NwdV9hcm0uaApAQCAtMjIsMTIgKzIyLDYgQEAKIC8vIGFkZGl0aW9uYWxseSBtb2NrIHRoZSBvcHRpb25zIG5lZWRlZCBmb3IgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgc28gdGhhdAogLy8gdGhleSBtYXkgYmUgYWx0ZXJlZCBmb3IgdGVzdGluZy4KIAotZW51bSBBUk1WZXJzaW9uIHsKLSAgQVJNdjYsCi0gIEFSTXY3LAotICBBUk12VW5rbm93biwKLX07Ci0KIGNsYXNzIEhvc3RDUFVGZWF0dXJlcyA6IHB1YmxpYyBBbGxTdGF0aWMgewogIHB1YmxpYzoKICAgc3RhdGljIHZvaWQgSW5pdCgpOwpAQCAtNTIsMTAgKzQ2LDYgQEAKICAgICBERUJVR19BU1NFUlQoaW5pdGlhbGl6ZWRfKTsKICAgICByZXR1cm4gaGFyZGZwX3N1cHBvcnRlZF87CiAgIH0KLSAgc3RhdGljIEFSTVZlcnNpb24gYXJtX3ZlcnNpb24oKSB7Ci0gICAgREVCVUdfQVNTRVJUKGluaXRpYWxpemVkXyk7Ci0gICAgcmV0dXJuIGFybV92ZXJzaW9uXzsKLSAgfQogICBzdGF0aWMgaW50cHRyX3Qgc3RvcmVfcGNfcmVhZF9vZmZzZXQoKSB7CiAgICAgREVCVUdfQVNTRVJUKGluaXRpYWxpemVkXyk7CiAgICAgcmV0dXJuIHN0b3JlX3BjX3JlYWRfb2Zmc2V0XzsKQEAgLTc0LDEwICs2NCw2IEBACiAgICAgREVCVUdfQVNTRVJUKGluaXRpYWxpemVkXyk7CiAgICAgbmVvbl9zdXBwb3J0ZWRfID0gc3VwcG9ydGVkOwogICB9Ci0gIHN0YXRpYyB2b2lkIHNldF9hcm1fdmVyc2lvbihBUk1WZXJzaW9uIHZlcnNpb24pIHsKLSAgICBERUJVR19BU1NFUlQoaW5pdGlhbGl6ZWRfKTsKLSAgICBhcm1fdmVyc2lvbl8gPSB2ZXJzaW9uOwotICB9CiAjZW5kaWYgIC8vICFkZWZpbmVkKEhPU1RfQVJDSF9BUk0pCiAKICBwcml2YXRlOgpAQCAtODYsNyArNzIsNiBAQAogICBzdGF0aWMgYm9vbCB2ZnBfc3VwcG9ydGVkXzsKICAgc3RhdGljIGJvb2wgbmVvbl9zdXBwb3J0ZWRfOwogICBzdGF0aWMgYm9vbCBoYXJkZnBfc3VwcG9ydGVkXzsKLSAgc3RhdGljIEFSTVZlcnNpb24gYXJtX3ZlcnNpb25fOwogICBzdGF0aWMgaW50cHRyX3Qgc3RvcmVfcGNfcmVhZF9vZmZzZXRfOwogI2lmIGRlZmluZWQoREVCVUcpCiAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkXzsKQEAgLTEwOCw3ICs5Myw2IEBACiAgIHN0YXRpYyBib29sIG5lb25fc3VwcG9ydGVkKCkgeyByZXR1cm4gSG9zdENQVUZlYXR1cmVzOjpuZW9uX3N1cHBvcnRlZCgpOyB9CiAgIHN0YXRpYyBib29sIGhhcmRmcF9zdXBwb3J0ZWQoKSB7IHJldHVybiBIb3N0Q1BVRmVhdHVyZXM6OmhhcmRmcF9zdXBwb3J0ZWQoKTsgfQogICBzdGF0aWMgY29uc3QgY2hhciogaGFyZHdhcmUoKSB7IHJldHVybiBIb3N0Q1BVRmVhdHVyZXM6OmhhcmR3YXJlKCk7IH0KLSAgc3RhdGljIEFSTVZlcnNpb24gYXJtX3ZlcnNpb24oKSB7IHJldHVybiBIb3N0Q1BVRmVhdHVyZXM6OmFybV92ZXJzaW9uKCk7IH0KICAgc3RhdGljIGludHB0cl90IHN0b3JlX3BjX3JlYWRfb2Zmc2V0KCkgewogICAgIHJldHVybiBIb3N0Q1BVRmVhdHVyZXM6OnN0b3JlX3BjX3JlYWRfb2Zmc2V0KCk7CiAgIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vZGFydF9hcGlfaW1wbF90ZXN0LmNjIGIvcnVudGltZS92bS9kYXJ0X2FwaV9pbXBsX3Rlc3QuY2MKaW5kZXggZTIwMTM5Zi4uMTk0MDY3MCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9kYXJ0X2FwaV9pbXBsX3Rlc3QuY2MKKysrIGIvcnVudGltZS92bS9kYXJ0X2FwaV9pbXBsX3Rlc3QuY2MKQEAgLTE1NTcsMTIgKzE1NTcsMTMgQEAKICAgRGFydF9IYW5kbGUgcmVzdWx0ID0gRGFydF9TdHJpbmdUb1VURjgoc3RyMSwgJnV0ZjhfZW5jb2RlZCwgJnV0ZjhfbGVuZ3RoKTsKICAgRVhQRUNUX1ZBTElEKHJlc3VsdCk7CiAgIEVYUEVDVF9FUSgzLCB1dGY4X2xlbmd0aCk7Ci0gIEVYUEVDVF9FUSgyMzcsIHN0YXRpY19jYXN0PGludHB0cl90Pih1dGY4X2VuY29kZWRbMF0pKTsKLSAgRVhQRUNUX0VRKDE4MCwgc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KHV0ZjhfZW5jb2RlZFsxXSkpOwotICBFWFBFQ1RfRVEoMTU4LCBzdGF0aWNfY2FzdDxpbnRwdHJfdD4odXRmOF9lbmNvZGVkWzJdKSk7CisgIC8vIFVucGFpcmVkIHN1cnJvZ2F0ZSBpcyBlbmNvZGVkIGFzIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4KKyAgRVhQRUNUX0VRKDIzOSwgc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KHV0ZjhfZW5jb2RlZFswXSkpOworICBFWFBFQ1RfRVEoMTkxLCBzdGF0aWNfY2FzdDxpbnRwdHJfdD4odXRmOF9lbmNvZGVkWzFdKSk7CisgIEVYUEVDVF9FUSgxODksIHN0YXRpY19jYXN0PGludHB0cl90Pih1dGY4X2VuY29kZWRbMl0pKTsKIAogICBEYXJ0X0hhbmRsZSBzdHIyID0gRGFydF9OZXdTdHJpbmdGcm9tVVRGOCh1dGY4X2VuY29kZWQsIHV0ZjhfbGVuZ3RoKTsKLSAgRVhQRUNUX1ZBTElEKHN0cjIpOyAgLy8gU3RhbmRhbG9uZSBsb3cgc3Vycm9nYXRlLCBidXQgc3RpbGwgdmFsaWQKKyAgRVhQRUNUX1ZBTElEKHN0cjIpOyAgLy8gUmVwbGFjZW1lbnQgY2hhcmFjdGVyLCBidXQgc3RpbGwgdmFsaWQKIAogICBEYXJ0X0hhbmRsZSByZXZlcnNlZCA9IERhcnRfSW52b2tlKGxpYiwgTmV3U3RyaW5nKCJyZXZlcnNlZCIpLCAwLCBOVUxMKTsKICAgRVhQRUNUX1ZBTElEKHJldmVyc2VkKTsgIC8vIFRoaXMgaXMgYWxzbyBhbGxvd2VkLgpAQCAtMTU3Miw3ICsxNTczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV0ZjhfbGVuZ3RoX3JldmVyc2VkKTsKICAgRVhQRUNUX1ZBTElEKHJlc3VsdCk7CiAgIEVYUEVDVF9FUSg2LCB1dGY4X2xlbmd0aF9yZXZlcnNlZCk7Ci0gIHVpbnQ4X3QgZXhwZWN0ZWRbNl0gPSB7MjM3LCAxODAsIDE1OCwgMjM3LCAxNjAsIDE4MH07CisgIC8vIFR3byB1bnBhaXJlZCBzdXJyb2dhdGVzIGFyZSBlbmNvZGVkIGFzIHR3byByZXBsYWNlbWVudCBjaGFyYWN0ZXJzLgorICB1aW50OF90IGV4cGVjdGVkWzZdID0gezIzOSwgMTkxLCAxODksIDIzOSwgMTkxLCAxODl9OwogICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgdXRmOF9lbmNvZGVkX3JldmVyc2VkW2ldKTsKICAgfQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9kYXJ0X2VudHJ5LmNjIGIvcnVudGltZS92bS9kYXJ0X2VudHJ5LmNjCmluZGV4IDhhMTM1MGUuLjNhODIzNjkgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vZGFydF9lbnRyeS5jYworKysgYi9ydW50aW1lL3ZtL2RhcnRfZW50cnkuY2MKQEAgLTIwNiw2ICsyMDYsMTAxIEBACiAjZW5kaWYKIH0KIAorT2JqZWN0UHRyIERhcnRFbnRyeTo6UmVzb2x2ZUNhbGxhYmxlKGNvbnN0IEFycmF5JiBhcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIGFyZ3VtZW50c19kZXNjcmlwdG9yKSB7CisgIGF1dG8gdGhyZWFkID0gVGhyZWFkOjpDdXJyZW50KCk7CisgIGF1dG8gaXNvbGF0ZSA9IHRocmVhZC0+aXNvbGF0ZSgpOworICBhdXRvIHpvbmUgPSB0aHJlYWQtPnpvbmUoKTsKKworICBjb25zdCBBcmd1bWVudHNEZXNjcmlwdG9yIGFyZ3NfZGVzYyhhcmd1bWVudHNfZGVzY3JpcHRvcik7CisgIGNvbnN0IGludHB0cl90IHJlY2VpdmVyX2luZGV4ID0gYXJnc19kZXNjLkZpcnN0QXJnSW5kZXgoKTsKKyAgY29uc3QgaW50cHRyX3QgdHlwZV9hcmdzX2xlbiA9IGFyZ3NfZGVzYy5UeXBlQXJnc0xlbigpOworICBjb25zdCBpbnRwdHJfdCBhcmdzX2NvdW50ID0gYXJnc19kZXNjLkNvdW50KCk7CisgIGNvbnN0IGludHB0cl90IG5hbWVkX2FyZ3NfY291bnQgPSBhcmdzX2Rlc2MuTmFtZWRDb3VudCgpOworICBjb25zdCBhdXRvJiBnZXR0ZXJfbmFtZSA9IFN5bWJvbHM6OkdldENhbGwoKTsKKworICBhdXRvJiBpbnN0YW5jZSA9IEluc3RhbmNlOjpIYW5kbGUoem9uZSk7CisgIGF1dG8mIGZ1bmN0aW9uID0gRnVuY3Rpb246OkhhbmRsZSh6b25lKTsKKyAgYXV0byYgY2xzID0gQ2xhc3M6OkhhbmRsZSh6b25lKTsKKworICAvLyBUaGUgbnVsbCBpbnN0YW5jZSBjYW5ub3QgcmVzb2x2ZSB0byBhIGNhbGxhYmxlLCBzbyB3ZSBjYW4gc3RvcCB0aGVyZS4KKyAgZm9yIChpbnN0YW5jZSBePSBhcmd1bWVudHMuQXQocmVjZWl2ZXJfaW5kZXgpOyAhaW5zdGFuY2UuSXNOdWxsKCk7CisgICAgICAgaW5zdGFuY2UgXj0gYXJndW1lbnRzLkF0KHJlY2VpdmVyX2luZGV4KSkgeworICAgIC8vIElmIHRoZSBjdXJyZW50IGluc3RhbmNlIGlzIGEgY29tcGF0aWJsZSBjYWxsYWJsZSwgcmV0dXJuIGl0cyBmdW5jdGlvbi4KKyAgICBpZiAoaW5zdGFuY2UuSXNDYWxsYWJsZSgmZnVuY3Rpb24pICYmCisgICAgICAgIGZ1bmN0aW9uLkFyZVZhbGlkQXJndW1lbnRDb3VudHModHlwZV9hcmdzX2xlbiwgYXJnc19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZF9hcmdzX2NvdW50LCBudWxscHRyKSkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uLnJhdygpOworICAgIH0KKworICAgIC8vIFNwZWNpYWwgY2FzZTogY2xvc3VyZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYSBjYWxsIGdldHRlciBpbnN0ZWFkIG9mIGEKKyAgICAvLyBjYWxsIG1ldGhvZCwgc28gY2hlY2tpbmcgZm9yIGEgY2FsbCBnZXR0ZXIgd291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcC4KKyAgICBpZiAoaW5zdGFuY2UuSXNDbG9zdXJlKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEZpbmQgYSBjYWxsIGdldHRlciwgaWYgYW55LCBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorICAgIGZvciAoY2xzID0gaW5zdGFuY2UuY2xhenooKTsgIWNscy5Jc051bGwoKTsgY2xzID0gY2xzLlN1cGVyQ2xhc3MoKSkgeworICAgICAgZnVuY3Rpb24gPSBjbHMuTG9va3VwRHluYW1pY0Z1bmN0aW9uKGdldHRlcl9uYW1lKTsKKyAgICAgIGlmIChmdW5jdGlvbi5Jc051bGwoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFPU1RocmVhZDo6Q3VycmVudCgpLT5IYXNTdGFja0hlYWRyb29tKCkpIHsKKyAgICAgICAgY29uc3QgSW5zdGFuY2UmIGV4Y2VwdGlvbiA9CisgICAgICAgICAgICBJbnN0YW5jZTo6SGFuZGxlKHpvbmUsIGlzb2xhdGUtPm9iamVjdF9zdG9yZSgpLT5zdGFja19vdmVyZmxvdygpKTsKKyAgICAgICAgcmV0dXJuIFVuaGFuZGxlZEV4Y2VwdGlvbjo6TmV3KGV4Y2VwdGlvbiwgU3RhY2tUcmFjZTo6SGFuZGxlKHpvbmUpKTsKKyAgICAgIH0KKworICAgICAgY29uc3QgQXJyYXkmIGdldHRlcl9hcmd1bWVudHMgPSBBcnJheTo6SGFuZGxlKHpvbmUsIEFycmF5OjpOZXcoMSkpOworICAgICAgZ2V0dGVyX2FyZ3VtZW50cy5TZXRBdCgwLCBpbnN0YW5jZSk7CisgICAgICBjb25zdCBPYmplY3QmIGdldHRlcl9yZXN1bHQgPSBPYmplY3Q6OkhhbmRsZSgKKyAgICAgICAgICB6b25lLCBEYXJ0RW50cnk6Okludm9rZUZ1bmN0aW9uKGZ1bmN0aW9uLCBnZXR0ZXJfYXJndW1lbnRzKSk7CisgICAgICBpZiAoZ2V0dGVyX3Jlc3VsdC5Jc0Vycm9yKCkpIHsKKyAgICAgICAgcmV0dXJuIGdldHRlcl9yZXN1bHQucmF3KCk7CisgICAgICB9CisgICAgICBBU1NFUlQoZ2V0dGVyX3Jlc3VsdC5Jc051bGwoKSB8fCBnZXR0ZXJfcmVzdWx0LklzSW5zdGFuY2UoKSk7CisKKyAgICAgIC8vIFdlIGhhdmUgYSBuZXcgcG9zc2libHkgY29tcGF0aWJsZSBjYWxsYWJsZSwgc28gc2V0IHRoZSBmaXJzdCBhcmd1bWVudAorICAgICAgLy8gYWNjb3JkaW5nbHkgc28gaXQgZ2V0cyBwaWNrZWQgdXAgaW4gdGhlIG1haW4gbG9vcC4KKyAgICAgIGFyZ3VtZW50cy5TZXRBdChyZWNlaXZlcl9pbmRleCwgZ2V0dGVyX3Jlc3VsdCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBObyBjYWxsIGdldHRlciB3YXMgZm91bmQgaW4gdGhlIGhpZXJhcmNoeSwgc28gc3RvcCB0aGUgc2VhcmNoLgorICAgIGlmIChjbHMuSXNOdWxsKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE5vIGNvbXBhdGlibGUgY2FsbGFibGUgd2FzIGZvdW5kLgorICByZXR1cm4gRnVuY3Rpb246Om51bGwoKTsKK30KKworT2JqZWN0UHRyIERhcnRFbnRyeTo6SW52b2tlQ2FsbGFibGUoY29uc3QgRnVuY3Rpb24mIGNhbGxhYmxlX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvcikgeworICBpZiAoIWNhbGxhYmxlX2Z1bmN0aW9uLklzTnVsbCgpKSB7CisgICAgcmV0dXJuIEludm9rZUZ1bmN0aW9uKGNhbGxhYmxlX2Z1bmN0aW9uLCBhcmd1bWVudHMsIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKKyAgfQorCisgIC8vIE5vIGNvbXBhdGlibGUgY2FsbGFibGUgd2FzIGZvdW5kLCBzbyBpbnZva2Ugbm9TdWNoTWV0aG9kLgorICBUaHJlYWQqIHRocmVhZCA9IFRocmVhZDo6Q3VycmVudCgpOworICBab25lKiB6b25lID0gdGhyZWFkLT56b25lKCk7CisgIGNvbnN0IEFyZ3VtZW50c0Rlc2NyaXB0b3IgYXJnc19kZXNjKGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKKyAgYXV0byYgaW5zdGFuY2UgPQorICAgICAgSW5zdGFuY2U6OkNoZWNrZWRIYW5kbGUoem9uZSwgYXJndW1lbnRzLkF0KGFyZ3NfZGVzYy5GaXJzdEFyZ0luZGV4KCkpKTsKKyAgYXV0byYgdGFyZ2V0X25hbWUgPSBTdHJpbmc6OkhhbmRsZSh6b25lLCBTeW1ib2xzOjpDYWxsKCkucmF3KCkpOworICBpZiAoaW5zdGFuY2UuSXNDbG9zdXJlKCkpIHsKKyAgICBjb25zdCBhdXRvJiBjbG9zdXJlID0gQ2xvc3VyZTo6Q2FzdChpbnN0YW5jZSk7CisgICAgLy8gRm9yIGNsb3N1cmVzLCB1c2UgdGhlIG5hbWUgb2YgdGhlIGNsb3N1cmUsIG5vdCAnY2FsbCcuCisgICAgY29uc3QgYXV0byYgZnVuY3Rpb24gPSBGdW5jdGlvbjo6SGFuZGxlKHpvbmUsIGNsb3N1cmUuZnVuY3Rpb24oKSk7CisgICAgdGFyZ2V0X25hbWUgPSBmdW5jdGlvbi5RdWFsaWZpZWRVc2VyVmlzaWJsZU5hbWUoKTsKKyAgfQorICByZXR1cm4gSW52b2tlTm9TdWNoTWV0aG9kKGluc3RhbmNlLCB0YXJnZXRfbmFtZSwgYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKK30KKwogT2JqZWN0UHRyIERhcnRFbnRyeTo6SW52b2tlQ2xvc3VyZShjb25zdCBBcnJheSYgYXJndW1lbnRzKSB7CiAgIGNvbnN0IGludCBrVHlwZUFyZ3NMZW4gPSAwOyAgLy8gTm8gc3VwcG9ydCB0byBwYXNzIHR5cGUgYXJncyB0byBnZW5lcmljIGZ1bmMuCiAKQEAgLTIxNyw2OCArMzEyLDE1IEBACiAKIE9iamVjdFB0ciBEYXJ0RW50cnk6Okludm9rZUNsb3N1cmUoY29uc3QgQXJyYXkmIGFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIGFyZ3VtZW50c19kZXNjcmlwdG9yKSB7Ci0gIFRocmVhZCogdGhyZWFkID0gVGhyZWFkOjpDdXJyZW50KCk7Ci0gIFpvbmUqIHpvbmUgPSB0aHJlYWQtPnpvbmUoKTsKLSAgY29uc3QgQXJndW1lbnRzRGVzY3JpcHRvciBhcmdzX2Rlc2MoYXJndW1lbnRzX2Rlc2NyaXB0b3IpOwotICBJbnN0YW5jZSYgaW5zdGFuY2UgPSBJbnN0YW5jZTo6SGFuZGxlKHpvbmUpOwotICBpbnN0YW5jZSBePSBhcmd1bWVudHMuQXQoYXJnc19kZXNjLkZpcnN0QXJnSW5kZXgoKSk7Ci0gIC8vIEdldCB0aGUgZW50cnlwb2ludCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjbG9zdXJlIGZ1bmN0aW9uIG9yIHRvIHRoZSBjYWxsCi0gIC8vIG1ldGhvZCBvZiB0aGUgaW5zdGFuY2UuIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBjb21waWxhdGlvbiBvZiB0aGUgZnVuY3Rpb24KLSAgLy8gaWYgaXQgaXMgbm90IGFscmVhZHkgY29tcGlsZWQuCi0gIEZ1bmN0aW9uJiBmdW5jdGlvbiA9IEZ1bmN0aW9uOjpIYW5kbGUoem9uZSk7Ci0gIGlmIChpbnN0YW5jZS5Jc0NhbGxhYmxlKCZmdW5jdGlvbikpIHsKLSAgICAvLyBPbmx5IGludm9rZSB0aGUgZnVuY3Rpb24gaWYgaXRzIGFyZ3VtZW50cyBhcmUgY29tcGF0aWJsZS4KLSAgICBpZiAoZnVuY3Rpb24uQXJlVmFsaWRBcmd1bWVudENvdW50cyhhcmdzX2Rlc2MuVHlwZUFyZ3NMZW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzX2Rlc2MuQ291bnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzX2Rlc2MuTmFtZWRDb3VudCgpLCBOVUxMKSkgewotICAgICAgLy8gVGhlIGNsb3N1cmUgb3Igbm9uLWNsb3N1cmUgb2JqZWN0IChyZWNlaXZlcikgaXMgcGFzc2VkIGFzIGltcGxpY2l0Ci0gICAgICAvLyBmaXJzdCBhcmd1bWVudC4gSXQgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgYXJndW1lbnRzIGFycmF5LgotICAgICAgcmV0dXJuIEludm9rZUZ1bmN0aW9uKGZ1bmN0aW9uLCBhcmd1bWVudHMsIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKLSAgICB9CisgIGNvbnN0IE9iamVjdCYgcmVzb2x2ZWRfcmVzdWx0ID0KKyAgICAgIE9iamVjdDo6SGFuZGxlKFJlc29sdmVDYWxsYWJsZShhcmd1bWVudHMsIGFyZ3VtZW50c19kZXNjcmlwdG9yKSk7CisgIGlmIChyZXNvbHZlZF9yZXN1bHQuSXNFcnJvcigpKSB7CisgICAgcmV0dXJuIHJlc29sdmVkX3Jlc3VsdC5yYXcoKTsKICAgfQogCi0gIC8vIFRoZXJlIGlzIG5vIGNvbXBhdGlibGUgJ2NhbGwnIG1ldGhvZCwgc2VlIGlmIHRoZXJlJ3MgYSBnZXR0ZXIuCi0gIGlmIChpbnN0YW5jZS5Jc0Nsb3N1cmUoKSkgewotICAgIC8vIFNwZWNpYWwgY2FzZTogY2xvc3VyZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYSBjYWxsIGdldHRlciBpbnN0ZWFkIG9mIGEKLSAgICAvLyBjYWxsIG1ldGhvZC4gSWYgdGhlIGFyZ3VtZW50cyBkaWRuJ3QgbWF0Y2gsIGdvIHRvIG5vU3VjaE1ldGhvZCBpbnN0ZWFkCi0gICAgLy8gb2YgaW5maW5pdGVseSByZWN1cnNpbmcgb24gdGhlIGdldHRlci4KLSAgfSBlbHNlIHsKLSAgICBjb25zdCBTdHJpbmcmIGdldHRlcl9uYW1lID0gU3ltYm9sczo6R2V0Q2FsbCgpOwotICAgIENsYXNzJiBjbHMgPSBDbGFzczo6SGFuZGxlKHpvbmUsIGluc3RhbmNlLmNsYXp6KCkpOwotICAgIHdoaWxlICghY2xzLklzTnVsbCgpKSB7Ci0gICAgICBmdW5jdGlvbiA9IGNscy5Mb29rdXBEeW5hbWljRnVuY3Rpb24oZ2V0dGVyX25hbWUpOwotICAgICAgaWYgKCFmdW5jdGlvbi5Jc051bGwoKSkgewotICAgICAgICBJc29sYXRlKiBpc29sYXRlID0gdGhyZWFkLT5pc29sYXRlKCk7Ci0gICAgICAgIGlmICghT1NUaHJlYWQ6OkN1cnJlbnQoKS0+SGFzU3RhY2tIZWFkcm9vbSgpKSB7Ci0gICAgICAgICAgY29uc3QgSW5zdGFuY2UmIGV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgIEluc3RhbmNlOjpIYW5kbGUoem9uZSwgaXNvbGF0ZS0+b2JqZWN0X3N0b3JlKCktPnN0YWNrX292ZXJmbG93KCkpOwotICAgICAgICAgIHJldHVybiBVbmhhbmRsZWRFeGNlcHRpb246Ok5ldyhleGNlcHRpb24sIFN0YWNrVHJhY2U6OkhhbmRsZSh6b25lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBBcnJheSYgZ2V0dGVyX2FyZ3VtZW50cyA9IEFycmF5OjpIYW5kbGUoem9uZSwgQXJyYXk6Ok5ldygxKSk7Ci0gICAgICAgIGdldHRlcl9hcmd1bWVudHMuU2V0QXQoMCwgaW5zdGFuY2UpOwotICAgICAgICBjb25zdCBPYmplY3QmIGdldHRlcl9yZXN1bHQgPSBPYmplY3Q6OkhhbmRsZSgKLSAgICAgICAgICAgIHpvbmUsIERhcnRFbnRyeTo6SW52b2tlRnVuY3Rpb24oZnVuY3Rpb24sIGdldHRlcl9hcmd1bWVudHMpKTsKLSAgICAgICAgaWYgKGdldHRlcl9yZXN1bHQuSXNFcnJvcigpKSB7Ci0gICAgICAgICAgcmV0dXJuIGdldHRlcl9yZXN1bHQucmF3KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKGdldHRlcl9yZXN1bHQuSXNOdWxsKCkgfHwgZ2V0dGVyX3Jlc3VsdC5Jc0luc3RhbmNlKCkpOwotCi0gICAgICAgIGFyZ3VtZW50cy5TZXRBdCgwLCBnZXR0ZXJfcmVzdWx0KTsKLSAgICAgICAgLy8gVGhpcyBvdGhlcndpc2UgdW5uZWNlc3NhcnkgaGFuZGxlIGlzIHVzZWQgdG8gcHJldmVudCBjbGFuZyBmcm9tCi0gICAgICAgIC8vIGRvaW5nIHRhaWwgY2FsbCBlbGltaW5hdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUgc3RhY2sgb3ZlcmZsb3cKLSAgICAgICAgLy8gY2hlY2sgYWJvdmUgaW5lZmZlY3RpdmUuCi0gICAgICAgIE9iamVjdCYgcmVzdWx0ID0gT2JqZWN0OjpIYW5kbGUoCi0gICAgICAgICAgICB6b25lLCBJbnZva2VDbG9zdXJlKGFyZ3VtZW50cywgYXJndW1lbnRzX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5yYXcoKTsKLSAgICAgIH0KLSAgICAgIGNscyA9IGNscy5TdXBlckNsYXNzKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm8gY29tcGF0aWJsZSBtZXRob2Qgb3IgZ2V0dGVyIHNvIGludm9rZSBub1N1Y2hNZXRob2QuCi0gIHJldHVybiBJbnZva2VOb1N1Y2hNZXRob2QoaW5zdGFuY2UsIFN5bWJvbHM6OkNhbGwoKSwgYXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKKyAgY29uc3QgYXV0byYgZnVuY3Rpb24gPQorICAgICAgRnVuY3Rpb246OkhhbmRsZShGdW5jdGlvbjo6UmF3Q2FzdChyZXNvbHZlZF9yZXN1bHQucmF3KCkpKTsKKyAgcmV0dXJuIEludm9rZUNhbGxhYmxlKGZ1bmN0aW9uLCBhcmd1bWVudHMsIGFyZ3VtZW50c19kZXNjcmlwdG9yKTsKIH0KIAogT2JqZWN0UHRyIERhcnRFbnRyeTo6SW52b2tlTm9TdWNoTWV0aG9kKGNvbnN0IEluc3RhbmNlJiByZWNlaXZlciwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vZGFydF9lbnRyeS5oIGIvcnVudGltZS92bS9kYXJ0X2VudHJ5LmgKaW5kZXggOWFiMDExNS4uZjYzNWNiMiAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9kYXJ0X2VudHJ5LmgKKysrIGIvcnVudGltZS92bS9kYXJ0X2VudHJ5LmgKQEAgLTIwNiw2ICsyMDYsMjMgQEAKICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvciwKICAgICAgIHV3b3JkIGN1cnJlbnRfc3AgPSBPU1RocmVhZDo6R2V0Q3VycmVudFN0YWNrUG9pbnRlcigpKTsKIAorICAvLyBSZXNvbHZlcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYSBjYWxsYWJsZSBjb21wYXRpYmxlIHdpdGggdGhlIGFyZ3VtZW50cy4KKyAgLy8KKyAgLy8gSWYgbm8gZXJyb3JzIG9jY3VyLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgY2hhbmdlZCB0byBiZSBlaXRoZXIgdGhlIHJlc29sdmVkCisgIC8vIGNhbGxhYmxlIG9yLCBpZiBGdW5jdGlvbjo6bnVsbCgpIGlzIHJldHVybmVkLCBhbiBhcHByb3ByaWF0ZSB0YXJnZXQgZm9yCisgIC8vIGludm9raW5nIG5vU3VjaE1ldGhvZC4KKyAgLy8KKyAgLy8gT24gc3VjY2VzcywgcmV0dXJucyBhIFJhd0Z1bmN0aW9uLiBPbiBmYWlsdXJlLCBhIFJhd0Vycm9yLgorICBzdGF0aWMgT2JqZWN0UHRyIFJlc29sdmVDYWxsYWJsZShjb25zdCBBcnJheSYgYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheSYgYXJndW1lbnRzX2Rlc2NyaXB0b3IpOworCisgIC8vIEludm9rZXMgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IFJlc29sdmVDYWxsYWJsZS4KKyAgLy8KKyAgLy8gT24gc3VjY2VzcywgcmV0dXJucyBhIFJhd0luc3RhbmNlLiBPbiBmYWlsdXJlLCBhIFJhd0Vycm9yLgorICBzdGF0aWMgT2JqZWN0UHRyIEludm9rZUNhbGxhYmxlKGNvbnN0IEZ1bmN0aW9uJiBjYWxsYWJsZV9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheSYgYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvcik7CisKICAgLy8gSW52b2tlcyB0aGUgY2xvc3VyZSBvYmplY3QgZ2l2ZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgogICAvLyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgUmF3SW5zdGFuY2UuICBPbiBmYWlsdXJlLCBhIFJhd0Vycm9yLgogICAvLyBUaGlzIGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBubyB0eXBlIGFyZ3VtZW50IHZlY3RvciBhbmQKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vaW5zdHJ1Y3Rpb25zX2FybS5jYyBiL3J1bnRpbWUvdm0vaW5zdHJ1Y3Rpb25zX2FybS5jYwppbmRleCAwYWMxMDZlLi5kNDY4MzhmIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2luc3RydWN0aW9uc19hcm0uY2MKKysrIGIvcnVudGltZS92bS9pbnN0cnVjdGlvbnNfYXJtLmNjCkBAIC0xMTgsNDIgKzExOCwxNyBAQAogICB1d29yZCBzdGFydCA9IGVuZCAtIEluc3RyOjprSW5zdHJTaXplOwogICBpbnQzMl90IGluc3RyID0gSW5zdHI6OkF0KHN0YXJ0KS0+SW5zdHJ1Y3Rpb25CaXRzKCk7CiAgIGludHB0cl90IGltbSA9IDA7Ci0gIGNvbnN0IEFSTVZlcnNpb24gdmVyc2lvbiA9IFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpOwotICBpZiAodmVyc2lvbiA9PSBBUk12NikgewotICAgIEFTU0VSVCgoaW5zdHIgJiAweGZmZjAwMDAwKSA9PSAweGUzODAwMDAwKTsgIC8vIG9yciByZCwgcmQsIGJ5dGUwCi0gICAgaW1tIHw9IChpbnN0ciAmIDB4MDAwMDAwZmYpOwotCisgIGlmICgoaW5zdHIgJiAweGZmZjAwMDAwKSA9PSAweGUzNDAwMDAwKSB7ICAvLyBtb3Z0IHJlZywgI2ltbV9oaQorICAgIGltbSB8PSAoaW5zdHIgJiAweGYwMDAwKSA8PCAxMjsKKyAgICBpbW0gfD0gKGluc3RyICYgMHhmZmYpIDw8IDE2OwogICAgIHN0YXJ0IC09IEluc3RyOjprSW5zdHJTaXplOwogICAgIGluc3RyID0gSW5zdHI6OkF0KHN0YXJ0KS0+SW5zdHJ1Y3Rpb25CaXRzKCk7Ci0gICAgQVNTRVJUKChpbnN0ciAmIDB4ZmZmMDAwMDApID09IDB4ZTM4MDBjMDApOyAgLy8gb3JyIHJkLCByZCwgKGJ5dGUxIHJvdCAxMikKLSAgICBpbW0gfD0gKGluc3RyICYgMHgwMDAwMDBmZik7Ci0KLSAgICBzdGFydCAtPSBJbnN0cjo6a0luc3RyU2l6ZTsKLSAgICBpbnN0ciA9IEluc3RyOjpBdChzdGFydCktPkluc3RydWN0aW9uQml0cygpOwotICAgIEFTU0VSVCgoaW5zdHIgJiAweGZmZjAwZjAwKSA9PSAweGUzODAwODAwKTsgIC8vIG9yciByZCwgcmQsIChieXRlMiByb3QgOCkKLSAgICBpbW0gfD0gKGluc3RyICYgMHgwMDAwMDBmZik7Ci0KLSAgICBzdGFydCAtPSBJbnN0cjo6a0luc3RyU2l6ZTsKLSAgICBpbnN0ciA9IEluc3RyOjpBdChzdGFydCktPkluc3RydWN0aW9uQml0cygpOwotICAgIEFTU0VSVCgoaW5zdHIgJiAweGZmZmYwZjAwKSA9PSAweGUzYTAwNDAwKTsgIC8vIG1vdiByZCwgKGJ5dGUzIHJvdCA0KQotICAgIGltbSB8PSAoaW5zdHIgJiAweDAwMDAwMGZmKTsKLQotICAgICpyZWcgPSBzdGF0aWNfY2FzdDxSZWdpc3Rlcj4oKGluc3RyICYgMHgwMDAwZjAwMCkgPj4gMTIpOwotICAgICp2YWx1ZSA9IGltbTsKLSAgfSBlbHNlIHsKLSAgICBBU1NFUlQodmVyc2lvbiA9PSBBUk12Nyk7Ci0gICAgaWYgKChpbnN0ciAmIDB4ZmZmMDAwMDApID09IDB4ZTM0MDAwMDApIHsgIC8vIG1vdnQgcmVnLCAjaW1tX2hpCi0gICAgICBpbW0gfD0gKGluc3RyICYgMHhmMDAwMCkgPDwgMTI7Ci0gICAgICBpbW0gfD0gKGluc3RyICYgMHhmZmYpIDw8IDE2OwotICAgICAgc3RhcnQgLT0gSW5zdHI6OmtJbnN0clNpemU7Ci0gICAgICBpbnN0ciA9IEluc3RyOjpBdChzdGFydCktPkluc3RydWN0aW9uQml0cygpOwotICAgIH0KLSAgICBBU1NFUlQoKGluc3RyICYgMHhmZmYwMDAwMCkgPT0gMHhlMzAwMDAwMCk7ICAvLyBtb3Z3IHJlZywgI2ltbV9sbwotICAgIGltbSB8PSAoaW5zdHIgJiAweGYwMDAwKSA+PiA0OwotICAgIGltbSB8PSBpbnN0ciAmIDB4ZmZmOwotICAgICpyZWcgPSBzdGF0aWNfY2FzdDxSZWdpc3Rlcj4oKGluc3RyICYgMHhmMDAwKSA+PiAxMik7Ci0gICAgKnZhbHVlID0gaW1tOwogICB9CisgIEFTU0VSVCgoaW5zdHIgJiAweGZmZjAwMDAwKSA9PSAweGUzMDAwMDAwKTsgIC8vIG1vdncgcmVnLCAjaW1tX2xvCisgIGltbSB8PSAoaW5zdHIgJiAweGYwMDAwKSA+PiA0OworICBpbW0gfD0gaW5zdHIgJiAweGZmZjsKKyAgKnJlZyA9IHN0YXRpY19jYXN0PFJlZ2lzdGVyPigoaW5zdHIgJiAweGYwMDApID4+IDEyKTsKKyAgKnZhbHVlID0gaW1tOwogICByZXR1cm4gc3RhcnQ7CiB9CiAKQEAgLTM2OCwxNCArMzQzLDcgQEAKICAgaW50MzJfdCBpbnN0cnVjdGlvbiA9IChzdGF0aWNfY2FzdDxpbnQzMl90PihBTCkgPDwga0NvbmRpdGlvblNoaWZ0KSB8IEIyNCB8CiAgICAgICAgICAgICAgICAgICAgICAgICBCMjEgfCAoMHhmZmYgPDwgOCkgfCBCNCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8aW50MzJfdD4oTFIpIDw8IGtSbVNoaWZ0KTsKLSAgY29uc3QgQVJNVmVyc2lvbiB2ZXJzaW9uID0gVGFyZ2V0Q1BVRmVhdHVyZXM6OmFybV92ZXJzaW9uKCk7Ci0gIGlmICh2ZXJzaW9uID09IEFSTXY2KSB7Ci0gICAgcmV0dXJuIGJ4X2xyLT5JbnN0cnVjdGlvbkJpdHMoKSA9PSBpbnN0cnVjdGlvbjsKLSAgfSBlbHNlIHsKLSAgICBBU1NFUlQodmVyc2lvbiA9PSBBUk12Nyk7Ci0gICAgcmV0dXJuIGJ4X2xyLT5JbnN0cnVjdGlvbkJpdHMoKSA9PSBpbnN0cnVjdGlvbjsKLSAgfQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBieF9sci0+SW5zdHJ1Y3Rpb25CaXRzKCkgPT0gaW5zdHJ1Y3Rpb247CiB9CiAKIGJvb2wgUGNSZWxhdGl2ZUNhbGxQYXR0ZXJuOjpJc1ZhbGlkKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9pbnRlcnByZXRlci5jYyBiL3J1bnRpbWUvdm0vaW50ZXJwcmV0ZXIuY2MKaW5kZXggYTQ4ZDAxOS4uZDI5NmU2ZSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9pbnRlcnByZXRlci5jYworKysgYi9ydW50aW1lL3ZtL2ludGVycHJldGVyLmNjCkBAIC0zNDMxLDI5ICszNDMxLDM5IEBACiAgICAgY29uc3QgaW50cHRyX3QgcmVjZWl2ZXJfaWR4ID0gdHlwZV9hcmdzX2xlbiA+IDAgPyAxIDogMDsKICAgICBjb25zdCBpbnRwdHJfdCBhcmdjID0KICAgICAgICAgSW50ZXJwcmV0ZXJIZWxwZXJzOjpBcmdEZXNjQXJnQ291bnQoYXJnZGVzY18pICsgcmVjZWl2ZXJfaWR4OwotCiAgICAgT2JqZWN0UHRyIHJlY2VpdmVyID0gRnJhbWVBcmd1bWVudHMoRlAsIGFyZ2MpW3JlY2VpdmVyX2lkeF07CiAKLSAgICAvLyBJbnZva2UgZmllbGQgZ2V0dGVyIG9uIHJlY2VpdmVyLgorICAgIC8vIFBvc3NpYmx5IGRlbWFuZ2xlIGZpZWxkIG5hbWUgYW5kIGludm9rZSBmaWVsZCBnZXR0ZXIgb24gcmVjZWl2ZXIuCiAgICAgewogICAgICAgU1BbMV0gPSBhcmdkZXNjXzsgICAgICAgICAgICAgICAgLy8gU2F2ZSBhcmdkZXNjXy4KICAgICAgIFNQWzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3VsdCBvZiBydW50aW1lIGNhbGwuCiAgICAgICBTUFszXSA9IHJlY2VpdmVyOyAgICAgICAgICAgICAgICAvLyBSZWNlaXZlci4KLSAgICAgIFNQWzRdID0gZnVuY3Rpb24tPnB0cigpLT5uYW1lXzsgIC8vIEZpZWxkIG5hbWUuCisgICAgICBTUFs0XSA9IGZ1bmN0aW9uLT5wdHIoKS0+bmFtZV87ICAvLyBGaWVsZCBuYW1lIChtYXkgY2hhbmdlIGR1cmluZyBjYWxsKS4KICAgICAgIEV4aXQodGhyZWFkLCBGUCwgU1AgKyA1LCBwYyk7CiAgICAgICBpZiAoIUludm9rZVJ1bnRpbWUodGhyZWFkLCB0aGlzLCBEUlRfR2V0RmllbGRGb3JEaXNwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVBcmd1bWVudHModGhyZWFkLCAyLCBTUCArIDMsIFNQICsgMikpKSB7CiAgICAgICAgIEhBTkRMRV9FWENFUFRJT047CiAgICAgICB9CisgICAgICBmdW5jdGlvbiA9IEZyYW1lRnVuY3Rpb24oRlApOwogICAgICAgYXJnZGVzY18gPSBBcnJheTo6UmF3Q2FzdChTUFsxXSk7CiAgICAgfQogCisgICAgLy8gSWYgdGhlIGZpZWxkIG5hbWUgaW4gdGhlIGFyZ3VtZW50cyBpcyBkaWZmZXJlbnQgYWZ0ZXIgdGhlIGNhbGwsIHRoZW4KKyAgICAvLyB0aGlzIHdhcyBhIGR5bmFtaWMgY2FsbC4KKyAgICBTdHJpbmdQdHIgZmllbGRfbmFtZSA9IFN0cmluZzo6UmF3Q2FzdChTUFs0XSk7CisgICAgY29uc3QgYm9vbCBpc19keW5hbWljX2NhbGwgPSBmdW5jdGlvbi0+cHRyKCktPm5hbWVfICE9IGZpZWxkX25hbWU7CisKICAgICAvLyBSZXBsYWNlIHJlY2VpdmVyIHdpdGggZmllbGQgdmFsdWUsIGtlZXAgYWxsIG90aGVyIGFyZ3VtZW50cywgYW5kCiAgICAgLy8gaW52b2tlICdjYWxsJyBmdW5jdGlvbiwgb3IgaWYgbm90IGZvdW5kLCBpbnZva2Ugbm9TdWNoTWV0aG9kLgogICAgIEZyYW1lQXJndW1lbnRzKEZQLCBhcmdjKVtyZWNlaXZlcl9pZHhdID0gcmVjZWl2ZXIgPSBTUFsyXTsKIAogICAgIC8vIElmIHRoZSBmaWVsZCB2YWx1ZSBpcyBhIGNsb3N1cmUsIG5vIG5lZWQgdG8gcmVzb2x2ZSAnY2FsbCcgZnVuY3Rpb24uCiAgICAgaWYgKEludGVycHJldGVySGVscGVyczo6R2V0Q2xhc3NJZChyZWNlaXZlcikgPT0ga0Nsb3N1cmVDaWQpIHsKKyAgICAgIGlmIChpc19keW5hbWljX2NhbGwpIHsKKyAgICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS80MDgxMyk6IE1vdmUgY2hlY2tzIHRoYXQgYXJlIGN1cnJlbnRseSBjb21waWxlZAorICAgICAgICAvLyBpbiB0aGUgY2xvc3VyZSBib2R5IHRvIGhlcmUgYXMgdGhleSBhcmUgYWxzbyBtb3ZlZCB0bworICAgICAgICAvLyBGbG93R3JhcGhCdWlsZGVyOjpCdWlsZEdyYXBoT2ZJbnZva2VGaWVsZERpc3BhdGNoZXIuCisgICAgICB9CiAgICAgICBTUFsxXSA9IENsb3N1cmU6OlJhd0Nhc3QocmVjZWl2ZXIpLT5wdHIoKS0+ZnVuY3Rpb25fOwogICAgICAgZ290byBUYWlsQ2FsbFNQMTsKICAgICB9CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2lzb2xhdGUuaCBiL3J1bnRpbWUvdm0vaXNvbGF0ZS5oCmluZGV4IDdlYWU5N2QuLjJjMjE3ZTYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vaXNvbGF0ZS5oCisrKyBiL3J1bnRpbWUvdm0vaXNvbGF0ZS5oCkBAIC0zNzAsNiArMzcwLDEwIEBACiAgIH0KICAgTXV0ZXgqIHN1YnR5cGVfdGVzdF9jYWNoZV9tdXRleCgpIHsgcmV0dXJuICZzdWJ0eXBlX3Rlc3RfY2FjaGVfbXV0ZXhfOyB9CiAKKyNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKKyAgTXV0ZXgqIHVubGlua2VkX2NhbGxfbWFwX211dGV4KCkgeyByZXR1cm4gJnVubGlua2VkX2NhbGxfbWFwX211dGV4XzsgfQorI2VuZGlmCisKICNpZiAhZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCiAgIE11dGV4KiBpbml0aWFsaXplcl9mdW5jdGlvbnNfbXV0ZXgoKSB7IHJldHVybiAmaW5pdGlhbGl6ZXJfZnVuY3Rpb25zX211dGV4XzsgfQogI2VuZGlmICAvLyAhZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCkBAIC02NDYsNiArNjUwLDEwIEBACiAgIE11dGV4IHR5cGVfYXJndW1lbnRzX2Nhbm9uaWNhbGl6YXRpb25fbXV0ZXhfOwogICBNdXRleCBzdWJ0eXBlX3Rlc3RfY2FjaGVfbXV0ZXhfOwogCisjaWYgZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCisgIE11dGV4IHVubGlua2VkX2NhbGxfbWFwX211dGV4XzsKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogICBNdXRleCBpbml0aWFsaXplcl9mdW5jdGlvbnNfbXV0ZXhfOwogI2VuZGlmICAvLyAhZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuY2MgYi9ydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuY2MKaW5kZXggMzcyMGZlMi4uYzM0NTIzZSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9rZXJuZWxfYmluYXJ5LmNjCisrKyBiL3J1bnRpbWUvdm0va2VybmVsX2JpbmFyeS5jYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInZtL2tlcm5lbC5oIgogI2luY2x1ZGUgInZtL29iamVjdC5oIgogI2luY2x1ZGUgInZtL29zLmgiCisjaW5jbHVkZSAidm0vdmVyc2lvbi5oIgogCiBuYW1lc3BhY2UgZGFydCB7CiAKQEAgLTg0LDEyICs4NSwxNyBAQAogICAgICJJbnZhbGlkIGtlcm5lbCBiaW5hcnkgZm9ybWF0IHZlcnNpb24iOwogY29uc3QgY2hhcioga0tlcm5lbEludmFsaWRTaXplSW5kaWNhdGVkID0KICAgICAiSW52YWxpZCBrZXJuZWwgYmluYXJ5OiBJbmRpY2F0ZWQgc2l6ZSBpcyBpbnZhbGlkIjsKK2NvbnN0IGNoYXIqIGtLZXJuZWxJbnZhbGlkU2RrSGFzaCA9ICJJbnZhbGlkIFNESyBoYXNoIjsKKworY29uc3QgaW50IGtTZGtIYXNoU2l6ZUluQnl0ZXMgPSAxMDsKK2NvbnN0IGNoYXIqIGtTZGtIYXNoTnVsbCA9ICIwMDAwMDAwMDAwIjsKIAogc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IFByb2dyYW06OlJlYWRGcm9tKFJlYWRlciogcmVhZGVyLCBjb25zdCBjaGFyKiogZXJyb3IpIHsKLSAgaWYgKHJlYWRlci0+c2l6ZSgpIDwgNjApIHsKLSAgICAvLyBBIGtlcm5lbCBmaWxlICh2NDEpIGN1cnJlbnRseSBjb250YWlucyBhdCBsZWFzdCB0aGUgZm9sbG93aW5nOgorICBpZiAocmVhZGVyLT5zaXplKCkgPCA3MCkgeworICAgIC8vIEEga2VybmVsIGZpbGUgKHY0MykgY3VycmVudGx5IGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmc6CiAgICAgLy8gICAqIE1hZ2ljIG51bWJlciAoMzIpCiAgICAgLy8gICAqIEtlcm5lbCB2ZXJzaW9uICgzMikKKyAgICAvLyAgICogU0RLIEhhc2ggKDEwICogOCkKICAgICAvLyAgICogTGlzdCBvZiBwcm9ibGVtcyAoOCkKICAgICAvLyAgICogTGVuZ3RoIG9mIHNvdXJjZSBtYXAgKDMyKQogICAgIC8vICAgKiBMZW5ndGggb2YgY2Fub25pY2FsIG5hbWUgdGFibGUgKDgpCkBAIC05OCw3ICsxMDQsNyBAQAogICAgIC8vICAgKiBMZW5ndGggb2YgY29uc3RhbnQgdGFibGUgKDgpCiAgICAgLy8gICAqIENvbXBvbmVudCBpbmRleCAoMTEgKiAzMikKICAgICAvLwotICAgIC8vIHNvIGlzIGF0IGxlYXN0IDY0IGJ5dGVzLgorICAgIC8vIHNvIGlzIGF0IGxlYXN0IDc0IGJ5dGVzLgogICAgIC8vIChUZWNobmljYWxseSBpdCB3aWxsIGFsc28gY29udGFpbiBhbiBlbXB0eSBlbnRyeSBpbiBib3RoIHNvdXJjZSBtYXAgYW5kCiAgICAgLy8gc3RyaW5nIHRhYmxlLCB0YWtpbmcgdXAgYW5vdGhlciA4IGJ5dGVzLikKICAgICBpZiAoZXJyb3IgIT0gbnVsbHB0cikgewpAQCAtMTI0LDYgKzEzMCwxOCBAQAogICAgIHJldHVybiBudWxscHRyOwogICB9CiAKKyAgdWludDhfdCBzZGtIYXNoW2tTZGtIYXNoU2l6ZUluQnl0ZXMgKyAxXTsKKyAgcmVhZGVyLT5SZWFkQnl0ZXMoc2RrSGFzaCwga1Nka0hhc2hTaXplSW5CeXRlcyk7CisgIHNka0hhc2hba1Nka0hhc2hTaXplSW5CeXRlc10gPSAwOyAgLy8gTnVsbCB0ZXJtaW5hdGUuCisgIGlmIChzdHJjbXAoVmVyc2lvbjo6U2RrSGFzaCgpLCBrU2RrSGFzaE51bGwpICE9IDAgJiYKKyAgICAgIHN0cmNtcCgoY29uc3QgY2hhciopc2RrSGFzaCwga1Nka0hhc2hOdWxsKSAhPSAwICYmCisgICAgICBzdHJjbXAoKGNvbnN0IGNoYXIqKXNka0hhc2gsIFZlcnNpb246OlNka0hhc2goKSkgIT0gMCkgeworICAgIGlmIChlcnJvciAhPSBudWxscHRyKSB7CisgICAgICAqZXJyb3IgPSBrS2VybmVsSW52YWxpZFNka0hhc2g7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IHByb2dyYW0obmV3IFByb2dyYW0oKSk7CiAgIHByb2dyYW0tPmJpbmFyeV92ZXJzaW9uXyA9IGZvcm1hdFZlcnNpb247CiAgIHByb2dyYW0tPnR5cGVkX2RhdGFfID0gcmVhZGVyLT50eXBlZF9kYXRhKCk7CkBAIC0xNTIsMTMgKzE3MCw4IEBACiAgIC8vIFJlYWQgYmFja3dhcmRzIGF0IHRoZSBlbmQuCiAgIHByb2dyYW0tPmxpYnJhcnlfY291bnRfID0gcmVhZGVyLT5SZWFkRnJvbUluZGV4Tm9SZXNldCgKICAgICAgIHJlYWRlci0+c2l6ZV8sIExpYnJhcnlDb3VudEZpZWxkQ291bnRGcm9tRW5kLCAxLCAwKTsKLSAgc3RhdGljX2Fzc2VydChrTWluU3VwcG9ydGVkS2VybmVsRm9ybWF0VmVyc2lvbiA8IDQxLCAiY2xlYW51cCB0aGlzIGNvZGUiKTsKICAgaW50cHRyX3QgY291bnRfZnJvbV9maXJzdF9saWJyYXJ5X29mZnNldCA9Ci0gICAgICBTb3VyY2VUYWJsZUZpZWxkQ291bnRGcm9tRmlyc3RMaWJyYXJ5T2Zmc2V0UHJlNDE7Ci0gIGlmIChmb3JtYXRWZXJzaW9uID49IDQxKSB7Ci0gICAgY291bnRfZnJvbV9maXJzdF9saWJyYXJ5X29mZnNldCA9Ci0gICAgICAgIFNvdXJjZVRhYmxlRmllbGRDb3VudEZyb21GaXJzdExpYnJhcnlPZmZzZXQ0MVBsdXM7Ci0gIH0KKyAgICAgIFNvdXJjZVRhYmxlRmllbGRDb3VudEZyb21GaXJzdExpYnJhcnlPZmZzZXQ0MVBsdXM7CiAgIHByb2dyYW0tPnNvdXJjZV90YWJsZV9vZmZzZXRfID0gcmVhZGVyLT5SZWFkRnJvbUluZGV4Tm9SZXNldCgKICAgICAgIHJlYWRlci0+c2l6ZV8sCiAgICAgICBMaWJyYXJ5Q291bnRGaWVsZENvdW50RnJvbUVuZCArIDEgKyBwcm9ncmFtLT5saWJyYXJ5X2NvdW50XyArIDEgKwpAQCAtMTcxLDEzICsxODQsOSBAQAogICBwcm9ncmFtLT5jb25zdGFudF90YWJsZV9vZmZzZXRfID0gcmVhZGVyLT5SZWFkVUludDMyKCk7CiAKICAgcHJvZ3JhbS0+bWFpbl9tZXRob2RfcmVmZXJlbmNlXyA9IE5hbWVJbmRleChyZWFkZXItPlJlYWRVSW50MzIoKSAtIDEpOwotICBpZiAoZm9ybWF0VmVyc2lvbiA+PSA0MSkgewotICAgIE5OQkRDb21waWxlZE1vZGUgY29tcGlsYXRpb25fbW9kZSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PE5OQkRDb21waWxlZE1vZGU+KHJlYWRlci0+UmVhZFVJbnQzMigpKTsKLSAgICBwcm9ncmFtLT5jb21waWxhdGlvbl9tb2RlXyA9IGNvbXBpbGF0aW9uX21vZGU7Ci0gIH0gZWxzZSB7Ci0gICAgcHJvZ3JhbS0+Y29tcGlsYXRpb25fbW9kZV8gPSBOTkJEQ29tcGlsZWRNb2RlOjprRGlzYWJsZWQ7Ci0gIH0KKyAgTk5CRENvbXBpbGVkTW9kZSBjb21waWxhdGlvbl9tb2RlID0KKyAgICAgIHN0YXRpY19jYXN0PE5OQkRDb21waWxlZE1vZGU+KHJlYWRlci0+UmVhZFVJbnQzMigpKTsKKyAgcHJvZ3JhbS0+Y29tcGlsYXRpb25fbW9kZV8gPSBjb21waWxhdGlvbl9tb2RlOwogCiAgIHJldHVybiBwcm9ncmFtOwogfQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9rZXJuZWxfYmluYXJ5LmggYi9ydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuaAppbmRleCAxMTUyN2ViLi4zM2RjODM4IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuaAorKysgYi9ydW50aW1lL3ZtL2tlcm5lbF9iaW5hcnkuaApAQCAtMjAsOCArMjAsOCBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYWdpY1Byb2dyYW1GaWxlID0gMHg5MEFCQ0RFRnU7CiAKIC8vIEJvdGggdmVyc2lvbiBudW1iZXJzIGFyZSBpbmNsdXNpdmUuCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01pblN1cHBvcnRlZEtlcm5lbEZvcm1hdFZlcnNpb24gPSAyOTsKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4U3VwcG9ydGVkS2VybmVsRm9ybWF0VmVyc2lvbiA9IDQyOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5TdXBwb3J0ZWRLZXJuZWxGb3JtYXRWZXJzaW9uID0gNDM7CitzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFN1cHBvcnRlZEtlcm5lbEZvcm1hdFZlcnNpb24gPSA0MzsKIAogLy8gS2VlcCBpbiBzeW5jIHdpdGggcGFja2FnZTprZXJuZWwvbGliL2JpbmFyeS90YWcuZGFydAogI2RlZmluZSBLRVJORUxfVEFHX0xJU1QoVikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMyNiw2ICszMjYsMTIgQEAKIAogICB1aW50OF90IFBlZWtCeXRlKCkgeyByZXR1cm4gYnVmZmVyKClbb2Zmc2V0X107IH0KIAorICB2b2lkIFJlYWRCeXRlcyh1aW50OF90KiBidWZmZXIsIHVpbnQ4X3Qgc2l6ZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBidWZmZXJbaV0gPSBSZWFkQnl0ZSgpOworICAgIH0KKyAgfQorCiAgIGJvb2wgUmVhZEJvb2woKSB7IHJldHVybiAoUmVhZEJ5dGUoKSAmIDEpID09IDE7IH0KIAogICB1aW50OF90IFJlYWRGbGFncygpIHsgcmV0dXJuIFJlYWRCeXRlKCk7IH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0va2VybmVsX2xvYWRlci5jYyBiL3J1bnRpbWUvdm0va2VybmVsX2xvYWRlci5jYwppbmRleCAxZDBkNTQzNy4uMzdhNTQ2OSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9rZXJuZWxfbG9hZGVyLmNjCisrKyBiL3J1bnRpbWUvdm0va2VybmVsX2xvYWRlci5jYwpAQCAtMjk3LDcgKzI5NywxMSBAQAogICAgIHJlYWRlci5zZXRfcmF3X2J1ZmZlcihwcm9ncmFtLT5rZXJuZWxfZGF0YSgpICsgc3VicHJvZ3JhbV9zdGFydCk7CiAgICAgcmVhZGVyLnNldF9zaXplKHN1YnByb2dyYW1fZW5kIC0gc3VicHJvZ3JhbV9zdGFydCk7CiAgICAgcmVhZGVyLnNldF9vZmZzZXQoMCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IHN1YnByb2dyYW0gPSBQcm9ncmFtOjpSZWFkRnJvbSgmcmVhZGVyKTsKKyAgICBjb25zdCBjaGFyKiBlcnJvciA9IG51bGxwdHI7CisgICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IHN1YnByb2dyYW0gPSBQcm9ncmFtOjpSZWFkRnJvbSgmcmVhZGVyLCAmZXJyb3IpOworICAgIGlmIChzdWJwcm9ncmFtID09IG51bGxwdHIpIHsKKyAgICAgIEZBVEFMMSgiRmFpbGVkIHRvIGxvYWQga2VybmVsIGZpbGU6ICVzIiwgZXJyb3IpOworICAgIH0KICAgICBBU1NFUlQoc3VicHJvZ3JhbS0+aXNfc2luZ2xlX3Byb2dyYW0oKSk7CiAgICAgS2VybmVsTG9hZGVyIGxvYWRlcihzdWJwcm9ncmFtLmdldCgpLCAmdXJpX3RvX3NvdXJjZV90YWJsZSk7CiAgICAgT2JqZWN0JiBsb2FkX3Jlc3VsdCA9IE9iamVjdDo6SGFuZGxlKGxvYWRlci5Mb2FkUHJvZ3JhbShmYWxzZSkpOwpAQCAtODk0LDcgKzg5OCwxMSBAQAogICAgICAgcmVhZGVyLnNldF9yYXdfYnVmZmVyKHByb2dyYW0tPmtlcm5lbF9kYXRhKCkgKyBzdWJwcm9ncmFtX3N0YXJ0KTsKICAgICAgIHJlYWRlci5zZXRfc2l6ZShzdWJwcm9ncmFtX2VuZCAtIHN1YnByb2dyYW1fc3RhcnQpOwogICAgICAgcmVhZGVyLnNldF9vZmZzZXQoMCk7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbT4gc3VicHJvZ3JhbSA9IFByb2dyYW06OlJlYWRGcm9tKCZyZWFkZXIpOworICAgICAgY29uc3QgY2hhciogZXJyb3IgPSBudWxscHRyOworICAgICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IHN1YnByb2dyYW0gPSBQcm9ncmFtOjpSZWFkRnJvbSgmcmVhZGVyLCAmZXJyb3IpOworICAgICAgaWYgKHN1YnByb2dyYW0gPT0gbnVsbHB0cikgeworICAgICAgICBGQVRBTDEoIkZhaWxlZCB0byBsb2FkIGtlcm5lbCBmaWxlOiAlcyIsIGVycm9yKTsKKyAgICAgIH0KICAgICAgIEFTU0VSVChzdWJwcm9ncmFtLT5pc19zaW5nbGVfcHJvZ3JhbSgpKTsKICAgICAgIEtlcm5lbExvYWRlciBsb2FkZXIoc3VicHJvZ3JhbS5nZXQoKSwgLyp1cmlfdG9fc291cmNlX3RhYmxlPSovbnVsbHB0cik7CiAgICAgICBsb2FkZXIud2Fsa19pbmNyZW1lbnRhbF9rZXJuZWwobW9kaWZpZWRfbGlicywgaXNfZW1wdHlfcHJvZ3JhbSwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vb2JqZWN0LmNjIGIvcnVudGltZS92bS9vYmplY3QuY2MKaW5kZXggMjllNGM5Ny4uZGIzNDU4YSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9vYmplY3QuY2MKKysrIGIvcnVudGltZS92bS9vYmplY3QuY2MKQEAgLTY5MzksNiArNjkzOSwyMiBAQAogICByZXR1cm4gRmZpVHJhbXBvbGluZURhdGE6OkNhc3Qob2JqKS5jX3NpZ25hdHVyZSgpOwogfQogCitib29sIEZ1bmN0aW9uOjpGZmlDU2lnbmF0dXJlQ29udGFpbnNIYW5kbGVzKCkgY29uc3QgeworICBBU1NFUlQoSXNGZmlUcmFtcG9saW5lKCkpOworICBjb25zdCBGdW5jdGlvbiYgY19zaWduYXR1cmUgPSBGdW5jdGlvbjo6SGFuZGxlKEZmaUNTaWduYXR1cmUoKSk7CisgIGNvbnN0IGludHB0cl90IG51bV9wYXJhbXMgPSBjX3NpZ25hdHVyZS5udW1fZml4ZWRfcGFyYW1ldGVycygpOworICBmb3IgKGludHB0cl90IGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7CisgICAgY29uc3QgYm9vbCBpc19oYW5kbGUgPQorICAgICAgICBBYnN0cmFjdFR5cGU6OkhhbmRsZShjX3NpZ25hdHVyZS5QYXJhbWV0ZXJUeXBlQXQoaSkpLnR5cGVfY2xhc3NfaWQoKSA9PQorICAgICAgICBrRmZpSGFuZGxlQ2lkOworICAgIGlmIChpc19oYW5kbGUpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gQWJzdHJhY3RUeXBlOjpIYW5kbGUoY19zaWduYXR1cmUucmVzdWx0X3R5cGUoKSkudHlwZV9jbGFzc19pZCgpID09CisgICAgICAgICBrRmZpSGFuZGxlQ2lkOworfQorCiBpbnQzMl90IEZ1bmN0aW9uOjpGZmlDYWxsYmFja0lkKCkgY29uc3QgewogICBBU1NFUlQoSXNGZmlUcmFtcG9saW5lKCkpOwogICBjb25zdCBPYmplY3QmIG9iaiA9IE9iamVjdDo6SGFuZGxlKHJhd19wdHIoKS0+ZGF0YV8pOwpAQCAtMTQzMzIsMTQgKzE0MzQ4LDYgQEAKICAgcmV0dXJuIHJlc3VsdC5yYXcoKTsKIH0KIAotdm9pZCBVbmxpbmtlZENhbGw6OnNldF90YXJnZXRfbmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKSBjb25zdCB7Ci0gIFN0b3JlUG9pbnRlcigmcmF3X3B0cigpLT50YXJnZXRfbmFtZV8sIHZhbHVlLnJhdygpKTsKLX0KLQotdm9pZCBVbmxpbmtlZENhbGw6OnNldF9hcmdzX2Rlc2NyaXB0b3IoY29uc3QgQXJyYXkmIHZhbHVlKSBjb25zdCB7Ci0gIFN0b3JlUG9pbnRlcigmcmF3X3B0cigpLT5hcmdzX2Rlc2NyaXB0b3JfLCB2YWx1ZS5yYXcoKSk7Ci19Ci0KIHZvaWQgVW5saW5rZWRDYWxsOjpzZXRfY2FuX3BhdGNoX3RvX21vbm9tb3JwaGljKGJvb2wgdmFsdWUpIGNvbnN0IHsKICAgU3RvcmVOb25Qb2ludGVyKCZyYXdfcHRyKCktPmNhbl9wYXRjaF90b19tb25vbW9ycGhpY18sIHZhbHVlKTsKIH0KQEAgLTE0MzUwLDcgKzE0MzU4LDcgQEAKIAogYm9vbCBVbmxpbmtlZENhbGw6OkVxdWFscyhjb25zdCBVbmxpbmtlZENhbGwmIG90aGVyKSBjb25zdCB7CiAgIHJldHVybiAodGFyZ2V0X25hbWUoKSA9PSBvdGhlci50YXJnZXRfbmFtZSgpKSAmJgotICAgICAgICAgKGFyZ3NfZGVzY3JpcHRvcigpID09IG90aGVyLmFyZ3NfZGVzY3JpcHRvcigpKSAmJgorICAgICAgICAgKGFyZ3VtZW50c19kZXNjcmlwdG9yKCkgPT0gb3RoZXIuYXJndW1lbnRzX2Rlc2NyaXB0b3IoKSkgJiYKICAgICAgICAgIChjYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoKSA9PSBvdGhlci5jYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoKSk7CiB9CiAKQEAgLTE1Mjk1LDcgKzE1MzAzLDcgQEAKICAgQVNTRVJUKCFpc190cmFja2luZ19leGFjdG5lc3MoKSk7CiAgIGNvbnN0IFVubGlua2VkQ2FsbCYgcmVzdWx0ID0gVW5saW5rZWRDYWxsOjpIYW5kbGUoVW5saW5rZWRDYWxsOjpOZXcoKSk7CiAgIHJlc3VsdC5zZXRfdGFyZ2V0X25hbWUoU3RyaW5nOjpIYW5kbGUodGFyZ2V0X25hbWUoKSkpOwotICByZXN1bHQuc2V0X2FyZ3NfZGVzY3JpcHRvcihBcnJheTo6SGFuZGxlKGFyZ3VtZW50c19kZXNjcmlwdG9yKCkpKTsKKyAgcmVzdWx0LnNldF9hcmd1bWVudHNfZGVzY3JpcHRvcihBcnJheTo6SGFuZGxlKGFyZ3VtZW50c19kZXNjcmlwdG9yKCkpKTsKICAgcmVzdWx0LnNldF9jYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoIUZMQUdfcHJlY29tcGlsZWRfbW9kZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcl9jYW5ub3RfYmVfc21pKCkpOwogICByZXR1cm4gcmVzdWx0LnJhdygpOwpAQCAtMTU5NTYsNiArMTU5NjQsNyBAQAogCiAjaWYgZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVSKQogREVDTEFSRV9GTEFHKGNoYXJwLCB3cml0ZV92OF9zbmFwc2hvdF9wcm9maWxlX3RvKTsKK0RFQ0xBUkVfRkxBRyhjaGFycCwgdHJhY2VfcHJlY29tcGlsZXJfdG8pOwogI2VuZGlmICAvLyBkZWZpbmVkKERBUlRfUFJFQ09NUElMRVIpCiAKIENvZGVQdHIgQ29kZTo6RmluYWxpemVDb2RlKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlciwKQEAgLTE1OTc3LDEyICsxNTk4NiwxMyBAQAogICAgIH0KICAgfSBlbHNlIHsKICNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRVIpCi0gICAgaWYgKEZMQUdfd3JpdGVfdjhfc25hcHNob3RfcHJvZmlsZV90byAhPSBudWxscHRyICYmCi0gICAgICAgIGFzc2VtYmxlci0+SGFzT2JqZWN0UG9vbEJ1aWxkZXIoKSAmJgorICAgIGNvbnN0IGJvb2wgbmVlZHNfcG9vbCA9IChGTEFHX3dyaXRlX3Y4X3NuYXBzaG90X3Byb2ZpbGVfdG8gIT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkxBR190cmFjZV9wcmVjb21waWxlcl90byAhPSBudWxscHRyKTsKKyAgICBpZiAobmVlZHNfcG9vbCAmJiBhc3NlbWJsZXItPkhhc09iamVjdFBvb2xCdWlsZGVyKCkgJiYKICAgICAgICAgYXNzZW1ibGVyLT5vYmplY3RfcG9vbF9idWlsZGVyKCkuSGFzUGFyZW50KCkpIHsKICAgICAgIC8vIFdlIGFyZSBub3QgZ29pbmcgdG8gd3JpdGUgdGhpcyBwb29sIGludG8gc25hcHNob3QsIGJ1dCB3ZSB3aWxsIHVzZQotICAgICAgLy8gaXQgdG8gZW1pdCByZWZlcmVuY2VzIGZyb20gY29kZSBvYmplY3QgdG8gb3RoZXIgb2JqZWN0cyBpbiB0aGUKLSAgICAgIC8vIHNuYXBzaG90IHRoYXQgaXQgY2F1c2VkIHRvIGJlIGFkZGVkIHRvIHRoZSBwb29sLgorICAgICAgLy8gaXQgdG8gZW1pdCByZWZlcmVuY2VzIGZyb20gdGhpcyBjb2RlIG9iamVjdCB0byBvdGhlciBvYmplY3RzIGluIHRoZQorICAgICAgLy8gc25hcHNob3QgdGhhdCBpdCB1c2VzLgogICAgICAgb2JqZWN0X3Bvb2wgPQogICAgICAgICAgIE9iamVjdFBvb2w6Ok5ld0Zyb21CdWlsZGVyKGFzc2VtYmxlci0+b2JqZWN0X3Bvb2xfYnVpbGRlcigpKTsKICAgICB9CkBAIC0yMzQ2MCw3ICsyMzQ3MCw3IEBACiB9CiAKIFBvaW50ZXJQdHIgUG9pbnRlcjo6TmV3KGNvbnN0IEFic3RyYWN0VHlwZSYgdHlwZV9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmF0aXZlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICB1d29yZCBuYXRpdmVfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgIEhlYXA6OlNwYWNlIHNwYWNlKSB7CiAgIFRocmVhZCogdGhyZWFkID0gVGhyZWFkOjpDdXJyZW50KCk7CiAgIFpvbmUqIHpvbmUgPSB0aHJlYWQtPnpvbmUoKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vb2JqZWN0LmggYi9ydW50aW1lL3ZtL29iamVjdC5oCmluZGV4IDAxOTNmY2QuLmNjYjg0ZDQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vb2JqZWN0LmgKKysrIGIvcnVudGltZS92bS9vYmplY3QuaApAQCAtMTkxOSwzNiArMTkxOSw5IEBACiAgIGZyaWVuZCBjbGFzcyBDbGFzczsKIH07CiAKLWNsYXNzIFVubGlua2VkQ2FsbCA6IHB1YmxpYyBPYmplY3QgewotIHB1YmxpYzoKLSAgU3RyaW5nUHRyIHRhcmdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gcmF3X3B0cigpLT50YXJnZXRfbmFtZV87IH0KLSAgdm9pZCBzZXRfdGFyZ2V0X25hbWUoY29uc3QgU3RyaW5nJiB0YXJnZXRfbmFtZSkgY29uc3Q7Ci0gIEFycmF5UHRyIGFyZ3NfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIHJhd19wdHIoKS0+YXJnc19kZXNjcmlwdG9yXzsgfQotICB2b2lkIHNldF9hcmdzX2Rlc2NyaXB0b3IoY29uc3QgQXJyYXkmIGFyZ3NfZGVzY3JpcHRvcikgY29uc3Q7Ci0KLSAgYm9vbCBjYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJhd19wdHIoKS0+Y2FuX3BhdGNoX3RvX21vbm9tb3JwaGljXzsKLSAgfQotICB2b2lkIHNldF9jYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoYm9vbCB2YWx1ZSkgY29uc3Q7Ci0KLSAgc3RhdGljIGludHB0cl90IEluc3RhbmNlU2l6ZSgpIHsKLSAgICByZXR1cm4gUm91bmRlZEFsbG9jYXRpb25TaXplKHNpemVvZihVbmxpbmtlZENhbGxMYXlvdXQpKTsKLSAgfQotCi0gIGludHB0cl90IEhhc2hjb2RlKCkgY29uc3Q7Ci0gIGJvb2wgRXF1YWxzKGNvbnN0IFVubGlua2VkQ2FsbCYgb3RoZXIpIGNvbnN0OwotCi0gIHN0YXRpYyBVbmxpbmtlZENhbGxQdHIgTmV3KCk7Ci0KLSBwcml2YXRlOgotICBGSU5BTF9IRUFQX09CSkVDVF9JTVBMRU1FTlRBVElPTihVbmxpbmtlZENhbGwsIE9iamVjdCk7Ci0gIGZyaWVuZCBjbGFzcyBDbGFzczsKLX07Ci0KIGNsYXNzIENhbGxTaXRlRGF0YSA6IHB1YmxpYyBPYmplY3QgewogIHB1YmxpYzoKICAgU3RyaW5nUHRyIHRhcmdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gcmF3X3B0cigpLT50YXJnZXRfbmFtZV87IH0KLQogICBBcnJheVB0ciBhcmd1bWVudHNfZGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIHJhd19wdHIoKS0+YXJnc19kZXNjcmlwdG9yXzsgfQogCiAgIHN0YXRpYyBpbnRwdHJfdCB0YXJnZXRfbmFtZV9vZmZzZXQoKSB7CkBAIC0xOTYxLDcgKzE5MzQsNiBAQAogCiAgcHJpdmF0ZToKICAgdm9pZCBzZXRfdGFyZ2V0X25hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkgY29uc3Q7Ci0KICAgdm9pZCBzZXRfYXJndW1lbnRzX2Rlc2NyaXB0b3IoY29uc3QgQXJyYXkmIHZhbHVlKSBjb25zdDsKIAogICBIRUFQX09CSkVDVF9JTVBMRU1FTlRBVElPTihDYWxsU2l0ZURhdGEsIE9iamVjdCkKQEAgLTE5NzAsNiArMTk0MiwzMCBAQAogICBmcmllbmQgY2xhc3MgTWVnYW1vcnBoaWNDYWNoZTsKIH07CiAKK2NsYXNzIFVubGlua2VkQ2FsbCA6IHB1YmxpYyBDYWxsU2l0ZURhdGEgeworIHB1YmxpYzoKKyAgYm9vbCBjYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJhd19wdHIoKS0+Y2FuX3BhdGNoX3RvX21vbm9tb3JwaGljXzsKKyAgfQorCisgIHN0YXRpYyBpbnRwdHJfdCBJbnN0YW5jZVNpemUoKSB7CisgICAgcmV0dXJuIFJvdW5kZWRBbGxvY2F0aW9uU2l6ZShzaXplb2YoVW5saW5rZWRDYWxsTGF5b3V0KSk7CisgIH0KKworICBpbnRwdHJfdCBIYXNoY29kZSgpIGNvbnN0OworICBib29sIEVxdWFscyhjb25zdCBVbmxpbmtlZENhbGwmIG90aGVyKSBjb25zdDsKKworICBzdGF0aWMgVW5saW5rZWRDYWxsUHRyIE5ldygpOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIElDRGF0YTsgIC8vIEZvciBzZXRfKigpIG1ldGhvZHMuCisKKyAgdm9pZCBzZXRfY2FuX3BhdGNoX3RvX21vbm9tb3JwaGljKGJvb2wgdmFsdWUpIGNvbnN0OworCisgIEZJTkFMX0hFQVBfT0JKRUNUX0lNUExFTUVOVEFUSU9OKFVubGlua2VkQ2FsbCwgQ2FsbFNpdGVEYXRhKTsKKyAgZnJpZW5kIGNsYXNzIENsYXNzOworfTsKKwogLy8gT2JqZWN0IGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYW4gSUM6IHRlc3QgY2xhc3NlcyBhbmQgdGhlaXIKIC8vIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy4gVGhlIG93bmVyIG9mIHRoZSBJQ0RhdGEgY2FuIGJlIGVpdGhlciB0aGUgZnVuY3Rpb24KIC8vIG9yIHRoZSBvcmlnaW5hbCBJQ0RhdGEgb2JqZWN0LiBJbiBjYXNlIG9mIGJhY2tncm91bmQgY29tcGlsYXRpb24gd2UKQEAgLTI1MDQsNiArMjUwMCw4IEBACiAgIC8vIENhbiBvbmx5IGJlIHVzZWQgb24gRkZJIHRyYW1wb2xpbmVzLgogICBGdW5jdGlvblB0ciBGZmlDU2lnbmF0dXJlKCkgY29uc3Q7CiAKKyAgYm9vbCBGZmlDU2lnbmF0dXJlQ29udGFpbnNIYW5kbGVzKCkgY29uc3Q7CisKICAgLy8gQ2FuIG9ubHkgYmUgY2FsbGVkIG9uIEZGSSB0cmFtcG9saW5lcy4KICAgLy8gLTEgZm9yIERhcnQgLT4gbmF0aXZlIGNhbGxzLgogICBpbnQzMl90IEZmaUNhbGxiYWNrSWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vb2JqZWN0X3NlcnZpY2UuY2MgYi9ydW50aW1lL3ZtL29iamVjdF9zZXJ2aWNlLmNjCmluZGV4IGU5MTM4YzEuLjJlNGJjOWIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vb2JqZWN0X3NlcnZpY2UuY2MKKysrIGIvcnVudGltZS92bS9vYmplY3Rfc2VydmljZS5jYwpAQCAtODEwLDcgKzgxMCw4IEBACiAgIGlmIChyZWYpIHsKICAgICByZXR1cm47CiAgIH0KLSAganNvYmouQWRkUHJvcGVydHkoIl9hcmd1bWVudHNEZXNjcmlwdG9yIiwgQXJyYXk6OkhhbmRsZShhcmdzX2Rlc2NyaXB0b3IoKSkpOworICBqc29iai5BZGRQcm9wZXJ0eSgiX2FyZ3VtZW50c0Rlc2NyaXB0b3IiLAorICAgICAgICAgICAgICAgICAgICBBcnJheTo6SGFuZGxlKGFyZ3VtZW50c19kZXNjcmlwdG9yKCkpKTsKIH0KIAogdm9pZCBNb25vbW9ycGhpY1NtaWFibGVDYWxsOjpQcmludEpTT05JbXBsKEpTT05TdHJlYW0qIHN0cmVhbSwgYm9vbCByZWYpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vb2JqZWN0X3N0b3JlLmggYi9ydW50aW1lL3ZtL29iamVjdF9zdG9yZS5oCmluZGV4IGE0MmE4ZWIuLjRiMjgwNTcgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vb2JqZWN0X3N0b3JlLmgKKysrIGIvcnVudGltZS92bS9vYmplY3Rfc3RvcmUuaApAQCAtMTgwLDYgKzE4MCw4IEBACiAgIFJXKENvZGUsIG51bGxfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBSVyhDb2RlLCBudWxsX2FyZ19lcnJvcl9zdHViX3dpdGhfZnB1X3JlZ3Nfc3R1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgUlcoQ29kZSwgbnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJXKENvZGUsIG51bGxfY2FzdF9lcnJvcl9zdHViX3dpdGhfZnB1X3JlZ3Nfc3R1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSVyhDb2RlLCBudWxsX2Nhc3RfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgUlcoQ29kZSwgcmFuZ2VfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFJXKENvZGUsIHJhbmdlX2Vycm9yX3N0dWJfd2l0aG91dF9mcHVfcmVnc19zdHViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBSVyhDb2RlLCBhbGxvY2F0ZV9taW50X3dpdGhfZnB1X3JlZ3Nfc3R1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyNCw2ICsyMjYsOSBAQAogICBETyhudWxsX2FyZ19lcnJvcl9zdHViX3dpdGhfZnB1X3JlZ3Nfc3R1YiwgTnVsbEFyZ0Vycm9yU2hhcmVkV2l0aEZQVVJlZ3MpICAgIFwKICAgRE8obnVsbF9hcmdfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIE51bGxBcmdFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBETyhudWxsX2Nhc3RfZXJyb3Jfc3R1Yl93aXRoX2ZwdV9yZWdzX3N0dWIsIE51bGxDYXN0RXJyb3JTaGFyZWRXaXRoRlBVUmVncykgIFwKKyAgRE8obnVsbF9jYXN0X2Vycm9yX3N0dWJfd2l0aG91dF9mcHVfcmVnc19zdHViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIE51bGxDYXN0RXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBETyhyYW5nZV9lcnJvcl9zdHViX3dpdGhfZnB1X3JlZ3Nfc3R1YiwgUmFuZ2VFcnJvclNoYXJlZFdpdGhGUFVSZWdzKSAgICAgICAgIFwKICAgRE8ocmFuZ2VfZXJyb3Jfc3R1Yl93aXRob3V0X2ZwdV9yZWdzX3N0dWIsIFJhbmdlRXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncykgICBcCiAgIERPKGFsbG9jYXRlX21pbnRfd2l0aF9mcHVfcmVnc19zdHViLCBBbGxvY2F0ZU1pbnRTaGFyZWRXaXRoRlBVUmVncykgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9wcm9maWxlci5jYyBiL3J1bnRpbWUvdm0vcHJvZmlsZXIuY2MKaW5kZXggZGI1ODZjZS4uYmM4MTk5ZiAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9wcm9maWxlci5jYworKysgYi9ydW50aW1lL3ZtL3Byb2ZpbGVyLmNjCkBAIC0zMiwxNyArMzIsMTAgQEAKIAogREVGSU5FX0ZMQUcoYm9vbCwgdHJhY2VfcHJvZmlsZWRfaXNvbGF0ZXMsIGZhbHNlLCAiVHJhY2UgcHJvZmlsZWQgaXNvbGF0ZXMuIik7CiAKLSNpZiBkZWZpbmVkKFRBUkdFVF9BUkNIX0FSTV82KQotREVGSU5FX0ZMQUcoaW50LAotICAgICAgICAgICAgcHJvZmlsZV9wZXJpb2QsCi0gICAgICAgICAgICAxMDAwMCwKLSAgICAgICAgICAgICJUaW1lIGJldHdlZW4gcHJvZmlsZXIgc2FtcGxlcyBpbiBtaWNyb3NlY29uZHMuIE1pbmltdW0gNTAuIik7Ci0jZWxzZQogREVGSU5FX0ZMQUcoaW50LAogICAgICAgICAgICAgcHJvZmlsZV9wZXJpb2QsCiAgICAgICAgICAgICAxMDAwLAogICAgICAgICAgICAgIlRpbWUgYmV0d2VlbiBwcm9maWxlciBzYW1wbGVzIGluIG1pY3Jvc2Vjb25kcy4gTWluaW11bSA1MC4iKTsKLSNlbmRpZgogREVGSU5FX0ZMQUcoaW50LAogICAgICAgICAgICAgbWF4X3Byb2ZpbGVfZGVwdGgsCiAgICAgICAgICAgICBrU2FtcGxlU2l6ZSoga01heFNhbXBsZXNQZXJUaWNrLApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9wcm9ncmFtX3Zpc2l0b3IuY2MgYi9ydW50aW1lL3ZtL3Byb2dyYW1fdmlzaXRvci5jYwppbmRleCA0ZDQ2N2IwLi40MTU4MmEzIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3Byb2dyYW1fdmlzaXRvci5jYworKysgYi9ydW50aW1lL3ZtL3Byb2dyYW1fdmlzaXRvci5jYwpAQCAtNDE0LDYgKzQxNCw3IEBACiAgIFdhbGtQcm9ncmFtKHpvbmUsIGlzb2xhdGUsICZ2aXNpdG9yKTsKIH0KIAorREVDTEFSRV9GTEFHKGNoYXJwLCB0cmFjZV9wcmVjb21waWxlcl90byk7CiBERUNMQVJFX0ZMQUcoY2hhcnAsIHdyaXRlX3Y4X3NuYXBzaG90X3Byb2ZpbGVfdG8pOwogCiB2b2lkIFByb2dyYW1WaXNpdG9yOjpTaGFyZU1lZ2Ftb3JwaGljQnVja2V0cyhab25lKiB6b25lLCBJc29sYXRlKiBpc29sYXRlKSB7CkBAIC05MTMsNyArOTE0LDggQEAKICAgLy8gaW1wbGljaXQgYW5kIGdvIHRocm91Z2ggZ2xvYmFsIG9iamVjdCBwb29sKS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQKICAgLy8gdG8gcHJvZHVjZSBtb3JlIGluZm9ybWF0aXZlIHNuYXBzaG90IHByb2ZpbGUuCiAgIGlmICghRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMgfHwKLSAgICAgIEZMQUdfd3JpdGVfdjhfc25hcHNob3RfcHJvZmlsZV90byAhPSBudWxscHRyKSB7CisgICAgICBGTEFHX3dyaXRlX3Y4X3NuYXBzaG90X3Byb2ZpbGVfdG8gIT0gbnVsbHB0ciB8fAorICAgICAgRkxBR190cmFjZV9wcmVjb21waWxlcl90byAhPSBudWxscHRyKSB7CiAgICAgV2Fsa1Byb2dyYW0oem9uZSwgaXNvbGF0ZSwgJmRlZHVwZXIpOwogICB9CiB9CkBAIC0xMjc0LDYgKzEyNzYsMjUgQEAKIAogICAvLyBSZWR1Y2VzIGJpbmFyeSBzaXplIGJ1dCBvYmZ1c2NhdGVzIHByb2ZpbGVyIHJlc3VsdHMuCiAgIGlmIChGTEFHX2RlZHVwX2luc3RydWN0aW9ucykgeworICAgIC8vIEluIG5vbi1iYXJlIG1vZGUgKHVudXNlZCBhdG0pIGRlZHVwcGluZyBpbnN0cnVjdGlvbnMgd291bGQgY2F1c2UgdXMgdG8KKyAgICAvLyBsb29zZSB0aGUgYWJpbGl0eSB0byB1bmlxdWVseSBtYXAgYSBQQyB0byBhIGdpdmVuIFVubGlua2VkQ2FsbCBvYmplY3QsCisgICAgLy8gc2luY2UgdHdvIGNvZGUgb2JqZWN0cyBtaWdodCBwb2ludCB0byB0aGUgc2FtZSBkZWR1cGVkIGluc3RydWN0aW9ucworICAgIC8vIG9iamVjdCBidXQgbWlnaHQgaGF2ZSB0d28gZGlmZmVyZW50IFVubGlua2VkQ2FsbCBvYmplY3RzIGluIHRoZWlyIHBvb2wuCisgICAgLy8KKyAgICAvLyBJbiBiYXJlIG1vZGUgdGhpcyBjYW5ub3QgaGFwcGVuIGJlY2F1c2UgZGlmZmVyZW50IFVubGlua2VkQ2FsbCBvYmplY3RzCisgICAgLy8gd291bGQgZ2V0IGRpZmZlcmVudCBpbmRpY2VzIGludG8gdGhlIChnbG9iYWwpIG9iamVjdCBwb29sLCB0aGVyZWZvcmUKKyAgICAvLyBtYWtpbmcgdGhlIGluc3RydWN0aW9ucyBkaWZmZXJlbnQuCisgICAgLy8KKyAgICAvLyAoV2hlbiB0cmFuc2l0aW9uaW5nIHRoZSBzd2l0Y2hhYmxlIGNhbGwgc2l0ZSB3ZSBsb29zZSB0cmFjayBvZiB0aGUgYXJncworICAgIC8vIGRlc2NyaXB0b3IuIFNpbmNlIHdlIG5lZWQgaXQgZm9yIGZ1cnRoZXIgdHJhbnNpdGlvbnMgd2UgY3VycmVudGx5IHNhdmUgaXQKKyAgICAvLyB2aWEgYSBQQyAtPiBVbmxpbmtlZENhbGwgbWFwcGluZykuCisgICAgLy8KKyAgICAvLyBXZSB0aGVyZm9yZSBkaXNhYmxlIHRoZSBpbnN0cnVjdGlvbiBkZWR1cGxpY2F0aW9uIGluIHByb2R1Y3Qtbm9uLWJhcmUKKyAgICAvLyBtb2RlICh3aGljaCBpcyB1bnVzZWQgYXRtKS4KKyNpZiBkZWZpbmVkKFBST0RVQ1QpCisgICAgaWYgKEZMQUdfcHJlY29tcGlsZWRfbW9kZSAmJiAhRkxBR191c2VfYmFyZV9pbnN0cnVjdGlvbnMpIHJldHVybjsKKyNlbmRpZgorCiAgICAgRGVkdXBJbnN0cnVjdGlvbnMoem9uZSwgaXNvbGF0ZSk7CiAgIH0KICNlbmRpZiAgLy8gIWRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9yYXdfb2JqZWN0LmggYi9ydW50aW1lL3ZtL3Jhd19vYmplY3QuaAppbmRleCBjOTg3NWNhLi4zMDg5ZDBiIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3Jhd19vYmplY3QuaAorKysgYi9ydW50aW1lL3ZtL3Jhd19vYmplY3QuaApAQCAtMTk3OSwxNiArMTk3OSw2IEBACiAgIGNsYXNzaWRfdCB1cHBlcl9saW1pdF87CiB9OwogCi1jbGFzcyBVbmxpbmtlZENhbGxMYXlvdXQgOiBwdWJsaWMgT2JqZWN0TGF5b3V0IHsKLSAgUkFXX0hFQVBfT0JKRUNUX0lNUExFTUVOVEFUSU9OKFVubGlua2VkQ2FsbCk7Ci0gIFZJU0lUX0ZST00oT2JqZWN0UHRyLCB0YXJnZXRfbmFtZV8pOwotICBTdHJpbmdQdHIgdGFyZ2V0X25hbWVfOwotICBBcnJheVB0ciBhcmdzX2Rlc2NyaXB0b3JfOwotICBWSVNJVF9UTyhPYmplY3RQdHIsIGFyZ3NfZGVzY3JpcHRvcl8pOwotICBib29sIGNhbl9wYXRjaF90b19tb25vbW9ycGhpY187Ci0gIE9iamVjdFB0ciogdG9fc25hcHNob3QoU25hcHNob3Q6OktpbmQga2luZCkgeyByZXR1cm4gdG8oKTsgfQotfTsKLQogY2xhc3MgTW9ub21vcnBoaWNTbWlhYmxlQ2FsbExheW91dCA6IHB1YmxpYyBPYmplY3RMYXlvdXQgewogICBSQVdfSEVBUF9PQkpFQ1RfSU1QTEVNRU5UQVRJT04oTW9ub21vcnBoaWNTbWlhYmxlQ2FsbCk7CiAgIFZJU0lUX0ZST00oT2JqZWN0UHRyLCB0YXJnZXRfKTsKQEAgLTIwMTAsNiArMjAwMCwxNSBAQAogICBSQVdfSEVBUF9PQkpFQ1RfSU1QTEVNRU5UQVRJT04oQ2FsbFNpdGVEYXRhKQogfTsKIAorY2xhc3MgVW5saW5rZWRDYWxsTGF5b3V0IDogcHVibGljIENhbGxTaXRlRGF0YUxheW91dCB7CisgIFJBV19IRUFQX09CSkVDVF9JTVBMRU1FTlRBVElPTihVbmxpbmtlZENhbGwpOworICBWSVNJVF9GUk9NKE9iamVjdFB0ciwgdGFyZ2V0X25hbWVfKTsKKyAgVklTSVRfVE8oT2JqZWN0UHRyLCBhcmdzX2Rlc2NyaXB0b3JfKTsKKyAgT2JqZWN0UHRyKiB0b19zbmFwc2hvdChTbmFwc2hvdDo6S2luZCBraW5kKSB7IHJldHVybiB0bygpOyB9CisKKyAgYm9vbCBjYW5fcGF0Y2hfdG9fbW9ub21vcnBoaWNfOworfTsKKwogY2xhc3MgSUNEYXRhTGF5b3V0IDogcHVibGljIENhbGxTaXRlRGF0YUxheW91dCB7CiAgIFJBV19IRUFQX09CSkVDVF9JTVBMRU1FTlRBVElPTihJQ0RhdGEpOwogICBWSVNJVF9GUk9NKE9iamVjdFB0ciwgdGFyZ2V0X25hbWVfKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vcmVnZXhwX2Fzc2VtYmxlcl9pci5jYyBiL3J1bnRpbWUvdm0vcmVnZXhwX2Fzc2VtYmxlcl9pci5jYwppbmRleCA4MjM0Nzc1Li4wMTExNDk2IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3JlZ2V4cF9hc3NlbWJsZXJfaXIuY2MKKysrIGIvcnVudGltZS92bS9yZWdleHBfYXNzZW1ibGVyX2lyLmNjCkBAIC0yODUsMTggKzI4NSw4IEBACiAgICAgICBUeXBlZERhdGE6Ok5ldyhrVHlwZWREYXRhSW50MzJBcnJheUNpZCwgcmVnaXN0ZXJzX2NvdW50XywgSGVhcDo6a09sZCk7CiB9CiAKLSNpZiBkZWZpbmVkKFRBUkdFVF9BUkNIX0FSTSkKLS8vIERpc2FibGluZyB1bmFsaWduZWQgYWNjZXNzZXMgZm9yY2VzIHRoZSByZWdleHAgZW5naW5lIHRvIGxvYWQgY2hhcmFjdGVycyBvbmUKLS8vIGJ5IG9uZSBpbnN0ZWFkIG9mIHVwIHRvIDQgYXQgb25jZSwgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBwZXJmb3JtYW5jZSBoaXQuCi0vLyBUT0RPKHplcm55KTogQmUgbGVzcyBjb25zZXJ2YXRpdmUgYWJvdXQgZGlzYWJsaW5nIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KLS8vIEZvciBpbnN0YW5jZSwgQVJNdjYgc3VwcG9ydHMgdW5hbGlnbmVkIGFjY2Vzc2VzLiBPbmNlIGl0IGlzIGVuYWJsZWQgaGVyZSwKLS8vIHVwZGF0ZSBMb2FkQ29kZVVuaXRzSW5zdHIgbWV0aG9kcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGFyY2hpdGVjdHVyZXMuCi1zdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlVW5hbGlnbmVkQWNjZXNzZXMgPSBmYWxzZTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlVW5hbGlnbmVkQWNjZXNzZXMgPSB0cnVlOwotI2VuZGlmCiBib29sIElSUmVnRXhwTWFjcm9Bc3NlbWJsZXI6OkNhblJlYWRVbmFsaWduZWQoKSB7Ci0gIHJldHVybiBrRW5hYmxlVW5hbGlnbmVkQWNjZXNzZXMgJiYgIXNsb3dfc2FmZSgpOworICByZXR1cm4gIXNsb3dfc2FmZSgpOwogfQogCiBBcnJheVB0ciBJUlJlZ0V4cE1hY3JvQXNzZW1ibGVyOjpFeGVjdXRlKGNvbnN0IFJlZ0V4cCYgcmVnZXhwLApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9ydW50aW1lX2VudHJ5LmNjIGIvcnVudGltZS92bS9ydW50aW1lX2VudHJ5LmNjCmluZGV4IDgyZjViNjcuLjk4ODEzZDEgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vcnVudGltZV9lbnRyeS5jYworKysgYi9ydW50aW1lL3ZtL3J1bnRpbWVfZW50cnkuY2MKQEAgLTIyNyw2ICsyMjcsMTAgQEAKICAgTnVsbEVycm9ySGVscGVyKHpvbmUsIHNlbGVjdG9yKTsKIH0KIAorREVGSU5FX1JVTlRJTUVfRU5UUlkoTnVsbENhc3RFcnJvciwgMCkgeworICBOdWxsRXJyb3JIZWxwZXIoem9uZSwgU3RyaW5nOjpudWxsX3N0cmluZygpKTsKK30KKwogREVGSU5FX1JVTlRJTUVfRU5UUlkoQXJndW1lbnROdWxsRXJyb3IsIDApIHsKICAgY29uc3QgU3RyaW5nJiBlcnJvciA9IFN0cmluZzo6SGFuZGxlKFN0cmluZzo6TmV3KCJhcmd1bWVudCB2YWx1ZSBpcyBudWxsIikpOwogICBFeGNlcHRpb25zOjpUaHJvd0FyZ3VtZW50RXJyb3IoZXJyb3IpOwpAQCAtNTA3LDEzICs1MTEsMTcgQEAKIAogLy8gSW52b2tlIGZpZWxkIGdldHRlciBiZWZvcmUgZGlzcGF0Y2guCiAvLyBBcmcwOiBpbnN0YW5jZS4KLS8vIEFyZzE6IGZpZWxkIG5hbWUuCisvLyBBcmcxOiBmaWVsZCBuYW1lIChtYXkgYmUgZGVtYW5nbGVkIGR1cmluZyBjYWxsKS4KIC8vIFJldHVybiB2YWx1ZTogZmllbGQgdmFsdWUuCiBERUZJTkVfUlVOVElNRV9FTlRSWShHZXRGaWVsZEZvckRpc3BhdGNoLCAyKSB7CiAgIEFTU0VSVChGTEFHX2VuYWJsZV9pbnRlcnByZXRlcik7CiAgIGNvbnN0IEluc3RhbmNlJiByZWNlaXZlciA9IEluc3RhbmNlOjpDaGVja2VkSGFuZGxlKHpvbmUsIGFyZ3VtZW50cy5BcmdBdCgwKSk7Ci0gIGNvbnN0IFN0cmluZyYgbmFtZSA9IFN0cmluZzo6Q2hlY2tlZEhhbmRsZSh6b25lLCBhcmd1bWVudHMuQXJnQXQoMSkpOworICBTdHJpbmcmIG5hbWUgPSBTdHJpbmc6OkNoZWNrZWRIYW5kbGUoem9uZSwgYXJndW1lbnRzLkFyZ0F0KDEpKTsKICAgY29uc3QgQ2xhc3MmIHJlY2VpdmVyX2NsYXNzID0gQ2xhc3M6OkhhbmRsZSh6b25lLCByZWNlaXZlci5jbGF6eigpKTsKKyAgaWYgKEZ1bmN0aW9uOjpJc0R5bmFtaWNJbnZvY2F0aW9uRm9yd2FyZGVyTmFtZShuYW1lKSkgeworICAgIG5hbWUgPSBGdW5jdGlvbjo6RGVtYW5nbGVEeW5hbWljSW52b2NhdGlvbkZvcndhcmRlck5hbWUobmFtZSk7CisgICAgYXJndW1lbnRzLlNldEFyZ0F0KDEsIG5hbWUpOyAgLy8gUmVmbGVjdCBjaGFuZ2UgaW4gYXJndW1lbnRzLgorICB9CiAgIGNvbnN0IFN0cmluZyYgZ2V0dGVyX25hbWUgPSBTdHJpbmc6OkhhbmRsZSh6b25lLCBGaWVsZDo6R2V0dGVyTmFtZShuYW1lKSk7CiAgIGNvbnN0IGludCBrVHlwZUFyZ3NMZW4gPSAwOwogICBjb25zdCBpbnQga051bUFyZ3VtZW50cyA9IDE7CkBAIC0xMDgyLDEwICsxMDkwLDEwIEBACiAvLyBub24tY2xvc3VyZSwgYXR0ZW1wdCB0byBpbnZva2UgImNhbGwiIG9uIGl0Lgogc3RhdGljIGJvb2wgUmVzb2x2ZUNhbGxUaHJvdWdoR2V0dGVyKGNvbnN0IENsYXNzJiByZWNlaXZlcl9jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcmIHRhcmdldF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgZGVtYW5nbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBhcmd1bWVudHNfZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiogcmVzdWx0KSB7Ci0gIC8vIDEuIENoZWNrIGlmIHRoZXJlIGlzIGEgZ2V0dGVyIHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgY29uc3QgU3RyaW5nJiBnZXR0ZXJfbmFtZSA9IFN0cmluZzo6SGFuZGxlKEZpZWxkOjpHZXR0ZXJOYW1lKHRhcmdldF9uYW1lKSk7CisgIGNvbnN0IFN0cmluZyYgZ2V0dGVyX25hbWUgPSBTdHJpbmc6OkhhbmRsZShGaWVsZDo6R2V0dGVyTmFtZShkZW1hbmdsZWQpKTsKICAgY29uc3QgaW50IGtUeXBlQXJnc0xlbiA9IDA7CiAgIGNvbnN0IGludCBrTnVtQXJndW1lbnRzID0gMTsKICAgQXJndW1lbnRzRGVzY3JpcHRvciBhcmdzX2Rlc2MoQXJyYXk6OkhhbmRsZSgKQEAgLTEwOTYsNiArMTEwNCw5IEBACiAgIGlmIChnZXR0ZXIuSXNOdWxsKCkgfHwgZ2V0dGVyLklzTWV0aG9kRXh0cmFjdG9yKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgLy8gV2UgZG8gdGhpcyBvbiB0aGUgdGFyZ2V0X25hbWUsIF9ub3RfIG9uIHRoZSBkZW1hbmdsZWQgbmFtZSwgc28gdGhhdAorICAvLyBGbG93R3JhcGhCdWlsZGVyOjpCdWlsZEdyYXBoT2ZJbnZva2VGaWVsZERpc3BhdGNoZXIgY2FuIGRldGVjdCBkeW5hbWljCisgIC8vIGNhbGxzIGZyb20gdGhlIGR5bjogdGFnIG9uIHRoZSBuYW1lIG9mIHRoZSBkaXNwYXRjaGVyLgogICBjb25zdCBGdW5jdGlvbiYgdGFyZ2V0X2Z1bmN0aW9uID0KICAgICAgIEZ1bmN0aW9uOjpIYW5kbGUocmVjZWl2ZXJfY2xhc3MuR2V0SW52b2NhdGlvbkRpc3BhdGNoZXIoCiAgICAgICAgICAgdGFyZ2V0X25hbWUsIGFyZ3VtZW50c19kZXNjcmlwdG9yLApAQCAtMTExNSwyMSArMTEyNiwyMSBAQAogRnVuY3Rpb25QdHIgSW5saW5lQ2FjaGVNaXNzSGVscGVyKGNvbnN0IENsYXNzJiByZWNlaXZlcl9jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheSYgYXJnc19kZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgdGFyZ2V0X25hbWUpIHsKLSAgLy8gSGFuZGxlIG5vU3VjaE1ldGhvZCBmb3IgZHluOm1ldGhvZE5hbWUgYnkgZ2V0dGluZyBhIG5vU3VjaE1ldGhvZCBkaXNwYXRjaGVyCi0gIC8vIChvciBhIGNhbGwtdGhyb3VnaCBnZXR0ZXIgZm9yIG1ldGhvZE5hbWUpLgorICAvLyBDcmVhdGUgYSBkZW1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgdGFyZ2V0X25hbWUsIGlmIG5lY2Vzc2FyeSwgVGhpcyBpcyB1c2VkCisgIC8vIGZvciB0aGUgZmllbGQgZ2V0dGVyIGluIFJlc29sdmVDYWxsVGhyb3VnaEdldHRlciBhbmQgYXMgdGhlIHRhcmdldCBuYW1lCisgIC8vIGZvciB0aGUgTm9TdWNoTWV0aG9kIGRpc3BhdGNoZXIgKGlmIG5lZWRlZCkuCisgIGNvbnN0IFN0cmluZyogZGVtYW5nbGVkID0gJnRhcmdldF9uYW1lOwogICBpZiAoRnVuY3Rpb246OklzRHluYW1pY0ludm9jYXRpb25Gb3J3YXJkZXJOYW1lKHRhcmdldF9uYW1lKSkgewotICAgIGNvbnN0IFN0cmluZyYgZGVtYW5nbGVkID0gU3RyaW5nOjpIYW5kbGUoCisgICAgZGVtYW5nbGVkID0gJlN0cmluZzo6SGFuZGxlKAogICAgICAgICBGdW5jdGlvbjo6RGVtYW5nbGVEeW5hbWljSW52b2NhdGlvbkZvcndhcmRlck5hbWUodGFyZ2V0X25hbWUpKTsKLSAgICByZXR1cm4gSW5saW5lQ2FjaGVNaXNzSGVscGVyKHJlY2VpdmVyX2NsYXNzLCBhcmdzX2Rlc2NyaXB0b3IsIGRlbWFuZ2xlZCk7CiAgIH0KLQogICBGdW5jdGlvbiYgcmVzdWx0ID0gRnVuY3Rpb246OkhhbmRsZSgpOwotICBpZiAoIVJlc29sdmVDYWxsVGhyb3VnaEdldHRlcihyZWNlaXZlcl9jbGFzcywgdGFyZ2V0X25hbWUsIGFyZ3NfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpIHsKKyAgaWYgKCFSZXNvbHZlQ2FsbFRocm91Z2hHZXR0ZXIocmVjZWl2ZXJfY2xhc3MsIHRhcmdldF9uYW1lLCAqZGVtYW5nbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzX2Rlc2NyaXB0b3IsICZyZXN1bHQpKSB7CiAgICAgQXJndW1lbnRzRGVzY3JpcHRvciBkZXNjKGFyZ3NfZGVzY3JpcHRvcik7CiAgICAgY29uc3QgRnVuY3Rpb24mIHRhcmdldF9mdW5jdGlvbiA9CiAgICAgICAgIEZ1bmN0aW9uOjpIYW5kbGUocmVjZWl2ZXJfY2xhc3MuR2V0SW52b2NhdGlvbkRpc3BhdGNoZXIoCi0gICAgICAgICAgICB0YXJnZXRfbmFtZSwgYXJnc19kZXNjcmlwdG9yLAorICAgICAgICAgICAgKmRlbWFuZ2xlZCwgYXJnc19kZXNjcmlwdG9yLAogICAgICAgICAgICAgRnVuY3Rpb25MYXlvdXQ6OmtOb1N1Y2hNZXRob2REaXNwYXRjaGVyLCBGTEFHX2xhenlfZGlzcGF0Y2hlcnMpKTsKICAgICBpZiAoRkxBR190cmFjZV9pYykgewogICAgICAgT1M6OlByaW50RXJyKApAQCAtMTQ3OCw2ICsxNDg5LDggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKKyNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKKwogY2xhc3MgU2F2ZWRVbmxpbmtlZENhbGxNYXBLZXlFcXVhbHNUcmFpdHMgOiBwdWJsaWMgQWxsU3RhdGljIHsKICBwdWJsaWM6CiAgIHN0YXRpYyBjb25zdCBjaGFyKiBOYW1lKCkgeyByZXR1cm4gIlNhdmVkVW5saW5rZWRDYWxsTWFwS2V5RXF1YWxzVHJhaXRzICI7IH0KQEAgLTE0OTksNiArMTUxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV3b3JkIGZyYW1lX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmxpbmtlZENhbGwmIHVubGlua2VkX2NhbGwpIHsKICAgSXNvbGF0ZUdyb3VwKiBpc29sYXRlX2dyb3VwID0gaXNvbGF0ZS0+Z3JvdXAoKTsKKworICBTYWZlcG9pbnRNdXRleExvY2tlciBtbChpc29sYXRlX2dyb3VwLT51bmxpbmtlZF9jYWxsX21hcF9tdXRleCgpKTsKICAgaWYgKGlzb2xhdGVfZ3JvdXAtPnNhdmVkX3VubGlua2VkX2NhbGxzKCkgPT0gQXJyYXk6Om51bGwoKSkgewogICAgIGNvbnN0IGF1dG8mIGluaXRpYWxfbWFwID0KICAgICAgICAgQXJyYXk6OkhhbmRsZSh6b25lLCBIYXNoVGFibGVzOjpOZXc8VW5saW5rZWRDYWxsTWFwPigxNiwgSGVhcDo6a09sZCkpOwpAQCAtMTUxMCwzNyArMTUyNSw0NCBAQAogICBjb25zdCBhdXRvJiBwYyA9IEludGVnZXI6OkhhbmRsZSh6b25lLCBJbnRlZ2VyOjpOZXdGcm9tVWludDY0KGZyYW1lX3BjKSk7CiAgIC8vIFNvbWUgb3RoZXIgaXNvbGF0ZSBtaWdodCBoYXZlIHVwZGF0ZWQgdW5saW5rZWRfY2FsbF9tYXBbcGNdIHRvbywgYnV0CiAgIC8vIHRoZWlyIHVwZGF0ZSBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIG91cnMuCi0gIFVubGlua2VkQ2FsbCYgbmV3X29yX29sZF92YWx1ZSA9IFVubGlua2VkQ2FsbDo6SGFuZGxlKAorICBjb25zdCBhdXRvJiBuZXdfb3Jfb2xkX3ZhbHVlID0gVW5saW5rZWRDYWxsOjpIYW5kbGUoCiAgICAgICB6b25lLCBVbmxpbmtlZENhbGw6OlJhd0Nhc3QoCiAgICAgICAgICAgICAgICAgdW5saW5rZWRfY2FsbF9tYXAuSW5zZXJ0T3JHZXRWYWx1ZShwYywgdW5saW5rZWRfY2FsbCkpKTsKICAgUkVMRUFTRV9BU1NFUlQobmV3X29yX29sZF92YWx1ZS5yYXcoKSA9PSB1bmxpbmtlZF9jYWxsLnJhdygpKTsKICAgaXNvbGF0ZV9ncm91cC0+c2V0X3NhdmVkX3VubGlua2VkX2NhbGxzKHVubGlua2VkX2NhbGxfbWFwLlJlbGVhc2UoKSk7CiB9CiAKLSNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKIHN0YXRpYyBVbmxpbmtlZENhbGxQdHIgTG9hZFVubGlua2VkQ2FsbChab25lKiB6b25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzb2xhdGUqIGlzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXdvcmQgcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb25vbW9ycGhpY19oaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1d29yZCBwYykgewogICBJc29sYXRlR3JvdXAqIGlzb2xhdGVfZ3JvdXAgPSBpc29sYXRlLT5ncm91cCgpOwotICBBU1NFUlQoaXNvbGF0ZV9ncm91cC0+c2F2ZWRfdW5saW5rZWRfY2FsbHMoKSAhPSBBcnJheTo6bnVsbCgpKTsKIAorICBTYWZlcG9pbnRNdXRleExvY2tlciBtbChpc29sYXRlX2dyb3VwLT51bmxpbmtlZF9jYWxsX21hcF9tdXRleCgpKTsKKyAgQVNTRVJUKGlzb2xhdGVfZ3JvdXAtPnNhdmVkX3VubGlua2VkX2NhbGxzKCkgIT0gQXJyYXk6Om51bGwoKSk7CiAgIFVubGlua2VkQ2FsbE1hcCB1bmxpbmtlZF9jYWxsX21hcCh6b25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZV9ncm91cC0+c2F2ZWRfdW5saW5rZWRfY2FsbHMoKSk7CiAKICAgY29uc3QgYXV0byYgcGNfaW50ZWdlciA9IEludGVnZXI6OkhhbmRsZSh6b25lLCBJbnRlZ2VyOjpOZXdGcm9tVWludDY0KHBjKSk7CiAgIGNvbnN0IGF1dG8mIHVubGlua2VkX2NhbGwgPSBVbmxpbmtlZENhbGw6OkNhc3QoCiAgICAgICBPYmplY3Q6OkhhbmRsZSh6b25lLCB1bmxpbmtlZF9jYWxsX21hcC5HZXRPckRpZShwY19pbnRlZ2VyKSkpOwotICAvLyBPbmx5IHJlbW92ZSBlbnRyeSBmcm9tIHVubGlua2VkX2NhbGxfbWFwIGlmIHdlIGFyZSBhY3R1YWxseSB0cmFuc2l0aW9uaW5nCi0gIC8vIG91dCBvZiBtb25vbW9ycGhpYyBzdGF0ZS4KLSAgaWYgKCFpc19tb25vbW9ycGhpY19oaXQpIHsKLSAgICB1bmxpbmtlZF9jYWxsX21hcC5SZW1vdmUocGNfaW50ZWdlcik7Ci0gICAgaXNvbGF0ZV9ncm91cC0+c2V0X3NhdmVkX3VubGlua2VkX2NhbGxzKHVubGlua2VkX2NhbGxfbWFwLlJlbGVhc2UoKSk7Ci0gIH0KLQorICBpc29sYXRlX2dyb3VwLT5zZXRfc2F2ZWRfdW5saW5rZWRfY2FsbHModW5saW5rZWRfY2FsbF9tYXAuUmVsZWFzZSgpKTsKICAgcmV0dXJuIHVubGlua2VkX2NhbGwucmF3KCk7CiB9Ci0jZW5kaWYKKworLy8gTk9URTogUmlnaHQgbm93IHdlIG5ldmVyIGRlbGV0ZSBbVW5saW5rZWRDYWxsXSBvYmplY3RzLiBUaGV5IGFyZSBuZWVkZWQgd2hpbGUKKy8vIGEgY2FsbCBzaXRlIGlzIGluIFVubGlua2VkL01vbm9tb3JwaGljL01vbm9tb3JwaGljU21pYWJsZS9TaW5nbGVUYXJnZXQKKy8vIHN0YXRlcy4KKy8vCisvLyBUaGVvcmV0aWNhbGx5IHdlIGNvdWxkIGZyZWUgdGhlIFtVbmxpbmtlZENhbGxdIG9iamVjdCBvbmNlIHdlIHRyYW5zaXRpb24gdGhlCisvLyBjYWxsIHNpdGUgdG8gdXNlIElDRGF0YS9NZWdhbW9ycGhpY0NhY2hlLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIGNhcmVmdWwKKy8vIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIHRoZSBkZWxldGVyIGFuZCBhIHBvc3NpYmxlIGNvbmN1cnJlbnQgcmVhZGVyLgorLy8KKy8vIFRvIHNpbXBsaWZ5IHRoZSBjb2RlIHdlIGRlY2lkZWQgbm90IHRvIGRvIHRoYXQgYXRtIChvbmx5IGEgdmVyeSBzbWFsbAorLy8gZnJhY3Rpb24gb2YgY2FsbHNpdGVzIGluIEFPVCB1c2Ugc3dpdGNoYWJsZSBjYWxscywgdGhlIG5hbWUvYXJncy1kZXNjcmlwdG9yCisvLyBvYmplY3RzIGFyZSBrZXB0IGFsaXZlIGFueXdheXMgLT4gdGhlcmUgaXMgbGl0dGxlIG1lbW9yeSBzYXZpbmdzIGZyb20KKy8vIGZyZWVpbmcgdGhlIFtVbmxpbmtlZENhbGxdIG9iamVjdHMpLgorCisjZW5kaWYgIC8vIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogCiBjbGFzcyBTd2l0Y2hhYmxlQ2FsbEhhbmRsZXIgewogIHB1YmxpYzoKQEAgLTE1NTcsNyArMTU3OSw5IEBACiAgICAgICAgIGFyZ3VtZW50c18oYXJndW1lbnRzKSwKICAgICAgICAgY2FsbGVyX2ZyYW1lXyhjYWxsZXJfZnJhbWUpLAogICAgICAgICBjYWxsZXJfY29kZV8oY2FsbGVyX2NvZGUpLAotICAgICAgICBjYWxsZXJfZnVuY3Rpb25fKGNhbGxlcl9mdW5jdGlvbikge30KKyAgICAgICAgY2FsbGVyX2Z1bmN0aW9uXyhjYWxsZXJfZnVuY3Rpb24pLAorICAgICAgICBuYW1lXyhTdHJpbmc6OkhhbmRsZSgpKSwKKyAgICAgICAgYXJnc19kZXNjcmlwdG9yXyhBcnJheTo6SGFuZGxlKCkpIHt9CiAKICAgRnVuY3Rpb25QdHIgUmVzb2x2ZVRhcmdldEZ1bmN0aW9uKGNvbnN0IE9iamVjdCYgZGF0YSk7CiAgIHZvaWQgSGFuZGxlTWlzcyhjb25zdCBPYmplY3QmIG9sZF9kYXRhLApAQCAtMTU3MiwxNiArMTU5NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uJiB0YXJnZXRfZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QqIGxvd2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90KiB1cHBlcik7Ci0gIEZ1bmN0aW9uUHRyIExvb2t1cE1vbm9tb3JwaGljT2xkVGFyZ2V0TmFtZURlc2NyaXB0b3JDaWQoCi0gICAgICBjb25zdCBPYmplY3QmIGRhdGEsCi0gICAgICBTdHJpbmcqIG91dF9uYW1lLAotICAgICAgQXJyYXkqIG91dF9kZXNjcmlwdG9yLAotICAgICAgY2xhc3NpZF90KiBvdXRfb2xkX2V4cGVjdGVkX2NpZCwKLSAgICAgIGJvb2wga2VlcF91bmxpbmtlZF9jYWxsX21hcF9lbnRyeV9yZWdhcmRsZXNzLAotICAgICAgYm9vbCogb3V0X2lzX21vbm9tb3JwaGljX2hpdCk7CiAgIHZvaWQgRG9Nb25vbW9ycGhpY01pc3MoY29uc3QgT2JqZWN0JiBkYXRhLCBjb25zdCBGdW5jdGlvbiYgdGFyZ2V0X2Z1bmN0aW9uKTsKKyNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKICAgdm9pZCBEb1NpbmdsZVRhcmdldE1pc3MoY29uc3QgU2luZ2xlVGFyZ2V0Q2FjaGUmIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uJiB0YXJnZXRfZnVuY3Rpb24pOworI2VuZGlmICAvLyAhZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCiAgIHZvaWQgRG9JQ0RhdGFNaXNzKGNvbnN0IElDRGF0YSYgZGF0YSwgY29uc3QgRnVuY3Rpb24mIHRhcmdldF9mdW5jdGlvbik7CiAgIHZvaWQgRG9NZWdhbW9ycGhpY01pc3MoY29uc3QgTWVnYW1vcnBoaWNDYWNoZSYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiYgdGFyZ2V0X2Z1bmN0aW9uKTsKQEAgLTE1OTQsMTIgKzE2MTMsMTggQEAKICAgU3RhY2tGcmFtZSogY2FsbGVyX2ZyYW1lXzsKICAgY29uc3QgQ29kZSYgY2FsbGVyX2NvZGVfOwogICBjb25zdCBGdW5jdGlvbiYgY2FsbGVyX2Z1bmN0aW9uXzsKKworICAvLyBDYWxsLXNpdGUgaW5mb3JtYXRpb24gcG9wdWxhdGVkIGR1cmluZyByZXNvbHV0aW9uLgorICBTdHJpbmcmIG5hbWVfOworICBBcnJheSYgYXJnc19kZXNjcmlwdG9yXzsKKyAgYm9vbCBpc19tb25vbW9ycGhpY19oaXRfID0gZmFsc2U7CiB9OwogCiB2b2lkIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6RG9VbmxpbmtlZENhbGwoY29uc3QgVW5saW5rZWRDYWxsJiB1bmxpbmtlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiYgdGFyZ2V0X2Z1bmN0aW9uKSB7CiAgIGNvbnN0IFN0cmluZyYgbmFtZSA9IFN0cmluZzo6SGFuZGxlKHpvbmVfLCB1bmxpbmtlZC50YXJnZXRfbmFtZSgpKTsKLSAgY29uc3QgQXJyYXkmIGRlc2NyaXB0b3IgPSBBcnJheTo6SGFuZGxlKHpvbmVfLCB1bmxpbmtlZC5hcmdzX2Rlc2NyaXB0b3IoKSk7CisgIGNvbnN0IEFycmF5JiBkZXNjcmlwdG9yID0KKyAgICAgIEFycmF5OjpIYW5kbGUoem9uZV8sIHVubGlua2VkLmFyZ3VtZW50c19kZXNjcmlwdG9yKCkpOwogICBjb25zdCBJQ0RhdGEmIGljX2RhdGEgPQogICAgICAgSUNEYXRhOjpIYW5kbGUoem9uZV8sIElDRGF0YTo6TmV3KGNhbGxlcl9mdW5jdGlvbl8sIG5hbWUsIGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVvcHRJZDo6a05vbmUsIDEsIC8qIGFyZ3NfdGVzdGVkICovCkBAIC0xNjA4LDM2ICsxNjMzLDYgQEAKICAgICBpY19kYXRhLkFkZFJlY2VpdmVyQ2hlY2socmVjZWl2ZXJfLkdldENsYXNzSWQoKSwgdGFyZ2V0X2Z1bmN0aW9uKTsKICAgfQogCi0gIC8vIEluIEFPVCBiYXJlIG1vZGUsIHRoZSBQQyAtPiBDb2RlIG1hcHBpbmcgaXMgYW1iaWd1b3VzLCBzaW5jZSBtdWx0aXBsZSBjb2RlCi0gIC8vIG9iamVjdHMgY2FuIGhhdmUgdGhlIHNhbWUgZGVkdXBlZCBpbnN0cnVjdGlvbnMgYW5kIGJhcmUgZnJhbWVzIGFyZSBjb21wYWN0Ci0gIC8vIChpLmUuIGhhdmUgb25seSBQQyBidXQgbm8gY29kZSBvYmplY3QgaW4gdGhlIGZyYW1lKQotICAvLwotICAvLyBJbiBKSVQgYW5kIEFPVCBub24tYmFyZSBtb2RlLCBpbnN0cnVjdGlvbnMgd2lsbCBwdXNoIHRoZSB1bmlxdWUgY29kZQotICAvLyBvYmplY3Qgb24gdGhlIGZyYW1lLgotICAvLwotICAvLyBJZiB3ZSBjYW4gZmluZCB0aGUgdW5pcXVlIGNvZGUgb2JqZWN0IG9mIHRoZSBjYWxsZWUsIHdlIGNhbiBmaW5kIGl0J3MKLSAgLy8gb3duZXIgZnVuY3Rpb24uIElmIHRoZSBjYWxsZWUgZnVuY3Rpb24gaXMgbm9uLWdlbmVyaWMgYW5kIGhhcyBubyBvcHRpb25hbAotICAvLyBwYXJhbWV0ZXJzLCB3ZSBjYW4gYW5kIHRoZXJlYnkgZGVkdWNlIHRoZSBjYWxsLXNpdGUgYXJndW1lbnQgZGVzY3JpcHRvciArCi0gIC8vIG5hbWUgZnJvbSBpdC4KLSAgLy8KLSAgLy8gSWYgbm90LCB3ZSdsbCBzYXZlIHRoZSB1bmxpbmtlZCBjYWxsIG9iamVjdCBpbiBhIG1hcC4KLSAgLy8KLSAgLy8gU2VlIFtEb01vbm9tb3JwaGljTWlzc10KLSAgY29uc3QgYm9vbCBuZWVkX3NhdmVkX3VubGlua2VkX2NhbGwgPQotICAgICAgKEZMQUdfdXNlX2JhcmVfaW5zdHJ1Y3Rpb25zICYmIEZMQUdfZGVkdXBfaW5zdHJ1Y3Rpb25zKTsKLQotICAvLyBXZSB0cmFuc2l0aW9uIGZyb20gYW4gdW5saW5rZWQgY2FsbCB0byBhIG1vbm9tb3JwaGljIGNhbGwuIFRoaXMgdHJhbnNpdGlvbgotICAvLyB3aWxsIGNhdXNlIHVzIHRvIGxvb3NlIHRoZSBhcmd1bWVudCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIG9uIHRoZSBjYWxsCi0gIC8vIHNpdGUuCi0gIC8vCi0gIC8vIFRob3VnaCBpZiB0aGUgbW9ub21vcnBoaWMgY2FsbCBzaXRlIHRyYW5zaXRpb25zIHRvIGEKLSAgLy8gcG9seW1vcnBoaWMvbWVnYW1vcnBoaWMgd2UgbmVlZCB0byByZWNvbnN0cnVjdCB0aGUgYXJndW1lbnRzIGRlc2NyaXB0b3IuCi0gIC8vCi0gIC8vIFdlIGFzc3VtZSBoZXJlIHRoYXQgZ2VuZXJhdGVkIGNvZGUgbmV2ZXIgbW92ZXMuCi0gIGlmIChuZWVkX3NhdmVkX3VubGlua2VkX2NhbGwpIHsKLSAgICBTYXZlVW5saW5rZWRDYWxsKHpvbmVfLCBpc29sYXRlXywgY2FsbGVyX2ZyYW1lXy0+cGMoKSwgdW5saW5rZWQpOwotICB9Ci0KICAgT2JqZWN0JiBvYmplY3QgPSBPYmplY3Q6OkhhbmRsZSh6b25lXywgaWNfZGF0YS5yYXcoKSk7CiAgIENvZGUmIGNvZGUgPSBDb2RlOjpIYW5kbGUoem9uZV8sIFN0dWJDb2RlOjpJQ0NhbGxUaHJvdWdoQ29kZSgpLnJhdygpKTsKICAgLy8gSWYgdGhlIHRhcmdldCBmdW5jdGlvbiBoYXMgb3B0aW9uYWwgcGFyYW1ldGVycyBvciBpcyBnZW5lcmljLCBpdCdzCkBAIC0xNzM5LDkwICsxNzM0LDI2IEBACiAgIHJldHVybiB0YXJnZXRfZnVuY3Rpb24ucmF3KCk7CiB9CiAKLUZ1bmN0aW9uUHRyIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6TG9va3VwTW9ub21vcnBoaWNPbGRUYXJnZXROYW1lRGVzY3JpcHRvckNpZCgKLSAgICBjb25zdCBPYmplY3QmIGRhdGEsCi0gICAgU3RyaW5nKiBvdXRfbmFtZSwKLSAgICBBcnJheSogb3V0X2Rlc2NyaXB0b3IsCi0gICAgY2xhc3NpZF90KiBvdXRfb2xkX2V4cGVjdGVkX2NpZCwKLSAgICBib29sIGtlZXBfdW5saW5rZWRfY2FsbF9tYXBfZW50cnlfcmVnYXJkbGVzcywKLSAgICBib29sKiBvdXRfaXNfbW9ub21vcnBoaWNfaGl0KSB7Ci0jaWYgZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCi0gIEFTU0VSVChvdXRfbmFtZSAhPSBudWxscHRyKTsKLSAgQVNTRVJUKG91dF9kZXNjcmlwdG9yICE9IG51bGxwdHIpOwotICBBU1NFUlQob3V0X29sZF9leHBlY3RlZF9jaWQgIT0gbnVsbHB0cik7Ci0gIEFTU0VSVChvdXRfaXNfbW9ub21vcnBoaWNfaGl0ICE9IG51bGxwdHIpOwotICBGdW5jdGlvbiYgb2xkX3RhcmdldCA9IEZ1bmN0aW9uOjpIYW5kbGUoem9uZV8pOwotICBpZiAoZGF0YS5Jc1NtaSgpKSB7Ci0gICAgKm91dF9vbGRfZXhwZWN0ZWRfY2lkID0gU21pOjpDYXN0KGRhdGEpLlZhbHVlKCk7Ci0gIH0gZWxzZSBpZiAoZGF0YS5Jc01vbm9tb3JwaGljU21pYWJsZUNhbGwoKSkgewotICAgICpvdXRfb2xkX2V4cGVjdGVkX2NpZCA9IE1vbm9tb3JwaGljU21pYWJsZUNhbGw6OkNhc3QoZGF0YSkuZXhwZWN0ZWRfY2lkKCk7Ci0gICAgb2xkX3RhcmdldCBePQotICAgICAgICBDb2RlOjpIYW5kbGUoem9uZV8sIE1vbm9tb3JwaGljU21pYWJsZUNhbGw6OkNhc3QoZGF0YSkudGFyZ2V0KCkpCi0gICAgICAgICAgICAub3duZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBVTlJFQUNIQUJMRSgpOwotICB9Ci0KLSAgLy8gVGhlIHNpdGUgbWlnaHQgaGF2ZSBqdXN0IGJlZW4gdXBkYXRlZCB0byBtb25vbW9ycGhpYyBzdGF0ZSB3aXRoIHNhbWUKLSAgLy8gZXhhY3QgY2xhc3MgaWQsIGluIHdoaWNoIGNhc2Ugd2UgYXJlIHN0YXlpbmcgaW4gbW9ub21vcnBoaWMgc3RhdGUuCi0gICpvdXRfaXNfbW9ub21vcnBoaWNfaGl0ID0gKm91dF9vbGRfZXhwZWN0ZWRfY2lkID09IHJlY2VpdmVyXy5HZXRDbGFzc0lkKCk7Ci0KLSAgaWYgKEZMQUdfdXNlX2JhcmVfaW5zdHJ1Y3Rpb25zICYmIEZMQUdfZGVkdXBfaW5zdHJ1Y3Rpb25zKSB7Ci0gICAgY29uc3QgVW5saW5rZWRDYWxsJiB1bmxpbmtlZF9jYWxsID0gVW5saW5rZWRDYWxsOjpIYW5kbGUoCi0gICAgICAgIHpvbmVfLCBMb2FkVW5saW5rZWRDYWxsKHpvbmVfLCBpc29sYXRlXywgY2FsbGVyX2ZyYW1lXy0+cGMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcF91bmxpbmtlZF9jYWxsX21hcF9lbnRyeV9yZWdhcmRsZXNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0X2lzX21vbm9tb3JwaGljX2hpdCkpOwotICAgICpvdXRfbmFtZSA9IHVubGlua2VkX2NhbGwudGFyZ2V0X25hbWUoKTsKLSAgICAqb3V0X2Rlc2NyaXB0b3IgPSB1bmxpbmtlZF9jYWxsLmFyZ3NfZGVzY3JpcHRvcigpOwotCi0gICAgY29uc3QgQ2xhc3MmIG9sZF9yZWNlaXZlcl9jbGFzcyA9IENsYXNzOjpIYW5kbGUoCi0gICAgICAgIHpvbmVfLCBpc29sYXRlXy0+Y2xhc3NfdGFibGUoKS0+QXQoKm91dF9vbGRfZXhwZWN0ZWRfY2lkKSk7Ci0gICAgcmV0dXJuIFJlc29sdmUoem9uZV8sIG9sZF9yZWNlaXZlcl9jbGFzcywgKm91dF9uYW1lLCAqb3V0X2Rlc2NyaXB0b3IpOwotICB9Ci0KLSAgLy8gV2UgbG9zdCB0aGUgb3JpZ2luYWwgVW5saW5rZWRDYWxsIChhbmQgdGhlIG5hbWUgKyBhcmcgZGVzY3JpcHRvciBpbnNpZGUKLSAgLy8gaXQpIHdoZW4gdGhlIGNhbGwgc2l0ZSB0cmFuc2l0aW9uZWQgZnJvbSB1bmxpbmtlZCB0byBtb25vbW9ycGhpYy4KLSAgLy8KLSAgLy8gVGhvdWdoIHdlIGNhbiBkZWR1Y2UgbmFtZSArIGFyZyBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBmaXJzdAotICAvLyBtb25vbW9ycGhpYyBjYWxsZWUgKHdlIGFyZSBndWFyYW50ZWVkIGl0IGlzIG5vdCBnZW5lcmljIGFuZCBkb2VzIG5vdCBoYXZlCi0gIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnMsIHNlZSBERUZJTkVfUlVOVElNRV9FTlRSWShVbmxpbmtlZENhbGwpIGFib3ZlKS4KLSAgaWYgKG9sZF90YXJnZXQuSXNOdWxsKCkpIHsKLSAgICBjb25zdCBDb2RlJiBvbGRfdGFyZ2V0X2NvZGUgPQotICAgICAgICBDb2RlOjpIYW5kbGUoem9uZV8sIENvZGVQYXRjaGVyOjpHZXRTd2l0Y2hhYmxlQ2FsbFRhcmdldEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJfZnJhbWVfLT5wYygpLCBjYWxsZXJfY29kZV8pKTsKLSAgICBvbGRfdGFyZ2V0IF49IG9sZF90YXJnZXRfY29kZS5vd25lcigpOwotICB9Ci0KLSAgY29uc3QgaW50IGtUeXBlQXJnc0xlbiA9IDA7Ci0gICpvdXRfbmFtZSA9IG9sZF90YXJnZXQubmFtZSgpOwotICAvLyBUT0RPKGRhcnRidWcuY29tLzMzNTQ5KTogVXBkYXRlIHRoaXMgY29kZSB0byB1c2UgdGhlIHNpemUgb2YgdGhlCi0gIC8vIHBhcmFtZXRlcnMgd2hlbiBzdXBwb3J0aW5nIGNhbGxzIHRvIG5vbi1zdGF0aWMgbWV0aG9kcyB3aXRoCi0gIC8vIHVuYm94ZWQgcGFyYW1ldGVycy4KLSAgKm91dF9kZXNjcmlwdG9yID0gQXJndW1lbnRzRGVzY3JpcHRvcjo6TmV3Qm94ZWQoCi0gICAgICBrVHlwZUFyZ3NMZW4sIG9sZF90YXJnZXQubnVtX2ZpeGVkX3BhcmFtZXRlcnMoKSk7Ci0gIHJldHVybiBvbGRfdGFyZ2V0LnJhdygpOwotI2Vsc2UKLSAgVU5SRUFDSEFCTEUoKTsKLSNlbmRpZgotfQotCiB2b2lkIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6RG9Nb25vbW9ycGhpY01pc3MoY29uc3QgT2JqZWN0JiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uJiB0YXJnZXRfZnVuY3Rpb24pIHsKICNpZiBkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKLSAgU3RyaW5nJiBuYW1lID0gU3RyaW5nOjpIYW5kbGUoem9uZV8pOwotICBBcnJheSYgZGVzY3JpcHRvciA9IEFycmF5OjpIYW5kbGUoem9uZV8pOwotICBib29sIGlzX21vbm9tb3JwaGljX2hpdDsKICAgY2xhc3NpZF90IG9sZF9leHBlY3RlZF9jaWQ7Ci0gIGNvbnN0IEZ1bmN0aW9uJiBvbGRfdGFyZ2V0ID0gRnVuY3Rpb246OkhhbmRsZSgKLSAgICAgIHpvbmVfLCBMb29rdXBNb25vbW9ycGhpY09sZFRhcmdldE5hbWVEZXNjcmlwdG9yQ2lkKAotICAgICAgICAgICAgICAgICBkYXRhLCAmbmFtZSwgJmRlc2NyaXB0b3IsICZvbGRfZXhwZWN0ZWRfY2lkLAotICAgICAgICAgICAgICAgICAvKmtlZXBfdW5saW5rZWRfY2FsbF9tYXBfZW50cnlfcmVnYXJkbGVzcz0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAmaXNfbW9ub21vcnBoaWNfaGl0KSk7CisgIGlmIChkYXRhLklzU21pKCkpIHsKKyAgICBvbGRfZXhwZWN0ZWRfY2lkID0gU21pOjpDYXN0KGRhdGEpLlZhbHVlKCk7CisgIH0gZWxzZSB7CisgICAgUkVMRUFTRV9BU1NFUlQoZGF0YS5Jc01vbm9tb3JwaGljU21pYWJsZUNhbGwoKSk7CisgICAgb2xkX2V4cGVjdGVkX2NpZCA9IE1vbm9tb3JwaGljU21pYWJsZUNhbGw6OkNhc3QoZGF0YSkuZXhwZWN0ZWRfY2lkKCk7CisgIH0KKyAgY29uc3QgYm9vbCBpc19tb25vbW9ycGhpY19oaXQgPSBvbGRfZXhwZWN0ZWRfY2lkID09IHJlY2VpdmVyXy5HZXRDbGFzc0lkKCk7CisgIGNvbnN0IGF1dG8mIG9sZF9yZWNlaXZlcl9jbGFzcyA9CisgICAgICBDbGFzczo6SGFuZGxlKHpvbmVfLCBpc29sYXRlXy0+Y2xhc3NfdGFibGUoKS0+QXQob2xkX2V4cGVjdGVkX2NpZCkpOworICBjb25zdCBhdXRvJiBvbGRfdGFyZ2V0ID0gRnVuY3Rpb246OkhhbmRsZSgKKyAgICAgIHpvbmVfLCBSZXNvbHZlKHpvbmVfLCBvbGRfcmVjZWl2ZXJfY2xhc3MsIG5hbWVfLCBhcmdzX2Rlc2NyaXB0b3JfKSk7CiAKLSAgY29uc3QgSUNEYXRhJiBpY19kYXRhID0KLSAgICAgIElDRGF0YTo6SGFuZGxlKHpvbmVfLCBJQ0RhdGE6Ok5ldyhjYWxsZXJfZnVuY3Rpb25fLCBuYW1lLCBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlb3B0SWQ6OmtOb25lLCAxLCAvKiBhcmdzX3Rlc3RlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDRGF0YTo6a0luc3RhbmNlKSk7CisgIGNvbnN0IElDRGF0YSYgaWNfZGF0YSA9IElDRGF0YTo6SGFuZGxlKAorICAgICAgem9uZV8sIElDRGF0YTo6TmV3KGNhbGxlcl9mdW5jdGlvbl8sIG5hbWVfLCBhcmdzX2Rlc2NyaXB0b3JfLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlb3B0SWQ6OmtOb25lLCAxLCAvKiBhcmdzX3Rlc3RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIElDRGF0YTo6a0luc3RhbmNlKSk7CiAgIC8vIEFkZCB0aGUgZmlyc3QgdGFyZ2V0LgogICBpZiAoIW9sZF90YXJnZXQuSXNOdWxsKCkpIHsKICAgICBpY19kYXRhLkFkZFJlY2VpdmVyQ2hlY2sob2xkX2V4cGVjdGVkX2NpZCwgb2xkX3RhcmdldCk7CkBAIC0xODM4LDcgKzE3NjksNyBAQAogCiAgIGludHB0cl90IGxvd2VyID0gb2xkX2V4cGVjdGVkX2NpZDsKICAgaW50cHRyX3QgdXBwZXIgPSBvbGRfZXhwZWN0ZWRfY2lkOwotICBpZiAoQ2FuRXh0ZW5kU2luZ2xlVGFyZ2V0UmFuZ2UobmFtZSwgb2xkX3RhcmdldCwgdGFyZ2V0X2Z1bmN0aW9uLCAmbG93ZXIsCisgIGlmIChDYW5FeHRlbmRTaW5nbGVUYXJnZXRSYW5nZShuYW1lXywgb2xkX3RhcmdldCwgdGFyZ2V0X2Z1bmN0aW9uLCAmbG93ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBwZXIpKSB7CiAgICAgY29uc3QgU2luZ2xlVGFyZ2V0Q2FjaGUmIGNhY2hlID0KICAgICAgICAgU2luZ2xlVGFyZ2V0Q2FjaGU6OkhhbmRsZSh6b25lXywgU2luZ2xlVGFyZ2V0Q2FjaGU6Ok5ldygpKTsKQEAgLTE5MDAsNiArMTgzMSw3IEBACiAjZW5kaWYgIC8vIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogfQogCisjaWYgZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCiB2b2lkIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6RG9TaW5nbGVUYXJnZXRNaXNzKAogICAgIGNvbnN0IFNpbmdsZVRhcmdldENhY2hlJiBkYXRhLAogICAgIGNvbnN0IEZ1bmN0aW9uJiB0YXJnZXRfZnVuY3Rpb24pIHsKQEAgLTE5MDgsMjQgKzE4NDAsMTcgQEAKICAgICAgIEZ1bmN0aW9uOjpIYW5kbGUoem9uZV8sIEZ1bmN0aW9uOjpSYXdDYXN0KG9sZF90YXJnZXRfY29kZS5vd25lcigpKSk7CiAKICAgLy8gV2UgbG9zdCB0aGUgb3JpZ2luYWwgSUNEYXRhIHdoZW4gd2UgcGF0Y2hlZCB0byB0aGUgbW9ub21vcnBoaWMgY2FzZS4KLSAgY29uc3QgU3RyaW5nJiBuYW1lID0gU3RyaW5nOjpIYW5kbGUoem9uZV8sIG9sZF90YXJnZXQubmFtZSgpKTsKLSAgQVNTRVJUKCFvbGRfdGFyZ2V0Lkhhc09wdGlvbmFsUGFyYW1ldGVycygpKTsKLSAgQVNTRVJUKCFvbGRfdGFyZ2V0LklzR2VuZXJpYygpKTsKLSAgY29uc3QgaW50IGtUeXBlQXJnc0xlbiA9IDA7Ci0gIGNvbnN0IEFycmF5JiBkZXNjcmlwdG9yID0gQXJyYXk6OkhhbmRsZSgKLSAgICAgIHpvbmVfLCBBcmd1bWVudHNEZXNjcmlwdG9yOjpOZXdCb3hlZChrVHlwZUFyZ3NMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3RhcmdldC5udW1fZml4ZWRfcGFyYW1ldGVycygpKSk7Ci0gIGNvbnN0IElDRGF0YSYgaWNfZGF0YSA9Ci0gICAgICBJQ0RhdGE6OkhhbmRsZSh6b25lXywgSUNEYXRhOjpOZXcoY2FsbGVyX2Z1bmN0aW9uXywgbmFtZSwgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW9wdElkOjprTm9uZSwgMSwgLyogYXJnc190ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0RhdGE6OmtJbnN0YW5jZSkpOworICBjb25zdCBJQ0RhdGEmIGljX2RhdGEgPSBJQ0RhdGE6OkhhbmRsZSgKKyAgICAgIHpvbmVfLCBJQ0RhdGE6Ok5ldyhjYWxsZXJfZnVuY3Rpb25fLCBuYW1lXywgYXJnc19kZXNjcmlwdG9yXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZW9wdElkOjprTm9uZSwgMSwgLyogYXJnc190ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBJQ0RhdGE6OmtJbnN0YW5jZSkpOwogICBpZiAoIXRhcmdldF9mdW5jdGlvbi5Jc051bGwoKSkgewogICAgIGljX2RhdGEuQWRkUmVjZWl2ZXJDaGVjayhyZWNlaXZlcl8uR2V0Q2xhc3NJZCgpLCB0YXJnZXRfZnVuY3Rpb24pOwogICB9CiAKICAgaW50cHRyX3QgbG93ZXIgPSBkYXRhLmxvd2VyX2xpbWl0KCk7CiAgIGludHB0cl90IHVwcGVyID0gZGF0YS51cHBlcl9saW1pdCgpOwotICBpZiAoQ2FuRXh0ZW5kU2luZ2xlVGFyZ2V0UmFuZ2UobmFtZSwgb2xkX3RhcmdldCwgdGFyZ2V0X2Z1bmN0aW9uLCAmbG93ZXIsCisgIGlmIChDYW5FeHRlbmRTaW5nbGVUYXJnZXRSYW5nZShuYW1lXywgb2xkX3RhcmdldCwgdGFyZ2V0X2Z1bmN0aW9uLCAmbG93ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBwZXIpKSB7CiAgICAgZGF0YS5zZXRfbG93ZXJfbGltaXQobG93ZXIpOwogICAgIGRhdGEuc2V0X3VwcGVyX2xpbWl0KHVwcGVyKTsKQEAgLTE5NDYsNiArMTg3MSw3IEBACiAgIGFyZ3VtZW50c18uU2V0QXJnQXQoMCwgc3R1Yik7CiAgIGFyZ3VtZW50c18uU2V0UmV0dXJuKGljX2RhdGEpOwogfQorI2VuZGlmICAvLyAhZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCiAKIHZvaWQgU3dpdGNoYWJsZUNhbGxIYW5kbGVyOjpEb0lDRGF0YU1pc3MoY29uc3QgSUNEYXRhJiBpY19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiYgdGFyZ2V0X2Z1bmN0aW9uKSB7CkBAIC0yMDM2LDc2ICsxOTYyLDY4IEBACiB9CiAKIEZ1bmN0aW9uUHRyIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6UmVzb2x2ZVRhcmdldEZ1bmN0aW9uKGNvbnN0IE9iamVjdCYgZGF0YSkgewotICBjb25zdCBDbGFzcyYgY2xzID0gQ2xhc3M6OkhhbmRsZSh6b25lXywgcmVjZWl2ZXJfLmNsYXp6KCkpOwogICBzd2l0Y2ggKGRhdGEuR2V0Q2xhc3NJZCgpKSB7CiAgICAgY2FzZSBrVW5saW5rZWRDYWxsQ2lkOiB7Ci0gICAgICBjb25zdCBVbmxpbmtlZENhbGwmIHVubGlua2VkID0gVW5saW5rZWRDYWxsOjpDYXN0KGRhdGEpOwotICAgICAgY29uc3QgU3RyaW5nJiBuYW1lID0gU3RyaW5nOjpIYW5kbGUoem9uZV8sIHVubGlua2VkLnRhcmdldF9uYW1lKCkpOwotICAgICAgY29uc3QgQXJyYXkmIGRlc2NyaXB0b3IgPQotICAgICAgICAgIEFycmF5OjpIYW5kbGUoem9uZV8sIHVubGlua2VkLmFyZ3NfZGVzY3JpcHRvcigpKTsKLSAgICAgIHJldHVybiBSZXNvbHZlKHpvbmVfLCBjbHMsIG5hbWUsIGRlc2NyaXB0b3IpOworICAgICAgY29uc3QgYXV0byYgdW5saW5rZWRfY2FsbCA9IFVubGlua2VkQ2FsbDo6Q2FzdChkYXRhKTsKKworI2lmIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQorICAgICAgLy8gV2hlbiB0cmFuc2l0aW9uaW5nIG91dCBvZiBVbmxpbmtlZENhbGwgdG8gb3RoZXIgc3RhdGVzIChlLmcuCisgICAgICAvLyBNb25vbW9ycGhpYywgTW9ub21vcnBoaWNTbWlhYmxlLCBTaW5nbGVUYXJnZXQpIHdlIGxvc2UKKyAgICAgIC8vIG5hbWUvYXJnLWRlc2NyaXB0b3IgaW4gQU9UIG1vZGUgYW5kIGNhbm5vdCByZWNvdmVyIGl0LgorICAgICAgLy8KKyAgICAgIC8vIEV2ZW4gaWYgd2UgY291bGQgcmVjb3ZlciBhbiBvbGQgdGFyZ2V0IGZ1bmN0aW9uICh3aGljaCB3YXMgbWlzc2VkKSAtCisgICAgICAvLyB3aGljaCB3ZSBjYW5ub3QgaW4gQU9UIGJhcmUgbW9kZSAtIHdlIGNhbiBzdGlsbCBsb3NlIHRoZSBuYW1lIGR1ZSB0byBhCisgICAgICAvLyBkeW46KiBjYWxsIHNpdGUgcG90ZW50aWFsbHkgdGFyZ2V0aW5nIG5vbi1keW46KiB0YXJnZXRzLgorICAgICAgLy8KKyAgICAgIC8vID0+IFdlIHdpbGwgdGhlcmVmb3JlIHJldGFpbiB0aGUgdW5saW5rZWQgY2FsbCBoZXJlLgorICAgICAgLy8KKyAgICAgIC8vIEluIEpJVCBtb2RlIHdlIGFsd2F5cyB1c2UgSUNEYXRhIGZyb20gdGhlIGNhbGwgc2l0ZSwgd2hpY2ggaGFzIHRoZQorICAgICAgLy8gY29ycmVjdCBuYW1lL2FyZ3MtZGVzY3JpcHRvci4KKyAgICAgIFNhdmVVbmxpbmtlZENhbGwoem9uZV8sIGlzb2xhdGVfLCBjYWxsZXJfZnJhbWVfLT5wYygpLCB1bmxpbmtlZF9jYWxsKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChEQVJUX1BSRUNPTVBJTEVEX1JVTlRJTUUpCisKKyAgICAgIG5hbWVfID0gdW5saW5rZWRfY2FsbC50YXJnZXRfbmFtZSgpOworICAgICAgYXJnc19kZXNjcmlwdG9yXyA9IHVubGlua2VkX2NhbGwuYXJndW1lbnRzX2Rlc2NyaXB0b3IoKTsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtNb25vbW9ycGhpY1NtaWFibGVDYWxsQ2lkOgogICAgICAgRkFMTF9USFJPVUdIOwogI2lmIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQotICAgIGNhc2Uga1NtaUNpZDogewotICAgICAgU3RyaW5nJiBuYW1lID0gU3RyaW5nOjpIYW5kbGUoem9uZV8pOwotICAgICAgQXJyYXkmIGRlc2NyaXB0b3IgPSBBcnJheTo6SGFuZGxlKHpvbmVfKTsKLSAgICAgIGNsYXNzaWRfdCBvbGRfZXhwZWN0ZWRfY2lkOwotICAgICAgYm9vbCBpc19tb25vbW9ycGhpY19oaXQ7Ci0gICAgICBMb29rdXBNb25vbW9ycGhpY09sZFRhcmdldE5hbWVEZXNjcmlwdG9yQ2lkKAotICAgICAgICAgIGRhdGEsICZuYW1lLCAmZGVzY3JpcHRvciwgJm9sZF9leHBlY3RlZF9jaWQsCi0gICAgICAgICAgLyprZWVwX3VubGlua2VkX2NhbGxfbWFwX2VudHJ5PSovdHJ1ZSwgJmlzX21vbm9tb3JwaGljX2hpdCk7Ci0gICAgICByZXR1cm4gUmVzb2x2ZSh6b25lXywgY2xzLCBuYW1lLCBkZXNjcmlwdG9yKTsKKyAgICBjYXNlIGtTbWlDaWQ6CisgICAgICBGQUxMX1RIUk9VR0g7CisgICAgY2FzZSBrU2luZ2xlVGFyZ2V0Q2FjaGVDaWQ6IHsKKyAgICAgIGNvbnN0IGF1dG8mIHVubGlua2VkX2NhbGwgPSBVbmxpbmtlZENhbGw6OkhhbmRsZSgKKyAgICAgICAgICB6b25lXywgTG9hZFVubGlua2VkQ2FsbCh6b25lXywgaXNvbGF0ZV8sIGNhbGxlcl9mcmFtZV8tPnBjKCkpKTsKKyAgICAgIG5hbWVfID0gdW5saW5rZWRfY2FsbC50YXJnZXRfbmFtZSgpOworICAgICAgYXJnc19kZXNjcmlwdG9yXyA9IHVubGlua2VkX2NhbGwuYXJndW1lbnRzX2Rlc2NyaXB0b3IoKTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSNlbHNlICAvLyBKSVQKLSAgICBjYXNlIGtBcnJheUNpZDoKKyNlbHNlCisgICAgY2FzZSBrQXJyYXlDaWQ6IHsKICAgICAgIC8vIElDRGF0YSB0aHJlZS1lbGVtZW50IGFycmF5OiBTbWkocmVjZWl2ZXIgQ0lEKSwgU21pKGNvdW50KSwKICAgICAgIC8vIEZ1bmN0aW9uKHRhcmdldCkuIEl0IGlzIHRoZSBBcnJheSBmcm9tIElDRGF0YTo6ZW50cmllc18uCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IElDRGF0YSYgaWNfZGF0YSA9IElDRGF0YTo6SGFuZGxlKAotICAgICAgICAgICAgem9uZV8sIEZpbmRJQ0RhdGFGb3JJbnN0YW5jZUNhbGwoem9uZV8sIGNhbGxlcl9jb2RlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcl9mcmFtZV8tPnBjKCkpKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWljX2RhdGEuSXNOdWxsKCkpOwotCi0gICAgICAgIGNvbnN0IFN0cmluZyYgbmFtZSA9IFN0cmluZzo6SGFuZGxlKHpvbmVfLCBpY19kYXRhLnRhcmdldF9uYW1lKCkpOwotICAgICAgICBBU1NFUlQobmFtZS5Jc1N5bWJvbCgpKTsKLQotICAgICAgICBjb25zdCBBcnJheSYgZGVzY3JpcHRvciA9Ci0gICAgICAgICAgICBBcnJheTo6Q2hlY2tlZEhhbmRsZSh6b25lXywgaWNfZGF0YS5hcmd1bWVudHNfZGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmV0dXJuIFJlc29sdmUoem9uZV8sIGNscywgbmFtZSwgZGVzY3JpcHRvcik7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIGtTaW5nbGVUYXJnZXRDYWNoZUNpZDogewotICAgICAgY29uc3QgU2luZ2xlVGFyZ2V0Q2FjaGUmIHNpbmdsZV90YXJnZXRfY2FjaGUgPQotICAgICAgICAgIFNpbmdsZVRhcmdldENhY2hlOjpDYXN0KGRhdGEpOwotICAgICAgY29uc3QgQ29kZSYgb2xkX3RhcmdldF9jb2RlID0KLSAgICAgICAgICBDb2RlOjpIYW5kbGUoem9uZV8sIHNpbmdsZV90YXJnZXRfY2FjaGUudGFyZ2V0KCkpOwotICAgICAgY29uc3QgRnVuY3Rpb24mIG9sZF90YXJnZXQgPQotICAgICAgICAgIEZ1bmN0aW9uOjpIYW5kbGUoem9uZV8sIEZ1bmN0aW9uOjpSYXdDYXN0KG9sZF90YXJnZXRfY29kZS5vd25lcigpKSk7Ci0KLSAgICAgIC8vIFdlIGxvc3QgdGhlIG9yaWdpbmFsIElDRGF0YSB3aGVuIHdlIHBhdGNoZWQgdG8gdGhlIG1vbm9tb3JwaGljIGNhc2UuCi0gICAgICBjb25zdCBTdHJpbmcmIG5hbWUgPSBTdHJpbmc6OkhhbmRsZSh6b25lXywgb2xkX3RhcmdldC5uYW1lKCkpOwotICAgICAgQVNTRVJUKCFvbGRfdGFyZ2V0Lkhhc09wdGlvbmFsUGFyYW1ldGVycygpKTsKLSAgICAgIEFTU0VSVCghb2xkX3RhcmdldC5Jc0dlbmVyaWMoKSk7Ci0gICAgICBjb25zdCBpbnQga1R5cGVBcmdzTGVuID0gMDsKLSAgICAgIGNvbnN0IEFycmF5JiBkZXNjcmlwdG9yID0gQXJyYXk6OkhhbmRsZSgKLSAgICAgICAgICB6b25lXywgQXJndW1lbnRzRGVzY3JpcHRvcjo6TmV3Qm94ZWQoCi0gICAgICAgICAgICAgICAgICAgICBrVHlwZUFyZ3NMZW4sIG9sZF90YXJnZXQubnVtX2ZpeGVkX3BhcmFtZXRlcnMoKSkpOwotICAgICAgcmV0dXJuIFJlc29sdmUoem9uZV8sIGNscywgbmFtZSwgZGVzY3JpcHRvcik7CisgICAgICBjb25zdCBhdXRvJiBpY19kYXRhID0gSUNEYXRhOjpIYW5kbGUoCisgICAgICAgICAgem9uZV8sCisgICAgICAgICAgRmluZElDRGF0YUZvckluc3RhbmNlQ2FsbCh6b25lXywgY2FsbGVyX2NvZGVfLCBjYWxsZXJfZnJhbWVfLT5wYygpKSk7CisgICAgICBSRUxFQVNFX0FTU0VSVCghaWNfZGF0YS5Jc051bGwoKSk7CisgICAgICBuYW1lXyA9IGljX2RhdGEudGFyZ2V0X25hbWUoKTsKKyAgICAgIGFyZ3NfZGVzY3JpcHRvcl8gPSBpY19kYXRhLmFyZ3VtZW50c19kZXNjcmlwdG9yKCk7CisgICAgICBicmVhazsKICAgICB9CisjZW5kaWYgIC8vIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogICAgIGNhc2Uga0lDRGF0YUNpZDoKICAgICAgIEZBTExfVEhST1VHSDsKICAgICBjYXNlIGtNZWdhbW9ycGhpY0NhY2hlQ2lkOiB7CiAgICAgICBjb25zdCBDYWxsU2l0ZURhdGEmIGNhbGxfc2l0ZV9kYXRhID0gQ2FsbFNpdGVEYXRhOjpDYXN0KGRhdGEpOwotICAgICAgY29uc3QgU3RyaW5nJiBuYW1lID0gU3RyaW5nOjpIYW5kbGUoem9uZV8sIGNhbGxfc2l0ZV9kYXRhLnRhcmdldF9uYW1lKCkpOwotICAgICAgY29uc3QgQXJyYXkmIGRlc2NyaXB0b3IgPQotICAgICAgICAgIEFycmF5OjpDaGVja2VkSGFuZGxlKHpvbmVfLCBjYWxsX3NpdGVfZGF0YS5hcmd1bWVudHNfZGVzY3JpcHRvcigpKTsKLSAgICAgIHJldHVybiBSZXNvbHZlKHpvbmVfLCBjbHMsIG5hbWUsIGRlc2NyaXB0b3IpOworICAgICAgbmFtZV8gPSBjYWxsX3NpdGVfZGF0YS50YXJnZXRfbmFtZSgpOworICAgICAgYXJnc19kZXNjcmlwdG9yXyA9IGNhbGxfc2l0ZV9kYXRhLmFyZ3VtZW50c19kZXNjcmlwdG9yKCk7CisgICAgICBicmVhazsKICAgICB9CiAgICAgZGVmYXVsdDoKICAgICAgIFVOUkVBQ0hBQkxFKCk7CiAgIH0KKyAgY29uc3QgQ2xhc3MmIGNscyA9IENsYXNzOjpIYW5kbGUoem9uZV8sIHJlY2VpdmVyXy5jbGF6eigpKTsKKyAgcmV0dXJuIFJlc29sdmUoem9uZV8sIGNscywgbmFtZV8sIGFyZ3NfZGVzY3JpcHRvcl8pOwogfQogCiB2b2lkIFN3aXRjaGFibGVDYWxsSGFuZGxlcjo6SGFuZGxlTWlzcyhjb25zdCBPYmplY3QmIG9sZF9kYXRhLApAQCAtMjEyMSwxNyArMjAzOSwxOSBAQAogICAgICAgRkFMTF9USFJPVUdIOwogI2lmIGRlZmluZWQoREFSVF9QUkVDT01QSUxFRF9SVU5USU1FKQogICAgIGNhc2Uga1NtaUNpZDoKLSNlbHNlICAvLyBKSVQKLSAgICBjYXNlIGtBcnJheUNpZDoKLSAgICAgIC8vIElDRGF0YSB0aHJlZS1lbGVtZW50IGFycmF5OiBTbWkocmVjZWl2ZXIgQ0lEKSwgU21pKGNvdW50KSwKLSAgICAgIC8vIEZ1bmN0aW9uKHRhcmdldCkuIEl0IGlzIHRoZSBBcnJheSBmcm9tIElDRGF0YTo6ZW50cmllc18uCi0jZW5kaWYKICAgICAgIERvTW9ub21vcnBoaWNNaXNzKG9sZF9kYXRhLCB0YXJnZXRfZnVuY3Rpb24pOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBrU2luZ2xlVGFyZ2V0Q2FjaGVDaWQ6CiAgICAgICBBU1NFUlQob2xkX2NvZGUucmF3KCkgPT0gU3R1YkNvZGU6OlNpbmdsZVRhcmdldENhbGwoKS5yYXcoKSk7CiAgICAgICBEb1NpbmdsZVRhcmdldE1pc3MoU2luZ2xlVGFyZ2V0Q2FjaGU6OkNhc3Qob2xkX2RhdGEpLCB0YXJnZXRfZnVuY3Rpb24pOwogICAgICAgYnJlYWs7CisjZWxzZQorICAgIGNhc2Uga0FycmF5Q2lkOgorICAgICAgLy8gSUNEYXRhIHRocmVlLWVsZW1lbnQgYXJyYXk6IFNtaShyZWNlaXZlciBDSUQpLCBTbWkoY291bnQpLAorICAgICAgLy8gRnVuY3Rpb24odGFyZ2V0KS4gSXQgaXMgdGhlIEFycmF5IGZyb20gSUNEYXRhOjplbnRyaWVzXy4KKyAgICAgIERvTW9ub21vcnBoaWNNaXNzKG9sZF9kYXRhLCB0YXJnZXRfZnVuY3Rpb24pOworICAgICAgYnJlYWs7CisjZW5kaWYgIC8vICFkZWZpbmVkKERBUlRfUFJFQ09NUElMRURfUlVOVElNRSkKICAgICBjYXNlIGtJQ0RhdGFDaWQ6CiAgICAgICBBU1NFUlQob2xkX2NvZGUucmF3KCkgPT0gU3R1YkNvZGU6OklDQ2FsbFRocm91Z2hDb2RlKCkucmF3KCkpOwogICAgICAgRG9JQ0RhdGFNaXNzKElDRGF0YTo6Q2FzdChvbGRfZGF0YSksIHRhcmdldF9mdW5jdGlvbik7CkBAIC0yMjU3LDcgKzIxNzcsOSBAQAogICAgIHRhcmdldF9uYW1lID0gTWVnYW1vcnBoaWNDYWNoZTo6Q2FzdChpY19kYXRhX29yX2NhY2hlKS50YXJnZXRfbmFtZSgpOwogICB9CiAKLSAgaWYgKEZ1bmN0aW9uOjpJc0R5bmFtaWNJbnZvY2F0aW9uRm9yd2FyZGVyTmFtZSh0YXJnZXRfbmFtZSkpIHsKKyAgY29uc3QgYm9vbCBpc19keW5hbWljX2NhbGwgPQorICAgICAgRnVuY3Rpb246OklzRHluYW1pY0ludm9jYXRpb25Gb3J3YXJkZXJOYW1lKHRhcmdldF9uYW1lKTsKKyAgaWYgKGlzX2R5bmFtaWNfY2FsbCkgewogICAgIHRhcmdldF9uYW1lID0gRnVuY3Rpb246OkRlbWFuZ2xlRHluYW1pY0ludm9jYXRpb25Gb3J3YXJkZXJOYW1lKHRhcmdldF9uYW1lKTsKICAgfQogCkBAIC0yMzA2LDggKzIyMjgsMTkgQEAKICAgICAgIC8vIFNwZWNpYWwgY2FzZTogY2xvc3VyZXMgYXJlIGltcGxlbWVudGVkIHdpdGggYSBjYWxsIGdldHRlciBpbnN0ZWFkIG9mIGEKICAgICAgIC8vIGNhbGwgbWV0aG9kIGFuZCB3aXRoIGxhenkgZGlzcGF0Y2hlcnMgdGhlIGZpZWxkLWludm9jYXRpb24tZGlzcGF0Y2hlcgogICAgICAgLy8gd291bGQgcGVyZm9ybSB0aGUgY2xvc3VyZSBjYWxsLgotICAgICAgY29uc3QgT2JqZWN0JiByZXN1bHQgPSBPYmplY3Q6OkhhbmRsZSgKLSAgICAgICAgICB6b25lLCBEYXJ0RW50cnk6Okludm9rZUNsb3N1cmUob3JpZ19hcmd1bWVudHMsIG9yaWdfYXJndW1lbnRzX2Rlc2MpKTsKKyAgICAgIGF1dG8mIHJlc3VsdCA9IE9iamVjdDo6SGFuZGxlKAorICAgICAgICAgIHpvbmUsCisgICAgICAgICAgRGFydEVudHJ5OjpSZXNvbHZlQ2FsbGFibGUob3JpZ19hcmd1bWVudHMsIG9yaWdfYXJndW1lbnRzX2Rlc2MpKTsKKyAgICAgIFRocm93SWZFcnJvcihyZXN1bHQpOworICAgICAgY29uc3QgRnVuY3Rpb24mIGNhbGxhYmxlX2Z1bmN0aW9uID0KKyAgICAgICAgICBGdW5jdGlvbjo6SGFuZGxlKHpvbmUsIEZ1bmN0aW9uOjpSYXdDYXN0KHJlc3VsdC5yYXcoKSkpOworICAgICAgaWYgKGlzX2R5bmFtaWNfY2FsbCAmJiAhY2FsbGFibGVfZnVuY3Rpb24uSXNOdWxsKCkpIHsKKyAgICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS80MDgxMyk6IE1vdmUgY2hlY2tzIHRoYXQgYXJlIGN1cnJlbnRseSBjb21waWxlZAorICAgICAgICAvLyBpbiB0aGUgY2xvc3VyZSBib2R5IHRvIGhlcmUgYXMgdGhleSBhcmUgYWxzbyBtb3ZlZCB0bworICAgICAgICAvLyBGbG93R3JhcGhCdWlsZGVyOjpCdWlsZEdyYXBoT2ZJbnZva2VGaWVsZERpc3BhdGNoZXIuCisgICAgICB9CisgICAgICByZXN1bHQgPSBEYXJ0RW50cnk6Okludm9rZUNhbGxhYmxlKGNhbGxhYmxlX2Z1bmN0aW9uLCBvcmlnX2FyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ19hcmd1bWVudHNfZGVzYyk7CiAgICAgICBUaHJvd0lmRXJyb3IocmVzdWx0KTsKICAgICAgIGFyZ3VtZW50cy5TZXRSZXR1cm4ocmVzdWx0KTsKICAgICAgIHJldHVybjsKQEAgLTIzMzIsOSArMjI2NSwxOSBAQAogICAgICAgICBBU1NFUlQoZ2V0dGVyX3Jlc3VsdC5Jc051bGwoKSB8fCBnZXR0ZXJfcmVzdWx0LklzSW5zdGFuY2UoKSk7CiAKICAgICAgICAgb3JpZ19hcmd1bWVudHMuU2V0QXQoYXJnc19kZXNjLkZpcnN0QXJnSW5kZXgoKSwgZ2V0dGVyX3Jlc3VsdCk7Ci0gICAgICAgIGNvbnN0IE9iamVjdCYgY2FsbF9yZXN1bHQgPSBPYmplY3Q6OkhhbmRsZSgKKyAgICAgICAgYXV0byYgY2FsbF9yZXN1bHQgPSBPYmplY3Q6OkhhbmRsZSgKICAgICAgICAgICAgIHpvbmUsCi0gICAgICAgICAgICBEYXJ0RW50cnk6Okludm9rZUNsb3N1cmUob3JpZ19hcmd1bWVudHMsIG9yaWdfYXJndW1lbnRzX2Rlc2MpKTsKKyAgICAgICAgICAgIERhcnRFbnRyeTo6UmVzb2x2ZUNhbGxhYmxlKG9yaWdfYXJndW1lbnRzLCBvcmlnX2FyZ3VtZW50c19kZXNjKSk7CisgICAgICAgIFRocm93SWZFcnJvcihjYWxsX3Jlc3VsdCk7CisgICAgICAgIGNvbnN0IEZ1bmN0aW9uJiBjYWxsYWJsZV9mdW5jdGlvbiA9CisgICAgICAgICAgICBGdW5jdGlvbjo6SGFuZGxlKHpvbmUsIEZ1bmN0aW9uOjpSYXdDYXN0KGNhbGxfcmVzdWx0LnJhdygpKSk7CisgICAgICAgIGlmIChpc19keW5hbWljX2NhbGwgJiYgIWNhbGxhYmxlX2Z1bmN0aW9uLklzTnVsbCgpKSB7CisgICAgICAgICAgLy8gVE9ETyhkYXJ0YnVnLmNvbS80MDgxMyk6IE1vdmUgY2hlY2tzIHRoYXQgYXJlIGN1cnJlbnRseSBjb21waWxlZAorICAgICAgICAgIC8vIGluIHRoZSBjbG9zdXJlIGJvZHkgdG8gaGVyZSBhcyB0aGV5IGFyZSBhbHNvIG1vdmVkIHRvCisgICAgICAgICAgLy8gRmxvd0dyYXBoQnVpbGRlcjo6QnVpbGRHcmFwaE9mSW52b2tlRmllbGREaXNwYXRjaGVyLgorICAgICAgICB9CisgICAgICAgIGNhbGxfcmVzdWx0ID0gRGFydEVudHJ5OjpJbnZva2VDYWxsYWJsZSgKKyAgICAgICAgICAgIGNhbGxhYmxlX2Z1bmN0aW9uLCBvcmlnX2FyZ3VtZW50cywgb3JpZ19hcmd1bWVudHNfZGVzYyk7CiAgICAgICAgIFRocm93SWZFcnJvcihjYWxsX3Jlc3VsdCk7CiAgICAgICAgIGFyZ3VtZW50cy5TZXRSZXR1cm4oY2FsbF9yZXN1bHQpOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL3J1bnRpbWVfZW50cnlfbGlzdC5oIGIvcnVudGltZS92bS9ydW50aW1lX2VudHJ5X2xpc3QuaAppbmRleCBmZDc0M2VmNi4uNWI4M2YxMyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9ydW50aW1lX2VudHJ5X2xpc3QuaAorKysgYi9ydW50aW1lL3ZtL3J1bnRpbWVfZW50cnlfbGlzdC5oCkBAIC00MCw2ICs0MCw3IEBACiAgIFYoUmFuZ2VFcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKE51bGxFcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihOdWxsRXJyb3JXaXRoU2VsZWN0b3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFYoTnVsbENhc3RFcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKEFyZ3VtZW50TnVsbEVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihBcmd1bWVudEVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoQXJndW1lbnRFcnJvclVuYm94ZWRJbnQ2NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zaW11bGF0b3JfYXJtLmNjIGIvcnVudGltZS92bS9zaW11bGF0b3JfYXJtLmNjCmluZGV4IDQ2ZjEzZjMuLmEwOTM2MWIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vc2ltdWxhdG9yX2FybS5jYworKysgYi9ydW50aW1lL3ZtL3NpbXVsYXRvcl9hcm0uY2MKQEAgLTkzNCwyNiArOTM0LDYgQEAKICAgRkFUQUwoIkNhbm5vdCBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgaWxsZWdhbCBtZW1vcnkgYWNjZXNzLiIpOwogfQogCi0vLyBQcm9jZXNzb3IgdmVyc2lvbnMgcHJpb3IgdG8gQVJNdjcgY291bGQgbm90IGRvIHVuYWxpZ25lZCByZWFkcyBhbmQgd3JpdGVzLgotLy8gT24gc29tZSBBUk0gcGxhdGZvcm1zIGFuIGludGVycnVwdCBpcyBjYXVzZWQuICBPbiBvdGhlcnMgaXQgZG9lcyBhIGZ1bmt5Ci0vLyByb3RhdGlvbiB0aGluZy4gIEhvd2V2ZXIsIGZyb20gdmVyc2lvbiB2NywgdW5hbGlnbmVkIGFjY2VzcyBpcyBzdXBwb3J0ZWQuCi0vLyBOb3RlIHRoYXQgc2ltdWxhdG9yIHJ1bnMgaGF2ZSB0aGUgcnVudGltZSBzeXN0ZW0gcnVubmluZyBkaXJlY3RseSBvbiB0aGUgaG9zdAotLy8gc3lzdGVtIGFuZCBvbmx5IGdlbmVyYXRlZCBjb2RlIGlzIGV4ZWN1dGVkIGluIHRoZSBzaW11bGF0b3IuICBTaW5jZSB0aGUgaG9zdAotLy8gaXMgdHlwaWNhbGx5IElBMzIgd2Ugd2lsbCBnZXQgdGhlIGNvcnJlY3QgQVJNdjctbGlrZSBiZWhhdmlvdXIgb24gdW5hbGlnbmVkCi0vLyBhY2Nlc3NlcywgYnV0IHdlIHNob3VsZCBhY3R1YWxseSBub3QgZ2VuZXJhdGUgY29kZSBhY2Nlc3NpbmcgdW5hbGlnbmVkIGRhdGEsCi0vLyBzbyB3ZSBzdGlsbCB3YW50IHRvIGtub3cgYW5kIGFib3J0IGlmIHdlIGVuY291bnRlciBzdWNoIGNvZGUuCi12b2lkIFNpbXVsYXRvcjo6VW5hbGlnbmVkQWNjZXNzKGNvbnN0IGNoYXIqIG1zZywgdXdvcmQgYWRkciwgSW5zdHIqIGluc3RyKSB7Ci0gIC8vIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHNpbmdsZSBzdGVwIHBhc3QgdGhpcyBpbnN0cnVjdGlvbiwgYnV0Ci0gIC8vIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gZGlzYXNzZW1ibGUgdGhlIGNvZGUgYW5kIGluc3BlY3QgcmVnaXN0ZXJzLgotICBjaGFyIGJ1ZmZlcls2NF07Ci0gIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJ1bmFsaWduZWQgJXMgYXQgMHglIiBQeCAiLCBwYz0lcFxuIiwgbXNnLAotICAgICAgICAgICBhZGRyLCBpbnN0cik7Ci0gIFNpbXVsYXRvckRlYnVnZ2VyIGRiZyh0aGlzKTsKLSAgZGJnLlN0b3AoaW5zdHIsIGJ1ZmZlcik7Ci0gIC8vIFRoZSBkZWJ1Z2dlciB3aWxsIHJldHVybiBjb250cm9sIGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlLgotICBGQVRBTCgiQ2Fubm90IGNvbnRpbnVlIGV4ZWN1dGlvbiBhZnRlciB1bmFsaWduZWQgYWNjZXNzLiIpOwotfQotCiB2b2lkIFNpbXVsYXRvcjo6VW5pbXBsZW1lbnRlZEluc3RydWN0aW9uKEluc3RyKiBpbnN0cikgewogICBjaGFyIGJ1ZmZlcls2NF07CiAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJVbmltcGxlbWVudGVkIGluc3RydWN0aW9uOiBwYz0lcFxuIiwgaW5zdHIpOwpAQCAtOTYzLDY3ICs5NDMsMzkgQEAKIH0KIAogREFSVF9GT1JDRV9JTkxJTkUgaW50cHRyX3QgU2ltdWxhdG9yOjpSZWFkVyh1d29yZCBhZGRyLCBJbnN0ciogaW5zdHIpIHsKLSAgaWYgKChhZGRyICYgMykgPT0gMCkgewotICAgIGludHB0cl90KiBwdHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Kj4oYWRkcik7Ci0gICAgcmV0dXJuICpwdHI7Ci0gIH0KLSAgVW5hbGlnbmVkQWNjZXNzKCJyZWFkIiwgYWRkciwgaW5zdHIpOwotICByZXR1cm4gMDsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGludHB0cl90Kj4oYWRkcik7CiB9CiAKIERBUlRfRk9SQ0VfSU5MSU5FIHZvaWQgU2ltdWxhdG9yOjpXcml0ZVcodXdvcmQgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyKiBpbnN0cikgewotICBpZiAoKGFkZHIgJiAzKSA9PSAwKSB7Ci0gICAgaW50cHRyX3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3QqPihhZGRyKTsKLSAgICAqcHRyID0gdmFsdWU7Ci0gICAgcmV0dXJuOwotICB9Ci0gIFVuYWxpZ25lZEFjY2Vzcygid3JpdGUiLCBhZGRyLCBpbnN0cik7CisgICpyZWludGVycHJldF9jYXN0PGludHB0cl90Kj4oYWRkcikgPSB2YWx1ZTsKIH0KIAogREFSVF9GT1JDRV9JTkxJTkUgdWludDE2X3QgU2ltdWxhdG9yOjpSZWFkSFUodXdvcmQgYWRkciwgSW5zdHIqIGluc3RyKSB7Ci0gIGlmICgoYWRkciAmIDEpID09IDApIHsKLSAgICB1aW50MTZfdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGFkZHIpOwotICAgIHJldHVybiAqcHRyOwotICB9Ci0gIFVuYWxpZ25lZEFjY2VzcygidW5zaWduZWQgaGFsZndvcmQgcmVhZCIsIGFkZHIsIGluc3RyKTsKLSAgcmV0dXJuIDA7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGFkZHIpOwogfQogCiBEQVJUX0ZPUkNFX0lOTElORSBpbnQxNl90IFNpbXVsYXRvcjo6UmVhZEgodXdvcmQgYWRkciwgSW5zdHIqIGluc3RyKSB7Ci0gIGlmICgoYWRkciAmIDEpID09IDApIHsKLSAgICBpbnQxNl90KiBwdHIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPihhZGRyKTsKLSAgICByZXR1cm4gKnB0cjsKLSAgfQotICBVbmFsaWduZWRBY2Nlc3MoInNpZ25lZCBoYWxmd29yZCByZWFkIiwgYWRkciwgaW5zdHIpOwotICByZXR1cm4gMDsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGludDE2X3QqPihhZGRyKTsKIH0KIAogREFSVF9GT1JDRV9JTkxJTkUgdm9pZCBTaW11bGF0b3I6OldyaXRlSCh1d29yZCBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHIqIGluc3RyKSB7Ci0gIGlmICgoYWRkciAmIDEpID09IDApIHsKLSAgICB1aW50MTZfdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGFkZHIpOwotICAgICpwdHIgPSB2YWx1ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgVW5hbGlnbmVkQWNjZXNzKCJoYWxmd29yZCB3cml0ZSIsIGFkZHIsIGluc3RyKTsKKyAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihhZGRyKSA9IHZhbHVlOwogfQogCiBEQVJUX0ZPUkNFX0lOTElORSB1aW50OF90IFNpbXVsYXRvcjo6UmVhZEJVKHV3b3JkIGFkZHIpIHsKLSAgdWludDhfdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYWRkcik7Ci0gIHJldHVybiAqcHRyOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGFkZHIpOwogfQogCiBEQVJUX0ZPUkNFX0lOTElORSBpbnQ4X3QgU2ltdWxhdG9yOjpSZWFkQih1d29yZCBhZGRyKSB7Ci0gIGludDhfdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ4X3QqPihhZGRyKTsKLSAgcmV0dXJuICpwdHI7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxpbnQ4X3QqPihhZGRyKTsKIH0KIAogREFSVF9GT1JDRV9JTkxJTkUgdm9pZCBTaW11bGF0b3I6OldyaXRlQih1d29yZCBhZGRyLCB1aW50OF90IHZhbHVlKSB7Ci0gIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGFkZHIpOwotICAqcHRyID0gdmFsdWU7CisgICpyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihhZGRyKSA9IHZhbHVlOwogfQogCiB2b2lkIFNpbXVsYXRvcjo6Q2xlYXJFeGNsdXNpdmUoKSB7CkBAIC0xNjExLDEwICsxNTYzLDYgQEAKICAgICAgICAgICAgIC8vIEZvcm1hdChpbnN0ciwgIm11bCdjb25kJ3MgJ3JuLCAncm0sICdycyIpOwogICAgICAgICAgICAgdWludDMyX3QgYWx1X291dCA9IHJtX3ZhbCAqIHJzX3ZhbDsKICAgICAgICAgICAgIGlmIChpbnN0ci0+Qml0cygyMSwgMykgPT0gMykgeyAgLy8gbWxzCi0gICAgICAgICAgICAgIGlmIChUYXJnZXRDUFVGZWF0dXJlczo6YXJtX3ZlcnNpb24oKSAhPSBBUk12NykgewotICAgICAgICAgICAgICAgIFVuaW1wbGVtZW50ZWRJbnN0cnVjdGlvbihpbnN0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYWx1X291dCA9IC1hbHVfb3V0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYWx1X291dCArPSByZF92YWw7CkBAIC0xNzQ1LDE4ICsxNjkzLDE0IEBACiAgICAgICBzd2l0Y2ggKGluc3RyLT5CaXRzKDIwLCA1KSkgewogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDIwOiB7Ci0gICAgICAgICAgaWYgKFRhcmdldENQVUZlYXR1cmVzOjphcm1fdmVyc2lvbigpID09IEFSTXY3KSB7Ci0gICAgICAgICAgICB1aW50MTZfdCBpbW0xNiA9IGluc3RyLT5Nb3Z3RmllbGQoKTsKLSAgICAgICAgICAgIFJlZ2lzdGVyIHJkID0gaW5zdHItPlJkRmllbGQoKTsKLSAgICAgICAgICAgIGlmIChpbnN0ci0+Qml0KDIyKSA9PSAwKSB7Ci0gICAgICAgICAgICAgIC8vIEZvcm1hdChpbnN0ciwgIm1vdncnY29uZCAncmQsICMnaW1tNF8xMiIpOwotICAgICAgICAgICAgICBzZXRfcmVnaXN0ZXIocmQsIGltbTE2KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIC8vIEZvcm1hdChpbnN0ciwgIm1vdnQnY29uZCAncmQsICMnaW1tNF8xMiIpOwotICAgICAgICAgICAgICBzZXRfcmVnaXN0ZXIocmQsIChnZXRfcmVnaXN0ZXIocmQpICYgMHhmZmZmKSB8IChpbW0xNiA8PCAxNikpOwotICAgICAgICAgICAgfQorICAgICAgICAgIHVpbnQxNl90IGltbTE2ID0gaW5zdHItPk1vdndGaWVsZCgpOworICAgICAgICAgIFJlZ2lzdGVyIHJkID0gaW5zdHItPlJkRmllbGQoKTsKKyAgICAgICAgICBpZiAoaW5zdHItPkJpdCgyMikgPT0gMCkgeworICAgICAgICAgICAgLy8gRm9ybWF0KGluc3RyLCAibW92dydjb25kICdyZCwgIydpbW00XzEyIik7CisgICAgICAgICAgICBzZXRfcmVnaXN0ZXIocmQsIGltbTE2KTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVW5pbXBsZW1lbnRlZEluc3RydWN0aW9uKGluc3RyKTsKKyAgICAgICAgICAgIC8vIEZvcm1hdChpbnN0ciwgIm1vdnQnY29uZCAncmQsICMnaW1tNF8xMiIpOworICAgICAgICAgICAgc2V0X3JlZ2lzdGVyKHJkLCAoZ2V0X3JlZ2lzdGVyKHJkKSAmIDB4ZmZmZikgfCAoaW1tMTYgPDwgMTYpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vc3R1Yl9jb2RlX2xpc3QuaCBiL3J1bnRpbWUvdm0vc3R1Yl9jb2RlX2xpc3QuaAppbmRleCAxMDdkOGQ3Li44MzQzNTcyIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3N0dWJfY29kZV9saXN0LmgKKysrIGIvcnVudGltZS92bS9zdHViX2NvZGVfbGlzdC5oCkBAIC04MSw2ICs4MSw4IEBACiAgIFYoTnVsbEVycm9yU2hhcmVkV2l0aG91dEZQVVJlZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKE51bGxBcmdFcnJvclNoYXJlZFdpdGhGUFVSZWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihOdWxsQXJnRXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFYoTnVsbENhc3RFcnJvclNoYXJlZFdpdGhGUFVSZWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKE51bGxDYXN0RXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihSYW5nZUVycm9yU2hhcmVkV2l0aEZQVVJlZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoUmFuZ2VFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKFN0YWNrT3ZlcmZsb3dTaGFyZWRXaXRoRlBVUmVncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vc3ltYm9scy5oIGIvcnVudGltZS92bS9zeW1ib2xzLmgKaW5kZXggODU5ODQzMC4uN2UzOGY5ZSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9zeW1ib2xzLmgKKysrIGIvcnVudGltZS92bS9zeW1ib2xzLmgKQEAgLTEwNyw2ICsxMDcsNyBAQAogICBWKERvdFdpdGhUeXBlLCAiLl93aXRoVHlwZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihEb3VibGUsICJkb3VibGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoRHluYW1pYywgImR5bmFtaWMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKER5bmFtaWNDYWxsLCAiZHluOmNhbGwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihEeW5hbWljUHJlZml4LCAiZHluOiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoRW50cnlQb2ludHNUZW1wLCAiOmVudHJ5X3BvaW50c190ZW1wIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKEVxdWFsT3BlcmF0b3IsICI9PSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM2MCw2ICszNjEsNyBAQAogICBWKF9GdXR1cmVMaXN0ZW5lciwgIl9GdXR1cmVMaXN0ZW5lciIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfR3Jvd2FibGVMaXN0LCAiX0dyb3dhYmxlTGlzdCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX0dyb3dhYmxlTGlzdEZhY3RvcnksICJfR3Jvd2FibGVMaXN0LiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKF9Hcm93YWJsZUxpc3RGaWxsZWRGYWN0b3J5LCAiX0dyb3dhYmxlTGlzdC5maWxsZWQiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfR3Jvd2FibGVMaXN0V2l0aERhdGEsICJfR3Jvd2FibGVMaXN0Ll93aXRoRGF0YSIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX0ltbXV0YWJsZUxpc3QsICJfSW1tdXRhYmxlTGlzdCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKF9JbnQxNkFycmF5RmFjdG9yeSwgIkludDE2TGlzdC4iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM4Nyw2ICszODksNyBAQAogICBWKF9MaW5rZWRIYXNoU2V0LCAiX0NvbXBhY3RMaW5rZWRIYXNoU2V0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfTGlzdCwgIl9MaXN0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX0xpc3RGYWN0b3J5LCAiX0xpc3QuIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWKF9MaXN0RmlsbGVkRmFjdG9yeSwgIl9MaXN0LmZpbGxlZCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgVihfTWV0aG9kTWlycm9yLCAiX01ldGhvZE1pcnJvciIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFYoX01pbnQsICJfTWludCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBWKF9NaXJyb3JSZWZlcmVuY2UsICJfTWlycm9yUmVmZXJlbmNlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vdGhyZWFkLmggYi9ydW50aW1lL3ZtL3RocmVhZC5oCmluZGV4IDQ4YWY1OWYuLjhlYzE3YTIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vdGhyZWFkLmgKKysrIGIvcnVudGltZS92bS90aHJlYWQuaApAQCAtMTA5LDYgKzEwOSwxMCBAQAogICAgIFN0dWJDb2RlOjpOdWxsQXJnRXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncygpLnJhdygpLCBudWxscHRyKSAgICAgICAgICAgICAgIFwKICAgVihDb2RlUHRyLCBudWxsX2FyZ19lcnJvcl9zaGFyZWRfd2l0aF9mcHVfcmVnc19zdHViXywgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgU3R1YkNvZGU6Ok51bGxBcmdFcnJvclNoYXJlZFdpdGhGUFVSZWdzKCkucmF3KCksIG51bGxwdHIpICAgICAgICAgICAgICAgICAgXAorICBWKENvZGVQdHIsIG51bGxfY2FzdF9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTdHViQ29kZTo6TnVsbENhc3RFcnJvclNoYXJlZFdpdGhvdXRGUFVSZWdzKCkucmF3KCksIG51bGxwdHIpICAgICAgICAgICAgICBcCisgIFYoQ29kZVB0ciwgbnVsbF9jYXN0X2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0dWJDb2RlOjpOdWxsQ2FzdEVycm9yU2hhcmVkV2l0aEZQVVJlZ3MoKS5yYXcoKSwgbnVsbHB0cikgICAgICAgICAgICAgICAgIFwKICAgVihDb2RlUHRyLCByYW5nZV9lcnJvcl9zaGFyZWRfd2l0aG91dF9mcHVfcmVnc19zdHViXywgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgU3R1YkNvZGU6OlJhbmdlRXJyb3JTaGFyZWRXaXRob3V0RlBVUmVncygpLnJhdygpLCBudWxscHRyKSAgICAgICAgICAgICAgICAgXAogICBWKENvZGVQdHIsIHJhbmdlX2Vycm9yX3NoYXJlZF93aXRoX2ZwdV9yZWdzX3N0dWJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vdGltZWxpbmUuaCBiL3J1bnRpbWUvdm0vdGltZWxpbmUuaAppbmRleCAyODI0ZmQwLi5kNWJlMzk5IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3RpbWVsaW5lLmgKKysrIGIvcnVudGltZS92bS90aW1lbGluZS5oCkBAIC0yMCw3ICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpYi90cmFjZS1lbmdpbmUvaW5zdHJ1bWVudGF0aW9uLmg+CiAjZWxpZiBkZWZpbmVkKEhPU1RfT1NfTUFDT1MpCiAjaW5jbHVkZSA8b3MvYXZhaWxhYmlsaXR5Lmg+CisjaWYgZGVmaW5lZChfX01BQ18xMF8xNCkgfHwgZGVmaW5lZCAoX19JUEhPTkVfMTJfMCkKKyNkZWZpbmUgSE9TVF9PU19TVVBQT1JUU19TSUdOUE9TVCAxCisjZW5kaWYKKy8vc2lnbnBvc3QuaCBleGlzdHMgaW4gbWFjT1MgMTAuMTQsIGlPUyAxMiBvciBhYm92ZQorI2lmIGRlZmluZWQoSE9TVF9PU19TVVBQT1JUU19TSUdOUE9TVCkKICNpbmNsdWRlIDxvcy9zaWducG9zdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxvcy9sb2cuaD4KKyNlbmRpZgogI2VuZGlmCiAKIG5hbWVzcGFjZSBkYXJ0IHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vdGltZWxpbmVfbWFjb3MuY2MgYi9ydW50aW1lL3ZtL3RpbWVsaW5lX21hY29zLmNjCmluZGV4IGQ0M2UzY2MuLjkzZTBmN2QgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vdGltZWxpbmVfbWFjb3MuY2MKKysrIGIvcnVudGltZS92bS90aW1lbGluZV9tYWNvcy5jYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlICJ2bS9nbG9iYWxzLmgiCiAjaWYgZGVmaW5lZChIT1NUX09TX01BQ09TKSAmJiBkZWZpbmVkKFNVUFBPUlRfVElNRUxJTkUpCiAKLSNpbmNsdWRlIDxvcy9zaWducG9zdC5oPgogCiAjaW5jbHVkZSAidm0vbG9nLmgiCiAjaW5jbHVkZSAidm0vdGltZWxpbmUuaCIKQEAgLTIzLDYgKzIyLDcgQEAKICAgICByZXR1cm47CiAgIH0KIAorI2lmIGRlZmluZWQoSE9TVF9PU19TVVBQT1JUU19TSUdOUE9TVCkKICAgb3NfbG9nX3QgbG9nID0gZXZlbnQtPnN0cmVhbV8tPm1hY29zX2xvZygpOwogICBpZiAoIW9zX3NpZ25wb3N0X2VuYWJsZWQobG9nKSkgewogICAgIHJldHVybjsKQEAgLTc1LDYgKzc1LDcgQEAKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChIT1NUX09TX1NVUFBPUlRTX1NJR05QT1NUKQogfQogCiB9ICAvLyBuYW1lc3BhY2UgZGFydApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS91bmljb2RlLmNjIGIvcnVudGltZS92bS91bmljb2RlLmNjCmluZGV4IDBlY2I3MmMuLmZjMmE4YmYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vdW5pY29kZS5jYworKysgYi9ydW50aW1lL3ZtL3VuaWNvZGUuY2MKQEAgLTExOSw2ICsxMTksMTMgQEAKICAgICBTdHJpbmc6OkNvZGVQb2ludEl0ZXJhdG9yIGl0KHNyYyk7CiAgICAgd2hpbGUgKGl0Lk5leHQoKSkgewogICAgICAgaW50MzJfdCBjaCA9IGl0LkN1cnJlbnQoKTsKKyAgICAgIEFTU0VSVCghVXRmOjpJc091dE9mUmFuZ2UoY2gpKTsKKyAgICAgIGlmIChVdGYxNjo6SXNTdXJyb2dhdGUoY2gpKSB7CisgICAgICAgIC8vIEVuY29kZSB1bnBhaXJlZCBzdXJyb2dhdGVzIGFzIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgdG8gZW5zdXJlIHRoZQorICAgICAgICAvLyBvdXRwdXQgaXMgdmFsaWQgVVRGLTguIEVuY29kZWQgc2l6ZSBpcyB0aGUgc2FtZSAoMyksIHNvIHRoZSBjb21wdXRlZAorICAgICAgICAvLyBsZW5ndGggaXMgc3RpbGwgdmFsaWQuCisgICAgICAgIGNoID0gVXRmOjprUmVwbGFjZW1lbnRDaGFyOworICAgICAgfQogICAgICAgaW50cHRyX3QgbnVtX2J5dGVzID0gVXRmODo6TGVuZ3RoKGNoKTsKICAgICAgIGlmIChwb3MgKyBudW1fYnl0ZXMgPiBsZW4pIHsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL3ZlcnNpb24uaCBiL3J1bnRpbWUvdm0vdmVyc2lvbi5oCmluZGV4IGZkYzZiYjAuLmEzNzY5ZjYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vdmVyc2lvbi5oCisrKyBiL3J1bnRpbWUvdm0vdmVyc2lvbi5oCkBAIC0xNiwxMSArMTYsMTMgQEAKICAgc3RhdGljIGNvbnN0IGNoYXIqIENvbW1pdFN0cmluZygpOwogICBzdGF0aWMgaW50IEN1cnJlbnRBYmlWZXJzaW9uKCk7CiAgIHN0YXRpYyBpbnQgT2xkZXN0U3VwcG9ydGVkQWJpVmVyc2lvbigpOworICBzdGF0aWMgY29uc3QgY2hhciogU2RrSGFzaCgpOwogCiAgcHJpdmF0ZToKICAgc3RhdGljIGNvbnN0IGNoYXIqIHN0cl87CiAgIHN0YXRpYyBjb25zdCBjaGFyKiBzbmFwc2hvdF9oYXNoXzsKICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1pdF87CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnaXRfc2hvcnRfaGFzaF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZGFydApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS92ZXJzaW9uX2luLmNjIGIvcnVudGltZS92bS92ZXJzaW9uX2luLmNjCmluZGV4IGI0ZjFlMmQuLmY2M2ZlM2YgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vdmVyc2lvbl9pbi5jYworKysgYi9ydW50aW1lL3ZtL3ZlcnNpb25faW4uY2MKQEAgLTM4LDggKzM4LDEzIEBACiAgIHJldHVybiB7e09MREVTVF9TVVBQT1JURURfQUJJX1ZFUlNJT059fTsKIH0KIAorY29uc3QgY2hhciogVmVyc2lvbjo6U2RrSGFzaCgpIHsKKyAgcmV0dXJuIGdpdF9zaG9ydF9oYXNoXzsKK30KKwogY29uc3QgY2hhciogVmVyc2lvbjo6c25hcHNob3RfaGFzaF8gPSAie3tTTkFQU0hPVF9IQVNIfX0iOwogY29uc3QgY2hhciogVmVyc2lvbjo6c3RyXyA9ICJ7e1ZFUlNJT05fU1RSfX0gKHt7Q0hBTk5FTH19KSAoe3tDT01NSVRfVElNRX19KSI7CiBjb25zdCBjaGFyKiBWZXJzaW9uOjpjb21taXRfID0gInt7VkVSU0lPTl9TVFJ9fSI7Citjb25zdCBjaGFyKiBWZXJzaW9uOjpnaXRfc2hvcnRfaGFzaF8gPSAie3tHSVRfSEFTSH19IjsKIAogfSAgLy8gbmFtZXNwYWNlIGRhcnQKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2FsbG93ZWRfZXhwZXJpbWVudHMuanNvbiBiL3Nkay9saWIvX2ludGVybmFsL2FsbG93ZWRfZXhwZXJpbWVudHMuanNvbgppbmRleCBhMWZmNzYwLi5iZDY5MDBmIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9hbGxvd2VkX2V4cGVyaW1lbnRzLmpzb24KKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvYWxsb3dlZF9leHBlcmltZW50cy5qc29uCkBAIC0zNCw2ICszNCw5IEBACiAgICAgImNvbGxlY3Rpb24iOiB7CiAgICAgICAiZXhwZXJpbWVudFNldCI6ICJudWxsU2FmZXR5IgogICAgIH0sCisgICAgImRhcnRfaW50ZXJuYWwiOiB7CisgICAgICAiZXhwZXJpbWVudFNldCI6ICJudWxsU2FmZXR5IgorICAgIH0sCiAgICAgImZha2VfYXN5bmMiOiB7CiAgICAgICAiZXhwZXJpbWVudFNldCI6ICJudWxsU2FmZXR5IgogICAgIH0sCkBAIC00Myw2ICs0Niw5IEBACiAgICAgImZsdXR0ZXIiOiB7CiAgICAgICAiZXhwZXJpbWVudFNldCI6ICJudWxsU2FmZXR5IgogICAgIH0sCisgICAgImZsdXR0ZXJfdGVzdCI6IHsKKyAgICAgICJleHBlcmltZW50U2V0IjogIm51bGxTYWZldHkiCisgICAgfSwKICAgICAianMiOiB7CiAgICAgICAiZXhwZXJpbWVudFNldCI6ICJudWxsU2FmZXR5IgogICAgIH0sCmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL2RkY19ydW50aW1lL3R5cGVzLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL2RkY19ydW50aW1lL3R5cGVzLmRhcnQKaW5kZXggYWQ3N2Q2My4uYTRiY2FmOCAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvanNfZGV2X3J1bnRpbWUvcHJpdmF0ZS9kZGNfcnVudGltZS90eXBlcy5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2pzX2Rldl9ydW50aW1lL3ByaXZhdGUvZGRjX3J1bnRpbWUvdHlwZXMuZGFydApAQCAtNTI4LDIyICs1MjgsMjYgQEAKICAgfQogICBpZiAoX2pzSW5zdGFuY2VPZih0eXBlLCBHZW5lcmljRnVuY3Rpb25UeXBlKSkgewogICAgIHZhciBmb3JtYWxzID0gX2dldENhbm9uaWNhbFR5cGVGb3JtYWxzKHR5cGUudHlwZUZvcm1hbHMubGVuZ3RoKTsKLSAgICB2YXIgbm9ybUJvdW5kcyA9CisgICAgTGlzdDxkeW5hbWljPiBub3JtQm91bmRzID0KICAgICAgICAgdHlwZS5pbnN0YW50aWF0ZVR5cGVCb3VuZHMoZm9ybWFscykubWFwKG5vcm1hbGl6ZUhlbHBlcikudG9MaXN0KCk7CiAKLSAgICAvLyBOb3JtYWxpemUgdHlwZSBhcmd1bWVudHMgdGhhdCBhcmUgYm91bmRlZCBieSBOZXZlciB0byBOZXZlciBhdCB0aGVpcgotICAgIC8vIHVzZSBzaXRlIGluIHRoZSBmdW5jdGlvbiB0eXBlIHNpZ25hdHVyZS4KICAgICB2YXIgc3Vic3RpdHV0ZWRUeXBlcyA9IFtdOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWFscy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIHN1YnN0aXR1dGVkVHlwZSA9IG5vcm1Cb3VuZHNbaV07Ci0gICAgICB3aGlsZSAoZm9ybWFscy5jb250YWlucyhzdWJzdGl0dXRlZFR5cGUpKSB7Ci0gICAgICAgIHN1YnN0aXR1dGVkVHlwZSA9IG5vcm1Cb3VuZHNbZm9ybWFscy5pbmRleE9mKHN1YnN0aXR1dGVkVHlwZSldOworICAgIGlmIChub3JtQm91bmRzLmNvbnRhaW5zKF9uZXZlcikpIHsKKyAgICAgIC8vIE5vcm1hbGl6ZSB0eXBlIGFyZ3VtZW50cyB0aGF0IGFyZSBib3VuZGVkIGJ5IE5ldmVyIHRvIE5ldmVyIGF0IHRoZWlyCisgICAgICAvLyB1c2Ugc2l0ZSBpbiB0aGUgZnVuY3Rpb24gdHlwZSBzaWduYXR1cmUuCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHN1YnN0aXR1dGVkVHlwZSA9IG5vcm1Cb3VuZHNbaV07CisgICAgICAgIHdoaWxlIChmb3JtYWxzLmNvbnRhaW5zKHN1YnN0aXR1dGVkVHlwZSkpIHsKKyAgICAgICAgICBzdWJzdGl0dXRlZFR5cGUgPSBub3JtQm91bmRzW2Zvcm1hbHMuaW5kZXhPZihzdWJzdGl0dXRlZFR5cGUpXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3Vic3RpdHV0ZWRUeXBlID09IF9uZXZlcikgeworICAgICAgICAgIHN1YnN0aXR1dGVkVHlwZXMuYWRkKF9uZXZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3Vic3RpdHV0ZWRUeXBlcy5hZGQoZm9ybWFsc1tpXSk7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmIChzdWJzdGl0dXRlZFR5cGUgPT0gX25ldmVyKSB7Ci0gICAgICAgIHN1YnN0aXR1dGVkVHlwZXMuYWRkKF9uZXZlcik7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgc3Vic3RpdHV0ZWRUeXBlcy5hZGQoZm9ybWFsc1tpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN1YnN0aXR1dGVkVHlwZXMgPSBmb3JtYWxzOwogICAgIH0KIAogICAgIHZhciBub3JtRnVuYyA9CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL2pzX2FycmF5LmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL2pzX2FycmF5LmRhcnQKaW5kZXggNDUzODEyMC4uMGYxZWI0YiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvanNfZGV2X3J1bnRpbWUvcHJpdmF0ZS9qc19hcnJheS5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2pzX2Rldl9ydW50aW1lL3ByaXZhdGUvanNfYXJyYXkuZGFydApAQCAtOTgsNyArOTgsNyBAQAogICAgIH0KICAgICBAbnVsbENoZWNrCiAgICAgaW50IGluc2VydGlvbkxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDsKLSAgICB0aGlzLmxlbmd0aCArPSBpbnNlcnRpb25MZW5ndGg7CisgICAgdGhpcy5fc2V0TGVuZ3RoVW5zYWZlKHRoaXMubGVuZ3RoICsgaW5zZXJ0aW9uTGVuZ3RoKTsKICAgICBpbnQgZW5kID0gaW5kZXggKyBpbnNlcnRpb25MZW5ndGg7CiAgICAgdGhpcy5zZXRSYW5nZShlbmQsIHRoaXMubGVuZ3RoLCB0aGlzLCBpbmRleCk7CiAgICAgdGhpcy5zZXRSYW5nZShpbmRleCwgZW5kLCBpdGVyYWJsZSk7CkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgIGludCBkZWx0YSA9IGluc2VydExlbmd0aCAtIHJlbW92ZUxlbmd0aDsKICAgICAgIGludCBuZXdMZW5ndGggPSB0aGlzLmxlbmd0aCArIGRlbHRhOwogICAgICAgaW50IGluc2VydEVuZCA9IHN0YXJ0ICsgaW5zZXJ0TGVuZ3RoOyAvLyBha2EuIGVuZCArIGRlbHRhLgotICAgICAgdGhpcy5sZW5ndGggPSBuZXdMZW5ndGg7CisgICAgICB0aGlzLl9zZXRMZW5ndGhVbnNhZmUobmV3TGVuZ3RoKTsKICAgICAgIHRoaXMuc2V0UmFuZ2UoaW5zZXJ0RW5kLCBuZXdMZW5ndGgsIHRoaXMsIGVuZCk7CiAgICAgICB0aGlzLnNldFJhbmdlKHN0YXJ0LCBpbnNlcnRFbmQsIHJlcGxhY2VtZW50KTsKICAgICB9CkBAIC01NDUsNiArNTQ1LDI3IEBACiAgICAgaWYgKG5ld0xlbmd0aCA8IDApIHsKICAgICAgIHRocm93IFJhbmdlRXJyb3IucmFuZ2UobmV3TGVuZ3RoLCAwLCBudWxsLCAnbmV3TGVuZ3RoJyk7CiAgICAgfQorCisgICAgLy8gVmVyaWZ5IHRoYXQgZWxlbWVudCB0eXBlIGlzIG51bGxhYmxlLgorICAgIGlmIChuZXdMZW5ndGggPiBsZW5ndGgpIG51bGwgYXMgRTsKKworICAgIC8vIEphdmFTY3JpcHQgd2l0aCB0aHJvdyBhIFJhbmdlRXJyb3IgZm9yIG51bWJlcnMgdGhhdCBhcmUgdG9vIGJpZy4gVGhlCisgICAgLy8gbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZS4KKyAgICBKUygndm9pZCcsIHInIy5sZW5ndGggPSAjJywgdGhpcywgbmV3TGVuZ3RoKTsKKyAgfQorCisgIC8vLyBVbnNhZmUgYWx0ZXJuYXRpdmUgdG8gdGhlIFtsZW5ndGhdIHNldHRlciB0aGF0IHNraXBzIHRoZSBjaGVjayBhbmQgd2lsbAorICAvLy8gbm90IGZhaWwgd2hlbiBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIGEgbGlzdCBvZiBub24tbnVsbGFibGUgZWxlbWVudHMuCisgIC8vLworICAvLy8gVG8gZW5zdXJlIG51bGwgc2FmZSBzb3VuZG5lc3MgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBldmVyeSBuZXcKKyAgLy8vIGluZGV4IHdpbGwgYmUgZmlsbGVkIGJlZm9yZSByZXR1cm5pbmcuCisgIC8vLworICAvLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGxpc3QgaXMgYWxyZWFkeSBrbm93biB0byBiZSBncm93YWJsZS4KKyAgdm9pZCBfc2V0TGVuZ3RoVW5zYWZlKGludCBuZXdMZW5ndGgpIHsKKyAgICAvLyBUT0RPKHNyYSk6IFJlbW92ZSB0aGlzIHRlc3QgYW5kIGxldCBKYXZhU2NyaXB0IHRocm93IGFuIGVycm9yLgorICAgIGlmIChuZXdMZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBSYW5nZUVycm9yLnJhbmdlKG5ld0xlbmd0aCwgMCwgbnVsbCwgJ25ld0xlbmd0aCcpOworICAgIH0KICAgICAvLyBKYXZhU2NyaXB0IHdpdGggdGhyb3cgYSBSYW5nZUVycm9yIGZvciBudW1iZXJzIHRoYXQgYXJlIHRvbyBiaWcuIFRoZQogICAgIC8vIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiB0aGUgdmFsdWUuCiAgICAgSlMoJ3ZvaWQnLCByJyMubGVuZ3RoID0gIycsIHRoaXMsIG5ld0xlbmd0aCk7CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL25hdGl2ZV90eXBlZF9kYXRhLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9qc19kZXZfcnVudGltZS9wcml2YXRlL25hdGl2ZV90eXBlZF9kYXRhLmRhcnQKaW5kZXggM2E3ZjQwOS4uZTk4YzZjMSAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvanNfZGV2X3J1bnRpbWUvcHJpdmF0ZS9uYXRpdmVfdHlwZWRfZGF0YS5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2pzX2Rldl9ydW50aW1lL3ByaXZhdGUvbmF0aXZlX3R5cGVkX2RhdGEuZGFydApAQCAtMTM2MSwyMSArMTM2MSwyNSBAQAogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3hdIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgbmV3WCkgeworICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG5ld1gpOwogICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZChfdHJ1bmNhdGUobmV3WCksIHksIHosIHcpOwogICB9CiAKICAgLy8vIENvcHkgW3RoaXNdIGFuZCByZXBsYWNlIHRoZSBbeV0gbGFuZS4KICAgRmxvYXQzMng0IHdpdGhZKGRvdWJsZSBuZXdZKSB7CisgICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwobmV3WSk7CiAgICAgcmV0dXJuIE5hdGl2ZUZsb2F0MzJ4NC5fdHJ1bmNhdGVkKHgsIF90cnVuY2F0ZShuZXdZKSwgeiwgdyk7CiAgIH0KIAogICAvLy8gQ29weSBbdGhpc10gYW5kIHJlcGxhY2UgdGhlIFt6XSBsYW5lLgogICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIG5ld1opIHsKKyAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChuZXdaKTsKICAgICByZXR1cm4gTmF0aXZlRmxvYXQzMng0Ll90cnVuY2F0ZWQoeCwgeSwgX3RydW5jYXRlKG5ld1opLCB3KTsKICAgfQogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3ddIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgbmV3VykgeworICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKG5ld1cpOwogICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZCh4LCB5LCB6LCBfdHJ1bmNhdGUobmV3VykpOwogICB9CiAKQEAgLTE1ODMsMjQgKzE1ODcsMjggQEAKIAogICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICAgSW50MzJ4NCB3aXRoWChpbnQgeCkgeworICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHgpOwogICAgIGludCBfeCA9IF90cnVuY2F0ZSh4KTsKICAgICByZXR1cm4gTmF0aXZlSW50MzJ4NC5fdHJ1bmNhdGVkKF94LCB5LCB6LCB3KTsKICAgfQogCiAgIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgogICBJbnQzMng0IHdpdGhZKGludCB5KSB7CisgICAgQXJndW1lbnRFcnJvci5jaGVja05vdE51bGwoeSk7CiAgICAgaW50IF95ID0gX3RydW5jYXRlKHkpOwogICAgIHJldHVybiBOYXRpdmVJbnQzMng0Ll90cnVuY2F0ZWQoeCwgX3ksIHosIHcpOwogICB9CiAKICAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCiAgIEludDMyeDQgd2l0aFooaW50IHopIHsKKyAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbCh6KTsKICAgICBpbnQgX3ogPSBfdHJ1bmNhdGUoeik7CiAgICAgcmV0dXJuIE5hdGl2ZUludDMyeDQuX3RydW5jYXRlZCh4LCB5LCBfeiwgdyk7CiAgIH0KIAogICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KICAgSW50MzJ4NCB3aXRoVyhpbnQgdykgeworICAgIEFyZ3VtZW50RXJyb3IuY2hlY2tOb3ROdWxsKHcpOwogICAgIGludCBfdyA9IF90cnVuY2F0ZSh3KTsKICAgICByZXR1cm4gTmF0aXZlSW50MzJ4NC5fdHJ1bmNhdGVkKHgsIHksIHosIF93KTsKICAgfQpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvYXN5bmNfcGF0Y2guZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL2FzeW5jX3BhdGNoLmRhcnQKaW5kZXggNDVlZDBjNS4uNGZhZWI1MSAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvYXN5bmNfcGF0Y2guZGFydAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9hc3luY19wYXRjaC5kYXJ0CkBAIC00MDIsOSArNDAyLDEwIEBACiAgICAgcmV0dXJuOwogICB9CiAKKyAgX1dyYXBwZWRBc3luY0JvZHkgYm9keUZ1bmN0aW9uID0gYm9keUZ1bmN0aW9uT3JFcnJvckNvZGU7CiAgIGlmIChvYmplY3QgaXMgX0l0ZXJhdGlvbk1hcmtlcikgewogICAgIGlmIChjb250cm9sbGVyLmlzQ2FuY2VsZWQpIHsKLSAgICAgIGJvZHlGdW5jdGlvbk9yRXJyb3JDb2RlKGFzeW5jX2Vycm9yX2NvZGVzLlNUUkVBTV9XQVNfQ0FOQ0VMRUQsIG51bGwpOworICAgICAgYm9keUZ1bmN0aW9uKGFzeW5jX2Vycm9yX2NvZGVzLlNUUkVBTV9XQVNfQ0FOQ0VMRUQsIG51bGwpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAob2JqZWN0LnN0YXRlID09IF9JdGVyYXRpb25NYXJrZXIuWUlFTERfU0lOR0xFKSB7CkBAIC00MTgsNyArNDE5LDcgQEAKICAgICAgICAgICBjb250cm9sbGVyLmlzU3VzcGVuZGVkID0gdHJ1ZTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYm9keUZ1bmN0aW9uT3JFcnJvckNvZGUobnVsbCwgYXN5bmNfZXJyb3JfY29kZXMuU1VDQ0VTUyk7CisgICAgICAgIGJvZHlGdW5jdGlvbihhc3luY19lcnJvcl9jb2Rlcy5TVUNDRVNTLCBudWxsKTsKICAgICAgIH0pOwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAob2JqZWN0LnN0YXRlID09IF9JdGVyYXRpb25NYXJrZXIuWUlFTERfU1RBUikgewpAQCAtNDM0LDEzICs0MzUsMTMgQEAKICAgICAgICAgaW50IGVycm9yQ29kZSA9IGNvbnRyb2xsZXIuaXNDYW5jZWxlZAogICAgICAgICAgICAgPyBhc3luY19lcnJvcl9jb2Rlcy5TVFJFQU1fV0FTX0NBTkNFTEVECiAgICAgICAgICAgICA6IGFzeW5jX2Vycm9yX2NvZGVzLlNVQ0NFU1M7Ci0gICAgICAgIGJvZHlGdW5jdGlvbk9yRXJyb3JDb2RlKGVycm9yQ29kZSwgbnVsbCk7CisgICAgICAgIGJvZHlGdW5jdGlvbihlcnJvckNvZGUsIG51bGwpOwogICAgICAgfSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CiAKLSAgX2F3YWl0T25PYmplY3Qob2JqZWN0LCBib2R5RnVuY3Rpb25PckVycm9yQ29kZSk7CisgIF9hd2FpdE9uT2JqZWN0KG9iamVjdCwgYm9keUZ1bmN0aW9uKTsKIH0KIAogU3RyZWFtIF9zdHJlYW1PZkNvbnRyb2xsZXIoX0FzeW5jU3RhclN0cmVhbUNvbnRyb2xsZXIgY29udHJvbGxlcikgewpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvanNfYXJyYXkuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL2pzX2FycmF5LmRhcnQKaW5kZXggZDEzMTY1OC4uZTNhNmIwMyAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvanNfYXJyYXkuZGFydAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9qc19hcnJheS5kYXJ0CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgIGl0ZXJhYmxlID0gaXRlcmFibGUudG9MaXN0KCk7CiAgICAgfQogICAgIGludCBpbnNlcnRpb25MZW5ndGggPSBpdGVyYWJsZS5sZW5ndGg7Ci0gICAgdGhpcy5sZW5ndGggKz0gaW5zZXJ0aW9uTGVuZ3RoOworICAgIHRoaXMuX3NldExlbmd0aFVuc2FmZSh0aGlzLmxlbmd0aCArIGluc2VydGlvbkxlbmd0aCk7CiAgICAgaW50IGVuZCA9IGluZGV4ICsgaW5zZXJ0aW9uTGVuZ3RoOwogICAgIHRoaXMuc2V0UmFuZ2UoZW5kLCB0aGlzLmxlbmd0aCwgdGhpcywgaW5kZXgpOwogICAgIHRoaXMuc2V0UmFuZ2UoaW5kZXgsIGVuZCwgaXRlcmFibGUpOwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAgICAgICBpbnQgZGVsdGEgPSBpbnNlcnRMZW5ndGggLSByZW1vdmVMZW5ndGg7CiAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGhpcy5sZW5ndGggKyBkZWx0YTsKICAgICAgIGludCBpbnNlcnRFbmQgPSBzdGFydCArIGluc2VydExlbmd0aDsgLy8gYWthLiBlbmQgKyBkZWx0YS4KLSAgICAgIHRoaXMubGVuZ3RoID0gbmV3TGVuZ3RoOworICAgICAgdGhpcy5fc2V0TGVuZ3RoVW5zYWZlKG5ld0xlbmd0aCk7CiAgICAgICB0aGlzLnNldFJhbmdlKGluc2VydEVuZCwgbmV3TGVuZ3RoLCB0aGlzLCBlbmQpOwogICAgICAgdGhpcy5zZXRSYW5nZShzdGFydCwgaW5zZXJ0RW5kLCByZXBsYWNlbWVudCk7CiAgICAgfQpAQCAtNjE2LDYgKzYxNiwyOSBAQAogICAgIGlmIChuZXdMZW5ndGggPCAwKSB7CiAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShuZXdMZW5ndGgsIDAsIG51bGwsICduZXdMZW5ndGgnKTsKICAgICB9CisKKyAgICAvLyBWZXJpZnkgdGhhdCBlbGVtZW50IHR5cGUgaXMgbnVsbGFibGUuCisgICAgaWYgKG5ld0xlbmd0aCA+IGxlbmd0aCkgbnVsbCBhcyBFOworCisgICAgLy8gSmF2YVNjcmlwdCB3aXRoIHRocm93IGEgUmFuZ2VFcnJvciBmb3IgbnVtYmVycyB0aGF0IGFyZSB0b28gYmlnLiBUaGUKKyAgICAvLyBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHZhbHVlLgorICAgIEpTKCd2b2lkJywgcicjLmxlbmd0aCA9ICMnLCB0aGlzLCBuZXdMZW5ndGgpOworICB9CisKKyAgLy8vIFVuc2FmZSBhbHRlcm5hdGl2ZSB0byB0aGUgW2xlbmd0aF0gc2V0dGVyIHRoYXQgc2tpcHMgdGhlIGNoZWNrIGFuZCB3aWxsCisgIC8vLyBub3QgZmFpbCB3aGVuIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgYSBsaXN0IG9mIG5vbi1udWxsYWJsZSBlbGVtZW50cy4KKyAgLy8vCisgIC8vLyBUbyBlbnN1cmUgbnVsbCBzYWZlIHNvdW5kbmVzcyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGV2ZXJ5IG5ldworICAvLy8gaW5kZXggd2lsbCBiZSBmaWxsZWQgYmVmb3JlIHJldHVybmluZy4KKyAgLy8vCisgIC8vLyBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgbGlzdCBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGdyb3dhYmxlLgorICB2b2lkIF9zZXRMZW5ndGhVbnNhZmUoaW50IG5ld0xlbmd0aCkgeworICAgIGFzc2VydChuZXdMZW5ndGggaXMgaW50LAorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShuZXdMZW5ndGgsICduZXdMZW5ndGgnKSk7CisKKyAgICBhc3NlcnQobmV3TGVuZ3RoID49IDAsCisgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKG5ld0xlbmd0aCwgMCwgbnVsbCwgJ25ld0xlbmd0aCcpKTsKKwogICAgIC8vIEphdmFTY3JpcHQgd2l0aCB0aHJvdyBhIFJhbmdlRXJyb3IgZm9yIG51bWJlcnMgdGhhdCBhcmUgdG9vIGJpZy4gVGhlCiAgICAgLy8gbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIHRoZSB2YWx1ZS4KICAgICBKUygndm9pZCcsIHInIy5sZW5ndGggPSAjJywgdGhpcywgbmV3TGVuZ3RoKTsKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL21pcnJvcnNfcGF0Y2hfY2ZlLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9taXJyb3JzX3BhdGNoX2NmZS5kYXJ0CmluZGV4IGNkOTYxYTAuLmM0MjllY2IgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL21pcnJvcnNfcGF0Y2hfY2ZlLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvbWlycm9yc19wYXRjaF9jZmUuZGFydApAQCAtMjAsMTcgKzIwLDExIEBACiBDbGFzc01pcnJvciByZWZsZWN0Q2xhc3MoVHlwZSBrZXkpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKF9tZXNzYWdlKTsKIAogQHBhdGNoCi1UeXBlTWlycm9yIHJlZmxlY3RUeXBlKFR5cGUga2V5LCBbTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzXSkgPT4KK1R5cGVNaXJyb3IgcmVmbGVjdFR5cGUoVHlwZSBrZXksIFtMaXN0PFR5cGU+PyB0eXBlQXJndW1lbnRzXSkgPT4KICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihfbWVzc2FnZSk7CiAKIEBwYXRjaAogYWJzdHJhY3QgY2xhc3MgTWlycm9yU3lzdGVtIHsKLSAgTWFwPFVyaSwgTGlicmFyeU1pcnJvcj4gZ2V0IGxpYnJhcmllczsKLSAgSXNvbGF0ZU1pcnJvciBnZXQgaXNvbGF0ZTsKLSAgVHlwZU1pcnJvciBnZXQgZHluYW1pY1R5cGU7Ci0gIFR5cGVNaXJyb3IgZ2V0IHZvaWRUeXBlOwotICBUeXBlTWlycm9yIGdldCBuZXZlclR5cGU7Ci0KICAgQHBhdGNoCiAgIExpYnJhcnlNaXJyb3IgZmluZExpYnJhcnkoU3ltYm9sIGxpYnJhcnlOYW1lKSA9PgogICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoX21lc3NhZ2UpOwpAQCAtMzksNiArMzMsNiBAQAogICBzdGF0aWMgU3RyaW5nIGdldE5hbWUoU3ltYm9sIHN5bWJvbCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoX21lc3NhZ2UpOwogCiAgIEBwYXRjaAotICBzdGF0aWMgU3ltYm9sIGdldFN5bWJvbChTdHJpbmcgbmFtZSwgW0xpYnJhcnlNaXJyb3IgbGlicmFyeV0pID0+CisgIHN0YXRpYyBTeW1ib2wgZ2V0U3ltYm9sKFN0cmluZyBuYW1lLCBbTGlicmFyeU1pcnJvcj8gbGlicmFyeV0pID0+CiAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihfbWVzc2FnZSk7CiB9CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9uYXRpdmVfdHlwZWRfZGF0YS5kYXJ0IGIvc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvbmF0aXZlX3R5cGVkX2RhdGEuZGFydAppbmRleCAzOWQ1MjdiLi42ZTE5YzUwIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9uYXRpdmVfdHlwZWRfZGF0YS5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL25hdGl2ZV90eXBlZF9kYXRhLmRhcnQKQEAgLTExLDYgKzExLDcgQEAKIGltcG9ydCAnZGFydDpfaW50ZXJjZXB0b3JzJyBzaG93IEpTSW5kZXhhYmxlLCBKU1VJbnQzMiwgSlNVSW50MzE7CiBpbXBvcnQgJ2RhcnQ6X2pzX2hlbHBlcicKICAgICBzaG93CisgICAgICAgIGNoZWNrTnVtLAogICAgICAgICBDcmVhdGVzLAogICAgICAgICBKYXZhU2NyaXB0SW5kZXhpbmdCZWhhdmlvciwKICAgICAgICAgSlNOYW1lLApAQCAtMTM1MSwyMiArMTM1MiwyNiBAQAogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3hdIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgbmV3WCkgewotICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZChfdHJ1bmNhdGUobmV3WCksIHksIHosIHcpOworICAgIGRvdWJsZSBfbmV3WCA9IF90cnVuY2F0ZShjaGVja051bShuZXdYKSk7CisgICAgcmV0dXJuIE5hdGl2ZUZsb2F0MzJ4NC5fdHJ1bmNhdGVkKF9uZXdYLCB5LCB6LCB3KTsKICAgfQogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3ldIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoWShkb3VibGUgbmV3WSkgewotICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZCh4LCBfdHJ1bmNhdGUobmV3WSksIHosIHcpOworICAgIGRvdWJsZSBfbmV3WSA9IF90cnVuY2F0ZShjaGVja051bShuZXdZKSk7CisgICAgcmV0dXJuIE5hdGl2ZUZsb2F0MzJ4NC5fdHJ1bmNhdGVkKHgsIF9uZXdZLCB6LCB3KTsKICAgfQogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3pdIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoWihkb3VibGUgbmV3WikgewotICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZCh4LCB5LCBfdHJ1bmNhdGUobmV3WiksIHcpOworICAgIGRvdWJsZSBfbmV3WiA9IF90cnVuY2F0ZShjaGVja051bShuZXdaKSk7CisgICAgcmV0dXJuIE5hdGl2ZUZsb2F0MzJ4NC5fdHJ1bmNhdGVkKHgsIHksIF9uZXdaLCB3KTsKICAgfQogCiAgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3ddIGxhbmUuCiAgIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgbmV3VykgewotICAgIHJldHVybiBOYXRpdmVGbG9hdDMyeDQuX3RydW5jYXRlZCh4LCB5LCB6LCBfdHJ1bmNhdGUobmV3VykpOworICAgIGRvdWJsZSBfbmV3VyA9IF90cnVuY2F0ZShjaGVja051bShuZXdXKSk7CisgICAgcmV0dXJuIE5hdGl2ZUZsb2F0MzJ4NC5fdHJ1bmNhdGVkKHgsIHksIHosIF9uZXdXKTsKICAgfQogCiAgIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWluaW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KQEAgLTE1NzMsMjUgKzE1NzgsMjUgQEAKIAogICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KICAgSW50MzJ4NCB3aXRoWChpbnQgeCkgewotICAgIGludCBfeCA9IF90cnVuY2F0ZSh4KTsKKyAgICBpbnQgX3ggPSBfdHJ1bmNhdGUoY2hlY2tOdW0oeCkpOwogICAgIHJldHVybiBOYXRpdmVJbnQzMng0Ll90cnVuY2F0ZWQoX3gsIHksIHosIHcpOwogICB9CiAKICAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHkgdmFsdWUuCiAgIEludDMyeDQgd2l0aFkoaW50IHkpIHsKLSAgICBpbnQgX3kgPSBfdHJ1bmNhdGUoeSk7CisgICAgaW50IF95ID0gX3RydW5jYXRlKGNoZWNrTnVtKHkpKTsKICAgICByZXR1cm4gTmF0aXZlSW50MzJ4NC5fdHJ1bmNhdGVkKHgsIF95LCB6LCB3KTsKICAgfQogCiAgIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB6IHZhbHVlLgogICBJbnQzMng0IHdpdGhaKGludCB6KSB7Ci0gICAgaW50IF96ID0gX3RydW5jYXRlKHopOworICAgIGludCBfeiA9IF90cnVuY2F0ZShjaGVja051bSh6KSk7CiAgICAgcmV0dXJuIE5hdGl2ZUludDMyeDQuX3RydW5jYXRlZCh4LCB5LCBfeiwgdyk7CiAgIH0KIAogICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KICAgSW50MzJ4NCB3aXRoVyhpbnQgdykgewotICAgIGludCBfdyA9IF90cnVuY2F0ZSh3KTsKKyAgICBpbnQgX3cgPSBfdHJ1bmNhdGUoY2hlY2tOdW0odykpOwogICAgIHJldHVybiBOYXRpdmVJbnQzMng0Ll90cnVuY2F0ZWQoeCwgeSwgeiwgX3cpOwogICB9CiAKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3ZtL2Jpbi9zdGRpb19wYXRjaC5kYXJ0IGIvc2RrL2xpYi9faW50ZXJuYWwvdm0vYmluL3N0ZGlvX3BhdGNoLmRhcnQKaW5kZXggYmMzMjIyMS4uY2YwMmQ2MiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvdm0vYmluL3N0ZGlvX3BhdGNoLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvdm0vYmluL3N0ZGlvX3BhdGNoLmRhcnQKQEAgLTEyNiwxNSArMTI2LDcgQEAKIEBwYXRjaAogY2xhc3MgU3Rkb3V0IHsKICAgQHBhdGNoCi0gIGJvb2wgX2hhc1Rlcm1pbmFsKGludCBmZCkgewotICAgIHRyeSB7Ci0gICAgICBfdGVybWluYWxTaXplKGZkKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gY2F0Y2ggKF8pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQorICBib29sIF9oYXNUZXJtaW5hbChpbnQgZmQpID0+IF9nZXRUZXJtaW5hbFNpemUoZmQpIGlzIExpc3Q7CiAgIEBwYXRjaAogICBpbnQgX3Rlcm1pbmFsQ29sdW1ucyhpbnQgZmQpID0+IF90ZXJtaW5hbFNpemUoZmQpWzBdOwogICBAcGF0Y2gKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3ZtL2Jpbi92bXNlcnZpY2Vfc2VydmVyLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC92bS9iaW4vdm1zZXJ2aWNlX3NlcnZlci5kYXJ0CmluZGV4IDI2ZjFiZmEuLjk4NTdjZDYgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL3ZtL2Jpbi92bXNlcnZpY2Vfc2VydmVyLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvdm0vYmluL3Ztc2VydmljZV9zZXJ2ZXIuZGFydApAQCAtMzkzLDcgKzM5Myw3IEBACiAgICAgICAndXJpJzogc2VydmVyQWRkcmVzcy50b1N0cmluZygpLAogICAgIH07CiAgICAgZmluYWwgZmlsZSA9IEZpbGUuZnJvbVVyaShVcmkucGFyc2Uoc2VydmljZUluZm9GaWxlbmFtZUxvY2FsKSk7Ci0gICAgcmV0dXJuIGZpbGUud3JpdGVBc1N0cmluZyhqc29uLmVuY29kZShzZXJ2aWNlSW5mbykpOworICAgIHJldHVybiBmaWxlLndyaXRlQXNTdHJpbmcoanNvbi5lbmNvZGUoc2VydmljZUluZm8pKSBhcyBGdXR1cmU8dm9pZD47CiAgIH0KIAogICBGdXR1cmU8U2VydmVyPiBzdGFydHVwKCkgYXN5bmMgewpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9faW50ZXJuYWwvdm0vbGliL2FycmF5LmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC92bS9saWIvYXJyYXkuZGFydAppbmRleCA1MzA0ODQxLi45YWRhNmU5IDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC92bS9saWIvYXJyYXkuZGFydAorKysgYi9zZGsvbGliL19pbnRlcm5hbC92bS9saWIvYXJyYXkuZGFydApAQCAtMTEsNiArMTEsMTggQEAKICAgQHByYWdtYSgidm06cHJlZmVyLWlubGluZSIpCiAgIGZhY3RvcnkgX0xpc3QobGVuZ3RoKSBuYXRpdmUgIkxpc3RfYWxsb2NhdGUiOwogCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIExpc3QuZmlsbGVkIGNvbnN0cnVjdG9yIGZvciBncm93YWJsZSA9PSBmYWxzZS4KKyAgLy8gVXNlZCBieSBwa2cvdm0vbGliL3RyYW5zZm9ybWF0aW9ucy9saXN0X2ZhY3Rvcnlfc3BlY2lhbGl6ZXIuZGFydC4KKyAgZmFjdG9yeSBfTGlzdC5maWxsZWQoaW50IGxlbmd0aCwgRSBmaWxsKSB7CisgICAgZmluYWwgcmVzdWx0ID0gX0xpc3Q8RT4obGVuZ3RoKTsKKyAgICBpZiAoZmlsbCAhPSBudWxsKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworICAgICAgICByZXN1bHRbaV0gPSBmaWxsOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKICAgRSBvcGVyYXRvciBbXShpbnQgaW5kZXgpIG5hdGl2ZSAiTGlzdF9nZXRJbmRleGVkIjsKIAogICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3ZtL2xpYi9ncm93YWJsZV9hcnJheS5kYXJ0IGIvc2RrL2xpYi9faW50ZXJuYWwvdm0vbGliL2dyb3dhYmxlX2FycmF5LmRhcnQKaW5kZXggYmNhOTVhYi4uMWMxNDcwMSAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvdm0vbGliL2dyb3dhYmxlX2FycmF5LmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvdm0vbGliL2dyb3dhYmxlX2FycmF5LmRhcnQKQEAgLTEwNyw2ICsxMDcsMTggQEAKICAgICByZXR1cm4gbmV3IF9Hcm93YWJsZUxpc3Q8VD4uX3dpdGhEYXRhKGRhdGEpOwogICB9CiAKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgTGlzdC5maWxsZWQgY29uc3RydWN0b3IgZm9yIGdyb3dhYmxlID09IHRydWUuCisgIC8vIFVzZWQgYnkgcGtnL3ZtL2xpYi90cmFuc2Zvcm1hdGlvbnMvbGlzdF9mYWN0b3J5X3NwZWNpYWxpemVyLmRhcnQuCisgIGZhY3RvcnkgX0dyb3dhYmxlTGlzdC5maWxsZWQoaW50IGxlbmd0aCwgVCBmaWxsKSB7CisgICAgZmluYWwgcmVzdWx0ID0gX0dyb3dhYmxlTGlzdDxUPihsZW5ndGgpOworICAgIGlmIChmaWxsICE9IG51bGwpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHJlc3VsdFtpXSA9IGZpbGw7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKwogICBAcHJhZ21hKCJ2bTpleGFjdC1yZXN1bHQtdHlwZSIsCiAgICAgICA8ZHluYW1pYz5bX0dyb3dhYmxlTGlzdCwgInJlc3VsdC10eXBlLXVzZXMtcGFzc2VkLXR5cGUtYXJndW1lbnRzIl0pCiAgIGZhY3RvcnkgX0dyb3dhYmxlTGlzdC5fd2l0aERhdGEoX0xpc3QgZGF0YSkgbmF0aXZlICJHcm93YWJsZUxpc3RfYWxsb2NhdGUiOwpAQCAtMTIwLDE1ICsxMzIsMTYgQEAKICAgaW50IGdldCBsZW5ndGggbmF0aXZlICJHcm93YWJsZUxpc3RfZ2V0TGVuZ3RoIjsKIAogICB2b2lkIHNldCBsZW5ndGgoaW50IG5ld19sZW5ndGgpIHsKLSAgICBpbnQgb2xkX2NhcGFjaXR5ID0gX2NhcGFjaXR5OwotICAgIGludCBuZXdfY2FwYWNpdHkgPSBuZXdfbGVuZ3RoOwotICAgIGlmIChuZXdfY2FwYWNpdHkgPiBvbGRfY2FwYWNpdHkpIHsKKyAgICBpZiAobmV3X2xlbmd0aCA+IGxlbmd0aCkgewogICAgICAgLy8gVmVyaWZ5IHRoYXQgZWxlbWVudCB0eXBlIGlzIG51bGxhYmxlLgogICAgICAgbnVsbCBhcyBUOwotICAgICAgX2dyb3cobmV3X2NhcGFjaXR5KTsKKyAgICAgIGlmIChuZXdfbGVuZ3RoID4gX2NhcGFjaXR5KSB7CisgICAgICAgIF9ncm93KG5ld19sZW5ndGgpOworICAgICAgfQogICAgICAgX3NldExlbmd0aChuZXdfbGVuZ3RoKTsKICAgICAgIHJldHVybjsKICAgICB9CisgICAgZmluYWwgaW50IG5ld19jYXBhY2l0eSA9IG5ld19sZW5ndGg7CiAgICAgLy8gV2UgYXJlIHNocmlua2luZy4gUGljayB0aGUgbWV0aG9kIHdoaWNoIGhhcyBmZXdlciB3cml0ZXMuCiAgICAgLy8gSW4gdGhlIHNocmluay10by1maXQgcGF0aCwgd2Ugd3JpdGUgfG5ld19jYXBhY2l0eSArIG5ld19sZW5ndGh8IHdvcmRzCiAgICAgLy8gKG51bGwgaW5pdCArIGNvcHkpLgpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9hc3luYy9hc3luYy5kYXJ0IGIvc2RrL2xpYi9hc3luYy9hc3luYy5kYXJ0CmluZGV4IDhjY2U5NTkuLjVlNzJhMDAgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvYXN5bmMvYXN5bmMuZGFydAorKysgYi9zZGsvbGliL2FzeW5jL2FzeW5jLmRhcnQKQEAgLTk4LDYgKzk4LDcgQEAKICAgICBzaG93CiAgICAgICAgIENhc3RTdHJlYW0sCiAgICAgICAgIENhc3RTdHJlYW1UcmFuc2Zvcm1lciwKKyAgICAgICAgY2hlY2tOb3ROdWxsYWJsZSwKICAgICAgICAgRW1wdHlJdGVyYXRvciwKICAgICAgICAgSXRlcmFibGVFbGVtZW50RXJyb3IsCiAgICAgICAgIHByaW50VG9ab25lLApkaWZmIC0tZ2l0IGEvc2RrL2xpYi9hc3luYy9zdHJlYW0uZGFydCBiL3Nkay9saWIvYXN5bmMvc3RyZWFtLmRhcnQKaW5kZXggNDZlYzE2MS4uZTBhMmNlMiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9hc3luYy9zdHJlYW0uZGFydAorKysgYi9zZGsvbGliL2FzeW5jL3N0cmVhbS5kYXJ0CkBAIC0yNDgsNiArMjQ4LDc3IEBACiAgIH0KIAogICAvKioKKyAgICogQ3JlYXRlcyBhIG11bHRpLXN1YnNjcmlwdGlvbiBzdHJlYW0uCisgICAqCisgICAqIEVhY2ggdGltZSB0aGUgY3JlYXRlZCBzdHJlYW0gaXMgbGlzdGVuZWQgdG8sCisgICAqIHRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCBhIG5ldyBbTXVsdGlTdHJlYW1Db250cm9sbGVyXQorICAgKiB3aGljaCBmb3J3YXJkcyBldmVudHMgdG8gdGhlIFtTdHJlYW1TdWJzY3JpcHRpb25dCisgICAqIHJldHVybmVkIGJ5IHRoYXQgW2xpc3Rlbl0gY2FsbC4KKyAgICoKKyAgICogVGhpcyBhbGxvd3MgZWFjaCBsaXN0ZW5lciB0byBiZSB0cmVhdGVkIGFzIGFuIGluZGl2aWR1YWwgc3RyZWFtLgorICAgKgorICAgKiBUaGUgW011bHRpU3RyZWFtQ29udHJvbGxlcl0gZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGl0cworICAgKiBbU3RyZWFtQ29udHJvbGxlci5zdHJlYW1dLiBTZXR0aW5nIGl0cyBbU3RyZWFtQ29udHJvbGxlci5vbkxpc3Rlbl0KKyAgICogaGFzIG5vIGVmZmVjdCBzaW5jZSB0aGUgW29uTGlzdGVuXSBjYWxsYmFjayBpcyBjYWxsZWQgaW5zdGVhZCwKKyAgICogYW5kIHRoZSBbU3RyZWFtQ29udHJvbGxlci5vbkxpc3Rlbl0gd29uJ3QgYmUgY2FsbGVkIGxhdGVyLgorICAgKiBUaGUgY29udHJvbGxlciBhY3RzIGxpa2UgYW4gYXN5bmNocm9ub3VzIGNvbnRyb2xsZXIsCisgICAqIGJ1dCBwcm92aWRlcyBleHRyYSBtZXRob2RzIGZvciBkZWxpdmVyaW5nIGV2ZW50cyBzeW5jaHJvbm91c2x5LgorICAgKgorICAgKiBJZiBbaXNCcm9hZGNhc3RdIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSByZXR1cm5lZCBzdHJlYW0ncworICAgKiBbU3RyZWFtLmlzQnJvYWRjYXN0XSB3aWxsIGJlIGB0cnVlYC4KKyAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBzdHJlYW0gYmVoYXZpb3IsCisgICAqIGl0IGlzIHVwIHRvIHRoZSBbb25MaXN0ZW5dIGZ1bmN0aW9uCisgICAqIHRvIGFjdCBsaWtlIGEgYnJvYWRjYXN0IHN0cmVhbSBpZiBpdCBjbGFpbXMgdG8gYmUgb25lLgorICAgKgorICAgKiBBIG11bHRpLXN1YnNjcmlwdGlvbiBzdHJlYW0gY2FuIGJlaGF2ZSBsaWtlIGFueSBvdGhlciBzdHJlYW0uCisgICAqIElmIHRoZSBbb25MaXN0ZW5dIGNhbGxiYWNrIHRocm93cyBvbiBldmVyeSBjYWxsIGFmdGVyIHRoZSBmaXJzdCwKKyAgICogdGhlIHN0cmVhbSBiZWhhdmVzIGxpa2UgYSBzaW5nbGUtc3Vic2NyaXB0aW9uIHN0cmVhbS4KKyAgICogSWYgdGhlIHN0cmVhbSBlbWl0cyB0aGUgc2FtZSBldmVudHMgdG8gYWxsIGN1cnJlbnQgbGlzdGVuZXJzLAorICAgKiBpdCBiZWhhdmVzIGxpa2UgYSBicm9hZGNhc3Qgc3RyZWFtLgorICAgKgorICAgKiBJdCBjYW4gYWxzbyBjaG9vc2UgdG8gZW1pdCBkaWZmZXJlbnQgZXZlbnRzIHRvIGRpZmZlcmVudCBsaXN0ZW5lcnMuCisgICAqIEZvciBleGFtcGxlLCBhIHN0cmVhbSB3aGljaCByZXBlYXRzIHRoZSBtb3N0IHJlY2VudAorICAgKiBub24tYG51bGxgIGV2ZW50IHRvIG5ldyBsaXN0ZW5lcnMsIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIHRoaXMgZXhhbXBsZToKKyAgICogYGBgZGFydAorICAgKiBleHRlbnNpb24gU3RyZWFtUmVwZWF0TGF0ZXN0RXh0ZW5zaW9uPFQgZXh0ZW5kcyBPYmplY3Q+IG9uIFN0cmVhbTxUPiB7CisgICAqICAgU3RyZWFtPFQ+IHJlcGVhdExhdGVzdCgpIHsKKyAgICogICAgIHZhciBkb25lID0gZmFsc2U7CisgICAqICAgICBUPyBsYXRlc3QgPSBudWxsOworICAgKiAgICAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSA8TXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+Pnt9OworICAgKiAgICAgdGhpcy5saXN0ZW4oKGV2ZW50KSB7CisgICAqICAgICAgIGxhdGVzdCA9IGV2ZW50OworICAgKiAgICAgICBmb3IgKHZhciBsaXN0ZW5lciBpbiBbLi4uY3VycmVudExpc3RlbmVyc10pIGxpc3RlbmVyLmFkZFN5bmMoZXZlbnQpOworICAgKiAgICAgfSwgb25FcnJvcjogKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFjaykgeworICAgKiAgICAgICBmb3IgKHZhciBsaXN0ZW5lciBpbiBbLi4uY3VycmVudExpc3RlbmVyc10pIGxpc3RlbmVyLmFkZEVycm9yU3luYyhlcnJvciwgc3RhY2spOworICAgKiAgICAgfSwgb25Eb25lOiAoKSB7CisgICAqICAgICAgIGRvbmUgPSB0cnVlOworICAgKiAgICAgICBsYXRlc3QgPSBudWxsOworICAgKiAgICAgICBmb3IgKHZhciBsaXN0ZW5lciBpbiBjdXJyZW50TGlzdGVuZXJzKSBsaXN0ZW5lci5jbG9zZVN5bmMoKTsKKyAgICogICAgICAgY3VycmVudExpc3RlbmVycy5jbGVhcigpOworICAgKiAgICAgfSk7CisgICAqICAgICByZXR1cm4gU3RyZWFtLm11bHRpKChjb250cm9sbGVyKSB7CisgICAqICAgICAgIGlmIChkb25lKSB7CisgICAqICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpOworICAgKiAgICAgICAgIHJldHVybjsKKyAgICogICAgICAgfQorICAgKiAgICAgICBjdXJyZW50TGlzdGVuZXJzLmFkZChjb250cm9sbGVyKTsKKyAgICogICAgICAgdmFyIGxhdGVzdFZhbHVlID0gbGF0ZXN0OworICAgKiAgICAgICBpZiAobGF0ZXN0VmFsdWUgIT0gbnVsbCkgY29udHJvbGxlci5hZGQobGF0ZXN0VmFsdWUpOworICAgKiAgICAgICBjb250cm9sbGVyLm9uQ2FuY2VsID0gKCkgeworICAgKiAgICAgICAgIGN1cnJlbnRMaXN0ZW5lcnMucmVtb3ZlKGNvbnRyb2xsZXIpOworICAgKiAgICAgICB9OworICAgKiAgICAgfSk7CisgICAqICAgfQorICAgKiB9CisgICAqIGBgYAorICAgKi8KKyAgQFNpbmNlKCIyLjkiKQorICBmYWN0b3J5IFN0cmVhbS5tdWx0aSh2b2lkIEZ1bmN0aW9uKE11bHRpU3RyZWFtQ29udHJvbGxlcjxUPikgb25MaXN0ZW4sCisgICAgICB7Ym9vbCBpc0Jyb2FkY2FzdCA9IGZhbHNlfSkgeworICAgIHJldHVybiBfTXVsdGlTdHJlYW08VD4ob25MaXN0ZW4sIGlzQnJvYWRjYXN0KTsKKyAgfQorCisgIC8qKgogICAgKiBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgcmVwZWF0ZWRseSBlbWl0cyBldmVudHMgYXQgW3BlcmlvZF0gaW50ZXJ2YWxzLgogICAgKgogICAgKiBUaGUgZXZlbnQgdmFsdWVzIGFyZSBjb21wdXRlZCBieSBpbnZva2luZyBbY29tcHV0YXRpb25dLiBUaGUgYXJndW1lbnQgdG8KQEAgLTIyMzAsMyArMjMwMSw0OSBAQAogICAgIF9lbnN1cmVTaW5rKCkuY2xvc2UoKTsKICAgfQogfQorCisvKioKKyAqIEFuIGVuaGFuY2VkIHN0cmVhbSBjb250cm9sbGVyIHByb3ZpZGVkIGJ5IFtTdHJlYW0ubXVsdGldLgorICoKKyAqIEFjdHMgbGlrZSBhIG5vcm1hbCBhc3luY2hyb25vdXMgY29udHJvbGxlciwgYnV0IGFsc28gYWxsb3dzCisgKiBhZGRpbmcgZXZlbnRzIHN5bmNocm9ub3VzbHkuCisgKiBBcyB3aXRoIGFueSBzeW5jaHJvbm91cyBldmVudCBkZWxpdmVyeSwgdGhlIHNlbmRlciBzaG91bGQgYmUgdmVyeSBjYXJlZnVsCisgKiB0byBub3QgZGVsaXZlciBldmVudHMgYXQgdGltZXMgd2hlbiBhIG5ldyBsaXN0ZW5lciBtaWdodCBub3QKKyAqIGJlIHJlYWR5IHRvIHJlY2VpdmUgdGhlbS4KKyAqIFRoYXQgZ2VuZXJhbGx5IG1lYW5zIG9ubHkgZGVsaXZlcmluZyBldmVudHMgc3luY2hyb25vdXNseSBpbiByZXNwb25zZSB0byBvdGhlcgorICogYXN5bmNocm9ub3VzIGV2ZW50cywgYmVjYXVzZSB0aGF0IGlzIGEgdGltZSB3aGVuIGFuIGFzeW5jaHJvbm91cyBldmVudCBjb3VsZAorICogaGFwcGVuLgorICovCitAU2luY2UoIjIuOSIpCithYnN0cmFjdCBjbGFzcyBNdWx0aVN0cmVhbUNvbnRyb2xsZXI8VD4gaW1wbGVtZW50cyBTdHJlYW1Db250cm9sbGVyPFQ+IHsKKyAgLyoqCisgICAqIEFkZHMgYW5kIGRlbGl2ZXJzIGFuIGV2ZW50LgorICAgKgorICAgKiBBZGRzIGFuIGV2ZW50IGxpa2UgW2FkZF0gYW5kIGF0dGVtcHRzIHRvIGRlbGl2ZXIgaXQgaW1tZWRpYXRlbHkuCisgICAqIERlbGl2ZXJ5IGNhbiBiZSBkZWxheWVkIGlmIG90aGVyIHByZXZpb3VzbHkgYWRkZWQgZXZlbnRzIGFyZQorICAgKiBzdGlsbCBwZW5kaW5nIGRlbGl2ZXJ5LCBpZiB0aGUgc3Vic2NyaXB0aW9uIGlzIHBhdXNlZCwKKyAgICogb3IgaWYgdGhlIHN1YnNjcmlwdGlvbiBpc24ndCBsaXN0ZW5pbmcgeWV0LgorICAgKi8KKyAgdm9pZCBhZGRTeW5jKFQgdmFsdWUpOworCisgIC8qKgorICAgKiBBZGRzIGFuZCBkZWxpdmVycyBhbiBlcnJvciBldmVudC4KKyAgICoKKyAgICogQWRkcyBhbiBlcnJvciBsaWtlIFthZGRFcnJvcl0gYW5kIGF0dGVtcHRzIHRvIGRlbGl2ZXIgaXQgaW1tZWRpYXRlbHkuCisgICAqIERlbGl2ZXJ5IGNhbiBiZSBkZWxheWVkIGlmIG90aGVyIHByZXZpb3VzbHkgYWRkZWQgZXZlbnRzIGFyZQorICAgKiBzdGlsbCBwZW5kaW5nIGRlbGl2ZXJ5LCBpZiB0aGUgc3Vic2NyaXB0aW9uIGlzIHBhdXNlZCwKKyAgICogb3IgaWYgdGhlIHN1YnNjcmlwdGlvbiBpc24ndCBsaXN0ZW5pbmcgeWV0LgorICAgKi8KKyAgdm9pZCBhZGRFcnJvclN5bmMoT2JqZWN0IGVycm9yLCBbU3RhY2tUcmFjZT8gc3RhY2tUcmFjZV0pOworCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIGNvbnRyb2xsZXIgYW5kIGRlbGl2ZXJzIGEgZG9uZSBldmVudC4KKyAgICoKKyAgICogQ2xvc2VzIHRoZSBjb250cm9sbGVyIGxpa2UgW2Nsb3NlXSBhbmQgYXR0ZW1wdHMgdG8gZGVsaXZlciBhICJkb25lIgorICAgKiBldmVudCBpbW1lZGlhdGVseS4KKyAgICogRGVsaXZlcnkgY2FuIGJlIGRlbGF5ZWQgaWYgb3RoZXIgcHJldmlvdXNseSBhZGRlZCBldmVudHMgYXJlCisgICAqIHN0aWxsIHBlbmRpbmcgZGVsaXZlcnksIGlmIHRoZSBzdWJzY3JpcHRpb24gaXMgcGF1c2VkLAorICAgKiBvciBpZiB0aGUgc3Vic2NyaXB0aW9uIGlzbid0IGxpc3RlbmluZyB5ZXQuCisgICAqLworICB2b2lkIGNsb3NlU3luYygpOworfQpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9hc3luYy9zdHJlYW1fY29udHJvbGxlci5kYXJ0IGIvc2RrL2xpYi9hc3luYy9zdHJlYW1fY29udHJvbGxlci5kYXJ0CmluZGV4IDk2ODhkZDEuLjBkYzNjOTcgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvYXN5bmMvc3RyZWFtX2NvbnRyb2xsZXIuZGFydAorKysgYi9zZGsvbGliL2FzeW5jL3N0cmVhbV9jb250cm9sbGVyLmRhcnQKQEAgLTYyOCw3ICs2MjgsNyBAQAogICAgKiBTZW5kIG9yIGVucXVldWUgYW4gZXJyb3IgZXZlbnQuCiAgICAqLwogICB2b2lkIGFkZEVycm9yKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2U/IHN0YWNrVHJhY2VdKSB7Ci0gICAgLy8gVE9ETyg0MDYxNCk6IFJlbW92ZSBvbmNlIG5vbi1udWxsYWJpbGl0eSBpcyBzb3VuZC4KKyAgICAvLyBUT0RPKDQwNjE0KTogUmVtb3ZlIG9uY2Ugbm9uLW51bGxhYmlsaXR5IGlzIHNvdW5kLiBVc2UgY2hlY2tOb3ROdWxsYWJsZS4KICAgICBBcmd1bWVudEVycm9yLmNoZWNrTm90TnVsbChlcnJvciwgImVycm9yIik7CiAgICAgaWYgKCFfbWF5QWRkRXZlbnQpIHRocm93IF9iYWRFdmVudFN0YXRlKCk7CiAgICAgQXN5bmNFcnJvcj8gcmVwbGFjZW1lbnQgPSBab25lLmN1cnJlbnQuZXJyb3JDYWxsYmFjayhlcnJvciwgc3RhY2tUcmFjZSk7CkBAIC04MDQsOSArODA0LDYgQEAKIAogYWJzdHJhY3QgY2xhc3MgX1N5bmNTdHJlYW1Db250cm9sbGVyRGlzcGF0Y2g8VD4KICAgICBpbXBsZW1lbnRzIF9TdHJlYW1Db250cm9sbGVyPFQ+LCBTeW5jaHJvbm91c1N0cmVhbUNvbnRyb2xsZXI8VD4gewotICBpbnQgZ2V0IF9zdGF0ZTsKLSAgdm9pZCBzZXQgX3N0YXRlKGludCBzdGF0ZSk7Ci0KICAgdm9pZCBfc2VuZERhdGEoVCBkYXRhKSB7CiAgICAgX3N1YnNjcmlwdGlvbi5fYWRkKGRhdGEpOwogICB9CmRpZmYgLS1naXQgYS9zZGsvbGliL2FzeW5jL3N0cmVhbV9pbXBsLmRhcnQgYi9zZGsvbGliL2FzeW5jL3N0cmVhbV9pbXBsLmRhcnQKaW5kZXggMWM2ZmE1MC4uOTQyZjRhNyAxMDA2NDQKLS0tIGEvc2RrL2xpYi9hc3luYy9zdHJlYW1faW1wbC5kYXJ0CisrKyBiL3Nkay9saWIvYXN5bmMvc3RyZWFtX2ltcGwuZGFydApAQCAtMTA5NywzICsxMDk3LDQzIEBACiAgICAgcmV0dXJuIG5ldyBfRG9uZVN0cmVhbVN1YnNjcmlwdGlvbjxUPihvbkRvbmUpOwogICB9CiB9CisKKy8qKiBBIHN0cmVhbSB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbnRyb2xsZXIgZm9yIGVhY2ggbGlzdGVuZXIuICovCitjbGFzcyBfTXVsdGlTdHJlYW08VD4gZXh0ZW5kcyBTdHJlYW08VD4geworICBmaW5hbCBib29sIGlzQnJvYWRjYXN0OworICAvKiogVGhlIGNhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBsaXN0ZW4uICovCisgIGZpbmFsIHZvaWQgRnVuY3Rpb24oTXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+KSBfb25MaXN0ZW47CisKKyAgX011bHRpU3RyZWFtKHRoaXMuX29uTGlzdGVuLCB0aGlzLmlzQnJvYWRjYXN0KTsKKworICBTdHJlYW1TdWJzY3JpcHRpb248VD4gbGlzdGVuKHZvaWQgb25EYXRhKFQgZXZlbnQpPywKKyAgICAgIHtGdW5jdGlvbj8gb25FcnJvciwgdm9pZCBvbkRvbmUoKT8sIGJvb2w/IGNhbmNlbE9uRXJyb3J9KSB7CisgICAgdmFyIGNvbnRyb2xsZXIgPSBfTXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+KCk7CisgICAgY29udHJvbGxlci5vbkxpc3RlbiA9ICgpIHsKKyAgICAgIF9vbkxpc3Rlbihjb250cm9sbGVyKTsKKyAgICB9OworICAgIHJldHVybiBjb250cm9sbGVyLl9zdWJzY3JpYmUoCisgICAgICAgIG9uRGF0YSwgb25FcnJvciwgb25Eb25lLCBjYW5jZWxPbkVycm9yID8/IGZhbHNlKTsKKyAgfQorfQorCitjbGFzcyBfTXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+IGV4dGVuZHMgX0FzeW5jU3RyZWFtQ29udHJvbGxlcjxUPgorICAgIGltcGxlbWVudHMgTXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+IHsKKyAgX011bHRpU3RyZWFtQ29udHJvbGxlcigpIDogc3VwZXIobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisKKyAgdm9pZCBhZGRTeW5jKFQgZGF0YSkgeworICAgIF9zdWJzY3JpcHRpb24uX2FkZChkYXRhKTsKKyAgfQorCisgIHZvaWQgYWRkRXJyb3JTeW5jKE9iamVjdCBlcnJvciwgW1N0YWNrVHJhY2U/IHN0YWNrVHJhY2VdKSB7CisgICAgX3N1YnNjcmlwdGlvbi5fYWRkRXJyb3IoZXJyb3IsIHN0YWNrVHJhY2UgPz8gU3RhY2tUcmFjZS5lbXB0eSk7CisgIH0KKworICB2b2lkIGNsb3NlU3luYygpIHsKKyAgICBfc3Vic2NyaXB0aW9uLl9jbG9zZSgpOworICB9CisKKyAgU3RyZWFtPFQ+IGdldCBzdHJlYW0geworICAgIHRocm93IFVuc3VwcG9ydGVkRXJyb3IoIk5vdCBhdmFpbGFibGUiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9jb3JlL2R1cmF0aW9uLmRhcnQgYi9zZGsvbGliL2NvcmUvZHVyYXRpb24uZGFydAppbmRleCAyYTFmNDA2Li5jNGM2ODQ2IDEwMDY0NAotLS0gYS9zZGsvbGliL2NvcmUvZHVyYXRpb24uZGFydAorKysgYi9zZGsvbGliL2NvcmUvZHVyYXRpb24uZGFydApAQCAtMjM1LDEwICsyMzUsMTMgQEAKICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBEdXJhdGlvbmAuCiAgICAqCiAgICAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG1pY3Jvc2Vjb25kcywgaW4gdGhlCi0gICAqIGZvbGxvd2luZyBmb3JtYXQ6IGBISDpNTTpTUy5tbW1tbW1gLiBGb3IgZXhhbXBsZSwKKyAgICogZm9sbG93aW5nIGZvcm1hdDogYEg6TU06U1MubW1tbW1tYC4gRm9yIGV4YW1wbGUsCiAgICAqCi0gICAqICAgICB2YXIgZCA9IG5ldyBEdXJhdGlvbihkYXlzOjEsIGhvdXJzOjEsIG1pbnV0ZXM6MzMsIG1pY3Jvc2Vjb25kczogNTAwKTsKKyAgICogICAgIHZhciBkID0gRHVyYXRpb24oZGF5czogMSwgaG91cnM6IDEsIG1pbnV0ZXM6IDMzLCBtaWNyb3NlY29uZHM6IDUwMCk7CiAgICAqICAgICBkLnRvU3RyaW5nKCk7ICAvLyAiMjU6MzM6MDAuMDAwNTAwIgorICAgKgorICAgKiAgICAgZCA9IER1cmF0aW9uKGRheXM6IDAsIGhvdXJzOiAxLCBtaW51dGVzOiAxMCwgbWljcm9zZWNvbmRzOiA1MDApOworICAgKiAgICAgZC50b1N0cmluZygpOyAgLy8gIjE6MTA6MDAuMDAwNTAwIgogICAgKi8KICAgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgIFN0cmluZyBzaXhEaWdpdHMoaW50IG4pIHsKZGlmZiAtLWdpdCBhL3Nkay9saWIvaHRtbC9kYXJ0MmpzL2h0bWxfZGFydDJqcy5kYXJ0IGIvc2RrL2xpYi9odG1sL2RhcnQyanMvaHRtbF9kYXJ0MmpzLmRhcnQKaW5kZXggMDRkY2MzZC4uYTNiY2MwMiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9odG1sL2RhcnQyanMvaHRtbF9kYXJ0MmpzLmRhcnQKKysrIGIvc2RrL2xpYi9odG1sL2RhcnQyanMvaHRtbF9kYXJ0MmpzLmRhcnQKQEAgLTM5ODQ2LDcyICszOTg0Niw5NiBAQAogICBNZW1vcnlJbmZvPyBnZXQgbWVtb3J5ID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCdNZW1vcnlJbmZvJywgJ3dpbmRvdy5jb25zb2xlLm1lbW9yeScpIDogbnVsbDsKIAotICB2b2lkIGFzc2VydENvbmRpdGlvbihib29sIGNvbmRpdGlvbiwgT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQKLSAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuYXNzZXJ0Q29uZGl0aW9uKCMsICMpJywgY29uZGl0aW9uLCBhcmcpCisgIC8vIEV2ZW4gdGhvdWdoIG1hbnkgb2YgdGhlIGZvbGxvd2luZyBKUyBtZXRob2RzIGNhbiB0YWtlIGluIG11bHRpcGxlCisgIC8vIGFyZ3VtZW50cywgd2UgaGlzdG9yaWNhbGx5IGFuZCBjdXJyZW50bHkgbGltaXQgdGhlIG51bWJlciBvZiB2YXJpYWJsZQorICAvLyBhcmd1bWVudHMgdG8gMS4gRGVwZW5kaW5nIG9uIHRoZSBuZWVkLCB0aGVzZSBtZXRob2RzIG1heSBiZSB1cGRhdGVkIHRvCisgIC8vIGFsbG93IGZvciBtb3JlLgorCisgIC8vIFdlIHJlbmFtZSBhc3NlcnQgdG8gYXNzZXJ0Q29uZGl0aW9uIGhlcmUuCisgIHZvaWQgYXNzZXJ0Q29uZGl0aW9uKFtib29sPyBjb25kaXRpb24sIE9iamVjdD8gYXJnXSkgPT4gX2lzQ29uc29sZURlZmluZWQKKyAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuYXNzZXJ0KCMsICMpJywgY29uZGl0aW9uLCBhcmcpCiAgICAgICA6IG51bGw7CiAKLSAgdm9pZCBjbGVhcihPYmplY3QgYXJnKSA9PgorICAvLyBjbGVhciBubyBsb25nZXIgdGFrZXMgaW4gYW4gYXJndW1lbnQsIGJ1dCB3ZSBrZWVwIHRoaXMgYXMgb3B0aW9uYWwgdG8KKyAgLy8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIHZvaWQgY2xlYXIoW09iamVjdD8gYXJnXSkgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuY2xlYXIoIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIGNvdW50KE9iamVjdCBhcmcpID0+CisgIC8vIGNvdW50IHRha2VzIGluIGEgU3RyaW5nIGluc3RlYWQsIGJ1dCB3ZSBrZWVwIHRoaXMgYXMgYW4gT2JqZWN0IGZvcgorICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgdm9pZCBjb3VudChbT2JqZWN0PyBhcmddKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5jb3VudCgjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgZGVidWcoT2JqZWN0IGFyZykgPT4KKyAgdm9pZCBjb3VudFJlc2V0KFtTdHJpbmc/IGFyZ10pID0+IF9pc0NvbnNvbGVEZWZpbmVkCisgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmNvdW50UmVzZXQoIyknLCBhcmcpCisgICAgICA6IG51bGw7CisKKyAgdm9pZCBkZWJ1ZyhPYmplY3Q/IGFyZykgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuZGVidWcoIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIGRpcihPYmplY3QgYXJnKSA9PgotICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5kaXIoIyknLCBhcmcpIDogbnVsbDsKKyAgdm9pZCBkaXIoW09iamVjdD8gaXRlbSwgT2JqZWN0PyBvcHRpb25zXSkgPT4gX2lzQ29uc29sZURlZmluZWQKKyAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuZGlyKCMsICMpJywgaXRlbSwgb3B0aW9ucykKKyAgICAgIDogbnVsbDsKIAotICB2b2lkIGRpcnhtbChPYmplY3QgYXJnKSA9PgorICB2b2lkIGRpcnhtbChPYmplY3Q/IGFyZykgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuZGlyeG1sKCMpJywgYXJnKSA6IG51bGw7CiAKLSAgdm9pZCBlcnJvcihPYmplY3QgYXJnKSA9PgorICB2b2lkIGVycm9yKE9iamVjdD8gYXJnKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5lcnJvcigjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgZ3JvdXAoT2JqZWN0IGFyZykgPT4KKyAgdm9pZCBncm91cChPYmplY3Q/IGFyZykgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuZ3JvdXAoIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIGdyb3VwQ29sbGFwc2VkKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkCisgIHZvaWQgZ3JvdXBDb2xsYXBzZWQoT2JqZWN0PyBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkCiAgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmdyb3VwQ29sbGFwc2VkKCMpJywgYXJnKQogICAgICAgOiBudWxsOwogCiAgIHZvaWQgZ3JvdXBFbmQoKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpJykgOiBudWxsOwogCi0gIHZvaWQgaW5mbyhPYmplY3QgYXJnKSA9PgorICB2b2lkIGluZm8oT2JqZWN0PyBhcmcpID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmluZm8oIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIGxvZyhPYmplY3QgYXJnKSA9PgorICB2b2lkIGxvZyhPYmplY3Q/IGFyZykgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUubG9nKCMpJywgYXJnKSA6IG51bGw7CiAKLSAgdm9pZCBtYXJrVGltZWxpbmUoT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQKLSAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUubWFya1RpbWVsaW5lKCMpJywgYXJnKQorICB2b2lkIHRhYmxlKFtPYmplY3Q/IHRhYnVsYXJEYXRhLCBMaXN0PFN0cmluZz4/IHByb3BlcnRpZXNdKSA9PgorICAgICAgX2lzQ29uc29sZURlZmluZWQKKyAgICAgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRhYmxlKCMsICMpJywgdGFidWxhckRhdGEsIHByb3BlcnRpZXMpCisgICAgICAgICAgOiBudWxsOworCisgIHZvaWQgdGltZShbU3RyaW5nPyBsYWJlbF0pID0+CisgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWUoIyknLCBsYWJlbCkgOiBudWxsOworCisgIHZvaWQgdGltZUVuZChbU3RyaW5nPyBsYWJlbF0pID0+CisgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWVFbmQoIyknLCBsYWJlbCkgOiBudWxsOworCisgIHZvaWQgdGltZUxvZyhbU3RyaW5nPyBsYWJlbCwgT2JqZWN0PyBhcmddKSA9PiBfaXNDb25zb2xlRGVmaW5lZAorICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS50aW1lTG9nKCMsICMpJywgbGFiZWwsIGFyZykKICAgICAgIDogbnVsbDsKIAotICB2b2lkIHByb2ZpbGUoU3RyaW5nIHRpdGxlKSA9PgorICB2b2lkIHRyYWNlKE9iamVjdD8gYXJnKSA9PgorICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS50cmFjZSgjKScsIGFyZykgOiBudWxsOworCisgIHZvaWQgd2FybihPYmplY3Q/IGFyZykgPT4KKyAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUud2FybigjKScsIGFyZykgOiBudWxsOworCisgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIG5vbi1zdGFuZGFyZCBtZXRob2RzLgorICB2b2lkIHByb2ZpbGUoW1N0cmluZz8gdGl0bGVdKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5wcm9maWxlKCMpJywgdGl0bGUpIDogbnVsbDsKIAotICB2b2lkIHByb2ZpbGVFbmQoU3RyaW5nIHRpdGxlKSA9PiBfaXNDb25zb2xlRGVmaW5lZAorICB2b2lkIHByb2ZpbGVFbmQoW1N0cmluZz8gdGl0bGVdKSA9PiBfaXNDb25zb2xlRGVmaW5lZAogICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5wcm9maWxlRW5kKCMpJywgdGl0bGUpCiAgICAgICA6IG51bGw7CiAKLSAgdm9pZCB0YWJsZShPYmplY3QgYXJnKSA9PgotICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS50YWJsZSgjKScsIGFyZykgOiBudWxsOwotCi0gIHZvaWQgdGltZShTdHJpbmcgdGl0bGUpID0+Ci0gICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWUoIyknLCB0aXRsZSkgOiBudWxsOwotCi0gIHZvaWQgdGltZUVuZChTdHJpbmcgdGl0bGUpID0+Ci0gICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWVFbmQoIyknLCB0aXRsZSkgOiBudWxsOwotCi0gIHZvaWQgdGltZVN0YW1wKE9iamVjdCBhcmcpID0+CisgIHZvaWQgdGltZVN0YW1wKFtPYmplY3Q/IGFyZ10pID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWVTdGFtcCgjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgdHJhY2UoT2JqZWN0IGFyZykgPT4KLSAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudHJhY2UoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIHdhcm4oT2JqZWN0IGFyZykgPT4KLSAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUud2FybigjKScsIGFyZykgOiBudWxsOworICAvLyBUaGUgZm9sbG93aW5nIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkIG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvcgorICAvLyBvbGRlciBTYWZhcmkgYnJvd3NlcnMuCisgIHZvaWQgbWFya1RpbWVsaW5lKE9iamVjdD8gYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZAorICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5tYXJrVGltZWxpbmUoIyknLCBhcmcpCisgICAgICA6IG51bGw7CiB9CiAvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKZGlmZiAtLWdpdCBhL3Nka19hcmdzLmduaSBiL3Nka19hcmdzLmduaQppbmRleCA5NGU2YjdhOC4uMDZkYzNlOCAxMDA2NDQKLS0tIGEvc2RrX2FyZ3MuZ25pCisrKyBiL3Nka19hcmdzLmduaQpAQCAtMTksNCArMTksMjIgQEAKICAgIyB0byBvdXQvUmVsZWFzZVg2NC9hcmdzLmduLiBUaGUgcGF0aCBhYm92ZSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhlIGAuZ2l0YAogICAjIGZpbGUgdW5kZXIgdGhlIGdpdCB3b3JrdHJlZSBmb2xkZXIuCiAgIGRlZmF1bHRfZ2l0X2ZvbGRlciA9ICIkX2RhcnRfcm9vdC8uZ2l0IgorCisgICMgV2hldGhlciB0byBlbmFibGUgdGhlIFNESyBoYXNoIGNoZWNrIHRoYXQgd2lsbCBwcmV2ZW50IGxvYWRpbmcgYSBrZXJuZWwKKyAgIyBpbnRvIGEgVk0gd2hpY2ggd2FzIGJ1aWx0IHdpdGggYSBkaWZmZXJlbnQgU0RLLgorICB2ZXJpZnlfc2RrX2hhc2ggPSB0cnVlCit9CisKKyMgVGhlIFNESyBoYXNoIHRvIGJ1aWxkIGludG8gVk0gYW5kIGtlcm5lbHMuCisjIFRoZSB2YWx1ZSAwMDAwMDAwMDAwIHNpZ25pZmllcyBubyBoYXNoIGlzIHNldCwgd2hpY2ggd2lsbCBkaXNhYmxlIHRoZSBjaGVjay4KK2lmICh2ZXJpZnlfc2RrX2hhc2gpIHsKKyAgc2RrX2hhc2ggPSBleGVjX3NjcmlwdCgiJF9kYXJ0X3Jvb3QvdG9vbHMvbWFrZV92ZXJzaW9uLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbICItLWZvcm1hdD17e0dJVF9IQVNIfX0iIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgInRyaW0gc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJF9kYXJ0X3Jvb3QvdG9vbHMvVkVSU0lPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJF9kYXJ0X3Jvb3QvdG9vbHMvdXRpbHMucHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF0pCit9IGVsc2UgeworICBzZGtfaGFzaCA9ICIwMDAwMDAwMDAwIgogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY28xOS9jbzE5LWNvMTkuc3RhdHVzIGIvdGVzdHMvY28xOS9jbzE5LWNvMTkuc3RhdHVzCmluZGV4IDVmMDY1OTAuLjIxNzY0NzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NvMTkvY28xOS1jbzE5LnN0YXR1cworKysgYi90ZXN0cy9jbzE5L2NvMTktY28xOS5zdGF0dXMKQEAgLTIwLDIyICsyMCw5IEBACiBMYW5ndWFnZS9HZW5lcmljcy9wYXJhbWV0ZXJfQTAxX3QwMzogU2tpcCAjIFR5cGUgYWxpYXNlcyBhcmUgbm90IGZ1bGx5IGltcGxlbWVudGVkCiBMYW5ndWFnZS9HZW5lcmljcy9zeW50YXhfdDMxOiBTa2lwICMgVHlwZSBhbGlhc2VzIGFyZSBub3QgZnVsbHkgaW1wbGVtZW50ZWQKIExhbmd1YWdlL0dlbmVyaWNzL3R5cGVkZWZfQTAxX3QxMDogU2tpcCAjIFR5cGUgYWxpYXNlcyBhcmUgbm90IGZ1bGx5IGltcGxlbWVudGVkCi1MYW5ndWFnZS9MaWJyYXJpZXNfYW5kX1NjcmlwdHMvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECi1MYW5ndWFnZS9MaWJyYXJpZXNfYW5kX1NjcmlwdHMvRXhwb3J0cy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL0xpYnJhcmllc19hbmRfU2NyaXB0cy9QYXJ0cy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL0xpYnJhcmllc19hbmRfU2NyaXB0cy9TY3JpcHRzLyo6IFNraXAgIyBOb3QgbWlncmF0ZWQgdG8gTk5CRAotTGFuZ3VhZ2UvTGlicmFyaWVzX2FuZF9TY3JpcHRzL1VSSXMvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECi1MYW5ndWFnZS9NZXRhZGF0YS8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL01peGlucy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL01peGlucy9NaXhpbl9BcHBsaWNhdGlvbi8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL01peGlucy9NaXhpbl9Db21wb3NpdGlvbi8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL092ZXJ2aWV3Lyo6IFNraXAgIyBOb3QgbWlncmF0ZWQgdG8gTk5CRAotTGFuZ3VhZ2UvT3ZlcnZpZXcvUHJpdmFjeS8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL092ZXJ2aWV3L1Njb3BpbmcvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECi1MYW5ndWFnZS9SZWZlcmVuY2UvTGV4aWNhbF9SdWxlcy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKLUxhbmd1YWdlL1JlZmVyZW5jZS9MZXhpY2FsX1J1bGVzL0NvbW1lbnRzLyo6IFNraXAgIyBOb3QgbWlncmF0ZWQgdG8gTk5CRAotTGFuZ3VhZ2UvUmVmZXJlbmNlL0xleGljYWxfUnVsZXMvUmVzZXJ2ZWRfV29yZHMvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECi1MYW5ndWFnZS9SZWZlcmVuY2UvT3BlcmF0b3JfUHJlY2VkZW5jZS8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKK0xhbmd1YWdlL1JlZmVyZW5jZS9PcGVyYXRvcl9QcmVjZWRlbmNlL3ByZWNlZGVuY2VfMDFfYXNzaWdubWVudF90MTQ6IFNraXAgIyBUcmlwbGUgc2hpZnQgaXMgbm90IGltcGxlbWVudGVkIHlldAorTGFuZ3VhZ2UvUmVmZXJlbmNlL09wZXJhdG9yX1ByZWNlZGVuY2UvcHJlY2VkZW5jZV8xMl9TaGlmdF90MDQ6IFNraXAgIyBUcmlwbGUgc2hpZnQgaXMgbm90IGltcGxlbWVudGVkIHlldAorTGFuZ3VhZ2UvUmVmZXJlbmNlL09wZXJhdG9yX1ByZWNlZGVuY2UvcHJlY2VkZW5jZV90MDU6IFNraXAgIyBUcmlwbGUgc2hpZnQgaXMgbm90IGltcGxlbWVudGVkIHlldAogTGFuZ3VhZ2UvU3RhdGVtZW50cy9Bc3NlcnQvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECiBMYW5ndWFnZS9TdGF0ZW1lbnRzL0Jsb2Nrcy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKIExhbmd1YWdlL1N0YXRlbWVudHMvQnJlYWsvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECkBAIC05MCw3ICs3Nyw2IEBACiBMYW5ndWFnZUZlYXR1cmVzL1NpbXBsZS1ib3VuZHMvc3RhdGljL3R5cGUtYWxpYXNlcy8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKIExhbmd1YWdlRmVhdHVyZXMvU3ByZWFkLWNvbGxlY3Rpb25zLyo6IFNraXAgIyBOb3QgbWlncmF0ZWQgdG8gTk5CRAogTGFuZ3VhZ2VGZWF0dXJlcy9TdXBlci1ib3VuZGVkLXR5cGVzLyo6IFNraXAgIyBOb3QgbWlncmF0ZWQgdG8gTk5CRAotTGFuZ3VhZ2VGZWF0dXJlcy9TdXBlci1taXhpbnMvKjogU2tpcCAjIE5vdCBtaWdyYXRlZCB0byBOTkJECiBMYW5ndWFnZUZlYXR1cmVzL1RyaXBsZS1TaGlmdC8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKIExhbmd1YWdlRmVhdHVyZXMvaW50LXRvLWRvdWJsZS8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKIExhbmd1YWdlRmVhdHVyZXMvcmVncmVzc2lvbi8qOiBTa2lwICMgTm90IG1pZ3JhdGVkIHRvIE5OQkQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvMTkvY28xOS1kYXJ0MmpzLnN0YXR1cyBiL3Rlc3RzL2NvMTkvY28xOS1kYXJ0MmpzLnN0YXR1cwppbmRleCBhM2NmZDMzLi5kNmY4YzgzIDEwMDY0NAotLS0gYS90ZXN0cy9jbzE5L2NvMTktZGFydDJqcy5zdGF0dXMKKysrIGIvdGVzdHMvY28xOS9jbzE5LWRhcnQyanMuc3RhdHVzCkBAIC0xOCw2ICsxOCw3IEBACiBMYW5ndWFnZS9FeHByZXNzaW9ucy9TaGlmdC9pbnRlZ2VyX3QwMjogU2tpcEJ5RGVzaWduICMgYmlnIGludGVnZXIgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQKIExhbmd1YWdlL0V4cHJlc3Npb25zL1NwYXduaW5nX2FuX0lzb2xhdGUvbmV3X2lzb2xhdGVfdDAxOiBTa2lwQnlEZXNpZ24KIExhbmd1YWdlL01ldGFkYXRhL2JlZm9yZSo6IFNraXAgIyBkYXJ0Om1pcnJvcnMgbm90IHN1cHBvcnRlZCBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2NvMTkvaXNzdWVzLzUyMy4KK0xhbmd1YWdlL1JlZmVyZW5jZS9PcGVyYXRvcl9QcmVjZWRlbmNlL3ByZWNlZGVuY2VfMTVfdW5hcnlfcHJlZml4X3QwODogU2tpcEJ5RGVzaWduICMgYmluYXJ5ICd+JyBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBpbiBKYXZhU2NyaXB0IGFuZCBEYXJ0CiBMaWJUZXN0L2lvLyo6IFNraXBCeURlc2lnbiAjIGRhcnQ6aW8gbm90IHN1cHBvcnRlZC4KIExpYlRlc3QvaXNvbGF0ZS8qOiBTa2lwQnlEZXNpZ24gIyBkYXJ0Omlzb2xhdGUgbm90IHN1cHBvcnRlZC4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvY28xOS9jbzE5LWRhcnRkZXZjLnN0YXR1cyBiL3Rlc3RzL2NvMTkvY28xOS1kYXJ0ZGV2Yy5zdGF0dXMKaW5kZXggYzgzMzE0OS4uMDhmM2I1NiAxMDA2NDQKLS0tIGEvdGVzdHMvY28xOS9jbzE5LWRhcnRkZXZjLnN0YXR1cworKysgYi90ZXN0cy9jbzE5L2NvMTktZGFydGRldmMuc3RhdHVzCkBAIC02OSw2ICs2OSw3IEBACiBMYW5ndWFnZS9FeHByZXNzaW9ucy9TaGlmdC9pbnRlZ2VyX3QwMjogU2tpcEJ5RGVzaWduICMgYmlnIGludGVnZXIgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQKIExhbmd1YWdlL0V4cHJlc3Npb25zL1NwYXduaW5nX2FuX0lzb2xhdGUvbmV3X2lzb2xhdGVfdDAxOiBTa2lwQnlEZXNpZ24gIyBkYXJ0Omlzb2xhdGUgbm90IHN1cHBvcnRlZC4KIExhbmd1YWdlL01ldGFkYXRhL2JlZm9yZSo6IFNraXAgIyBkYXJ0Om1pcnJvcnMgbm90IHN1cHBvcnRlZCBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2NvMTkvaXNzdWVzLzUyMy4KK0xhbmd1YWdlL1JlZmVyZW5jZS9PcGVyYXRvcl9QcmVjZWRlbmNlL3ByZWNlZGVuY2VfMTVfdW5hcnlfcHJlZml4X3QwODogU2tpcEJ5RGVzaWduICMgYmluYXJ5ICd+JyBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBpbiBKYXZhU2NyaXB0IGFuZCBEYXJ0CiBMYW5ndWFnZS9UeXBlcy9JbnRlcmZhY2VfVHlwZXMvc3VidHlwZV90Mjc6IFNraXAgIyBUaW1lcyBvdXQKIExhbmd1YWdlL1R5cGVzL0ludGVyZmFjZV9UeXBlcy9zdWJ0eXBlX3QyODogU2tpcCAjIFRpbWVzIG91dAogTGliVGVzdC9odG1sL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9hZGRFdmVudExpc3RlbmVyX0EwMV90MDM6IFNraXAgIyBUaW1lcyBvdXQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvcmVsaWIvcmVncmVzc180MjUwMl90ZXN0LmRhcnQgYi90ZXN0cy9jb3JlbGliL3JlZ3Jlc3NfNDI1MDJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYmFjNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jb3JlbGliL3JlZ3Jlc3NfNDI1MDJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvNDI1MDIuCisvLyBSZXF1aXJlbWVudHM9bm5iZC1zdHJvbmcKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3ZvaWQgbWFpbigpIHsKKyAgTGlzdDxpbnQ+IHggPSBbXTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgeC5sZW5ndGggPSB4Lmxlbmd0aCArIDE7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDAsIHgubGVuZ3RoKTsKKyAgeC5hZGQoMjIyKTsKKyAgRXhwZWN0LmVxdWFscygxLCB4Lmxlbmd0aCk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIHgubGVuZ3RoID0gMjsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoMSwgeC5sZW5ndGgpOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICB4Lmxlbmd0aCA9IHgubGVuZ3RoICsgMTsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoMSwgeC5sZW5ndGgpOworICBFeHBlY3QuZXF1YWxzKDIyMiwgeFswXSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzEyMzIwX3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvMTIzMjBfdGVzdC5kYXJ0CmluZGV4IGQ0N2MwNWEuLjY4NzFhYjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvMTIzMjBfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvMTIzMjBfdGVzdC5kYXJ0CkBAIC03LDcgKzcsNyBAQAogLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBJc3N1ZSAxMjMyMCwgSXNzdWUgMTIzNjMuCiAKIFN0cmluZyBsb2cgPSAnJzsKLWludCB4OworaW50PyB4OwogCiB2b2lkIG1haW4oKSB7CiAgIChydW4pKHJ1bik7CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzE3ODU2X3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvMTc4NTZfdGVzdC5kYXJ0CmluZGV4IGFhNWEyNDMuLjI3Y2ViZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvMTc4NTZfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvMTc4NTZfdGVzdC5kYXJ0CkBAIC05LDcgKzksNyBAQAogdm9pZCBtYWluKCkgewogICB2YXIgYWxsID0geyJhIjogbmV3IEEoKSwgImIiOiBuZXcgQigpfTsKIAotICBBIGEgPSBhbGxbImEiXTsKKyAgQSBhID0gYWxsWyJhIl0gYXMgQTsKICAgYS5sb2FkKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhcnQyanMvMjkxMzBfdGVzdC5kYXJ0IGIvdGVzdHMvZGFydDJqcy8yOTEzMF90ZXN0LmRhcnQKaW5kZXggZTRkYWEzNC4uNDQyNmYyNiAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy8yOTEzMF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvZGFydDJqcy8yOTEzMF90ZXN0LmRhcnQKQEAgLTIwLDcgKzIwLDcgQEAKIAogLy8gaW50ZXJmYWNlIHNjZW5hcmlvOiB3ZSBzaG91bGRuJ3QgdHJhY2UgQgogYWJzdHJhY3QgY2xhc3MgQiBpbXBsZW1lbnRzIEEgewotICBmYWN0b3J5IEIoKSA9PiBudWxsOworICBmYWN0b3J5IEIoKSA9PiBudWxsIGFzIGR5bmFtaWM7CiB9CiAKIC8vIG1peGluIHNjZW5hcmlvOiB3ZSBzaG91bGQgdHJhY2UgQywgYnV0IHdlIHNob3VsZCB0cmFjZSBfQwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy8zMjc3MGNfdGVzdC5kYXJ0IGIvdGVzdHMvZGFydDJqcy8zMjc3MGNfdGVzdC5kYXJ0CmluZGV4IDE1YWMxNjYuLjcyNjAyYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvMzI3NzBjX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzLzMyNzcwY190ZXN0LmRhcnQKQEAgLTIsMTMgKzIsMTEgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0vLyBkYXJ0MmpzT3B0aW9ucz0tLXN0cm9uZwotCiAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDMyNzcwLgogCiBpbXBvcnQgJ2RhcnQ6YXN5bmMnIHNob3cgRnV0dXJlOwogCi1BPEo+IGZ1dHVyZVRvQTxULCBKPihGdXR1cmU8VD4gZnV0dXJlLCBbSiB3cmFwVmFsdWUoVCB2YWx1ZSldKSB7CitBPEo+IGZ1dHVyZVRvQTxULCBKPihGdXR1cmU8VD4gZnV0dXJlLCBbSiB3cmFwVmFsdWUoVCB2YWx1ZSk/XSkgewogICByZXR1cm4gbmV3IEE8Sj4oCiAgICAgKHZvaWQgcmVzb2x2ZUZuKEogdmFsdWUpLCB2b2lkIHJlamVjdEZuKGVycm9yKSkgewogICAgICAgZnV0dXJlLnRoZW4oKHZhbHVlKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzMyODI4X3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvMzI4MjhfdGVzdC5kYXJ0CmluZGV4IGM1NmE5MDQuLjEyYjgyY2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvMzI4MjhfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvMzI4MjhfdGVzdC5kYXJ0CkBAIC0yLDEwICsyLDggQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0vLyBkYXJ0MmpzT3B0aW9ucz0tLXN0cm9uZwotCiBjbGFzcyBBIHsKLSAgdm9pZCBtMjxUPih2b2lkIEZ1bmN0aW9uKFQpIGYsIFthXSkge30KKyAgdm9pZCBtMjxUPih2b2lkIEZ1bmN0aW9uKFQpPyBmLCBbYV0pIHt9CiB9CiAKIG1haW4oKSA9PiBuZXcgQSgpLm0yPFN0cmluZz4obnVsbCk7CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzM3NDk0X3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvMzc0OTRfdGVzdC5kYXJ0CmluZGV4IGQyZDgyODMuLmM5NDAyOTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvMzc0OTRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvMzc0OTRfdGVzdC5kYXJ0CkBAIC00Niw3ICs0Niw3IEBACiAKICAgQG92ZXJyaWRlCiAgIEBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKQotICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKFQgYSwgVCBiKV0pIHsKKyAgdm9pZCBzb3J0KFtpbnQgY29tcGFyZShUIGEsIFQgYik/XSkgewogICAgIHN1cGVyLnNvcnQoY29tcGFyZSk7IC8vIFRoaXMgc3VwZXIgY2FsbCBoYWQgYmFkIGR1bW15IGludGVyY2VwdG9yLgogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzQxNDQ5YV90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzLzQxNDQ5YV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhcnQyanMvNDE0NDlhX3Rlc3QuZGFydApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gZGFydDJqc09wdGlvbnM9LU8wCisKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgcGFzc2luZyB0eXBlIHBhcmFtZXRlcnMgdGhyb3VnaCBjYWxsLXRocm91Z2ggc3R1Yi4KKy8vCisvLyBXZSB1c2UgYW4gYWJzdHJhY3QgY2xhc3Mgd2l0aCB0d28gaW1wbGVtZW50YXRpb25zIHRvIGF2b2lkIHRoZSBvcHRpbWl6ZXIKKy8vICdpbmxpbmluZycgdGhlIGNhbGwtdGhyb3VnaCBzdHViLCBzbyB3ZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBzdHViIGl0c2VsZgorLy8gcGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgcGFyYW1ldGVycy4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2Fic3RyYWN0IGNsYXNzIEFBQSB7CisgIGR5bmFtaWMgZ2V0IGZvbzsKK30KKworY2xhc3MgQjEgaW1wbGVtZW50cyBBQUEgeworICBmaW5hbCBkeW5hbWljIGZvbzsKKyAgQjEodGhpcy5mb28pOworfQorCitjbGFzcyBCMiBpbXBsZW1lbnRzIEFBQSB7CisgIGZpbmFsIGR5bmFtaWMgX2FycjsKKyAgQjIoZm9vKSA6IF9hcnIgPSBbZm9vXTsKKyAgZHluYW1pYyBnZXQgZm9vID0+IF9hcnIuZmlyc3Q7Cit9CisKK2NsYXNzIEIzIGltcGxlbWVudHMgQUFBIHsKKyAgZmluYWwgZHluYW1pYyBfX2ZvbzsKKyAgQjModGhpcy5fX2Zvbyk7CisgIGR5bmFtaWMgZ2V0IF9mb28gPT4gX19mb287CisgIGR5bmFtaWMgZ2V0IGZvbyA9PiBfZm9vOworfQorCitAcHJhZ21hKCdkYXJ0MmpzOm5vSW5saW5lJykKK3Rlc3QxPFQ+KEFBQSBhLCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgLy8gY2FsbC10aHJvdWdoIGdldHRlciAnZm9vJyB3aXRoIG9uZSB0eXBlIGFyZ3VtZW50LgorICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkLCBhLmZvbzxUPigpKTsKK30KKworQHByYWdtYSgnZGFydDJqczpub0lubGluZScpCit0ZXN0MjxVLCBWPihBQUEgYSwgU3RyaW5nIGV4cGVjdGVkKSB7CisgIC8vIGNhbGwtdGhyb3VnaCBnZXR0ZXIgJ2Zvbycgd2l0aCB0d28gdHlwZSBhcmd1bWVudHMuCisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWQsIGEuZm9vPFUsIFY+KCkpOworfQorCittYWluKCkgeworICB0ZXN0MTxpbnQ+KEIxKDxQPigpID0+ICckUCcpLCAnaW50Jyk7CisgIHRlc3QxPG51bT4oQjIoPFE+KCkgPT4gJyRRJyksICdudW0nKTsKKyAgdGVzdDE8ZG91YmxlPihCMyg8Uj4oKSA9PiAnJFInKSwgJ2RvdWJsZScpOworCisgIHRlc3QyPGludCwgbnVtPihCMSg8QSwgQj4oKSA9PiAnJEEgJEInKSwgJ2ludCBudW0nKTsKKyAgdGVzdDI8bnVtLCBpbnQ+KEIyKDxYLCBZPigpID0+ICckWCAkWScpLCAnbnVtIGludCcpOworICB0ZXN0Mjxkb3VibGUsIFN0cmluZz4oQjMoPEMsIEQ+KCkgPT4gJyRDICREJyksICdkb3VibGUgU3RyaW5nJyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzLzQxNDQ5Yl90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzLzQxNDQ5Yl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkZWI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhcnQyanMvNDE0NDliX3Rlc3QuZGFydApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgdGVzdCBpcyB0aGUgc2FtZSBhcyA0MTQ0OWFfdGVzdC5kYXJ0IHdpdGhvdXQgZm9yY2luZyBgLU8wYC4KKy8vCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIHBhc3NpbmcgdHlwZSBwYXJhbWV0ZXJzIHRocm91Z2ggY2FsbC10aHJvdWdoIHN0dWIuCisvLworLy8gV2UgdXNlIGFuIGFic3RyYWN0IGNsYXNzIHdpdGggdHdvIGltcGxlbWVudGF0aW9ucyB0byBhdm9pZCB0aGUgb3B0aW1pemVyCisvLyAnaW5saW5pbmcnIHRoZSBjYWxsLXRocm91Z2ggc3R1Yiwgc28gd2UgYXJlIHRlc3RpbmcgdGhhdCB0aGUgc3R1YiBpdHNlbGYKKy8vIHBhc3NlcyB0aHJvdWdoIHRoZSB0eXBlIHBhcmFtZXRlcnMuCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCithYnN0cmFjdCBjbGFzcyBBQUEgeworICBkeW5hbWljIGdldCBmb287Cit9CisKK2NsYXNzIEIxIGltcGxlbWVudHMgQUFBIHsKKyAgZmluYWwgZHluYW1pYyBmb287CisgIEIxKHRoaXMuZm9vKTsKK30KKworY2xhc3MgQjIgaW1wbGVtZW50cyBBQUEgeworICBmaW5hbCBkeW5hbWljIF9hcnI7CisgIEIyKGZvbykgOiBfYXJyID0gW2Zvb107CisgIGR5bmFtaWMgZ2V0IGZvbyA9PiBfYXJyLmZpcnN0OworfQorCitjbGFzcyBCMyBpbXBsZW1lbnRzIEFBQSB7CisgIGZpbmFsIGR5bmFtaWMgX19mb287CisgIEIzKHRoaXMuX19mb28pOworICBkeW5hbWljIGdldCBfZm9vID0+IF9fZm9vOworICBkeW5hbWljIGdldCBmb28gPT4gX2ZvbzsKK30KKworQHByYWdtYSgnZGFydDJqczpub0lubGluZScpCit0ZXN0MTxUPihBQUEgYSwgU3RyaW5nIGV4cGVjdGVkKSB7CisgIC8vIGNhbGwtdGhyb3VnaCBnZXR0ZXIgJ2Zvbycgd2l0aCBvbmUgdHlwZSBhcmd1bWVudC4KKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZCwgYS5mb288VD4oKSk7Cit9CisKK0BwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKQordGVzdDI8VSwgVj4oQUFBIGEsIFN0cmluZyBleHBlY3RlZCkgeworICAvLyBjYWxsLXRocm91Z2ggZ2V0dGVyICdmb28nIHdpdGggdHdvIHR5cGUgYXJndW1lbnRzLgorICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkLCBhLmZvbzxVLCBWPigpKTsKK30KKworbWFpbigpIHsKKyAgdGVzdDE8aW50PihCMSg8UD4oKSA9PiAnJFAnKSwgJ2ludCcpOworICB0ZXN0MTxudW0+KEIyKDxRPigpID0+ICckUScpLCAnbnVtJyk7CisgIHRlc3QxPGRvdWJsZT4oQjMoPFI+KCkgPT4gJyRSJyksICdkb3VibGUnKTsKKworICB0ZXN0MjxpbnQsIG51bT4oQjEoPEEsIEI+KCkgPT4gJyRBICRCJyksICdpbnQgbnVtJyk7CisgIHRlc3QyPG51bSwgaW50PihCMig8WCwgWT4oKSA9PiAnJFggJFknKSwgJ251bSBpbnQnKTsKKyAgdGVzdDI8ZG91YmxlLCBTdHJpbmc+KEIzKDxDLCBEPigpID0+ICckQyAkRCcpLCAnZG91YmxlIFN0cmluZycpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy80MjA4OF90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzLzQyMDg4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYzZGZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGFydDJqcy80MjA4OF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDQyMDg4LgorCitjbGFzcyBGb288VD4ge30KKwordm9pZCBtYWluKCkgeworICB2YXIgZiA9IDxUPigpID0+IEZvbzxUPigpLnJ1bnRpbWVUeXBlOworCisgIHByaW50KGY8aW50PigpKTsKKyAgcHJpbnQoZjxTdHJpbmc+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy80MjE4OV90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzLzQyMTg5X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTgxMDYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGFydDJqcy80MjE4OV90ZXN0LmRhcnQKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIGRhcnQyanNPcHRpb25zPS1PMAorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDQyODkxLiBUaGUgcm9vdCBjYXVzZSB3YXMgYSBtYWxmb3JtZWQgU1NBIGR1ZSB0bworLy8gZ2VuZXJhdGluZyBhIGR5bmFtaWMgZW50cnkgcG9pbnQgYXJndW1lbnQgdGVzdCBmb3IgYW4gZWxpZGVkIHBhcmFtZXRlcgorLy8gZGlyZWN0bHkgb24gdGhlIEhMb2NhbFZhbHVlICwgd2hpY2ggc2hvdWxkIG9ubHkgYmUgYW4gb3BlcmFuZCB0byBITG9jYWxHZXQKKy8vIGFuZCBITG9jYWxTZXQuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBDQ0MgeworICB2b2lkIGZvbyhbbnVtIHggPSAxMjNdKSB7CisgICAgdHJ5IHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMTIzLCB4KTsKKyAgICAgIHggPSAwOworICAgIH0gZmluYWxseSB7CisgICAgICBFeHBlY3QuZXF1YWxzKDAsIHgpOworICAgIH0KKyAgfQorCisgIHZvaWQgYmFyKFtudW0geCA9IDQ1Nl0pIHsKKyAgICB0cnkgeworICAgICAgRXhwZWN0LmVxdWFscygxMjMsIHgpOworICAgICAgeCA9IDA7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMCwgeCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgQ0NDKCkuZm9vKCk7CisgIENDQygpLmJhcigxMjMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy80MjUwMV90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzLzQyNTAxX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI3OTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGFydDJqcy80MjUwMV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKwordHlwZWRlZiBGID0gbnVtPyBGdW5jdGlvbigpOworCitGIGZvbygpIHsKKyAgVD8gbG9jYWw8VD4oKSA9PiBudWxsOworICByZXR1cm4gbG9jYWw7Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgRXhwZWN0LnR5cGU8Rj4oZm9vKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy84ODFfdGVzdC5kYXJ0IGIvdGVzdHMvZGFydDJqcy84ODFfdGVzdC5kYXJ0CmluZGV4IDViZTg0OWMuLjU5YzAwYWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvODgxX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzLzg4MV90ZXN0LmRhcnQKQEAgLTYsNiArNiw2IEBACiAKIEBwcmFnbWEoJ2RhcnQyanM6ZGlzYWJsZUZpbmFsJykKIHZvaWQgbWFpbigpIHsKLSAgU3RyaW5nIHYgPSBudWxsOworICBTdHJpbmc/IHYgPSBudWxsOwogICBwcmludCgnJHt2Lmhhc2hDb2RlfScpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy9hc3NlcnRfd2l0aF9tZXNzYWdlX3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvYXNzZXJ0X3dpdGhfbWVzc2FnZV90ZXN0LmRhcnQKaW5kZXggOTkzYWIxMS4uZjg0ODczNCAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy9hc3NlcnRfd2l0aF9tZXNzYWdlX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzL2Fzc2VydF93aXRoX21lc3NhZ2VfdGVzdC5kYXJ0CkBAIC00NCw3ICs0NCw3IEBACiAgIH0KIAogICBjaGVjaygnY29uc3RhbnQgdHlwZSBlcnJvcicsICgpIHsKLSAgICBhc3NlcnQobnVsbCwgJ011bWJsZScpOworICAgIGFzc2VydChudWxsIGFzIGR5bmFtaWMsICdNdW1ibGUnKTsKICAgfSk7CiAgIGNoZWNrKCd2YXJpYWJsZSB0eXBlIGVycm9yJywgKCkgewogICAgIGFzc2VydChjb25mdXNlKG51bGwpLCAnTXVtYmxlJyk7CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzL2Jvb2xlYW5fY29udmVyc2lvbl90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzL2Jvb2xlYW5fY29udmVyc2lvbl90ZXN0LmRhcnQKaW5kZXggNjRjZDQ0MS4uNDhjMWNiNiAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy9ib29sZWFuX2NvbnZlcnNpb25fdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvYm9vbGVhbl9jb252ZXJzaW9uX3Rlc3QuZGFydApAQCAtMjMsMTIgKzIzLDEyIEBACiB9CiAKIHZvaWQgY29uZGl0aW9uYWxUZXN0KCkgewotICBib29sIHggPSBudWxsOworICBib29sIHggPSBudWxsIGFzIGR5bmFtaWM7CiAgIEV4cGVjdC5pc0ZhbHNlKHggPyB0cnVlIDogZmFsc2UpOwogfQogCiB2b2lkIG9yVGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QuZXF1YWxzKG51bGwsIHggfHwgeCk7CiAgIEV4cGVjdC5pc0ZhbHNlKHggfHwgZmFsc2UpOwogICBFeHBlY3QuaXNUcnVlKHggfHwgdHJ1ZSk7CkBAIC0zNyw3ICszNyw3IEBACiB9CiAKIHZvaWQgYW5kVGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QuaXNGYWxzZSh4ICYmIHgpOwogICBFeHBlY3QuaXNGYWxzZSh4ICYmIGZhbHNlKTsKICAgRXhwZWN0LmlzRmFsc2UoeCAmJiB0cnVlKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKIH0KIAogdm9pZCBpZlRlc3QoKSB7Ci0gIGJvb2wgeCA9IG51bGw7CisgIGJvb2wgeCA9IG51bGwgYXMgZHluYW1pYzsKICAgRXhwZWN0LmlzRmFsc2UoKCkgewogICAgIGlmICh4KSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTU3LDcgKzU3LDcgQEAKIH0KIAogdm9pZCBmb3JUZXN0KCkgewotICBib29sIHggPSBudWxsOworICBib29sIHggPSBudWxsIGFzIGR5bmFtaWM7CiAgIEV4cGVjdC5pc0ZhbHNlKCgpIHsKICAgICBmb3IgKDsgeDspIHsKICAgICAgIHJldHVybiB0cnVlOwpAQCAtNjcsNyArNjcsNyBAQAogfQogCiB2b2lkIHdoaWxlVGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QuaXNGYWxzZSgoKSB7CiAgICAgd2hpbGUgKHgpIHsKICAgICAgIHJldHVybiB0cnVlOwpAQCAtNzcsNyArNzcsNyBAQAogfQogCiB2b2lkIGRvVGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QuZXF1YWxzKDEsICgpIHsKICAgICBpbnQgbiA9IDA7CiAgICAgZG8gewpAQCAtODgsMTYgKzg4LDE2IEBACiB9CiAKIHZvaWQgbm90VGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QuaXNUcnVlKCF4KTsKIH0KIAogdm9pZCBpZkVsZW1lbnRUZXN0KCkgewotICBib29sIHggPSBudWxsOworICBib29sIHggPSBudWxsIGFzIGR5bmFtaWM7CiAgIEV4cGVjdC5saXN0RXF1YWxzKFtdLCBbaWYgKHgpIDFdKTsKIH0KIAogdm9pZCBmb3JFbGVtZW50VGVzdCgpIHsKLSAgYm9vbCB4ID0gbnVsbDsKKyAgYm9vbCB4ID0gbnVsbCBhcyBkeW5hbWljOwogICBFeHBlY3QubGlzdEVxdWFscyhbXSwgW2ZvciAodmFyIGkgPSAwOyB4OyBpKyspIGldKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhcnQyanMvYm91bmRfY2xvc3VyZV9pbnRlcmNlcHRvcl90eXBlX3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvYm91bmRfY2xvc3VyZV9pbnRlcmNlcHRvcl90eXBlX3Rlc3QuZGFydAppbmRleCA3ZDRlYTEwLi4zNDEwZGJlIDEwMDY0NAotLS0gYS90ZXN0cy9kYXJ0MmpzL2JvdW5kX2Nsb3N1cmVfaW50ZXJjZXB0b3JfdHlwZV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvZGFydDJqcy9ib3VuZF9jbG9zdXJlX2ludGVyY2VwdG9yX3R5cGVfdGVzdC5kYXJ0CkBAIC0xNSw3ICsxNSw3IEBACiBjbGFzcyBBPFQ+IHsKICAgY29uc3QgQSgpOwogICB2b2lkIGFkZChUIHgpIHt9Ci0gIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gaW5kZXggPT0gMCA/IDQyIDogJ3N0cmluZyc7CisgIFQgZWxlbWVudEF0KGludCBpbmRleCkgPT4gaW5kZXggPT0gMCA/IDQyIGFzIGR5bmFtaWMgOiAnc3RyaW5nJzsKIAogICAvLyBUaGlzIGNhbGwgZ2V0OmVsZW1lbnRBdCBoYXMgYSBrbm93biByZWNlaXZlciB0eXBlLCBzbyBpcyBpcyBwb3RlbnRpYWxseQogICAvLyBlbGlnaWJsZSBmb3IgYSBkdW1teSByZWNlaXZlciBvcHRpbWl6YXRpb24uCkBAIC04OSw3ICs4OSw3IEBACiAKICAgICBmb3IgKHZhciBvYmplY3QgaW4gb2JqZWN0cykgewogICAgICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBtZXRob2ROYW1lcykgewotICAgICAgICB2YXIgbWV0aG9kRm4gPSBtZXRob2RzW21ldGhvZE5hbWVdOworICAgICAgICB2YXIgbWV0aG9kRm4gPSBtZXRob2RzW21ldGhvZE5hbWVdIGFzIGR5bmFtaWM7CiAgICAgICAgIHZhciBkZXNjcmlwdGlvbiA9ICckb2JqZWN0JzsKICAgICAgICAgY2hlY2tlcnMuZm9yRWFjaCgoY2hlY2tOYW1lLCBjaGVja0ZuKSB7CiAgICAgICAgICAgYm9vbCBhbnN3ZXIgPSB0cnVlQ2hlY2tOYW1lcy5jb250YWlucyhjaGVja05hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy9jYWxsX3NpZ25hdHVyZV90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzL2NhbGxfc2lnbmF0dXJlX3Rlc3QuZGFydAppbmRleCAyMDk3OGQ1Li5iNjc1ZjNiIDEwMDY0NAotLS0gYS90ZXN0cy9kYXJ0MmpzL2NhbGxfc2lnbmF0dXJlX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzL2NhbGxfc2lnbmF0dXJlX3Rlc3QuZGFydApAQCAtOSw3ICs5LDcgQEAKIAogY2xhc3MgQTxUPiB7CiAgIC8vLyBXZWlyZCBzaWduYXR1cmUgdG8gZW5zdXJlIGl0IGlzbid0IG1hdGNoIGJ5IGFueSBjYWxsIHNlbGVjdG9yLgotICBjYWxsKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8sIHAsIHEsIHIsIHMsIHtUIHR9KSB7fQorICBjYWxsKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8sIHAsIHEsIHIsIHMsIHtUPyB0fSkge30KIH0KIAogY2xhc3MgQjxUPiB7CmRpZmYgLS1naXQgYS90ZXN0cy9kYXJ0MmpzL2NmZV9pbnN0YW5jZV9jb25zdGFudF90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzL2NmZV9pbnN0YW5jZV9jb25zdGFudF90ZXN0LmRhcnQKaW5kZXggMGMyMDJjMS4uM2JkOTkxNyAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy9jZmVfaW5zdGFuY2VfY29uc3RhbnRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2RhcnQyanMvY2ZlX2luc3RhbmNlX2NvbnN0YW50X3Rlc3QuZGFydApAQCAtMTcsNSArMTcsNSBAQAogY29uc3QgYzAgPSBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgieCIpID8gbnVsbCA6IGNvbnN0IENsYXNzOSgpOwogCiBtYWluKCkgewotICBFeHBlY3QuZXF1YWxzKDAsIGMwLmZpZWxkKTsKKyAgRXhwZWN0LmVxdWFscygwLCBjMCEuZmllbGQpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy9jaGVja2VkX3NldHRlcl90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzL2NoZWNrZWRfc2V0dGVyX3Rlc3QuZGFydAppbmRleCA2MGNhNGZhLi45Yjg2ZjRkIDEwMDY0NAotLS0gYS90ZXN0cy9kYXJ0MmpzL2NoZWNrZWRfc2V0dGVyX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzL2NoZWNrZWRfc2V0dGVyX3Rlc3QuZGFydApAQCAtNSwxMSArNSwxMSBAQAogaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CiAKIGNsYXNzIEEgewotICBTdHJpbmcgZmllbGQ7CisgIFN0cmluZz8gZmllbGQ7CiB9CiAKIGNsYXNzIEIgewotICBpbnQgZmllbGQ7CisgIGludD8gZmllbGQ7CiB9CiAKIEBwcmFnbWEoJ2RhcnQyanM6bm9JbmxpbmUnKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy9jbGFzc19oaWVyYXJjaHlfZXh0ZW5kc19jbGF1c2VfdGVzdC5kYXJ0IGIvdGVzdHMvZGFydDJqcy9jbGFzc19oaWVyYXJjaHlfZXh0ZW5kc19jbGF1c2VfdGVzdC5kYXJ0CmluZGV4IGI2MTMxYzkuLmI2MWVjMGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2RhcnQyanMvY2xhc3NfaGllcmFyY2h5X2V4dGVuZHNfY2xhdXNlX3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzL2NsYXNzX2hpZXJhcmNoeV9leHRlbmRzX2NsYXVzZV90ZXN0LmRhcnQKQEAgLTIsNiArMiw3IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAoraW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CiAKIGNsYXNzIEEge30KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZGFydDJqcy9jbG9zdXJlX2NhcHR1cmU3X3Rlc3QuZGFydCBiL3Rlc3RzL2RhcnQyanMvY2xvc3VyZV9jYXB0dXJlN190ZXN0LmRhcnQKaW5kZXggMDQ1ZjZhNS4uOWI4NDgyZCAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy9jbG9zdXJlX2NhcHR1cmU3X3Rlc3QuZGFydAorKysgYi90ZXN0cy9kYXJ0MmpzL2Nsb3N1cmVfY2FwdHVyZTdfdGVzdC5kYXJ0CkBAIC0zLDEyICszLDEyIEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBjbGFzcyBBPFQ+IHsKLSAgTGlzdDxMaXN0PiB4czsKKyAgTGlzdDxMaXN0Pj8geHM7CiAKICAgdm9pZCBmb28oKSB7CiAgICAgLy8gdGhlIGlubmVyIGNsb3N1cmUgb25seSBuZWVkcyB0byBjYXB0dXJlICd0aGlzJyBpZgogICAgIC8vIGBBYCBuZWVkcyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24uCi0gICAgeHMubWFwKCh4KSA9PiB4Lm1hcCgoYSkgPT4gYSBhcyBUKSk7CisgICAgeHMhLm1hcCgoeCkgPT4geC5tYXAoKGEpID0+IGEgYXMgVCkpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhcnQyanMvY29tcG91bmRfb3BlcmF0b3JfaW5kZXhfdGVzdC5kYXJ0IGIvdGVzdHMvZGFydDJqcy9jb21wb3VuZF9vcGVyYXRvcl9pbmRleF90ZXN0LmRhcnQKaW5kZXggNTA4YTllMC4uMGM1MjdkMiAxMDA2NDQKLS0tIGEvdGVzdHMvZGFydDJqcy9jb21wb3VuZF9vcGVyYXRvcl9pbmRleF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvZGFydDJqcy9jb21wb3VuZF9vcGVyYXRvcl9pbmRleF90ZXN0LmRhcnQKQEAgLTY5LDcgKzY5LDcgQEAKICAgYVswXSArPSAyOwogICBFeHBlY3QuZXF1YWxzKDMsIGFbMF0pOwogCi0gIExpc3QgdHJhY2UgPSBuZXcgTGlzdCgpOworICBMaXN0IHRyYWNlID0gW107CiAgIGdldEIodHJhY2UpW2dldEluZGV4KHRyYWNlKV0gKz0gMzc7CiAKICAgRXhwZWN0Lmxpc3RFcXVhbHMoWy0xLCAtMiwgLTMsIDQyLCAxMDAsIC00LCAxMDEsIDM3LCAtNSwgNDIsIDEwMl0sIHRyYWNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhcnQyanNfMi80MjA4OF90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzXzIvNDIwODhfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjNkZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXJ0MmpzXzIvNDIwODhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBpc3N1ZSA0MjA4OC4KKworY2xhc3MgRm9vPFQ+IHt9CisKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIGYgPSA8VD4oKSA9PiBGb288VD4oKS5ydW50aW1lVHlwZTsKKworICBwcmludChmPGludD4oKSk7CisgIHByaW50KGY8U3RyaW5nPigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhcnQyanNfMi80MjUwMV90ZXN0LmRhcnQgYi90ZXN0cy9kYXJ0MmpzXzIvNDI1MDFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODk0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXJ0MmpzXzIvNDI1MDFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK3R5cGVkZWYgRiA9IG51bSBGdW5jdGlvbigpOworCitGIGZvbygpIHsKKyAgVCBsb2NhbDxUPigpID0+IG51bGw7CisgIHJldHVybiBsb2NhbDsKK30KKwordm9pZCBtYWluKCkgeworICBFeHBlY3QudHlwZTxGPihmb28oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9mZmkvdm1zcGVjaWZpY19oYW5kbGVfdGVzdC5kYXJ0IGIvdGVzdHMvZmZpL3Ztc3BlY2lmaWNfaGFuZGxlX3Rlc3QuZGFydAppbmRleCA0NTQ4YzcwLi5kY2I1ZTM4IDEwMDY0NAotLS0gYS90ZXN0cy9mZmkvdm1zcGVjaWZpY19oYW5kbGVfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2ZmaS92bXNwZWNpZmljX2hhbmRsZV90ZXN0LmRhcnQKQEAgLTIzLDYgKzIzLDcgQEAKICAgdGVzdERlZXBFeGNlcHRpb24yKCk7CiAgIHRlc3ROdWxsKCk7CiAgIHRlc3REZWVwUmVjdXJzaXZlKCk7CisgIHRlc3ROb0hhbmRsZVByb3BhZ2F0ZUVycm9yKCk7CiB9CiAKIHZvaWQgdGVzdEhhbmRsZSgpIHsKQEAgLTIyMCw2ICsyMjEsMTkgQEAKICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoc29tZU9iamVjdCwgcmVzdWx0KSk7CiB9CiAKK3ZvaWQgdGVzdE5vSGFuZGxlUHJvcGFnYXRlRXJyb3IoKSB7CisgIGJvb2wgdGhyb3dzID0gZmFsc2U7CisgIHRyeSB7CisgICAgZmluYWwgcmVzdWx0ID0gcHJvcGFnYXRlRXJyb3JXaXRob3V0SGFuZGxlKGV4Y2VwdGlvbkhhbmRsZUNhbGxiYWNrUG9pbnRlcik7CisgICAgcHJpbnQocmVzdWx0KTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHRocm93cyA9IHRydWU7CisgICAgcHJpbnQoImNhdWdodCAoJGUpIik7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoc29tZUV4Y2VwdGlvbiwgZSkpOworICB9CisgIEV4cGVjdC5pc1RydWUodGhyb3dzKTsKK30KKwogZmluYWwgdGVzdExpYnJhcnkgPSBkbG9wZW5QbGF0Zm9ybVNwZWNpZmljKCJmZmlfdGVzdF9mdW5jdGlvbnMiKTsKIAogZmluYWwgcGFzc09iamVjdFRvQyA9IHRlc3RMaWJyYXJ5Lmxvb2t1cEZ1bmN0aW9uPEhhbmRsZSBGdW5jdGlvbihIYW5kbGUpLApAQCAtMjQ3LDMgKzI2MSw4IEBACiAgICAgICAgIEhhbmRsZSwgUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxIYW5kbGUgRnVuY3Rpb24oSW50NjQpPj4sIEludDY0KSwKICAgICBPYmplY3QgRnVuY3Rpb24oT2JqZWN0LCBQb2ludGVyPE5hdGl2ZUZ1bmN0aW9uPEhhbmRsZSBGdW5jdGlvbihJbnQ2NCk+PiwKICAgICAgICAgaW50KT4oIkhhbmRsZVJlY3Vyc2lvbiIpOworCitmaW5hbCBwcm9wYWdhdGVFcnJvcldpdGhvdXRIYW5kbGUgPSB0ZXN0TGlicmFyeS5sb29rdXBGdW5jdGlvbjwKKyAgICAgICAgSW50NjQgRnVuY3Rpb24oUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxIYW5kbGUgRnVuY3Rpb24oKT4+KSwKKyAgICAgICAgaW50IEZ1bmN0aW9uKFBvaW50ZXI8TmF0aXZlRnVuY3Rpb248SGFuZGxlIEZ1bmN0aW9uKCk+Pik+KAorICAgICJQcm9wYWdhdGVFcnJvcldpdGhvdXRIYW5kbGUiKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZmaV8yL3Ztc3BlY2lmaWNfaGFuZGxlX3Rlc3QuZGFydCBiL3Rlc3RzL2ZmaV8yL3Ztc3BlY2lmaWNfaGFuZGxlX3Rlc3QuZGFydAppbmRleCA4NWFmYWU0Li5iNzQxNmU3IDEwMDY0NAotLS0gYS90ZXN0cy9mZmlfMi92bXNwZWNpZmljX2hhbmRsZV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvZmZpXzIvdm1zcGVjaWZpY19oYW5kbGVfdGVzdC5kYXJ0CkBAIC0yMyw2ICsyMyw3IEBACiAgIHRlc3REZWVwRXhjZXB0aW9uMigpOwogICB0ZXN0TnVsbCgpOwogICB0ZXN0RGVlcFJlY3Vyc2l2ZSgpOworICB0ZXN0Tm9IYW5kbGVQcm9wYWdhdGVFcnJvcigpOwogfQogCiB2b2lkIHRlc3RIYW5kbGUoKSB7CkBAIC0yMjAsNiArMjIxLDE5IEBACiAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKHNvbWVPYmplY3QsIHJlc3VsdCkpOwogfQogCit2b2lkIHRlc3ROb0hhbmRsZVByb3BhZ2F0ZUVycm9yKCkgeworICBib29sIHRocm93cyA9IGZhbHNlOworICB0cnkgeworICAgIGZpbmFsIHJlc3VsdCA9IHByb3BhZ2F0ZUVycm9yV2l0aG91dEhhbmRsZShleGNlcHRpb25IYW5kbGVDYWxsYmFja1BvaW50ZXIpOworICAgIHByaW50KHJlc3VsdCk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICB0aHJvd3MgPSB0cnVlOworICAgIHByaW50KCJjYXVnaHQgKCRlKSIpOworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKHNvbWVFeGNlcHRpb24sIGUpKTsKKyAgfQorICBFeHBlY3QuaXNUcnVlKHRocm93cyk7Cit9CisKIGZpbmFsIHRlc3RMaWJyYXJ5ID0gZGxvcGVuUGxhdGZvcm1TcGVjaWZpYygiZmZpX3Rlc3RfZnVuY3Rpb25zIik7CiAKIGZpbmFsIHBhc3NPYmplY3RUb0MgPSB0ZXN0TGlicmFyeS5sb29rdXBGdW5jdGlvbjxIYW5kbGUgRnVuY3Rpb24oSGFuZGxlKSwKQEAgLTI0NywzICsyNjEsOCBAQAogICAgICAgICBIYW5kbGUsIFBvaW50ZXI8TmF0aXZlRnVuY3Rpb248SGFuZGxlIEZ1bmN0aW9uKEludDY0KT4+LCBJbnQ2NCksCiAgICAgT2JqZWN0IEZ1bmN0aW9uKE9iamVjdCwgUG9pbnRlcjxOYXRpdmVGdW5jdGlvbjxIYW5kbGUgRnVuY3Rpb24oSW50NjQpPj4sCiAgICAgICAgIGludCk+KCJIYW5kbGVSZWN1cnNpb24iKTsKKworZmluYWwgcHJvcGFnYXRlRXJyb3JXaXRob3V0SGFuZGxlID0gdGVzdExpYnJhcnkubG9va3VwRnVuY3Rpb248CisgICAgICAgIEludDY0IEZ1bmN0aW9uKFBvaW50ZXI8TmF0aXZlRnVuY3Rpb248SGFuZGxlIEZ1bmN0aW9uKCk+PiksCisgICAgICAgIGludCBGdW5jdGlvbihQb2ludGVyPE5hdGl2ZUZ1bmN0aW9uPEhhbmRsZSBGdW5jdGlvbigpPj4pPigKKyAgICAiUHJvcGFnYXRlRXJyb3JXaXRob3V0SGFuZGxlIik7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9jYWxsL2NvbnN0cnVjdG9yX29uX3VucmVzb2x2YWJsZV9jbGFzc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9jYWxsL2NvbnN0cnVjdG9yX29uX3VucmVzb2x2YWJsZV9jbGFzc190ZXN0LmRhcnQKaW5kZXggZjNmYTQ4Mi4uM2IzMjk4NyAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvY2FsbC9jb25zdHJ1Y3Rvcl9vbl91bnJlc29sdmFibGVfY2xhc3NfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL2NhbGwvY29uc3RydWN0b3Jfb25fdW5yZXNvbHZhYmxlX2NsYXNzX3Rlc3QuZGFydApAQCAtMTEsMTQgKzExLDE0IEBACiBtYWluKCkgewogICBuZXcgQSgpOwogICAvLyAgXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnQScuCiAgIG5ldyBBLmZvbygpOwogICAvLyAgXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0EuZm9vJy4KICAgbmV3IGxpYi5BKCk7CiAgIC8vICBeXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnbGliLkEnLgogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvY2xhc3MvdmFyaWFibGVfc2hhZG93X2NsYXNzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL2NsYXNzL3ZhcmlhYmxlX3NoYWRvd19jbGFzc190ZXN0LmRhcnQKaW5kZXggMzVhMWZkYS4uNWUyNDM5MCAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvY2xhc3MvdmFyaWFibGVfc2hhZG93X2NsYXNzX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9jbGFzcy92YXJpYWJsZV9zaGFkb3dfY2xhc3NfdGVzdC5kYXJ0CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgLy8gTm93IHRoaXMgcmVmZXJzIHRvIHRoZSB2YXJpYWJsZS4KICAgICB2YXIgaSA9IG5ldyBUZXN0Lm5hbWVkKDEwKTsKICAgICAvLyAgICAgICAgICBeXl5eXl5eXl5eCi0gICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAgIC8vICAgICAgICAgIF5eXl4KICAgICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnVGVzdC5uYW1lZCcuCiAgICAgRXhwZWN0LmVxdWFscygxMCwgaS5maWVsZCk7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9jbG9zdXJlL3dpdGhfc3VwZXJfZmllbGRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvY2xvc3VyZS93aXRoX3N1cGVyX2ZpZWxkX3Rlc3QuZGFydAppbmRleCA2OGNjM2JlLi42MDNjMGY2IDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9jbG9zdXJlL3dpdGhfc3VwZXJfZmllbGRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL2Nsb3N1cmUvd2l0aF9zdXBlcl9maWVsZF90ZXN0LmRhcnQKQEAgLTMsMTAgKzMsOCBAQAogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7Ci1pbXBvcnQgInBhY2thZ2U6bWV0YS9tZXRhLmRhcnQiIHNob3cgdmlydHVhbDsKIAogY2xhc3MgQSB7Ci0gIEB2aXJ0dWFsCiAgIGludCBhOwogICBBKCkgOiBhID0gNDI7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9jb25zdC9jb25zdHJ1Y3Rvcl9ub25jb25zdF9maWVsZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9jb25zdC9jb25zdHJ1Y3Rvcl9ub25jb25zdF9maWVsZF90ZXN0LmRhcnQKaW5kZXggZDJlNzAzMC4uMzUzMzg0MiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvY29uc3QvY29uc3RydWN0b3Jfbm9uY29uc3RfZmllbGRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL2NvbnN0L2NvbnN0cnVjdG9yX25vbmNvbnN0X2ZpZWxkX3Rlc3QuZGFydApAQCAtMTAsNyArMTAsNyBAQAogICAvLyBbY2ZlXSBNZXRob2QgaW52b2NhdGlvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLgogICBmaW5hbCBpbnQgaiA9IDE7CiAgIGNvbnN0IEEoKTsKLS8vXl5eXl5eXl5eXgorLy9eXl5eXgogLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09OU1RfQ09OU1RSVUNUT1JfV0lUSF9GSUVMRF9JTklUSUFMSVpFRF9CWV9OT05fQ09OU1QKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvY29uc3RydWN0b3IvbmFtZWRfY29uc3RydWN0b3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvY29uc3RydWN0b3IvbmFtZWRfY29uc3RydWN0b3JfdGVzdC5kYXJ0CmluZGV4IDkxNWYxNDcuLjEyYTU4YjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL2NvbnN0cnVjdG9yL25hbWVkX2NvbnN0cnVjdG9yX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9jb25zdHJ1Y3Rvci9uYW1lZF9jb25zdHJ1Y3Rvcl90ZXN0LmRhcnQKQEAgLTM2LDEzICszNiwxMyBAQAogICAvLyAncHJlZml4JyBpcyBub3QgYSB0eXBlOgogICBuZXcgcHJlZml4PGludD4uQ2xhc3MoKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgbmV3IHByZWZpeC5DbGFzczxpbnQ+KCkudmFsdWU7CiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzczxpbnQ+JyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzPGludD4oKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgLy8gICAgICAgICAgICAgIF5eXl5eCiAgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5XUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1IKQEAgLTUyLDcgKzUyLDcgQEAKICAgLy8gJ3ByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkJyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkKCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFQ1RFRF9UT0tFTgpAQCAtNzAsNyArNzAsNyBAQAogICAvLyAncHJlZml4PGludD4uQ2xhc3M8aW50PicgZG9lc24ndCBmaXQgdGhlIGdyYW1tYXIgc3ludGF4IFQuaWQ6CiAgIG5ldyBwcmVmaXg8aW50Pi5DbGFzczxpbnQ+Lm5hbWVkKCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SCkBAIC04MCw3ICs4MCw3IEBACiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzcy5uYW1lZDxpbnQ+JyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkPGludD4oKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgLy8gICAgICAgICAgICAgIF5eXl5eCiAgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVDVEVEX1RPS0VOCkBAIC05Niw3ICs5Niw3IEBACiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzczxpbnQ+Lm5hbWVkPGludD4nIGRvZXNuJ3QgZml0IHRoZSBncmFtbWFyIHN5bnRheCBULmlkOgogICBuZXcgcHJlZml4PGludD4uQ2xhc3M8aW50Pi5uYW1lZDxpbnQ+KCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9jb25zdHJ1Y3Rvci9yZWZlcmVuY2VfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvY29uc3RydWN0b3IvcmVmZXJlbmNlX3Rlc3QuZGFydAppbmRleCBjZWNmYmYzLi43YWFiMWZmIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9jb25zdHJ1Y3Rvci9yZWZlcmVuY2VfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL2NvbnN0cnVjdG9yL3JlZmVyZW5jZV90ZXN0LmRhcnQKQEAgLTEzLDcgKzEzLDcgQEAKICAgbmV3IEZvby5iYXIoKTsKICAgbmV3IEZvby5iYXIuYmF6KCk7CiAgIC8vICBeXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vICAgICAgICAgIF4KICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0Zvby5iYXIuYmF6Jy4KICAgbmV3IEZvbzxpbnQ+KCk7CkBAIC0zNCwxMiArMzQsMTIgQEAKICAgLy8gICAgICBeCiAgIC8vIFtjZmVdIEEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLgogICAvLyAgXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyAgICAgICAgICAgICAgIF4KICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0Zvby5iYXIuYmF6Jy4KICAgbmV3IEZvby5iYXIuYmF6PGludD4oKTsKICAgLy8gIF5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgXl5eCiAgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5XUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1IKICAgLy8gW2NmZV0gQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuCkBAIC01MCw3ICs1MCw3IEBACiAgIGNvbnN0IEZvby5iYXIoKTsKICAgY29uc3QgRm9vLmJhci5iYXooKTsKICAgLy8gICAgXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05TVF9XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgICBeCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdGb28uYmFyLmJheicuCiAgIGNvbnN0IEZvbzxpbnQ+KCk7CkBAIC03MSwxMiArNzEsMTIgQEAKICAgLy8gICAgICAgIF4KICAgLy8gW2NmZV0gQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuCiAgIC8vICAgIF5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09OU1RfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vICAgICAgICAgICAgICAgICBeCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdGb28uYmFyLmJheicuCiAgIGNvbnN0IEZvby5iYXIuYmF6PGludD4oKTsKICAgLy8gICAgXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05TVF9XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgICBeXl4KICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLldST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UU19DT05TVFJVQ1RPUgogICAvLyBbY2ZlXSBBIGNvbnN0cnVjdG9yIGludm9jYXRpb24gY2FuJ3QgaGF2ZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY29uc3RydWN0b3IgbmFtZS4KQEAgLTEwNyw3ICsxMDcsNyBAQAogICAvLyAgXgogICAvLyBbY2ZlXSBBIGNvbnN0cnVjdG9yIGludm9jYXRpb24gY2FuJ3QgaGF2ZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY29uc3RydWN0b3IgbmFtZS4KIC8vXl5eXl5eXgotLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vICAgICAgICAgICBeCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdGb28uYmFyLmJheicuCiAgIEZvby5iYXIuYmF6PGludD4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9hYnN0cmFjdF9maWVsZHNfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2Fic3RyYWN0X2ZpZWxkc19lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3YjhjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9hYnN0cmFjdF9maWVsZHNfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gQ2hlY2sgdGhhdCBhYnN0cmFjdCBpbnN0YW5jZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIGFic3RyYWN0IGFuZAorLy8gZG8gbm90IGFsbG93IG1vcmUgdGhhbiB0aGV5IHNob3VsZC4KKworLy8gQ2hlY2sgdGhhdCBhYnN0cmFjdCBkZWNsYXJhdGlvbnMgYXJlIGFic3RyYWN0LgorY2xhc3MgQWJzdHJhY3QxIHsKKyAgLy8gVGhlIGNsYXNzIGlzIG5vdCBhYnN0cmFjdCBhbmQgZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgeGAuCisgIGFic3RyYWN0IGludCB4OworICAvLyAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CisKKy8vIENoZWNrIHRoYXQgY2xhc3MgaGFzIGV4cGVjdGVkIGludGVyZmFjZS4KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0MiB7CisgIC8vIEdldHRlciBvbmx5LgorICBhYnN0cmFjdCBmaW5hbCBpbnQgeDsKKyAgLy8gR2V0dGVyIGFuZCBzZXR0ZXIuCisgIGFic3RyYWN0IGNvdmFyaWFudCBTdHJpbmcgeTsKKworICBzdGF0aWMgdm9pZCBzdGF0aWNUZXN0KEFic3RyYWN0MiBhKSB7CisgICAgaW50IHggPSBhLng7CisKKyAgICAvLyBDYW5ub3QgYXNzaWduIHRvIGZpbmFsIGZpZWxkLgorICAgIGEueCA9IDQyOworICAgIC8vICBeCisgICAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgICBTdHJpbmcgeSA9IGEueTsKKyAgICBhLnkgPSAiYWIiOworCisgICAgLy8gQ2Fubm90IGFzc2lnbiBzb21ldGhpbmcgb2Ygd3JvbmcgdHlwZSwgZXZlbiBpZiBjb3ZhcmlhbnQuCisgICAgYS55ID0gT2JqZWN0KCk7CisgICAgLy8gICAgXl5eXl5eXl4KKyAgICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgICAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKyAgfQorCisgIHZvaWQgdGVzdCgpIHsKKyAgICBpbnQgeCA9IHRoaXMueDsKKworICAgIC8vIENhbm5vdCBhc3NpZ24gdG8gZmluYWwgZmllbGQuCisgICAgdGhpcy54ID0gNDI7CisgICAgLy8gICAgIF4KKyAgICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgICAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICAgIFN0cmluZyB5ID0gdGhpcy55OworICAgIHRoaXMueSA9ICJhYiI7CisKKyAgICAvLyBDYW5ub3QgYXNzaWduIHNvbWV0aGluZyBvZiB3cm9uZyB0eXBlLCBldmVuIGlmIGNvdmFyaWFudC4KKyAgICB0aGlzLnkgPSBPYmplY3QoKTsKKyAgICAvLyAgICAgICBeXl5eXl5eXgorICAgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorICB9Cit9CisKK2NsYXNzIENvbmNyZXRlMiBpbXBsZW1lbnRzIEFic3RyYWN0MiB7CisgIGZpbmFsIGludCB4OworICBTdHJpbmcgeTsKK30KKwordm9pZCBtYWluKCkgeworICBBYnN0cmFjdDIuc3RhdGljVGVzdCh0aHJvdyAwKTsKKyAgQ29uY3JldGUyKCkudGVzdCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2Fic3RyYWN0X2ZpZWxkc19zeW50YXhfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2Fic3RyYWN0X2ZpZWxkc19zeW50YXhfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTk4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvYWJzdHJhY3RfZmllbGRzX3N5bnRheF9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBDaGVjayB0aGF0IGFic3RyYWN0IGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhcmUgYWJzdHJhY3QgYW5kCisvLyBkbyBub3QgYWxsb3cgbW9yZSB0aGFuIHRoZXkgc2hvdWxkLgorCisvLyBUb3AtbGV2ZWwgZGVjbGFyYXRpb25zIGNhbm5vdCBiZSBhYnN0cmFjdC4KK2Fic3RyYWN0IGludCB0b3AwOyAvLyMgMTogc3ludGF4IGVycm9yCithYnN0cmFjdCB2YXIgdG9wMTsgLy8jIDI6IHN5bnRheCBlcnJvcgorYWJzdHJhY3QgZmluYWwgdG9wMjsgLy8jIDM6IHN5bnRheCBlcnJvcgorYWJzdHJhY3QgZmluYWwgaW50IHRvcDM7IC8vIyA0OiBzeW50YXggZXJyb3IKK2Fic3RyYWN0IGNvdmFyaWFudCBpbnQgdG9wNDsgLy8jIDU6IHN5bnRheCBlcnJvcgorYWJzdHJhY3QgY292YXJpYW50IHZhciB0b3A1OyAvLyMgNjogc3ludGF4IGVycm9yCisKKy8vIENoZWNrIHRoYXQgb25seSB0aGUgc3ludGFjdGljYWxseSBjb3JyZWN0IGRlY2xhcmF0aW9ucyBhcmUgYWxsb3dlZC4KK2Fic3RyYWN0IGNsYXNzIEMgeworICAvLyBBYnN0cmFjdCBmaWVsZHMgY2Fubm90IGhhdmUgaW5pdGlhbGl6ZXJzLgorICBhYnN0cmFjdCBpbnQgaW5pdDEgPSAwOyAvLyMgNzogc3ludGF4IGVycm9yCisKKyAgLy8gQWJzdHJhY3QgZmllbGRzIGNhbm5vdCBiZSBsYXRlLgorICBhYnN0cmFjdCBsYXRlIGludCBsYXRlMTsgLy8jIDg6IHN5bnRheCBlcnJvcgorCisgIC8vIEFic3RyYWN0IGZpZWxkcyBjYW5ub3QgYmUgbGF0ZSBhbmQgZmluYWwuCisgIGFic3RyYWN0IGxhdGUgZmluYWwgaW50IGxhdGUyOyAvLyMgOTogc3ludGF4IGVycm9yCisKKyAgLy8gQWJzdHJhY3QgZmllbGRzIGNhbm5vdCBiZSBzdGF0aWMuCisgIGFic3RyYWN0IHN0YXRpYyBpbnQgc3RhdGljMTsgLy8jIDEwOiBzeW50YXggZXJyb3IKKworICAvLy8gU3RhdGljIGZpZWxkcyBjYW5ub3QgYmUgYWJzdHJhY3QuCisgIHN0YXRpYyBhYnN0cmFjdCBpbnQgc3RhdGljMjsgLy8jIDExOiBzeW50YXggZXJyb3IKKworICAvLy8gQWJzdHJhY3QgZmllbGRzIGNhbm5vdCBiZSBjb25zdCAoYmVjYXVzZSBjb25zdCBmaWVsZHMgbXVzdCBiZSBzdGF0aWMpLgorICBhYnN0cmFjdCBjb25zdCBpbnQgY29uc3QxOyAvLyMgMTI6IHN5bnRheCBlcnJvcgorCisgIC8vLyBBYnN0cmFjdCBmaWVsZHMgY2Fubm90IGJlIHN0YXRpYyBjb25zdC4KKyAgYWJzdHJhY3Qgc3RhdGljIGNvbnN0IGludCBzdGF0aWNDb25zdDE7IC8vIyAxMzogc3ludGF4IGVycm9yCisKKyAgLy8gQWJzdHJhY3QgZmllbGRzIGNhbm5vdCBiZSBmaW5hbCBhbmQgY292YXJpYW50IChiZWNhdXNlIG5vIGRlY2xhcmF0aW9uIGNhbikuCisgIGFic3RyYWN0IGNvdmFyaWFudCBmaW5hbCBpbnQgY292YXJpYW50MTsgLy8jIDE0OiBzeW50YXggZXJyb3IKKworICAvLyBBYnN0cmFjdCBmaWVsZHMgY2Fubm90IGJlIGZpbmFsIGFuZCBjb3ZhcmlhbnQgKGJlY2F1c2Ugbm8gZGVjbGFyYXRpb24gY2FuKS4KKyAgYWJzdHJhY3QgZmluYWwgY292YXJpYW50IGludCBjb3ZhcmlhbnQyOyAvLyMgMTU6IHN5bnRheCBlcnJvcgorfQorCit2b2lkIG1haW4oKSB7CisgIC8vIE5vIGFic3RyYWN0IGxvY2FsIHZhcmlhYmxlcworICBhYnN0cmFjdCB2YXIgeDsgLy8jIDE2OiBzeW50YXggZXJyb3IKKworICAvLyBNYWtlIHN1cmUgYENgIGlzIGluIHVzZS4KKyAgcHJpbnQoQyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvYWJzdHJhY3RfZmllbGRzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9hYnN0cmFjdF9maWVsZHNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWNhNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvYWJzdHJhY3RfZmllbGRzX3Rlc3QuZGFydApAQCAtMCwwICsxLDE0MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLy8gQ2hlY2tzIHRoYXQgYWJzdHJhY3QgaW5zdGFuY2UgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFyZSBhbGxvd2VkLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gVmFsaWQgZGVjbGFyYXRpb25zIGZvciBhYnN0cmFjdCBjbGFzcy4KK2Fic3RyYWN0IGNsYXNzIEMgeworICBhYnN0cmFjdCBpbnQgeDEsIHgyOworICBhYnN0cmFjdCB2YXIgeTEsIHkyLCB5MzsgLy8gaW5mZXJzIGR5bmFtaWMuCisgIGFic3RyYWN0IGZpbmFsIHo7CisgIGFic3RyYWN0IGZpbmFsIGludCB1MSwgdTI7CisgIGFic3RyYWN0IGNvdmFyaWFudCBpbnQgdjEsIHYyLCB2MzsKKyAgYWJzdHJhY3QgY292YXJpYW50IHZhciB3OworfQorCitjbGFzcyBEIHsKKyAgaW50IHgxLCB4MjsKKyAgdmFyIHkxLCB5MiwgeTM7CisgIHZhciB6OworICBpbnQgdTEsIHUyOworICBjb3ZhcmlhbnQgaW50IHYxLCB2MiwgdjM7CisgIGNvdmFyaWFudCB2YXIgdzsKKyAgRCgpIDoKKyAgICAgIHgxID0gMCwKKyAgICAgIHgyID0gMCwKKyAgICAgIHkxID0gMSwKKyAgICAgIHkyID0gMSwKKyAgICAgIHkzID0gMSwKKyAgICAgIHogPSAyLAorICAgICAgdTEgPSAzLAorICAgICAgdTIgPSAzLAorICAgICAgdjEgPSA0LAorICAgICAgdjIgPSA0LAorICAgICAgdjMgPSA0LAorICAgICAgdyA9IDU7Cit9CisKKy8vLyBWYWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhYnN0cmFjdCBpbnRlcmZhY2UuCitjbGFzcyBFIGV4dGVuZHMgRCBpbXBsZW1lbnRzIEMge30KKworLy8gVmFsaWQgZGVjbGFyYXRpb25zIHdoZW4gc3VwZXJjbGFzcyBoYXMgaW1wbGVtZW50YXRpb24uCitjbGFzcyBGIGV4dGVuZHMgRCB7IC8vIENsYXNzIGlzIG5vdCBhYnN0cmFjdC4KKyAgYWJzdHJhY3QgaW50IHgxLCB4MjsKKyAgYWJzdHJhY3QgdmFyIHkxLCB5MiwgeTM7CisgIGFic3RyYWN0IGZpbmFsIHo7CisgIGFic3RyYWN0IGZpbmFsIGludCB1MSwgdTI7CisgIGFic3RyYWN0IGNvdmFyaWFudCBpbnQgdjEsIHYyLCB2MzsKKyAgYWJzdHJhY3QgY292YXJpYW50IHZhciB3OworfQorCisvLyBSZWNvcmRzIGFjY2Vzc2VzLgorY2xhc3MgTG9nZ2VyIHsKKyAgU3ltYm9sPyBsYXN0TmFtZTsKKyAgU3RyaW5nIF94ID0gIngiOworICBpbnQgX3kgPSAwOworICBTdHJpbmcgZ2V0IHggeworICAgIGxhc3ROYW1lID0gI3g7CisgICAgcmV0dXJuIF94OworICB9CisgIHNldCB4KFN0cmluZyB2YWx1ZSkgeworICAgIGxhc3ROYW1lID0gI3g7CisgICAgX3ggPSB2YWx1ZTsKKyAgfQorICBpbnQgZ2V0IHkgeworICAgIGxhc3ROYW1lID0gI3k7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2V0IHkoaW50IHZhbHVlKSB7CisgICAgbGFzdE5hbWUgPSAjeTsKKyAgICBfeSA9IHZhbHVlOworICB9Cit9CisKKy8vLyBDaGVjayB0aGF0IGFic3RyYWN0IGRlY2xhcmF0aW9ucyBkbyBub3Qgc2hhZG93IGltcGxlbWVudGF0aW9uLgorY2xhc3MgT3ZlcnJpZGUgZXh0ZW5kcyBMb2dnZXIgeworICBhYnN0cmFjdCBTdHJpbmcgeDsKKyAgYWJzdHJhY3QgZmluYWwgaW50IHk7Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgQyBjID0gRSgpOworICBFeHBlY3QuZXF1YWxzKDAsIGMueDEpOworICBFeHBlY3QuZXF1YWxzKDAsIGMueDIpOworICBFeHBlY3QuZXF1YWxzKDEsIGMueTEpOworICBFeHBlY3QuZXF1YWxzKDEsIGMueTIpOworICBFeHBlY3QuZXF1YWxzKDEsIGMueTMpOworICBFeHBlY3QuZXF1YWxzKDIsIGMueik7CisgIEV4cGVjdC5lcXVhbHMoMywgYy51MSk7CisgIEV4cGVjdC5lcXVhbHMoMywgYy51Mik7CisgIEV4cGVjdC5lcXVhbHMoNCwgYy52MSk7CisgIEV4cGVjdC5lcXVhbHMoNCwgYy52Mik7CisgIEV4cGVjdC5lcXVhbHMoNCwgYy52Myk7CisgIEV4cGVjdC5lcXVhbHMoNSwgYy53KTsKKyAgYy54MSA9IDY7CisgIEV4cGVjdC5lcXVhbHMoNiwgYy54MSk7CisgIGMueTIgPSA3OworICBFeHBlY3QuZXF1YWxzKDcsIGMueTIpOworICBjLnYzID0gODsKKyAgRXhwZWN0LmVxdWFscyg4LCBjLnYzKTsKKyAgYy53ID0gOTsKKyAgRXhwZWN0LmVxdWFscyg5LCBjLncpOworCisgIC8vIENsYXNzIEYgaXMgbm90IGFic3RyYWN0IGFuZCBjYW4gYmUgaW5zdGFudGlhdGVkLgorICBGIGYgPSBGKCk7CisgIEV4cGVjdC5lcXVhbHMoMCwgZi54MSk7CisgIEV4cGVjdC5lcXVhbHMoMCwgZi54Mik7CisgIEV4cGVjdC5lcXVhbHMoMSwgZi55MSk7CisgIEV4cGVjdC5lcXVhbHMoMSwgZi55Mik7CisgIEV4cGVjdC5lcXVhbHMoMSwgZi55Myk7CisgIEV4cGVjdC5lcXVhbHMoMiwgZi56KTsKKyAgRXhwZWN0LmVxdWFscygzLCBmLnUxKTsKKyAgRXhwZWN0LmVxdWFscygzLCBmLnUyKTsKKyAgRXhwZWN0LmVxdWFscyg0LCBmLnYxKTsKKyAgRXhwZWN0LmVxdWFscyg0LCBmLnYyKTsKKyAgRXhwZWN0LmVxdWFscyg0LCBmLnYzKTsKKyAgRXhwZWN0LmVxdWFscyg1LCBmLncpOworICBmLngxID0gNjsKKyAgRXhwZWN0LmVxdWFscyg2LCBmLngxKTsKKyAgZi55MiA9IDc7CisgIEV4cGVjdC5lcXVhbHMoNywgZi55Mik7CisgIGYudjMgPSA4OworICBFeHBlY3QuZXF1YWxzKDgsIGYudjMpOworICBmLncgPSA5OworICBFeHBlY3QuZXF1YWxzKDksIGYudyk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhYnN0cmFjdCBkZWNsYXJhdGlvbnMgZG8gbm90IHNoYWRvdyBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgorICBPdmVycmlkZSBvID0gT3ZlcnJpZGUoKTsKKyAgRXhwZWN0LmVxdWFscygieCIsIG8ueCk7CisgIEV4cGVjdC5lcXVhbHMoI3gsIG8ubGFzdE5hbWUpOworICBFeHBlY3QuZXF1YWxzKDAsIG8ueSk7CisgIEV4cGVjdC5lcXVhbHMoI3ksIG8ubGFzdE5hbWUpOworICBvLnggPSAiYiI7CisgIEV4cGVjdC5lcXVhbHMoI3gsIG8ubGFzdE5hbWUpOworICBvLnkgPSA0MjsKKyAgRXhwZWN0LmVxdWFscygjeSwgby5sYXN0TmFtZSk7CisgIEV4cGVjdC5lcXVhbHMoImIiLCBvLngpOworICBFeHBlY3QuZXF1YWxzKCN4LCBvLmxhc3ROYW1lKTsKKyAgRXhwZWN0LmVxdWFscyg0Miwgby55KTsKKyAgRXhwZWN0LmVxdWFscygjeSwgby5sYXN0TmFtZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvZXh0ZXJuYWxfZmllbGRzX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9leHRlcm5hbF9maWVsZHNfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGQ2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvZXh0ZXJuYWxfZmllbGRzX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIENoZWNrIHRoYXQgZXh0ZXJuYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGRvIG5vdCBhbGxvdyBtb3JlCisvLyB0aGFuIHRoZXkgc2hvdWxkLgorCisvLyBDaGVjayB0aGF0IGV4dGVybmFsIGRlY2xhcmF0aW9ucyBhcmUgbm90IGFic3RyYWN0LgorY2xhc3MgRXh0ZXJuYWwxIHsKKyAgZXh0ZXJuYWwgaW50IHg7Cit9CisKKy8vIENoZWNrIHRoYXQgY2xhc3MgaGFzIGV4cGVjdGVkIGludGVyZmFjZS4KK2NsYXNzIEV4dGVybmFsMiB7CisgIC8vIEdldHRlciBvbmx5LgorICBleHRlcm5hbCBmaW5hbCBpbnQgeDsKKyAgLy8gR2V0dGVyIGFuZCBzZXR0ZXIuCisgIGV4dGVybmFsIGNvdmFyaWFudCBTdHJpbmcgeTsKKworICBzdGF0aWMgdm9pZCB0ZXN0KEV4dGVybmFsMiBhKSB7CisgICAgaW50IHggPSBhLng7CisKKyAgICAvLyBDYW5ub3QgYXNzaWduIHRvIGZpbmFsIGZpZWxkLgorICAgIGEueCA9IDQyOworICAgIC8vICBeCisgICAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgICBTdHJpbmcgeSA9IGEueTsKKyAgICBhLnkgPSAiYWIiOworCisgICAgLy8gQ2Fubm90IGFzc2lnbiBzb21ldGhpbmcgb2Ygd3JvbmcgdHlwZSwgZXZlbiBpZiBjb3ZhcmlhbnQuCisgICAgYS55ID0gT2JqZWN0KCk7CisgICAgLy8gICAgXl5eXl5eXl4KKyAgICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgICAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKyAgfQorfQorCit2b2lkIG1haW4oKSB7CisgIEV4dGVybmFsMi50ZXN0KEV4dGVybmFsMigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9leHRlcm5hbF9maWVsZHNfc3ludGF4X2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL2V4dGVybmFsX2Fic3RyYWN0X2ZpZWxkcy9leHRlcm5hbF9maWVsZHNfc3ludGF4X2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUzNjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2V4dGVybmFsX2ZpZWxkc19zeW50YXhfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gQ2hlY2sgdGhhdCBleHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZG8gbm90IGFsbG93IG1vcmUKKy8vIHRoYW4gdGhleSBzaG91bGQuCisKKy8vIENoZWNrcyB0aGF0IG9ubHkgdGhlIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBkZWNsYXJhdGlvbnMgYXJlIGFsbG93ZWQuCisKKy8vIEV4dGVybmFsIHZhcmlhYmxlcyBtdXN0IG5vdCBoYXZlIGluaXRpYWxpemVycy4KK2V4dGVybmFsIHZhciB0b3BJbml0ID0gMDsgLy8jIDE6IHN5bnRheCBlcnJvcgorCisvLyBFeHRlcm5hbCB2YXJpYWJsZXMgbXVzdCBub3QgYmUgY29uc3QuCitleHRlcm5hbCBjb25zdCB0b3BDb25zdDsgLy8jIDI6IHN5bnRheCBlcnJvcgorCisvLyBFeHRlcm5hbCB2YXJpYWJsZXMgbXVzdCBub3QgaGF2ZSBiZSBsYXRlLgorZXh0ZXJuYWwgbGF0ZSB2YXIgdG9wTGF0ZTsgLy8jIDM6IHN5bnRheCBlcnJvcgorCisvLyBFeHRlcm5hbCB2YXJpYWJsZXMgbXVzdCBub3QgaGF2ZSBiZSBhYnN0cmFjdAorLy8gKGFuZCB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gbXVzdCBub3QgYmUgYWJzdHJhY3QpLgorZXh0ZXJuYWwgYWJzdHJhY3QgdmFyIHRvcEFic3RyYWN0MTsgLy8jIDQ6IHN5bnRheCBlcnJvcgorYWJzdHJhY3QgZXh0ZXJuYWwgdmFyIHRvcEFic3RyYWN0MjsgLy8jIDU6IHN5bnRheCBlcnJvcgorCitjbGFzcyBTdGF0aWNNZW1iZXJzIHsKKyAgLy8gRXh0ZXJuYWwgc3RhdGljIGZpZWxkcyBjYW5ub3QgaGF2ZSBpbml0aWFsaXplcnMuCisgIGV4dGVybmFsIHN0YXRpYyBpbnQgaW5pdDEgPSAwOyAvLyMgNjogc3ludGF4IGVycm9yCisKKyAgLy8gRXh0ZXJuYWwgc3RhdGljIGZpZWxkcyBjYW5ub3QgYmUgbGF0ZS4KKyAgZXh0ZXJuYWwgc3RhdGljIGxhdGUgaW50IGxhdGUxOyAvLyMgNzogc3ludGF4IGVycm9yCisKKyAgLy8gRXh0ZXJuYWwgc3RhdGljIGZpZWxkcyBjYW5ub3QgYmUgbGF0ZSBhbmQgZmluYWwuCisgIGV4dGVybmFsIHN0YXRpYyBsYXRlIGZpbmFsIGludCBsYXRlMjsgLy8jIDg6IHN5bnRheCBlcnJvcgorCisgIC8vIEV4dGVybmFsIHN0YXRpYyBmaWVsZHMgY2Fubm90IGJlIGNvbnN0LgorICBleHRlcm5hbCBzdGF0aWMgY29uc3QgaW50IGNvbnN0MTsgLy8jIDk6IHN5bnRheCBlcnJvcgorICBleHRlcm5hbCBzdGF0aWMgY29uc3QgaW50IGNvbnN0MSA9IDA7IC8vIyAxMDogc3ludGF4IGVycm9yCisKKyAgLy8gRXh0ZXJuYWwgc3RhdGljIGZpZWxkcyBjYW5ub3QgYmUgZmluYWwgYW5kIGNvdmFyaWFudC4KKyAgZXh0ZXJuYWwgc3RhdGljIGNvdmFyaWFudCBmaW5hbCBpbnQgY292YXJpYW50MTsgLy8jIDExOiBzeW50YXggZXJyb3IKKyAgZXh0ZXJuYWwgc3RhdGljIGZpbmFsIGNvdmFyaWFudCBpbnQgY292YXJpYW50MjsgLy8jIDEyOiBzeW50YXggZXJyb3IKKworICAvLyBFeHRlcm5hbCBzdGF0aWMgZmllbGRzIGNhbm5vdCBiZSBhYnN0cmFjdC4KKyAgZXh0ZXJuYWwgc3RhdGljIGFic3RyYWN0IGludCBhYnN0cmFjdDE7IC8vIyAxMzogc3ludGF4IGVycm9yCit9CisKK2NsYXNzIEluc3RhbmNlTWVtYmVycyB7CisgIC8vIEV4dGVybmFsIGZpZWxkcyBjYW5ub3QgaGF2ZSBpbml0aWFsaXplcnMuCisgIGV4dGVybmFsIGludCBpbml0MSA9IDA7IC8vIyAxNDogc3ludGF4IGVycm9yCisKKyAgLy8gRXh0ZXJuYWwgZmllbGRzIGNhbm5vdCBiZSBsYXRlLgorICBleHRlcm5hbCBsYXRlIGludCBsYXRlMTsgLy8jIDE1OiBzeW50YXggZXJyb3IKKworICAvLyBFeHRlcm5hbCBmaWVsZHMgY2Fubm90IGJlIGxhdGUgYW5kIGZpbmFsLgorICBleHRlcm5hbCBsYXRlIGZpbmFsIGludCBsYXRlMjsgLy8jIDE2OiBzeW50YXggZXJyb3IKKworICAvLyBFeHRlcm5hbCBmaWVsZHMgY2Fubm90IGJlIGNvbnN0LgorICBleHRlcm5hbCBjb25zdCBpbnQgY29uc3QxOyAvLyMgMTc6IHN5bnRheCBlcnJvcgorCisgIC8vIEV4dGVybmFsIGZpZWxkcyBjYW5ub3QgYmUgZmluYWwgYW5kIGNvdmFyaWFudC4KKyAgZXh0ZXJuYWwgY292YXJpYW50IGZpbmFsIGludCBjb3ZhcmlhbnQxOyAvLyMgMTg6IHN5bnRheCBlcnJvcgorICBleHRlcm5hbCBmaW5hbCBjb3ZhcmlhbnQgaW50IGNvdmFyaWFudDI7IC8vIyAxOTogc3ludGF4IGVycm9yCisKKyAgLy8gRXh0ZXJuYWwgZmllbGRzIGNhbm5vdCBiZSBhYnN0cmFjdC4KKyAgZXh0ZXJuYWwgYWJzdHJhY3QgaW50IGFic3RyYWN0MTsgLy8jIDIwOiBzeW50YXggZXJyb3IKKyAgYWJzdHJhY3QgZXh0ZXJuYWwgaW50IGFic3RyYWN0MjsgLy8jIDIxOiBzeW50YXggZXJyb3IKK30KKwordm9pZCBtYWluKCkgeworICAvLyBObyBleHRlcm5hbCBsb2NhbCB2YXJpYWJsZXMKKyAgZXh0ZXJuYWwgdmFyIHg7IC8vIyAyMjogc3ludGF4IGVycm9yCisKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUgaW4gdXNlLgorICBMaXN0IF8gPSBbCisgICAgU3RhdGljTWVtYmVycy5pbml0MSwgLy8jIDY6IGNvbnRpbnVlZAorICAgIFN0YXRpY01lbWJlcnMubGF0ZTEsIC8vIyA3OiBjb250aW51ZWQKKyAgICBTdGF0aWNNZW1iZXJzLmxhdGUyLCAvLyMgODogY29udGludWVkCisgICAgU3RhdGljTWVtYmVycy5jb25zdDEsIC8vIyA5OiBjb250aW51ZWQKKyAgICBTdGF0aWNNZW1iZXJzLmNvdmFyaWFudDEsIC8vIyAxMDogY29udGludWVkCisgICAgU3RhdGljTWVtYmVycy5jb3ZhcmlhbnQyLCAvLyMgMTE6IGNvbnRpbnVlZAorICAgIFN0YXRpY01lbWJlcnMuYWJzdHJhY3QxLCAvLyMgMTI6IGNvbnRpbnVlZAorICAgIEluc3RhbmNlTWVtYmVycygpLAorICBdOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2V4dGVybmFsX2ZpZWxkc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9leHRlcm5hbF9hYnN0cmFjdF9maWVsZHMvZXh0ZXJuYWxfZmllbGRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU3OTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvZXh0ZXJuYWxfYWJzdHJhY3RfZmllbGRzL2V4dGVybmFsX2ZpZWxkc190ZXN0LmRhcnQKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBDaGVja3MgdGhhdCBleHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIGFsbG93ZWQuCisvLyBDYW4gb25seSBiZSBzdGF0aWNhbGx5IGNoZWNrZWQsIHRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIGF0IHJ1bi10aW1lLgorCisvLyBFeHRlcm5hbCB2YXJpYWJsZXMgY2Fubm90IGJlIGFic3RyYWN0LCBjb25zdCwgbGF0ZSBvciBoYXZlIGFuIGluaXRpYWxpemVyLgorCitleHRlcm5hbCB2YXIgdG9wMTsKK2V4dGVybmFsIGZpbmFsIHRvcDI7CitleHRlcm5hbCBpbnQgdG9wMzsKK2V4dGVybmFsIGZpbmFsIGJvb2wgdG9wNDsKKworLy8vIENsYXNzIEMgaXMgbm90IGFic3RyYWN0LgorY2xhc3MgQyB7CisgIGV4dGVybmFsIHN0YXRpYyB2YXIgc3RhdGljMTsKKyAgZXh0ZXJuYWwgc3RhdGljIGZpbmFsIHN0YXRpYzI7CisgIGV4dGVybmFsIHN0YXRpYyBpbnQgc3RhdGljMzsKKyAgZXh0ZXJuYWwgc3RhdGljIGZpbmFsIGJvb2wgc3RhdGljNDsKKworICBleHRlcm5hbCB2YXIgaW5zdGFuY2UxOworICBleHRlcm5hbCBmaW5hbCBpbnN0YW5jZTI7CisgIGV4dGVybmFsIGludCBpbnN0YW5jZTM7CisgIGV4dGVybmFsIGZpbmFsIGJvb2wgaW5zdGFuY2U0OworICBleHRlcm5hbCBjb3ZhcmlhbnQgdmFyIGluc3RhbmNlNTsKKyAgZXh0ZXJuYWwgY292YXJpYW50IG51bSBpbnN0YW5jZTY7Cit9CisKK2NsYXNzIEQgZXh0ZW5kcyBDIHsKKyAgLy8gVmFsaWQgb3ZlcnJpZGUuIEluaGVyaXRzIGNvdmFyaWFuY2UuCisgIGV4dGVybmFsIGludCBpbnN0YW5jZTY7Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgdG9wMTsKKyAgdG9wMSA9IDA7CisgIHRvcDI7CisgIHRvcDM7CisgIHRvcDMgPSAwOworICB0b3A0OworCisgIEMuc3RhdGljMTsKKyAgQy5zdGF0aWMxID0gMDsKKyAgQy5zdGF0aWMyOworICBDLnN0YXRpYzM7CisgIEMuc3RhdGljMyA9IDA7CisgIEMuc3RhdGljNDsKKworICBDIGMgPSBDKCk7CisgIGMuaW5zdGFuY2UxOworICBjLmluc3RhbmNlMSA9IDA7CisgIGMuaW5zdGFuY2UyOworICBjLmluc3RhbmNlMzsKKyAgYy5pbnN0YW5jZTMgPSAwOworICBjLmluc3RhbmNlNDsKKyAgYy5pbnN0YW5jZTU7CisgIGMuaW5zdGFuY2U1ID0gMDsKKyAgYy5pbnN0YW5jZTY7CisgIGMuaW5zdGFuY2U2ID0gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2ZpZWxkL292ZXJyaWRlX29wdGltaXphdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9maWVsZC9vdmVycmlkZV9vcHRpbWl6YXRpb25fdGVzdC5kYXJ0CmluZGV4IDgzYWQ4MWUuLjE3ZTEwMTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL2ZpZWxkL292ZXJyaWRlX29wdGltaXphdGlvbl90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvZmllbGQvb3ZlcnJpZGVfb3B0aW1pemF0aW9uX3Rlc3QuZGFydApAQCAtMywxMiArMyw5IEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCI7CiAKIGNsYXNzIEEgewotICBAdmlydHVhbAogICBmaW5hbCBkeW5hbWljIGZsYWcgPSB0cnVlOwotICBAdmlydHVhbAogICBmaW5hbCBkeW5hbWljIHggPSA0MjsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvZ2VuZXJpYy9pbnN0YW50aWF0ZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL2dlbmVyaWMvaW5zdGFudGlhdGVfdHlwZV92YXJpYWJsZV90ZXN0LmRhcnQKaW5kZXggZjhkZjQ4OS4uZTAzYzQ5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvZ2VuZXJpYy9pbnN0YW50aWF0ZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9nZW5lcmljL2luc3RhbnRpYXRlX3R5cGVfdmFyaWFibGVfdGVzdC5kYXJ0CkBAIC05LDcgKzksNyBAQAogICBkeW5hbWljIG1ha2UoKSB7CiAgICAgcmV0dXJuIG5ldyBUKCk7CiAgICAgLy8gICAgICAgICBeCi0gICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdUJy4KICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvaW1wbGljaXRfZG93bmNhc3RfZHVyaW5nL3JldHVybl9hc3luY190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9pbXBsaWNpdF9kb3duY2FzdF9kdXJpbmcvcmV0dXJuX2FzeW5jX3Rlc3QuZGFydAppbmRleCBhZWE4YzYxLi5hOTc2ZDFlIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9pbXBsaWNpdF9kb3duY2FzdF9kdXJpbmcvcmV0dXJuX2FzeW5jX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9pbXBsaWNpdF9kb3duY2FzdF9kdXJpbmcvcmV0dXJuX2FzeW5jX3Rlc3QuZGFydApAQCAtMTMsMTQgKzEzLDE0IEBACiAgIC8vICAgICBeXl5eXl5eXl5eXl5eXl5eCiAgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5SRVRVUk5fT0ZfSU5WQUxJRF9UWVBFCiAgIC8vICAgICAgIF4KLSAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8QT4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Qj4nLgorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0Z1dHVyZU9yPEE+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0InLgogfQogCiBGdXR1cmU8Qj4gZjIoQSBhKSBhc3luYyA9PiBhIGFzIEZ1dHVyZU9yPEE+OwogLy8gICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXgogLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLlJFVFVSTl9PRl9JTlZBTElEX1RZUEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmU8QT4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRnV0dXJlT3I8Qj4nLgorLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdGdXR1cmVPcjxBPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdCJy4KIAogbWFpbigpIGFzeW5jIHsKICAgT2JqZWN0IGI7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjZfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvaW52YWxpZF9yZXR1cm5zL2FzeW5jX2ludmFsaWRfcmV0dXJuXzI2X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTlkNjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvaW52YWxpZF9yZXR1cm5zL2FzeW5jX2ludmFsaWRfcmV0dXJuXzI2X3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8qIGByZXR1cm4gZXhwO2Agd2hlcmUgYGV4cGAgaGFzIHN0YXRpYyB0eXBlIGBTYCBpcyBhbiBlcnJvciBpZiB0aGUgZnV0dXJlCisgKiB2YWx1ZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpcyBuZWl0aGVyIGB2b2lkYCBub3IgYGR5bmFtaWNgLAorICogYW5kIGBmbGF0dGVuKFMpYCBpcyBgdm9pZGAgb3IgYHZvaWQqYC4KKyAqCisgKiBXaXRoIG51bGwtc2FmZXR5LCB0aGlzIGlzIGFuIGVycm9yIGJlY2F1c2Ugb2YgdGhlIGRvd25jYXN0IGFuZCB0aGUgdXNlIG9mCisgKiBhbiBleHByZXNzaW9uIG9mIHR5cGUgYHZvaWRgLgorICovCisKK3ZvaWQgdiA9IG51bGw7CisKK0Z1dHVyZTxpbnQ+IHRlc3QoKSBhc3luYyB7CisgIHJldHVybiB2OworICAvLyAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuUkVUVVJOX09GX0lOVkFMSURfVFlQRQorICAvLyBbY2ZlXSBUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLgorfQorCit2b2lkIG1haW4oKSB7CisgIHRlc3QoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2ludmFsaWRfcmV0dXJucy9hc3luY19pbnZhbGlkX3JldHVybl8yN190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmZhYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLyogYHJldHVybiBleHA7YCB3aGVyZSBgZXhwYCBoYXMgc3RhdGljIHR5cGUgYFNgIGlzIGFuIGVycm9yIGlmIHRoZSBmdXR1cmUKKyAqIHZhbHVlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIG5laXRoZXIgYHZvaWRgIG5vciBgZHluYW1pY2AsCisgKiBhbmQgYGZsYXR0ZW4oUylgIGlzIGB2b2lkYCBvciBgdm9pZCpgLgorICoKKyAqIFdpdGggbnVsbC1zYWZldHksIHRoaXMgaXMgYW4gZXJyb3IgYmVjYXVzZSBvZiB0aGUgZG93bmNhc3QuCisgKi8KKworRnV0dXJlPHZvaWQ+IHYgPSBGdXR1cmUudmFsdWUobnVsbCk7CisKK0Z1dHVyZTxpbnQ+IHRlc3QoKSBhc3luYyB7CisgIHJldHVybiB2OworICAvLyAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuUkVUVVJOX09GX0lOVkFMSURfVFlQRQorICAvLyBbY2ZlXSBUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLgorfQorCit2b2lkIG1haW4oKSB7CisgIHRlc3QoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2ludmFsaWRfcmV0dXJucy9hc3luY19pbnZhbGlkX3JldHVybl8yOF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjhfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmIxMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLyogYHJldHVybiBleHA7YCB3aGVyZSBgZXhwYCBoYXMgc3RhdGljIHR5cGUgYFNgIGlzIGFuIGVycm9yIGlmIHRoZSBmdXR1cmUKKyAqIHZhbHVlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIG5laXRoZXIgYHZvaWRgIG5vciBgZHluYW1pY2AsCisgKiBhbmQgYGZsYXR0ZW4oUylgIGlzIGB2b2lkYCBvciBgdm9pZCpgLgorICoKKyAqIFdpdGggbnVsbC1zYWZldHksIHRoaXMgaXMgYW4gZXJyb3IgYmVjYXVzZSBvZiB0aGUgZG93bmNhc3QuCisgKi8KKworRnV0dXJlT3I8dm9pZD4gdiA9IG51bGw7CisKK0Z1dHVyZTxpbnQ+IHRlc3QoKSBhc3luYyB7CisgIHJldHVybiB2OworICAvLyAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuUkVUVVJOX09GX0lOVkFMSURfVFlQRQorICAvLyBbY2ZlXSBUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLgorfQorCit2b2lkIG1haW4oKSB7CisgIHRlc3QoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2ludmFsaWRfcmV0dXJucy9hc3luY19pbnZhbGlkX3JldHVybl8yOV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGE5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMjlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLyogYHJldHVybiBleHA7YCB3aGVyZSBgZXhwYCBoYXMgc3RhdGljIHR5cGUgYFNgIGlzIGFuIGVycm9yIGlmIHRoZSBmdXR1cmUKKyAqIHZhbHVlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIG5laXRoZXIgYHZvaWRgIG5vciBgZHluYW1pY2AsCisgKiBhbmQgYGZsYXR0ZW4oUylgIGlzIGB2b2lkYCBvciBgdm9pZCpgLgorICoKKyAqIFdpdGggbnVsbC1zYWZldHksIHRoaXMgaXMgYW4gZXJyb3IgYmVjYXVzZSBvZiB0aGUgZG93bmNhc3QgYW5kIHRoZSB1c2Ugb2YKKyAqIGFuIGV4cHJlc3Npb24gb2YgdHlwZSBgdm9pZGAuCisgKi8KKwordm9pZCB2ID0gbnVsbDsKKworRnV0dXJlT3I8aW50PiB0ZXN0KCkgYXN5bmMgeworICByZXR1cm4gdjsKKyAgLy8gICAgIF4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLlJFVFVSTl9PRl9JTlZBTElEX1RZUEUKKyAgLy8gW2NmZV0gVGhpcyBleHByZXNzaW9uIGhhcyB0eXBlICd2b2lkJyBhbmQgY2FuJ3QgYmUgdXNlZC4KK30KKwordm9pZCBtYWluKCkgeworICB0ZXN0KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMzBfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvaW52YWxpZF9yZXR1cm5zL2FzeW5jX2ludmFsaWRfcmV0dXJuXzMwX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDVmNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvaW52YWxpZF9yZXR1cm5zL2FzeW5jX2ludmFsaWRfcmV0dXJuXzMwX3Rlc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8qIGByZXR1cm4gZXhwO2Agd2hlcmUgYGV4cGAgaGFzIHN0YXRpYyB0eXBlIGBTYCBpcyBhbiBlcnJvciBpZiB0aGUgZnV0dXJlCisgKiB2YWx1ZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpcyBuZWl0aGVyIGB2b2lkYCBub3IgYGR5bmFtaWNgLAorICogYW5kIGBmbGF0dGVuKFMpYCBpcyBgdm9pZGAgb3IgYHZvaWQqYC4KKyAqCisgKiBXaXRoIG51bGwtc2FmZXR5LCB0aGlzIGlzIGFuIGVycm9yIGJlY2F1c2Ugb2YgdGhlIGRvd25jYXN0LgorICovCisKK0Z1dHVyZTx2b2lkPiB2ID0gRnV0dXJlLnZhbHVlKG51bGwpOworCitGdXR1cmVPcjxpbnQ+IHRlc3QoKSBhc3luYyB7CisgIHJldHVybiB2OworICAvLyAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuUkVUVVJOX09GX0lOVkFMSURfVFlQRQorICAvLyBbY2ZlXSBUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgJ3ZvaWQnIGFuZCBjYW4ndCBiZSB1c2VkLgorfQorCit2b2lkIG1haW4oKSB7CisgIHRlc3QoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2ludmFsaWRfcmV0dXJucy9hc3luY19pbnZhbGlkX3JldHVybl8zMV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMzFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWFjNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9pbnZhbGlkX3JldHVybnMvYXN5bmNfaW52YWxpZF9yZXR1cm5fMzFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLyogYHJldHVybiBleHA7YCB3aGVyZSBgZXhwYCBoYXMgc3RhdGljIHR5cGUgYFNgIGlzIGFuIGVycm9yIGlmIHRoZSBmdXR1cmUKKyAqIHZhbHVlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIG5laXRoZXIgYHZvaWRgIG5vciBgZHluYW1pY2AsCisgKiBhbmQgYGZsYXR0ZW4oUylgIGlzIGB2b2lkYCBvciBgdm9pZCpgLgorICoKKyAqIFdpdGggbnVsbC1zYWZldHksIHRoaXMgaXMgYW4gZXJyb3IgYmVjYXVzZSBvZiB0aGUgZG93bmNhc3QuCisgKi8KKworRnV0dXJlT3I8dm9pZD4gdiA9IG51bGw7CisKK0Z1dHVyZU9yPGludD4gdGVzdCgpIGFzeW5jIHsKKyAgcmV0dXJuIHY7CisgIC8vICAgICBeCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5SRVRVUk5fT0ZfSU5WQUxJRF9UWVBFCisgIC8vIFtjZmVdIFRoaXMgZXhwcmVzc2lvbiBoYXMgdHlwZSAndm9pZCcgYW5kIGNhbid0IGJlIHVzZWQuCit9CisKK3ZvaWQgbWFpbigpIHsKKyAgdGVzdCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvbWFsZm9ybWVkL21hbGZvcm1lZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9tYWxmb3JtZWQvbWFsZm9ybWVkX3Rlc3QuZGFydAppbmRleCA0YjM1NjE1Li41NGI2YTdjIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9tYWxmb3JtZWQvbWFsZm9ybWVkX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9tYWxmb3JtZWQvbWFsZm9ybWVkX3Rlc3QuZGFydApAQCAtMTA1LDExICsxMDUsMTEgQEAKIAogICBuZXcgdW5kZWNsYXJlZF9wcmVmaXguVW5yZXNvbHZlZCgpOwogICAvLyAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAndW5kZWNsYXJlZF9wcmVmaXguVW5yZXNvbHZlZCcuCiAgIG5ldyB1bmRlY2xhcmVkX3ByZWZpeC5VbnJlc29sdmVkPGludD4oKTsKICAgLy8gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3VuZGVjbGFyZWRfcHJlZml4LlVucmVzb2x2ZWQnLgogCiAgIHRyeSB7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9tZXRob2Qvbm90X2ZvdW5kX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL21ldGhvZC9ub3RfZm91bmRfdGVzdC5kYXJ0CmluZGV4IDFlYWVhMjYuLjQ3NTVjYmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL21ldGhvZC9ub3RfZm91bmRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL21ldGhvZC9ub3RfZm91bmRfdGVzdC5kYXJ0CkBAIC0xMyw3ICsxMyw3IEBACiAgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLklNUExJQ0lUX1RISVNfUkVGRVJFTkNFX0lOX0lOSVRJQUxJWkVSCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdCJy4KICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgotICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05TVF9XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gQ2FuJ3QgYWNjZXNzICd0aGlzJyBpbiBhIGZpZWxkIGluaXRpYWxpemVyIHRvIHJlYWQgJ0InLgogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9uZXcvY3JlYXRlX3VucmVzb2x2ZWRfdHlwZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9uZXcvY3JlYXRlX3VucmVzb2x2ZWRfdHlwZV90ZXN0LmRhcnQKaW5kZXggYjFjZTU2MC4uNmQyMTVhYiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvbmV3L2NyZWF0ZV91bnJlc29sdmVkX3R5cGVfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL25ldy9jcmVhdGVfdW5yZXNvbHZlZF90eXBlX3Rlc3QuZGFydApAQCAtNSw2ICs1LDYgQEAKIG1haW4oKSB7CiAgIG5ldyBGPGludD4oKTsKICAgLy8gIF4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0YnLgogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvbmV3L2V4cHJlc3Npb25fdHlwZV9hcmdzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25ldy9leHByZXNzaW9uX3R5cGVfYXJnc190ZXN0LmRhcnQKaW5kZXggZGViZjI0OC4uYjMyZjBlMSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvbmV3L2V4cHJlc3Npb25fdHlwZV9hcmdzX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9uZXcvZXhwcmVzc2lvbl90eXBlX2FyZ3NfdGVzdC5kYXJ0CkBAIC03LDExICs3LDExIEBACiAgIC8vIENhbid0IGluc3RhbnRpYXRlIHR5cGUgcGFyYW1ldGVyICh3aXRoaW4gc3RhdGljIG9yIGluc3RhbmNlIG1ldGhvZCkuCiAgIG0xKCkgPT4gbmV3IFQoKTsKICAgLy8gICAgICAgICAgXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnVCcuCiAgIHN0YXRpYyBtMigpID0+IG5ldyBUKCk7CiAgIC8vICAgICAgICAgICAgICAgICBeCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdUJy4KICAgLy8gICAgICAgICAgICAgICAgIF4KICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvbmV3L3ByZWZpeF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9uZXcvcHJlZml4X3Rlc3QuZGFydAppbmRleCA3Mjc5NGM4Li5iZWYwZDY5IDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9uZXcvcHJlZml4X3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9uZXcvcHJlZml4X3Rlc3QuZGFydApAQCAtNyw2ICs3LDYgQEAKIG1haW4oKSB7CiAgIHJldHVybiBuZXcgcHJlZml4KCk7CiAgIC8vICAgICAgICAgXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdwcmVmaXgnLgogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2FsaWFzZWRfY3ljbGljX3N1cGVyY2xhc3NfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2FsaWFzZWRfY3ljbGljX3N1cGVyY2xhc3NfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDBmMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvYWxpYXNlZF9jeWNsaWNfc3VwZXJjbGFzc19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK3R5cGVkZWYgVCA9IEM7CisKK2NsYXNzIEMgZXh0ZW5kcyBUIHt9CisvLyAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCittYWluKCkgPT4gQygpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfYWxpYXNlZF9zdXBlcnR5cGVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfYWxpYXNlZF9zdXBlcnR5cGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZWQ1NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY19hbGlhc2VkX3N1cGVydHlwZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2NsYXNzIEE8WD4ge30KKwordHlwZWRlZiBBMTxZPiA9IEE8WT47Cit0eXBlZGVmIEEyPFUsIFo+ID0gQTE8QTxaPj47Cit0eXBlZGVmIEEzPFc+ID0gQTI8aW50LCBBPFc+PjsKKworY2xhc3MgQiBleHRlbmRzIEEzPEI+IHt9CisKK3ZvaWQgZihBPEE8QTxCPj4+IGEpIHt9CisKK3ZvaWQgbWFpbigpIHsKKyAgZihCKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfY2xhc3NfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfY2xhc3NfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWMzNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9jbGFzc19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK2NsYXNzIEE8WD4geworICBBKCk7CisgIEEubmFtZWQoKTsKKyAgc3RhdGljIHZvaWQgc3RhdGljTWV0aG9kPFk+KCkge30KK30KKwordHlwZWRlZiBUPFg+ID0gQTxYPjsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK2Fic3RyYWN0IGNsYXNzIEMge30KKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVDxpbnQ+IHt9CisvLyAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBENCA9IEMgd2l0aCBUPHZvaWQ+OworLy8gICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworbWFpbigpIHsKKyAgVDxMaXN0PExpc3Q8TGlzdDxMaXN0Pj4+Pi5zdGF0aWNNZXRob2Q8VDxpbnQ+PigpOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfY2xhc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfY2xhc3NfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2NkN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9jbGFzc190ZXN0LmRhcnQKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK2NsYXNzIEE8WD4geworICBBKCk7CisgIEEubmFtZWQoKTsKKyAgc3RhdGljIHZvaWQgc3RhdGljTWV0aG9kPFk+KCkge30KK30KKwordHlwZWRlZiBUPFg+ID0gQTxYPjsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q8aW50Pj8gdjE7CitMaXN0PFQ8dm9pZD4+IHYyID0gW107CitmaW5hbCBUPFN0cmluZz4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworY29uc3QgTGlzdDxUPEM+PiB2NCA9IFtdOworY29uc3QgdjUgPSA8VHlwZSwgVHlwZT57VDogVH07CisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBzdGF0aWMgVDxDPj8gdjE7CisgIHN0YXRpYyBMaXN0PFQ8VD4+IHYyID0gW107CisgIHN0YXRpYyBmaW5hbCBUPE51bGw+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKKyAgc3RhdGljIGNvbnN0IExpc3Q8VDxMaXN0Pj4gdjQgPSBbXTsKKworICBUPEM+PyB2NTsKKyAgTGlzdDxUPFQ+PiB2NiA9IFtdOworICBmaW5hbCBUPE51bGw+IHY3OworCisgIEMoKTogdjcgPSBUPE51bGw+KCk7CisgIEMubmFtZTEodGhpcy52NSwgdGhpcy52Nyk7CisgIGZhY3RvcnkgQy5uYW1lMihUPEM+IGFyZzEsIFQ8TnVsbD4gYXJnMikgPSBDLm5hbWUxOworCisgIFQ8ZG91YmxlPiBvcGVyYXRvciArKFQ8ZG91YmxlPiBvdGhlcik7CisgIFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiBnZXQgZzsKKyAgc2V0IGcoVDxGdXR1cmVPcjxGdXR1cmVPcjx2b2lkPj4+IHZhbHVlKTsKKyAgTWFwPFQ8Qz4sIFQ8Qz4+IG0xKGNvdmFyaWFudCBUPEM+IGFyZzEsIFtTZXQ8U2V0PFQ8Qz4+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgTWFwPFQsIFQ+IGFyZzIoVCBGdW5jdGlvbihUKSBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworY2xhc3MgRDE8WD4gZXh0ZW5kcyBUPFg+IHt9CithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VD4ge30KKworZXh0ZW5zaW9uIEUgb24gVDxkeW5hbWljPiB7CisgIFQ8ZHluYW1pYz4gZm9vKFQ8ZHluYW1pYz4gdCkgPT4gdDsKK30KKworWCBmb288WD4oWCB4KSA9PiB4OworCitUPE9iamVjdD4gRnVuY3Rpb24oVDxPYmplY3Q+KSBpZCA9ICh4KSA9PiB4OworCittYWluKCkgeworICB2YXIgdjggPSA8VDxDPj5bXTsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2YXIgdjEwID0ge3Y4fTsKKyAgdjlbe31dID0ge1Q8VD4oKX07CisgIFNldDxMaXN0PFQ8Qz4+PiB2MTEgPSB2MTA7CisgIHYxMCA9IHYxMTsKKyAgVDxOdWxsPigpOworICBUPE51bGw+Lm5hbWVkKCk7CisgIFQ8T2JqZWN0PiB2MTIgPSBmb288VDxib29sPj4oVDxib29sPigpKTsKKyAgaWQodjEyKTsKKyAgVC5zdGF0aWNNZXRob2Q8VDxpbnQ+PigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZHluYW1pY19lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9keW5hbWljX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDcwMGQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZHluYW1pY19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVDxYPiA9IGR5bmFtaWM7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgZmluYWwgVDxOdWxsPiB2NzsKKworICBDKCk6IHY3ID0gVCgpOworICAvLyAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CisKK2NsYXNzIEQxPFg+IGV4dGVuZHMgVDxYPiB7fQorLy8gICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVDxpbnQ+IHt9CisvLyAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VD4ge30KKy8vICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ8dm9pZD47CisvLyAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2OSA9IDxTZXQ8VDxUPj4sIFNldDxUPFQ+Pj57e306IHt9fTsKKyAgdjlbe31dID0ge1Q8VD4oKX07CisgIC8vICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE51bGw+KCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxOdWxsPi5uYW1lZCgpOworLy9eCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8T2JqZWN0PiB2MTIgPSBmb288VDxib29sPj4oVDxib29sPigpKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPExpc3Q8TGlzdDxMaXN0PExpc3Q+Pj4+LnN0YXRpY01ldGhvZDxUPGludD4+KCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9keW5hbWljX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX2R5bmFtaWNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzUzZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9keW5hbWljX3Rlc3QuZGFydApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUPFg+ID0gZHluYW1pYzsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q8aW50Pj8gdjE7CitMaXN0PFQ8dm9pZD4+IHYyID0gW107CitmaW5hbCBUPFN0cmluZz4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworY29uc3QgTGlzdDxUPEM+PiB2NCA9IFtdOworY29uc3QgdjUgPSA8VHlwZSwgVHlwZT57VDogVH07CisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBzdGF0aWMgVDxDPj8gdjE7CisgIHN0YXRpYyBMaXN0PFQ8VD4+IHYyID0gW107CisgIHN0YXRpYyBmaW5hbCBUPE51bGw+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKKyAgc3RhdGljIGNvbnN0IExpc3Q8VDxMaXN0Pj4gdjQgPSBbXTsKKworICBUPEM+PyB2NTsKKyAgTGlzdDxUPFQ+PiB2NiA9IFtdOworICBmaW5hbCBUPE51bGw+IHY3OworCisgIEMubmFtZTEodGhpcy52NSwgdGhpcy52Nyk7CisgIGZhY3RvcnkgQy5uYW1lMihUPEM+IGFyZzEsIFQ8TnVsbD4gYXJnMikgPSBDLm5hbWUxOworCisgIFQ8ZG91YmxlPiBvcGVyYXRvciArKFQ8ZG91YmxlPiBvdGhlcik7CisgIFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiBnZXQgZzsKKyAgc2V0IGcoVDxGdXR1cmVPcjxGdXR1cmVPcjx2b2lkPj4+IHZhbHVlKTsKKyAgTWFwPFQ8Qz4sIFQ8Qz4+IG0xKGNvdmFyaWFudCBUPEM+IGFyZzEsIFtTZXQ8U2V0PFQ8Qz4+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgTWFwPFQsIFQ+IGFyZzIoVCBGdW5jdGlvbihUKSBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworZXh0ZW5zaW9uIEUgb24gVDxkeW5hbWljPiB7CisgIFQ8ZHluYW1pYz4gZm9vKFQ8ZHluYW1pYz4gdCkgPT4gdDsKK30KKworWCBmb288WD4oWCB4KSA9PiB4OworCitUPFR5cGU+IEZ1bmN0aW9uKFQ8VHlwZT4pPyBpZDsKKworbWFpbigpIHsKKyAgdmFyIHY4ID0gPFQ8Qz4+W107CisgIHZhciB2OSA9IDxTZXQ8VDxUPj4sIFNldDxUPFQ+Pj57e306IHt9fTsKKyAgdmFyIHYxMCA9IHt2OH07CisgIHY5W3t9XSA9IHt9OworICBTZXQ8TGlzdDxUPEM+Pj4gdjExID0gdjEwOworICB2MTAgPSB2MTE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdW5jdGlvbl9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdW5jdGlvbl9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MWQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX2Z1bmN0aW9uX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUPFg+ID0gRnVuY3Rpb247CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgZmluYWwgVDxOdWxsPiB2NzsKKworICBDKCk6IHY3ID0gVCgpOworICAvLyAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2OVt7fV0gPSB7VDxUPigpfTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8TnVsbD4oKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE51bGw+Lm5hbWVkKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxPYmplY3Q+IHYxMiA9IGZvbzxUPGJvb2w+PihUPGJvb2w+KCkpOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8TGlzdDxMaXN0PExpc3Q8TGlzdD4+Pj4uc3RhdGljTWV0aG9kPFQ8aW50Pj4oKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZnVuY3Rpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZnVuY3Rpb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDUzMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdW5jdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVDxYPiA9IEZ1bmN0aW9uOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworVDxpbnQ+PyB2MTsKK0xpc3Q8VDx2b2lkPj4gdjIgPSBbXTsKK2ZpbmFsIFQ8U3RyaW5nPiB2MyA9IHRocm93ICJBbnl0aGluZyI7Citjb25zdCBMaXN0PFQ8Qz4+IHY0ID0gW107Citjb25zdCB2NSA9IDxUeXBlLCBUeXBlPntUOiBUfTsKKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIHN0YXRpYyBUPEM+PyB2MTsKKyAgc3RhdGljIExpc3Q8VDxUPj4gdjIgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQ8TnVsbD4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPExpc3Q+PiB2NCA9IFtdOworCisgIFQ8Qz4/IHY1OworICBMaXN0PFQ8VD4+IHY2ID0gW107CisgIGZpbmFsIFQ8TnVsbD4gdjc7CisKKyAgQygpOiB2NyA9IHByaW50OworICBDLm5hbWUxKHRoaXMudjUsIHRoaXMudjcpOworICBmYWN0b3J5IEMubmFtZTIoVDxDPiBhcmcxLCBUPE51bGw+IGFyZzIpID0gQy5uYW1lMTsKKworICBUPGRvdWJsZT4gb3BlcmF0b3IgKyhUPGRvdWJsZT4gb3RoZXIpOworICBUPEZ1dHVyZU9yPEZ1dHVyZU9yPHZvaWQ+Pj4gZ2V0IGc7CisgIHNldCBnKFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiB2YWx1ZSk7CisgIE1hcDxUPEM+LCBUPEM+PiBtMShjb3ZhcmlhbnQgVDxDPiBhcmcxLCBbU2V0PFNldDxUPEM+Pj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIE1hcDxULCBUPiBhcmcyKFQgRnVuY3Rpb24oVCkgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKK2NsYXNzIEQxPFg+IGV4dGVuZHMgVDxYPiB7fQorYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVDxpbnQ+IHt9CithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VD4ge30KK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ8dm9pZD47CisKK2V4dGVuc2lvbiBFIG9uIFQ8ZHluYW1pYz4geworICBUPGR5bmFtaWM+IGZvbyhUPGR5bmFtaWM+IHQpID0+IHQ7Cit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworVDxUeXBlPiBGdW5jdGlvbihUPFR5cGU+KT8gaWQ7CisKK21haW4oKSB7CisgIHZhciB2OCA9IDxUPEM+PltdOworICB2YXIgdjkgPSA8U2V0PFQ8VD4+LCBTZXQ8VDxUPj4+e3t9OiB7fX07CisgIHZhciB2MTAgPSB7djh9OworICB2OVt7fV0gPSB7fTsKKyAgU2V0PExpc3Q8VDxDPj4+IHYxMSA9IHYxMDsKKyAgdjEwID0gdjExOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZnV0dXJlb3JfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfZnV0dXJlb3JfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTkzOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdXR1cmVvcl9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVDxYPiA9IEZ1dHVyZU9yPFg+OworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIGZpbmFsIFQ8TnVsbD4gdjc7CisKKyAgQygpOiB2NyA9IFQoKTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQorCitjbGFzcyBEMTxYPiBleHRlbmRzIFQ8WD4ge30KKy8vICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVDxpbnQ+IHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VD4ge30KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDx2b2lkPjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2OVt7fV0gPSB7VDxUPigpfTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8TnVsbD4oKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE51bGw+Lm5hbWVkKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKworICBUPE9iamVjdD4gdjEyID0gZm9vPFQ8Ym9vbD4+KFQ8Ym9vbD4oKSk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxMaXN0PExpc3Q8TGlzdDxMaXN0Pj4+Pi5zdGF0aWNNZXRob2Q8VDxpbnQ+PigpOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdXR1cmVvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9mdXR1cmVvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNWRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX2Z1dHVyZW9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUPFg+ID0gRnV0dXJlT3I8WD47CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCitUPGludD4/IHYxOworTGlzdDxUPHZvaWQ+PiB2MiA9IFtdOworZmluYWwgVDxTdHJpbmc+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VDxDPj4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQ8Qz4/IHYxOworICBzdGF0aWMgTGlzdDxUPFQ+PiB2MiA9IFtdOworICBzdGF0aWMgZmluYWwgVDxOdWxsPiB2MyA9IHRocm93ICJBbnl0aGluZyI7CisgIHN0YXRpYyBjb25zdCBMaXN0PFQ8TGlzdD4+IHY0ID0gW107CisKKyAgVDxDPj8gdjU7CisgIExpc3Q8VDxUPj4gdjYgPSBbXTsKKyAgZmluYWwgVDxOdWxsPiB2NzsKKworICBDKCk6IHY3ID0gbnVsbDsKKyAgQy5uYW1lMSh0aGlzLnY1LCB0aGlzLnY3KTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQ8Qz4gYXJnMSwgVDxOdWxsPiBhcmcyKSA9IEMubmFtZTE7CisKKyAgVDxkb3VibGU+IG9wZXJhdG9yICsoVDxkb3VibGU+IG90aGVyKTsKKyAgVDxGdXR1cmVPcjxGdXR1cmVPcjx2b2lkPj4+IGdldCBnOworICBzZXQgZyhUPEZ1dHVyZU9yPEZ1dHVyZU9yPHZvaWQ+Pj4gdmFsdWUpOworICBNYXA8VDxDPiwgVDxDPj4gbTEoY292YXJpYW50IFQ8Qz4gYXJnMSwgW1NldDxTZXQ8VDxDPj4+IGFyZzJdKTsKKyAgdm9pZCBtMih7VCBhcmcxLCBNYXA8VCwgVD4gYXJnMihUIEZ1bmN0aW9uKFQpIGFyZzIxLCBUIGFyZzIyKX0pOworfQorCitleHRlbnNpb24gRSBvbiBUPGR5bmFtaWM+IHsKKyAgVDxkeW5hbWljPiBmb28oVDxkeW5hbWljPiB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK1Q8VHlwZT4gRnVuY3Rpb24oVDxUeXBlPik/IGlkOworCittYWluKCkgeworICB2YXIgdjggPSA8VDxDPj5bXTsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2YXIgdjEwID0ge3Y4fTsKKyAgdjlbe31dID0ge307CisgIFNldDxMaXN0PFQ8Qz4+PiB2MTEgPSB2MTA7CisgIHYxMCA9IHYxMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfbnVsbF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQ8WD4gPSBOdWxsOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIGZpbmFsIFQ8TnVsbD4gdjc7CisKKyAgQygpOiB2NyA9IFQoKTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQorCitjbGFzcyBEMTxYPiBleHRlbmRzIFQ8WD4ge30KKy8vICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVDxpbnQ+IHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VD4ge30KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDx2b2lkPjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2OVt7fV0gPSB7VDxUPigpfTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8TnVsbD4oKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE51bGw+Lm5hbWVkKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxPYmplY3Q+IHYxMiA9IGZvbzxUPGJvb2w+PihUPGJvb2w+KCkpOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8TGlzdDxMaXN0PExpc3Q8TGlzdD4+Pj4uc3RhdGljTWV0aG9kPFQ8aW50Pj4oKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfbnVsbF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9udWxsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVjZDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfbnVsbF90ZXN0LmRhcnQKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVDxYPiA9IE51bGw7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCitUPGludD4gdjE7CitMaXN0PFQ8dm9pZD4+IHYyID0gW107CitmaW5hbCBUPFN0cmluZz4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworY29uc3QgTGlzdDxUPEM+PiB2NCA9IFtdOworY29uc3QgdjUgPSA8VHlwZSwgVHlwZT57VDogVH07CisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBzdGF0aWMgVDxDPiB2MTsKKyAgc3RhdGljIExpc3Q8VDxUPj4gdjIgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQ8TnVsbD4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPExpc3Q+PiB2NCA9IFtdOworCisgIFQ8Qz4gdjU7CisgIExpc3Q8VDxUPj4gdjYgPSBbXTsKKyAgZmluYWwgVDxOdWxsPiB2NzsKKworICBDKCk6IHY3ID0gbnVsbDsKKyAgQy5uYW1lMSh0aGlzLnY1LCB0aGlzLnY3KTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQ8Qz4gYXJnMSwgVDxOdWxsPiBhcmcyKSA9IEMubmFtZTE7CisKKyAgVDxkb3VibGU+IG9wZXJhdG9yICsoVDxkb3VibGU+IG90aGVyKTsKKyAgVDxGdXR1cmVPcjxGdXR1cmVPcjx2b2lkPj4+IGdldCBnOworICBzZXQgZyhUPEZ1dHVyZU9yPEZ1dHVyZU9yPHZvaWQ+Pj4gdmFsdWUpOworICBNYXA8VDxDPiwgVDxDPj4gbTEoY292YXJpYW50IFQ8Qz4gYXJnMSwgW1NldDxTZXQ8VDxDPj4+IGFyZzJdKTsKKyAgdm9pZCBtMih7VCBhcmcxLCBNYXA8VCwgVD4gYXJnMihUIEZ1bmN0aW9uKFQpIGFyZzIxLCBUIGFyZzIyKX0pOworfQorCitleHRlbnNpb24gRSBvbiBUPGR5bmFtaWM+IHsKKyAgVDxkeW5hbWljPiBmb28oVDxkeW5hbWljPiB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK1Q8VHlwZT4gRnVuY3Rpb24oVDxUeXBlPik/IGlkOworCittYWluKCkgeworICB2YXIgdjggPSA8VDxDPj5bXTsKKyAgdmFyIHY5ID0gPFNldDxUPFQ+PiwgU2V0PFQ8VD4+Pnt7fToge319OworICB2YXIgdjEwID0ge3Y4fTsKKyAgdjlbe31dID0ge307CisgIFNldDxMaXN0PFQ8Qz4+PiB2MTEgPSB2MTA7CisgIHYxMCA9IHYxMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX29iamVjdF9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9vYmplY3RfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzJhOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9vYmplY3RfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQ8WD4gPSBPYmplY3Q7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHt9CisKK2Fic3RyYWN0IGNsYXNzIEQyIGV4dGVuZHMgQyB3aXRoIFQ8aW50PiB7fQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDx2b2lkPjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK21haW4oKSB7CisgIFQ8TnVsbD4ubmFtZWQoKTsKKyAgLy8gICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPExpc3Q8TGlzdDxMaXN0PExpc3Q+Pj4+LnN0YXRpY01ldGhvZDxUPGludD4+KCk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX29iamVjdF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9vYmplY3RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWZiYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV9vYmplY3RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQ8WD4gPSBPYmplY3Q7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCitUPGludD4/IHYxOworTGlzdDxUPHZvaWQ+PiB2MiA9IFtdOworZmluYWwgVDxTdHJpbmc+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VDxDPj4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQ8Qz4/IHY2OworICBzdGF0aWMgTGlzdDxUPFQ+PiB2NyA9IFtdOworICBzdGF0aWMgZmluYWwgVDxOdWxsPiB2OCA9IHRocm93ICJBbnl0aGluZyI7CisgIHN0YXRpYyBjb25zdCBMaXN0PFQ8TGlzdD4+IHY5ID0gW107CisKKyAgVDxDPj8gdjEwOworICBMaXN0PFQ8VD4+IHYxMSA9IFtdOworICBmaW5hbCBUPE51bGw+IHYxMjsKKworICBDKCk6IHYxMiA9IFQoKTsKKyAgQy5uYW1lMSh0aGlzLnYxMCwgdGhpcy52MTIpOworICBmYWN0b3J5IEMubmFtZTIoVDxDPiBhcmcxLCBUPE51bGw+IGFyZzIpID0gQy5uYW1lMTsKKworICBUPGRvdWJsZT4gb3BlcmF0b3IgKyhUPGRvdWJsZT4gb3RoZXIpOworICBUPEZ1dHVyZU9yPEZ1dHVyZU9yPHZvaWQ+Pj4gZ2V0IGc7CisgIHNldCBnKFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiB2YWx1ZSk7CisgIE1hcDxUPEM+LCBUPEM+PiBtMShjb3ZhcmlhbnQgVDxDPiBhcmcxLCBbU2V0PFNldDxUPEM+Pj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIE1hcDxULCBUPiBhcmcyKFQgRnVuY3Rpb24oVCkgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKK2NsYXNzIEQxPFg+IGV4dGVuZHMgVDxYPiB7fQorCithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBleHRlbmRzIEMgaW1wbGVtZW50cyBUPFQ+IHt9CisKK2V4dGVuc2lvbiBFIG9uIFQ8ZHluYW1pYz4geworICBUPGR5bmFtaWM+IGZvbyhUPGR5bmFtaWM+IHQpID0+IHQ7Cit9CisKK1Q8VHlwZT4gRnVuY3Rpb24oVDxUeXBlPik/IGlkOworCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2OCA9IDxUPEM+PltdOworICB2YXIgdjkgPSA8U2V0PFQ8VD4+LCBTZXQ8VDxUPj4+e3t9OiB7fX07CisgIHZhciB2MTAgPSB7djh9OworICB2OVt7fV0gPSB7VDxUPigpfTsKKyAgU2V0PExpc3Q8VDxDPj4+IHYxMSA9IHYxMDsKKyAgdjEwID0gdjExOworICBUPE51bGw+KCk7CisgIFQ8T2JqZWN0PiB2MTIgPSBmb288VDxib29sPj4oVDxib29sPigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3R5cGVfdmFyaWFibGVfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2VfdHlwZV92YXJpYWJsZV9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiMjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3R5cGVfdmFyaWFibGVfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQ8WD4gPSBYOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIGZpbmFsIFQ8TWFwPiB2NzsKKworICBDKCk6IHY3ID0gVDxNYXA+KCk7CisgIC8vICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KKworY2xhc3MgRDE8WD4gZXh0ZW5kcyBUPFg+IHt9CisvLyAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQyIGV4dGVuZHMgQyB3aXRoIFQ8aW50PiB7fQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDM8WCwgWT4gaW1wbGVtZW50cyBUPFQ+IHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ8dm9pZD47CisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2OSA9IDxTZXQ8VDxUPj4sIFNldDxUPFQ+Pj57e306IHt9fTsKKyAgdjlbe31dID0ge1Q8Qz4oKX07CisgIC8vICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE51bGw+KCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxOdWxsPi5uYW1lZCgpOworICAvLyAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8T2JqZWN0PiB2MTIgPSBmb288VDxib29sPj4oVDxib29sPigpKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPExpc3Q8TGlzdDxMaXN0PExpc3Q+Pj4+LnN0YXRpY01ldGhvZDxUPGludD4+KCk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPE9iamVjdD4oKTsKKy8vXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxDPi5uYW1lMShDKCksIG51bGwpOworLy9eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3R5cGVfdmFyaWFibGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTE4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydApAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUPFg+ID0gWDsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q8aW50Pj8gdjE7CitMaXN0PFQ8dm9pZD4+IHYyID0gW107CitmaW5hbCBUPFN0cmluZz4gdjMgPSB0aHJvdyAiQW55dGhpbmciOworY29uc3QgTGlzdDxUPEM+PiB2NCA9IFtdOworY29uc3QgdjUgPSA8VHlwZSwgVHlwZT57VDogVH07CisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBzdGF0aWMgVDxDPj8gdjE7CisgIHN0YXRpYyBMaXN0PFQ8VD4+IHYyID0gW107CisgIHN0YXRpYyBmaW5hbCBUPE51bGw+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKKyAgc3RhdGljIGNvbnN0IExpc3Q8VDxMaXN0Pj4gdjQgPSBbXTsKKworICBUPEQ+PyB2NTsKKyAgTGlzdDxUPFQ+PiB2NiA9IFtdOworICBmaW5hbCBUPE51bGw+IHY3OworCisgIEMoKTogdjcgPSBudWxsOworICBDLm5hbWUxKHRoaXMudjUsIHRoaXMudjcpOworICBmYWN0b3J5IEMubmFtZTIoVDxEPiBhcmcxLCBUPE51bGw+IGFyZzIpID0gQy5uYW1lMTsKKworICBUPGRvdWJsZT4gb3BlcmF0b3IgKyhUPGRvdWJsZT4gb3RoZXIpOworICBUPEZ1dHVyZU9yPEZ1dHVyZU9yPHZvaWQ+Pj4gZ2V0IGc7CisgIHNldCBnKFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiB2YWx1ZSk7CisgIE1hcDxUPEM+LCBUPEM+PiBtMShjb3ZhcmlhbnQgVDxDPiBhcmcxLCBbU2V0PFNldDxUPEM+Pj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIE1hcDxULCBUPiBhcmcyKFQgRnVuY3Rpb24oVCkgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKK2NsYXNzIEQge30KK21peGluIE0ge30KKworYWJzdHJhY3QgY2xhc3MgRDE8WD4gZXh0ZW5kcyBUPEQ+IHt9CithYnN0cmFjdCBjbGFzcyBEMiBleHRlbmRzIEMgd2l0aCBUPE0+IHt9CithYnN0cmFjdCBjbGFzcyBEMzxYLCBZPiBpbXBsZW1lbnRzIFQ8VDxEPj4ge30KK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ8RD47CisKK2V4dGVuc2lvbiBFIG9uIFQ8ZHluYW1pYz4geworICBUPGR5bmFtaWM+IGZvbyhUPGR5bmFtaWM+IHQpID0+IHQ7Cit9CisKK21haW4oKSB7CisgIHZhciB2OCA9IDxUPEM+PltdOworICB2YXIgdjkgPSA8U2V0PFQ8VD4+LCBTZXQ8VDxUPj4+e3t9OiB7fX07CisgIHZhciB2MTAgPSB7djh9OworICB2OVt7fV0gPSB7NDJ9OworICBTZXQ8TGlzdDxUPEM+Pj4gdjExID0gdjEwOworICB2MTAgPSB2MTE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV92b2lkX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3ZvaWRfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGRiYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvZ2VuZXJpY191c2FnZV92b2lkX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUPFg+ID0gdm9pZDsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBmaW5hbCBUPE51bGw+IHY3OworCisgIEMoKTogdjcgPSBUKCk7CisgIC8vICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KKworY2xhc3MgRDE8WD4gZXh0ZW5kcyBUPFg+IHt9CisvLyAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQyIGV4dGVuZHMgQyB3aXRoIFQ8aW50PiB7fQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDM8WCwgWT4gaW1wbGVtZW50cyBUPFQ+IHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ8dm9pZD47CisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCitleHRlbnNpb24gRSBvbiBUPGR5bmFtaWM+IHsKKyAgVDxkeW5hbWljPiBmb28oVDxkeW5hbWljPiB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2OCA9IDxUPEM+PltdOworICB2YXIgdjkgPSA8U2V0PFQ8VD4+LCBTZXQ8VDxUPj4+e3t9OiB7fX07CisgIHZhciB2MTAgPSB7djh9OworICB2OVt7fV0gPSB7VDxUPigpfTsKKyAgLy8gICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFNldDxMaXN0PFQ8Qz4+PiB2MTEgPSB2MTA7CisgIHYxMCA9IHYxMTsKKworICBUPE51bGw+KCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVDxOdWxsPi5uYW1lZCgpOworLy9eCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQ8T2JqZWN0PiB2MTIgPSBmb288VDxib29sPj4oVDxib29sPigpKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUPExpc3Q8TGlzdDxMaXN0PExpc3Q+Pj4+LnN0YXRpY01ldGhvZDxUPGludD4+KCk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3ZvaWRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2dlbmVyaWNfdXNhZ2Vfdm9pZF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4YTVjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9nZW5lcmljX3VzYWdlX3ZvaWRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQ8WD4gPSB2b2lkOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworVDxpbnQ+IHYxOworTGlzdDxUPHZvaWQ+PiB2MiA9IFtdOworZmluYWwgVDxTdHJpbmc+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VDxDPj4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQ8Qz4gdjE7CisgIHN0YXRpYyBMaXN0PFQ8VD4+IHYyID0gW107CisgIHN0YXRpYyBmaW5hbCBUPE51bGw+IHYzID0gdGhyb3cgIkFueXRoaW5nIjsKKyAgc3RhdGljIGNvbnN0IExpc3Q8VDxMaXN0Pj4gdjQgPSBbXTsKKworICBUPEM+IHY1OworICBMaXN0PFQ8VD4+IHY2ID0gW107CisgIGZpbmFsIFQ8TnVsbD4gdjc7CisKKyAgQygpOiB2NyA9IG51bGw7CisgIEMubmFtZTEodGhpcy52NSwgdGhpcy52Nyk7CisgIGZhY3RvcnkgQy5uYW1lMihUPEM+IGFyZzEsIFQ8TnVsbD4gYXJnMikgPSBDLm5hbWUxOworCisgIFQ8ZG91YmxlPiBvcGVyYXRvciArKFQ8ZG91YmxlPiBvdGhlcik7CisgIFQ8RnV0dXJlT3I8RnV0dXJlT3I8dm9pZD4+PiBnZXQgZzsKKyAgc2V0IGcoVDxGdXR1cmVPcjxGdXR1cmVPcjx2b2lkPj4+IHZhbHVlKTsKKyAgTWFwPFQ8Qz4sIFQ8Qz4+IG0xKGNvdmFyaWFudCBUPEM+IGFyZzEsIFtTZXQ8U2V0PFQ8Qz4+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgTWFwPFQsIFQ+IGFyZzIoVCBGdW5jdGlvbihUKSBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworZXh0ZW5zaW9uIEUgb24gVDxkeW5hbWljPiB7CisgIFQ8ZHluYW1pYz4gZm9vKFQ8ZHluYW1pYz4gdCkgPT4gdDsKK30KKworWCBmb288WD4oWCB4KSA9PiB4OworCitUPFR5cGU+IEZ1bmN0aW9uKFQ8VHlwZT4pPyBpZDsKKworbWFpbigpIHsKKyAgdmFyIHY4ID0gPFQ8Qz4+W107CisgIHZhciB2OSA9IDxTZXQ8VDxUPj4sIFNldDxUPFQ+Pj57e306IHt9fTsKKyAgdmFyIHYxMCA9IHt2OH07CisgIHY5W3t9XSA9IHt9OworICBTZXQ8TGlzdDxUPEM+Pj4gdjExID0gdjEwOworICB2MTAgPSB2MTE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAxX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5YzliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAxX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjYWYyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPT4gRCgpOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WD4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wM190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGEzMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0+IEQ8WD4odCk7Cit9CisKK2NsYXNzIEQ8WD4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJlYzgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVCh0eXBlT2Y8TGlzdDxudW0+PigpKTsKKyAgQzxJdGVyYWJsZTxudW0+PiB4MiA9IFQodHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA1X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRkZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA1X3Rlc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCwgWT4geworICBmYWN0b3J5IEMoVHlwZSB0eCwgVHlwZSB0eSkgPT4gRDxYLCBZPih0eCwgdHkpOworfQorCitjbGFzcyBEPFgsIFk+IGltcGxlbWVudHMgQzxYLCBZPiB7CisgIEQoVHlwZSB0eCwgVHlwZSB0eSkgeworICAgIEV4cGVjdC5lcXVhbHModHgsIFgpOworICAgIEV4cGVjdC5lcXVhbHModHksIFkpOworICB9Cit9CisKK3R5cGVkZWYgVDxZLCBYPiA9IEM8WCwgWT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQsIFN0cmluZz4geDEgPSBUKFN0cmluZywgaW50KTsKKyAgQzxTdHJpbmcsIGludD4geDIgPSBUKFN0cmluZywgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wNl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjhjY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDZfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPT4gRDxYPih4LCB0KTsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQoMSwgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wN190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDFmMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPT4gRDxYPih4LCB0KTsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVCg8bnVtPlsxXSwgdHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDhfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRiN2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIG51bT4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFggZXh0ZW5kcyBudW0+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIGludD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50PiB4MSA9IFQoaW50KTsKKyAgQzxpbnQ+IHgyID0gVChpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA5X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wOV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlYThiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wOV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPT4gRCgpOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIG51bT4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8xMF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTBfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGM0NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTBfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0+IEQ8WD4odCk7Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIG51bT4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzExX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmFhYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzExX3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIEl0ZXJhYmxlPG51bT4+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPT4gRDxYPih0KTsKK30KKworY2xhc3MgRDxYIGV4dGVuZHMgSXRlcmFibGU8bnVtPj4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVDxYIGV4dGVuZHMgaW50PiA9IEM8TGlzdDxYPj47CisKK1R5cGUgdHlwZU9mPFg+KCkgPT4gWDsKKwordm9pZCBtYWluKCkgeworICBUPGludD4geDEgPSBUKHR5cGVPZjxMaXN0PGludD4+KCkpOworICBDPEl0ZXJhYmxlPG51bT4+IHgyID0gVCh0eXBlT2Y8TGlzdDxpbnQ+PigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8xMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGE0MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgU3RyaW5nLCBZIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHR4LCBUeXBlIHR5KSA9PiBEPFgsIFk+KHR4LCB0eSk7Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIFN0cmluZywgWSBleHRlbmRzIG51bT4gaW1wbGVtZW50cyBDPFgsIFk+IHsKKyAgRChUeXBlIHR4LCBUeXBlIHR5KSB7CisgICAgRXhwZWN0LmVxdWFscyh0eCwgWCk7CisgICAgRXhwZWN0LmVxdWFscyh0eSwgWSk7CisgIH0KK30KKwordHlwZWRlZiBUPFkgZXh0ZW5kcyBpbnQsIFggZXh0ZW5kcyBTdHJpbmc+ID0gQzxYLCBZPjsKKwordm9pZCBtYWluKCkgeworICBUPGludCwgU3RyaW5nPiB4MSA9IFQoU3RyaW5nLCBpbnQpOworICBDPFN0cmluZywgaW50PiB4MiA9IFQoU3RyaW5nLCBpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjYzNjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIEMoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWY0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHt9CisKK3R5cGVkZWYgVDxYPiA9IEM7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVCgpOworICBDIHgyID0gVCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTMxNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wM190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgQyhUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wNF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wNF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkNjYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzA0X3Rlc3QuZGFydApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBDKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFg+ID0gQzxMaXN0PFg+PjsKKworVHlwZSB0eXBlT2Y8WD4oKSA9PiBYOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQodHlwZU9mPExpc3Q8bnVtPj4oKSk7CisgIEM8SXRlcmFibGU8bnVtPj4geDIgPSBUKHR5cGVPZjxMaXN0PG51bT4+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzZhMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wNV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFgsIFk+IHsKKyAgQyhUeXBlIHR4LCBUeXBlIHR5KSB7CisgICAgRXhwZWN0LmVxdWFscyh0eCwgWCk7CisgICAgRXhwZWN0LmVxdWFscyh0eSwgWSk7CisgIH0KK30KKwordHlwZWRlZiBUPFksIFg+ID0gQzxYLCBZPjsKKwordm9pZCBtYWluKCkgeworICBUPGludCwgU3RyaW5nPiB4MSA9IFQoU3RyaW5nLCBpbnQpOworICBDPFN0cmluZywgaW50PiB4MiA9IFQoU3RyaW5nLCBpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDZfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2RlYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wNl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgQyhYIHgsIFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFg+ID0gQzxYPjsKKwordm9pZCBtYWluKCkgeworICBUKDEsIGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wN190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wN190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2MTk2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzA3X3Rlc3QuZGFydApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBDKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVCg8bnVtPlsxXSwgdHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wOF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8wOF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5MmI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzA4X3Rlc3QuZGFydApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIG51bT4geworICBDKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFggZXh0ZW5kcyBpbnQ+ID0gQzxYPjsKKwordm9pZCBtYWluKCkgeworICBUPGludD4geDEgPSBUKGludCk7CisgIEM8aW50PiB4MiA9IFQoaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzA5X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzA5X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA3NjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMDlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQyB7fQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIG51bT4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzEwX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzEwX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMTBfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgbnVtPiB7CisgIEMoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQgPSBDPG51bT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVCB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMTFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfaW5zdGFuY2VfY3JlYXRpb25fMTFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjlmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8xMV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFggZXh0ZW5kcyBJdGVyYWJsZTxudW0+PiB7CisgIEMoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIGludD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQ+IHgxID0gVCh0eXBlT2Y8TGlzdDxpbnQ+PigpKTsKKyAgQzxJdGVyYWJsZTxudW0+PiB4MiA9IFQodHlwZU9mPExpc3Q8aW50Pj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8xMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9pbnN0YW5jZV9jcmVhdGlvbl8xMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyMmUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2luc3RhbmNlX2NyZWF0aW9uXzEyX3Rlc3QuZGFydApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIFN0cmluZywgWSBleHRlbmRzIG51bT4geworICBDKFR5cGUgdHgsIFR5cGUgdHkpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHR4LCBYKTsKKyAgICBFeHBlY3QuZXF1YWxzKHR5LCBZKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WSBleHRlbmRzIGludCwgWCBleHRlbmRzIFN0cmluZz4gPSBDPFgsIFk+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50LCBTdHJpbmc+IHgxID0gVChTdHJpbmcsIGludCk7CisgIEM8U3RyaW5nLCBpbnQ+IHgyID0gVChTdHJpbmcsIGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAxX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUxZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAxX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9IEQ8WD47Cit9CisKK2NsYXNzIEQ8WD4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVDxYPiA9IEM8WD47CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAyX3Rlc3QuZGFydApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEMgeworICBmYWN0b3J5IEMoKSA9IEQ7Cit9CisKK2NsYXNzIEQgaW1wbGVtZW50cyBDIHt9CisKK3R5cGVkZWYgVDxYPiA9IEM7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVCgpOworICBDIHgyID0gVCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wM190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlZmQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wM190ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQgPSBDPG51bT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVCB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwNDdkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNF90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVCh0eXBlT2Y8TGlzdDxudW0+PigpKTsKKyAgQzxJdGVyYWJsZTxudW0+PiB4MiA9IFQodHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA1X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTcxYjIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA1X3Rlc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCwgWT4geworICBmYWN0b3J5IEMoVHlwZSB0eCwgVHlwZSB0eSkgPSBEPFgsIFk+OworfQorCitjbGFzcyBEPFgsIFk+IGltcGxlbWVudHMgQzxYLCBZPiB7CisgIEQoVHlwZSB0eCwgVHlwZSB0eSkgeworICAgIEV4cGVjdC5lcXVhbHModHgsIFgpOworICAgIEV4cGVjdC5lcXVhbHModHksIFkpOworICB9Cit9CisKK3R5cGVkZWYgVDxZLCBYPiA9IEM8WCwgWT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQsIFN0cmluZz4geDEgPSBUKFN0cmluZywgaW50KTsKKyAgQzxTdHJpbmcsIGludD4geDIgPSBUKFN0cmluZywgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDdmODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDZfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoWCB4LCBUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVDxYPiA9IEM8WD47CisKK3ZvaWQgbWFpbigpIHsKKyAgVCgxLCBpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA3X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wN190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4MTY0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wN190ZXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgZmFjdG9yeSBDKFggeCwgVHlwZSB0KSA9IEQ8WD47Cit9CisKK2NsYXNzIEQ8WD4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChYIHgsIFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFg+ID0gQzxMaXN0PFg+PjsKKworVHlwZSB0eXBlT2Y8WD4oKSA9PiBYOworCit2b2lkIG1haW4oKSB7CisgIFQoPG51bT5bMV0sIHR5cGVPZjxMaXN0PG51bT4+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wOF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzOTc0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wOF90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFggZXh0ZW5kcyBudW0+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFggZXh0ZW5kcyBudW0+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIGludD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50PiB4MSA9IFQoaW50KTsKKyAgQzxpbnQ+IHgyID0gVChpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA5X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wOV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYzk5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wOV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPSBEOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIG51bT4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTBfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2FhZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTBfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0gRDxYPjsKK30KKworY2xhc3MgRDxYIGV4dGVuZHMgbnVtPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUID0gQzxudW0+OworCit2b2lkIG1haW4oKSB7CisgIFQgeDEgPSBUKG51bSk7CisgIEM8bnVtPiB4MiA9IFQobnVtKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTcwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgSXRlcmFibGU8bnVtPj4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9IEQ8WD47Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIEl0ZXJhYmxlPG51bT4+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIGludD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQ+IHgxID0gVCh0eXBlT2Y8TGlzdDxpbnQ+PigpKTsKKyAgQzxJdGVyYWJsZTxudW0+PiB4MiA9IFQodHlwZU9mPExpc3Q8aW50Pj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzEyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMyYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzEyX3Rlc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIFN0cmluZywgWSBleHRlbmRzIG51bT4geworICBmYWN0b3J5IEMoVHlwZSB0eCwgVHlwZSB0eSkgPSBEPFgsIFk+OworfQorCitjbGFzcyBEPFggZXh0ZW5kcyBTdHJpbmcsIFkgZXh0ZW5kcyBudW0+IGltcGxlbWVudHMgQzxYLCBZPiB7CisgIEQoVHlwZSB0eCwgVHlwZSB0eSkgeworICAgIEV4cGVjdC5lcXVhbHModHgsIFgpOworICAgIEV4cGVjdC5lcXVhbHModHksIFkpOworICB9Cit9CisKK3R5cGVkZWYgVDxZIGV4dGVuZHMgaW50LCBYIGV4dGVuZHMgU3RyaW5nPiA9IEM8WCwgWT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQsIFN0cmluZz4geDEgPSBUKFN0cmluZywgaW50KTsKKyAgQzxTdHJpbmcsIGludD4geDIgPSBUKFN0cmluZywgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9jbGFzc19lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfY2xhc3NfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTU1YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfY2xhc3NfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCitjbGFzcyBBIHsKKyAgQSgpOworfQorCit0eXBlZGVmIFQgPSBBOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7fQorCithYnN0cmFjdCBjbGFzcyBEMiBleHRlbmRzIEMgd2l0aCBUIHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBENCA9IEMgd2l0aCBUOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworbWFpbigpIHsKKyAgVCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2NsYXNzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9jbGFzc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxMDgyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9jbGFzc190ZXN0LmRhcnQKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK2NsYXNzIEEgeworICBBKCk7CisgIEEubmFtZWQoKTsKKyAgc3RhdGljIHZvaWQgc3RhdGljTWV0aG9kPFg+KCkge30KK30KKwordHlwZWRlZiBUID0gQTsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q/IHYxOworTGlzdDxUPiB2MiA9IFtdOworZmluYWwgVCB2MyA9IHRocm93ICJBbnl0aGluZyI7Citjb25zdCBMaXN0PFQ+IHY0ID0gW107Citjb25zdCB2NSA9IDxUeXBlLCBUeXBlPntUOiBUfTsKKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIHN0YXRpYyBUPyB2NjsKKyAgc3RhdGljIExpc3Q8VD4gdjcgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQgdjggPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPiB2OSA9IFtdOworCisgIFQ/IHYxMDsKKyAgTGlzdDxUPiB2MTEgPSBbXTsKKyAgZmluYWwgVCB2MTI7CisKKyAgQygpOiB2MTIgPSBUKCk7CisgIEMubmFtZTEodGhpcy52MTAsIHRoaXMudjEyKTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQgYXJnMSwgVCBhcmcyKSA9IEMubmFtZTE7CisKKyAgVCBvcGVyYXRvciArKFQgb3RoZXIpOworICBUIGdldCBnOworICBzZXQgZyhUIHZhbHVlKTsKKyAgTWFwPFQsIFQ+IG0xKGNvdmFyaWFudCBUIGFyZzEsIFtTZXQ8U2V0PFQ+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgVCBhcmcyKFQgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKK2NsYXNzIEQxIGV4dGVuZHMgVCB7fQorYWJzdHJhY3QgY2xhc3MgRDMgaW1wbGVtZW50cyBUIHt9CisKK2V4dGVuc2lvbiBFIG9uIFQgeworICBUIGZvbyhUIHQpID0+IHQ7Cit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworVCBGdW5jdGlvbihUKSBpZCA9ICh4KSA9PiB4OworCittYWluKCkgeworICB2YXIgdjEzID0gPFQ+W107CisgIHZhciB2MTQgPSA8U2V0PFQ+LCBTZXQ8VD4+e3t9OiB7fX07CisgIHYxNFt7fV0gPSB7VCgpfTsKKyAgdmFyIHYxNSA9IHt2MTN9OworICBTZXQ8TGlzdDxUPj4gdjE2ID0gdjE1OworICB2MTUgPSB2MTY7CisgIFQoKTsKKyAgVC5uYW1lZCgpOworICBUIHYxNyA9IGZvbzxUPihUKCkpOworICBpZCh2MTcpOworICBULnN0YXRpY01ldGhvZDxUPigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2R5bmFtaWNfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2R5bmFtaWNfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzVmYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZHluYW1pY19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVCA9IGR5bmFtaWM7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgZmluYWwgVCB2MTI7CisKKyAgQygpOiB2MTIgPSBUKCk7CisgIC8vICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CisKK2NsYXNzIEQxIGV4dGVuZHMgVCB7fQorLy8gICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMiBleHRlbmRzIEMgd2l0aCBUIHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMyBpbXBsZW1lbnRzIFQge30KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtUKCl9OworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorICAKKyAgVCgpOworLy9eCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQubmFtZWQoKTsKKyAgLy9eXl5eXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVCB2MTcgPSBmb288VD4oVCgpKTsKKyAgLy8gICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVC5zdGF0aWNNZXRob2Q8VD4oKTsKKyAgLy9eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2R5bmFtaWNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2R5bmFtaWNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjM3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZHluYW1pY190ZXN0LmRhcnQKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVCA9IGR5bmFtaWM7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCitUIHYxOworTGlzdDxUPiB2MiA9IFtdOworZmluYWwgVCB2MyA9IHRocm93ICJBbnl0aGluZyI7Citjb25zdCBMaXN0PFQ+IHY0ID0gW107Citjb25zdCB2NSA9IDxUeXBlLCBUeXBlPntUOiBUfTsKKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIHN0YXRpYyBUIHY2OworICBzdGF0aWMgTGlzdDxUPiB2NyA9IFtdOworICBzdGF0aWMgZmluYWwgVCB2OCA9IHRocm93ICJBbnl0aGluZyI7CisgIHN0YXRpYyBjb25zdCBMaXN0PFQ+IHY5ID0gW107CisKKyAgVCB2MTA7CisgIExpc3Q8VD4gdjExID0gW107CisgIGZpbmFsIFQgdjEyOworCisgIEMubmFtZTEodGhpcy52MTAsIHRoaXMudjEyKTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQgYXJnMSwgVCBhcmcyKSA9IEMubmFtZTE7CisKKyAgVCBvcGVyYXRvciArKFQgb3RoZXIpOworICBUIGdldCBnOworICBzZXQgZyhUIHZhbHVlKTsKKyAgTWFwPFQsIFQ+IG0xKGNvdmFyaWFudCBUIGFyZzEsIFtTZXQ8U2V0PFQ+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgVCBhcmcyKFQgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworVCBGdW5jdGlvbihUKSBpZCA9ICh4KSA9PiB4OworCitleHRlbnNpb24gRSBvbiBUIHsKKyAgVCBmb28oVCB0KSA9PiB0OworfQorCittYWluKCkgeworICB2YXIgdjEzID0gPFQ+W107CisgIHZhciB2MTQgPSA8U2V0PFQ+LCBTZXQ8VD4+e3t9OiB7fX07CisgIHYxNFt7fV0gPSB7fTsKKyAgdmFyIHYxNSA9IHt2MTN9OworICBTZXQ8TGlzdDxUPj4gdjE2ID0gdjE1OworICB2MTUgPSB2MTY7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZnVuY3Rpb25fZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2Z1bmN0aW9uX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzljNjQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2Z1bmN0aW9uX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUID0gRnVuY3Rpb247CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgZmluYWwgVCB2MTI7CisKKyAgQygpOiB2MTIgPSBUKCk7CisgIC8vICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtUKCl9OworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQoKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULm5hbWVkKCk7CisgIC8vXl5eXl4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQgdjE3ID0gZm9vPFQ+KFQoKSk7CisgIC8vICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2Z1bmN0aW9uX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9mdW5jdGlvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1YTY4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9mdW5jdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKKy8vIEludHJvZHVjZSBhbiBhbGlhc2VkIHR5cGUuCisKK3R5cGVkZWYgVCA9IEZ1bmN0aW9uOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworVD8gdjE7CitMaXN0PFQ+IHYyID0gW107CitmaW5hbCBUIHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VD4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQ/IHY2OworICBzdGF0aWMgTGlzdDxUPiB2NyA9IFtdOworICBzdGF0aWMgZmluYWwgVCB2OCA9IHRocm93ICJBbnl0aGluZyI7CisgIHN0YXRpYyBjb25zdCBMaXN0PFQ+IHY5ID0gW107CisKKyAgVD8gdjEwOworICBMaXN0PFQ+IHYxMSA9IFtdOworICBmaW5hbCBUIHYxMjsKKworICBDKCk6IHYxMiA9ICgoKSB7fSk7CisgIEMubmFtZTEodGhpcy52MTAsIHRoaXMudjEyKTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQgYXJnMSwgVCBhcmcyKSA9IEMubmFtZTE7CisKKyAgVCBvcGVyYXRvciArKFQgb3RoZXIpOworICBUIGdldCBnOworICBzZXQgZyhUIHZhbHVlKTsKKyAgTWFwPFQsIFQ+IG0xKGNvdmFyaWFudCBUIGFyZzEsIFtTZXQ8U2V0PFQ+PiBhcmcyXSk7CisgIHZvaWQgbTIoe1QgYXJnMSwgVCBhcmcyKFQgYXJnMjEsIFQgYXJnMjIpfSk7Cit9CisKKy8vIEF3YWl0aW5nIHVwZGF0ZXMgaW4gZnJvbnQgZW5kIHRvIGhhbmRsZSBjcmFzaCBjYXVzZWQgYnkgbnVsbCBmcm9tCisvLyBgQ2xhc3NIaWVyYXJjaHlCdWlsZGVyLmdldEtlcm5lbFR5cGVBc0luc3RhbmNlT2ZgLiBTbyBmb3Igbm93IHRoZQorLy8gZm9sbG93aW5nIGFyZSBtdWx0aS10ZXN0IGNhc2VzLCBzbyB0aGF0IHRoZSByZXN0IGNhbiBiZSB0ZXN0ZWQuCitjbGFzcyBEMSBleHRlbmRzIFQge30gLy8jIDAxOiBvaworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVCB7fSAvLyMgMDI6IG9rCithYnN0cmFjdCBjbGFzcyBEMyBpbXBsZW1lbnRzIFQge30gLy8jIDAzOiBvaworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDsgLy8jIDA0OiBvaworCitleHRlbnNpb24gRSBvbiBUIHsKKyAgVCBmb28oVCB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK1QgRnVuY3Rpb24oVCkgaWQgPSAoeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHYxMyA9IDxUPltdOworICB2YXIgdjE0ID0gPFNldDxUPiwgU2V0PFQ+Pnt7fToge319OworICB2MTRbe31dID0ge307CisgIHZhciB2MTUgPSB7djEzfTsKKyAgU2V0PExpc3Q8VD4+IHYxNiA9IHYxNTsKKyAgdjE1ID0gdjE2OworICBUIHYxNyA9IGZvbzxUPigoKSB7fSk7CisgIGlkKHYxNyk7CisgIFQuYXBwbHkoKCkge30sIFtdKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9mdXR1cmVvcl9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZnV0dXJlb3JfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2I3MjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZnV0dXJlb3JfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQgPSBGdXR1cmVPcjxpbnQ+OworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIGZpbmFsIFQgdjEyOworCisgIEMoKTogdjEyID0gVCgpOworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQorCitjbGFzcyBEMSBleHRlbmRzIFQge30KKy8vICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVCB7fQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDMgaW1wbGVtZW50cyBUIHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2MTQgPSA8U2V0PFQ+LCBTZXQ8VD4+e3t9OiB7fX07CisgIHYxNFt7fV0gPSB7VCgpfTsKKyAgLy8gICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVC5uYW1lZCgpOworICAvL15eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUIHYxNyA9IGZvbzxUPihUKCkpOworICAvLyAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULnN0YXRpY01ldGhvZDxUPigpOworICAvL15eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfZnV0dXJlb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2Z1dHVyZW9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2EzODg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX2Z1dHVyZW9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUID0gRnV0dXJlT3I8aW50PjsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q/IHYxOworTGlzdDxUPiB2MiA9IFtdOworZmluYWwgVCB2MyA9IHRocm93ICJBbnl0aGluZyI7Citjb25zdCBMaXN0PFQ+IHY0ID0gW107Citjb25zdCB2NSA9IDxUeXBlLCBUeXBlPntUOiBUfTsKKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIHN0YXRpYyBUPyB2NjsKKyAgc3RhdGljIExpc3Q8VD4gdjcgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQgdjggPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPiB2OSA9IFtdOworCisgIFQ/IHYxMDsKKyAgTGlzdDxUPiB2MTEgPSBbXTsKKyAgZmluYWwgVCB2MTI7CisKKyAgQy5uYW1lMSh0aGlzLnYxMCwgdGhpcy52MTIpOworICBmYWN0b3J5IEMubmFtZTIoVCBhcmcxLCBUIGFyZzIpID0gQy5uYW1lMTsKKworICBUIG9wZXJhdG9yICsoVCBvdGhlcik7CisgIFQgZ2V0IGc7CisgIHNldCBnKFQgdmFsdWUpOworICBNYXA8VCwgVD4gbTEoY292YXJpYW50IFQgYXJnMSwgW1NldDxTZXQ8VD4+IGFyZzJdKTsKKyAgdm9pZCBtMih7VCBhcmcxLCBUIGFyZzIoVCBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworZXh0ZW5zaW9uIEUgb24gVCB7CisgIFQgZm9vKFQgdCkgPT4gdDsKK30KKworWCBmb288WD4oWCB4KSA9PiB4OworCitUIEZ1bmN0aW9uKFQpIGlkID0gKHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2MTMgPSA8VD5bXTsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHt9OworICB2YXIgdjE1ID0ge3YxM307CisgIFNldDxMaXN0PFQ+PiB2MTYgPSB2MTU7CisgIHYxNSA9IHYxNjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9udWxsX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9udWxsX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRiNWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQgPSBOdWxsOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIGZpbmFsIFQgdjEyOworCisgIEMoKTogdjEyID0gVCgpOworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQgb3BlcmF0b3IgKyhUIG90aGVyKTsKKyAgVCBnZXQgZzsKKyAgc2V0IGcoVCB2YWx1ZSk7CisgIE1hcDxULCBUPiBtMShjb3ZhcmlhbnQgVCBhcmcxLCBbU2V0PFNldDxUPj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIFQgYXJnMihUIGFyZzIxLCBUIGFyZzIyKX0pOworfQorCitjbGFzcyBEMSBleHRlbmRzIFQge30KKy8vICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDIgZXh0ZW5kcyBDIHdpdGggVCB7fQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDMgaW1wbGVtZW50cyBUIHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQ0ID0gQyB3aXRoIFQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2MTMgPSA8VD5bXTsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtUKCl9OworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIHZhciB2MTUgPSB7djEzfTsKKyAgU2V0PExpc3Q8VD4+IHYxNiA9IHYxNTsKKyAgdjE1ID0gdjE2OworICBUKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVC5uYW1lZCgpOworICAvL15eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUIHYxNyA9IGZvbzxUPihUKCkpOworICAvLyAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULnN0YXRpY01ldGhvZDxUPigpOworICAvL15eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisgIC8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfbnVsbF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfbnVsbF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxMDQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9udWxsX3Rlc3QuZGFydApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUID0gTnVsbDsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1QgdjE7CitMaXN0PFQ+IHYyID0gW107CitmaW5hbCBUIHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VD4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQgdjY7CisgIHN0YXRpYyBMaXN0PFQ+IHY3ID0gW107CisgIHN0YXRpYyBmaW5hbCBUIHY4ID0gdGhyb3cgIkFueXRoaW5nIjsKKyAgc3RhdGljIGNvbnN0IExpc3Q8VD4gdjkgPSBbXTsKKworICBUIHYxMDsKKyAgTGlzdDxUPiB2MTEgPSBbXTsKKyAgZmluYWwgVCB2MTI7CisKKyAgQygpOiB2MTIgPSBudWxsOworICBDLm5hbWUxKHRoaXMudjEwLCB0aGlzLnYxMik7CisgIGZhY3RvcnkgQy5uYW1lMihUIGFyZzEsIFQgYXJnMikgPSBDLm5hbWUxOworCisgIFQgb3BlcmF0b3IgKyhUIG90aGVyKTsKKyAgVCBnZXQgZzsKKyAgc2V0IGcoVCB2YWx1ZSk7CisgIE1hcDxULCBUPiBtMShjb3ZhcmlhbnQgVCBhcmcxLCBbU2V0PFNldDxUPj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIFQgYXJnMihUIGFyZzIxLCBUIGFyZzIyKX0pOworfQorCitleHRlbnNpb24gRSBvbiBUIHsKKyAgVCBmb28oVCB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKKy8vIEZ1bmN0aW9uIGxpdGVyYWwgc2lnbmF0dXJlIGluZmVyZW5jZSB5aWVsZHMgYE9iamVjdD8geGAsIHNvIHdlIGZvcmNlIGl0LgorVCBGdW5jdGlvbihUKSBpZCA9IChOdWxsIHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2MTMgPSA8VD5bXTsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHt9OworICB2YXIgdjE1ID0ge3YxM307CisgIFNldDxMaXN0PFQ+PiB2MTYgPSB2MTU7CisgIHYxNSA9IHYxNjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9vYmplY3RfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX29iamVjdF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMTA1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9vYmplY3RfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQgPSBPYmplY3Q7CisKKy8vIFVzZSB0aGUgYWxpYXNlZCB0eXBlLgorCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgVD8gdjEwOworICBmaW5hbCBUIHYxMjsKKyAgQygpOiB2MTIgPSBUKCk7CisgIEMubmFtZTEodGhpcy52MTAsIHRoaXMudjEyKTsKKyAgZmFjdG9yeSBDLm5hbWUyKFQgYXJnMSwgVCBhcmcyKSA9IEMubmFtZTE7Cit9CisKK2Fic3RyYWN0IGNsYXNzIEQyIGV4dGVuZHMgQyB3aXRoIFQge30KKy8vICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK2Fic3RyYWN0IGNsYXNzIEQzIGltcGxlbWVudHMgVCB7fQorLy8gICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDsKKy8vICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK21haW4oKSB7CisgIFQubmFtZWQoKTsKKy8vICBeXl5eXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULnN0YXRpY01ldGhvZDxUPigpOworLy8gIF5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ09iamVjdC5zdGF0aWNNZXRob2QnLgorLy8gIF5eXl5eXl5eXl5eXgorLy8gW2NmZV0gQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2Vfb2JqZWN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9vYmplY3RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzI3OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2Vfb2JqZWN0X3Rlc3QuZGFydApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUID0gT2JqZWN0OworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworVD8gdjE7CitMaXN0PFQ+IHYyID0gW107CitmaW5hbCBUIHYzID0gdGhyb3cgIkFueXRoaW5nIjsKK2NvbnN0IExpc3Q8VD4gdjQgPSBbXTsKK2NvbnN0IHY1ID0gPFR5cGUsIFR5cGU+e1Q6IFR9OworCithYnN0cmFjdCBjbGFzcyBDIHsKKyAgc3RhdGljIFQ/IHY2OworICBzdGF0aWMgTGlzdDxUPiB2NyA9IFtdOworICBzdGF0aWMgZmluYWwgVCB2OCA9IHRocm93ICJBbnl0aGluZyI7CisgIHN0YXRpYyBjb25zdCBMaXN0PFQ+IHY5ID0gW107CisKKyAgVD8gdjEwOworICBMaXN0PFQ+IHYxMSA9IFtdOworICBmaW5hbCBUIHYxMjsKKworICBDKCk6IHYxMiA9IFQoKTsKKyAgQy5uYW1lMSh0aGlzLnYxMCwgdGhpcy52MTIpOworICBmYWN0b3J5IEMubmFtZTIoVCBhcmcxLCBUIGFyZzIpID0gQy5uYW1lMTsKKworICBUIG9wZXJhdG9yICsoVCBvdGhlcik7CisgIFQgZ2V0IGc7CisgIHNldCBnKFQgdmFsdWUpOworICBNYXA8VCwgVD4gbTEoY292YXJpYW50IFQgYXJnMSwgW1NldDxTZXQ8VD4+IGFyZzJdKTsKKyAgdm9pZCBtMih7VCBhcmcxLCBUIGFyZzIoVCBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworY2xhc3MgRDEgZXh0ZW5kcyBUIHt9CisKK2V4dGVuc2lvbiBFIG9uIFQgeworICBUIGZvbyhUIHQpID0+IHQ7Cit9CisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworVCBGdW5jdGlvbihUKSBpZCA9ICh4KSA9PiB4OworCittYWluKCkgeworICB2YXIgdjEzID0gPFQ+W107CisgIHZhciB2MTQgPSA8U2V0PFQ+LCBTZXQ8VD4+e3t9OiB7fX07CisgIHYxNFt7fV0gPSB7VCgpfTsKKyAgdmFyIHYxNSA9IHt2MTN9OworICBTZXQ8TGlzdDxUPj4gdjE2ID0gdjE1OworICB2MTUgPSB2MTY7CisgIFQoKTsKKyAgVCB2MTcgPSBmb288VD4oVCgpKTsKKyAgaWQodjE3KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV90eXBlX3ZhcmlhYmxlX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV90eXBlX3ZhcmlhYmxlX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRlODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX3R5cGVfdmFyaWFibGVfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCitjbGFzcyBBIHsKKyAgQSgpOworICBBLm5hbWVkKCk7CisgIHN0YXRpYyB2b2lkIHN0YXRpY01ldGhvZDxYPigpIHt9Cit9CisKK3R5cGVkZWYgVDxYIGV4dGVuZHMgQT4gPSBYOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworY2xhc3MgQyB7CisgIGZpbmFsIFQgdjEyOworCisgIEMoKTogdjEyID0gVCgpOworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorfQorCithYnN0cmFjdCBjbGFzcyBEMiBleHRlbmRzIEMgd2l0aCBUIHt9CisvLyAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBENCA9IEMgd2l0aCBUOworLy8gICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworbWFpbigpIHsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtUKCl9OworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQoKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBUIHYxNyA9IGZvbzxUPihUKCkpOworICAvLyAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULm5hbWVkKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVCgpLnVua25vd25JbnN0YW5jZU1ldGhvZCgpOworLy9eCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQuc3RhdGljTWV0aG9kPFQ+KCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKKyAgVC51bmtub3duU3RhdGljTWV0aG9kKCk7CisvL14KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfdHlwZV92YXJpYWJsZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2VfdHlwZV92YXJpYWJsZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZWMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKworY2xhc3MgQSB7CisgIEEoKTsKKyAgQS5uYW1lZCgpOworICBzdGF0aWMgdm9pZCBzdGF0aWNNZXRob2Q8WD4oKSB7fQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIEE+ID0gWDsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK1Q/IHYxOworTGlzdDxUPiB2MiA9IFtdOworZmluYWwgVCB2MyA9IHRocm93ICJBbnl0aGluZyI7Citjb25zdCBMaXN0PFQ+IHY0ID0gW107Citjb25zdCB2NSA9IDxUeXBlLCBUeXBlPntUOiBUfTsKKworYWJzdHJhY3QgY2xhc3MgQyB7CisgIHN0YXRpYyBUPyB2NjsKKyAgc3RhdGljIExpc3Q8VD4gdjcgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQgdjggPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPiB2OSA9IFtdOworCisgIFQ/IHYxMDsKKyAgTGlzdDxUPiB2MTEgPSBbXTsKKyAgZmluYWwgVD8gdjEyOworCisgIEMoKTogdjEyID0gbnVsbDsKKyAgQy5uYW1lMSh0aGlzLnYxMCwgdGhpcy52MTIpOworICBmYWN0b3J5IEMubmFtZTIoVCBhcmcxLCBUIGFyZzIpID0gQy5uYW1lMTsKKworICBUIG9wZXJhdG9yICsoVCBvdGhlcik7CisgIFQgZ2V0IGc7CisgIHNldCBnKFQgdmFsdWUpOworICBNYXA8VCwgVD4gbTEoY292YXJpYW50IFQgYXJnMSwgW1NldDxTZXQ8VD4+IGFyZzJdKTsKKyAgdm9pZCBtMih7VCBhcmcxLCBUIGFyZzIoVCBhcmcyMSwgVCBhcmcyMil9KTsKK30KKworY2xhc3MgRDEgZXh0ZW5kcyBUIHt9CithYnN0cmFjdCBjbGFzcyBEMyBpbXBsZW1lbnRzIFQge30KKworZXh0ZW5zaW9uIEUgb24gVCB7CisgIFQgZm9vKFQgdCkgPT4gdDsKK30KKworWCBmb288WD4oWCB4KSA9PiB4OworCitUIEZ1bmN0aW9uKFQpIGlkID0gKHgpID0+IHg7CisKK21haW4oKSB7CisgIHZhciB2MTMgPSA8VD5bXTsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtEMSgpfTsKKyAgdmFyIHYxNSA9IHt2MTN9OworICBTZXQ8TGlzdDxUPj4gdjE2ID0gdjE1OworICB2MTUgPSB2MTY7CisgIFQgdjE3ID0gZm9vPFQ+KEEoKSk7CisgIGlkKHYxNyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2Vfdm9pZF9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvdXNhZ2Vfdm9pZF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5NzExMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV92b2lkX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworLy8gSW50cm9kdWNlIGFuIGFsaWFzZWQgdHlwZS4KKwordHlwZWRlZiBUID0gdm9pZDsKKworLy8gVXNlIHRoZSBhbGlhc2VkIHR5cGUuCisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBmaW5hbCBUIHYxMjsKKworICBDKCk6IHYxMiA9IFQoKTsKKyAgLy8gICAgICAgICBeCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KKworY2xhc3MgRDEgZXh0ZW5kcyBUIHt9CisvLyAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMiBleHRlbmRzIEMgd2l0aCBUIHt9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIHVuc3BlY2lmaWVkCisvLyBbY2ZlXSB1bnNwZWNpZmllZAorCithYnN0cmFjdCBjbGFzcyBEMyBpbXBsZW1lbnRzIFQge30KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworYWJzdHJhY3QgY2xhc3MgRDQgPSBDIHdpdGggVDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKy8vIFtjZmVdIHVuc3BlY2lmaWVkCisKK1ggZm9vPFg+KFggeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHYxNCA9IDxTZXQ8VD4sIFNldDxUPj57e306IHt9fTsKKyAgdjE0W3t9XSA9IHtUKCl9OworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQoKTsKKy8vXgorLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorLy8gW2NmZV0gdW5zcGVjaWZpZWQKKworICBULm5hbWVkKCk7CisgIC8vXl5eXl4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQgdjE3ID0gZm9vPFQ+KFQoKSk7CisgIC8vICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSB1bnNwZWNpZmllZAorICAvLyBbY2ZlXSB1bnNwZWNpZmllZAorCisgIFQuc3RhdGljTWV0aG9kPFQ+KCk7CisgIC8vXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gdW5zcGVjaWZpZWQKKyAgLy8gW2NmZV0gdW5zcGVjaWZpZWQKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV92b2lkX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV92b2lkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjc1MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX3ZvaWRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCisvLyBJbnRyb2R1Y2UgYW4gYWxpYXNlZCB0eXBlLgorCit0eXBlZGVmIFQgPSB2b2lkOworCisvLyBVc2UgdGhlIGFsaWFzZWQgdHlwZS4KKworVCB2MTsKK0xpc3Q8VD4gdjIgPSBbXTsKK2ZpbmFsIFQgdjMgPSB0aHJvdyAiQW55dGhpbmciOworY29uc3QgTGlzdDxUPiB2NCA9IFtdOworY29uc3QgdjUgPSA8VHlwZSwgVHlwZT57VDogVH07CisKK2Fic3RyYWN0IGNsYXNzIEMgeworICBzdGF0aWMgVCB2NjsKKyAgc3RhdGljIExpc3Q8VD4gdjcgPSBbXTsKKyAgc3RhdGljIGZpbmFsIFQgdjggPSB0aHJvdyAiQW55dGhpbmciOworICBzdGF0aWMgY29uc3QgTGlzdDxUPiB2OSA9IFtdOworCisgIFQgdjEwOworICBMaXN0PFQ+IHYxMSA9IFtdOworICBmaW5hbCBUIHYxMjsKKworICBDLm5hbWUxKHRoaXMudjEwLCB0aGlzLnYxMik7CisgIGZhY3RvcnkgQy5uYW1lMihUIGFyZzEsIFQgYXJnMikgPSBDLm5hbWUxOworCisgIFQgb3BlcmF0b3IgKyhUIG90aGVyKTsKKyAgVCBnZXQgZzsKKyAgc2V0IGcoVCB2YWx1ZSk7CisgIE1hcDxULCBUPiBtMShjb3ZhcmlhbnQgVCBhcmcxLCBbU2V0PFNldDxUPj4gYXJnMl0pOworICB2b2lkIG0yKHtUIGFyZzEsIFQgYXJnMihUIGFyZzIxLCBUIGFyZzIyKX0pOworfQorCitleHRlbnNpb24gRSBvbiBUIHsKKyAgVCBmb28oVCB0KSA9PiB0OworfQorCitYIGZvbzxYPihYIHgpID0+IHg7CisKK1QgRnVuY3Rpb24oVCkgaWQgPSAoeCkgPT4geDsKKworbWFpbigpIHsKKyAgdmFyIHYxMyA9IDxUPltdOworICB2YXIgdjE0ID0gPFNldDxUPiwgU2V0PFQ+Pnt7fToge319OworICB2MTRbe31dID0ge307CisgIHZhciB2MTUgPSB7djEzfTsKKyAgU2V0PExpc3Q8VD4+IHYxNiA9IHYxNTsKKyAgdjE1ID0gdjE2OworICBUIHYxNyA9IG51bGw7CisgIGlkKHYxNyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9vdmVycmlkZS9pbmhlcml0YW5jZV9maWVsZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9vdmVycmlkZS9pbmhlcml0YW5jZV9maWVsZF90ZXN0LmRhcnQKaW5kZXggODQ3ZGU0ZC4uODcxZjFmMSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2Uvb3ZlcnJpZGUvaW5oZXJpdGFuY2VfZmllbGRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL292ZXJyaWRlL2luaGVyaXRhbmNlX2ZpZWxkX3Rlc3QuZGFydApAQCAtMiw4ICsyLDYgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi1pbXBvcnQgInBhY2thZ2U6bWV0YS9tZXRhLmRhcnQiIHNob3cgdmlydHVhbDsKLQogY2xhc3MgQSB7CiAgIGdldCBnZXR0ZXIxID0+IG51bGw7IC8vIyAwMTogb2sKICAgbnVtIGdldCBnZXR0ZXIyID0+IDA7IC8vIyAwMjogb2sKQEAgLTI2LDEyICsyNCwxMiBAQAogICBzZXQgc2V0dGVyMTAoaW50IF8pID0+IG51bGw7IC8vIyAzMDogY29tcGlsZS10aW1lIGVycm9yCiAgIHNldCBzZXR0ZXIxMShpbnQgXykgPT4gbnVsbDsgLy8jIDMxOiBjb21waWxlLXRpbWUgZXJyb3IKIAotICBAdmlydHVhbCBpbnQgZmllbGQxID0gMDsgLy8jIDQxOiBvaworICBpbnQgZmllbGQxID0gMDsgLy8jIDQxOiBvawogICBudW0gZmllbGQyID0gMDsgLy8jIDQyOiBjb21waWxlLXRpbWUgZXJyb3IKICAgaW50IGZpZWxkMyA9IDA7IC8vIyA0MzogY29tcGlsZS10aW1lIGVycm9yCiAgIGludCBmaWVsZDQgPSAwOyAvLyMgNDQ6IGNvbXBpbGUtdGltZSBlcnJvcgogICBpbnQgZmllbGQ1ID0gMDsgLy8jIDQ1OiBjb21waWxlLXRpbWUgZXJyb3IKLSAgQHZpcnR1YWwgbnVtIGZpZWxkNiA9IDA7IC8vIyA0Njogb2sKKyAgbnVtIGZpZWxkNiA9IDA7IC8vIyA0Njogb2sKICAgbnVtIGZpZWxkNyA9IDA7IC8vIyA0NzogY29tcGlsZS10aW1lIGVycm9yCiAgIG51bSBnZXQgZmllbGQ4ID0+IDA7IC8vIyA0ODogY29tcGlsZS10aW1lIGVycm9yCiAgIG51bSBmaWVsZDkgPSAwOyAvLyMgNDk6IGNvbXBpbGUtdGltZSBlcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3ByZWZpeF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfcHJlZml4X3Rlc3QuZGFydAppbmRleCA5MTg2NTYwLi4zNGMzMDIwIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfcHJlZml4X3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfcHJlZml4X3Rlc3QuZGFydApAQCAtNyw3ICs3LDcgQEAKICAgLy8gTGlicmFyeSBwcmVmaXhlcyBpbiB0aGUgaW1wb3J0ZWQgbGlicmFyaWVzIHNob3VsZCBub3QgYmUgdmlzaWJsZSBoZXJlLgogICBuZXcgbGliMTEuTGlicmFyeTExKDEpOwogICAvLyAgXl5eXl5eXl5eXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdsaWIxMS5MaWJyYXJ5MTEnLgogICBsaWIxMS5MaWJyYXJ5MTEuc3RhdGljX2Z1bmMoKTsKIC8vXl5eXl4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ByZWZpeC90cmFuc2l0aXZlX2ltcG9ydF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfdGVzdC5kYXJ0CmluZGV4IDBhZTNmYTcuLjI1Njg5NGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3ByZWZpeC90cmFuc2l0aXZlX2ltcG9ydF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3Rlc3QuZGFydApAQCAtMTAsNyArMTAsNyBAQAogICAvLyBDbGFzcyBzaG91bGQgbm90IGJlIHZpc2libGUuCiAgIG5ldyBsaWIxMi5MaWJyYXJ5MTEoMSk7CiAgIC8vICAgICAgICBeXl5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0xpYnJhcnkxMScuCiAKICAgLy8gVmFyaWFibGUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlLgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvcHJpdmF0ZS9hY2Nlc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvcHJpdmF0ZS9hY2Nlc3NfdGVzdC5kYXJ0CmluZGV4IGExY2Y2YTEuLjAxNmU0ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3ByaXZhdGUvYWNjZXNzX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9wcml2YXRlL2FjY2Vzc190ZXN0LmRhcnQKQEAgLTE5LDcgKzE5LDcgQEAKIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5VTkRFRklORURfRlVOQ1RJT04KICAgbmV3IF9DbGFzcygpOwogICAvLyAgXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdfQ2xhc3MnLgogICBwcml2YXRlLl9DbGFzcygpOwogLy9eCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MxNDM0OF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MxNDM0OF90ZXN0LmRhcnQKaW5kZXggOTZhYzE3ZC4uY2MzM2E0OCAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2UvcmVncmVzcy9yZWdyZXNzMTQzNDhfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL3JlZ3Jlc3MvcmVncmVzczE0MzQ4X3Rlc3QuZGFydApAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCAicGFja2FnZTpjb2xsZWN0aW9uL2VxdWFsaXR5LmRhcnQiOwogCiBtYWluKCkgewotICBjb25zdCBFcXVhbGl0eTxJdGVyYWJsZT4gZXEgPSBjb25zdCBVbm9yZGVyZWRJdGVyYWJsZUVxdWFsaXR5KCk7Ci0gIGNvbnN0IEVxdWFsaXR5PE1hcDxkeW5hbWljLCBJdGVyYWJsZT4+IG1hcGVxID0KLSAgICAgIGNvbnN0IE1hcEVxdWFsaXR5PGR5bmFtaWMsIEl0ZXJhYmxlPih2YWx1ZXM6IGVxKTsKKyAgY29uc3QgRXF1YWxpdHk8SXRlcmFibGU/PiBlcSA9IGNvbnN0IFVub3JkZXJlZEl0ZXJhYmxlRXF1YWxpdHkoKTsKKyAgY29uc3QgRXF1YWxpdHk8TWFwPGR5bmFtaWMsIEl0ZXJhYmxlPz4+IG1hcGVxID0KKyAgICAgIGNvbnN0IE1hcEVxdWFsaXR5PGR5bmFtaWMsIEl0ZXJhYmxlPz4odmFsdWVzOiBlcSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQKaW5kZXggZDc2NzY5MC4uMjZkOWZmNmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3JlZ3Jlc3MvcmVncmVzczIxNzkzX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQKQEAgLTE1LDYgKzE1LDYgQEAKIG1haW4oKSB7CiAgIHByaW50KG5ldyBBKCkoNDk5KSk7CiAgIC8vICAgICAgICBeCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdBJy4KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3JlZ3Jlc3MvcmVncmVzczM0NDk1X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3JlZ3Jlc3MvcmVncmVzczM0NDk1X3Rlc3QuZGFydAppbmRleCBjY2U5YmZlLi5mMzNmNGM1IDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzL3JlZ3Jlc3MzNDQ5NV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvcmVncmVzcy9yZWdyZXNzMzQ0OTVfdGVzdC5kYXJ0CkBAIC00LDcgKzQsNyBAQAogCiBmaW5hbCBmb28gPSBBPEI+LmZvbygpOwogLy8gICAgICAgICAgXgotLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnQScuCiAvLyAgICAgICAgICAgIF4KIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5OT05fVFlQRV9BU19UWVBFX0FSR1VNRU5UCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9zdXBlci9maWVsZF8yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3N1cGVyL2ZpZWxkXzJfdGVzdC5kYXJ0CmluZGV4IDUxY2M5MjYuLjgyYjg5OWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3N1cGVyL2ZpZWxkXzJfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlL3N1cGVyL2ZpZWxkXzJfdGVzdC5kYXJ0CkBAIC0zLDEwICszLDggQEAKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIGltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOwotaW1wb3J0ICJwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0IiBzaG93IHZpcnR1YWw7CiAKIGNsYXNzIEEgewotICBAdmlydHVhbAogICB2YXIgZm9vOwogICBBKHRoaXMuZm9vKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvc3VwZXIvZmllbGRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvc3VwZXIvZmllbGRfdGVzdC5kYXJ0CmluZGV4IGU0ZGQxMjcuLjFiZWY4NzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3N1cGVyL2ZpZWxkX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS9zdXBlci9maWVsZF90ZXN0LmRhcnQKQEAgLTQsNyArNCw2IEBACiAvLyBEYXJ0IHRlc3QgZm9yIHRlc3Rpbmcgc3VwZXIgZmllbGQgYWNjZXNzLgogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCIgc2hvdyB2aXJ0dWFsOwogCiBjbGFzcyBBIHsKICAgQSgpIHsKQEAgLTE0LDcgKzEzLDYgQEAKICAgICByZXR1cm4gIkdydWV6aSI7CiAgIH0KIAotICBAdmlydHVhbAogICBTdHJpbmcgY2l0eSA9ICIiOwogfQogCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hY2tlcm1hbm5fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWNrZXJtYW5uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVkMmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWNrZXJtYW5uX3Rlc3QuZGFydApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHZlcnNpb24gb2YgdHdvLWFyZ3VtZW50IEFja2VybWFubi1QZXRlciBmdW5jdGlvbi4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEFja2VybWFublRlc3QgeworICBzdGF0aWMgaW50IGFjayhpbnQgbSwgaW50IG4pIHsKKyAgICByZXR1cm4gbSA9PSAwCisgICAgICAgID8gbiArIDEKKyAgICAgICAgOiAoKG4gPT0gMCkgPyBhY2sobSAtIDEsIDEpIDogYWNrKG0gLSAxLCBhY2sobSwgbiAtIDEpKSk7CisgIH0KKworICBzdGF0aWMgdGVzdE1haW4oKSB7CisgICAgRXhwZWN0LmVxdWFscygyNTMsIGFjaygzLCA1KSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgQWNrZXJtYW5uVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWRkaXRpb25hbF9pbnRlcmZhY2VfYWRkc19vcHRpb25hbF9hcmdzX2NvbmNyZXRlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FkZGl0aW9uYWxfaW50ZXJmYWNlX2FkZHNfb3B0aW9uYWxfYXJnc19jb25jcmV0ZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlNDEzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FkZGl0aW9uYWxfaW50ZXJmYWNlX2FkZHNfb3B0aW9uYWxfYXJnc19jb25jcmV0ZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgdm9pZCBmb28oKSB7fQorfQorCithYnN0cmFjdCBjbGFzcyBJIHsKKyAgdm9pZCBmb28oW3hdKTsKK30KKworY2xhc3MgLypAY29tcGlsZS1lcnJvcj11bnNwZWNpZmllZCovIEIgZXh0ZW5kcyBBIGltcGxlbWVudHMgSSB7CisgIC8vIFRoaXMgY2xhc3MgZGVjbGFyYXRpb24gdmlvbGF0ZXMgc291bmRuZXNzLCBzaW5jZSBpdCBhbGxvd3MgYG5ldworICAvLyBCKCkuZm9vKDQyKWAsIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW52YWxpZCBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIHRvIEEuZm9vLgorfQorCit2b2lkIGYoQiBiKSB7CisgIGIuZm9vKCk7Cit9CisKK21haW4oKSB7CisgIGYobmV3IEIoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hZGRpdGlvbmFsX2ludGVyZmFjZV9hZGRzX29wdGlvbmFsX2FyZ3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWRkaXRpb25hbF9pbnRlcmZhY2VfYWRkc19vcHRpb25hbF9hcmdzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk5NTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWRkaXRpb25hbF9pbnRlcmZhY2VfYWRkc19vcHRpb25hbF9hcmdzX3Rlc3QuZGFydApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgdGVzdCBleGVyY2lzZXMgYSBjb3JuZXIgY2FzZSBvZiBvdmVycmlkZSBjaGVja2luZyB0aGF0IGlzIHNhZmUgZnJvbSBhCisvLyBzb3VuZG5lc3MgcGVyc3BlY3RpdmUsIGJ1dCB3aGljaCB3ZSBoYXZlbid0IGRlY2lkZWQgd2hldGhlciBvciBub3QgdG8gYWxsb3cKKy8vIGZyb20gYSB1c2FiaWxpdHkgcGVyc3BlY3RpdmUuCisKK2NsYXNzIEEgeworICB2b2lkIGZvbygpIHt9Cit9CisKK2Fic3RyYWN0IGNsYXNzIEkgeworICB2b2lkIGZvbyhbeF0pOworfQorCithYnN0cmFjdCBjbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEkgeworICAvLyBJZiB0aGlzIGNsYXNzIHdlcmUgY29uY3JldGUsIHRoZXJlIHdvdWxkIGJlIGEgcHJvYmxlbSwgc2luY2UgYG5ldworICAvLyBCKCkuZm9vKDQyKWAgd291bGQgYmUgc3RhdGljYWxseSBhbGxvd2VkLCBidXQgd291bGQgbGVhZCB0byBpbnZhbGlkCisgIC8vIGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgdG8gQS5mb28uICBCdXQgc2luY2UgdGhlIGNsYXNzIGlzIGFic3RyYWN0LCB0aGVyZSBpcworICAvLyBubyBwcm9ibGVtLgorfQorCitjbGFzcyBDIGV4dGVuZHMgQiB7CisgIHZvaWQgZm9vKFt4XSkgeworICAgIHN1cGVyLmZvbygpOworICB9Cit9CisKK3ZvaWQgZihCIGIpIHsKKyAgYi5mb28oNDIpOworfQorCittYWluKCkgeworICBmKG5ldyBDKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWxsb2NhdGVfbGFyZ2Vfb2JqZWN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FsbG9jYXRlX2xhcmdlX29iamVjdF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0ZDI2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hbGxvY2F0ZV9sYXJnZV9vYmplY3RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEEgeworICBpbnQgYTsKKyAgZG91YmxlPyBkMTsKKyAgZG91YmxlPyBkMjsKKyAgZG91YmxlPyBkMzsKKyAgZG91YmxlPyBkNDsKKyAgZG91YmxlPyBkNTsKKyAgZG91YmxlPyBkNjsKKyAgZG91YmxlPyBkNzsKKyAgZG91YmxlPyBkODsKKyAgZG91YmxlPyBkOTsKKyAgZG91YmxlPyBkMTA7CisgIGRvdWJsZT8gZDExOworICBkb3VibGU/IGQxMjsKKyAgZG91YmxlPyBkMTM7CisgIGRvdWJsZT8gZDE0OworICBzdGF0aWMgdmFyIHM7CisKKyAgc3RhdGljIGZvbygpIHsKKyAgICByZXR1cm4gczsKKyAgfQorCisgIEEodGhpcy5hKSB7fQorCisgIHZhbHVlKCkgeworICAgIHJldHVybiBhICsgZm9vKCk7CisgIH0KK30KKworY2xhc3MgQWxsb2NhdGVMYXJnZU9iamVjdCB7CisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICB2YXIgYSA9IG5ldyBBKDEpOworICAgIEEucyA9IDQ7CisgICAgRXhwZWN0LmVxdWFscyg1LCBhLnZhbHVlKCkpOworICB9Cit9CisKK21haW4oKSB7CisgIEFsbG9jYXRlTGFyZ2VPYmplY3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FsbG9jYXRlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FsbG9jYXRlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIyNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYWxsb2NhdGVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIE15QWxsb2NhdGUgeworICBjb25zdCBNeUFsbG9jYXRlKFtpbnQgdmFsdWUgPSAwXSkgOiB2YWx1ZV8gPSB2YWx1ZTsKKyAgaW50IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZV87CisgIH0KKworICBmaW5hbCBpbnQgdmFsdWVfOworfQorCitjbGFzcyBBbGxvY2F0ZVRlc3QgeworICBzdGF0aWMgdGVzdE1haW4oKSB7CisgICAgRXhwZWN0LmVxdWFscyg5MDAsIChuZXcgTXlBbGxvY2F0ZSg5MDApKS5nZXRWYWx1ZSgpKTsKKyAgfQorfQorCittYWluKCkgeworICBBbGxvY2F0ZVRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2FyZ19wYXJhbV90cmFpbGluZ19jb21tYV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hcmdfcGFyYW1fdHJhaWxpbmdfY29tbWFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWM0MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hcmdfcGFyYW1fdHJhaWxpbmdfY29tbWFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTYyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBwYXJhbXMuCisKKy8vIENvbnZlbmllbmNlIHZhbHVlcy4KK3ZhciBjID0gbmV3IEMoKTsKK3ZhciB4ID0gNDI7Cit2YXIgeSA9IDQyOwordmFyIHogPSA0MjsKKworLy8gVHJhaWxpbmcgY29tbWEgaW4gcGFyYW1ldGVyIGxpc3RzLgorCisvLyBUeXBlZGVmcy4KK3R5cGVkZWYgZngoeCwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IG9rCit0eXBlZGVmIGZ5KFt5LF0pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK3R5cGVkZWYgZnh5KHgsIFt5LCBdKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAordHlwZWRlZiBmeih7eix9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCit0eXBlZGVmIGZ4eih4LCB7eiwgfSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKworLy8gQXMgYXJndW1lbnRzIHR5cGUuCithcmdmeCh2b2lkIGYoeCwgKSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK2FyZ2Z5KHZvaWQgZihbeSwgXSkpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorYXJnZnh5KHZvaWQgZih4LCBbeSwgXSkpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCithcmdmeih2b2lkIGYoe3osIH0pKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK2FyZ2Z4eih2b2lkIGYoeCwge3osIH0pKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisvLyBUb3AgbGV2ZWwgZnVuY3Rpb25zCit2b2lkIHRvcHgoeCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK3ZvaWQgdG9weShbeSwgXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAordm9pZCB0b3B4eSh4LCBbeSwgXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCit2b2lkIHRvcHooe3osIH0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK3ZvaWQgdG9weHooeCwge3osIH0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCit2b2lkIHNldCB0b3BzZXR4KHgsICkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKworLy8gQWZ0ZXIgc3BlY2lmaWMgcGFyYW1ldGVyIGZvcm1hdHMuCit2b2lkIGFmdGVyRGVmYXVsdFZhbHVlWShbaW50IHkgPSA0MiwgXSkge30gLy8gICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK3ZvaWQgYWZ0ZXJEZWZhdWx0VmFsdWVaKHtpbnQgeiA6IDQyLCB9KSB7fSAvLyAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAordm9pZCBhZnRlckZ1bnNpZ1godm9pZCBmKCksKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCit2b2lkIGFmdGVyRnVuc2lnWShbdm9pZCBmKCk/LF0pIHt9IC8vICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK3ZvaWQgYWZ0ZXJGdW5zaWdaKHt2b2lkIGYoKT8sfSkge30gLy8gICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAordm9pZCBhZnRlckZ1bnNpZ0RlZmF1bHRWYWx1ZVkoW3ZvaWQgZigpID0gdG9weSxdKSB7fSAvLyAvLyMgbm9uZTogY29udGludWVkCit2b2lkIGFmdGVyRnVuc2lnRGVmYXVsdFZhbHVlWih7dm9pZCBmKCkgOiB0b3B6LH0pIHt9IC8vIC8vIyBub25lOiBjb250aW51ZWQKKworY2xhc3MgQyB7CisgIEMoKTsKKworICAvLyBDb25zdHJ1Y3RvcnMuCisgIEMueCh4LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy55KFt5LCBdKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnh5KHgsIFt5LCBdKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMueih7eiwgfSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy54eih4LCB7eiwgfSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisgIC8vIFN0YXRpYyBtZW1iZXJzCisgIHN0YXRpYyB2b2lkIHN0YXRpY3goeCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgc3RhdGljIHZvaWQgc3RhdGljeShbeSwgXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBzdGF0aWMgdm9pZCBzdGF0aWN4eSh4LCBbeSwgXSkge30gLy8gICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHN0YXRpYyB2b2lkIHN0YXRpY3ooe3osIH0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgc3RhdGljIHZvaWQgc3RhdGljeHooeCwge3osIH0pIHt9IC8vICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisgIHN0YXRpYyB2b2lkIHNldCBzdGF0aWNzZXR4KHgsICkge30gLy8gICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKworICAvLyBJbnN0YW5jZSBtZW1iZXJzCisgIHZvaWQgaW5zdGFuY2V4KHgsKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdm9pZCBpbnN0YW5jZXkoW3ksIF0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICB2b2lkIGluc3RhbmNleHkoeCwgW3ksIF0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHZvaWQgaW5zdGFuY2V6KHt6LCB9KSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdm9pZCBpbnN0YW5jZXh6KHgsIHt6LCB9KSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisgIHZvaWQgc2V0IGluc3RhbmNlc2V0eCh4LCApIHt9IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKworICBvcGVyYXRvciArKHgsICkgPT4gdGhpczsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG9wZXJhdG9yIFtdPSh4LCB5LCApIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKK30KKworbWFpbigpIHsKKyAgdGVzdENhbGxzKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICAvLyBNYWtlIHN1cmUgdGhlIGNhc2VzIGFyZSBjaGVja2VkLgorICB0ZXN0QmFkQ2FsbHMoKTsKK30KKwordm9pZCB0ZXN0Q2FsbHMoKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIG5vcm1hbGx5CisgIHRvcHgoeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdG9weSh5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICB0b3B4eSh4LCB5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHRvcHooKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdG9weih6OiB6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICB0b3B4eih4KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHRvcHh6KHgsIHo6IHopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdG9wc2V0eCA9IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBhZnRlckRlZmF1bHRWYWx1ZVkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGFmdGVyRGVmYXVsdFZhbHVlWSh5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYWZ0ZXJEZWZhdWx0VmFsdWVaKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBhZnRlckRlZmF1bHRWYWx1ZVooejogeik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG5ldyBDLngoeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgbmV3IEMueHkoeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBuZXcgQy54eSh4LCB5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG5ldyBDLnkoeSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgbmV3IEMueHooeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBuZXcgQy54eih4LCB6OiB6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG5ldyBDLnooejogeik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy5zdGF0aWN4KHgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnN0YXRpY3koeSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljeHkoeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy5zdGF0aWN4eSh4LCB5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnN0YXRpY3ooKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljeih6OiB6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy5zdGF0aWN4eih4KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnN0YXRpY3h6KHgsIHo6IHopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljc2V0eCA9IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXgoeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjLmluc3RhbmNleSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGMuaW5zdGFuY2V5KHkpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXh5KHgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjLmluc3RhbmNleHkoeCwgeSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGMuaW5zdGFuY2V6KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXooejogeik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjLmluc3RhbmNleHooeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGMuaW5zdGFuY2V4eih4LCB6OiB6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXNldHggPSB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjICsgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGNbeF0gPSB5OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKworICAvLyBDYWxsIHdpdGggZXh0cmEgY29tbWEgKG5vdCBwb3NzaWJsZSBmb3Igc2V0dGVycyBhbmQgb3BlcmF0b3JzKS4KKyAgdG9weCh4LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICB0b3B5KHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHRvcHh5KHgsIHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdG9weHkoeCwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICB0b3B6KHo6IHosICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIHRvcHh6KHgsICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgdG9weHooeCwgejogeiwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBuZXcgQy54KHgsICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG5ldyBDLnh5KHgsIHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgbmV3IEMueHkoeCwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBuZXcgQy55KHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIG5ldyBDLnh6KHgsICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgbmV3IEMueHooeCwgejogeiwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBuZXcgQy56KHo6IHosICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljeCh4LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy5zdGF0aWN5KHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnN0YXRpY3h5KHgsIHksICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljeHkoeCwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgQy5zdGF0aWN6KHo6IHosICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBDLnN0YXRpY3h6KHgsICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIEMuc3RhdGljeHooeCwgejogeiwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXgoeCwgKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjLmluc3RhbmNleSh5LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGMuaW5zdGFuY2V4eSh4LCB5LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXh5KHgsICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBjLmluc3RhbmNleih6OiB6LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGMuaW5zdGFuY2V4eih4LCApOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYy5pbnN0YW5jZXh6KHgsIHo6IHosICk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisgIC8vIFR5cGVkZWZzIHdvcmsgYXMgZXhwZWN0ZWQuCisgIGlmICh0b3B4IGlzISBmeCkgdGhyb3cgIkJhZCB0eXBlOiAkZngiOyAvLyAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgaWYgKHRvcHkgaXMhIGZ5KSB0aHJvdyAiQmFkIHR5cGU6ICRmeSI7IC8vICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBpZiAodG9weHkgaXMhIGZ4eSkgdGhyb3cgIkJhZCB0eXBlOiAkZnh5IjsgLy8gICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGlmICh0b3B6IGlzISBmeikgdGhyb3cgIkJhZCB0eXBlOiAkZnoiOyAvLyAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgaWYgKHRvcHh6IGlzISBmeHopIHRocm93ICJCYWQgdHlwZTogJGZ4eiI7IC8vICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorCisgIC8vIFBhcmFtZXRlciB0eXBlcyB3b3JrIChjaGVja2VkIG1vZGUgb25seSB0ZXN0KS4KKyAgYXJnZngodG9weCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBhcmdmeSh0b3B5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCisgIGFyZ2Z4eSh0b3B4eSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyBub25lOiBjb250aW51ZWQKKyAgYXJnZnoodG9weik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIG5vbmU6IGNvbnRpbnVlZAorICBhcmdmeHoodG9weHopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgbm9uZTogY29udGludWVkCit9CisKKy8vIEludmFsaWQgc3ludGF4LiBUaGlzIHdhcyBpbnZhbGlkIHN5bnRheCBiZWZvcmUgdGhlIGFkZGl0aW9uIG9mIHRyYWlsaW5nCisvLyBjb21tYXMgdG9vLCBhbmQgc2hvdWxkIHN0YXkgdGhhdCB3YXkuCit2b2lkIHRvcEJhZEVtcHR5KCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFN0YXJ0KCwgYSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZEVuZChhLCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZE1pZGRsZShhLCwgYikge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgNDogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc0VtcHR5KFtdKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNTogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc0VtcHR5KCxbXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgNjogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc0VtcHR5KFssXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgNzogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc0VtcHR5KFtdLCkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgODogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc1N0YXJ0KCxbYV0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAvLyMgOTogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc1N0YXJ0KFssIGFdKSB7fSAvLyAgICAgICAgICAgICAgICAgICAvLyMgMTA6IHN5bnRheCBlcnJvcgordm9pZCB0b3BCYWRQb3NFbmQoW2EsLF0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDExOiBzeW50YXggZXJyb3IKK3ZvaWQgdG9wQmFkUG9zU3RhcnQoW2FdLCkge30gLy8gICAgICAgICAgICAgICAgICAgIC8vIyAxMjogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZFBvc01pZGRsZShbYSwsIGJdKSB7fSAvLyAgICAgICAgICAgICAgICAvLyMgMTM6IHN5bnRheCBlcnJvcgordm9pZCB0b3BCYWROYW1FbXB0eSh7fSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDE0OiBzeW50YXggZXJyb3IKK3ZvaWQgdG9wQmFkTmFtRW1wdHkoLHt9KSB7fSAvLyAgICAgICAgICAgICAgICAgICAgIC8vIyAxNTogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZE5hbUVtcHR5KHssfSkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgMTY6IHN5bnRheCBlcnJvcgordm9pZCB0b3BCYWROYW1FbXB0eSh7fSwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDE3OiBzeW50YXggZXJyb3IKK3ZvaWQgdG9wQmFkTmFtU3RhcnQoLHthfSkge30gLy8gICAgICAgICAgICAgICAgICAgIC8vIyAxODogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZE5hbVN0YXJ0KHssIGF9KSB7fSAvLyAgICAgICAgICAgICAgICAgICAvLyMgMTk6IHN5bnRheCBlcnJvcgordm9pZCB0b3BCYWROYW1FbmQoe2EsLH0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDIwOiBzeW50YXggZXJyb3IKK3ZvaWQgdG9wQmFkTmFtU3RhcnQoe2F9LCkge30gLy8gICAgICAgICAgICAgICAgICAgIC8vIyAyMTogc3ludGF4IGVycm9yCit2b2lkIHRvcEJhZE5hbU1pZGRsZSh7YSwsIGJ9KSB7fSAvLyAgICAgICAgICAgICAgICAvLyMgMjI6IHN5bnRheCBlcnJvcgordm9pZCBzZXQgdG9wU2V0QmFkRW1wdHkoLCkge30gLy8gICAgICAgICAgICAgICAgICAgLy8jIDIzOiBzeW50YXggZXJyb3IKK3ZvaWQgc2V0IHRvcFNldEJhZFN0YXJ0KCwgYSkge30gLy8gICAgICAgICAgICAgICAgIC8vIyAyNDogc3ludGF4IGVycm9yCit2b2lkIHNldCB0b3BTZXRCYWRFbmQoYSwsKSB7fSAvLyAgICAgICAgICAgICAgICAgICAvLyMgMjU6IHN5bnRheCBlcnJvcgordm9pZCBzZXQgdG9wU2V0QmFkTWlkZGxlKGEsLCBiKSB7fSAvLyAgICAgICAgICAgICAgLy8jIDI2OiBzeW50YXggZXJyb3IKK2NsYXNzIEJhZCB7CisgIEJhZCgpIHt9CisgIEJhZC5lbXB0eSgsKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjc6IHN5bnRheCBlcnJvcgorICBCYWQuc3RhcnQoLCBhKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDI4OiBzeW50YXggZXJyb3IKKyAgQmFkLmVuZChhLCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyOTogc3ludGF4IGVycm9yCisgIEJhZC5taWRkbGUoYSwsIGIpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzA6IHN5bnRheCBlcnJvcgorICBCYWQucG9zRW1wdHkoW10pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDMxOiBzeW50YXggZXJyb3IKKyAgQmFkLnBvc0VtcHR5KCxbXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzMjogc3ludGF4IGVycm9yCisgIEJhZC5wb3NFbXB0eShbLF0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzM6IHN5bnRheCBlcnJvcgorICBCYWQucG9zRW1wdHkoW10sKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDM0OiBzeW50YXggZXJyb3IKKyAgQmFkLnBvc1N0YXJ0KCxbYV0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzNTogc3ludGF4IGVycm9yCisgIEJhZC5wb3NTdGFydChbLCBhXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzY6IHN5bnRheCBlcnJvcgorICBCYWQucG9zRW5kKFthLCxdKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDM3OiBzeW50YXggZXJyb3IKKyAgQmFkLnBvc1N0YXJ0KFthXSwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzODogc3ludGF4IGVycm9yCisgIEJhZC5Qb3NNaWRkbGUoW2EsLCBiXSkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgMzk6IHN5bnRheCBlcnJvcgorICBCYWQubmFtRW1wdHkoe30pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQwOiBzeW50YXggZXJyb3IKKyAgQmFkLm5hbUVtcHR5KCx7fSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0MTogc3ludGF4IGVycm9yCisgIEJhZC5uYW1FbXB0eSh7LH0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgNDI6IHN5bnRheCBlcnJvcgorICBCYWQubmFtRW1wdHkoe30sKSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQzOiBzeW50YXggZXJyb3IKKyAgQmFkLm5hbVN0YXJ0KCx7YX0pIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0NDogc3ludGF4IGVycm9yCisgIEJhZC5uYW1TdGFydCh7LCBhfSkge30gLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgNDU6IHN5bnRheCBlcnJvcgorICBCYWQubmFtRW5kKHthLCx9KSB7fSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQ2OiBzeW50YXggZXJyb3IKKyAgQmFkLm5hbVN0YXJ0KHthfSwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0Nzogc3ludGF4IGVycm9yCisgIEJhZC5uYW1NaWRkbGUoe2EsLCBifSkge30gLy8gICAgICAgICAgICAgICAgICAgICAvLyMgNDg6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWRFbXB0eSgsKSB7fSAvLyAgICAgICAgICAgICAgLy8jIDQ5OiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkU3RhcnQoLCBhKSB7fSAvLyAgICAgICAgICAgIC8vIyA1MDogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZEVuZChhLCwpIHt9IC8vICAgICAgICAgICAgICAvLyMgNTE6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWRNaWRkbGUoYSwsIGIpIHt9IC8vICAgICAgICAgLy8jIDUyOiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkUG9zRW1wdHkoW10pIHt9IC8vICAgICAgICAgIC8vIyA1Mzogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZFBvc0VtcHR5KCxbXSkge30gLy8gICAgICAgICAvLyMgNTQ6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWRQb3NFbXB0eShbLF0pIHt9IC8vICAgICAgICAgLy8jIDU1OiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkUG9zRW1wdHkoW10sKSB7fSAvLyAgICAgICAgIC8vIyA1Njogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZFBvc1N0YXJ0KCxbYV0pIHt9IC8vICAgICAgICAvLyMgNTc6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWRQb3NTdGFydChbLCBhXSkge30gLy8gICAgICAgLy8jIDU4OiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkUG9zRW5kKFthLCxdKSB7fSAvLyAgICAgICAgIC8vIyA1OTogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZFBvc1N0YXJ0KFthXSwpIHt9IC8vICAgICAgICAvLyMgNjA6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWRQb3NNaWRkbGUoW2EsLCBiXSkge30gLy8gICAgLy8jIDYxOiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkTmFtRW1wdHkoe30pIHt9IC8vICAgICAgICAgIC8vIyA2Mjogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZE5hbUVtcHR5KCx7fSkge30gLy8gICAgICAgICAvLyMgNjM6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWROYW1FbXB0eSh7LH0pIHt9IC8vICAgICAgICAgLy8jIDY0OiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkTmFtRW1wdHkoe30sKSB7fSAvLyAgICAgICAgIC8vIyA2NTogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZE5hbVN0YXJ0KCx7YX0pIHt9IC8vICAgICAgICAvLyMgNjY6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWROYW1TdGFydCh7LCBhfSkge30gLy8gICAgICAgLy8jIDY3OiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc3RhdGljQmFkTmFtRW5kKHthLCx9KSB7fSAvLyAgICAgICAgIC8vIyA2ODogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHN0YXRpY0JhZE5hbVN0YXJ0KHthfSwpIHt9IC8vICAgICAgICAvLyMgNjk6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzdGF0aWNCYWROYW1NaWRkbGUoe2EsLCBifSkge30gLy8gICAgLy8jIDcwOiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc2V0IHN0YXRpY1NldEJhZEVtcHR5KCwpIHt9IC8vICAgICAgIC8vIyA3MTogc3ludGF4IGVycm9yCisgIHN0YXRpYyB2b2lkIHNldCBzdGF0aWNTZXRCYWRTdGFydCgsIGEpIHt9IC8vICAgICAvLyMgNzI6IHN5bnRheCBlcnJvcgorICBzdGF0aWMgdm9pZCBzZXQgc3RhdGljU2V0QmFkRW5kKGEsLCkge30gLy8gICAgICAgLy8jIDczOiBzeW50YXggZXJyb3IKKyAgc3RhdGljIHZvaWQgc2V0IHN0YXRpY1NldEJhZE1pZGRsZShhLCwgYikge30gLy8gIC8vIyA3NDogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWRFbXB0eSgsKSB7fSAvLyAgICAgICAgICAgICAgICAgICAvLyMgNzU6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkU3RhcnQoLCBhKSB7fSAvLyAgICAgICAgICAgICAgICAgLy8jIDc2OiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZEVuZChhLCwpIHt9IC8vICAgICAgICAgICAgICAgICAgIC8vIyA3Nzogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWRNaWRkbGUoYSwsIGIpIHt9IC8vICAgICAgICAgICAgICAvLyMgNzg6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkUG9zRW1wdHkoW10pIHt9IC8vICAgICAgICAgICAgICAgLy8jIDc5OiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZFBvc0VtcHR5KCxbXSkge30gLy8gICAgICAgICAgICAgIC8vIyA4MDogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWRQb3NFbXB0eShbLF0pIHt9IC8vICAgICAgICAgICAgICAvLyMgODE6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkUG9zRW1wdHkoW10sKSB7fSAvLyAgICAgICAgICAgICAgLy8jIDgyOiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZFBvc1N0YXJ0KCxbYV0pIHt9IC8vICAgICAgICAgICAgIC8vIyA4Mzogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWRQb3NTdGFydChbLCBhXSkge30gLy8gICAgICAgICAgICAvLyMgODQ6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkUG9zRW5kKFthLCxdKSB7fSAvLyAgICAgICAgICAgICAgLy8jIDg1OiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZFBvc1N0YXJ0KFthXSwpIHt9IC8vICAgICAgICAgICAgIC8vIyA4Njogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWRQb3NNaWRkbGUoW2EsLCBiXSkge30gLy8gICAgICAgICAvLyMgODc6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkTmFtRW1wdHkoe30pIHt9IC8vICAgICAgICAgICAgICAgLy8jIDg4OiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZE5hbUVtcHR5KCx7fSkge30gLy8gICAgICAgICAgICAgIC8vIyA4OTogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWROYW1FbXB0eSh7LH0pIHt9IC8vICAgICAgICAgICAgICAvLyMgOTA6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkTmFtRW1wdHkoe30sKSB7fSAvLyAgICAgICAgICAgICAgLy8jIDkxOiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZE5hbVN0YXJ0KCx7YX0pIHt9IC8vICAgICAgICAgICAgIC8vIyA5Mjogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWROYW1TdGFydCh7LCBhfSkge30gLy8gICAgICAgICAgICAvLyMgOTM6IHN5bnRheCBlcnJvcgorICB2b2lkIGluc3RhbmNlQmFkTmFtRW5kKHthLCx9KSB7fSAvLyAgICAgICAgICAgICAgLy8jIDk0OiBzeW50YXggZXJyb3IKKyAgdm9pZCBpbnN0YW5jZUJhZE5hbVN0YXJ0KHthfSwpIHt9IC8vICAgICAgICAgICAgIC8vIyA5NTogc3ludGF4IGVycm9yCisgIHZvaWQgaW5zdGFuY2VCYWROYW1NaWRkbGUoe2EsLCBifSkge30gLy8gICAgICAgICAvLyMgOTY6IHN5bnRheCBlcnJvcgorICB2b2lkIHNldCBpbnN0YW5jZVNldEJhZEVtcHR5KCwpIHt9IC8vICAgICAgICAgICAgLy8jIDk3OiBzeW50YXggZXJyb3IKKyAgdm9pZCBzZXQgaW5zdGFuY2VTZXRCYWRTdGFydCgsIGEpIHt9IC8vICAgICAgICAgIC8vIyA5ODogc3ludGF4IGVycm9yCisgIHZvaWQgc2V0IGluc3RhbmNlU2V0QmFkRW5kKGEsLCkge30gLy8gICAgICAgICAgICAvLyMgOTk6IHN5bnRheCBlcnJvcgorICB2b2lkIHNldCBpbnN0YW5jZVNldEJhZE1pZGRsZShhLCwgYikge30gLy8gICAgICAgLy8jIDEwMDogc3ludGF4IGVycm9yCisgIHZvaWQgb3BlcmF0b3IgKigsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTAxOiBzeW50YXggZXJyb3IKKyAgdm9pZCBvcGVyYXRvciAqKCwgYSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMDI6IHN5bnRheCBlcnJvcgorICB2b2lkIG9wZXJhdG9yICooYSwsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEwMzogc3ludGF4IGVycm9yCisgIHZvaWQgb3BlcmF0b3IgW109KCwgYSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA0OiBzeW50YXggZXJyb3IKKyAgdm9pZCBvcGVyYXRvciBbXT0oYSwsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMDU6IHN5bnRheCBlcnJvcgorICB2b2lkIG9wZXJhdG9yIFtdPShhLCwgYik7IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDEwNjogc3ludGF4IGVycm9yCisgIHZvaWQgb3BlcmF0b3IgW109KGEsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA3OiBjb21waWxlLXRpbWUgZXJyb3IKKworICBtZXRob2QoKSB7CisgICAgLy8gTG9jYWwgbWV0aG9kcy4KKyAgICB2b2lkIGxvY2FsQmFkRW1wdHkoLCkge30gLy8gICAgICAgICAgICAgICAgICAgIC8vIyAxMDg6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWRTdGFydCgsIGEpIHt9IC8vICAgICAgICAgICAgICAgICAgLy8jIDEwOTogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZEVuZChhLCwpIHt9IC8vICAgICAgICAgICAgICAgICAgICAvLyMgMTEwOiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkTWlkZGxlKGEsLCBiKSB7fSAvLyAgICAgICAgICAgICAgIC8vIyAxMTE6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWRQb3NFbXB0eShbXSkge30gLy8gICAgICAgICAgICAgICAgLy8jIDExMjogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZFBvc0VtcHR5KCxbXSkge30gLy8gICAgICAgICAgICAgICAvLyMgMTEzOiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkUG9zRW1wdHkoWyxdKSB7fSAvLyAgICAgICAgICAgICAgIC8vIyAxMTQ6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWRQb3NFbXB0eShbXSwpIHt9IC8vICAgICAgICAgICAgICAgLy8jIDExNTogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZFBvc1N0YXJ0KCxbYV0pIHt9IC8vICAgICAgICAgICAgICAvLyMgMTE2OiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkUG9zU3RhcnQoWywgYV0pIHt9IC8vICAgICAgICAgICAgIC8vIyAxMTc6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWRQb3NFbmQoW2EsLF0pIHt9IC8vICAgICAgICAgICAgICAgLy8jIDExODogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZFBvc1N0YXJ0KFthXSwpIHt9IC8vICAgICAgICAgICAgICAvLyMgMTE5OiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkUG9zTWlkZGxlKFthLCwgYl0pIHt9IC8vICAgICAgICAgIC8vIyAxMjA6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWROYW1FbXB0eSh7fSkge30gLy8gICAgICAgICAgICAgICAgLy8jIDEyMTogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZE5hbUVtcHR5KCx7fSkge30gLy8gICAgICAgICAgICAgICAvLyMgMTIyOiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkTmFtRW1wdHkoeyx9KSB7fSAvLyAgICAgICAgICAgICAgIC8vIyAxMjM6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWROYW1FbXB0eSh7fSwpIHt9IC8vICAgICAgICAgICAgICAgLy8jIDEyNDogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZE5hbVN0YXJ0KCx7YX0pIHt9IC8vICAgICAgICAgICAgICAvLyMgMTI1OiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkTmFtU3RhcnQoeywgYX0pIHt9IC8vICAgICAgICAgICAgIC8vIyAxMjY6IHN5bnRheCBlcnJvcgorICAgIHZvaWQgbG9jYWxCYWROYW1FbmQoe2EsLH0pIHt9IC8vICAgICAgICAgICAgICAgLy8jIDEyNzogc3ludGF4IGVycm9yCisgICAgdm9pZCBsb2NhbEJhZE5hbVN0YXJ0KHthfSwpIHt9IC8vICAgICAgICAgICAgICAvLyMgMTI4OiBzeW50YXggZXJyb3IKKyAgICB2b2lkIGxvY2FsQmFkTmFtTWlkZGxlKHthLCwgYn0pIHt9IC8vICAgICAgICAgIC8vIyAxMjk6IHN5bnRheCBlcnJvcgorCisgICAgLy8gaW52YWxpZCBjYWxscy4KKworICAgIHRvcHgoLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEzMDogc3ludGF4IGVycm9yCisgICAgdG9weSgsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTMxOiBzeW50YXggZXJyb3IKKyAgICB0b3B6KCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMzI6IHN5bnRheCBlcnJvcgorICAgIHRvcHgoLCB4KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEzMzogc3ludGF4IGVycm9yCisgICAgdG9weigsIHo6eik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTM0OiBzeW50YXggZXJyb3IKKyAgICB0b3B4eSh4LCwgeSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMzU6IHN5bnRheCBlcnJvcgorICAgIHRvcHh6KHgsLCB6OnopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEzNjogc3ludGF4IGVycm9yCisgICAgdG9weCh4LCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTM3OiBzeW50YXggZXJyb3IKKyAgICB0b3B6KHo6eiwsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMzg6IHN5bnRheCBlcnJvcgorCisgICAgbmV3IEMueCgsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTM5OiBzeW50YXggZXJyb3IKKyAgICBuZXcgQy55KCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNDA6IHN5bnRheCBlcnJvcgorICAgIG5ldyBDLnooLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE0MTogc3ludGF4IGVycm9yCisgICAgbmV3IEMueCgsIHgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTQyOiBzeW50YXggZXJyb3IKKyAgICBuZXcgQy56KCwgejp6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNDM6IHN5bnRheCBlcnJvcgorICAgIG5ldyBDLnh5KHgsLCB5KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE0NDogc3ludGF4IGVycm9yCisgICAgbmV3IEMueHooeCwsIHo6eik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTQ1OiBzeW50YXggZXJyb3IKKyAgICBuZXcgQy54KHgsLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNDY6IHN5bnRheCBlcnJvcgorICAgIG5ldyBDLnooejp6LCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE0Nzogc3ludGF4IGVycm9yCisKKyAgICBDLnN0YXRpY3goLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNDg6IHN5bnRheCBlcnJvcgorICAgIEMuc3RhdGljeSgsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE0OTogc3ludGF4IGVycm9yCisgICAgQy5zdGF0aWN6KCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTUwOiBzeW50YXggZXJyb3IKKyAgICBDLnN0YXRpY3goLCB4KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNTE6IHN5bnRheCBlcnJvcgorICAgIEMuc3RhdGljeigsIHo6eik7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE1Mjogc3ludGF4IGVycm9yCisgICAgQy5zdGF0aWN4eSh4LCwgeSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTUzOiBzeW50YXggZXJyb3IKKyAgICBDLnN0YXRpY3h6KHgsLCB6OnopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNTQ6IHN5bnRheCBlcnJvcgorICAgIEMuc3RhdGljeCh4LCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE1NTogc3ludGF4IGVycm9yCisgICAgQy5zdGF0aWN6KHo6eiwsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTU2OiBzeW50YXggZXJyb3IKKworICAgIGMuaW5zdGFuY2V4KCwpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE1Nzogc3ludGF4IGVycm9yCisgICAgYy5pbnN0YW5jZXkoLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTU4OiBzeW50YXggZXJyb3IKKyAgICBjLmluc3RhbmNleigsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNTk6IHN5bnRheCBlcnJvcgorICAgIGMuaW5zdGFuY2V4KCwgeCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE2MDogc3ludGF4IGVycm9yCisgICAgYy5pbnN0YW5jZXooLCB6OnopOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTYxOiBzeW50YXggZXJyb3IKKyAgICBjLmluc3RhbmNleHkoeCwsIHkpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNjI6IHN5bnRheCBlcnJvcgorICAgIGMuaW5zdGFuY2V4eih4LCwgejp6KTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDE2Mzogc3ludGF4IGVycm9yCisgICAgYy5pbnN0YW5jZXgoeCwsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTY0OiBzeW50YXggZXJyb3IKKyAgICBjLmluc3RhbmNleih6OnosLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNjU6IHN5bnRheCBlcnJvcgorCisgICAgY1t4LF0gPSB5OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTY2OiBzeW50YXggZXJyb3IKKyAgfQorCisgIC8vIEFzIHBhcmFtZXRlcnM6CisgIHZvaWQgZih2b2lkIHRvcEJhZEVtcHR5KCwpKSB7fSAvLyAgICAgICAgICAgICAgICAvLyMgMTY3OiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkU3RhcnQoLCBhKSkge30gLy8gICAgICAgICAgICAgIC8vIyAxNjg6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWRFbmQoYSwsKSkge30gLy8gICAgICAgICAgICAgICAgLy8jIDE2OTogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZE1pZGRsZShhLCwgYikpIHt9IC8vICAgICAgICAgICAvLyMgMTcwOiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkUG9zRW1wdHkoW10pKSB7fSAvLyAgICAgICAgICAgIC8vIyAxNzE6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWRQb3NFbXB0eSgsW10pKSB7fSAvLyAgICAgICAgICAgLy8jIDE3Mjogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZFBvc0VtcHR5KFssXSkpIHt9IC8vICAgICAgICAgICAvLyMgMTczOiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkUG9zRW1wdHkoW10sKSkge30gLy8gICAgICAgICAgIC8vIyAxNzQ6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWRQb3NTdGFydCgsW2FdKSkge30gLy8gICAgICAgICAgLy8jIDE3NTogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZFBvc1N0YXJ0KFssIGFdKSkge30gLy8gICAgICAgICAvLyMgMTc2OiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkUG9zRW5kKFthLCxdKSkge30gLy8gICAgICAgICAgIC8vIyAxNzc6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWRQb3NTdGFydChbYV0sKSkge30gLy8gICAgICAgICAgLy8jIDE3ODogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZFBvc01pZGRsZShbYSwsIGJdKSkge30gLy8gICAgICAvLyMgMTc5OiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkTmFtRW1wdHkoe30pKSB7fSAvLyAgICAgICAgICAgIC8vIyAxODA6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWROYW1FbXB0eSgse30pKSB7fSAvLyAgICAgICAgICAgLy8jIDE4MTogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZE5hbUVtcHR5KHssfSkpIHt9IC8vICAgICAgICAgICAvLyMgMTgyOiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkTmFtRW1wdHkoe30sKSkge30gLy8gICAgICAgICAgIC8vIyAxODM6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWROYW1TdGFydCgse2F9KSkge30gLy8gICAgICAgICAgLy8jIDE4NDogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZE5hbVN0YXJ0KHssIGF9KSkge30gLy8gICAgICAgICAvLyMgMTg1OiBzeW50YXggZXJyb3IKKyAgdm9pZCBmKHZvaWQgdG9wQmFkTmFtRW5kKHthLCx9KSkge30gLy8gICAgICAgICAgIC8vIyAxODY6IHN5bnRheCBlcnJvcgorICB2b2lkIGYodm9pZCB0b3BCYWROYW1TdGFydCh7YX0sKSkge30gLy8gICAgICAgICAgLy8jIDE4Nzogc3ludGF4IGVycm9yCisgIHZvaWQgZih2b2lkIHRvcEJhZE5hbU1pZGRsZSh7YSwsIGJ9KSkge30gLy8gICAgICAvLyMgMTg4OiBzeW50YXggZXJyb3IKK30KKworLy8gQXMgdHlwZWRlZnMKK3R5cGVkZWYgdm9pZCBCYWRFbXB0eSgsKTsgLy8gICAgICAgICAgICAgICAgICAgICAgIC8vIyAxODk6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZFN0YXJ0KCwgYSk7IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDE5MDogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkRW5kKGEsLCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTkxOiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWRNaWRkbGUoYSwsIGIpOyAvLyAgICAgICAgICAgICAgICAgIC8vIyAxOTI6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZFBvc0VtcHR5KFtdKTsgLy8gICAgICAgICAgICAgICAgICAgLy8jIDE5Mzogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkUG9zRW1wdHkoLFtdKTsgLy8gICAgICAgICAgICAgICAgICAvLyMgMTk0OiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWRQb3NFbXB0eShbLF0pOyAvLyAgICAgICAgICAgICAgICAgIC8vIyAxOTU6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZFBvc0VtcHR5KFtdLCk7IC8vICAgICAgICAgICAgICAgICAgLy8jIDE5Njogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkUG9zU3RhcnQoLFthXSk7IC8vICAgICAgICAgICAgICAgICAvLyMgMTk3OiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWRQb3NTdGFydChbLCBhXSk7IC8vICAgICAgICAgICAgICAgIC8vIyAxOTg6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZFBvc0VuZChbYSwsXSk7IC8vICAgICAgICAgICAgICAgICAgLy8jIDE5OTogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkUG9zU3RhcnQoW2FdLCk7IC8vICAgICAgICAgICAgICAgICAvLyMgMjAwOiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWRQb3NNaWRkbGUoW2EsLCBiXSk7IC8vICAgICAgICAgICAgIC8vIyAyMDE6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZE5hbUVtcHR5KHt9KTsgLy8gICAgICAgICAgICAgICAgICAgLy8jIDIwMjogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkTmFtRW1wdHkoLHt9KTsgLy8gICAgICAgICAgICAgICAgICAvLyMgMjAzOiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWROYW1FbXB0eSh7LH0pOyAvLyAgICAgICAgICAgICAgICAgIC8vIyAyMDQ6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZE5hbUVtcHR5KHt9LCk7IC8vICAgICAgICAgICAgICAgICAgLy8jIDIwNTogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkTmFtU3RhcnQoLHthfSk7IC8vICAgICAgICAgICAgICAgICAvLyMgMjA2OiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWROYW1TdGFydCh7LCBhfSk7IC8vICAgICAgICAgICAgICAgIC8vIyAyMDc6IHN5bnRheCBlcnJvcgordHlwZWRlZiB2b2lkIEJhZE5hbUVuZCh7YSwsfSk7IC8vICAgICAgICAgICAgICAgICAgLy8jIDIwODogc3ludGF4IGVycm9yCit0eXBlZGVmIHZvaWQgQmFkTmFtU3RhcnQoe2F9LCk7IC8vICAgICAgICAgICAgICAgICAvLyMgMjA5OiBzeW50YXggZXJyb3IKK3R5cGVkZWYgdm9pZCBCYWROYW1NaWRkbGUoe2EsLCBifSk7IC8vICAgICAgICAgICAgIC8vIyAyMTA6IHN5bnRheCBlcnJvcgorCit2b2lkIHRlc3RCYWRDYWxscygpIHsKKyAgdG9wQmFkRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxOiBjb250aW51ZWQKKyAgdG9wQmFkU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyOiBjb250aW51ZWQKKyAgdG9wQmFkRW5kKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzOiBjb250aW51ZWQKKyAgdG9wQmFkTWlkZGxlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA1OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA2OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA3OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA4OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA5OiBjb250aW51ZWQKKyAgdG9wQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMDogY29udGludWVkCisgIHRvcEJhZFBvc0VuZCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTE6IGNvbnRpbnVlZAorICB0b3BCYWRQb3NTdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEyOiBjb250aW51ZWQKKyAgdG9wQmFkUG9zTWlkZGxlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMzogY29udGludWVkCisgIHRvcEJhZE5hbUVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTQ6IGNvbnRpbnVlZAorICB0b3BCYWROYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE1OiBjb250aW51ZWQKKyAgdG9wQmFkTmFtRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNjogY29udGludWVkCisgIHRvcEJhZE5hbUVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTc6IGNvbnRpbnVlZAorICB0b3BCYWROYW1TdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE4OiBjb250aW51ZWQKKyAgdG9wQmFkTmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxOTogY29udGludWVkCisgIHRvcEJhZE5hbUVuZCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjA6IGNvbnRpbnVlZAorICB0b3BCYWROYW1TdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDIxOiBjb250aW51ZWQKKyAgdG9wQmFkTmFtTWlkZGxlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyMjogY29udGludWVkCisgIHRvcFNldEJhZEVtcHR5ID0gMTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjM6IGNvbnRpbnVlZAorICB0b3BTZXRCYWRTdGFydCA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDI0OiBjb250aW51ZWQKKyAgdG9wU2V0QmFkRW5kID0gMTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyNTogY29udGludWVkCisgIHRvcFNldEJhZE1pZGRsZSA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjY6IGNvbnRpbnVlZAorICBuZXcgQmFkLmVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDI3OiBjb250aW51ZWQKKyAgbmV3IEJhZC5zdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyODogY29udGludWVkCisgIG5ldyBCYWQuZW5kKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjk6IGNvbnRpbnVlZAorICBuZXcgQmFkLm1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDMwOiBjb250aW51ZWQKKyAgbmV3IEJhZC5wb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzMTogY29udGludWVkCisgIG5ldyBCYWQucG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzI6IGNvbnRpbnVlZAorICBuZXcgQmFkLnBvc0VtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDMzOiBjb250aW51ZWQKKyAgbmV3IEJhZC5wb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzNDogY29udGludWVkCisgIG5ldyBCYWQucG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzU6IGNvbnRpbnVlZAorICBuZXcgQmFkLnBvc1N0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDM2OiBjb250aW51ZWQKKyAgbmV3IEJhZC5wb3NFbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAzNzogY29udGludWVkCisgIG5ldyBCYWQucG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMzg6IGNvbnRpbnVlZAorICBuZXcgQmFkLlBvc01pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDM5OiBjb250aW51ZWQKKyAgbmV3IEJhZC5uYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0MDogY29udGludWVkCisgIG5ldyBCYWQubmFtRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgNDE6IGNvbnRpbnVlZAorICBuZXcgQmFkLm5hbUVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQyOiBjb250aW51ZWQKKyAgbmV3IEJhZC5uYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0MzogY29udGludWVkCisgIG5ldyBCYWQubmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgNDQ6IGNvbnRpbnVlZAorICBuZXcgQmFkLm5hbVN0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQ1OiBjb250aW51ZWQKKyAgbmV3IEJhZC5uYW1FbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0NjogY29udGludWVkCisgIG5ldyBCYWQubmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgNDc6IGNvbnRpbnVlZAorICBuZXcgQmFkLm5hbU1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDQ4OiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZEVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA0OTogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWRTdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgNTA6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkRW5kKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDUxOiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZE1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA1MjogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWRQb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNTM6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDU0OiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZFBvc0VtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyA1NTogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWRQb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNTY6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDU3OiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZFBvc1N0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyA1ODogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWRQb3NFbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgNTk6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDYwOiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZFBvc01pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIyA2MTogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWROYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNjI6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkTmFtRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDYzOiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZE5hbUVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyA2NDogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWROYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNjU6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkTmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDY2OiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZE5hbVN0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyA2NzogY29udGludWVkCisgIEJhZC5zdGF0aWNCYWROYW1FbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyMgNjg6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljQmFkTmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDY5OiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY0JhZE5hbU1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIyA3MDogY29udGludWVkCisgIEJhZC5zdGF0aWNTZXRCYWRFbXB0eSA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgNzE6IGNvbnRpbnVlZAorICBCYWQuc3RhdGljU2V0QmFkU3RhcnQgPSAxOyAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDcyOiBjb250aW51ZWQKKyAgQmFkLnN0YXRpY1NldEJhZEVuZCA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyA3MzogY29udGludWVkCisgIEJhZC5zdGF0aWNTZXRCYWRNaWRkbGUgPSAxOyAvLyAgICAgICAgICAgICAgICAgICAvLyMgNzQ6IGNvbnRpbnVlZAorCisgIHZhciBiYWQgPSBuZXcgQmFkKCk7CisgIGJhZC5pbnN0YW5jZUJhZEVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAvLyMgNzU6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWRTdGFydCgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgLy8jIDc2OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkRW5kKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyA3NzogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZE1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAvLyMgNzg6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWRQb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDc5OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkUG9zRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA4MDogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZFBvc0VtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgODE6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWRQb3NFbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDgyOiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA4MzogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZFBvc1N0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgODQ6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWRQb3NFbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDg1OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkUG9zU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA4NjogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZFBvc01pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAvLyMgODc6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWROYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDg4OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkTmFtRW1wdHkoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA4OTogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZE5hbUVtcHR5KCk7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgOTA6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWROYW1FbXB0eSgpOyAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDkxOiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkTmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA5MjogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZE5hbVN0YXJ0KCk7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgOTM6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VCYWROYW1FbmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDk0OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlQmFkTmFtU3RhcnQoKTsgLy8gICAgICAgICAgICAgICAgICAgIC8vIyA5NTogY29udGludWVkCisgIGJhZC5pbnN0YW5jZUJhZE5hbU1pZGRsZSgpOyAvLyAgICAgICAgICAgICAgICAgICAvLyMgOTY6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VTZXRCYWRFbXB0eSA9IDE7IC8vICAgICAgICAgICAgICAgICAgLy8jIDk3OiBjb250aW51ZWQKKyAgYmFkLmluc3RhbmNlU2V0QmFkU3RhcnQgPSAxOyAvLyAgICAgICAgICAgICAgICAgIC8vIyA5ODogY29udGludWVkCisgIGJhZC5pbnN0YW5jZVNldEJhZEVuZCA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAvLyMgOTk6IGNvbnRpbnVlZAorICBiYWQuaW5zdGFuY2VTZXRCYWRNaWRkbGUgPSAxOyAvLyAgICAgICAgICAgICAgICAgLy8jIDEwMDogY29udGludWVkCisgIGJhZCAqIGJhZDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTAxOiBjb250aW51ZWQKKyAgYmFkICogYmFkOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMDI6IGNvbnRpbnVlZAorICBiYWQgKiBiYWQ7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEwMzogY29udGludWVkCisgIGJhZFsxXSA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA0OiBjb250aW51ZWQKKyAgYmFkWzFdID0gMTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMDU6IGNvbnRpbnVlZAorICBiYWRbMV0gPSAxOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEwNjogY29udGludWVkCisgIGJhZFsxXSA9IDE7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA3OiBjb250aW51ZWQKKworICAvLyBUaGlzIGNvdmVycyB0ZXN0cyAxMDgtMTY2CisgIGJhZC5tZXRob2QoKTsKKworICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE2NzogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTY4OiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNjk6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE3MDogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTcxOiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNzI6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE3MzogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTc0OiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNzU6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE3NjogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTc3OiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNzg6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE3OTogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTgwOiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxODE6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE4MjogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTgzOiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxODQ6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE4NTogY29udGludWVkCisgIGJhZC5mKCgpIHt9KTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTg2OiBjb250aW51ZWQKKyAgYmFkLmYoKCkge30pOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxODc6IGNvbnRpbnVlZAorICBiYWQuZigoKSB7fSk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE4ODogY29udGludWVkCisKKyAgQmFkRW1wdHkgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxODk6IGNvbnRpbnVlZAorICBCYWRTdGFydCB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE5MDogY29udGludWVkCisgIEJhZEVuZCB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTkxOiBjb250aW51ZWQKKyAgQmFkTWlkZGxlIHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxOTI6IGNvbnRpbnVlZAorICBCYWRQb3NFbXB0eSB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE5MzogY29udGludWVkCisgIEJhZFBvc0VtcHR5IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTk0OiBjb250aW51ZWQKKyAgQmFkUG9zRW1wdHkgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxOTU6IGNvbnRpbnVlZAorICBCYWRQb3NFbXB0eSB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE5NjogY29udGludWVkCisgIEJhZFBvc1N0YXJ0IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTk3OiBjb250aW51ZWQKKyAgQmFkUG9zU3RhcnQgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxOTg6IGNvbnRpbnVlZAorICBCYWRQb3NFbmQgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE5OTogY29udGludWVkCisgIEJhZFBvc1N0YXJ0IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjAwOiBjb250aW51ZWQKKyAgQmFkUG9zTWlkZGxlIHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyMDE6IGNvbnRpbnVlZAorICBCYWROYW1FbXB0eSB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDIwMjogY29udGludWVkCisgIEJhZE5hbUVtcHR5IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjAzOiBjb250aW51ZWQKKyAgQmFkTmFtRW1wdHkgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyMDQ6IGNvbnRpbnVlZAorICBCYWROYW1FbXB0eSB4OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDIwNTogY29udGludWVkCisgIEJhZE5hbVN0YXJ0IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjA2OiBjb250aW51ZWQKKyAgQmFkTmFtU3RhcnQgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyMDc6IGNvbnRpbnVlZAorICBCYWROYW1FbmQgeDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDIwODogY29udGludWVkCisgIEJhZE5hbVN0YXJ0IHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMjA5OiBjb250aW51ZWQKKyAgQmFkTmFtTWlkZGxlIHg7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAyMTA6IGNvbnRpbnVlZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYXNzaWduYWJsZV9leHByZXNzaW9uX3J1bnRpbWVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYXNzaWduYWJsZV9leHByZXNzaW9uX3J1bnRpbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmNiMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hc3NpZ25hYmxlX2V4cHJlc3Npb25fcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NyBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0IHRvIGRldGVjdCBzeW50YWN0aWNhbGx5IGlsbGVnYWwgbGVmdC1oYW5kLXNpZGUgKGFzc2lnbmFibGUpCisvLyBleHByZXNzaW9ucy4KKworY2xhc3MgQyB7CisgIHN0YXRpYyBkeW5hbWljIGZpZWxkID0gMDsKK30KKworZHluYW1pYyB2YXJpYWJsZSA9IDA7CisKK21haW4oKSB7CisgIHZhcmlhYmxlID0gMDsKKworCisKKworICBDLmZpZWxkID0gMDsKKworCisKKworICB2YXJpYWJsZSA9IFsxLCAyLCAzXTsKKyAgdmFyaWFibGVbMF0gPSAwOworICAodmFyaWFibGUpWzBdID0gMDsKKworCisKKworICBDLmZpZWxkID0gWzEsIDIsIDNdOworCisKKworCisgIHZhciBhID0gMDsKKworCisKKworICAvLyBOZWF0IHBhbGluZHJvbWUgZXhwcmVzc2lvbi4geCBpcyBhc3NpZ25hYmxlLCAoKHgpKSBpcyBub3QuCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Fzc2lnbmFibGVfZXhwcmVzc2lvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hc3NpZ25hYmxlX2V4cHJlc3Npb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDkwNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9hc3NpZ25hYmxlX2V4cHJlc3Npb25fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdG8gZGV0ZWN0IHN5bnRhY3RpY2FsbHkgaWxsZWdhbCBsZWZ0LWhhbmQtc2lkZSAoYXNzaWduYWJsZSkKKy8vIGV4cHJlc3Npb25zLgorCitjbGFzcyBDIHsKKyAgc3RhdGljIGR5bmFtaWMgZmllbGQgPSAwOworfQorCitkeW5hbWljIHZhcmlhYmxlID0gMDsKKworbWFpbigpIHsKKyAgdmFyaWFibGUgPSAwOworICAodmFyaWFibGUpID0gMDsKKy8vXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuSUxMRUdBTF9BU1NJR05NRU5UX1RPX05PTl9BU1NJR05BQkxFCisvL15eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUgorLy8gICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisgICh2YXJpYWJsZSkrKzsKKyAgLy8gICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisgIC8vICAgICAgICBeXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKyAgKysodmFyaWFibGUpOworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTUlTU0lOR19BU1NJR05BQkxFX1NFTEVDVE9SCisgIC8vIFtjZmVdIENhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KKworICBDLmZpZWxkID0gMDsKKyAgKEMuZmllbGQpID0gMDsKKy8vXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKy8vXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5NSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1IKKy8vICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisgIChDLmZpZWxkKSsrOworICAvLyAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorICAvLyAgICAgICBeXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKyAgKysoQy5maWVsZCk7CisgIC8vICAgICAgICBeCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUgorICAvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisKKyAgdmFyaWFibGUgPSBbMSwgMiwgM107CisgIHZhcmlhYmxlWzBdID0gMDsKKyAgKHZhcmlhYmxlKVswXSA9IDA7CisgICh2YXJpYWJsZVswXSkgPSAwOworLy9eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKy8vXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTUlTU0lOR19BU1NJR05BQkxFX1NFTEVDVE9SCisvLyAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KKyAgKHZhcmlhYmxlWzBdKSsrOworICAvLyAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KKyAgLy8gICAgICAgICAgIF5eCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLklMTEVHQUxfQVNTSUdOTUVOVF9UT19OT05fQVNTSUdOQUJMRQorICArKyh2YXJpYWJsZVswXSk7CisgIC8vICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5NSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1IKKyAgLy8gW2NmZV0gQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorCisgIEMuZmllbGQgPSBbMSwgMiwgM107CisgIChDLmZpZWxkWzBdKSA9IDA7CisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuSUxMRUdBTF9BU1NJR05NRU5UX1RPX05PTl9BU1NJR05BQkxFCisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTUlTU0lOR19BU1NJR05BQkxFX1NFTEVDVE9SCisvLyAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorICAoQy5maWVsZFswXSkrKzsKKyAgLy8gICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IGFzc2lnbiB0byBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4KKyAgLy8gICAgICAgICAgXl4KKyAgLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuSUxMRUdBTF9BU1NJR05NRU5UX1RPX05PTl9BU1NJR05BQkxFCisgICsrKEMuZmllbGRbMF0pOworICAvLyAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5NSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1IKKyAgLy8gW2NmZV0gQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorCisgIHZhciBhID0gMDsKKyAgKGEpID0gMDsKKy8vXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKy8vXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5NSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1IKKy8vICBeCisvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisgIChhKSsrOworICAvL14KKyAgLy8gW2NmZV0gQ2FuJ3QgYXNzaWduIHRvIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgorICAvLyBeXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5JTExFR0FMX0FTU0lHTk1FTlRfVE9fTk9OX0FTU0lHTkFCTEUKKyAgKysoYSk7CisgIC8vICBeCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUgorICAvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCisKKyAgLy8gTmVhdCBwYWxpbmRyb21lIGV4cHJlc3Npb24uIHggaXMgYXNzaWduYWJsZSwgKCh4KSkgaXMgbm90LgorICB2YXIgZnVuY251ZiA9ICh4KSA9PiAoKHgpKT0oKHgpKSA8PSAoeCk7CisgIC8vICAgICAgICAgICAgICAgICAgIF5eXl5eCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCBhc3NpZ24gdG8gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9iYWRfb3ZlcnJpZGVfcnVudGltZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9iYWRfb3ZlcnJpZGVfcnVudGltZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyYWJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JhZF9vdmVycmlkZV9ydW50aW1lX3Rlc3QuZGFydApAQCAtMCwwICsxLDMzIEBACisvLyBUT0RPKG11bHRpdGVzdCk6IFRoaXMgd2FzIGF1dG9tYXRpY2FsbHkgbWlncmF0ZWQgZnJvbSBhIG11bHRpdGVzdCBhbmQgbWF5CisvLyBjb250YWluIHN0cmFuZ2Ugb3IgZGVhZCBjb2RlLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEZpc2sgeworICBnZXQgZmlzayA9PiBudWxsOworCisgIHNldCBmaXNrKHgpIHt9CisKKworICBnZXQgaGVzdCA9PiBudWxsOworICBzZXQgaGVzdCh4KSB7fQorCisgIGZvbygpIHt9CisgIHZhciBmaWVsZDsKKyAgbWV0aG9kKCkge30KKyAgbnVsbGFyeSgpIHt9Cit9CisKK2NsYXNzIEhlc3QgZXh0ZW5kcyBGaXNrIHsKKworCisKKworfQorCittYWluKCkgeworICBuZXcgRmlzaygpOworICBuZXcgSGVzdCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYmFkX292ZXJyaWRlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JhZF9vdmVycmlkZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0MDBkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JhZF9vdmVycmlkZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBGaXNrIHsKKyAgZ2V0IGZpc2sgPT4gbnVsbDsKKyAgc3RhdGljCisgIHNldCBmaXNrKHgpIHt9CisgIC8vICBeXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPTkZMSUNUSU5HX1NUQVRJQ19BTkRfSU5TVEFOQ0UKKyAgLy8gW2NmZV0gVGhpcyBzdGF0aWMgbWVtYmVyIGNvbmZsaWN0cyB3aXRoIGFuIGluc3RhbmNlIG1lbWJlci4KKworICBzdGF0aWMKKyAgZ2V0IGhlc3QgPT4gbnVsbDsKKyAgLy8gIF5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRQorICAvLyBbY2ZlXSBUaGlzIHN0YXRpYyBtZW1iZXIgY29uZmxpY3RzIHdpdGggYW4gaW5zdGFuY2UgbWVtYmVyLgorICBzZXQgaGVzdCh4KSB7fQorCisgIGZvbygpIHt9CisgIHZhciBmaWVsZDsKKyAgbWV0aG9kKCkge30KKyAgbnVsbGFyeSgpIHt9Cit9CisKK2NsYXNzIEhlc3QgZXh0ZW5kcyBGaXNrIHsKKyAgc3RhdGljIGZvbygpIHt9CisgIC8vICAgICBeXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRQorICAvLyBbY2ZlXSBDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS4KKyAgZmllbGQoKSB7fQorLy9eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09ORkxJQ1RJTkdfTUVUSE9EX0FORF9GSUVMRAorLy8gW2NmZV0gQ2FuJ3QgZGVjbGFyZSBhIG1lbWJlciB0aGF0IGNvbmZsaWN0cyB3aXRoIGFuIGluaGVyaXRlZCBvbmUuCisgIHZhciBtZXRob2Q7CisgIC8vICBeXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09ORkxJQ1RJTkdfRklFTERfQU5EX01FVEhPRAorICAvLyBbY2ZlXSBDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS4KKyAgbnVsbGFyeSh4KSB7fQorLy9eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5JTlZBTElEX09WRVJSSURFCisvLyBbY2ZlXSBUaGUgbWV0aG9kICdIZXN0Lm51bGxhcnknIGhhcyBtb3JlIHJlcXVpcmVkIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdGaXNrLm51bGxhcnknLgorfQorCittYWluKCkgeworICBuZXcgRmlzaygpOworICBuZXcgSGVzdCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYmluZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9iaW5kX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE3YWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYmluZF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQm91bmQgeworICBydW4oKSB7CisgICAgcmV0dXJuIDQyOworICB9Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgdmFyIHJ1bm5lciA9IG5ldyBCb3VuZCgpLnJ1bjsKKyAgRXhwZWN0LmVxdWFscyg0MiwgcnVubmVyKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYm9vdHN0cmFwX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Jvb3RzdHJhcF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1NmE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Jvb3RzdHJhcF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBCb290c3RyYXBUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIHZhciBvYmogPSBuZXcgT2JqZWN0KCk7CisKKyAgICByZXR1cm4gb2JqOworICB9Cit9CisKK21haW4oKSB7CisgIEJvb3RzdHJhcFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JvdHRvbV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9ib3R0b21fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmU4NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9ib3R0b21fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK05ldmVyIG5ldmVyKCkgPT4gdGhyb3cgIiEiOworCit2b2lkIG1haW4oKSB7CisgIGZpbmFsIGYxID0gKCkgPT4gdGhyb3cgbmV2ZXIoKTsKKyAgZmluYWwgZjIgPSAoKSA9PiBuZXZlcigpOworICBFeHBlY3QuZXF1YWxzKGYxLnJ1bnRpbWVUeXBlLCBmMi5ydW50aW1lVHlwZSk7CisKKyAgZmluYWwgQm90dG9tID0gKDxGPihGIEZ1bmN0aW9uKCkgZikgPT4gRikoKCkgPT4gdGhyb3cgbmV2ZXIoKSk7CisgIEV4cGVjdC5lcXVhbHMoTmV2ZXIsIEJvdHRvbSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9icmFuY2hfY2Fub25pY2FsaXphdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9icmFuY2hfY2Fub25pY2FsaXphdGlvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5OTBjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JyYW5jaF9jYW5vbmljYWxpemF0aW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdGhhdCBicmFuY2ggZnVzaW9uIGNvcnJlY3RseSBzZXRzIGJyYW5jaCBlbnZpcm9ubWVudCBmb3IgY29tcGFyaXNvbnMKKy8vIHRoYXQgcmVxdWlyZSB1bmJveGluZyBhbmQgZG9lcyBub3QgZnVzZSBicmFuY2hlcyB0aGF0IGNhbiBkZW9wdGltaXplLgorLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwIC0tbm8tdXNlLW9zciAtLW5vLWJhY2tncm91bmQtY29tcGlsYXRpb24KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3ZhciBzaWRlRWZmZWN0ID0gdHJ1ZTsKKworYmFyRG91YmxlKGEsIGIpIHsKKyAgc2lkZUVmZmVjdCA9IGZhbHNlOworICBmaW5hbCByZXN1bHQgPSAoYSA9PSBiKTsKKyAgc2lkZUVmZmVjdCA9ICFzaWRlRWZmZWN0OworICByZXR1cm4gcmVzdWx0OworfQorCitmb29Eb3VibGUoYSwgYikgPT4gYmFyRG91YmxlKGEsIGIpID8gMSA6IDA7CisKK2Jhck1pbnQoYSwgYikgeworICBzaWRlRWZmZWN0ID0gZmFsc2U7CisgIGZpbmFsIHJlc3VsdCA9IChhID09IGIpOworICBzaWRlRWZmZWN0ID0gIXNpZGVFZmZlY3Q7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Zvb01pbnQoYSwgYikgPT4gYmFyTWludChhLCBiKSA/IDEgOiAwOworCitjbGFzcyBBIHsKKyAgb3BlcmF0b3IgPT0ob3RoZXIpID0+IGlkZW50aWNhbCh0aGlzLCBvdGhlcik7Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHt9CisKK2NsYXNzIEMgZXh0ZW5kcyBBIHt9CisKK2JhclBvbHkoYSwgYikgeworICBzaWRlRWZmZWN0ID0gZmFsc2U7CisgIGZpbmFsIHJlc3VsdCA9IGEgPT0gYjsKKyAgc2lkZUVmZmVjdCA9ICFzaWRlRWZmZWN0OworICByZXR1cm4gcmVzdWx0OworfQorCitmb29Qb2x5KGEsIGIpID0+IGJhclBvbHkoYSwgYikgPyAxIDogMDsKKworbWFpbigpIHsKKyAgZmluYWwgYSA9IDEuMDsKKyAgZmluYWwgYiA9IDB4NDAwMDAwMDAwMDAwMDAwMDsgLy8gMSA8PCA2MgorICBmaW5hbCB4ID0gbmV3IEEoKSwgeSA9IG5ldyBCKCksIHogPSBuZXcgQygpOworICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDEsIGZvb0RvdWJsZShhLCBhKSk7CisgICAgRXhwZWN0LmlzVHJ1ZShzaWRlRWZmZWN0KTsKKyAgICBFeHBlY3QuZXF1YWxzKDAsIGZvb01pbnQoYiwgMCkpOworICAgIEV4cGVjdC5pc1RydWUoc2lkZUVmZmVjdCk7CisgICAgRXhwZWN0LmVxdWFscygxLCBmb29Qb2x5KHgsIHgpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDAsIGZvb1BvbHkoeSwgeCkpOworICB9CisgIEV4cGVjdC5lcXVhbHMoMSwgZm9vRG91YmxlKHosIHopKTsKKyAgRXhwZWN0LmlzVHJ1ZShzaWRlRWZmZWN0KTsKKyAgRXhwZWN0LmVxdWFscygxLCBmb29NaW50KHosIHopKTsKKyAgRXhwZWN0LmlzVHJ1ZShzaWRlRWZmZWN0KTsKKyAgRXhwZWN0LmVxdWFscygxLCBmb29Qb2x5KHosIHopKTsKKyAgRXhwZWN0LmlzVHJ1ZShzaWRlRWZmZWN0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JyYW5jaGVzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2JyYW5jaGVzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU5MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvYnJhbmNoZXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgZm9yIGJyYW5jaGVzLiBNYWtlIHN1cmUgdGhhdCBzaG9ydGN1dHMgd29yaywgZXZlbiBpZiB0aGV5IGhhdmUKKy8vIHRvIGp1bXAgb3ZlciBzZXZlcmFsIGV4cHJlc3Npb25zLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQnJhbmNoZXNUZXN0IHsKKyAgc3RhdGljIGJvb2wgZigpIHsKKyAgICBFeHBlY3QuZXF1YWxzKCJOZXZlciByZWFjaGVkIiwgMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0TWFpbigpIHsKKyAgICBpbnQgY2hlY2tQb2ludENvdW50ZXIgPSAxOworICAgIGludCBjaGVja1BvaW50MSA9IDA7CisgICAgaW50IGNoZWNrUG9pbnQyID0gMDsKKyAgICBpbnQgY2hlY2tQb2ludDMgPSAwOworICAgIGludCBjaGVja1BvaW50NCA9IDA7CisgICAgaW50IGNoZWNrUG9pbnQ1ID0gMDsKKyAgICBpbnQgY2hlY2tQb2ludDYgPSAwOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICBjaGVja1BvaW50MSArPSBjaGVja1BvaW50Q291bnRlcisrOworICAgICAgICBpZiAodHJ1ZSB8fCAvLyBUZXN0IGJyYW5jaC1pZi10cnVlLgorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSB8fAorICAgICAgICAgICAgZigpIHx8CisgICAgICAgICAgICBmKCkgfHwKKyAgICAgICAgICAgIGYoKSkgeworICAgICAgICAgIGNoZWNrUG9pbnQyICs9IGNoZWNrUG9pbnRDb3VudGVyKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRlc3QgYnJhbmNoIChqdW1waW5nIG92ZXIgdGhlIGVsc2UgYnJhbmNoKS4KKyAgICAgICAgY2hlY2tQb2ludDMgKz0gY2hlY2tQb2ludENvdW50ZXIrKzsKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICAgIGNoZWNrUG9pbnQ0ID0gY2hlY2tQb2ludENvdW50ZXIrKzsgLy8gTmV2ZXIgcmVhY2hlZC4KKyAgICAgICAgICBjaGVja1BvaW50NCA9IGNoZWNrUG9pbnRDb3VudGVyKys7IC8vIE5ldmVyIHJlYWNoZWQuCisgICAgICAgICAgY2hlY2tQb2ludDQgPSBjaGVja1BvaW50Q291bnRlcisrOyAvLyBOZXZlciByZWFjaGVkLgorICAgICAgICB9CisgICAgICB9CisgICAgICBjaGVja1BvaW50NSArPSBjaGVja1BvaW50Q291bnRlcisrOworICAgIH0KKyAgICBjaGVja1BvaW50NiArPSBjaGVja1BvaW50Q291bnRlcisrOworICAgIEV4cGVjdC5lcXVhbHMoMSwgY2hlY2tQb2ludDEpOworICAgIEV4cGVjdC5lcXVhbHMoMiwgY2hlY2tQb2ludDIpOworICAgIEV4cGVjdC5lcXVhbHMoNCwgY2hlY2tQb2ludDMpOworICAgIEV4cGVjdC5lcXVhbHMoMCwgY2hlY2tQb2ludDQpOworICAgIEV4cGVjdC5lcXVhbHMoOCwgY2hlY2tQb2ludDUpOworICAgIEV4cGVjdC5lcXVhbHMoNiwgY2hlY2tQb2ludDYpOworICB9Cit9CisKK21haW4oKSB7CisgIEJyYW5jaGVzVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FsbGFibGVfcnVudGltZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jYWxsYWJsZV9ydW50aW1lX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWZhZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FsbGFibGVfcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw3MCBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgWCB7CisgIGNhbGwoKSA9PiA0MjsKK30KKworY2xhc3MgWFggZXh0ZW5kcyBYIHsKKyAgWFgubmFtZWQoKTsKK30KKworY2xhc3MgWSB7CisgIGNhbGwoaW50IHgpID0+IDg3ICsgeDsKKworICBzdGF0aWMgaW50IHN0YXRpY01ldGhvZChpbnQgeCkgPT4geCArIDE7Cit9CisKK2NsYXNzIFo8VD4geworICBmaW5hbCBUIHZhbHVlOworICBaKHRoaXMudmFsdWUpOworICBUIGNhbGwoKSA9PiB2YWx1ZTsKKworICBzdGF0aWMgaW50IHN0YXRpY01ldGhvZChpbnQgeCkgPT4geCArIDE7Cit9CisKK3R5cGVkZWYgRihpbnQgeCk7Cit0eXBlZGVmIEcoU3RyaW5nIHkpOwordHlwZWRlZiBIKCk7Cit0eXBlZGVmIFQgSTxUPigpOworCittYWluKCkgeworICBYIHggPSBuZXcgWCgpOworICBGdW5jdGlvbiBmID0geDsgLy8gU2hvdWxkIHBhc3MgY2hlY2tlZCBtb2RlIHRlc3QKKyAgWSB5ID0gbmV3IFkoKTsKKyAgRnVuY3Rpb24gZyA9IHk7IC8vIFNob3VsZCBwYXNzIGNoZWNrZWQgbW9kZSB0ZXN0CisgIEYgZjAgPSB5OyAvLyBTaG91bGQgcGFzcyBjaGVja2VkIG1vZGUgdGVzdAorCisKKworCisgIEV4cGVjdC5lcXVhbHMoZigpLCA0Mik7CisgIEV4cGVjdC5lcXVhbHMoZygxMDApLCAxODcpOworCisgIHZhciB6ID0gbmV3IFo8aW50PigxMjMpOworICBFeHBlY3QuZXF1YWxzKHooKSwgMTIzKTsKKyAgRXhwZWN0LmVxdWFscygoeiBhcyBkeW5hbWljKSgpLCAxMjMpOworCisgIEV4cGVjdC5lcXVhbHMoWS5zdGF0aWNNZXRob2QoNiksIDcpOworICBFeHBlY3QuZXF1YWxzKFouc3RhdGljTWV0aG9kKDYpLCA3KTsKKworICB2YXIgeHggPSBuZXcgWFgubmFtZWQoKTsKKyAgRXhwZWN0LmVxdWFscyh4eCgpLCA0Mik7CisKKyAgSCB4eDIgPSBuZXcgWFgubmFtZWQoKTsKKyAgRXhwZWN0LmVxdWFscyh4eDIoKSwgNDIpOworCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIEYgZjIgPSB4IGFzIGR5bmFtaWM7CisgIH0pOworCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIEcgZzEgPSB5IGFzIGR5bmFtaWM7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FsbGFibGVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FsbGFibGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmY0YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jYWxsYWJsZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgWCB7CisgIGNhbGwoKSA9PiA0MjsKK30KKworY2xhc3MgWFggZXh0ZW5kcyBYIHsKKyAgWFgubmFtZWQoKTsKK30KKworY2xhc3MgWSB7CisgIGNhbGwoaW50IHgpID0+IDg3ICsgeDsKKworICBzdGF0aWMgaW50IHN0YXRpY01ldGhvZChpbnQgeCkgPT4geCArIDE7Cit9CisKK2NsYXNzIFo8VD4geworICBmaW5hbCBUIHZhbHVlOworICBaKHRoaXMudmFsdWUpOworICBUIGNhbGwoKSA9PiB2YWx1ZTsKKworICBzdGF0aWMgaW50IHN0YXRpY01ldGhvZChpbnQgeCkgPT4geCArIDE7Cit9CisKK3R5cGVkZWYgRihpbnQgeCk7Cit0eXBlZGVmIEcoU3RyaW5nIHkpOwordHlwZWRlZiBIKCk7Cit0eXBlZGVmIFQgSTxUPigpOworCittYWluKCkgeworICBYIHggPSBuZXcgWCgpOworICBGdW5jdGlvbiBmID0geDsgLy8gU2hvdWxkIHBhc3MgY2hlY2tlZCBtb2RlIHRlc3QKKyAgWSB5ID0gbmV3IFkoKTsKKyAgRnVuY3Rpb24gZyA9IHk7IC8vIFNob3VsZCBwYXNzIGNoZWNrZWQgbW9kZSB0ZXN0CisgIEYgZjAgPSB5OyAvLyBTaG91bGQgcGFzcyBjaGVja2VkIG1vZGUgdGVzdAorCisgIEYgZjEgPSB4OworICAvL14KKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdkeW5hbWljIEZ1bmN0aW9uKCknIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnZHluYW1pYyBGdW5jdGlvbihpbnQpJy4KKyAgLy8gICAgIF4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICBHIGcwID0geTsKKyAgLy9eCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnZHluYW1pYyBGdW5jdGlvbihpbnQpJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ2R5bmFtaWMgRnVuY3Rpb24oU3RyaW5nKScuCisgIC8vICAgICBeCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKworICBFeHBlY3QuZXF1YWxzKGYoKSwgNDIpOworICBFeHBlY3QuZXF1YWxzKGcoMTAwKSwgMTg3KTsKKworICB2YXIgeiA9IG5ldyBaPGludD4oMTIzKTsKKyAgRXhwZWN0LmVxdWFscyh6KCksIDEyMyk7CisgIEV4cGVjdC5lcXVhbHMoKHogYXMgZHluYW1pYykoKSwgMTIzKTsKKworICBFeHBlY3QuZXF1YWxzKFkuc3RhdGljTWV0aG9kKDYpLCA3KTsKKyAgRXhwZWN0LmVxdWFscyhaLnN0YXRpY01ldGhvZCg2KSwgNyk7CisKKyAgdmFyIHh4ID0gbmV3IFhYLm5hbWVkKCk7CisgIEV4cGVjdC5lcXVhbHMoeHgoKSwgNDIpOworCisgIEggeHgyID0gbmV3IFhYLm5hbWVkKCk7CisgIEV4cGVjdC5lcXVhbHMoeHgyKCksIDQyKTsKKworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBGIGYyID0geCBhcyBkeW5hbWljOworICB9KTsKKworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBHIGcxID0geSBhcyBkeW5hbWljOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Nhc2NhZGVkX2ZvcndhcmRpbmdfc3R1YnNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FzY2FkZWRfZm9yd2FyZGluZ19zdHVic190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2ZjlkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Nhc2NhZGVkX2ZvcndhcmRpbmdfc3R1YnNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEEge30KKworY2xhc3MgQiBleHRlbmRzIEEge30KKworY2xhc3MgQyB7CisgIHZvaWQgZihCIHgsIEIgeSkge30KK30KKworYWJzdHJhY3QgY2xhc3MgSTEgeworICB2b2lkIGYoY292YXJpYW50IEEgeCwgQiB5KTsKK30KKworLy8gRCBjb250YWlucyBhIGZvcndhcmRpbmcgc3R1YiBmb3IgZiB3aGljaCBlbnN1cmVzIHRoYXQgYHhgIGlzIHR5cGUgY2hlY2tlZC4KK2NsYXNzIEQgZXh0ZW5kcyBDIGltcGxlbWVudHMgSTEge30KKworYWJzdHJhY3QgY2xhc3MgSTIgeworICB2b2lkIGYoQiB4LCBjb3ZhcmlhbnQgQSB5KTsKK30KKworLy8gRSBjb250YWlucyBhIGZvcndhcmRpbmcgc3R1YiBmb3IgZiB3aGljaCBlbnN1cmVzIHRoYXQgYHlgIGlzIHR5cGUgY2hlY2tlZC4KK2NsYXNzIEUgZXh0ZW5kcyBEIGltcGxlbWVudHMgSTIgeworICB2b2lkIGYoQiB4LCBCIHkpOworfQorCittYWluKCkgeworICBFIGUgPSBuZXcgRSgpOworICBDIGMgPSBlOworICBJMSBpMSA9IGU7CisgIEQgZCA9IGU7CisgIEkyIGkyID0gZTsKKyAgQSBhID0gbmV3IEEoKTsKKyAgQiBiID0gbmV3IEIoKTsKKyAgYy5mKGIsIGIpOyAvLyBObyBlcnJvcgorICBpMS5mKGIsIGIpOyAvLyBObyBlcnJvcgorICBkLmYoYiwgYik7IC8vIE5vIGVycm9yCisgIGkyLmYoYiwgYik7IC8vIE5vIGVycm9yCisgIGUuZihiLCBiKTsgLy8gTm8gZXJyb3IKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgaTEuZihhLCBiKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGQuZihhLCBiKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGkyLmYoYiwgYSk7CisgIH0pOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBlLmYoYSBhcyBkeW5hbWljLCBiKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGUuZihiLCBhIGFzIGR5bmFtaWMpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Nhc3QyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Nhc3QyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWMxNGZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2FzdDJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGZvciBjb25zdHJ1Y3RvcnMgYW5kIGluaXRpYWxpemVycy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKKy8vIFRlc3QgJ2V4cHJlc3Npb24gYXMgVHlwZScgY2FzdHMuCisKK2NsYXNzIEMgeworICBmaW5hbCBpbnQgZm9vID0gNDI7CisKKyAgaW50IHZhbCA9IDA7CisgIHZvaWQgaW5jKCkgeworICAgICsrdmFsOworICB9Cit9CisKK2NsYXNzIEQgZXh0ZW5kcyBDIHsKKyAgZmluYWwgaW50IGJhciA9IDM3OworfQorCittYWluKCkgeworICBDIG9jID0gbmV3IEMoKTsKKyAgRCBvZCA9IG5ldyBEKCk7CisKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IChvYyBhcyBkeW5hbWljKS5iYXIpOworCisgIC8vIENhc3RzIHNob3VsZCBhbHdheXMgZXZhbHVhdGUgdGhlIGxlZnQtaGFuZCBzaWRlLCBpZiBvbmx5IGZvciBpdHMgZWZmZWN0cy4KKyAgb2MuaW5jKCkgYXMgZHluYW1pYzsKKyAgRXhwZWN0LmVxdWFscygxLCBvYy52YWwpOworICBvYy5pbmMoKSBhcyBPYmplY3Q/OworICBFeHBlY3QuZXF1YWxzKDIsIG9jLnZhbCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jYXN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Nhc3RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTRjY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jYXN0X3Rlc3QuZGFydApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgY29uc3RydWN0b3JzIGFuZCBpbml0aWFsaXplcnMuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0ICdleHByZXNzaW9uIGFzIFR5cGUnIGNhc3RzLgorCitjbGFzcyBDIHsKKyAgZmluYWwgaW50IGZvbyA9IDQyOworfQorCitjbGFzcyBEIGV4dGVuZHMgQyB7CisgIGZpbmFsIGludCBiYXIgPSAzNzsKK30KKworT2JqZWN0IGNyZWF0ZUMoKSA9PiBuZXcgQygpOworT2JqZWN0IGNyZWF0ZUQoKSA9PiBuZXcgRCgpOworT2JqZWN0PyBnZXROdWxsKCkgPT4gbnVsbDsKK09iamVjdCBjcmVhdGVMaXN0KCkgPT4gPGludD5bMl07CitPYmplY3QgY3JlYXRlSW50KCkgPT4gODc7CitPYmplY3QgY3JlYXRlU3RyaW5nKCkgPT4gImEgc3RyaW5nIjsKKworbWFpbigpIHsKKyAgT2JqZWN0IG9jID0gY3JlYXRlQygpOworICBPYmplY3Qgb2QgPSBjcmVhdGVEKCk7CisgIE9iamVjdD8gb24gPSBnZXROdWxsKCk7CisgIE9iamVjdCBvbCA9IGNyZWF0ZUxpc3QoKTsKKyAgT2JqZWN0IG9pID0gY3JlYXRlSW50KCk7CisgIE9iamVjdCBvcyA9IGNyZWF0ZVN0cmluZygpOworCisgIEV4cGVjdC5lcXVhbHMoNDIsIChvYyBhcyBDKS5mb28pOworICBFeHBlY3QuZXF1YWxzKDQyLCAob2QgYXMgQykuZm9vKTsKKyAgRXhwZWN0LmVxdWFscyg0MiwgKG9kIGFzIEQpLmZvbyk7CisgIEV4cGVjdC5lcXVhbHMoMzcsIChvZCBhcyBEKS5iYXIpOworICBFeHBlY3QuZXF1YWxzKDM3LCAoKG9kIGFzIEMpIGFzIEQpLmJhcik7CisgIChvYyBhcyBEKS5mb287IC8vIC8vIyAwMTogcnVudGltZSBlcnJvcgorICAob24gYXMgRD8pLnRvU3RyaW5nKCk7CisgIChvbiBhcyBEKS5mb287IC8vIC8vIyAwMjogcnVudGltZSBlcnJvcgorICAob24gYXMgQykuZm9vOyAvLyAvLyMgMDM6IHJ1bnRpbWUgZXJyb3IKKyAgLy8gUmVhc3NpZ24gdG8gY2FuY2VsIG91dCB0aGUgdHlwZSBwcm9tb3Rpb24gZnJvbSB0aGUgcHJldmlvdXMgImFzIi4KKyAgb2MgPSBvYyBhcyBkeW5hbWljOworICBvZCA9IG9kIGFzIGR5bmFtaWM7CisgIG9jLmZvbzsgLy8gLy8jIDA0OiBjb21waWxlLXRpbWUgZXJyb3IKKyAgb2QuZm9vOyAvLyAvLyMgMDU6IGNvbXBpbGUtdGltZSBlcnJvcgorICAob24gYXMgT2JqZWN0PykudG9TdHJpbmcoKTsKKyAgKG9jIGFzIE9iamVjdCkudG9TdHJpbmcoKTsKKyAgKG9kIGFzIE9iamVjdCkudG9TdHJpbmcoKTsKKyAgKG9uIGFzIGR5bmFtaWMpLnRvU3RyaW5nKCk7CisgIChvbiBhcyBkeW5hbWljKS5mb287IC8vIC8vIyAwNzogcnVudGltZSBlcnJvcgorICAob2MgYXMgZHluYW1pYykuZm9vOworICAob2QgYXMgZHluYW1pYykuZm9vOworICAob2MgYXMgZHluYW1pYykuYmFyOyAvLyAvLyMgMDg6IHJ1bnRpbWUgZXJyb3IKKyAgKG9kIGFzIGR5bmFtaWMpLmJhcjsKKyAgQyBjID0gb2MgYXMgQzsKKyAgYyA9IG9kIGFzIEM7CisgIGMgPSBvYzsKKyAgRCBkID0gb2QgYXMgRDsKKyAgZCA9IG9jIGFzIEQ7IC8vIC8vIyAxMDogcnVudGltZSBlcnJvcgorICBkID0gb2Q7CisKKyAgKG9sIGFzIExpc3QpWzBdOworICAob2wgYXMgTGlzdDxpbnQ+KVswXTsKKyAgKG9sIGFzIGR5bmFtaWMpWzBdOworICAob2wgYXMgU3RyaW5nKS5sZW5ndGg7IC8vIC8vIyAxMjogcnVudGltZSBlcnJvcgorICBpbnQgeCA9IChvbCBhcyBMaXN0PGludD4pWzBdOworICAob2wgYXMgTGlzdDxpbnQ+KVswXSA9IChvaSBhcyBpbnQpOworCisgIChvcyBhcyBTdHJpbmcpLmxlbmd0aDsKKyAgKG9zIGFzIGR5bmFtaWMpLmxlbmd0aDsKKyAgKG9pIGFzIFN0cmluZykubGVuZ3RoOyAvLyAvLyMgMTM6IHJ1bnRpbWUgZXJyb3IKKyAgKG9zIGFzIExpc3QpLmxlbmd0aDsgLy8gLy8jIDE0OiBydW50aW1lIGVycm9yCisKKyAgKG9pIGFzIGludCkgKyAyOworICAob2kgYXMgTGlzdCkubGVuZ3RoOyAvLyAvLyMgMTU6IHJ1bnRpbWUgZXJyb3IKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21lbWJlcl9zdGF0aWNfcnVudGltZV8xX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21lbWJlcl9zdGF0aWNfcnVudGltZV8xX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI0MzkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWVtYmVyX3N0YXRpY19ydW50aW1lXzFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIFRPRE8obXVsdGl0ZXN0KTogVGhpcyB3YXMgYXV0b21hdGljYWxseSBtaWdyYXRlZCBmcm9tIGEgbXVsdGl0ZXN0IGFuZCBtYXkKKy8vIGNvbnRhaW4gc3RyYW5nZSBvciBkZWFkIGNvZGUuCisKKy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworY2xhc3MgQSB7CisgIHN0YXRpYyB2YXIgYTsKKyAgdmFyIGI7Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHt9CisKK2NsYXNzIEMgZXh0ZW5kcyBCIHsKKyAgdmFyIGE7CisKK30KKwordm9pZCBtYWluKCkgeworICBuZXcgQygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWVtYmVyX3N0YXRpY19ydW50aW1lX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21lbWJlcl9zdGF0aWNfcnVudGltZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4ODRlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21lbWJlcl9zdGF0aWNfcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgc3RhdGljIHZhciBhOworICB2YXIgYjsKK30KKworY2xhc3MgQiBleHRlbmRzIEEge30KKworY2xhc3MgQyBleHRlbmRzIEIgeworCisKK30KKwordm9pZCBtYWluKCkgeworICBuZXcgQygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWVtYmVyX3N0YXRpY190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jaGVja19tZW1iZXJfc3RhdGljX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg3Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWVtYmVyX3N0YXRpY190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgc3RhdGljIHZhciBhOworICB2YXIgYjsKK30KKworY2xhc3MgQiBleHRlbmRzIEEge30KKworY2xhc3MgQyBleHRlbmRzIEIgeworICB2YXIgYTsKKyAgc3RhdGljIHZhciBiOworICAvLyAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09ORkxJQ1RJTkdfU1RBVElDX0FORF9JTlNUQU5DRQorICAvLyBbY2ZlXSBDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS4KK30KKwordm9pZCBtYWluKCkgeworICBuZXcgQygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWV0aG9kX292ZXJyaWRlX3J1bnRpbWVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWV0aG9kX292ZXJyaWRlX3J1bnRpbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzhhMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jaGVja19tZXRob2Rfb3ZlcnJpZGVfcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgZihbdmFyIHhdKSB7fQorICBmb28odmFyIGEsIFt4LCB5XSkge30KK30KKworY2xhc3MgQyBleHRlbmRzIEEgeworCisKK30KKworbWFpbigpIHsKKyAgbmV3IEEoKS5mb28oMik7CisgIG5ldyBDKCkuZm9vKDEpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tfbWV0aG9kX292ZXJyaWRlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21ldGhvZF9vdmVycmlkZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzYWY2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrX21ldGhvZF9vdmVycmlkZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBBIHsKKyAgZihbdmFyIHhdKSB7fQorICBmb28odmFyIGEsIFt4LCB5XSkge30KK30KKworY2xhc3MgQyBleHRlbmRzIEEgeworICBmKCkge30KKy8vXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9PVkVSUklERQorLy8gW2NmZV0gVGhlIG1ldGhvZCAnQy5mJyBoYXMgZmV3ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aG9zZSBvZiBvdmVycmlkZGVuIG1ldGhvZCAnQS5mJy4KKyAgZm9vKHZhciBhLCBbeF0pIHt9CisvL15eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9PVkVSUklERQorLy8gW2NmZV0gVGhlIG1ldGhvZCAnQy5mb28nIGhhcyBmZXdlciBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRob3NlIG9mIG92ZXJyaWRkZW4gbWV0aG9kICdBLmZvbycuCit9CisKK21haW4oKSB7CisgIG5ldyBBKCkuZm9vKDIpOworICBuZXcgQygpLmZvbygxKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrZWRfbWV0aG9kX2Vycm9yX29yZGVyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NoZWNrZWRfbWV0aG9kX2Vycm9yX29yZGVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGViZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY2hlY2tlZF9tZXRob2RfZXJyb3Jfb3JkZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBCYXIgeworICByZXF1aXJlZCh7cmVxdWlyZWQgaW50IGksIHJlcXVpcmVkIFN0cmluZyBhfSkgeworICAgIHByaW50KGkpOworICAgIHByaW50KGEpOworICB9CisKKyAgb3B0aW9uYWwoe2ludD8gaSwgU3RyaW5nPyBhfSkgeworICAgIHByaW50KGkpOworICAgIHByaW50KGEpOworICB9Cit9CisKK21haW4oKSB7CisgIGJvb2wgY2hlY2tlZE1vZGUgPSBmYWxzZTsKKyAgYXNzZXJ0KChjaGVja2VkTW9kZSA9IHRydWUpKTsKKyAgLy8gVGVzdCB0aGF0IGluIGNoZWNrZWQgbW9kZSwgd2UgYXJlIGNoZWNraW5nIHRoZSB0eXBlIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgLy8gaW4gdGhlIGNvcnJlY3Qgb3JkZXIgKGFrYSwgZG9uJ3QgY2hlY2sgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICdhJyBmaXJzdCkuCisgIGlmIChjaGVja2VkTW9kZSkgeworICAgIGR5bmFtaWMgeCA9ICdlJzsKKyAgICBkeW5hbWljIHkgPSAzOworICAgIEV4cGVjdC50aHJvd3MoKCkgPT4gbmV3IEJhcigpLnJlcXVpcmVkKGk6IHgsIGE6IHkpLCAoZSkgeworICAgICAgaWYgKGUgaXMgVHlwZUVycm9yKSB7CisgICAgICAgIHZhciBtID0gZS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gbS5jb250YWlucygiaXMgbm90IGEgc3VidHlwZSBvZiB0eXBlICdpbnQnIikgfHwKKyAgICAgICAgICAgIG0uY29udGFpbnMoCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgdmFsdWUgb2YgdHlwZSAnaW50JywgYnV0IGdvdCBvbmUgb2YgdHlwZSAnU3RyaW5nJyIpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworICAgIEV4cGVjdC50aHJvd3MoKCkgPT4gbmV3IEJhcigpLm9wdGlvbmFsKGk6IHgsIGE6IHkpLCAoZSkgeworICAgICAgaWYgKGUgaXMgVHlwZUVycm9yKSB7CisgICAgICAgIHZhciBtID0gZS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gbS5jb250YWlucygiaXMgbm90IGEgc3VidHlwZSBvZiB0eXBlICdpbnQnIikgfHwKKyAgICAgICAgICAgIG0uY29udGFpbnMoCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgdmFsdWUgb2YgdHlwZSAnaW50JywgYnV0IGdvdCBvbmUgb2YgdHlwZSAnU3RyaW5nJyIpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9pbmRleGVkX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbWJpbmVyX3R5cGVfbG9va3VwX2luZGV4ZWRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjFhMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9pbmRleGVkX3Rlc3QuZGFydApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEEge30KKworY2xhc3MgQiBleHRlbmRzIEEgeworICBCIG9wZXJhdG9yICsoaW50IGkpID0+IHRoaXM7Cit9CisKK2NsYXNzIEMgeworICBCIG9wZXJhdG9yIFtdKGludCBpKSA9PiBuZXcgQigpOworCisgIHZvaWQgb3BlcmF0b3IgW109KGludCBpLCBBIHZhbHVlKSB7fQorfQorCittYWluKCkgeworICBuZXcgQygpWzBdICs9IDE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9pbnN0YW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9pbnN0YW5jZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5NTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbWJpbmVyX3R5cGVfbG9va3VwX2luc3RhbmNlX3Rlc3QuZGFydApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEEge30KKworY2xhc3MgQiBleHRlbmRzIEEgeworICBCIG9wZXJhdG9yICsoaW50IGkpID0+IHRoaXM7Cit9CisKK2NsYXNzIEMgeworICBCIGdldCBwcm9wZXJ0eSA9PiBuZXcgQigpOworCisgIHZvaWQgc2V0IHByb3BlcnR5KEEgdmFsdWUpIHt9Cit9CisKK21haW4oKSB7CisgIG5ldyBDKCkucHJvcGVydHkgKz0gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbWJpbmVyX3R5cGVfbG9va3VwX3N0YXRpY190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9zdGF0aWNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWQ5NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF9zdGF0aWNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworY2xhc3MgQSB7fQorCitjbGFzcyBCIGV4dGVuZHMgQSB7CisgIEIgb3BlcmF0b3IgKyhpbnQgaSkgPT4gdGhpczsKK30KKworY2xhc3MgQyB7CisgIHN0YXRpYyBCIGdldCBzdGF0aWNQcm9wZXJ0eSA9PiBuZXcgQigpOworCisgIHN0YXRpYyB2b2lkIHNldCBzdGF0aWNQcm9wZXJ0eShBIHZhbHVlKSB7fQorfQorCittYWluKCkgeworICBDLnN0YXRpY1Byb3BlcnR5ICs9IDE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb21iaW5lcl90eXBlX2xvb2t1cF90b3BfbGV2ZWxfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29tYmluZXJfdHlwZV9sb29rdXBfdG9wX2xldmVsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFjZjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29tYmluZXJfdHlwZV9sb29rdXBfdG9wX2xldmVsX3Rlc3QuZGFydApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEEge30KKworY2xhc3MgQiBleHRlbmRzIEEgeworICBCIG9wZXJhdG9yICsoaW50IGkpID0+IHRoaXM7Cit9CisKK0IgZ2V0IHRvcExldmVsID0+IG5ldyBCKCk7CisKK3ZvaWQgc2V0IHRvcExldmVsKEEgdmFsdWUpIHt9CisKK21haW4oKSB7CisgIHRvcExldmVsICs9IDE7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb25kaXRpb25fYmFpbG91dF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb25kaXRpb25fYmFpbG91dF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkMDhlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbmRpdGlvbl9iYWlsb3V0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSB0ZXN0aW5nIGNsb3N1cmVzLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQSB7CisgIG9wZXJhdG9yIC0oKSA9PiB0aGlzOworCisgIGZvbyh4KSB7CisgICAgLWE7CisgICAgaWYgKHgpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGxvb3AxKHgpIHsKKyAgICAtYTsKKyAgICB3aGlsZSAoeCkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbG9vcDIoeCkgeworICAgIC1hOworICAgIGZvciAoOyB4OykgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbG9vcDMoeCkgeworICAgIC1hOworICAgIHZhciBpID0gMDsKKyAgICBkbyB7CisgICAgICBpZiAoaSsrID09IDEpIHJldHVybiBmYWxzZTsKKyAgICB9IHdoaWxlICgheCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKwordmFyIGE7CisKK21haW4oKSB7CisgIGEgPSBuZXcgQSgpOworICBFeHBlY3QuaXNUcnVlKGEuZm9vKHRydWUpKTsKKyAgRXhwZWN0LmlzVHJ1ZShhLmxvb3AxKHRydWUpKTsKKyAgRXhwZWN0LmlzVHJ1ZShhLmxvb3AyKHRydWUpKTsKKyAgRXhwZWN0LmlzVHJ1ZShhLmxvb3AzKHRydWUpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHQyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHQyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGIxN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29udGV4dDJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgY2FwdHVyaW5nLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBpc3N1ZSA1OTkxMDE1LgorCitjbGFzcyBWIHsKKyAgbm90Q2FsbGVkKEZ1bmN0aW9uIHgpIHsKKyAgICByZXR1cm4geCgpOworICB9CisKKyAgZm9vZm9vKHgpIHsKKyAgICByZXR1cm4geDsKKyAgfQorCisgIGhvb3AoaW5wdXQsIG4pIHsKKyAgICB3aGlsZSAobi0tID4gMCkgeworICAgICAgRXhwZWN0LmVxdWFscyg1LCBpbnB1dCk7CisgICAgICBjb250aW51ZTsgLy8gVGhpcyBjb250aW51ZSBzdGF0ZW1lbnQgbXVzdCBwcm9wZXJseSB1bmNoYWluIHRoZSBjb250ZXh0LgorICAgICAgc3dpdGNoIChpbnB1dCkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgdmFyIHZhbHVlcyA9IGZvb2ZvbzsKKyAgICAgICAgICBub3RDYWxsZWQoKCkgPT4gdmFsdWVzKGlucHV0KSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK21haW4oKSB7CisgIG5ldyBWKCkuaG9vcCg1LCAzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHRfYXJnc193aXRoX2RlZmF1bHRzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHRfYXJnc193aXRoX2RlZmF1bHRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM4OWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29udGV4dF9hcmdzX3dpdGhfZGVmYXVsdHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIENvbnRleHRBcmdzV2l0aERlZmF1bHRzVGVzdCB7CisgIHN0YXRpYyB2b2lkIHRlc3RNYWluKCkgeworICAgIGNyYXNoZXIoMSwgJ2ZvbycpKCk7CisgIH0KKworICBzdGF0aWMgY3Jhc2hlcihpbnQgZml4ZWQsIFtTdHJpbmcgb3B0aW9uYWwgPSAnJ10pIHsKKyAgICByZXR1cm4gKCkgeworICAgICAgRXhwZWN0LmVxdWFscygxLCBmaXhlZCk7CisgICAgICBFeHBlY3QuZXF1YWxzKCdmb28nLCBvcHRpb25hbCk7CisgICAgfTsKKyAgfQorfQorCittYWluKCkgeworICBDb250ZXh0QXJnc1dpdGhEZWZhdWx0c1Rlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29udGV4dF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiOTZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2NvbnRleHRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgY2FwdHVyaW5nLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQ29udGV4dFRlc3QgeworICBzdGF0aWMgZm9vKEZ1bmN0aW9uIGYpIHsKKyAgICByZXR1cm4gZigpOworICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdE1haW4oKSB7CisgICAgaW50IHggPSA0MjsKKyAgICBiYXIoKSB7CisgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICB4Kys7CisgICAgRXhwZWN0LmVxdWFscyg0MywgZm9vKGJhcikpOworICB9Cit9CisKK21haW4oKSB7CisgIENvbnRleHRUZXN0LnRlc3RNYWluKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jb3JlX3R5cGVfY2hlY2tfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29yZV90eXBlX2NoZWNrX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVhMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY29yZV90eXBlX2NoZWNrX3Rlc3QuZGFydApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjaGVjayh2YWx1ZSwgZXhwZWN0Q29tcGFyYWJsZSwgZXhwZWN0UGF0dGVybikgeworICBFeHBlY3QuZXF1YWxzKGV4cGVjdENvbXBhcmFibGUsIHZhbHVlIGlzIENvbXBhcmFibGUpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdFBhdHRlcm4sIHZhbHVlIGlzIFBhdHRlcm4pOworfQorCitpbnQgaW5zY3J1dGFibGUoaW50IHgpID0+IHggPT0gMCA/IDAgOiB4IHwgaW5zY3J1dGFibGUoeCAmICh4IC0gMSkpOworCitjbGFzcyBBIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgIGludCBjb21wYXJlVG8obykgPT4gMDsKK30KKworY2xhc3MgQiB7fQorCitjbGFzcyBDIGltcGxlbWVudHMgUGF0dGVybiB7CisgIG1hdGNoQXNQcmVmaXgoU3RyaW5nIHMsIFtpbnQgc3RhcnQgPSAwXSkgPT4gbnVsbDsKKyAgYWxsTWF0Y2hlcyhTdHJpbmcgcywgW2ludCBzdGFydCA9IDBdKSA9PiB0aHJvdyAidW5jYWxsZWQiOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgUGF0dGVybiwgQ29tcGFyYWJsZSB7CisgIGludCBjb21wYXJlVG8obykgPT4gMDsKKyAgbWF0Y2hBc1ByZWZpeChTdHJpbmcgcywgW2ludCBzdGFydCA9IDBdKSA9PiBudWxsOworICBhbGxNYXRjaGVzKFN0cmluZyBzLCBbaW50IHN0YXJ0ID0gMF0pID0+IHRocm93ICJ1bmNhbGxlZCI7Cit9CisKK21haW4oKSB7CisgIHZhciB0aGluZ3MgPSBbCisgICAgW10sCisgICAgNCwKKyAgICA0LjIsCisgICAgJ2ZvbycsCisgICAgbmV3IE9iamVjdCgpLAorICAgIG5ldyBBKCksCisgICAgbmV3IEIoKSwKKyAgICBuZXcgQygpLAorICAgIG5ldyBEKCkKKyAgXTsKKworICBjaGVjayh0aGluZ3NbaW5zY3J1dGFibGUoMCldLCBmYWxzZSwgZmFsc2UpOyAvLyBMaXN0CisgIGNoZWNrKHRoaW5nc1tpbnNjcnV0YWJsZSgxKV0sIHRydWUsIGZhbHNlKTsgLy8gaW50CisgIGNoZWNrKHRoaW5nc1tpbnNjcnV0YWJsZSgyKV0sIHRydWUsIGZhbHNlKTsgLy8gbnVtCisgIGNoZWNrKHRoaW5nc1tpbnNjcnV0YWJsZSgzKV0sIHRydWUsIHRydWUpOyAvLyBzdHJpbmcKKyAgY2hlY2sodGhpbmdzW2luc2NydXRhYmxlKDQpXSwgZmFsc2UsIGZhbHNlKTsgLy8gT2JqZWN0CisgIGNoZWNrKHRoaW5nc1tpbnNjcnV0YWJsZSg1KV0sIHRydWUsIGZhbHNlKTsgLy8gQQorICBjaGVjayh0aGluZ3NbaW5zY3J1dGFibGUoNildLCBmYWxzZSwgZmFsc2UpOyAvLyBCCisgIGNoZWNrKHRoaW5nc1tpbnNjcnV0YWJsZSg3KV0sIGZhbHNlLCB0cnVlKTsgLy8gQworICBjaGVjayh0aGluZ3NbaW5zY3J1dGFibGUoOCldLCB0cnVlLCB0cnVlKTsgLy8gRAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY3ljbGljX2RlZmF1bHRfdmFsdWVzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2N5Y2xpY19kZWZhdWx0X3ZhbHVlc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjOGUwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2N5Y2xpY19kZWZhdWx0X3ZhbHVlc190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworYmFyKFt4ID0gZm9vXSkgPT4geCgoXykgPT4gImJhciIpOworZm9vKFt5ID0gYmFyXSkgPT4geSgoXykgPT4gImZvbyIpOworCitmb28yKHtmOiBiYXIyfSkgPT4gZihmOiAoe2Z9KSA9PiAiZm9vMiIpOworYmFyMih7ZjogZm9vMn0pID0+IGYoZjogKHtmfSkgPT4gImJhcjIiKTsKKworbWFpbigpIHsKKyAgdmFyIGYgPSBiYXI7CisgIEV4cGVjdC5lcXVhbHMoImJhciIsIEZ1bmN0aW9uLmFwcGx5KGYsIFtdKSk7CisgIEV4cGVjdC5lcXVhbHMoIm1haW4iLCBGdW5jdGlvbi5hcHBseShmLCBbKF8pID0+ICJtYWluIl0pKTsKKworICB2YXIgZl8yID0gYmFyMjsKKyAgRXhwZWN0LmVxdWFscygiYmFyMiIsIEZ1bmN0aW9uLmFwcGx5KGZfMiwgW10pKTsKKyAgRXhwZWN0LmVxdWFscygibWFpbjIiLCBGdW5jdGlvbi5hcHBseShmXzIsIFtdLCB7I2Y6ICh7Zn0pID0+ICJtYWluMiJ9KSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jeWNsaWNfdHlwZTJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY3ljbGljX3R5cGUyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYyZjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY3ljbGljX3R5cGUyX3Rlc3QuZGFydApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHNlbGYgcmVmZXJlbmNpbmcgdHlwZXMuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBCYXNlPFUsIFY+IHsKKyAgZ2V0IHUgPT4gVTsKKyAgZ2V0IHYgPT4gVjsKK30KKworY2xhc3MgRGVyaXZlZDE8VSwgVj4KKyAgICBleHRlbmRzIEJhc2U8RGVyaXZlZDE8VSwgVj4sIERlcml2ZWQxPERlcml2ZWQyPFYsIFU+LCBEZXJpdmVkMj4+IHt9CisKK2NsYXNzIERlcml2ZWQyPFUsIFY+CisgICAgZXh0ZW5kcyBCYXNlPERlcml2ZWQyPFUsIFY+LCBEZXJpdmVkMjxEZXJpdmVkMTxWLCBVPiwgRGVyaXZlZDE+PiB7fQorCittYWluKCkgeworICB2YXIgZCA9IG5ldyBEZXJpdmVkMTxEZXJpdmVkMSwgRGVyaXZlZDI+KCk7CisgIEV4cGVjdC5lcXVhbHMoCisgICAgICAiRGVyaXZlZDE8RGVyaXZlZDE8ZHluYW1pYywgZHluYW1pYz4sIERlcml2ZWQyPGR5bmFtaWMsIGR5bmFtaWM+PiIsCisgICAgICBkLnUudG9TdHJpbmcoKSk7CisgIEV4cGVjdC5lcXVhbHMoCisgICAgICAiRGVyaXZlZDE8RGVyaXZlZDI8RGVyaXZlZDI8ZHluYW1pYywgZHluYW1pYz4sICIKKyAgICAgICJEZXJpdmVkMTxkeW5hbWljLCBkeW5hbWljPj4sIERlcml2ZWQyPGR5bmFtaWMsIGR5bmFtaWM+PiIsCisgICAgICBkLnYudG9TdHJpbmcoKSk7CisgIEV4cGVjdC5pc1RydWUoZCBpcyBEZXJpdmVkMTxEZXJpdmVkMSwgRGVyaXZlZDI+KTsKKyAgRXhwZWN0LmlzRmFsc2UoZCBpcyBEZXJpdmVkMTxEZXJpdmVkMSwgRGVyaXZlZDE+KTsKKyAgRXhwZWN0LmlzVHJ1ZShkIGlzIEJhc2U8RGVyaXZlZDE8RGVyaXZlZDEsIERlcml2ZWQyPiwKKyAgICAgIERlcml2ZWQxPERlcml2ZWQyPERlcml2ZWQyLCBEZXJpdmVkMT4sIERlcml2ZWQyPj4pOworICBFeHBlY3QuaXNGYWxzZShkIGlzIEJhc2U8RGVyaXZlZDE8RGVyaXZlZDEsIERlcml2ZWQyPiwKKyAgICAgIERlcml2ZWQxPERlcml2ZWQyPERlcml2ZWQyLCBEZXJpdmVkMj4sIERlcml2ZWQyPj4pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY3ljbGljX3R5cGVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvY3ljbGljX3R5cGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzFmNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9jeWNsaWNfdHlwZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBzZWxmIHJlZmVyZW5jaW5nIHR5cGVzLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworQHByYWdtYSgidm06ZW50cnktcG9pbnQiKSAgLy8gUHJldmVudCBvYmZ1c2NhdGlvbgorY2xhc3MgQmFzZTxUPiB7CisgIGdldCB0ID0+IFQ7Cit9CisKKy8vIERlcml2ZWQ8VD4gaXMgY29udHJhY3RpdmUuCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uCitjbGFzcyBEZXJpdmVkPFQ+IGV4dGVuZHMgQmFzZTxEZXJpdmVkPFQ+PiB7fSAvLyAvLyMgMDA6IG9rCisKKy8vIERlcml2ZWQ8VD4gaXMgY29udHJhY3RpdmUuCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uCitjbGFzcyBEZXJpdmVkPFQ+IGV4dGVuZHMgQmFzZTxEZXJpdmVkPERlcml2ZWQ8aW50Pj4+IHt9IC8vIC8vIyAwMTogb2sKKworLy8gRGVyaXZlZDxUPiBpcyBub24tY29udHJhY3RpdmUuCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uCitjbGFzcyBEZXJpdmVkPFQ+IGV4dGVuZHMgQmFzZTxEZXJpdmVkPERlcml2ZWQ8VD4+PiB7fSAvLyAvLyMgMDI6IG9rCisKKy8vIERlcml2ZWQxPFU+IGFuZCBEZXJpdmVkMjxWPiBhcmUgY29udHJhY3RpdmUuCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uCitjbGFzcyBEZXJpdmVkMTxVPiBleHRlbmRzIEJhc2U8RGVyaXZlZDI8VT4+IHt9IC8vICAvLyMgMDM6IG9rCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uCitjbGFzcyBEZXJpdmVkMjxWPiBleHRlbmRzIEJhc2U8RGVyaXZlZDE8Vj4+IHt9IC8vICAvLyMgMDM6IG9rCisKKy8vIERlcml2ZWQxPFU+IGFuZCBEZXJpdmVkMjxWPiBhcmUgbm9uLWNvbnRyYWN0aXZlLgorQHByYWdtYSgidm06ZW50cnktcG9pbnQiKSAgLy8gUHJldmVudCBvYmZ1c2NhdGlvbgorY2xhc3MgRGVyaXZlZDE8VT4gZXh0ZW5kcyBCYXNlPERlcml2ZWQyPFU+PiB7fSAvLyAgLy8jIDA0OiBvaworQHByYWdtYSgidm06ZW50cnktcG9pbnQiKSAgLy8gUHJldmVudCBvYmZ1c2NhdGlvbgorY2xhc3MgRGVyaXZlZDI8Vj4gZXh0ZW5kcyBCYXNlPERlcml2ZWQxPERlcml2ZWQyPFY+Pj4ge30gLy8gIC8vIyAwNDogb2sKKworbWFpbigpIHsKKyAgLy8gSW4gdGhlIHRlc3RzIGJlbG93IHdlIHRlc3QgdGhhdCB3ZSBnZXQgImludCIgYW5kICJib29sIiB3aGVuIGNhbGxpbmcKKyAgLy8gdG9TdHJpbmcoKSBvbiB0aGUgaW50IGFuZCBib29sIHR5cGUgcmVzcGVjdGl2ZWx5LiBUaGlzIGlzIG5vdCByZXF1aXJlZAorICAvLyBiZWhhdmlvci4gSG93ZXZlciwgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBuYW1lcyBmb3IgdGhlIG1vc3QgY29tbW9uCisgIC8vIGNvcmUgdHlwZXMgc28gd2UgbWFrZSBzdXJlIHRvIGhhbmRsZSB0aGVzZSBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvbXBpbGVyLgorCisgIHZhciBkOworICBkID0gbmV3IERlcml2ZWQoKTsgLy8gLy8jIDAwOiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDxkeW5hbWljPiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDAwOiBjb250aW51ZWQKKyAgZCA9IG5ldyBEZXJpdmVkPGJvb2w+KCk7IC8vIC8vIyAwMDogY29udGludWVkCisgIEV4cGVjdC5lcXVhbHMoIkRlcml2ZWQ8Ym9vbD4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwMDogY29udGludWVkCisgIGQgPSBuZXcgRGVyaXZlZDxEZXJpdmVkPigpOyAvLyAvLyMgMDA6IGNvbnRpbnVlZAorICBFeHBlY3QuZXF1YWxzKCJEZXJpdmVkPERlcml2ZWQ8ZHluYW1pYz4+IiwgZC50LnRvU3RyaW5nKCkpOyAvLyAvLyMgMDA6IGNvbnRpbnVlZAorCisgIGQgPSBuZXcgRGVyaXZlZCgpOyAvLyAvLyMgMDE6IGNvbnRpbnVlZAorCisgIEV4cGVjdC5lcXVhbHMoIkRlcml2ZWQ8RGVyaXZlZDxpbnQ+PiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDAxOiBjb250aW51ZWQKKyAgZCA9IG5ldyBEZXJpdmVkPGJvb2w+KCk7IC8vIC8vIyAwMTogY29udGludWVkCisgIEV4cGVjdC5lcXVhbHMoIkRlcml2ZWQ8RGVyaXZlZDxpbnQ+PiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDAxOiBjb250aW51ZWQKKyAgZCA9IG5ldyBEZXJpdmVkPERlcml2ZWQ+KCk7IC8vIC8vIyAwMTogY29udGludWVkCisgIEV4cGVjdC5lcXVhbHMoIkRlcml2ZWQ8RGVyaXZlZDxpbnQ+PiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDAxOiBjb250aW51ZWQKKworICBkID0gbmV3IERlcml2ZWQoKTsgLy8gLy8jIDAyOiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDxEZXJpdmVkPGR5bmFtaWM+PiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDAyOiBjb250aW51ZWQKKyAgZCA9IG5ldyBEZXJpdmVkPGJvb2w+KCk7IC8vIC8vIyAwMjogY29udGludWVkCisgIEV4cGVjdC5lcXVhbHMoIkRlcml2ZWQ8RGVyaXZlZDxib29sPj4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwMjogY29udGludWVkCisgIGQgPSBuZXcgRGVyaXZlZDxEZXJpdmVkPigpOyAvLyAvLyMgMDI6IGNvbnRpbnVlZAorICBFeHBlY3QuZXF1YWxzKCJEZXJpdmVkPERlcml2ZWQ8RGVyaXZlZDxkeW5hbWljPj4+IiwgZC50LnRvU3RyaW5nKCkpOyAvLyAvLyMgMDI6IGNvbnRpbnVlZAorCisgIGQgPSBuZXcgRGVyaXZlZDEoKTsgLy8gLy8jIDAzOiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDI8ZHluYW1pYz4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwMzogY29udGludWVkCisgIGQgPSBuZXcgRGVyaXZlZDIoKTsgLy8gLy8jIDAzOiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDE8ZHluYW1pYz4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwMzogY29udGludWVkCisgIGQgPSBuZXcgRGVyaXZlZDI8RGVyaXZlZDE8aW50Pj4oKTsgLy8gLy8jIDAzOiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDE8RGVyaXZlZDE8aW50Pj4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwMzogY29udGludWVkCisKKyAgZCA9IG5ldyBEZXJpdmVkMSgpOyAvLyAvLyMgMDQ6IGNvbnRpbnVlZAorICBFeHBlY3QuZXF1YWxzKCJEZXJpdmVkMjxkeW5hbWljPiIsIGQudC50b1N0cmluZygpKTsgLy8gLy8jIDA0OiBjb250aW51ZWQKKyAgZCA9IG5ldyBEZXJpdmVkMigpOyAvLyAvLyMgMDQ6IGNvbnRpbnVlZAorICBFeHBlY3QuZXF1YWxzKCJEZXJpdmVkMTxEZXJpdmVkMjxkeW5hbWljPj4iLCBkLnQudG9TdHJpbmcoKSk7IC8vIC8vIyAwNDogY29udGludWVkCisgIGQgPSBuZXcgRGVyaXZlZDI8RGVyaXZlZDE8aW50Pj4oKTsgLy8gLy8jIDA0OiBjb250aW51ZWQKKyAgRXhwZWN0LmVxdWFscygiRGVyaXZlZDE8RGVyaXZlZDI8RGVyaXZlZDE8aW50Pj4+IiwgZC50LnRvU3RyaW5nKCkpOyAvLyAvLyMgMDQ6IGNvbnRpbnVlZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVmYXVsdF9pbXBsZW1lbnRhdGlvbjJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVmYXVsdF9pbXBsZW1lbnRhdGlvbjJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzYwN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9kZWZhdWx0X2ltcGxlbWVudGF0aW9uMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCB0ZXN0IHRvIHZlcmlmeSBpbmNvbXBhdGlibGUgY29uc3RydWN0b3IgdHlwZXMKKworYWJzdHJhY3QgY2xhc3MgUG9pbnQgeworICBmYWN0b3J5IFBvaW50KGludCB4LCBpbnQgeSkgPSBQb2ludEltcGxlbWVudGF0aW9uOyAvLyMgMDE6IG9rCisgIGZhY3RvcnkgUG9pbnQoeCwgeSkgPSBQb2ludEltcGxlbWVudGF0aW9uOyAvLyMgMDI6IGNvbXBpbGUtdGltZSBlcnJvcgorfQorCitjbGFzcyBQb2ludEltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgUG9pbnQgeworICAgUG9pbnRJbXBsZW1lbnRhdGlvbihpbnQgeCwgaW50IHkpIHt9Cit9CisKK21haW4oKSB7CisgIG5ldyBQb2ludCgxLCAyKTsgLy8jIDAxOiBjb250aW51ZWQKKyAgbmV3IFBvaW50KDEsIDIpOyAvLyMgMDI6IGNvbnRpbnVlZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVmYXVsdF9pbXBsZW1lbnRhdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9kZWZhdWx0X2ltcGxlbWVudGF0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBhMWFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2RlZmF1bHRfaW1wbGVtZW50YXRpb25fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCB0byB2ZXJpZnkgdGhhdCBmYWN0b3J5IGNsYXNzZXMgYXJlIHdvcmtpbmcuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCithYnN0cmFjdCBjbGFzcyBQb2ludCB7CisgIGZhY3RvcnkgUG9pbnQoaW50IHgsIGludCB5KSA9IFBvaW50SW1wbGVtZW50YXRpb247CisKKyAgZmluYWwgaW50IHggPSAtMTsKKyAgZmluYWwgaW50IHkgPSAtMTsKK30KKworY2xhc3MgUG9pbnRJbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIFBvaW50IHsKKyAgY29uc3QgUG9pbnRJbXBsZW1lbnRhdGlvbihpbnQgeCwgaW50IHkpCisgICAgICA6IHRoaXMueCA9IHgsCisgICAgICAgIHRoaXMueSA9IHk7CisgIGZpbmFsIGludCB4OworICBmaW5hbCBpbnQgeTsKK30KKworY2xhc3MgRGVmYXVsdEltcGxlbWVudGF0aW9uVGVzdCB7CisgIHN0YXRpYyB2b2lkIHRlc3RNYWluKCkgeworICAgIFBvaW50IHBvaW50ID0gbmV3IFBvaW50KDQsIDIpOworICAgIEV4cGVjdC5lcXVhbHMoNCwgcG9pbnQueCk7CisgICAgRXhwZWN0LmVxdWFscygyLCBwb2ludC55KTsKKyAgfQorfQorCittYWluKCkgeworICBEZWZhdWx0SW1wbGVtZW50YXRpb25UZXN0LnRlc3RNYWluKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9kZWZhdWx0X2luaXRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVmYXVsdF9pbml0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE1N2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVmYXVsdF9pbml0X3Rlc3QuZGFydApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0cyBzdGF0aWMgYW5kIGluc3RhbmNlIGZpZWxkcyBpbml0aWFsaXphdGlvbi4KK2NsYXNzIERlZmF1bHRJbml0VGVzdCB7CisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDAsIEEuYSk7CisgICAgRXhwZWN0LmVxdWFscygyLCBBLmIpOworICAgIEV4cGVjdC5lcXVhbHMobnVsbCwgQS5jKTsKKworICAgIEEgYTEgPSBuZXcgQSg0Mik7CisgICAgRXhwZWN0LmVxdWFscyg0MiwgYTEuZCk7CisgICAgRXhwZWN0LmVxdWFscyhudWxsLCBhMS5lKTsKKworICAgIEEgYTIgPSBuZXcgQS5uYW1lZCg0Myk7CisgICAgRXhwZWN0LmVxdWFscyhudWxsLCBhMi5kKTsKKyAgICBFeHBlY3QuZXF1YWxzKDQzLCBhMi5lKTsKKworICAgIEV4cGVjdC5lcXVhbHMoNDIsIEIuaW5zdGFuY2UueCk7CisgICAgRXhwZWN0LmVxdWFscygzLCBDLmluc3RhbmNlLnopOworICB9Cit9CisKK2NsYXNzIEEgeworICBzdGF0aWMgY29uc3QgaW50IGEgPSAwOworICBzdGF0aWMgY29uc3QgaW50IGIgPSAyOworICBzdGF0aWMgaW50PyBjOworICBpbnQ/IGQ7CisgIGludD8gZTsKKworICBBKGludCB2YWwpIHsKKyAgICBkID0gdmFsOworICB9CisKKyAgQS5uYW1lZChpbnQgdmFsKSB7CisgICAgZSA9IHZhbDsKKyAgfQorfQorCisvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGNvdmVyIGNhc2VzIGRlc2NyaWJlZCBpbiBiLzQxMDEyNzAKKworY2xhc3MgQiB7CisgIHN0YXRpYyBjb25zdCBCIGluc3RhbmNlID0gY29uc3QgQigpOworICAvLyBieSBwdXR0aW5nIHRoaXMgZmllbGQgYWZ0ZXIgdGhlIHN0YXRpYyBpbml0aWFsaXplciBhYm92ZSwgdGhlIEpTIGNvZGUgZ2VuCisgIC8vIHdhcyBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBiZWZvcmUgdGhlIHNldHRlciBvZiB0aGlzIHByb3BlcnR5IHdhcyBkZWZpbmVkLgorICBmaW5hbCBpbnQgeDsKKyAgY29uc3QgQigpIDogdGhpcy54ID0gKDQxICsgMSk7Cit9CisKK2NsYXNzIEMgeworICAvLyBmb3J3YXJkIHJlZmVyZW5jZSB0byBhbm90aGVyIGNsYXNzCisgIHN0YXRpYyBjb25zdCBEIGluc3RhbmNlID0gY29uc3QgRCgpOworICBDKCkge30KK30KKworY2xhc3MgRCB7CisgIGNvbnN0IEQoKSA6IHRoaXMueiA9IDM7CisgIGZpbmFsIGludCB6OworfQorCittYWluKCkgeworICBEZWZhdWx0SW5pdFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2RlbnlfbGlzdGVkX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2RlbnlfbGlzdGVkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ5ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZGVueV9saXN0ZWRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBjaGVja2luZyB0aGF0IHN0YXRpYy9pbnN0YW5jZSBmaWVsZCBzaGFkb3dpbmcgZG8gbm90IGNvbmZsaWN0LgorCisvLyBUZXN0IHRoYXQgY2VydGFpbiBpbnRlcmZhY2VzL2NsYXNzZXMgYXJlIGRlbnlsaXN0ZWQgZnJvbSBiZWluZworLy8gaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQuCisKKy8vIGJvb2wuCitjbGFzcyBNeUJvb2wgaW1wbGVtZW50cyBib29sIHt9IC8vICAgICAgICAgICAgICAgICAgICAvLyMgMDE6IGNvbXBpbGUtdGltZSBlcnJvcgorYWJzdHJhY3QgY2xhc3MgTXlCb29sSW50ZXJmYWNlIGltcGxlbWVudHMgYm9vbCBkZWZhdWx0IEYgeyAvLyAvLyMgMDI6IHN5bnRheCBlcnJvcgorICBNeUJvb2xJbnRlcmZhY2UoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDAyOiBjb250aW51ZWQKK30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAwMjogY29udGludWVkCisKKy8vIG51bS4KK2NsYXNzIE15TnVtIGltcGxlbWVudHMgbnVtIHt9IC8vICAgICAgICAgICAgICAgICAgICAgIC8vIyAwMzogY29tcGlsZS10aW1lIGVycm9yCithYnN0cmFjdCBjbGFzcyBNeU51bUludGVyZmFjZSBpbXBsZW1lbnRzIG51bSBkZWZhdWx0IEYgeyAvLyAgIC8vIyAwNDogc3ludGF4IGVycm9yCisgIE15TnVtSW50ZXJmYWNlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMDQ6IGNvbnRpbnVlZAorfSAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDA0OiBjb250aW51ZWQKKworLy8gaW50LgorY2xhc3MgTXlJbnQgaW1wbGVtZW50cyBpbnQge30gLy8gICAgICAgICAgICAgICAgICAgICAgLy8jIDA1OiBjb21waWxlLXRpbWUgZXJyb3IKK2Fic3RyYWN0IGNsYXNzIE15SW50SW50ZXJmYWNlIGltcGxlbWVudHMgaW50IGRlZmF1bHQgRiB7IC8vICAgLy8jIDA2OiBzeW50YXggZXJyb3IKKyAgTXlJbnRJbnRlcmZhY2UoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAwNjogY29udGludWVkCit9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMDY6IGNvbnRpbnVlZAorCisvLyBkb3VibGUuCitjbGFzcyBNeURvdWJsZSBpbXBsZW1lbnRzIGRvdWJsZSB7fSAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDA3OiBjb21waWxlLXRpbWUgZXJyb3IKK2Fic3RyYWN0IGNsYXNzIE15RG91YmxlSW50ZXJmYWNlIGltcGxlbWVudHMgZG91YmxlIGRlZmF1bHQgRiB7IC8vIC8vIyAwODogc3ludGF4IGVycm9yCisgIE15RG91YmxlSW50ZXJmYWNlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDA4OiBjb250aW51ZWQKK30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMDg6IGNvbnRpbnVlZAorCisvLyBTdHJpbmcuCitjbGFzcyBNeVN0cmluZyBpbXBsZW1lbnRzIFN0cmluZyB7fSAvLyAgICAgICAgICAgICAgICAgICAgLy8jIDA5OiBjb21waWxlLXRpbWUgZXJyb3IKK2Fic3RyYWN0IGNsYXNzIE15U3RyaW5nSW50ZXJmYWNlIGltcGxlbWVudHMgU3RyaW5nIGRlZmF1bHQgRiB7IC8vIC8vIyAxMDogc3ludGF4IGVycm9yCisgIE15U3RyaW5nSW50ZXJmYWNlKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEwOiBjb250aW51ZWQKK30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA6IGNvbnRpbnVlZAorCisvLyBGdW5jdGlvbi4KK2NsYXNzIE15RnVuY3Rpb24gaW1wbGVtZW50cyBGdW5jdGlvbiB7fQorCitjbGFzcyBNeU90aGVyRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7fQorYWJzdHJhY3QgY2xhc3MgTXlGdW5jdGlvbkludGVyZmFjZSBpbXBsZW1lbnRzIEZ1bmN0aW9uIGRlZmF1bHQgRiB7IC8vIC8vIyAxMjogc3ludGF4IGVycm9yCisgIE15RnVuY3Rpb25JbnRlcmZhY2UoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMjogY29udGludWVkCit9IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMjogY29udGludWVkCisKKy8vIGR5bmFtaWMuCitjbGFzcyBNeUR5bmFtaWMgaW1wbGVtZW50cyBkeW5hbWljIHt9IC8vICAgICAgICAgICAgICAgICAgICAgLy8jIDEzOiBjb21waWxlLXRpbWUgZXJyb3IKK2Fic3RyYWN0IGNsYXNzIE15RHluYW1pY0ludGVyZmFjZSBpbXBsZW1lbnRzIGR5bmFtaWMgZGVmYXVsdCBGIHsgLy8gIC8vIyAxNDogc3ludGF4IGVycm9yCisgIE15RHluYW1pY0ludGVyZmFjZSgpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE0OiBjb250aW51ZWQKK30gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTQ6IGNvbnRpbnVlZAorCitjbGFzcyBGIHsKKyAgZmFjdG9yeSBNeUJvb2xJbnRlcmZhY2UoKSB7IHJldHVybiBudWxsOyB9IC8vICAgICAvLyMgMDI6IGNvbnRpbnVlZAorICBmYWN0b3J5IE15TnVtSW50ZXJmYWNlKCkgeyByZXR1cm4gbnVsbDsgfSAvLyAgICAgIC8vIyAwNDogY29udGludWVkCisgIGZhY3RvcnkgTXlJbnRJbnRlcmZhY2UoKSB7IHJldHVybiBudWxsOyB9IC8vICAgICAgLy8jIDA2OiBjb250aW51ZWQKKyAgZmFjdG9yeSBNeURvdWJsZUludGVyZmFjZSgpIHsgcmV0dXJuIG51bGw7IH0gLy8gICAvLyMgMDg6IGNvbnRpbnVlZAorICBmYWN0b3J5IE15U3RyaW5nSW50ZXJmYWNlKCkgeyByZXR1cm4gbnVsbDsgfSAvLyAgIC8vIyAxMDogY29udGludWVkCisgIGZhY3RvcnkgTXlGdW5jdGlvbkludGVyZmFjZSgpIHsgcmV0dXJuIG51bGw7IH0gLy8gLy8jIDEyOiBjb250aW51ZWQKKyAgZmFjdG9yeSBNeUR5bmFtaWNJbnRlcmZhY2UoKSB7IHJldHVybiBudWxsOyB9IC8vICAvLyMgMTQ6IGNvbnRpbnVlZAorfQorCittYWluKCkgeworICBuZXcgTXlCb29sKCk7IC8vICAgICAgICAgICAgIC8vIyAwMTogY29udGludWVkCisgIG5ldyBNeUJvb2xJbnRlcmZhY2UoKTsgLy8gICAgLy8jIDAyOiBjb250aW51ZWQKKyAgbmV3IE15TnVtKCk7IC8vICAgICAgICAgICAgICAvLyMgMDM6IGNvbnRpbnVlZAorICBuZXcgTXlOdW1JbnRlcmZhY2UoKTsgLy8gICAgIC8vIyAwNDogY29udGludWVkCisgIG5ldyBNeUludCgpOyAvLyAgICAgICAgICAgICAgLy8jIDA1OiBjb250aW51ZWQKKyAgbmV3IE15SW50SW50ZXJmYWNlKCk7IC8vICAgICAvLyMgMDY6IGNvbnRpbnVlZAorICBuZXcgTXlEb3VibGUoKTsgLy8gICAgICAgICAgIC8vIyAwNzogY29udGludWVkCisgIG5ldyBNeURvdWJsZUludGVyZmFjZSgpOyAvLyAgLy8jIDA4OiBjb250aW51ZWQKKyAgbmV3IE15U3RyaW5nKCk7IC8vICAgICAgICAgICAvLyMgMDk6IGNvbnRpbnVlZAorICBuZXcgTXlTdHJpbmdJbnRlcmZhY2UoKTsgLy8gIC8vIyAxMDogY29udGludWVkCisgIG5ldyBNeUZ1bmN0aW9uKCk7CisgIG5ldyBNeU90aGVyRnVuY3Rpb24oKTsKKyAgbmV3IE15RnVuY3Rpb25JbnRlcmZhY2UoKTsgLy8jIDEyOiBjb250aW51ZWQKKyAgbmV3IE15RHluYW1pYygpOyAvLyAgICAgICAgICAvLyMgMTM6IGNvbnRpbnVlZAorICBuZXcgTXlEeW5hbWljSW50ZXJmYWNlKCk7IC8vIC8vIyAxNDogY29udGludWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9kaXNhc3NlbWJsZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9kaXNhc3NlbWJsZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzYjAzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Rpc2Fzc2VtYmxlX3Rlc3QuZGFydApAQCAtMCwwICsxLDE2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWRpc2Fzc2VtYmxlCisvLyBWTU9wdGlvbnM9LS1kaXNhc3NlbWJsZSAtLWFsd2F5c19nZW5lcmF0ZV90cmFtcG9saW5lc19mb3JfdGVzdGluZworCisvLyBUZXN0cyBwcm9wZXIgb2JqZWN0IHJlY29nbml0aW9uIGluIGRpc2Fzc2VtYmxlci4KKworZih4KSB7CisgIHJldHVybiAiZm9vIjsKK30KKworbWFpbigpIHsKKyAgcHJpbnQoZigwKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9lZmZpY2llbnRfbGVuZ3RoX3dhcm5pbmdfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZWZmaWNpZW50X2xlbmd0aF93YXJuaW5nX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmEyYzZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZWZmaWNpZW50X2xlbmd0aF93YXJuaW5nX3Rlc3QuZGFydApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBUaGlyZCBkYXJ0IHRlc3QgcHJvZ3JhbS4KKworaW1wb3J0ICJkYXJ0Om1hdGgiOworCittYWluKCkgeworICAvLyBUaGlzIHNob3VsZCBubyBsb25nZXIgY2F1c2UgYSB3YXJuaW5nIGJlY2F1c2UgdGhlIGxlYXN0LXVwcGVyLWJvdW5kCisgIC8vIG9mIExpc3Q8aW50PiBhbmQgU2V0PGludD4gaXMgT2JqZWN0LgorICAvLyBUaGUgTFVCIGlzIG5vdyBFZmZpY2llbnRMZW5ndGhJdGVyYWJsZSBhbmQgaXQgZXh0ZW5kcyBJdGVyYWJsZS4KKyAgdmFyIHggPSAobmV3IFJhbmRvbSgpLm5leHRCb29sKCkgLy8gVW5wcmVkaWN0YWJsZSBjb25kaXRpb24uCisgICAgICAgICAgPyA8aW50PlsxXQorICAgICAgICAgIDogbmV3IFNldDxpbnQ+LmZyb20oWzFdKSkKKyAgICAgIC5maXJzdDsKKyAgaWYgKHggIT0gMSkgdGhyb3cgIldhdD8iOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZW1pdF9jb25zdF9maWVsZHNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZW1pdF9jb25zdF9maWVsZHNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjRjNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9lbWl0X2NvbnN0X2ZpZWxkc190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCB0aGF0IHVzZWQgc3RhdGljIGNvbnN0cyBhcmUgZW1pdHRlZC4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEd1aWRlIHsKKyAgc3RhdGljIGNvbnN0IExUVUFFID0gNDI7CisgIHN0YXRpYyBjb25zdCBUSVRMRSA9ICJMaWZlLCB0aGUgVW5pdmVyc2UgYW5kIEV2ZXJ5dGhpbmciOworICBzdGF0aWMgY29uc3QgRUFSVEggPSBjb25zdCB7CisgICAgIlNlY3RvciI6ICJaWjkgUGx1cmFsIFogQWxwaGEiLAorICAgICJTdGF0dXMiOiBjb25zdCBbIlNjaGVkdWxlZCBmb3IgZGVtb2xpdGlvbiIsICIxOTc4LTAzLTA4Il0sCisgICAgIkRlc2NyaXB0aW9uIjogIk1vc3RseSBoYXJtbGVzcyIKKyAgfTsKK30KKworbWFpbigpIHsKKyAgRXhwZWN0LmlzVHJ1ZSg0MiA9PSBHdWlkZS5MVFVBRSk7CisgIEV4cGVjdC5pc1RydWUoIjE5NzgtMDMtMDgiID09IChHdWlkZS5FQVJUSFsiU3RhdHVzIl0gYXMgTGlzdClbMV0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXhwZWN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4cGVjdF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkOGM4YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHBlY3RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3RpbmcgdGhlIEV4cGVjdCBjbGFzcy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEV4cGVjdFRlc3QgeworICBzdGF0aWMgdGVzdEVxdWFscyhhKSB7CisgICAgdHJ5IHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoIkFCIiwgYSwgIndpdGhpbiB0ZXN0RXF1YWxzIik7CisgICAgfSBvbiBFeHBlY3RFeGNlcHRpb24gY2F0Y2ggKG1zZykgeworICAgICAgcHJpbnQobXNnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRXhwZWN0LmVxdWFscygiQUIiLCAiJHthfUIiKTsKKyAgICB0aHJvdyAiRXhwZWN0LmVxdWFscyBkaWQgbm90IGZhaWwiOworICB9CisKKyAgc3RhdGljIHRlc3RJc1RydWUoZikgeworICAgIHRyeSB7CisgICAgICBFeHBlY3QuaXNUcnVlKGYpOworICAgIH0gb24gRXhwZWN0RXhjZXB0aW9uIGNhdGNoIChtc2cpIHsKKyAgICAgIHByaW50KG1zZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEV4cGVjdC5pc0ZhbHNlKGYpOworICAgIHRocm93ICJFeHBlY3QuaXNUcnVlIGRpZCBub3QgZmFpbCI7CisgIH0KKworICBzdGF0aWMgdGVzdElzRmFsc2UodCkgeworICAgIHRyeSB7CisgICAgICBFeHBlY3QuaXNGYWxzZSh0KTsKKyAgICB9IG9uIEV4cGVjdEV4Y2VwdGlvbiBjYXRjaCAobXNnKSB7CisgICAgICBwcmludChtc2cpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFeHBlY3QuaXNUcnVlKHQpOworICAgIHRocm93ICJFeHBlY3QuaXNGYWxzZSBkaWQgbm90IGZhaWwiOworICB9CisKKyAgc3RhdGljIHRlc3RJZGVudGljYWwoYSkgeworICAgIHZhciBhYiA9IGEgKyAiQiI7CisgICAgdHJ5IHsKKyAgICAgIEV4cGVjdC5pZGVudGljYWwoIkFCIiwgYWIpOworICAgIH0gb24gRXhwZWN0RXhjZXB0aW9uIGNhdGNoIChtc2cpIHsKKyAgICAgIHByaW50KG1zZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEV4cGVjdC5lcXVhbHMoIkFCIiwgYWIpOworICAgIHRocm93ICJFeHBlY3QuaWRlbnRpY2FsIGRpZCBub3QgZmFpbCI7CisgIH0KKworICBzdGF0aWMgdGVzdEZhaWwoKSB7CisgICAgdHJ5IHsKKyAgICAgIEV4cGVjdC5mYWlsKCJmYWlsIG5vdyIpOworICAgIH0gb24gRXhwZWN0RXhjZXB0aW9uIGNhdGNoIChtc2cpIHsKKyAgICAgIHByaW50KG1zZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHRocm93ICJFeHBlY3QuZmFpbCBkaWQgbm90IGZhaWwiOworICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdE1haW4oKSB7CisgICAgdGVzdEVxdWFscygiQSIpOworICAgIHRlc3RJc1RydWUoZmFsc2UpOworICAgIHRlc3RJc1RydWUoMSk7CisgICAgdGVzdElzRmFsc2UodHJ1ZSk7CisgICAgdGVzdElzRmFsc2UoMCk7CisgICAgdGVzdElkZW50aWNhbCgiQSIpOworICAgIHRlc3RGYWlsKCk7CisgIH0KK30KKworbWFpbigpIHsKKyAgRXhwZWN0VGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXh0ZW5kX3R5cGVfcGFyYW1ldGVyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVuZF90eXBlX3BhcmFtZXRlcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5OTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVuZF90eXBlX3BhcmFtZXRlcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBFeHRlbmRpbmcgYSB0eXBlIHBhcmFtZXRlciBpcyBub3QgYWxsb3dlZC4KKworYWJzdHJhY3QgY2xhc3MgQTxUPiBleHRlbmRzIFQge30gLy8gLy8jIDAwOiBjb21waWxlLXRpbWUgZXJyb3IKK2NsYXNzIEE8VD4gZXh0ZW5kcyBUIHt9IC8vIC8vIyAwMTogY29tcGlsZS10aW1lIGVycm9yCisKK21haW4oKSB7CisgIEEgYSA9IG5ldyBBKCk7IC8vIC8vIyAwMDogY29tcGlsZS10aW1lIGVycm9yCisgIEEgYSA9IG5ldyBBKCk7IC8vIC8vIyAwMTogY29udGludWVkCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHRlbmRzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVuZHNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzFjMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHRlbmRzX3Rlc3QuZGFydApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgRXh0ZW5kc1Rlc3RNYWluOworCitpbXBvcnQgImV4dGVuZHNfdGVzdF9saWIuZGFydCI7CitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gUyBzaG91bGQgZXh0ZW5kIGNsYXNzIEEgZnJvbSBiZWxvdywgbm90IHRoZSBvbmUgaW1wb3J0ZWQKKy8vIGZyb20gdGhlIGxpYnJhcnkuCitjbGFzcyBTIGV4dGVuZHMgQSB7fQorCitjbGFzcyBBIHsKKyAgdmFyIHkgPSAiY2xhc3MgQSBmcm9tIG1haW4gc2NyaXB0IjsKK30KKworbWFpbigpIHsKKyAgdmFyIHMgPSBuZXcgUygpOworICBFeHBlY3QuZXF1YWxzKCJjbGFzcyBBIGZyb20gbWFpbiBzY3JpcHQiLCBzLnkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXh0ZW5kc190ZXN0X2xpYi5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXh0ZW5kc190ZXN0X2xpYi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmNhOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHRlbmRzX3Rlc3RfbGliLmRhcnQKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgRXh0ZW5kc1Rlc3RMaWI7CisKK2NsYXNzIEEgeworICB2YXIgeSA9ICJjbGFzcyBBIGZyb20gbGlicmFyeSI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHRlcm5hbF9ydW50aW1lX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVybmFsX3J1bnRpbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9leHRlcm5hbF9ydW50aW1lX3Rlc3QuZGFydApAQCAtMCwwICsxLDU0IEBACisvLyBUT0RPKG11bHRpdGVzdCk6IFRoaXMgd2FzIGF1dG9tYXRpY2FsbHkgbWlncmF0ZWQgZnJvbSBhIG11bHRpdGVzdCBhbmQgbWF5CisvLyBjb250YWluIHN0cmFuZ2Ugb3IgZGVhZCBjb2RlLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEJhciB7CisgIEJhcih2YWwpOworfQorCitjbGFzcyBGb28geworICB2YXIgeDsKKyAgZigpIHt9CisKKyAgRm9vKCkgOiB4ID0gMDsKKworICAvLyBmaWVsZHMgY2FuJ3QgYmUgZGVjbGFyZWQgZXh0ZXJuYWwKKworCisKKworCisKKworCisKKworCisKKworfQorCisKKworCittYWluKCkgeworICAvLyBFbnN1cmUgRm9vIGNsYXNzIGlzIGNvbXBpbGVkLgorICB2YXIgZm9vID0gbmV3IEZvbygpOworCisKKworCisKKworCisKKworCisKKworCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVybmFsX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dGVybmFsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAwOGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXh0ZXJuYWxfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2NsYXNzIEJhciB7CisgIEJhcih2YWwpOworfQorCitjbGFzcyBGb28geworLy8gICAgXgorLy8gW2NmZV0gVGhlIG5vbi1hYnN0cmFjdCBjbGFzcyAnRm9vJyBpcyBtaXNzaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlc2UgbWVtYmVyczoKKyAgdmFyIHggPSAtMTsKKyAgZigpIHt9CisKKyAgRm9vKCkgOiB4ID0gMDsKKworICAvLyBmaWVsZHMgY2FuJ3QgYmUgZGVjbGFyZWQgZXh0ZXJuYWwKKyAgZXh0ZXJuYWwgdmFyIHgwMTsKKy8vXl5eXl5eXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYVEVSTkFMX0ZJRUxECisgIGV4dGVybmFsIGludCB4MDI7CisvL15eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFRFUk5BTF9GSUVMRAorCisgIGV4dGVybmFsIGYxMSgpIHsgfQorICAvLyAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYVEVSTkFMX01FVEhPRF9XSVRIX0JPRFkKKyAgLy8gW2NmZV0gQW4gZXh0ZXJuYWwgb3IgbmF0aXZlIG1ldGhvZCBjYW4ndCBoYXZlIGEgYm9keS4KKyAgZXh0ZXJuYWwgZjEyKCkgPT4gMTsKKyAgLy8gICAgICAgICAgICAgXl4KKyAgLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhURVJOQUxfTUVUSE9EX1dJVEhfQk9EWQorICAvLyBbY2ZlXSBBbiBleHRlcm5hbCBvciBuYXRpdmUgbWV0aG9kIGNhbid0IGhhdmUgYSBib2R5LgorICAvLyAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIEFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuCisgIHN0YXRpYyBleHRlcm5hbCBmMTQoKTsKKyAgLy8gICAgIF5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1PRElGSUVSX09VVF9PRl9PUkRFUgorICAvLyBbY2ZlXSBUaGUgbW9kaWZpZXIgJ2V4dGVybmFsJyBzaG91bGQgYmUgYmVmb3JlIHRoZSBtb2RpZmllciAnc3RhdGljJy4KKyAgaW50IGV4dGVybmFsIGYxNigpOworICAvLyAgXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhQRUNURURfVE9LRU4KKyAgLy8gW2NmZV0gRXhwZWN0ZWQgJzsnIGFmdGVyIHRoaXMuCisgIC8vICAgICAgICAgICBeXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DT05DUkVURV9DTEFTU19XSVRIX0FCU1RSQUNUX01FTUJFUgorCisgIGV4dGVybmFsIEZvby5uMjEodmFsKSA6IHggPSAxOworICAvLyAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFRFUk5BTF9DT05TVFJVQ1RPUl9XSVRIX0lOSVRJQUxJWkVSCisgIC8vIFtjZmVdIEFuIGV4dGVybmFsIGNvbnN0cnVjdG9yIGNhbid0IGhhdmUgYW55IGluaXRpYWxpemVycy4KKyAgZXh0ZXJuYWwgRm9vLm4yMih2YWwpIHsgeCA9IDE7IH0KKyAgLy8gICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhURVJOQUxfTUVUSE9EX1dJVEhfQk9EWQorICAvLyBbY2ZlXSBBbiBleHRlcm5hbCBvciBuYXRpdmUgbWV0aG9kIGNhbid0IGhhdmUgYSBib2R5LgorICBleHRlcm5hbCBmYWN0b3J5IEZvby5uMjModmFsKSA9PiBuZXcgRm9vKCk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYVEVSTkFMX0ZBQ1RPUllfV0lUSF9CT0RZCisgIC8vIFtjZmVdIEV4dGVybmFsIGZhY3RvcmllcyBjYW4ndCBoYXZlIGEgYm9keS4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBBbiBleHRlcm5hbCBvciBuYXRpdmUgbWV0aG9kIGNhbid0IGhhdmUgYSBib2R5LgorICBleHRlcm5hbCBGb28ubjI0KHRoaXMueCk7CisgIC8vICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIEFuIGV4dGVybmFsIGNvbnN0cnVjdG9yIGNhbid0IGluaXRpYWxpemUgZmllbGRzLgorICBleHRlcm5hbCBmYWN0b3J5IEZvby5uMjUodmFsKSA9IEJhcjsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFRFUk5BTF9GQUNUT1JZX1JFRElSRUNUSU9OCisgIC8vIFtjZmVdIEEgcmVkaXJlY3RpbmcgZmFjdG9yeSBjYW4ndCBiZSBleHRlcm5hbC4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5SRURJUkVDVF9UT19JTlZBTElEX1JFVFVSTl9UWVBFCisgIC8vIFtjZmVdIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0eXBlICdCYXIgRnVuY3Rpb24oZHluYW1pYyknIGlzbid0IGEgc3VidHlwZSBvZiAnRm9vIEZ1bmN0aW9uKGR5bmFtaWMpJy4KK30KKworZXh0ZXJuYWwgaW50IHQwNihpbnQgaSkgeyByZXR1cm4gMTsgfQorLy8gW2Vycm9yIGxpbmUgNzgsIGNvbHVtbiAxLCBsZW5ndGggOF0KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYVEVSTkFMX01FVEhPRF9XSVRIX0JPRFkKKy8vIFtjZmVdIEFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuCisvLyAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBBbiBleHRlcm5hbCBvciBuYXRpdmUgbWV0aG9kIGNhbid0IGhhdmUgYSBib2R5LgorZXh0ZXJuYWwgaW50IHQwNyhpbnQgaSkgPT4gaSArIDE7CisvLyBbZXJyb3IgbGluZSA4NCwgY29sdW1uIDEsIGxlbmd0aCA4XQorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhURVJOQUxfTUVUSE9EX1dJVEhfQk9EWQorLy8gW2NmZV0gQW4gZXh0ZXJuYWwgb3IgbmF0aXZlIG1ldGhvZCBjYW4ndCBoYXZlIGEgYm9keS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIEFuIGV4dGVybmFsIG9yIG5hdGl2ZSBtZXRob2QgY2FuJ3QgaGF2ZSBhIGJvZHkuCisKK21haW4oKSB7CisgIC8vIEVuc3VyZSBGb28gY2xhc3MgaXMgY29tcGlsZWQuCisgIHZhciBmb28gPSBuZXcgRm9vKCk7CisKKyAgbmV3IEZvbygpLmYxMSgpOworICBuZXcgRm9vKCkuZjEyKCk7CisgIEZvby5mMTQoKTsKKyAgbmV3IEZvbygpLmYxNigpOworCisgIG5ldyBGb28ubjIxKDEpOworICBuZXcgRm9vLm4yMigxKTsKKyAgbmV3IEZvby5uMjMoMSk7CisgIG5ldyBGb28ubjI0KDEpOworICBuZXcgRm9vLm4yNSgxKTsKKworICB0MDYoMSk7CisgIHQwNygxKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dHJhY3RfdHlwZV9hcmd1bWVudHNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZXh0cmFjdF90eXBlX2FyZ3VtZW50c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5MzljNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2V4dHJhY3RfdHlwZV9hcmd1bWVudHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8vIFRlc3RzIHRoZSAocHJvYmFibHkgdGVtcG9yYXJ5KSBBUEkgZm9yIGV4dHJhY3RpbmcgcmVpZmllZCB0eXBlIGFyZ3VtZW50cworLy8vIGZyb20gYW4gb2JqZWN0LgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gSXQncyB3ZWlyZCB0aGF0IGEgbGFuZ3VhZ2UgdGVzdCBpcyB0ZXN0aW5nIGNvZGUgZGVmaW5lZCBpbiBhIHBhY2thZ2UuIFRoZQorLy8gcmF0aW9uYWxlIGZvciBwdXR0aW5nIHRoaXMgdGVzdCBoZXJlIGlzOgorLy8KKy8vICogVGhpcyBwYWNrYWdlIGlzIHNwZWNpYWwgYW5kICJidWlsdC1pbiIgdG8gRGFydCBpbiB0aGF0IHRoZSB2YXJpb3VzCisvLyAgIGNvbXBpbGVycyBnaXZlIGl0IHRoZSBzcGVjaWFsIHByaXZpbGVnZSBvZiBpbXBvcnRpbmcgImRhcnQ6X2ludGVybmFsIgorLy8gICB3aXRob3V0IGVycm9yLgorLy8KKy8vICogRXZlbnR1YWxseSwgdGhlIEFQSSBiZWluZyB0ZXN0ZWQgaGVyZSBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhbiBhY3R1YWwKKy8vICAgbGFuZ3VhZ2UgZmVhdHVyZSwgaW4gd2hpY2ggY2FzZSB0aGlzIHRlc3Qgd2lsbCBiZWNvbWUgYW4gYWN0dWFsIGxhbmd1YWdlCisvLyAgIHRlc3QuCisvLworLy8gKiBQbGFjaW5nIHRoZSB0ZXN0IGhlcmUgZW5zdXJlcyBpdCBpcyB0ZXN0ZWQgb24gYWxsIG9mIHRoZSB2YXJpb3VzIHBsYXRmb3JtcworLy8gICBhbmQgY29uZmlndXJhdGlvbnMgd2hlcmUgd2UgbmVlZCB0aGUgQVBJIHRvIHdvcmsuCitpbXBvcnQgInBhY2thZ2U6ZGFydF9pbnRlcm5hbC9leHRyYWN0X3R5cGVfYXJndW1lbnRzLmRhcnQiOworCittYWluKCkgeworICB0ZXN0RXh0cmFjdEl0ZXJhYmxlVHlwZUFyZ3VtZW50KCk7CisgIHRlc3RFeHRyYWN0TWFwVHlwZUFyZ3VtZW50cygpOworfQorCit0ZXN0RXh0cmFjdEl0ZXJhYmxlVHlwZUFyZ3VtZW50KCkgeworICBJdGVyYWJsZSBvYmplY3QgPSA8aW50PltdOworCisgIC8vIEludm9rZXMgZnVuY3Rpb24gd2l0aCBpdGVyYWJsZSdzIHR5cGUgYXJndW1lbnQuCisgIHZhciBjYWxsZWQgPSBmYWxzZTsKKyAgZXh0cmFjdEl0ZXJhYmxlVHlwZUFyZ3VtZW50KG9iamVjdCwgPFQ+KCkgeworICAgIEV4cGVjdC5lcXVhbHMoVCwgaW50KTsKKyAgICBjYWxsZWQgPSB0cnVlOworICB9KTsKKyAgRXhwZWN0LmlzVHJ1ZShjYWxsZWQpOworCisgIC8vIFJldHVybnMgcmVzdWx0IG9mIGZ1bmN0aW9uLgorICBPYmplY3QgcmVzdWx0ID0gZXh0cmFjdEl0ZXJhYmxlVHlwZUFyZ3VtZW50KG9iamVjdCwgPFQ+KCkgPT4gbmV3IFNldDxUPigpKTsKKyAgRXhwZWN0LmlzVHJ1ZShyZXN1bHQgaXMgU2V0PGludD4pOworICBFeHBlY3QuaXNGYWxzZShyZXN1bHQgaXMgU2V0PGJvb2w+KTsKKworICAvLyBBY2NlcHRzIHVzZXItZGVmaW5lZCBpbXBsZW1lbnRhdGlvbnMgb2YgSXRlcmFibGUuCisgIG9iamVjdCA9IG5ldyBDdXN0b21JdGVyYWJsZSgpOworICByZXN1bHQgPSBleHRyYWN0SXRlcmFibGVUeXBlQXJndW1lbnQob2JqZWN0LCA8VD4oKSA9PiBuZXcgU2V0PFQ+KCkpOworICBFeHBlY3QuaXNUcnVlKHJlc3VsdCBpcyBTZXQ8U3RyaW5nPik7CisgIEV4cGVjdC5pc0ZhbHNlKHJlc3VsdCBpcyBTZXQ8Ym9vbD4pOworfQorCit0ZXN0RXh0cmFjdE1hcFR5cGVBcmd1bWVudHMoKSB7CisgIE1hcCBvYmplY3QgPSA8U3RyaW5nLCBpbnQ+e307CisKKyAgLy8gSW52b2tlcyBmdW5jdGlvbiB3aXRoIG1hcCdzIHR5cGUgYXJndW1lbnRzLgorICB2YXIgY2FsbGVkID0gZmFsc2U7CisgIGV4dHJhY3RNYXBUeXBlQXJndW1lbnRzKG9iamVjdCwgPEssIFY+KCkgeworICAgIEV4cGVjdC5lcXVhbHMoSywgU3RyaW5nKTsKKyAgICBFeHBlY3QuZXF1YWxzKFYsIGludCk7CisgICAgY2FsbGVkID0gdHJ1ZTsKKyAgfSk7CisgIEV4cGVjdC5pc1RydWUoY2FsbGVkKTsKKworICAvLyBSZXR1cm5zIHJlc3VsdCBvZiBmdW5jdGlvbi4KKyAgT2JqZWN0IHJlc3VsdCA9IGV4dHJhY3RNYXBUeXBlQXJndW1lbnRzKG9iamVjdCwgPEssIFY+KCkgPT4gbmV3IFR3bzxLLCBWPigpKTsKKyAgRXhwZWN0LmlzVHJ1ZShyZXN1bHQgaXMgVHdvPFN0cmluZywgaW50Pik7CisgIEV4cGVjdC5pc0ZhbHNlKHJlc3VsdCBpcyBUd288aW50LCBTdHJpbmc+KTsKKworICAvLyBBY2NlcHRzIHVzZXItZGVmaW5lZCBpbXBsZW1lbnRhdGlvbnMgb2YgTWFwLgorICBvYmplY3QgPSBuZXcgQ3VzdG9tTWFwKCk7CisgIHJlc3VsdCA9IGV4dHJhY3RNYXBUeXBlQXJndW1lbnRzKG9iamVjdCwgPEssIFY+KCkgPT4gbmV3IFR3bzxLLCBWPigpKTsKKyAgRXhwZWN0LmlzVHJ1ZShyZXN1bHQgaXMgVHdvPGludCwgYm9vbD4pOworICBFeHBlY3QuaXNGYWxzZShyZXN1bHQgaXMgVHdvPGJvb2wsIGludD4pOworCisgIC8vIFVzZXMgdGhlIHR5cGUgcGFyYW1ldGVyIG9yZGVyIG9mIE1hcCwgbm90IGFueSBvdGhlciB0eXBlIGluIHRoZSBoaWVyYXJjaHkuCisgIG9iamVjdCA9IG5ldyBGbGlwcGVkTWFwPGRvdWJsZSwgTnVsbD4oKTsKKyAgcmVzdWx0ID0gZXh0cmFjdE1hcFR5cGVBcmd1bWVudHMob2JqZWN0LCA8SywgVj4oKSA9PiBuZXcgVHdvPEssIFY+KCkpOworICAvLyBPcmRlciBpcyByZXZlcnNlZCBoZXJlOgorICBFeHBlY3QuaXNUcnVlKHJlc3VsdCBpcyBUd288TnVsbCwgZG91YmxlPik7CisgIEV4cGVjdC5pc0ZhbHNlKHJlc3VsdCBpcyBUd288ZG91YmxlLCBOdWxsPik7Cit9CisKK2NsYXNzIFR3bzxBLCBCPiB7fQorCitjbGFzcyBDdXN0b21JdGVyYWJsZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPFN0cmluZz4geworICBub1N1Y2hNZXRob2QoaSkgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworfQorCitjbGFzcyBDdXN0b21NYXAgaW1wbGVtZW50cyBNYXA8aW50LCBib29sPiB7CisgIG5vU3VjaE1ldGhvZChpKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CisKKy8vIE5vdGU6IEZsaXBzIG9yZGVyIG9mIHR5cGUgcGFyYW1ldGVycy4KK2NsYXNzIEZsaXBwZWRNYXA8ViwgSz4gaW1wbGVtZW50cyBNYXA8SywgVj4geworICBub1N1Y2hNZXRob2QoaSkgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmFubmt1Y2hfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmFubmt1Y2hfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWE4OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9mYW5ua3VjaF90ZXN0LmRhcnQKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGhlIENvbXB1dGVyIExhbmd1YWdlIEJlbmNobWFya3MgR2FtZQorLy8gaHR0cHM6Ly9iZW5jaG1hcmtzZ2FtZS10ZWFtLnBhZ2VzLmRlYmlhbi5uZXQvYmVuY2htYXJrc2dhbWUvCisvLyBQb3J0ZWQgZnJvbSBKYXZhU2NyaXB0IGNvbnRyaWJ1dGVkIGJ5IElzYWFjIEdvdXkuCisvLyBEZXNjcmlwdGlvbjogUmVwZWF0ZWRseSBhY2Nlc3MgYSB0aW55IGludGVnZXItc2VxdWVuY2UuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBGYW5ua3VjaFRlc3QgeworICBzdGF0aWMgZmFubmt1Y2gobikgeworICAgIHZhciBwID0gTGlzdC5maWxsZWQobiwgMCksIHEgPSBMaXN0LmZpbGxlZChuLCAwKSwgcyA9IExpc3QuZmlsbGVkKG4sIDApOworICAgIHZhciBzaWduID0gMSwgbWF4ZmxpcHMgPSAwLCBzdW0gPSAwLCBtID0gbiAtIDE7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIHBbaV0gPSBpOworICAgICAgcVtpXSA9IGk7CisgICAgICBzW2ldID0gaTsKKyAgICB9CisgICAgZG8geworICAgICAgLy8gQ29weSBhbmQgZmxpcC4KKyAgICAgIHZhciBxMCA9IHBbMF07IC8vIENhY2hlIDB0aCBlbGVtZW50LgorICAgICAgaWYgKHEwICE9IDApIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuOyBpKyspIHFbaV0gPSBwW2ldOyAvLyBXb3JrIG9uIGEgY29weS4KKyAgICAgICAgdmFyIGZsaXBzID0gMTsKKyAgICAgICAgZG8geworICAgICAgICAgIHZhciBxcSA9IHFbcTBdOworICAgICAgICAgIGlmIChxcSA9PSAwKSB7CisgICAgICAgICAgICAvLyAuLi4gdW50aWwgMHRoIGVsZW1lbnQgaXMgMC4KKyAgICAgICAgICAgIHN1bSArPSBzaWduICogZmxpcHM7CisgICAgICAgICAgICBpZiAoZmxpcHMgPiBtYXhmbGlwcykgbWF4ZmxpcHMgPSBmbGlwczsgLy8gTmV3IG1heGltdW0/CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcVtxMF0gPSBxMDsKKyAgICAgICAgICBpZiAocTAgPj0gMykgeworICAgICAgICAgICAgdmFyIGkgPSAxLCBqID0gcTAgLSAxLCB0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICB0ID0gcVtpXTsKKyAgICAgICAgICAgICAgcVtpXSA9IHFbal07CisgICAgICAgICAgICAgIHFbal0gPSB0OworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBqKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcTAgPSBxcTsKKyAgICAgICAgICBmbGlwcysrOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChzaWduID09IDEpIHsKKyAgICAgICAgdmFyIHQgPSBwWzFdOworICAgICAgICBwWzFdID0gcFswXTsKKyAgICAgICAgcFswXSA9IHQ7CisgICAgICAgIHNpZ24gPSAtMTsgLy8gUm90YXRlIDA8LTEuCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBSb3RhdGUgMDwtMSBhbmQgMDwtMTwtMi4KKyAgICAgICAgdmFyIHQgPSBwWzFdOworICAgICAgICBwWzFdID0gcFsyXTsKKyAgICAgICAgcFsyXSA9IHQ7CisgICAgICAgIHNpZ24gPSAxOworICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IG47IGkrKykgeworICAgICAgICAgIHZhciBzeCA9IHNbaV07CisgICAgICAgICAgaWYgKHN4ICE9IDApIHsKKyAgICAgICAgICAgIHNbaV0gPSBzeCAtIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGkgPT0gbSkgeworICAgICAgICAgICAgcmV0dXJuIFtzdW0sIG1heGZsaXBzXTsKKyAgICAgICAgICB9CisgICAgICAgICAgc1tpXSA9IGk7CisgICAgICAgICAgLy8gUm90YXRlIDA8LS4uLjwtaSsxLgorICAgICAgICAgIHQgPSBwWzBdOworICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykgeworICAgICAgICAgICAgcFtqXSA9IHBbaiArIDFdOworICAgICAgICAgIH0KKyAgICAgICAgICBwW2kgKyAxXSA9IHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlICh0cnVlKTsKKyAgfQorCisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICB2YXIgbiA9IDY7CisgICAgdmFyIHBmID0gZmFubmt1Y2gobik7CisgICAgRXhwZWN0LmVxdWFscyg0OSwgcGZbMF0pOworICAgIEV4cGVjdC5lcXVhbHMoMTAsIHBmWzFdKTsKKyAgICBwcmludCgiJHtwZlswXX1cblBmYW5ua3VjaGVuKCRuKSA9ICR7cGZbMV19Iik7CisgIH0KK30KKworbWFpbigpIHsKKyAgRmFubmt1Y2hUZXN0LnRlc3RNYWluKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9mYXN0X21ldGhvZF9leHRyYWN0aW9uX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Zhc3RfbWV0aG9kX2V4dHJhY3Rpb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjIwZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9mYXN0X21ldGhvZF9leHRyYWN0aW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCB0aGF0IGZhc3QgbWV0aG9kIGV4dHJhY3Rpb24gcmV0dXJucyBjb3JyZWN0IGNsb3N1cmUuCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1uby11c2Utb3NyCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBBIHsKKyAgdmFyIGY7CisgIEEodGhpcy5mKTsKKyAgZm9vKCkgPT4gNDAgKyBmOworfQorCitjbGFzcyBCIHsKKyAgdmFyIGY7CisgIEIodGhpcy5mKTsKKyAgZm9vKCkgPT4gLTQwIC0gZjsKK30KKworY2xhc3MgWCB7fQorCitjbGFzcyBDPFQ+IHsKKyAgZm9vKHYpID0+IHYgaXMgVDsKK30KKworY2xhc3MgQ2hhQSB7CisgIGZpbmFsIG1hZ2ljOworICBDaGFBKG1hZ2ljKSA6IHRoaXMubWFnaWMgPSBtYWdpYzsKKworICBmb28oKSB7CisgICAgRXhwZWN0LmlzVHJ1ZSh0aGlzIGlzIENoYUEpOworICAgIEV4cGVjdC5lcXVhbHMoIm1hZ2ljQSIsIG1hZ2ljKTsKKyAgICByZXR1cm4gIkEiOworICB9CisKKyAgYmFyKCkgPT4gZm9vOworfQorCitjbGFzcyBDaGFCIGV4dGVuZHMgQ2hhQSB7CisgIENoYUIobWFnaWMpIDogc3VwZXIobWFnaWMpOworCisgIGZvbygpIHsKKyAgICBFeHBlY3QuaXNUcnVlKHRoaXMgaXMgQ2hhQik7CisgICAgRXhwZWN0LmVxdWFscygibWFnaWNCIiwgbWFnaWMpOworICAgIHJldHVybiAiQiI7CisgIH0KK30KKworbW9ubyhhKSB7CisgIHZhciBmID0gYS5mb287CisgIHJldHVybiBmKCk7Cit9CisKK3BvbHkoYSkgeworICB2YXIgZiA9IGEuZm9vOworICByZXR1cm4gZigpOworfQorCit0eXBlcyhhLCBiKSB7CisgIHZhciBmID0gYS5mb287CisgIEV4cGVjdC5pc1RydWUoZihiKSk7Cit9CisKK2NoYShhKSB7CisgIHZhciBmID0gYS5iYXIoKTsKKyAgcmV0dXJuIGYoKTsKK30KKworZXh0cmFjdEZyb21OdWxsKCkgeworICB2YXIgZiA9IChudWxsKS50b1N0cmluZzsKKyAgRXhwZWN0LmVxdWFscygibnVsbCIsIGYoKSk7Cit9CisKK21haW4oKSB7CisgIHZhciBhID0gbmV3IEEoMik7CisgIHZhciBiID0gbmV3IEIoMik7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoNDIsIG1vbm8oYSkpOworICB9CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscyg0MiwgcG9seShhKSk7CisgICAgRXhwZWN0LmVxdWFscygtNDIsIHBvbHkoYikpOworICB9CisKKyAgdmFyIGMgPSBuZXcgQzxYPigpOworICB2YXIgeCA9IG5ldyBYKCk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIHR5cGVzKGMsIHgpOworICB9CisKKyAgdmFyIGNoYUEgPSBuZXcgQ2hhQSgibWFnaWNBIik7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoIkEiLCBjaGEoY2hhQSkpOworICB9CisKKyAgdmFyIGNoYUIgPSBuZXcgQ2hhQigibWFnaWNCIik7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoIkIiLCBjaGEoY2hhQikpOworICB9CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgZXh0cmFjdEZyb21OdWxsKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZhdXh2ZXJyaWRlX3J1bnRpbWVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmF1eHZlcnJpZGVfcnVudGltZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhZTExYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZhdXh2ZXJyaWRlX3J1bnRpbWVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAyIEBACisvLyBUT0RPKG11bHRpdGVzdCk6IFRoaXMgd2FzIGF1dG9tYXRpY2FsbHkgbWlncmF0ZWQgZnJvbSBhIG11bHRpdGVzdCBhbmQgbWF5CisvLyBjb250YWluIHN0cmFuZ2Ugb3IgZGVhZCBjb2RlLgorCisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0IHRoZSBzZW1hbnRpY3Mgb2Ygc3RhdGljIG1lbWJlcnMgbWl4ZWQgd2l0aCBpbnN0YW5jZSBtZW1iZXJzLgorCisvLyBGb2xsb3dpbmcgYXJlIHJlbGV2YW50IHF1b3RlcyBmcm9tIERhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UKKy8vIFNwZWNpZmljYXRpb24sIERyYWZ0IFZlcnNpb24gMC4xMCwgSnVuZSA3LCAyMDEyLgorCisvLyA3IENsYXNzZXM6CisKKy8vICJJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGNsYXNzIGhhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIGEKKy8vIHN0YXRpYyBtZW1iZXIgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZS4iCisKKy8vIDcuMSBJbnN0YW5jZSBNZXRob2RzOgorCisvLyAiSW5zdGFuY2UgbWV0aG9kcyBhcmUgZnVuY3Rpb25zICg2KSB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlCisvLyBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIG5vdAorLy8gZGVjbGFyZWQgc3RhdGljLiBUaGUgaW5zdGFuY2UgbWV0aG9kcyBvZiBhIGNsYXNzIEMgYXJlIHRob3NlCisvLyBpbnN0YW5jZSBtZXRob2RzIGRlY2xhcmVkIGJ5IEMgYW5kIHRoZSBpbnN0YW5jZSBtZXRob2RzIGluaGVyaXRlZAorLy8gYnkgQyBmcm9tIGl0cyBzdXBlcmNsYXNzLiIKKworLy8gNy42IFN0YXRpYyBNZXRob2RzCisKKy8vICJTdGF0aWMgbWV0aG9kcyBhcmUgZnVuY3Rpb25zIHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkKKy8vIGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgZGVjbGFyZWQKKy8vIHN0YXRpYy4gVGhlIHN0YXRpYyBtZXRob2RzIG9mIGEgY2xhc3MgQyBhcmUgdGhvc2Ugc3RhdGljIG1ldGhvZHMKKy8vIGRlY2xhcmVkIGJ5IEMuIgorCisvLyA3LjcgU3RhdGljIFZhcmlhYmxlcworCisvLyAiU3RhdGljIHZhcmlhYmxlcyBhcmUgdmFyaWFibGVzIHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkKKy8vIGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgZGVjbGFyZWQKKy8vIHN0YXRpYy4gVGhlIHN0YXRpYyB2YXJpYWJsZXMgb2YgYSBjbGFzcyBDIGFyZSB0aG9zZSBzdGF0aWMKKy8vIHZhcmlhYmxlcyBkZWNsYXJlZCBieSBDLiIKKworLy8gIkEgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgc3RhdGljIFQgdjssCisvLyBzdGF0aWMgVCB2ID0gZTsgLCBzdGF0aWMgY29uc3QgVCB2ID0gZTsgb3Igc3RhdGljIGZpbmFsIFQgdiA9IGU7CisvLyBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBzdGF0aWMgZ2V0dGVyIGZ1bmN0aW9uICg3LjIpIHdpdGgKKy8vIHNpZ25hdHVyZSBzdGF0aWMgVCBnZXQgdiB3aG9zZSBpbnZvY2F0aW9uIGV2YWx1YXRlcyBhcyBkZXNjcmliZWQKKy8vIGJlbG93ICg3LjcuMSkuIgorCittKCkgPT4gJ3RvcCBsZXZlbCc7CisKK2NsYXNzIFN1cGVyIHsKKyAgLy8gTm8gZXJyb3IgZnJvbSBoaWRpbmcuCisgIHN0YXRpYyBtKCkgPT4gJ3N1cGVyJzsKKworICBzdGF0aWMgdmFyIGkgPSAnc3VwZXInOworCisgIHN0YXRpYyB2YXIgaTIgPSAnc3VwZXInOworCisgIGluc3RhbmNlTWV0aG9kKCkgPT4gbSgpOworCisgIGluc3RhbmNlTWV0aG9kMigpID0+IG0oKTsKK30KKworY2xhc3MgU3ViIGV4dGVuZHMgU3VwZXIgeworICAvLyBBY2NvcmRpbmcgdG8gNy42LCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluaGVyaXRlZC4KKyAgc3RhdGljIG0oKSA9PiAnc3ViJzsKKworICAvLyBBY2NvcmRpbmcgdG8gNy43LCBzdGF0aWMgdmFyaWFibGVzIGFyZSBub3QgaW5oZXJpdGVkLgorICBzdGF0aWMgdmFyIGkgPSAnc3ViJzsKKworICAvLyBBY2NvcmRpbmcgdG8gNy4xLCBpbnN0YW5jZSBtZXRob2RzIGluY2x1ZGUgdGhvc2Ugb2YgdGhlCisgIC8vIHN1cGVyY2xhc3MsIGFuZCBhY2NvcmRpbmcgdG8gNywgaXQgaXMgYSBjb21waWxlLXRpbWUgdG8gaGF2ZSBhbgorICAvLyBpbnN0YW5jZSBtZXRob2QgYW5kIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLgorCisgIGluc3RhbmNlTWV0aG9kKCkgPT4gbSgpOworCisgIC8vIEFjY29yZGluZyB0byA3LjcsIHN0YXRpYyB2YXJpYWJsZXMgYXJlIG5vdCBpbmhlcml0ZWQuCisgIHN0YXRpYyBpMigpID0+IG0oKTsKKworICAvLyBBY2NvcmRpbmcgdG8gNy4xLCBpbnN0YW5jZSBtZXRob2RzIGluY2x1ZGUgdGhvc2Ugb2YgdGhlCisgIC8vIHN1cGVyY2xhc3MsIGFuZCBhY2NvcmRpbmcgdG8gNywgaXQgaXMgYSBjb21waWxlLXRpbWUgdG8gaGF2ZSBhbgorICAvLyBpbnN0YW5jZSBtZXRob2QgYW5kIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc2FtZQorICAvLyBuYW1lLiBGdXJ0aGVybW9yZSwgYWNjb3JkaW5nIHRvIDcuNyBhIHN0YXRpYyB2YXJpYWJsZSBpbmR1Y2VzIGFuCisgIC8vIGltcGxpY2l0IGdldHRlciBmdW5jdGlvbiAoYSBzdGF0aWMgbWV0aG9kKS4KKworCisgIGZvbygpID0+ICdmb28nOworfQorCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKCdmb28nLCBuZXcgU3ViKCkuZm9vKCkpOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwnLCBtKCkpOworICBFeHBlY3QuZXF1YWxzKCdzdXBlcicsIFN1cGVyLm0oKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1YicsIFN1Yi5tKCkpOworICBFeHBlY3QuZXF1YWxzKCdzdXBlcicsIFN1cGVyLmkpOworICBFeHBlY3QuZXF1YWxzKCdzdWInLCBTdWIuaSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgU3VwZXIuaTIpOworICBFeHBlY3QuZXF1YWxzKCdzdWInLCBTdWIuaTIoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgbmV3IFN1cGVyKCkuaW5zdGFuY2VNZXRob2QoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1YicsIG5ldyBTdWIoKS5pbnN0YW5jZU1ldGhvZCgpKTsKKyAgRXhwZWN0LmVxdWFscygnc3VwZXInLCBuZXcgU3VwZXIoKS5pbnN0YW5jZU1ldGhvZDIoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgbmV3IFN1YigpLmluc3RhbmNlTWV0aG9kMigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZhdXh2ZXJyaWRlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZhdXh2ZXJyaWRlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWZjNmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmF1eHZlcnJpZGVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0IHRoZSBzZW1hbnRpY3Mgb2Ygc3RhdGljIG1lbWJlcnMgbWl4ZWQgd2l0aCBpbnN0YW5jZSBtZW1iZXJzLgorCisvLyBGb2xsb3dpbmcgYXJlIHJlbGV2YW50IHF1b3RlcyBmcm9tIERhcnQgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UKKy8vIFNwZWNpZmljYXRpb24sIERyYWZ0IFZlcnNpb24gMC4xMCwgSnVuZSA3LCAyMDEyLgorCisvLyA3IENsYXNzZXM6CisKKy8vICJJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGNsYXNzIGhhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIGEKKy8vIHN0YXRpYyBtZW1iZXIgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZS4iCisKKy8vIDcuMSBJbnN0YW5jZSBNZXRob2RzOgorCisvLyAiSW5zdGFuY2UgbWV0aG9kcyBhcmUgZnVuY3Rpb25zICg2KSB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlCisvLyBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGEgY2xhc3MgZGVjbGFyYXRpb24gYW5kIHRoYXQgYXJlIG5vdAorLy8gZGVjbGFyZWQgc3RhdGljLiBUaGUgaW5zdGFuY2UgbWV0aG9kcyBvZiBhIGNsYXNzIEMgYXJlIHRob3NlCisvLyBpbnN0YW5jZSBtZXRob2RzIGRlY2xhcmVkIGJ5IEMgYW5kIHRoZSBpbnN0YW5jZSBtZXRob2RzIGluaGVyaXRlZAorLy8gYnkgQyBmcm9tIGl0cyBzdXBlcmNsYXNzLiIKKworLy8gNy42IFN0YXRpYyBNZXRob2RzCisKKy8vICJTdGF0aWMgbWV0aG9kcyBhcmUgZnVuY3Rpb25zIHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkKKy8vIGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgZGVjbGFyZWQKKy8vIHN0YXRpYy4gVGhlIHN0YXRpYyBtZXRob2RzIG9mIGEgY2xhc3MgQyBhcmUgdGhvc2Ugc3RhdGljIG1ldGhvZHMKKy8vIGRlY2xhcmVkIGJ5IEMuIgorCisvLyA3LjcgU3RhdGljIFZhcmlhYmxlcworCisvLyAiU3RhdGljIHZhcmlhYmxlcyBhcmUgdmFyaWFibGVzIHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgaW1tZWRpYXRlbHkKKy8vIGNvbnRhaW5lZCB3aXRoaW4gYSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgdGhhdCBhcmUgZGVjbGFyZWQKKy8vIHN0YXRpYy4gVGhlIHN0YXRpYyB2YXJpYWJsZXMgb2YgYSBjbGFzcyBDIGFyZSB0aG9zZSBzdGF0aWMKKy8vIHZhcmlhYmxlcyBkZWNsYXJlZCBieSBDLiIKKworLy8gIkEgc3RhdGljIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9mIG9uZSBvZiB0aGUgZm9ybXMgc3RhdGljIFQgdjssCisvLyBzdGF0aWMgVCB2ID0gZTsgLCBzdGF0aWMgY29uc3QgVCB2ID0gZTsgb3Igc3RhdGljIGZpbmFsIFQgdiA9IGU7CisvLyBhbHdheXMgaW5kdWNlcyBhbiBpbXBsaWNpdCBzdGF0aWMgZ2V0dGVyIGZ1bmN0aW9uICg3LjIpIHdpdGgKKy8vIHNpZ25hdHVyZSBzdGF0aWMgVCBnZXQgdiB3aG9zZSBpbnZvY2F0aW9uIGV2YWx1YXRlcyBhcyBkZXNjcmliZWQKKy8vIGJlbG93ICg3LjcuMSkuIgorCittKCkgPT4gJ3RvcCBsZXZlbCc7CisKK2NsYXNzIFN1cGVyIHsKKyAgLy8gTm8gZXJyb3IgZnJvbSBoaWRpbmcuCisgIHN0YXRpYyBtKCkgPT4gJ3N1cGVyJzsKKworICBzdGF0aWMgdmFyIGkgPSAnc3VwZXInOworCisgIHN0YXRpYyB2YXIgaTIgPSAnc3VwZXInOworCisgIGluc3RhbmNlTWV0aG9kKCkgPT4gbSgpOworCisgIGluc3RhbmNlTWV0aG9kMigpID0+IG0oKTsKK30KKworY2xhc3MgU3ViIGV4dGVuZHMgU3VwZXIgeworICAvLyBBY2NvcmRpbmcgdG8gNy42LCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluaGVyaXRlZC4KKyAgc3RhdGljIG0oKSA9PiAnc3ViJzsKKworICAvLyBBY2NvcmRpbmcgdG8gNy43LCBzdGF0aWMgdmFyaWFibGVzIGFyZSBub3QgaW5oZXJpdGVkLgorICBzdGF0aWMgdmFyIGkgPSAnc3ViJzsKKworICAvLyBBY2NvcmRpbmcgdG8gNy4xLCBpbnN0YW5jZSBtZXRob2RzIGluY2x1ZGUgdGhvc2Ugb2YgdGhlCisgIC8vIHN1cGVyY2xhc3MsIGFuZCBhY2NvcmRpbmcgdG8gNywgaXQgaXMgYSBjb21waWxlLXRpbWUgdG8gaGF2ZSBhbgorICAvLyBpbnN0YW5jZSBtZXRob2QgYW5kIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLgorICBzdGF0aWMKKyAgaW5zdGFuY2VNZXRob2QoKSA9PiBtKCk7CisvL15eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05GTElDVElOR19TVEFUSUNfQU5EX0lOU1RBTkNFCisvLyBbY2ZlXSBDYW4ndCBkZWNsYXJlIGEgbWVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW4gaW5oZXJpdGVkIG9uZS4KKworICAvLyBBY2NvcmRpbmcgdG8gNy43LCBzdGF0aWMgdmFyaWFibGVzIGFyZSBub3QgaW5oZXJpdGVkLgorICBzdGF0aWMgaTIoKSA9PiBtKCk7CisKKyAgLy8gQWNjb3JkaW5nIHRvIDcuMSwgaW5zdGFuY2UgbWV0aG9kcyBpbmNsdWRlIHRob3NlIG9mIHRoZQorICAvLyBzdXBlcmNsYXNzLCBhbmQgYWNjb3JkaW5nIHRvIDcsIGl0IGlzIGEgY29tcGlsZS10aW1lIHRvIGhhdmUgYW4KKyAgLy8gaW5zdGFuY2UgbWV0aG9kIGFuZCBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgLy8gbmFtZS4gRnVydGhlcm1vcmUsIGFjY29yZGluZyB0byA3LjcgYSBzdGF0aWMgdmFyaWFibGUgaW5kdWNlcyBhbgorICAvLyBpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24gKGEgc3RhdGljIG1ldGhvZCkuCisgIHN0YXRpYyB2YXIgaW5zdGFuY2VNZXRob2QyOworICAvLyAgICAgICAgIF5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05GTElDVElOR19TVEFUSUNfQU5EX0lOU1RBTkNFCisgIC8vIFtjZmVdIENhbid0IGRlY2xhcmUgYSBtZW1iZXIgdGhhdCBjb25mbGljdHMgd2l0aCBhbiBpbmhlcml0ZWQgb25lLgorCisgIGZvbygpID0+ICdmb28nOworfQorCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKCdmb28nLCBuZXcgU3ViKCkuZm9vKCkpOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwnLCBtKCkpOworICBFeHBlY3QuZXF1YWxzKCdzdXBlcicsIFN1cGVyLm0oKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1YicsIFN1Yi5tKCkpOworICBFeHBlY3QuZXF1YWxzKCdzdXBlcicsIFN1cGVyLmkpOworICBFeHBlY3QuZXF1YWxzKCdzdWInLCBTdWIuaSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgU3VwZXIuaTIpOworICBFeHBlY3QuZXF1YWxzKCdzdWInLCBTdWIuaTIoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgbmV3IFN1cGVyKCkuaW5zdGFuY2VNZXRob2QoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1YicsIG5ldyBTdWIoKS5pbnN0YW5jZU1ldGhvZCgpKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gVGhlIG1ldGhvZCAnaW5zdGFuY2VNZXRob2QnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnU3ViJy4KKyAgRXhwZWN0LmVxdWFscygnc3VwZXInLCBuZXcgU3VwZXIoKS5pbnN0YW5jZU1ldGhvZDIoKSk7CisgIEV4cGVjdC5lcXVhbHMoJ3N1cGVyJywgbmV3IFN1YigpLmluc3RhbmNlTWV0aG9kMigpKTsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUaGUgbWV0aG9kICdpbnN0YW5jZU1ldGhvZDInIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnU3ViJy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpYm9fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmlib190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmMTNiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpYm9fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGNhbGN1bGF0aW5nIHRoZSBGaWJvbmFjY2kgc2VxdWVuY2UuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBIZWxwZXIgeworICBzdGF0aWMgaW50IGZpYm9uYWNjaShpbnQgbikgeworICAgIGludCBhID0gMCwgYiA9IDEsIGkgPSAwOworICAgIHdoaWxlIChpKysgPCBuKSB7CisgICAgICBhID0gYSArIGI7CisgICAgICBiID0gYSAtIGI7CisgICAgfQorICAgIHJldHVybiBhOworICB9Cit9CisKK2NsYXNzIEZpYm9UZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIEV4cGVjdC5lcXVhbHMoMCwgSGVscGVyLmZpYm9uYWNjaSgwKSk7CisgICAgRXhwZWN0LmVxdWFscygxLCBIZWxwZXIuZmlib25hY2NpKDEpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDEsIEhlbHBlci5maWJvbmFjY2koMikpOworICAgIEV4cGVjdC5lcXVhbHMoMiwgSGVscGVyLmZpYm9uYWNjaSgzKSk7CisgICAgRXhwZWN0LmVxdWFscygzLCBIZWxwZXIuZmlib25hY2NpKDQpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDUsIEhlbHBlci5maWJvbmFjY2koNSkpOworICAgIEV4cGVjdC5lcXVhbHMoMTAyMzM0MTU1LCBIZWxwZXIuZmlib25hY2NpKDQwKSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgRmlib1Rlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpcnN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpcnN0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODNkZDJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmlyc3RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIEZpcnN0IGRhcnQgdGVzdCBwcm9ncmFtLgorCitjbGFzcyBGaXJzdFRlc3QgeworICBzdGF0aWMgdGVzdE1haW4oKSB7CisgICAgcmV0dXJuIDQyOworICB9Cit9CisKK21haW4oKSB7CisgIEZpcnN0VGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZml4ZWRfbGVuZ3RoX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpeGVkX2xlbmd0aF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0ZWIxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZpeGVkX2xlbmd0aF90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhcnQvaXNzdWVzL2RldGFpbD9pZD03OTk0LgorCit2b2lkIG1haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoLTEsIGZvbygpKTsKK30KKworaW50IGZvbygpIHsKKyAgdmFyIGxpc3QgPSBMaXN0PGludD4uZmlsbGVkKDEwMjQsIDApOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgbGlzdFtpXSA9IC1pOworCisgIGZvciAoaW50IG4gPSBsaXN0Lmxlbmd0aDsgbiA+IDE7IG4tLSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgeworICAgICAgaWYgKGxpc3RbaV0gPiBsaXN0W2kgKyAxXSkgeworICAgICAgICByZXR1cm4gbGlzdFtpICsgMV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGhyb3cgInVucmVhY2hhYmxlIjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZsYXR0ZW5fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZmxhdHRlbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmMTNlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZsYXR0ZW5fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworY2xhc3MgRGVyaXZlZDxUPiBpbXBsZW1lbnRzIEZ1dHVyZTxUPiB7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworY2xhc3MgRml4ZWRQb2ludDxUPiBpbXBsZW1lbnRzIEZ1dHVyZTxGaXhlZFBvaW50PFQ+PiB7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworY2xhc3MgRGl2ZXJnZW50PFQ+IGltcGxlbWVudHMgRnV0dXJlPERpdmVyZ2VudDxEaXZlcmdlbnQ8VD4+PiB7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKwordGVzdCgpIGFzeW5jIHsKKyAgLy8gZmxhdHRlbihEZXJpdmVkPGludD4pID0gaW50CisgIGludCB4ID0gYXdhaXQgbmV3IERlcml2ZWQ8aW50PigpOyAvLyMgMDE6IHJ1bnRpbWUgZXJyb3IKKyAgRnV0dXJlPGludD4gZigpIGFzeW5jID0+IG5ldyBEZXJpdmVkPGludD4oKTsgLy8jIDAyOiBvaworICBGdXR1cmU8aW50PiBmKCkgYXN5bmMgeyByZXR1cm4gbmV3IERlcml2ZWQ8aW50PigpOyB9IC8vIyAwMzogb2sKKyAgRnV0dXJlPGludD4geCA9ICgoKSBhc3luYyA9PiBuZXcgRGVyaXZlZDxpbnQ+KCkpKCk7IC8vIyAwNDogcnVudGltZSBlcnJvcgorCisgIC8vIGZsYXR0ZW4oRml4ZWRQb2ludDxpbnQ+KSA9IEZpeGVkUG9pbnQ8aW50PgorICBGaXhlZFBvaW50PGludD4geCA9IGF3YWl0IG5ldyBGaXhlZFBvaW50PGludD4oKTsgLy8jIDA1OiBydW50aW1lIGVycm9yCisgIEZ1dHVyZTxGaXhlZFBvaW50PGludD4+IGYoKSBhc3luYyA9PiBuZXcgRml4ZWRQb2ludDxpbnQ+KCk7IC8vIyAwNjogb2sKKyAgRnV0dXJlPEZpeGVkUG9pbnQ8aW50Pj4gZigpIGFzeW5jIHsgcmV0dXJuIG5ldyBGaXhlZFBvaW50PGludD4oKTsgfSAvLyMgMDc6IG9rCisgIEZ1dHVyZTxGaXhlZFBvaW50PGludD4+IHggPSAoKCkgYXN5bmMgPT4gbmV3IEZpeGVkUG9pbnQ8aW50PigpKSgpOyAvLyMgMDg6IHJ1bnRpbWUgZXJyb3IKKworICAvLyBmbGF0dGVuKERpdmVyZ2VudDxpbnQ+KSA9IERpdmVyZ2VudDxEaXZlcmdlbnQ8aW50Pj4KKyAgRGl2ZXJnZW50PERpdmVyZ2VudDxpbnQ+PiB4ID0gYXdhaXQgbmV3IERpdmVyZ2VudDxpbnQ+KCk7IC8vIyAwOTogcnVudGltZSBlcnJvcgorICBGdXR1cmU8RGl2ZXJnZW50PERpdmVyZ2VudDxpbnQ+Pj4gZigpIGFzeW5jID0+IG5ldyBEaXZlcmdlbnQ8aW50PigpOyAvLyMgMTA6IG9rCisgIEZ1dHVyZTxEaXZlcmdlbnQ8RGl2ZXJnZW50PGludD4+PiBmKCkgYXN5bmMgeyByZXR1cm4gbmV3IERpdmVyZ2VudDxpbnQ+KCk7IH0gLy8jIDExOiBvaworICBGdXR1cmU8RGl2ZXJnZW50PERpdmVyZ2VudDxpbnQ+Pj4geCA9ICgoKSBhc3luYyA9PiBuZXcgRGl2ZXJnZW50PGludD4oKSkoKTsgLy8jIDEyOiBydW50aW1lIGVycm9yCit9CisKK21haW4oKSB7CisgIHRlc3QoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZvcndhcmRpbmdfc2VtaV9zdHViX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ZvcndhcmRpbmdfc2VtaV9zdHViX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRiNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZm9yd2FyZGluZ19zZW1pX3N0dWJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEIgeworICB2b2lkIGYobnVtIHgpIHt9Cit9CisKK2Fic3RyYWN0IGNsYXNzIEk8VD4geworICB2b2lkIGYoVCB4KTsKK30KKworY2xhc3MgQyBleHRlbmRzIEIgaW1wbGVtZW50cyBJPG51bT4geworICAvLyBUaGlzIG1ldGhvZCBpcyBhICJmb3J3YXJkaW5nIHNlbWktc3R1YiItLXRoZSBmcm9udCBlbmQgbmVlZHMgdG8gYWRkIGFuCisgIC8vIGltcGxlbWVudGF0aW9uIHRvIGl0IHRoYXQgcGVyZm9ybXMgdHlwZSBjaGVja2luZyBhbmQgZm9yd2FyZHMgdG8gQjo6Zi4KKyAgdm9pZCBmKG51bSB4KTsKK30KKworbWFpbigpIHsKKyAgSTxPYmplY3Q+IGkgPSBuZXcgQygpOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBpLmYoJ29vcHMnKTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9mdXR1cmVfb3JfZnVuY3Rpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZnV0dXJlX29yX2Z1bmN0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmRkYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZnV0dXJlX29yX2Z1bmN0aW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworbWFpbigpIHsKKyAgRXhwZWN0LnN1YnR5cGU8dm9pZCBGdW5jdGlvbigpLCBGdXR1cmVPcjx2b2lkIEZ1bmN0aW9uKCk+PigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZnV6enlfYXJyb3dzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Z1enp5X2Fycm93c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZTg2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2Z1enp5X2Fycm93c190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBGdXp6eSBhcnJvd3Mgd2lsbCBiZSBlbGltaW5hdGVkIGZyb20gRGFydCAyLjAgc29vbi4gIFRoaXMgdGVzdCBjaGVja3MgdGhhdAorLy8gaW1wbGVtZW50YXRpb25zIGhhdmUgcHJvcGVybHkgcmVtb3ZlZCBmdXp6eSBhcnJvdyBzdXBwb3J0LCBib3RoIGF0IGNvbXBpbGUKKy8vIHRpbWUgYW5kIGF0IHJ1biB0aW1lLiAgU2VlIGRhcnRidWcuY29tLzI5NjMwIGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKwordHlwZWRlZiBEeW5hbWljVG9EeW5hbWljKHgpOwordHlwZWRlZiBOZXZlclRvRHluYW1pYyhOZXZlciB4KTsKKworbnVtIG51bVRvTnVtKG51bSB4KSA9PiB4OworCittYWluKCkgeworICBEeW5hbWljVG9EeW5hbWljIHggPSBudW1Ub051bTsgLy8jIDAxOiBjb21waWxlLXRpbWUgZXJyb3IKKyAgTmV2ZXJUb0R5bmFtaWMgeCA9IG51bVRvTnVtOyAvLyMgMDI6IG9rCisgIEV4cGVjdC5pc0ZhbHNlKG51bVRvTnVtIGlzIER5bmFtaWNUb0R5bmFtaWMpOyAvLyMgMDM6IG9rCisgIEV4cGVjdC5pc1RydWUobnVtVG9OdW0gaXMgTmV2ZXJUb0R5bmFtaWMpOyAvLyMgMDQ6IG9rCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9nY190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9nY190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiMzk2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2djX3Rlc3QuZGFydApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBUZXN0aW5nIEdDLCBpc3N1ZSAxNDY5LgorCittYWluKCkgeworICB2YXIgZGl2OworICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgKytpKSB7CisgICAgTGlzdCBsID0gbmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKDEwMDAwMDAsIG51bGwpOworICAgIHZhciBtID0gMjsKKyAgICBkaXYgPSAoXykgeworICAgICAgdmFyIGIgPSBsOyAvLyBXYXMgY2F1c2luZyBPdXRPZk1lbW9yeS4KKyAgICB9OworICAgIHZhciBsU21hbGwgPSBuZXcgTGlzdDxkeW5hbWljPi5maWxsZWQoMywgbnVsbCk7CisgICAgLy8gQ2lyY3VsYXIgcmVmZXJlbmNlIGJldHdlZW4gbmV3IGFuZCBvbGQgZ2VuIG9iamVjdHMuCisgICAgbFNtYWxsWzBdID0gbDsKKyAgICBsWzBdID0gbFNtYWxsOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9ndWVzc19jaWRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZ3Vlc3NfY2lkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYyYThhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZ3Vlc3NfY2lkX3Rlc3QuZGFydApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSB0byB0ZXN0IGNpZCBndWVzc2luZyBvcHRpbWl6YXRpb25zLgorLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwIC0tbm8tYmFja2dyb3VuZC1jb21waWxhdGlvbgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgLy8gV2FybXVwIG9wdGltaXplcyBtZXRob2RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscyhpLCBjb21wYXJlSW50KGkpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGkudG9Eb3VibGUoKSwgY29tcGFyZURvdWJsZShpLnRvRG91YmxlKCkpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGksIGJpbk9wSW50KGksIGkpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGkudG9Eb3VibGUoKSwgYmluT3BEb3VibGUoaS50b0RvdWJsZSgpLCBpLnRvRG91YmxlKCkpKTsKKyAgfQorICBFeHBlY3QuZXF1YWxzKDMsIGNvbXBhcmVJbnQoMykpOworICBFeHBlY3QuZXF1YWxzKC0yLCBjb21wYXJlSW50KC0yKSk7CisgIEV4cGVjdC5lcXVhbHMoMCwgY29tcGFyZUludCgtMSkpOworCisgIEV4cGVjdC5lcXVhbHMoMywgYmluT3BJbnQoMywgMykpOworICBFeHBlY3QuZXF1YWxzKDAsIGJpbk9wSW50KC0yLCAtMikpOworCisgIEV4cGVjdC5lcXVhbHMoMy4wLCBiaW5PcERvdWJsZSgzLjAsIDMuMCkpOworICBFeHBlY3QuZXF1YWxzKDAuMCwgYmluT3BEb3VibGUoLTIuMCwgLTIuMCkpOworCisgIEV4cGVjdC5lcXVhbHMoMy4wLCBjb21wYXJlRG91YmxlKDMuMCkpOworICBFeHBlY3QuZXF1YWxzKC0yLjAsIGNvbXBhcmVEb3VibGUoLTIuMCkpOworICBFeHBlY3QuZXF1YWxzKDAuMCwgY29tcGFyZURvdWJsZSgtMS4wKSk7CisKKyAgdGVzdE9TUigpOworfQorCitpbnQgY29tcGFyZUludChpbnQgaSkgeworICBpZiAoaSA8IDApIHsKKyAgICAvLyBOb3QgdmlzaXRlZCBpbiBiZWZvcmUgb3B0aW1pemF0aW9uLgorICAgIC8vIEd1ZXNzIGNpZCBvZiBjb21wYXJpc29uIGJlbG93LgorICAgIGlmIChpID09IC0xKSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaTsKK30KKworZG91YmxlIGNvbXBhcmVEb3VibGUoZG91YmxlIGkpIHsKKyAgaWYgKGkgPCAwLjApIHsKKyAgICAvLyBOb3QgdmlzaXRlZCBpbiBiZWZvcmUgb3B0aW1pemF0aW9uLgorICAgIC8vIEd1ZXNzIGNpZCBvZiBjb21wYXJpc29uIGJlbG93LgorICAgIGlmIChpID09IC0xLjApIHJldHVybiAwLjA7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKK2ludCBiaW5PcEludChpbnQgaSwgaW50IHgpIHsKKyAgaWYgKGkgPCAwKSB7CisgICAgLy8gTm90IHZpc2l0ZWQgaW4gYmVmb3JlIG9wdGltaXphdGlvbi4KKyAgICAvLyBHdWVzcyBjaWQgb2YgYmluYXJ5IG9wZXJhdGlvbiBiZWxvdy4KKyAgICByZXR1cm4geCArIDI7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKK2RvdWJsZSBiaW5PcERvdWJsZShkb3VibGUgaSwgZG91YmxlIHgpIHsKKyAgaWYgKGkgPCAwLjApIHsKKyAgICAvLyBOb3QgdmlzaXRlZCBpbiBiZWZvcmUgb3B0aW1pemF0aW9uLgorICAgIC8vIEd1ZXNzIGNpZCBvZiBiaW5hcnkgb3BlcmF0aW9uIGJlbG93LgorICAgIHJldHVybiB4ICsgMi4wOworICB9CisgIHJldHVybiBpOworfQorCit0ZXN0T1NSKCkgeworICAvLyBGb3VsIHVwICBJQyBkYXRhIGluIGludGVnZXIncyB1bmFyeSBtaW51cy4KKyAgdmFyIHkgPSAtMHg4MDAwMDAwMDsKKyAgRXhwZWN0LmVxdWFscygKKyAgICAgICgweDdmZmZmZmZmZmZmZmZmZmYgKyAyKSAqIDEwLCB0ZXN0TG9vcCgxMCwgMHg3ZmZmZmZmZmZmZmZmZmZmKSk7CisgIC8vIFNlY29uZCB0aW1lIG5vIGRlb3B0aW1pemF0aW9uIGNhbiBvY2N1ciwgc2luY2UgcnVudGltZSBmZWVkYmFjayBoYXMgYmVlbiBjb2xsZWN0ZWQuCisgIEV4cGVjdC5lcXVhbHMoCisgICAgICAoMHg3ZmZmZmZmZmZmZmZmZmZmICsgMikgKiAxMCwgdGVzdExvb3AoMTAsIDB4N2ZmZmZmZmZmZmZmZmZmZikpOworfQorCit0ZXN0TG9vcChOLCBpbnQgeCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgIC8vIFdpbGwgdHJpZ2dlciBPU1IuIE9wZXJhdGlvbiBpbiBsb29wIGJlbG93IHdpbGwgdXNlIGd1ZXNzZWQgY2lkcy4KKyAgfQorICBpbnQgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAvLyBHdWVzcyAneCcgaXMgU21pLCBidXQgaXMgYWN0dWFsbHkgTWludDogZGVvcHRpbWl6ZS4KKyAgICBzdW0gKz0geCArIDI7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2d2bl9maWVsZF9hY2Nlc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZ3ZuX2ZpZWxkX2FjY2Vzc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMjRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2d2bl9maWVsZF9hY2Nlc3NfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEEgeworICB2YXIgeSA9IDA7CisgIGZvbyh4KSB7CisgICAgdmFyIHQgPSB0aGlzLnk7CisgICAgaWYgKHQgPCB4KSB7CisgICAgICBmb3IgKGludCBpID0gdGhpcy55OyBpIDwgeDsgaSsrKSB5Kys7CisgICAgfQorICAgIC8vIGRhcnQyanMgd2FzIHJldXNpbmcgdGhlICd0JyBmcm9tIGFib3ZlLgorICAgIHJldHVybiB0aGlzLnk7CisgIH0KK30KKwordm9pZCBtYWluKCkgeworICBFeHBlY3QuZXF1YWxzKDMsIG5ldyBBKCkuZm9vKDMpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2d2bl9pbnRlcmNlcHRvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9ndm5faW50ZXJjZXB0b3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjEwOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9ndm5faW50ZXJjZXB0b3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ZvbyhhLCBpbmRleCkgeworICBpZiAoYS5sZW5ndGggPCBpbmRleCkgeworICAgIGZvciAoaW50IGkgPSBhLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSBhLmFkZChpKTsKKyAgfQorICAvLyBkYXJ0MmpzIHdhcyByZXVzaW5nIHRoZSBhLmxlbmd0aCBmcm9tIGFib3ZlLgorICByZXR1cm4gYVthLmxlbmd0aCAtIDFdOworfQorCit2b2lkIG1haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoMywgZm9vKFswXSwgMykpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvZ3ZuX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2d2bl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyOTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2d2bl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQSB7CisgIGludCB4ID0gMDsKKworICBmb28oaSkgeworICAgIHZhciBzdGFydCA9IHg7CisgICAgZG8geworICAgICAgeCsrOworICAgICAgaSsrOworICAgIH0gd2hpbGUgKGkgIT0gMTApOworICB9Cit9CisKK21haW4oKSB7CisgIHZhciBhID0gbmV3IEEoKTsKKyAgYS5mb28oMCk7CisgIEV4cGVjdC5lcXVhbHMoMTAsIGEueCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9oYXNoX2NvZGVfbWFuZ2xpbmdfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGFzaF9jb2RlX21hbmdsaW5nX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTVkYTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGFzaF9jb2RlX21hbmdsaW5nX3Rlc3QuZGFydApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBGb28geworICB2YXIgJGlkZW50aXR5SGFzaDsKK30KKwordm9pZCBtYWluKCkgeworICBGb28gZm9vID0gbmV3IEZvbygpOworICBmb28uJGlkZW50aXR5SGFzaCA9ICdmaXNrJzsKKyAgRXhwZWN0LmlzVHJ1ZShmb28uJGlkZW50aXR5SGFzaCBpcyBTdHJpbmcpOworICBpbnQgaGFzaCA9IGZvby5oYXNoQ29kZTsKKyAgRXhwZWN0LmlzVHJ1ZShoYXNoIGlzIGludCk7CisgIEV4cGVjdC5pc1RydWUoZm9vLiRpZGVudGl0eUhhc2ggaXMgU3RyaW5nKTsKKyAgRXhwZWN0LmVxdWFscyhoYXNoLCBmb28uaGFzaENvZGUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGVsbG9fZGFydF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9oZWxsb19kYXJ0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTM3MDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGVsbG9fZGFydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gU2ltcGxlIHRlc3QgcHJvZ3JhbSBpbnZva2VkIHdpdGggYW4gb3B0aW9uIHRvIGVhZ2VybHkKKy8vIGNvbXBpbGUgYWxsIGNvZGUgdGhhdCBpcyBsb2FkZWQgaW4gdGhlIGlzb2xhdGUuCisvLyBWTU9wdGlvbnM9LS1jb21waWxlX2FsbAorCitjbGFzcyBIZWxsb0RhcnRUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIHByaW50KCJIZWxsbywgRGFydGVyISIpOworICB9Cit9CisKK21haW4oKSB7CisgIEhlbGxvRGFydFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF9saWIuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF9saWIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVjYzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGVsbG9fc2NyaXB0X2xpYi5kYXJ0CkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdGluZyBhIHNpbXBsZSBzY3JpcHQgaW1wb3J0aW5nIGEgbGlicmFyeS4KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlicmFyeS4KKworbGlicmFyeSBIZWxsb1NjcmlwdExpYjsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitwYXJ0ICJoZWxsb19zY3JpcHRfbGliX3NvdXJjZS5kYXJ0IjsKKworY2xhc3MgSGVsbG9MaWIgeworICBzdGF0aWMgZG9UZXN0KCkgeworICAgIHggPSAxNzsKKyAgICBFeHBlY3QuZXF1YWxzKDE3LCB4KyspOworICAgIHByaW50KCJIZWxsbyBmcm9tIExpYiEiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGVsbG9fc2NyaXB0X2xpYl9zb3VyY2UuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF9saWJfc291cmNlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NGJjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF9saWJfc291cmNlLmRhcnQKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0aW5nIGEgc2ltcGxlIHNjcmlwdCBpbXBvcnRpbmcgYSBsaWJyYXJ5LgorLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgc291cmNlIGZpbGUgaW5jbHVkZWQgZnJvbSB0aGUgbGlicmFyeS4KKworLy8gQSB0b3AtbGV2ZWwgdmFyaWFibGUgYmVpbmcgYWNjZXNzZWQgYm90aCBmcm9tIHRoZSBsaWJyYXJ5IGFuZCB0aGUgaW1wb3J0ZXIuCisKK3BhcnQgb2YgSGVsbG9TY3JpcHRMaWI7CisKK3ZhciB4OwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaGVsbG9fc2NyaXB0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2hlbGxvX3NjcmlwdF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxOCBAQAorIyEgVGhpcyBpcyBjdXJyZW50bHkgb25seSBhIGNvbW1lbnQuCisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RpbmcgYSBzaW1wbGUgc2NyaXB0IGltcG9ydGluZyBhIGxpYnJhcnkuCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNjcmlwdCAoYWthIHJvb3QgbGlicmFyeSkuCisKK2xpYnJhcnkgSGVsbG9TY3JpcHRUZXN0LmRhcnQ7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICJoZWxsb19zY3JpcHRfbGliLmRhcnQiOworCittYWluKCkgeworICBIZWxsb0xpYi5kb1Rlc3QoKTsKKyAgRXhwZWN0LmVxdWFscygxOCwgeCk7CisgIHByaW50KCJIZWxsbyBkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaWxsZWdhbF9kZWNsYXJhdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbGxlZ2FsX2RlY2xhcmF0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjg3MTRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaWxsZWdhbF9kZWNsYXJhdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK1sgLy8jIDAxOiBzeW50YXggZXJyb3IKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbGxlZ2FsX2ludm9jYXRpb25fbGliLmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbGxlZ2FsX2ludm9jYXRpb25fbGliLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxYjhkZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbGxlZ2FsX2ludm9jYXRpb25fbGliLmRhcnQKQEAgLTAsMCArMSwzIEBACitsaWJyYXJ5IGZvbzsKKworZm9vKCkge30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2lsbGVnYWxfaW52b2NhdGlvbl9ydW50aW1lX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2lsbGVnYWxfaW52b2NhdGlvbl9ydW50aW1lX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY0NmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaWxsZWdhbF9pbnZvY2F0aW9uX3J1bnRpbWVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTggQEAKKy8vIFRPRE8obXVsdGl0ZXN0KTogVGhpcyB3YXMgYXV0b21hdGljYWxseSBtaWdyYXRlZCBmcm9tIGEgbXVsdGl0ZXN0IGFuZCBtYXkKKy8vIGNvbnRhaW4gc3RyYW5nZSBvciBkZWFkIGNvZGUuCisKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGZvciBjb25zdHJ1Y3RvcnMgYW5kIGluaXRpYWxpemVycy4KKy8vCisvLyBUZXN0IGZvciBpc3N1ZSAxMzkzLiAgSW52b2tpbmcgYSBsaWJyYXJ5IHByZWZpeCBuYW1lIGNhdXNlZCBhbiBpbnRlcm5hbCBlcnJvcgorLy8gaW4gZGFydGMuCisKKworCittYWluKCkgeworICAvLyBwcm9iYWJseSB3aGF0IHRoZSB1c2VyIG1lYW50IHdhcyBmb28uZm9vKCksIGJ1dCB0aGUgcXVhbGlmaWVyIHJlZmVycworICAvLyB0byB0aGUgbGlicmFyeSBwcmVmaXgsIG5vdCB0aGUgbWV0aG9kIGRlZmluZWQgd2l0aGluIHRoZSBsaWJyYXJ5LgorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbGxlZ2FsX2ludm9jYXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaWxsZWdhbF9pbnZvY2F0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY5NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaWxsZWdhbF9pbnZvY2F0aW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgY29uc3RydWN0b3JzIGFuZCBpbml0aWFsaXplcnMuCisvLworLy8gVGVzdCBmb3IgaXNzdWUgMTM5My4gIEludm9raW5nIGEgbGlicmFyeSBwcmVmaXggbmFtZSBjYXVzZWQgYW4gaW50ZXJuYWwgZXJyb3IKKy8vIGluIGRhcnRjLgorCitpbXBvcnQgImlsbGVnYWxfaW52b2NhdGlvbl9saWIuZGFydCIgYXMgZm9vOworCittYWluKCkgeworICAvLyBwcm9iYWJseSB3aGF0IHRoZSB1c2VyIG1lYW50IHdhcyBmb28uZm9vKCksIGJ1dCB0aGUgcXVhbGlmaWVyIHJlZmVycworICAvLyB0byB0aGUgbGlicmFyeSBwcmVmaXgsIG5vdCB0aGUgbWV0aG9kIGRlZmluZWQgd2l0aGluIHRoZSBsaWJyYXJ5LgorICBmb28oKTsKKy8vXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5QUkVGSVhfSURFTlRJRklFUl9OT1RfRk9MTE9XRURfQllfRE9UCisvLyBbY2ZlXSBBIHByZWZpeCBjYW4ndCBiZSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbXBsaWNpdF9zY29wZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbXBsaWNpdF9zY29wZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMGRkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ltcGxpY2l0X3Njb3BlX3Rlc3QuZGFydApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBUZXN0IHRoYXQgaWYsIHdoaWxlIGV0YyBjcmVhdGUgYW4gaW1wbGljaXQgc2NvcGUgaWYgdGhlIGJvZHkKKy8vIGlzIG5vdCBhIGNvbXBvdW5kIHN0YXRlbWVudC4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEltcGxpY2l0U2NvcGVUZXN0IHsKKyAgc3RhdGljIGJvb2wgYWx3YXlzVHJ1ZSgpIHsKKyAgICByZXR1cm4gMSArIDEgPT0gMjsKKyAgfQorCisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICB2YXIgYSA9ICJmb28iOworICAgIHZhciBiOworICAgIGlmIChhbHdheXNUcnVlKCkpCisgICAgICB2YXIgYSA9ICJiYXIiOworICAgIGVsc2UKKyAgICAgIHZhciBiID0gYTsKKyAgICBFeHBlY3QuZXF1YWxzKCJmb28iLCBhKTsKKyAgICBFeHBlY3QuZXF1YWxzKG51bGwsIGIpOworCisgICAgd2hpbGUgKCFhbHdheXNUcnVlKCkpIHZhciBhID0gImJhciIsIGIgPSAiYmF6IjsKKyAgICBFeHBlY3QuZXF1YWxzKCJmb28iLCBhKTsKKyAgICBFeHBlY3QuZXF1YWxzKG51bGwsIGIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB2YXIgYSA9ICJiYXIiLCBiID0gImJheiI7CisgICAgRXhwZWN0LmVxdWFscygiZm9vIiwgYSk7CisgICAgRXhwZWN0LmVxdWFscyhudWxsLCBiKTsKKworICAgIGRvIHZhciBhID0gImJhciIsIGIgPSAiYmF6Ijsgd2hpbGUgKCJibGFjayIgPT0gIndoaXRlIik7CisgICAgRXhwZWN0LmVxdWFscygiZm9vIiwgYSk7CisgICAgRXhwZWN0LmVxdWFscyhudWxsLCBiKTsKKyAgfQorfQorCittYWluKCkgeworICBJbXBsaWNpdFNjb3BlVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW5kZXhfYXNzaWduX29wZXJhdG9yX2luZmVyX3JldHVybl90eXBlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2luZGV4X2Fzc2lnbl9vcGVyYXRvcl9pbmZlcl9yZXR1cm5fdHlwZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3YzI4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2luZGV4X2Fzc2lnbl9vcGVyYXRvcl9pbmZlcl9yZXR1cm5fdHlwZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBDIHsKKyAgZHluYW1pYyBvcGVyYXRvciBbXT0oZHluYW1pYyBpbmRleCwgZHluYW1pYyB2YWx1ZSkge30KK30KKworYWJzdHJhY3QgY2xhc3MgSSB7CisgIHZvaWQgb3BlcmF0b3IgW109KGR5bmFtaWMgaW5kZXgsIGR5bmFtaWMgdmFsdWUpIHt9Cit9CisKK2NsYXNzIEQgZXh0ZW5kcyBDIGltcGxlbWVudHMgSSB7CisgIC8vIEV2ZW4gdGhvdWdoIGBDYCBhbmQgYElgIGRlZmluZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIGZvciBgb3BlcmF0b3JbXT1gLCBpdAorICAvLyBzaG91bGQgc3RpbGwgYmUgcG9zc2libGUgdG8gaW5mZXIgYSByZXR1cm4gdHlwZSBoZXJlLCBzaW5jZSB0aGUgcmV0dXJuIHR5cGUKKyAgLy8gb2YgYG9wZXJhdG9yW109YCBpcyBhbHdheXMgaW5mZXJyZWQgYXMgYHZvaWRgLgorICBvcGVyYXRvciBbXT0oZHluYW1pYyBpbmRleCwgZHluYW1pYyB2YWx1ZSkge30KK30KKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbmRpcmVjdF9jb25zdF9udWxsX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2luZGlyZWN0X2NvbnN0X251bGxfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjE2MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbmRpcmVjdF9jb25zdF9udWxsX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCittYWluKCkgeworICBjb25zdCBOVUxMID0gMSA9PSAxID8gbnVsbCA6IGZhbHNlOworICBFeHBlY3QuaXNOdWxsKE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW5mZXJlbmNlX2VudW1fbGlzdF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbmZlcmVuY2VfZW51bV9saXN0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdiN2JkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2luZmVyZW5jZV9lbnVtX2xpc3RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworZW51bSBFMSB7IGEsIGIgfQorZW51bSBFMiB7IGEsIGIgfQorCit2YXIgdiA9IFtFMS5hLCBFMi5iXTsKKworbWFpbigpIHsKKyAgLy8gVGVzdCB0aGF0IHYgaXMgYExpc3Q8T2JqZWN0PmAsIHNvIGFueSBvZiB0aGVzZSBhc3NpZ25lbW50cyBhcmUgT0suCisgIHZbMF0gPSAwOworICB2WzFdID0gJzEnOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW5mZXJlbmNlX2xpc3Rfb3JfbnVsbF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbmZlcmVuY2VfbGlzdF9vcl9udWxsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThiZDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW5mZXJlbmNlX2xpc3Rfb3JfbnVsbF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGRhcnQyanMgdGhhdCB1c2VkIHRvIHN0YXRpY2FsbHkgaW5saW5lIHRoZSBsZW5ndGggb2YgYW4KKy8vIGFycmF5IGhlbGQgaW4gYSB2YXJpYWJsZSB3aGVuIGl0IGNvdWxkLCBldmVuIGlmIHRoYXQgdmFyaWFibGUgY291bGQKKy8vIGJlIG51bGwuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit2YXIgbGlzdDsKKworbWFpbigpIHsKKyAgaWYgKG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoID09IDApIHsKKyAgICBsaXN0ID0gbmV3IExpc3QuZmlsbGVkKDQsIG51bGwpOworICB9CisgIEV4cGVjdC50aHJvd3NOb1N1Y2hNZXRob2RFcnJvcigoKSA9PiBwcmludChsaXN0WzVdKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnRyaW5zaWZpZWRfbWV0aG9kc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnRyaW5zaWZpZWRfbWV0aG9kc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyZGZiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludHJpbnNpZmllZF9tZXRob2RzX3Rlc3QuZGFydApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyB0aGUgaW5zdGFuY2VvZiBvcGVyYXRpb24uCisKK2xpYnJhcnkgaW50cmluc2lmaWVkX21ldGhvZHNfdGVzdDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6bWF0aCc7CisKK3Rlc3RJc05lZ2F0aXZlKCkgeworICBFeHBlY3QuaXNGYWxzZSgoMTIuMCkuaXNOZWdhdGl2ZSk7CisgIEV4cGVjdC5pc1RydWUoKC0xMi4wKS5pc05lZ2F0aXZlKTsKKyAgRXhwZWN0LmlzRmFsc2UoKGRvdWJsZS5uYW4pLmlzTmVnYXRpdmUpOworICBFeHBlY3QuaXNGYWxzZSgoMC4wKS5pc05lZ2F0aXZlKTsKKyAgRXhwZWN0LmlzVHJ1ZSgoLTAuMCkuaXNOZWdhdGl2ZSk7CisgIEV4cGVjdC5pc0ZhbHNlKChkb3VibGUuaW5maW5pdHkpLmlzTmVnYXRpdmUpOworICBFeHBlY3QuaXNUcnVlKChkb3VibGUubmVnYXRpdmVJbmZpbml0eSkuaXNOZWdhdGl2ZSk7Cit9CisKK3Rlc3RJc05hTigpIHsKKyAgRXhwZWN0LmlzRmFsc2UoKDEuMCkuaXNOYU4pOworICBFeHBlY3QuaXNUcnVlKChkb3VibGUubmFuKS5pc05hTik7Cit9CisKK3Rlc3RUcmlnb25vbWV0cmljKCkgeworICBFeHBlY3QuYXBwcm94RXF1YWxzKDEuMCwgc2luKHBpIC8gMi4wKSwgMC4wMDAxKTsKKyAgRXhwZWN0LmFwcHJveEVxdWFscygxLjAsIGNvcygwKSwgMC4wMDAxKTsKKyAgRXhwZWN0LmFwcHJveEVxdWFscygxLjAsIGNvcygwLjApLCAwLjAwMDEpOworfQorCit2b2lkIGZvbyhpbnQgbikgeworICBmb3IgKHZhciBpID0gMDsgaSA8PSBuOyArK2kpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDIuMCwgc3FydCg0LjApKTsKKyAgICB0ZXN0SXNOZWdhdGl2ZSgpOworICAgIHRlc3RJc05hTigpOworICAgIHRlc3RUcmlnb25vbWV0cmljKCk7CisgIH0KK30KKwordm9pZCBtYWluKCkgeworICBmb28oNDAwMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZfY3NlX2xpY21fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52X2NzZV9saWNtX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI3M2VkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52X2NzZV9saWNtX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ1OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1kZXRlcm1pbmlzdGljIC0tb3B0aW1pemF0aW9uX2NvdW50ZXJfdGhyZXNob2xkPTEwCisKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0cyBhIGZldyBzaXR1YXRpb25zIGluIHdoaWNoIGludmFyaWFudCBpbnN0cnVjdGlvbnMKKy8vIGNhbiBiZSBzdWJqZWN0IHRvIENTRSBhbmQgTElDTS4KKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK2ludCBjc2UxKEludDMyTGlzdD8gYSwgaW50IG4pIHsKKyAgaW50IHggPSBhIVswXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2FuIGJlCisgICAgLy8gQ1NFZWQgd2l0aCB0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlIGV2ZW4gaWYgbG9vcCBpcyBub3QgdGFrZW4uCisgICAgeCArPSBhWzBdICogYVtpXTsKKyAgfQorICByZXR1cm4geDsKK30KKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK2ludCBjc2UyKEludDMyTGlzdD8gYSwgaW50IG4pIHsKKyAgaW50IHggPSBhIVswXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGJ1dCBub3QgdGhlIGFjdHVhbCBsb2FkIGNhbiBiZQorICAgIC8vIENTRWVkIHdpdGggdGhlIGluc3RydWN0aW9ucyBhYm92ZSwgc2luY2UgdGhlIHZhbHVlIG9mIHRoZSBsb2FkCisgICAgLy8gY2hhbmdlcyBpbiB0aGUgbG9vcC4KKyAgICBhW2ldID0gYVswXSArIDE7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTEoSW50MzJMaXN0PyBhLCBpbnQgbikgeworICBpbnQgeCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLy8gVGhlIGFbMF0gbnVsbCBjaGVjaywgYm91bmRzIGNoZWNrLCBhbmQgdGhlIGFjdHVhbCBsb2FkIGNhbm5vdAorICAgIC8vIGJlIExJQ01lZCwgc2luY2UgdGhlIGxvb3AgbWF5IGJlIG5vbi10YWtlbi4KKyAgICB4ICs9IGEhWzBdICogYVtpXTsKKyAgfQorICByZXR1cm4geDsKK30KKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK2ludCBsaWNtMihJbnQzMkxpc3Q/IGEpIHsKKyAgaW50IHggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2FuIGJlCisgICAgLy8gTElDTWVkLCBzaW5jZSB0aGUgbG9vcCBpcyBhbHdheXMtdGFrZW4uCisgICAgeCArPSBhIVswXSAqIGFbaV07CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTMoSW50MzJMaXN0PyBhLCBib29sIGNvbmQpIHsKKyAgaW50IHggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2Fubm90CisgICAgLy8gYmUgTElDTWVkLCBzaW5jZSB0aGUgY29uZGl0aW9uIG1heSBiZSBub24tdGFrZW4gKGFuZCB3ZSBkb24ndAorICAgIC8vIGhvaXN0IGludmFyaWFudCBjb25kaXRpb25zKS4KKyAgICBpZiAoY29uZCkgeCArPSBhIVswXSAqIGFbaV07CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTNfYnJrKEludDMyTGlzdD8gYSwgYm9vbCBjb25kKSB7CisgIGludCB4ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgLy8gVGhlIGFbMF0gbnVsbCBjaGVjaywgYm91bmRzIGNoZWNrLCBhbmQgdGhlIGFjdHVhbCBsb2FkIGNhbm5vdAorICAgIC8vIGJlIExJQ01lZCwgc2luY2UgdGhlIGNvbmRpdGlvbiBtYXkgYmUgdGFrZW4gKGFuZCB3ZSBkb24ndAorICAgIC8vIGhvaXN0IGludmFyaWFudCBjb25kaXRpb25zKS4KKyAgICBpZiAoY29uZCkgYnJlYWs7CisgICAgeCArPSBhIVswXSAqIGFbaV07CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK2ludCBnbG9iYWwgPSAtMTsKKworQHByYWdtYSgndm06bmV2ZXItaW5saW5lJykKK2ludCBsaWNtNChJbnQzMkxpc3Q/IGEpIHsKKyAgaW50IHggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2Fubm90CisgICAgLy8gYmUgTElDTWVkLCBzaW5jZSBzb21ldGhpbmcgdmlzaWJsZSBoYXBwZW5zIGJlZm9yZSBhbiBleGNlcHRpb24KKyAgICAvLyBtYXkgYmUgdGhyb3duLgorICAgIGdsb2JhbCsrOworICAgIHggKz0gYSFbMF0gKiBhW2ldOworICB9CisgIHJldHVybiB4OworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGxpY201KEludDMyTGlzdD8gYSkgeworICBpbnQgeCA9IDA7CisgIC8vIEFueXRoaW5nIGluIHRoZSBsb29wIGhlYWRlciBjYW4gYmUgTElDTWVkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGEhWzFdOyBpKyspIHsKKyAgICB4Kys7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTYoSW50MzJMaXN0PyBhLCBpbnQgbikgeworICBpbnQgeCA9IDA7CisgIGludCBpID0gMDsKKyAgZG8geworICAgIC8vIFRoZSBhWzBdIG51bGwgY2hlY2ssIGJvdW5kcyBjaGVjaywgYW5kIHRoZSBhY3R1YWwgbG9hZCBjYW4gYmUKKyAgICAvLyBMSUNNZWQsIHNpbmNlIHRoaXMgImhlYWRlciIgaXMgYWx3YXlzLXRha2VuLgorICAgIHggKz0gYSFbMF0gKiBhW2krK107CisgIH0gd2hpbGUgKGkgPCBuKTsKKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTcoSW50MzJMaXN0PyBhLCBpbnQgbikgeworICBpbnQgeCA9IDA7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2FuIGJlCisgICAgLy8gTElDTWVkLCBzaW5jZSB0aGlzICJoZWFkZXIiIGlzIGFsd2F5cy10YWtlbi4KKyAgICB4ICs9IGEhWzBdICogYVtpKytdOworICAgIGlmIChpID49IG4pIGJyZWFrOworICB9CisgIHJldHVybiB4OworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGxpY204KEludDMyTGlzdD8gYSwgaW50IG4pIHsKKyAgaW50IHggPSAwOworICBpbnQgaSA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGkgPj0gbikgYnJlYWs7CisgICAgLy8gTm8gTElDTSBhdCB0aGlzIHBvaW50LCBsb29wIGJvZHkgbWF5IG5vdCBiZSB0YWtlbi4KKyAgICB4ICs9IGEhWzBdICogYVtpKytdOworICB9CisgIHJldHVybiB4OworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGxpY205KEludDMyTGlzdD8gYSkgeworICBpbnQgeCA9IDA7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoaSA+PSAxNikgYnJlYWs7CisgICAgLy8gVGhlIGFbMF0gbnVsbCBjaGVjaywgYm91bmRzIGNoZWNrLCBhbmQgdGhlIGFjdHVhbCBsb2FkIGNhbiBiZQorICAgIC8vIExJQ01lZCwgc2luY2UgdGhlIGxvb3AgaXMgYWx3YXlzLXRha2VuLgorICAgIHggKz0gYSFbMF0gKiBhW2krK107CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTEwKEludDMyTGlzdD8gYSwgYm9vbCBjb25kKSB7CisgIGludCB4ID0gMDsKKyAgaW50IGkgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChpID49IDE2KSBicmVhazsKKyAgICAvLyBUaGUgYVswXSBudWxsIGNoZWNrLCBib3VuZHMgY2hlY2ssIGFuZCB0aGUgYWN0dWFsIGxvYWQgY2Fubm90CisgICAgLy8gYmUgTElDTWVkLCBzaW5jZSB0aGUgY29uZGl0aW9uIG1heSBiZSBub24tdGFrZW4gKGFuZCB3ZSBkb24ndAorICAgIC8vIGhvaXN0IGludmFyaWFudCBjb25kaXRpb25zKS4KKyAgICBpZiAoY29uZCkgeCArPSBhIVswXSAqIGFbaV07CisgICAgaSsrOworICB9CisgIHJldHVybiB4OworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGxpY20xMF9icmsoSW50MzJMaXN0PyBhLCBib29sIGNvbmQpIHsKKyAgaW50IHggPSAwOworICBpbnQgaSA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGkgPj0gMTYpIGJyZWFrOworICAgIC8vIFRoZSBhWzBdIG51bGwgY2hlY2ssIGJvdW5kcyBjaGVjaywgYW5kIHRoZSBhY3R1YWwgbG9hZCBjYW5ub3QKKyAgICAvLyBiZSBMSUNNZWQsIHNpbmNlIHRoZSBjb25kaXRpb24gbWF5IGJlIHRha2VuIChhbmQgd2UgZG9uJ3QKKyAgICAvLyBob2lzdCBpbnZhcmlhbnQgY29uZGl0aW9ucykuCisgICAgaWYgKGNvbmQpIGJyZWFrOworICAgIHggKz0gYSFbMF0gKiBhW2krK107CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK0BwcmFnbWEoJ3ZtOm5ldmVyLWlubGluZScpCitpbnQgbGljbTExKEludDMyTGlzdD8gYSkgeworICBpbnQgeCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQW55dGhpbmcgaW4gdGhlIGxvb3AgaGVhZGVyIGNhbiBiZSBMSUNNZWQuCisgICAgaWYgKHggPiBhIVsxXSkgYnJlYWs7CisgICAgeCsrOworICB9CisgIHJldHVybiB4OworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGZvbygpIHsKKyAgcmV0dXJuIGdsb2JhbC0tOworfQorCitAcHJhZ21hKCd2bTpuZXZlci1pbmxpbmUnKQoraW50IGxpY20xMihJbnQzMkxpc3Q/IGEpIHsKKyAgaW50IHggPSAwOworICBpbnQgaSA9IDA7CisgIC8vIFNpZGUtZWZmZWN0IGxvb3AgYm91bmQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9vKCk7IGkrKykgeworICAgIHggKz0gYSFbMF0gKiBhW2krK107CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK2RvVGVzdHMoKSB7CisgIHZhciB4ID0gbmV3IEludDMyTGlzdCgwKTsKKyAgdmFyIGEgPSBuZXcgSW50MzJMaXN0KDE2KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgYVtpXSA9IGkgKyAxOworICB9CisKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgY3NlMShudWxsLCAwKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGNzZTEobnVsbCwgMSk7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBjc2UxKHgsIDApOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBjc2UxKHgsIDEpOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDEsIGNzZTEoYSwgMCkpOworICBFeHBlY3QuZXF1YWxzKDEzNywgY3NlMShhLCAxNikpOworCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGNzZTIobnVsbCwgMCk7CisgIH0pOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBjc2UyKG51bGwsIDEpOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgY3NlMih4LCAwKTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgY3NlMih4LCAxKTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygxLCBjc2UyKGEsIDApKTsKKyAgRXhwZWN0LmVxdWFscygxLCBjc2UyKGEsIDE2KSk7CisgIEV4cGVjdC5lcXVhbHMoMiwgYVswXSk7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgMTY7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMywgYVtpXSk7CisgIH0KKworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20xKG51bGwsIDApKTsKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgbGljbTEobnVsbCwgMSk7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20xKHgsIDApKTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgbGljbTEoeCwgMSk7CisgIH0sIChlKSB7CisgICAgcmV0dXJuIGUgaXMgUmFuZ2VFcnJvcjsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoMCwgbGljbTEoYSwgMCkpOworICBFeHBlY3QuZXF1YWxzKDk0LCBsaWNtMShhLCAxNikpOworCisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY20yKG51bGwpOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgbGljbTIoeCk7CisgIH0sIChlKSB7CisgICAgcmV0dXJuIGUgaXMgUmFuZ2VFcnJvcjsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoOTQsIGxpY20yKGEpKTsKKworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20zKG51bGwsIGZhbHNlKSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY20zKG51bGwsIHRydWUpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtMyh4LCBmYWxzZSkpOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtMyh4LCB0cnVlKTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtMyhhLCBmYWxzZSkpOworICBFeHBlY3QuZXF1YWxzKDk0LCBsaWNtMyhhLCB0cnVlKSk7CisKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtM19icmsobnVsbCwgdHJ1ZSkpOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBsaWNtM19icmsobnVsbCwgZmFsc2UpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtM19icmsoeCwgdHJ1ZSkpOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtM19icmsoeCwgZmFsc2UpOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20zX2JyayhhLCB0cnVlKSk7CisgIEV4cGVjdC5lcXVhbHMoOTQsIGxpY20zX2JyayhhLCBmYWxzZSkpOworCisgIGdsb2JhbCA9IDA7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY200KG51bGwpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygxLCBnbG9iYWwpOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtNCh4KTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygyLCBnbG9iYWwpOworICBFeHBlY3QuZXF1YWxzKDk0LCBsaWNtNChhKSk7CisgIEV4cGVjdC5lcXVhbHMoMTgsIGdsb2JhbCk7CisKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgbGljbTUobnVsbCk7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtNSh4KTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygzLCBsaWNtNShhKSk7CisKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgbGljbTYobnVsbCwgMCk7CisgIH0pOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBsaWNtNihudWxsLCAxKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIGxpY202KHgsIDApOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtNih4LCAxKTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscyg0LCBsaWNtNihhLCAwKSk7CisgIEV4cGVjdC5lcXVhbHMoOTQsIGxpY202KGEsIDE2KSk7CisKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgbGljbTcobnVsbCwgMCk7CisgIH0pOworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBsaWNtNyhudWxsLCAxKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIGxpY203KHgsIDApOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtNyh4LCAxKTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscyg0LCBsaWNtNyhhLCAwKSk7CisgIEV4cGVjdC5lcXVhbHMoOTQsIGxpY203KGEsIDE2KSk7CisKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtOChudWxsLCAwKSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY204KG51bGwsIDEpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtOCh4LCAwKSk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIGxpY204KHgsIDEpOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDAsIGxpY204KGEsIDApKTsKKyAgRXhwZWN0LmVxdWFscyg5NCwgbGljbTgoYSwgMTYpKTsKKworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBsaWNtOShudWxsKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIGxpY205KHgpOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDk0LCBsaWNtOShhKSk7CisKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtMTAobnVsbCwgZmFsc2UpKTsKKyAgRXhwZWN0LnRocm93c1R5cGVFcnJvcigoKSB7CisgICAgbGljbTEwKG51bGwsIHRydWUpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtMTAoeCwgZmFsc2UpKTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgbGljbTEwKHgsIHRydWUpOworICB9LCAoZSkgeworICAgIHJldHVybiBlIGlzIFJhbmdlRXJyb3I7CisgIH0pOworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20xMChhLCBmYWxzZSkpOworICBFeHBlY3QuZXF1YWxzKDk0LCBsaWNtMTAoYSwgdHJ1ZSkpOworCisgIEV4cGVjdC5lcXVhbHMoMCwgbGljbTEwX2JyayhudWxsLCB0cnVlKSk7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY20xMF9icmsobnVsbCwgZmFsc2UpOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygwLCBsaWNtMTBfYnJrKHgsIHRydWUpKTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgbGljbTEwX2Jyayh4LCBmYWxzZSk7CisgIH0sIChlKSB7CisgICAgcmV0dXJuIGUgaXMgUmFuZ2VFcnJvcjsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoMCwgbGljbTEwX2JyayhhLCB0cnVlKSk7CisgIEV4cGVjdC5lcXVhbHMoOTQsIGxpY20xMF9icmsoYSwgZmFsc2UpKTsKKworICBFeHBlY3QudGhyb3dzVHlwZUVycm9yKCgpIHsKKyAgICBsaWNtMTEobnVsbCk7CisgIH0pOworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBsaWNtMTEoeCk7CisgIH0sIChlKSB7CisgICAgcmV0dXJuIGUgaXMgUmFuZ2VFcnJvcjsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoNCwgbGljbTExKGEpKTsKKworICBnbG9iYWwgPSAwOworICBFeHBlY3QuZXF1YWxzKDAsIGxpY20xMihudWxsKSk7CisgIEV4cGVjdC5lcXVhbHMoLTEsIGdsb2JhbCk7CisgIEV4cGVjdC5lcXVhbHMoMCwgbGljbTEyKHgpKTsKKyAgRXhwZWN0LmVxdWFscygtMiwgZ2xvYmFsKTsKKyAgZ2xvYmFsID0gMTY7CisgIEV4cGVjdC50aHJvd3NUeXBlRXJyb3IoKCkgeworICAgIGxpY20xMihudWxsKTsKKyAgfSk7CisgIEV4cGVjdC5lcXVhbHMoMTUsIGdsb2JhbCk7CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIGxpY20xMih4KTsKKyAgfSwgKGUpIHsKKyAgICByZXR1cm4gZSBpcyBSYW5nZUVycm9yOworICB9KTsKKyAgRXhwZWN0LmVxdWFscygxNCwgZ2xvYmFsKTsKKyAgRXhwZWN0LmVxdWFscygyOCwgbGljbTEyKGEpKTsKKyAgRXhwZWN0LmVxdWFscyg4LCBnbG9iYWwpOworfQorCittYWluKCkgeworICAvLyBSZXBlYXQgdG8gZW50ZXIgSklUICh3aGVuIGFwcGxpY2FibGUpLgorICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBkb1Rlc3RzKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludmFsaWRfY2FzdF9ydW50aW1lXzFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3J1bnRpbWVfMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5YTczOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludmFsaWRfY2FzdF9ydW50aW1lXzFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzYgQEAKKy8vIFRPRE8obXVsdGl0ZXN0KTogVGhpcyB3YXMgYXV0b21hdGljYWxseSBtaWdyYXRlZCBmcm9tIGEgbXVsdGl0ZXN0IGFuZCBtYXkKKy8vIGNvbnRhaW4gc3RyYW5nZSBvciBkZWFkIGNvZGUuCisKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworY2xhc3MgQyB7CisgIEMoKTsKKyAgZmFjdG9yeSBDLmZhY3QoKSA9PiBEKCk7CisgIGZhY3RvcnkgQy5mYWN0MigpID0gRDsKKyAgQy5ub25GYWN0KCk7CisgIEMubm9uRmFjdDIoKSA6IHRoaXMubm9uRmFjdCgpOworICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbihpbnQgaSkge30KK30KKworY2xhc3MgRCBleHRlbmRzIEMge30KKwordm9pZCB0b3BMZXZlbEZ1bmN0aW9uKGludCBpKSB7fQorCit0ZXN0KCkgeworICB2b2lkIGxvY2FsRnVuY3Rpb24oaW50IGkpIHt9CisKKworCisKKyAgRCBlID0gbmV3IEMuZmFjdCgpIGFzIEQ7CisKKworCisKKworCit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3J1bnRpbWVfMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZhbGlkX2Nhc3RfcnVudGltZV8yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYxMjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3J1bnRpbWVfMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwzNiBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBDIHsKKyAgQygpOworICBmYWN0b3J5IEMuZmFjdCgpID0+IEQoKTsKKyAgZmFjdG9yeSBDLmZhY3QyKCkgPSBEOworICBDLm5vbkZhY3QoKTsKKyAgQy5ub25GYWN0MigpIDogdGhpcy5ub25GYWN0KCk7CisgIHN0YXRpYyB2b2lkIHN0YXRpY0Z1bmN0aW9uKGludCBpKSB7fQorfQorCitjbGFzcyBEIGV4dGVuZHMgQyB7fQorCit2b2lkIHRvcExldmVsRnVuY3Rpb24oaW50IGkpIHt9CisKK3Rlc3QoKSB7CisgIHZvaWQgbG9jYWxGdW5jdGlvbihpbnQgaSkge30KKworCisKKworCisgIEQgZiA9IG5ldyBDLmZhY3QyKCkgYXMgRDsKKworCisKKworCit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3J1bnRpbWVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3J1bnRpbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZjU4NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZhbGlkX2Nhc3RfcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwzNiBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBDIHsKKyAgQygpOworICBmYWN0b3J5IEMuZmFjdCgpID0+IEQoKTsKKyAgZmFjdG9yeSBDLmZhY3QyKCkgPSBEOworICBDLm5vbkZhY3QoKTsKKyAgQy5ub25GYWN0MigpIDogdGhpcy5ub25GYWN0KCk7CisgIHN0YXRpYyB2b2lkIHN0YXRpY0Z1bmN0aW9uKGludCBpKSB7fQorfQorCitjbGFzcyBEIGV4dGVuZHMgQyB7fQorCit2b2lkIHRvcExldmVsRnVuY3Rpb24oaW50IGkpIHt9CisKK3Rlc3QoKSB7CisgIHZvaWQgbG9jYWxGdW5jdGlvbihpbnQgaSkge30KKworCisKKworCisKKworCisKKworCit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF9jYXN0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludmFsaWRfY2FzdF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiNzc0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludmFsaWRfY2FzdF90ZXN0LmRhcnQKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitjbGFzcyBDIHsKKyAgQygpOworICBmYWN0b3J5IEMuZmFjdCgpID0+IEQoKTsKKyAgZmFjdG9yeSBDLmZhY3QyKCkgPSBEOworICBDLm5vbkZhY3QoKTsKKyAgQy5ub25GYWN0MigpIDogdGhpcy5ub25GYWN0KCk7CisgIHN0YXRpYyB2b2lkIHN0YXRpY0Z1bmN0aW9uKGludCBpKSB7fQorfQorCitjbGFzcyBEIGV4dGVuZHMgQyB7fQorCit2b2lkIHRvcExldmVsRnVuY3Rpb24oaW50IGkpIHt9CisKK3Rlc3QoKSB7CisgIHZvaWQgbG9jYWxGdW5jdGlvbihpbnQgaSkge30KKyAgTGlzdDxpbnQ+IGEgPSA8T2JqZWN0PltdOworICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0xpc3Q8T2JqZWN0PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdMaXN0PGludD4nLgorICBNYXA8aW50LCBTdHJpbmc+IGIgPSA8T2JqZWN0LCBTdHJpbmc+e307CisgIC8vICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnTWFwPE9iamVjdCwgU3RyaW5nPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdNYXA8aW50LCBTdHJpbmc+Jy4KKyAgTWFwPGludCwgU3RyaW5nPiBjID0gPGludCwgT2JqZWN0Pnt9OworICAvLyAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ01hcDxpbnQsIE9iamVjdD4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnTWFwPGludCwgU3RyaW5nPicuCisgIGludCBGdW5jdGlvbihPYmplY3QpIGQgPSAoaW50IGkpID0+IGk7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ2ludCBGdW5jdGlvbihpbnQpJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ2ludCBGdW5jdGlvbihPYmplY3QpJy4KKyAgRCBlID0gbmV3IEMuZmFjdCgpIGFzIEQ7CisgIEQgZiA9IG5ldyBDLmZhY3QyKCkgYXMgRDsKKyAgRCBnID0gbmV3IEMubm9uRmFjdCgpOworICAvLyAgICBeXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyAgICAgICAgXgorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0MnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRCcuCisgIEQgaCA9IG5ldyBDLm5vbkZhY3QyKCk7CisgIC8vICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyAgICAgICAgXgorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0MnIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRCcuCisgIHZvaWQgRnVuY3Rpb24oT2JqZWN0KSBpID0gQy5zdGF0aWNGdW5jdGlvbjsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICd2b2lkIEZ1bmN0aW9uKGludCknIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAndm9pZCBGdW5jdGlvbihPYmplY3QpJy4KKyAgdm9pZCBGdW5jdGlvbihPYmplY3QpIGogPSB0b3BMZXZlbEZ1bmN0aW9uOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ3ZvaWQgRnVuY3Rpb24oaW50KScgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICd2b2lkIEZ1bmN0aW9uKE9iamVjdCknLgorICB2b2lkIEZ1bmN0aW9uKE9iamVjdCkgayA9IGxvY2FsRnVuY3Rpb247CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAndm9pZCBGdW5jdGlvbihpbnQpJyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ3ZvaWQgRnVuY3Rpb24oT2JqZWN0KScuCit9CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF90eXBlX2FyZ3VtZW50X2NvdW50X3J1bnRpbWVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52YWxpZF90eXBlX2FyZ3VtZW50X2NvdW50X3J1bnRpbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTU5YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZhbGlkX3R5cGVfYXJndW1lbnRfY291bnRfcnVudGltZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NCBAQAorLy8gVE9ETyhtdWx0aXRlc3QpOiBUaGlzIHdhcyBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVkIGZyb20gYSBtdWx0aXRlc3QgYW5kIG1heQorLy8gY29udGFpbiBzdHJhbmdlIG9yIGRlYWQgY29kZS4KKworLy8gQ29weXJpZ2h0IChjKSAyMDE4LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0IHRvcCBsZXZlbCBmaWVsZC4KK2R5bmFtaWMgLy8gRm9ybWF0dGVyIHNob3VsZG4ndCBqb2luIHRoaXMgbGluZS4KKworICAgIHgxID0gNDI7CisKK2NsYXNzIEZvbyB7CisgIC8vIFRlc3QgY2xhc3MgbWVtYmVyLgorICBkeW5hbWljIC8vIEZvcm1hdHRlciBzaG91bGRuJ3Qgam9pbiB0aGlzIGxpbmUuCisKKyAgICAgIHgyID0gNDI7CisKKyAgRm9vKCkgeworICAgIHByaW50KHgyKTsKKyAgfQorfQorCittYWluKCkgeworICBwcmludCh4MSk7CisKKyAgbmV3IEZvbygpOworCisgIC8vIFRlc3QgbG9jYWwgdmFyaWFibGUuCisgIGR5bmFtaWMgLy8gRm9ybWF0dGVyIHNob3VsZG4ndCBqb2luIHRoaXMgbGluZS4KKworICAgICAgeDMgPSA0MjsKKyAgcHJpbnQoeDMpOworCisgIGZvbyg0Mik7Cit9CisKKy8vIFRlc3QgcGFyYW1ldGVyLgordm9pZCBmb28oCisgICAgZHluYW1pYyAvLyBGb3JtYXR0ZXIgc2hvdWxkbid0IGpvaW4gdGhpcyBsaW5lLgorCisgICAgICAgIHg0KSB7CisgIHByaW50KHg0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludmFsaWRfdHlwZV9hcmd1bWVudF9jb3VudF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZhbGlkX3R5cGVfYXJndW1lbnRfY291bnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZhbGlkX3R5cGVfYXJndW1lbnRfY291bnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdCB0b3AgbGV2ZWwgZmllbGQuCitkeW5hbWljPGludD4geDEgPSA0MjsKKy8vIFtlcnJvciBsaW5lIDYsIGNvbHVtbiAxLCBsZW5ndGggMTJdCisvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTCisvLyBbY2ZlXSBFeHBlY3RlZCAwIHR5cGUgYXJndW1lbnRzLgorCitjbGFzcyBGb28geworICAvLyBUZXN0IGNsYXNzIG1lbWJlci4KKyAgZHluYW1pYzxpbnQ+IHgyID0gNDI7CisvLyBbZXJyb3IgbGluZSAxMywgY29sdW1uIDMsIGxlbmd0aCAxMl0KKy8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5XUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFMKKy8vIFtjZmVdIEV4cGVjdGVkIDAgdHlwZSBhcmd1bWVudHMuCisKKyAgRm9vKCkgeworICAgIHByaW50KHgyKTsKKyAgfQorfQorCittYWluKCkgeworICBwcmludCh4MSk7CisKKyAgbmV3IEZvbygpOworCisgIC8vIFRlc3QgbG9jYWwgdmFyaWFibGUuCisgIGR5bmFtaWM8aW50PiB4MyA9IDQyOworLy8gW2Vycm9yIGxpbmUgMjksIGNvbHVtbiAzLCBsZW5ndGggMTJdCisvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTCisvLyBbY2ZlXSBFeHBlY3RlZCAwIHR5cGUgYXJndW1lbnRzLgorICBwcmludCh4Myk7CisKKyAgZm9vKDQyKTsKK30KKworLy8gVGVzdCBwYXJhbWV0ZXIuCit2b2lkIGZvbyhkeW5hbWljPGludD4geDQpIHsKKy8vIFtlcnJvciBsaW5lIDM5LCBjb2x1bW4gMTAsIGxlbmd0aCAxMl0KKy8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5XUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFMKKy8vIFtjZmVdIEV4cGVjdGVkIDAgdHlwZSBhcmd1bWVudHMuCisgIHByaW50KHg0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludm9jYXRpb25fbWlycm9yMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZvY2F0aW9uX21pcnJvcjJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzZmYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZvY2F0aW9uX21pcnJvcjJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEMgeworICBsYXRlIEludm9jYXRpb24gaW07CisgIG5vU3VjaE1ldGhvZChpbSkgPT4gdGhpcy5pbSA9IGltOworICBmbGlmKCkge30KK30KKworbWFpbigpIHsKKyAgZHluYW1pYyBjID0gbmV3IEMoKTsKKyAgYy5mbGlmID0gNDI7CisgIEV4cGVjdC5lcXVhbHMoY29uc3QgU3ltYm9sKCJmbGlmPSIpLCBjLmltLm1lbWJlck5hbWUpOworICBFeHBlY3QuZXF1YWxzKDQyLCBjLmltLnBvc2l0aW9uYWxBcmd1bWVudHNbMF0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52b2NhdGlvbl9taXJyb3JfZW1wdHlfYXJndW1lbnRzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludm9jYXRpb25fbWlycm9yX2VtcHR5X2FyZ3VtZW50c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4NjYyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2ludm9jYXRpb25fbWlycm9yX2VtcHR5X2FyZ3VtZW50c190ZXN0LmRhcnQKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gVmFsaWRhdGVzIHRoYXQgcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIGFuIGVtcHR5IGltbXV0YWJsZSBsaXN0Lgordm9pZCBleHBlY3RFbXB0eVBvc2l0aW9uYWxBcmd1bWVudHMoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CisgIEV4cGVjdC5pc1RydWUoaW52b2NhdGlvbi5wb3NpdGlvbmFsQXJndW1lbnRzLmlzRW1wdHkpOworICBFeHBlY3QudGhyb3dzVW5zdXBwb3J0ZWRFcnJvcigoKSA9PiBpbnZvY2F0aW9uLnBvc2l0aW9uYWxBcmd1bWVudHMuY2xlYXIoKSk7Cit9CisKKy8vIFZhbGlkYXRlcyB0aGF0IHBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSBhbiBlbXB0eSBpbW11dGFibGUgbWFwLgordm9pZCBleHBlY3RFbXB0eU5hbWVkQXJndW1lbnRzKEludm9jYXRpb24gaW52b2NhdGlvbikgeworICBFeHBlY3QuaXNUcnVlKGludm9jYXRpb24ubmFtZWRBcmd1bWVudHMuaXNFbXB0eSk7CisgIEV4cGVjdC50aHJvd3NVbnN1cHBvcnRlZEVycm9yKCgpID0+IGludm9jYXRpb24ubmFtZWRBcmd1bWVudHMuY2xlYXIoKSk7Cit9CisKK2NsYXNzIEdldHRlciB7CisgIGdldCBnZXR0ZXJUaGF0RG9lc05vdEV4aXN0OworCisgIG5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpbnZvY2F0aW9uLmlzR2V0dGVyKTsKKyAgICBleHBlY3RFbXB0eVBvc2l0aW9uYWxBcmd1bWVudHMoaW52b2NhdGlvbik7CisgICAgZXhwZWN0RW1wdHlOYW1lZEFyZ3VtZW50cyhpbnZvY2F0aW9uKTsKKyAgfQorfQorCitjbGFzcyBTZXR0ZXIgeworICBzZXQgc2V0dGVyVGhhdERvZXNOb3RFeGlzdCh2YWx1ZSk7CisKKyAgbm9TdWNoTWV0aG9kKGludm9jYXRpb24pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGludm9jYXRpb24uaXNTZXR0ZXIpOworICAgIGV4cGVjdEVtcHR5TmFtZWRBcmd1bWVudHMoaW52b2NhdGlvbik7CisgIH0KK30KKworY2xhc3MgTWV0aG9kIHsKKyAgbWV0aG9kVGhhdERvZXNOb3RFeGlzdCgpOworCisgIG5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpbnZvY2F0aW9uLmlzTWV0aG9kKTsKKyAgICBleHBlY3RFbXB0eVBvc2l0aW9uYWxBcmd1bWVudHMoaW52b2NhdGlvbik7CisgICAgZXhwZWN0RW1wdHlOYW1lZEFyZ3VtZW50cyhpbnZvY2F0aW9uKTsKKyAgfQorfQorCitjbGFzcyBPcGVyYXRvciB7CisgIG9wZXJhdG9yICsob3RoZXIpOworCisgIG5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpbnZvY2F0aW9uLmlzTWV0aG9kKTsKKyAgICBleHBlY3RFbXB0eU5hbWVkQXJndW1lbnRzKGludm9jYXRpb24pOworICB9Cit9CisKK21haW4oKSB7CisgIHZhciBnID0gbmV3IEdldHRlcigpOworICBwcmludChnLmdldHRlclRoYXREb2VzTm90RXhpc3QpOworICB2YXIgcyA9IG5ldyBTZXR0ZXIoKTsKKyAgcHJpbnQocy5zZXR0ZXJUaGF0RG9lc05vdEV4aXN0ID0gNDIpOworICB2YXIgbSA9IG5ldyBNZXRob2QoKTsKKyAgcHJpbnQobS5tZXRob2RUaGF0RG9lc05vdEV4aXN0KCkpOworICB2YXIgbyA9IG5ldyBPcGVyYXRvcigpOworICBwcmludChvICsgNDIpOyAvLyBPcGVyYXRvciB0aGF0IGRvZXMgbm90IGV4aXN0LgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52b2NhdGlvbl9taXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvaW52b2NhdGlvbl9taXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9pbnZvY2F0aW9uX21pcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwzMTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKKy8vIEludm9jYXRpb24gYW5kIG5vU3VjaE1ldGhvZCB0ZXN0aW5nLgorCitNYXA8U3ltYm9sLCBkeW5hbWljPiBsaXN0VG9OYW1lZEFyZ3VtZW50cyhsaXN0KSB7CisgIHZhciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3I7CisgIHZhciByZXN1bHQgPSBuZXcgTWFwPFN5bWJvbCwgZHluYW1pYz4oKTsKKyAgd2hpbGUgKGl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICBTeW1ib2wga2V5ID0gaXRlcmF0b3IuY3VycmVudDsKKyAgICBFeHBlY3QuaXNUcnVlKGl0ZXJhdG9yLm1vdmVOZXh0KCkpOworICAgIHJlc3VsdFtrZXldID0gaXRlcmF0b3IuY3VycmVudDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiogQ2xhc3Mgd2l0aCBub1N1Y2hNZXRob2QgdGhhdCByZXR1cm5zIHRoZSBtaXJyb3IgKi8KK2NsYXNzIE4geworICAvLyBTdG9yYWdlIGZvciB0aGUgbGFzdCBhcmd1bWVudCB0byBub1N1Y2hNZXRob2QuCisgIC8vIE5lZWRlZCBmb3Igc2V0dGVycywgd2hpY2ggZG9uJ3QgZXZhbHVhdGUgdG8gdGhlIHJldHVybiB2YWx1ZS4KKyAgdmFyIGxhc3Q7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIG0pID0+IGxhc3QgPSBtOworCisgIGZsaWYoaW50IHgpIHsKKyAgICBFeHBlY3QuZmFpbCgibmV2ZXIgZ2V0IGhlcmUiKTsKKyAgfQorCisgIGZsYWYoW2ludCB4ID0gLTFdKSB7CisgICAgRXhwZWN0LmZhaWwoIm5ldmVyIGdldCBoZXJlIik7CisgIH0KKworICBmbG9mKHtpbnQgeSA9IC0xfSkgeworICAgIEV4cGVjdC5mYWlsKCJuZXZlciBnZXQgaGVyZSIpOworICB9CisKKyAgZ2V0IHd1dCA9PiB0aGlzOworICBmaW5hbCBpbnQgcGxpZiA9IDk5OworICBpbnQgZ2V0IHBsYWYgeworICAgIEV4cGVjdC5mYWlsKCJuZXZlciBnZXQgaGVyZSIpOworICAgIHJldHVybiAwOworICB9Cit9CisKKy8qKiBBcyBbTl0gYnV0IGFsc28gaW1wbGVtZW50cyAnY2FsbCcsIHNvIHdlIGNhbiBjYWxsIGl0IHdpdGggd3JvbmcgYXJndW1lbnRzLiovCitjbGFzcyBDIGV4dGVuZHMgTiB7CisgIGNhbGwoaW50IHgpIHsKKyAgICBFeHBlY3QuZmFpbCgibmV2ZXIgZ2V0IGhlcmUiKTsKKyAgfQorfQorCisvKioKKyAqIENoZWNrcyB0aGUgZGF0YSBvZiBhbiBJbnZvY2F0aW9uLgorICoKKyAqIENhbGwgd2l0aG91dCBvcHRpb25hbHMgZm9yIGdldHRlcnMsIHdpdGggb25seSBwb3NpdGlvbmFsIGZvciBzZXR0ZXJzLAorICogYW5kIHdpdGggYm90aCBvcHRpb25hbHMgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKyAqLwordGVzdEludm9jYXRpb25NaXJyb3IoSW52b2NhdGlvbiBpbSwgU3ltYm9sIG5hbWUsCisgICAgW0xpc3Q/IHBvc2l0aW9uYWwsIExpc3Q/IG5hbWVkLCBMaXN0PyB0eXBlQXJnc10pIHsKKyAgRXhwZWN0LmlzVHJ1ZShpbSBpcyBJbnZvY2F0aW9uLCAiaXMgSW52b2NhdGlvbiIpOworICBFeHBlY3QuZXF1YWxzKG5hbWUsIGltLm1lbWJlck5hbWUsICJuYW1lIik7CisgIGlmIChuYW1lZCA9PSBudWxsKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpbS5pc0FjY2Vzc29yLCAiJG5hbWU6aXNBY2Nlc3NvciIpOworICAgIEV4cGVjdC5pc0ZhbHNlKGltLmlzTWV0aG9kLCAiJG5hbWU6aXNNZXRob2QiKTsKKyAgICBpZiAocG9zaXRpb25hbCA9PSBudWxsKSB7CisgICAgICBFeHBlY3QuaXNUcnVlKGltLmlzR2V0dGVyLCAiJG5hbWU6aXNHZXR0ZXIiKTsKKyAgICAgIEV4cGVjdC5pc0ZhbHNlKGltLmlzU2V0dGVyLCAiJG5hbWU6aXNTZXR0ZXIiKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMCwgaW0ucG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGgsICIkbmFtZTojcG9zaXRpb25hbCIpOworICAgICAgRXhwZWN0LmVxdWFscygwLCBpbS5uYW1lZEFyZ3VtZW50cy5sZW5ndGgsICIkbmFtZTojbmFtZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRXhwZWN0LmlzVHJ1ZShpbS5pc1NldHRlciwgIiRuYW1lOmlzU2V0dGVyIik7CisgICAgRXhwZWN0LmlzRmFsc2UoaW0uaXNHZXR0ZXIsICIkbmFtZTppc0dldHRlciIpOworICAgIEV4cGVjdC5lcXVhbHMoMSwgaW0ucG9zaXRpb25hbEFyZ3VtZW50cy5sZW5ndGgsICIkbmFtZTojcG9zaXRpb25hbCIpOworICAgIEV4cGVjdC5lcXVhbHMoCisgICAgICAgIHBvc2l0aW9uYWxbMF0sIGltLnBvc2l0aW9uYWxBcmd1bWVudHNbMF0sICIkbmFtZTpwb3NpdGlvbmFsWzBdIik7CisgICAgRXhwZWN0LmVxdWFscygwLCBpbS5uYW1lZEFyZ3VtZW50cy5sZW5ndGgsICIkbmFtZTojbmFtZWQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgTWFwPFN5bWJvbCwgZHluYW1pYz4gbmFtZWRBcmd1bWVudHMgPSBsaXN0VG9OYW1lZEFyZ3VtZW50cyhuYW1lZCk7CisgIEV4cGVjdC5pc1RydWUoaW0uaXNNZXRob2QsICIkbmFtZTppc01ldGhvZCIpOworICBFeHBlY3QuaXNGYWxzZShpbS5pc0FjY2Vzc29yLCAiJG5hbWU6aXNBY2Nlc3NvciIpOworICBFeHBlY3QuaXNGYWxzZShpbS5pc1NldHRlciwgIiRuYW1lOmlzU2V0dGVyIik7CisgIEV4cGVjdC5pc0ZhbHNlKGltLmlzR2V0dGVyLCAiJG5hbWU6aXNHZXR0ZXIiKTsKKworICBFeHBlY3QubGlzdEVxdWFscyhwb3NpdGlvbmFsISwgaW0ucG9zaXRpb25hbEFyZ3VtZW50cyk7CisKKyAgRXhwZWN0LmVxdWFscygKKyAgICAgIG5hbWVkQXJndW1lbnRzLmxlbmd0aCwgaW0ubmFtZWRBcmd1bWVudHMubGVuZ3RoLCAiJG5hbWU6I25hbWVkIik7CisgIG5hbWVkQXJndW1lbnRzLmZvckVhY2goKGssIHYpIHsKKyAgICBFeHBlY3QuaXNUcnVlKAorICAgICAgICBpbS5uYW1lZEFyZ3VtZW50cy5jb250YWluc0tleShrKSwgIiRuYW1lOj9uYW1lZEFyZ3VtZW50c1ska10iKTsKKyAgICBFeHBlY3QuZXF1YWxzKHYsIGltLm5hbWVkQXJndW1lbnRzW2tdLCAiJG5hbWU6bmFtZWRBcmd1bWVudHNbJGtdIik7CisgIH0pOworICB2YXIgaW1UeXBlQXJncyA9IChpbSBhcyBkeW5hbWljKS50eXBlQXJndW1lbnRzIGFzIExpc3Q8VHlwZT47CisgIEV4cGVjdC5saXN0RXF1YWxzKHR5cGVBcmdzID8/IFtdLCBpbVR5cGVBcmdzKTsKK30KKworLy8gVGVzdCBkaWZmZXJlbnQgd2F5cyB0aGF0IG5vU3VjaE1ldGhvZCBjYW4gYmUgY2FsbGVkLgordGVzdEludm9jYXRpb25NaXJyb3JzKCkgeworICBkeW5hbWljIG4gPSBuZXcgTigpOworICBkeW5hbWljIGMgPSBuZXcgQygpOworCisgIC8vIE1pc3NpbmcgcHJvcGVydHkvbWV0aG9kIGFjY2Vzcy4KKyAgdGVzdEludm9jYXRpb25NaXJyb3Iobi5iYXIsIGNvbnN0IFN5bWJvbCgnYmFyJykpOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigobi4uYmFyID0gNDIpLmxhc3QsIGNvbnN0IFN5bWJvbCgnYmFyPScpLCBbNDJdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3Iobi5iYXIoKSwgY29uc3QgU3ltYm9sKCdiYXInKSwgW10sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3Iobi5iYXIoNDIpLCBjb25zdCBTeW1ib2woJ2JhcicpLCBbNDJdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgbi5iYXIoeDogNDIpLCBjb25zdCBTeW1ib2woJ2JhcicpLCBbXSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgIG4uYmFyKDM3LCB4OiA0MiksIGNvbnN0IFN5bWJvbCgnYmFyJyksIFszN10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKworICAvLyBNaXNzaW5nIG9wZXJhdG9yIGFjY2Vzcy4KKyAgdGVzdEludm9jYXRpb25NaXJyb3IobiArIDQsIGNvbnN0IFN5bWJvbCgnKycpLCBbNF0sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IobiAtIDQsIGNvbnN0IFN5bWJvbCgnLScpLCBbNF0sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoLW4sIGNvbnN0IFN5bWJvbCgndW5hcnktJyksIFtdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKG5bNDJdLCBjb25zdCBTeW1ib2woJ1tdJyksIFs0Ml0sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoKG4uLlszN10gPSA0MikubGFzdCwgY29uc3QgU3ltYm9sKCdbXT0nKSwgWzM3LCA0Ml0sIFtdKTsKKworICAvLyBDYWxsaW5nIGFzIGZ1bmN0aW9uIHdoZW4gaXQncyBub3QuCisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKG4oKSwgY29uc3QgU3ltYm9sKCdjYWxsJyksIFtdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKG4oNDIpLCBjb25zdCBTeW1ib2woJ2NhbGwnKSwgWzQyXSwgW10pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgIG4oeDogNDIpLCBjb25zdCBTeW1ib2woJ2NhbGwnKSwgW10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoCisgICAgICBuKDM3LCB4OiA0MiksIGNvbnN0IFN5bWJvbCgnY2FsbCcpLCBbMzddLCBbY29uc3QgU3ltYm9sKCJ4IiksIDQyXSk7CisKKyAgLy8gQ2FsbGluZyB3aXRoIGFyZ3VtZW50cyBub3QgbWF0Y2hpbmcgZXhpc3RpbmcgY2FsbCBtZXRob2QuCisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKGMoKSwgY29uc3QgU3ltYm9sKCdjYWxsJyksIFtdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKGMoMzcsIDQyKSwgY29uc3QgU3ltYm9sKCdjYWxsJyksIFszNywgNDJdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgYyh4OiA0MiksIGNvbnN0IFN5bWJvbCgnY2FsbCcpLCBbXSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgIGMoMzcsIHg6IDQyKSwgY29uc3QgU3ltYm9sKCdjYWxsJyksIFszN10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKworICAvLyBXcm9uZyBhcmd1bWVudHMgdG8gZXhpc3RpbmcgZnVuY3Rpb24uCisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKG4uZmxpZigpLCBjb25zdCBTeW1ib2woImZsaWYiKSwgW10sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3Iobi5mbGlmKDM3LCA0MiksIGNvbnN0IFN5bWJvbCgiZmxpZiIpLCBbMzcsIDQyXSwgW10pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgIG4uZmxpZih4OiA0MiksIGNvbnN0IFN5bWJvbCgiZmxpZiIpLCBbXSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgIG4uZmxpZigzNywgeDogNDIpLCBjb25zdCBTeW1ib2woImZsaWYiKSwgWzM3XSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigobi4uZmxpZiA9IDQyKS5sYXN0LCBjb25zdCBTeW1ib2woImZsaWY9IiksIFs0Ml0pOworCisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKG4uZmxhZigzNywgNDIpLCBjb25zdCBTeW1ib2woImZsYWYiKSwgWzM3LCA0Ml0sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoCisgICAgICBuLmZsYWYoeDogNDIpLCBjb25zdCBTeW1ib2woImZsYWYiKSwgW10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoCisgICAgICBuLmZsYWYoMzcsIHg6IDQyKSwgY29uc3QgU3ltYm9sKCJmbGFmIiksIFszN10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoKG4uLmZsYWYgPSA0MikubGFzdCwgY29uc3QgU3ltYm9sKCJmbGFmPSIpLCBbNDJdKTsKKworICB0ZXN0SW52b2NhdGlvbk1pcnJvcihuLmZsb2YoMzcsIDQyKSwgY29uc3QgU3ltYm9sKCJmbG9mIiksIFszNywgNDJdLCBbXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgbi5mbG9mKHg6IDQyKSwgY29uc3QgU3ltYm9sKCJmbG9mIiksIFtdLCBbY29uc3QgU3ltYm9sKCJ4IiksIDQyXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgbi5mbG9mKDM3LCB5OiA0MiksIGNvbnN0IFN5bWJvbCgiZmxvZiIpLCBbMzddLCBbY29uc3QgU3ltYm9sKCJ5IiksIDQyXSk7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKChuLi5mbG9mID0gNDIpLmxhc3QsIGNvbnN0IFN5bWJvbCgiZmxvZj0iKSwgWzQyXSk7CisKKyAgLy8gUmVhZGluZyB3b3Jrcy4KKyAgRXhwZWN0LmlzVHJ1ZShuLmZsaWYgaXMgRnVuY3Rpb24pOworICBFeHBlY3QuaXNUcnVlKG4uZmxhZiBpcyBGdW5jdGlvbik7CisgIEV4cGVjdC5pc1RydWUobi5mbG9mIGlzIEZ1bmN0aW9uKTsKKworICAvLyBXcml0aW5nIHRvIHJlYWQtb25seSBmaWVsZHMuCisgIHRlc3RJbnZvY2F0aW9uTWlycm9yKChuLi53dXQgPSA0MikubGFzdCwgY29uc3QgU3ltYm9sKCJ3dXQ9IiksIFs0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigobi4ucGxpZiA9IDQyKS5sYXN0LCBjb25zdCBTeW1ib2woInBsaWY9IiksIFs0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcigobi4ucGxhZiA9IDQyKS5sYXN0LCBjb25zdCBTeW1ib2woInBsYWY9IiksIFs0Ml0pOworCisgIC8vIFRyaWNrIGNhbGwgdG8gbi5jYWxsIC0gd3V0IGlzIGEgZ2V0dGVyIHJldHVybmluZyBuIGFnYWluLgorICB0ZXN0SW52b2NhdGlvbk1pcnJvcihuLnd1dCg0MiksIGNvbnN0IFN5bWJvbCgiY2FsbCIpLCBbNDJdLCBbXSk7CisKKyAgLy8gQ2FsbGluZyBub1N1Y2hNZXRob2QgaXRzZWxmLCBiYWRseS4KKyAgdGVzdEludm9jYXRpb25NaXJyb3Iobi5ub1N1Y2hNZXRob2QoKSwgY29uc3QgU3ltYm9sKCJub1N1Y2hNZXRob2QiKSwgW10sIFtdKTsKKyAgdGVzdEludm9jYXRpb25NaXJyb3IoCisgICAgICBuLm5vU3VjaE1ldGhvZCgzNywgNDIpLCBjb25zdCBTeW1ib2woIm5vU3VjaE1ldGhvZCIpLCBbMzcsIDQyXSwgW10pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcihuLm5vU3VjaE1ldGhvZCgzNywgeDogNDIpLCBjb25zdCBTeW1ib2woIm5vU3VjaE1ldGhvZCIpLAorICAgICAgWzM3XSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICB0ZXN0SW52b2NhdGlvbk1pcnJvcihuLm5vU3VjaE1ldGhvZCh4OiA0MiksIGNvbnN0IFN5bWJvbCgibm9TdWNoTWV0aG9kIiksIFtdLAorICAgICAgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworCisgIC8vIENsb3N1cml6aW5nIGEgbWV0aG9kIG1lYW5zIHRoYXQgY2FsbGluZyBpdCBiYWRseSB3aWxsIG5vdCBoaXQgdGhlCisgIC8vIG9yaWdpbmFsIHJlY2VpdmVycyBub1N1Y2hNZXRob2QsIG9ubHkgdGhlIG9uZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QKKyAgLy8gYnkgdGhlIGNsb3N1cmUgb2JqZWN0LgorICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgeworICAgIHZhciB4ID0gbi5mbGlmOworICAgIHgoMzcsIDQyKTsKKyAgfSk7CisgIEV4cGVjdC50aHJvd3NOb1N1Y2hNZXRob2RFcnJvcigoKSB7CisgICAgdmFyIHggPSBjLmNhbGw7CisgICAgeCgzNywgNDIpOworICB9KTsKK30KKworY2xhc3MgTSBleHRlbmRzIE4geworICB0ZXN0U2VsZkNhbGxzKCkgeworICAgIC8vIE1pc3NpbmcgcHJvcGVydHkvbWV0aG9kIGFjY2Vzcy4KKyAgICBkeW5hbWljIHNlbGYgPSB0aGlzOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYuYmFyLCBjb25zdCBTeW1ib2woJ2JhcicpKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigoKSB7CisgICAgICBzZWxmLmJhciA9IDQyOworICAgICAgcmV0dXJuIGxhc3Q7CisgICAgfSgpLCBjb25zdCBTeW1ib2woJ2Jhcj0nKSwgWzQyXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3Ioc2VsZi5iYXIoKSwgY29uc3QgU3ltYm9sKCdiYXInKSwgW10sIFtdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmLmJhcig0MiksIGNvbnN0IFN5bWJvbCgnYmFyJyksIFs0Ml0sIFtdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgICAgc2VsZi5iYXIoeDogNDIpLCBjb25zdCBTeW1ib2woJ2JhcicpLCBbXSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYuYmFyKDM3LCB4OiA0MiksIGNvbnN0IFN5bWJvbCgnYmFyJyksIFszN10sCisgICAgICAgIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKworICAgIC8vIE1pc3Npbmcgb3BlcmF0b3IgYWNjZXNzLgorICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYgKyA0LCBjb25zdCBTeW1ib2woJysnKSwgWzRdLCBbXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3Ioc2VsZiAtIDQsIGNvbnN0IFN5bWJvbCgnLScpLCBbNF0sIFtdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigtc2VsZiwgY29uc3QgU3ltYm9sKCd1bmFyeS0nKSwgW10sIFtdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmWzQyXSwgY29uc3QgU3ltYm9sKCdbXScpLCBbNDJdLCBbXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3IoKCkgeworICAgICAgc2VsZlszN10gPSA0MjsKKyAgICAgIHJldHVybiBsYXN0OworICAgIH0oKSwgY29uc3QgU3ltYm9sKCdbXT0nKSwgWzM3LCA0Ml0sIFtdKTsKKworICAgIC8vIFdyb25nIGFyZ3VtZW50cyB0byBleGlzdGluZyBmdW5jdGlvbi4KKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmLmZsaWYoKSwgY29uc3QgU3ltYm9sKCJmbGlmIiksIFtdLCBbXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3Ioc2VsZi5mbGlmKDM3LCA0MiksIGNvbnN0IFN5bWJvbCgiZmxpZiIpLCBbMzcsIDQyXSwgW10pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgICBzZWxmLmZsaWYoeDogNDIpLCBjb25zdCBTeW1ib2woImZsaWYiKSwgW10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmLmZsaWYoMzcsIHg6IDQyKSwgY29uc3QgU3ltYm9sKCJmbGlmIiksIFszN10sCisgICAgICAgIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigoKSB7CisgICAgICBzZWxmLmZsaWYgPSA0MjsKKyAgICAgIHJldHVybiBsYXN0OworICAgIH0oKSwgY29uc3QgU3ltYm9sKCJmbGlmPSIpLCBbNDJdKTsKKworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYuZmxhZigzNywgNDIpLCBjb25zdCBTeW1ib2woImZsYWYiKSwgWzM3LCA0Ml0sIFtdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigKKyAgICAgICAgc2VsZi5mbGFmKHg6IDQyKSwgY29uc3QgU3ltYm9sKCJmbGFmIiksIFtdLCBbY29uc3QgU3ltYm9sKCJ4IiksIDQyXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3Ioc2VsZi5mbGFmKDM3LCB4OiA0MiksIGNvbnN0IFN5bWJvbCgiZmxhZiIpLCBbMzddLAorICAgICAgICBbY29uc3QgU3ltYm9sKCJ4IiksIDQyXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3IoKCkgeworICAgICAgc2VsZi5mbGFmID0gNDI7CisgICAgICByZXR1cm4gbGFzdDsKKyAgICB9KCksIGNvbnN0IFN5bWJvbCgiZmxhZj0iKSwgWzQyXSk7CisKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmLmZsb2YoMzcsIDQyKSwgY29uc3QgU3ltYm9sKCJmbG9mIiksIFszNywgNDJdLCBbXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3IoCisgICAgICAgIHNlbGYuZmxvZih4OiA0MiksIGNvbnN0IFN5bWJvbCgiZmxvZiIpLCBbXSwgW2NvbnN0IFN5bWJvbCgieCIpLCA0Ml0pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYuZmxvZigzNywgeTogNDIpLCBjb25zdCBTeW1ib2woImZsb2YiKSwgWzM3XSwKKyAgICAgICAgW2NvbnN0IFN5bWJvbCgieSIpLCA0Ml0pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKCgpIHsKKyAgICAgIHNlbGYuZmxvZiA9IDQyOworICAgICAgcmV0dXJuIGxhc3Q7CisgICAgfSgpLCBjb25zdCBTeW1ib2woImZsb2Y9IiksIFs0Ml0pOworCisgICAgLy8gUmVhZGluZyB3b3Jrcy4KKyAgICBFeHBlY3QuaXNUcnVlKHNlbGYuZmxpZiBpcyBGdW5jdGlvbik7CisgICAgRXhwZWN0LmlzVHJ1ZShzZWxmLmZsYWYgaXMgRnVuY3Rpb24pOworICAgIEV4cGVjdC5pc1RydWUoc2VsZi5mbG9mIGlzIEZ1bmN0aW9uKTsKKworICAgIC8vIFdyaXRpbmcgdG8gcmVhZC1vbmx5IGZpZWxkcy4KKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcigoKSB7CisgICAgICBzZWxmLnd1dCA9IDQyOworICAgICAgcmV0dXJuIGxhc3Q7CisgICAgfSgpLCBjb25zdCBTeW1ib2woInd1dD0iKSwgWzQyXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3IoKCkgeworICAgICAgc2VsZi5wbGlmID0gNDI7CisgICAgICByZXR1cm4gbGFzdDsKKyAgICB9KCksIGNvbnN0IFN5bWJvbCgicGxpZj0iKSwgWzQyXSk7CisgICAgdGVzdEludm9jYXRpb25NaXJyb3IoKCkgeworICAgICAgc2VsZi5wbGFmID0gNDI7CisgICAgICByZXR1cm4gbGFzdDsKKyAgICB9KCksIGNvbnN0IFN5bWJvbCgicGxhZj0iKSwgWzQyXSk7CisKKyAgICAvLyBDYWxsaW5nIG5vU3VjaE1ldGhvZCBpdHNlbGYsIGJhZGx5LgorICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgICBzZWxmLm5vU3VjaE1ldGhvZCgpLCBjb25zdCBTeW1ib2woIm5vU3VjaE1ldGhvZCIpLCBbXSwgW10pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKAorICAgICAgICBzZWxmLm5vU3VjaE1ldGhvZCgzNywgNDIpLCBjb25zdCBTeW1ib2woIm5vU3VjaE1ldGhvZCIpLCBbMzcsIDQyXSwgW10pOworICAgIHRlc3RJbnZvY2F0aW9uTWlycm9yKHNlbGYubm9TdWNoTWV0aG9kKDM3LCB4OiA0MiksCisgICAgICAgIGNvbnN0IFN5bWJvbCgibm9TdWNoTWV0aG9kIiksIFszN10sIFtjb25zdCBTeW1ib2woIngiKSwgNDJdKTsKKyAgICB0ZXN0SW52b2NhdGlvbk1pcnJvcihzZWxmLm5vU3VjaE1ldGhvZCh4OiA0MiksIGNvbnN0IFN5bWJvbCgibm9TdWNoTWV0aG9kIiksCisgICAgICAgIFtdLCBbY29uc3QgU3ltYm9sKCJ4IiksIDQyXSk7CisKKyAgICAvLyBDbG9zdXJpemluZyBhIG1ldGhvZCBtZWFucyB0aGF0IGNhbGxpbmcgaXQgYmFkbHkgd2lsbCBub3QgaGl0IHRoZQorICAgIC8vIG9yaWdpbmFsIHJlY2VpdmVycyBub1N1Y2hNZXRob2QsIG9ubHkgdGhlIG9uZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QKKyAgICAvLyBieSB0aGUgY2xvc3VyZSBvYmplY3QuCisgICAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpIHsKKyAgICAgIHZhciB4ID0gc2VsZi5mbGlmOworICAgICAgeCgzNywgNDIpOworICAgIH0pOworICB9Cit9CisKKy8vIFRlc3QgdGhlIE5vU3VjaE1ldGhvZEVycm9yIHRocm93biBieSBkaWZmZXJlbnQgaW5jb3JyZWN0IGNhbGxzLgordGVzdE5vU3VjaE1ldGhvZEVycm9ycygpIHsKKyAgZHluYW1pYyBuID0gbmV3IE4oKTsKKyAgZHluYW1pYyBvID0gbmV3IE9iamVjdCgpOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gby5iYXIpOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gby5iYXIgPSA0Mik7CisgIEV4cGVjdC50aHJvd3NOb1N1Y2hNZXRob2RFcnJvcigoKSA9PiBvLmJhcigpKTsKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IG8gKyAyKTsKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IC1vKTsKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IG9bMF0pOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gb1swXSA9IDQyKTsKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IG8oKSk7CisgIEV4cGVjdC50aHJvd3NOb1N1Y2hNZXRob2RFcnJvcigoKSA9PiBvLnRvU3RyaW5nID0gNDIpOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gby50b1N0cmluZyg0MikpOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gby50b1N0cmluZyh4OiAzNykpOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gby5oYXNoQ29kZSA9IDQyKTsKKyAgRXhwZWN0LnRocm93c05vU3VjaE1ldGhvZEVycm9yKCgpID0+IChuLmZsaWYpKCkpOyAvLyBFeHRyYWN0ZWQgbWV0aG9kIGhhcyBubyBub1N1Y2hNZXRob2QuCit9CisKK21haW4oKSB7CisgIHRlc3RJbnZvY2F0aW9uTWlycm9ycygpOworICB0ZXN0Tm9TdWNoTWV0aG9kRXJyb3JzKCk7CisgIG5ldyBNKCkudGVzdFNlbGZDYWxscygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvanNfcHJvcGVydGllc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9qc19wcm9wZXJ0aWVzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNhNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvanNfcHJvcGVydGllc190ZXN0LmRhcnQKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCB0aGF0IEphdmFTY3JpcHQgcHJvcGVydGllcyBvbiBPYmplY3QgY2FuIHN0aWxsIGJlIGNsYXNzZXMgaW4KKy8vIERhcnQuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit2b2lkIG1haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyBfX2RlZmluZUdldHRlcl9fKCkuaGVsbG8oKSk7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyBfX2RlZmluZVNldHRlcl9fKCkuaGVsbG8oKSk7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyBfX2xvb2t1cEdldHRlcl9fKCkuaGVsbG8oKSk7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyBfX2xvb2t1cFNldHRlcl9fKCkuaGVsbG8oKSk7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyBjb25zdHJ1Y3RvcigpLmhlbGxvKCkpOworICBFeHBlY3QuZXF1YWxzKDQyLCBuZXcgaGFzT3duUHJvcGVydHkoKS5oZWxsbygpKTsKKyAgRXhwZWN0LmVxdWFscyg0MiwgbmV3IGlzUHJvdG90eXBlT2YoKS5oZWxsbygpKTsKKyAgRXhwZWN0LmVxdWFscyg0MiwgbmV3IHByb3BlcnR5SXNFbnVtZXJhYmxlKCkuaGVsbG8oKSk7CisgIEV4cGVjdC5lcXVhbHMoNDIsIG5ldyB0b0xvY2FsZVN0cmluZygpLmhlbGxvKCkpOworICBFeHBlY3QuZXF1YWxzKDQyLCBuZXcgdG9TdHJpbmcoKS5oZWxsbygpKTsKKyAgRXhwZWN0LmVxdWFscyg0MiwgbmV3IHZhbHVlT2YoKS5oZWxsbygpKTsKK30KKworY2xhc3MgSGVsbG8geworICBpbnQgaGVsbG8oKSA9PiA0MjsKK30KKworY2xhc3MgX19kZWZpbmVHZXR0ZXJfXyBleHRlbmRzIEhlbGxvIHt9CisKK2NsYXNzIF9fZGVmaW5lU2V0dGVyX18gZXh0ZW5kcyBIZWxsbyB7fQorCitjbGFzcyBfX2xvb2t1cEdldHRlcl9fIGV4dGVuZHMgSGVsbG8ge30KKworY2xhc3MgX19sb29rdXBTZXR0ZXJfXyBleHRlbmRzIEhlbGxvIHt9CisKK2NsYXNzIGNvbnN0cnVjdG9yIGV4dGVuZHMgSGVsbG8ge30KKworY2xhc3MgaGFzT3duUHJvcGVydHkgZXh0ZW5kcyBIZWxsbyB7fQorCitjbGFzcyBpc1Byb3RvdHlwZU9mIGV4dGVuZHMgSGVsbG8ge30KKworY2xhc3MgcHJvcGVydHlJc0VudW1lcmFibGUgZXh0ZW5kcyBIZWxsbyB7fQorCitjbGFzcyB0b0xvY2FsZVN0cmluZyBleHRlbmRzIEhlbGxvIHt9CisKK2NsYXNzIHRvU3RyaW5nIGV4dGVuZHMgSGVsbG8ge30KKworY2xhc3MgdmFsdWVPZiBleHRlbmRzIEhlbGxvIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9rZXl3b3JkX3R5cGVfZXhwcmVzc2lvbl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9rZXl3b3JkX3R5cGVfZXhwcmVzc2lvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5ODFlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2tleXdvcmRfdHlwZV9leHByZXNzaW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdGhhdCBhIGtleXdvcmQgY2FuJ3QgYmUgdXNlZCBhcyB0eXBlLiAgU2VydmVzIGFzIHJlZ3Jlc3Npb24gdGVzdCBmb3IKKy8vIGNyYXNoZXMgaW4gZGFydDJqcy4KKworaW4gZ3JlZXRpbmcgPSAiZmlzayI7IC8vIC8vIyAwMTogc3ludGF4IGVycm9yCisKK21haW4oCitpbiBncmVldGluZyAvLyAvLyMgMDI6IHN5bnRheCBlcnJvcgorICAgICkgeworICBpbiBncmVldGluZyA9ICJmaXNrIjsgLy8gLy8jIDAzOiBzeW50YXggZXJyb3IKKyAgcHJpbnQoZ3JlZXRpbmcpOyAvLyAvLyMgMDE6IGNvbnRpbnVlZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbGFyZ2VfaW1wbGljaXRfZ2V0dGVyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xhcmdlX2ltcGxpY2l0X2dldHRlcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0YTA2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xhcmdlX2ltcGxpY2l0X2dldHRlcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMzc1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBjb21waWxhdGlvbiBvZiBsYXJnZSBpbXBsaWNpdCBnZXR0ZXJzLgorLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwIC0tbm8tYmFja2dyb3VuZC1jb21waWxhdGlvbgorCitMaXN0PExpc3Q+IHBhbmVscyA9IFsKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2MDUwLjgzNzg5NzAyMTM3MV0sCisgIFs2OTUzLjI0MDAzOTIyNDc5NywgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA1ODg1LjIzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDU3MTkuNjM3ODk3MDIxMzcyXSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA1ODg1LjIzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDYwNTAuODM3ODk3MDIxMzcxXSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs2NjU1LjM0MDAzOTIyNDc5NywgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzE1MS44NDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3MTUxLjg0MDAzOTIyNDc5OCwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3MjUxLjE0MDAzOTIyNDc5OCwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzI1MS4xNDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzczNTAuNDQwMDM5MjI0Nzk4LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNzQ0OS43NDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzc1NDkuMDQwMDM5MjI0Nzk4LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3NTQ5LjA0MDAzOTIyNDc5OCwgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNzY0OC4zNDAwMzkyMjQ3OTksIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzU0OS4wNDAwMzkyMjQ3OTgsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzY0OC4zNDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzc0Ny42NDAwMzkyMjQ3OTksIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzg0Ni45NDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzc4NDYuOTQwMDM5MjI0Nzk5LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDcwNDQuNDM3ODk3MDIxMzY3NV0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNzIxMC4wMzc4OTcwMjEzNjddLAorICBbODE0NC44NDAwMzkyMjQ3OTk1LCA3Mzc1LjYzNzg5NzAyMTM2Nl0sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3Mzc1LjYzNzg5NzAyMTM2Nl0sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3MDQ0LjQzNzg5NzAyMTM2NzVdLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzc4NDYuOTQwMDM5MjI0Nzk5LCA3MjEwLjAzNzg5NzAyMTM2N10sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNzM3NS42Mzc4OTcwMjEzNjZdLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgxNDQuODQwMDM5MjI0Nzk5NSwgNzcwNi44Mzc4OTcwMjEzNjVdLAorICBbODI0NC4xNDAwMzkyMjQ4LCA3NTQxLjIzNzg5NzAyMTM2Nl0sCisgIFs4MzQzLjQ0MDAzOTIyNDgsIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgzNDMuNDQwMDM5MjI0OCwgNzcwNi44Mzc4OTcwMjEzNjVdLAorICBbODI0NC4xNDAwMzkyMjQ4LCA3NzA2LjgzNzg5NzAyMTM2NV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMjUwOS44OTc3NjgyMTQzMjM2XSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAyNjc1LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0MDQwLjQyMzg0MjY2MTk3NDUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDA0MC40MjM4NDI2NjE5NzQ1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDY4OC4yOTc3NjgyMTQzMjMxXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCA1MjIuNjk3NzY4MjE0MzIzMl0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzU3LjA5Nzc2ODIxNDMyMzI1XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzNTcuMDk3NzY4MjE0MzIzMjVdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDUyMi42OTc3NjgyMTQzMjMyXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCA2ODguMjk3NzY4MjE0MzIzMV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjY3NS40OTc3NjgyMTQzMjM1XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyNTA5Ljg5Nzc2ODIxNDMyMzZdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzY0MjMuNjIzODQyNjYxOTc4LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2NDIzLjYyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0MDAwLjI5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDAwMC4yOTc3NjgyMTQzMjIzXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDAwMC4yOTc3NjgyMTQzMjIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAzODM0LjY5Nzc2ODIxNDMyMjRdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIyNV0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjI2XSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAzNjY5LjA5Nzc2ODIxNDMyMjVdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIyNV0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDM4MzQuNjk3NzY4MjE0MzIyNF0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQwMDAuMjk3NzY4MjE0MzIyM10sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzY0MjMuNjIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA1MTU5LjQ5Nzc2ODIxNDMxOV0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTMyNS4wOTc3NjgyMTQzMThdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1NDkwLjY5Nzc2ODIxNDMxOF0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTY1Ni4yOTc3NjgyMTQzMTddLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1ODIxLjg5Nzc2ODIxNDMxN10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDU5ODcuNDk3NzY4MjE0MzE2XSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA1OTg3LjQ5Nzc2ODIxNDMxNl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTgyMS44OTc3NjgyMTQzMTddLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1NjU2LjI5Nzc2ODIxNDMxN10sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNTY1Ni4yOTc3NjgyMTQzMTddLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDU0OTAuNjk3NzY4MjE0MzE4XSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA1NDkwLjY5Nzc2ODIxNDMxOF0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNTMyNS4wOTc3NjgyMTQzMThdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDYxMy4zNjEzNjUxNjg4MTcsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNjEzLjM2MTM2NTE2ODgxNywgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzExMDEwLjU2MTM2NTE2ODgyMiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMzQ0OC40MDU0MDk4OTYxMzQ2XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzNDQ4LjQwNTQwOTg5NjEzNDZdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDM2MTQuMDA1NDA5ODk2MTM0Nl0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMzQ0OC40MDU0MDk4OTYxMzQ2XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzkxMjMuODYxMzY1MTY4ODAxLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5MDI0LjU2MTM2NTE2ODgsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5MTIzLjg2MTM2NTE2ODgwMSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDA0LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs2OC4xNzI4NzE2MDU0OTAxNiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNjguMTcyODcxNjA1NDkwMTYsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsyMDU0LjE3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzIwNTQuMTcyODcxNjA1NDksIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMjM1Mi4wNzI4NzE2MDU0ODksIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzI0NTEuMzcyODcxNjA1NDg5LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsyMzUyLjA3Mjg3MTYwNTQ4OSwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzIzNTIuMDcyODcxNjA1NDg5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyMjUyLjc3Mjg3MTYwNTQ4OTQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMjA1NC4xNzI4NzE2MDU0OSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDYzODcuNzg1NDQwOTM3ODY1XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA2Mzg3Ljc4NTQ0MDkzNzg2NV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs2OC4xNzI4NzE2MDU0OTAxMywgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDEzLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDM3MzguMTg1NDQwOTM3ODcyNV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM3MzguMTg1NDQwOTM3ODcyNV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM1NzIuNTg1NDQwOTM3ODcyNl0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDM0MDYuOTg1NDQwOTM3ODcyN10sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDMyNDEuMzg1NDQwOTM3ODcyOF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDMyNDEuMzg1NDQwOTM3ODcyOF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM0MDYuOTg1NDQwOTM3ODcyN10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgMzU3Mi41ODU0NDA5Mzc4NzI2XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgMzczOC4xODU0NDA5Mzc4NzI1XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDM0OTUuNTA2MTQyNjQzNzEzXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCAzNDk1LjUwNjE0MjY0MzcxM10sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM2NjEuMTA2MTQyNjQzNzEyN10sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDM4MjYuNzA2MTQyNjQzNzEyNl0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM4MjYuNzA2MTQyNjQzNzEyNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDM5OTIuMzA2MTQyNjQzNzEyNV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM5OTIuMzA2MTQyNjQzNzEyNV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDQxNTcuOTA2MTQyNjQzNzEyXSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNDMyMy41MDYxNDI2NDM3MTFdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA0MTU3LjkwNjE0MjY0MzcxMl0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDQzMjMuNTA2MTQyNjQzNzExXSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNDQ4OS4xMDYxNDI2NDM3MTFdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA0NjU0LjcwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0NjU0LjcwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0ODIwLjMwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0OTg1LjkwNjE0MjY0MzcwOV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNDk4NS45MDYxNDI2NDM3MDldLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDUxNTEuNTA2MTQyNjQzNzA5XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1MTUxLjUwNjE0MjY0MzcwOV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTMxNy4xMDYxNDI2NDM3MDhdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDUzMTcuMTA2MTQyNjQzNzA4XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1NDgyLjcwNjE0MjY0MzcwOF0sCisgIFsxODkzNS40MTUwNDE0MDEzMywgNTY0OC4zMDYxNDI2NDM3MDddLAorICBbMTg4MzYuMTE1MDQxNDAxMzMyLCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTg4MzYuMTE1MDQxNDAxMzMyLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxODkzNS40MTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1NjQ4LjMwNjE0MjY0MzcwN10sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNTY0OC4zMDYxNDI2NDM3MDddLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDY2NDEuOTA2MTQyNjQzNzA0XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2ODA3LjUwNjE0MjY0MzcwM10sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjY0MS45MDYxNDI2NDM3MDRdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDY2NDEuOTA2MTQyNjQzNzA0XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNjgwNy41MDYxNDI2NDM3MDNdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA2OTczLjEwNjE0MjY0MzcwM10sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDY5NzMuMTA2MTQyNjQzNzAzXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzEzOC43MDYxNDI2NDM3MDJdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3MTM4LjcwNjE0MjY0MzcwMl0sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDMyNS42MTUwNDE0MDEzMiwgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDc2MzUuNTA2MTQyNjQzNzAwNV0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjk0Ny4zOTAzMDY3MzIyMzYyLCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzMyNDUuMjkwMzA2NzMyMjM1NCwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszMzQ0LjU5MDMwNjczMjIzNSwgMzUyMi4xNTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzY0Mi40OTAzMDY3MzIyMzQzLCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNzQxLjc5MDMwNjczMjIzNCwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzc0MS43OTAzMDY3MzIyMzQsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszODQxLjA5MDMwNjczMjIzNCwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzg0MS4wOTAzMDY3MzIyMzQsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM3NDEuNzkwMzA2NzMyMjM0LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNjQyLjQ5MDMwNjczMjIzNDMsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM2NDIuNDkwMzA2NzMyMjM0MywgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAzNTIyLjE1NTMxNDc0OTI4Nl0sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDM4NTMuMzU1MzE0NzQ5Mjg1OF0sCisgIFszMzQ0LjU5MDMwNjczMjIzNSwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCA0MDE4Ljk1NTMxNDc0OTI4NTddLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzUyMi4xNTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMjk0Ny4zOTAzMDY3MzIyMzYyLCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzI5NDcuMzkwMzA2NzMyMjM2MiwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDIxOTcuMzU1MzE0NzQ5Mjg2N10sCisgIFsyNTUwLjE5MDMwNjczMjIzNzMsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyNDUwLjg5MDMwNjczMjIzNzYsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAyMTk3LjM1NTMxNDc0OTI4NjddLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDIwMzEuNzU1MzE0NzQ5Mjg2NV0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMTg2Ni4xNTUzMTQ3NDkyODY0XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAxODY2LjE1NTMxNDc0OTI4NjRdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDE3MDAuNTU1MzE0NzQ5Mjg2M10sCisgIFsyNDUwLjg5MDMwNjczMjIzNzYsIDE1MzQuOTU1MzE0NzQ5Mjg2MV0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDE1MzQuOTU1MzE0NzQ5Mjg2MV0sCisgIFsyMTUyLjk5MDMwNjczMjIzODQsIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzIwNTMuNjkwMzA2NzMyMjM4NywgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMTk1NC4zOTAzMDY3MzIyMzg3LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTg1NS4wOTAzMDY3MzIyMzg4LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTc1NS43OTAzMDY3MzIyMzg4LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzE3NTUuNzkwMzA2NzMyMjM4OCwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA1NDEuMzU1MzE0NzQ5Mjg1OV0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMzc1Ljc1NTMxNDc0OTI4NTldLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxNzU1Ljc5MDMwNjczMjIzODgsIDQ0LjU1NTMxNDc0OTI4NTkyXSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgNDQuNTU1MzE0NzQ5Mjg1OTJdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgNDQuNTU1MzE0NzQ5Mjg1OTJdLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAzNzUuNzU1MzE0NzQ5Mjg1ODRdLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU4NV0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgMzc1Ljc1NTMxNDc0OTI4NTg0XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCA1NDEuMzU1MzE0NzQ5Mjg1OV0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE3MjU0LjU3MjUxNTU0NjY2OCwgMTQ2MC41ODA3ODAxMjQ0OTIzXSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMTYyNi4xODA3ODAxMjQ0OTI1XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTYyNi4xODA3ODAxMjQ0OTI1XSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTk1Ny4zODA3ODAxMjQ0OTI3XSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjEyMi45ODA3ODAxMjQ0OTNdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyMjg4LjU4MDc4MDEyNDQ5M10sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDI3ODUuMzgwNzgwMTI0NDkyNV0sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzI1NC41NzI1MTU1NDY2NjgsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFsxNzI1NC41NzI1MTU1NDY2NjgsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjI4OC41ODA3ODAxMjQ0OTNdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyMTIyLjk4MDc4MDEyNDQ5M10sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA1MjU3Ljk0MTY4MjY5MTI5OF0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA1MjU3Ljk0MTY4MjY5MTI5OF0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDg0NC44NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzQ4NDQuODc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDk0NC4xNzYyNDQ2NjI4MzEsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzUyNDIuMDc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNTI0Mi4wNzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzUyNDIuMDc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQ5NDQuMTc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDg0NC44NzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgMzYwMS45NDE2ODI2OTEzMDI1XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDE0OS43NzYyNDQ2NjI4MjksIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0MDUwLjQ3NjI0NDY2MjgyOTcsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQwNTAuNDc2MjQ0NjYyODI5NywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzM5NTEuMTc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFszOTUxLjE3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFszODUxLjg3NjI0NDY2MjgzMDIsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbMzc1Mi41NzYyNDQ2NjI4MzA1LCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFszNjUzLjI3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbMzU1My45NzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM1NTMuOTc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFszNDU0LjY3NjI0NDY2MjgzMTMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM1NTMuOTc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszNjUzLjI3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzc1Mi41NzYyNDQ2NjI4MzA1LCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszNzUyLjU3NjI0NDY2MjgzMDUsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbMzg1MS44NzYyNDQ2NjI4MzAyLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszOTUxLjE3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0MDUwLjQ3NjI0NDY2MjgyOTcsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQxNDkuNzc2MjQ0NjYyODI5LCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbOTQ3NC43ODg5MDIxMzU2MDYsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbOTM3NS40ODg5MDIxMzU2MDUsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzk0NzQuNzg4OTAyMTM1NjA2LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFs5NDc0Ljc4ODkwMjEzNTYwNiwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzk2NzMuMzg4OTAyMTM1NjA4LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbOTY3My4zODg5MDIxMzU2MDgsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzk3NzIuNjg4OTAyMTM1NjEsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzk2NzMuMzg4OTAyMTM1NjA4LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFs5NzcyLjY4ODkwMjEzNTYxLCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFs5ODcxLjk4ODkwMjEzNTYxLCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbOTg3MS45ODg5MDIxMzU2MSwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbOTg3MS45ODg5MDIxMzU2MSwgNTY5Ni4yNjI5MzkwNTU4MTZdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDU1MzAuNjYyOTM5MDU1ODE2XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNTUzMC42NjI5MzkwNTU4MTZdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA1Njk2LjI2MjkzOTA1NTgxNl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNTY5Ni4yNjI5MzkwNTU4MTZdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDYwMjcuNDYyOTM5MDU1ODE1XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjAyNy40NjI5MzkwNTU4MTVdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3NTE3Ljg2MjkzOTA1NTgxXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzY4My40NjI5MzkwNTU4MDldLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA3NTE3Ljg2MjkzOTA1NTgxXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzY4My40NjI5MzkwNTU4MDldLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA3NjgzLjQ2MjkzOTA1NTgwOV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDc1MTcuODYyOTM5MDU1ODFdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDY2Ni4zODg5MDIxMzU2MTksIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwNjY2LjM4ODkwMjEzNTYxOSwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDczLjY5NDQzNTQzNzQ3MTQsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs5NzQuMzk0NDM1NDM3NDcxMywgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA0OTEuOTY4MTIwNDAzMjY0OF0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAxOTgyLjM2ODEyMDQwMzI2NTNdLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDIxNDcuOTY4MTIwNDAzMjY1NF0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgMjMxMy41NjgxMjA0MDMyNjUzXSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgMjE0Ny45NjgxMjA0MDMyNjU0XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTE0LCAyMzEzLjU2ODEyMDQwMzI2NTNdLAorICBbODAuNjk0NDM1NDM3NDcxMTQsIDI0NzkuMTY4MTIwNDAzMjY1XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAyNjQ0Ljc2ODEyMDQwMzI2NV0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMjQ3OS4xNjgxMjA0MDMyNjVdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDIzMTMuNTY4MTIwNDAzMjY1M10sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMjE0Ny45NjgxMjA0MDMyNjU0XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxOTgyLjM2ODEyMDQwMzI2NTNdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDE5ODIuMzY4MTIwNDAzMjY1M10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgNDkxLjk2ODEyMDQwMzI2NDhdLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAzMjYuMzY4MTIwNDAzMjY0OF0sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDE2MC43NjgxMjA0MDMyNjQ4Ml0sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgMTYwLjc2ODEyMDQwMzI2NDgyXSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCAzMjYuMzY4MTIwNDAzMjY0OF0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgMzI2LjM2ODEyMDQwMzI2NDhdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzk3NC4zOTQ0MzU0Mzc0NzEzLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMjY4Ny4wNDU2MDIwNjA1MjNdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDI4NTIuNjQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjY4Ny4wNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszODMzLjUxMzU2MjQzMTY5NSwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzkzMi44MTM1NjI0MzE2OTQ3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszODMzLjUxMzU2MjQzMTY5NSwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzgzMy41MTM1NjI0MzE2OTUsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxMDMxLjA0NTYwMjA2MDUyMjJdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDEwMzEuMDQ1NjAyMDYwNTIyMl0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCA4NjUuNDQ1NjAyMDYwNTIyMl0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDY5OS44NDU2MDIwNjA1MjIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMzY4LjY0NTYwMjA2MDUyMjQ0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAyMDMuMDQ1NjAyMDYwNTIyNDRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAzNy40NDU2MDIwNjA1MjI0NTRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDIwMy4wNDU2MDIwNjA1MjI0NF0sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMzcuNDQ1NjAyMDYwNTIyNDU0XSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMjAzLjA0NTYwMjA2MDUyMjQ0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMzY4LjY0NTYwMjA2MDUyMjRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCA2OTkuODQ1NjAyMDYwNTIyM10sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgODY1LjQ0NTYwMjA2MDUyMjJdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAxMDMxLjA0NTYwMjA2MDUyMjJdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDE4MzkuODE4ODg0ODAzMjk5XSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMTgzOS44MTg4ODQ4MDMyOTldLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAxMzQzLjAxODg4NDgwMzI5ODVdLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTYxODkuODEyMTE3Njc1OTIzLCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAxODM5LjgxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDIwMDUuNDE4ODg0ODAzMjk5XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjE3MS4wMTg4ODQ4MDMyOTldLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAyMzM2LjYxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDI1MDIuMjE4ODg0ODAzMjk5XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMjY2Ny44MTg4ODQ4MDMyOTg3XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE1ODkxLjkxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTU4OTEuOTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNTk5MS4yMTIxMTc2NzU5MjEsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjQ4Ny43MTIxMTc2NzU5MjUsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2Njg2LjMxMjExNzY3NTkyMywgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzODI3LjAxODg4NDgwMzI5OF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzk5Mi42MTg4ODQ4MDMyOThdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDM4MjcuMDE4ODg0ODAzMjk4XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTcyODIuMTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNzI4Mi4xMTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMjY2Ny44MTg4ODQ4MDMyOTg3XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAyNjY3LjgxODg4NDgwMzI5ODddLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTM3MS40NzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTA3My41NzU5OTExMjgwNzksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCAzMDE0Ljc3MDAyMjQzNjUwNV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMjg0OS4xNzAwMjI0MzY1MDVdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFs2NzYuMzc1OTkxMTI4MDc4OCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs1NzcuMDc1OTkxMTI4MDc4NywgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzU3Ny4wNzU5OTExMjgwNzg3LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTA3My41NzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMTA3My41NzU5OTExMjgwNzksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTA3My41NzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMzcxLjQ3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzE0NzAuNzc1OTkxMTI4MDc4OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEzNzEuNDc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTM3MS40NzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNDcwLjc3NTk5MTEyODA3ODksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNTcwLjA3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNDcwLjc3NTk5MTEyODA3ODksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNTcwLjA3NTk5MTEyODA3ODgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNzY4LjY3NTk5MTEyODA3ODcsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxNzY4LjY3NTk5MTEyODA3ODcsIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsxODY3Ljk3NTk5MTEyODA3ODcsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxOTY3LjI3NTk5MTEyODA3ODcsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsyMDY2LjU3NTk5MTEyODA3ODQsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyMTY1Ljg3NTk5MTEyODA3OCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzIwNjYuNTc1OTkxMTI4MDc4NCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzIxNjUuODc1OTkxMTI4MDc4LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMjA2Ni41NzU5OTExMjgwNzg0LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjE2NS44NzU5OTExMjgwNzgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyMjY1LjE3NTk5MTEyODA3OCwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzIzNjQuNDc1OTkxMTI4MDc3NiwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzIyNjUuMTc1OTkxMTI4MDc4LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjM2NC40NzU5OTExMjgwNzc2LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjQ2My43NzU5OTExMjgwNzczLCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjQ2My43NzU5OTExMjgwNzczLCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMjM2NC40NzU5OTExMjgwNzc2LCAzODQyLjc3MDAyMjQzNjUwNDRdCitdOworCittYWluKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICB2YXIgeSA9IHBhbmVscy5sZW5ndGg7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xhcmdlcl9pbXBsaWNpdF9nZXR0ZXJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbGFyZ2VyX2ltcGxpY2l0X2dldHRlcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhZGMwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xhcmdlcl9pbXBsaWNpdF9nZXR0ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDEwMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgY29tcGlsYXRpb24gb2YgbGFyZ2UgaW1wbGljaXQgZ2V0dGVycy4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK0xpc3Q8TGlzdD4gcGFuZWxzID0gWworICBbNjg1My45NDAwMzkyMjQ3OTcsIDYwNTAuODM3ODk3MDIxMzcxXSwKKyAgWzY5NTMuMjQwMDM5MjI0Nzk3LCA2MDUwLjgzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDU4ODUuMjM3ODk3MDIxMzcxXSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNTcxOS42Mzc4OTcwMjEzNzJdLAorICBbNzE1MS44NDAwMzkyMjQ3OTgsIDU4ODUuMjM3ODk3MDIxMzcxXSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs2OTUzLjI0MDAzOTIyNDc5NywgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs2OTUzLjI0MDAzOTIyNDc5NywgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs2NzU0LjY0MDAzOTIyNDc5NywgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs2NzU0LjY0MDAzOTIyNDc5NywgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs2NzU0LjY0MDAzOTIyNDc5NywgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzY2NTUuMzQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs2NzU0LjY0MDAzOTIyNDc5NywgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs2OTUzLjI0MDAzOTIyNDc5NywgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3MTUxLjg0MDAzOTIyNDc5OCwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzE1MS44NDAwMzkyMjQ3OTgsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzcyNTEuMTQwMDM5MjI0Nzk4LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3MjUxLjE0MDAzOTIyNDc5OCwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzM1MC40NDAwMzkyMjQ3OTgsIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzc0NDkuNzQwMDM5MjI0Nzk4LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzU0OS4wNDAwMzkyMjQ3OTgsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzc0NDkuNzQwMDM5MjI0Nzk4LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzc0NDkuNzQwMDM5MjI0Nzk4LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzc1NDkuMDQwMDM5MjI0Nzk4LCA2MDUwLjgzNzg5NzAyMTM3MV0sCisgIFs3NjQ4LjM0MDAzOTIyNDc5OSwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3NTQ5LjA0MDAzOTIyNDc5OCwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3NjQ4LjM0MDAzOTIyNDc5OSwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3NzQ3LjY0MDAzOTIyNDc5OSwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3ODQ2Ljk0MDAzOTIyNDc5OSwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzg0Ni45NDAwMzkyMjQ3OTksIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNzA0NC40Mzc4OTcwMjEzNjc1XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3MjEwLjAzNzg5NzAyMTM2N10sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDczNzUuNjM3ODk3MDIxMzY2XSwKKyAgWzgxNDQuODQwMDM5MjI0Nzk5NSwgNzU0MS4yMzc4OTcwMjEzNjZdLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDczNzUuNjM3ODk3MDIxMzY2XSwKKyAgWzgxNDQuODQwMDM5MjI0Nzk5NSwgNzIxMC4wMzc4OTcwMjEzNjddLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDcwNDQuNDM3ODk3MDIxMzY3NV0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNzIxMC4wMzc4OTcwMjEzNjddLAorICBbNzg0Ni45NDAwMzkyMjQ3OTksIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA3Mzc1LjYzNzg5NzAyMTM2Nl0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNzU0MS4yMzc4OTcwMjEzNjZdLAorICBbODE0NC44NDAwMzkyMjQ3OTk1LCA3NzA2LjgzNzg5NzAyMTM2NV0sCisgIFs4MjQ0LjE0MDAzOTIyNDgsIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgzNDMuNDQwMDM5MjI0OCwgNzU0MS4yMzc4OTcwMjEzNjZdLAorICBbODM0My40NDAwMzkyMjQ4LCA3NzA2LjgzNzg5NzAyMTM2NV0sCisgIFs4MjQ0LjE0MDAzOTIyNDgsIDc3MDYuODM3ODk3MDIxMzY1XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDI4NDEuMDk3NzY4MjE0MzIzNF0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMjY3NS40OTc3NjgyMTQzMjM1XSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAyNTA5Ljg5Nzc2ODIxNDMyMzZdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjUwOS44OTc3NjgyMTQzMjM2XSwKKyAgWzQwNDAuNDIzODQyNjYxOTc0NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0MDQwLjQyMzg0MjY2MTk3NDUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgNjg4LjI5Nzc2ODIxNDMyMzFdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDUyMi42OTc3NjgyMTQzMjMyXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAzNTcuMDk3NzY4MjE0MzIzMjVdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDM1Ny4wOTc3NjgyMTQzMjMyNV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgNTIyLjY5Nzc2ODIxNDMyMzJdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDY4OC4yOTc3NjgyMTQzMjMxXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMjUwOS44OTc3NjgyMTQzMjM2XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyNjc1LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMjY3NS40OTc3NjgyMTQzMjM1XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDI4NDEuMDk3NzY4MjE0MzIzNF0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDI4NDEuMDk3NzY4MjE0MzIzNF0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDI4NDEuMDk3NzY4MjE0MzIzNF0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNjQyMy42MjM4NDI2NjE5NzgsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzY0MjMuNjIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgNDAwMC4yOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgNDAwMC4yOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA0MDAwLjI5Nzc2ODIxNDMyMjNdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0MDAwLjI5Nzc2ODIxNDMyMjNdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDM4MzQuNjk3NzY4MjE0MzIyNF0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMzY2OS4wOTc3NjgyMTQzMjI1XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAzNTAzLjQ5Nzc2ODIxNDMyMjZdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIyNV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgMzY2OS4wOTc3NjgyMTQzMjI1XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgMzgzNC42OTc3NjgyMTQzMjI0XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDAwMC4yOTc3NjgyMTQzMjIzXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNjQyMy42MjM4NDI2NjE5NzgsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQ5OTMuODk3NzY4MjE0MzE5NV0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNTE1OS40OTc3NjgyMTQzMTldLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA1MzI1LjA5Nzc2ODIxNDMxOF0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDU0OTAuNjk3NzY4MjE0MzE4XSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA1NjU2LjI5Nzc2ODIxNDMxN10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDU4MjEuODk3NzY4MjE0MzE3XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNTk4Ny40OTc3NjgyMTQzMTZdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDU5ODcuNDk3NzY4MjE0MzE2XSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA1ODIxLjg5Nzc2ODIxNDMxN10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDU2NTYuMjk3NzY4MjE0MzE3XSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA1NjU2LjI5Nzc2ODIxNDMxN10sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNTQ5MC42OTc3NjgyMTQzMThdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDU0OTAuNjk3NzY4MjE0MzE4XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA1MzI1LjA5Nzc2ODIxNDMxOF0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNTE1OS40OTc3NjgyMTQzMTldLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDQ5OTMuODk3NzY4MjE0MzE5NV0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgNTE1OS40OTc3NjgyMTQzMTldLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ5OTMuODk3NzY4MjE0MzE5NV0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDQxNC43NjEzNjUxNjg4MTUsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDQxNC43NjEzNjUxNjg4MTUsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMTYyNi44MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwNjEzLjM2MTM2NTE2ODgxNywgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDYxMy4zNjEzNjUxNjg4MTcsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwOTExLjI2MTM2NTE2ODgyLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwOTExLjI2MTM2NTE2ODgyLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTEwMTAuNTYxMzY1MTY4ODIyLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwOTExLjI2MTM2NTE2ODgyLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDYxMy4zNjEzNjUxNjg4MTcsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDQxNC43NjEzNjUxNjg4MTUsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAzNDQ4LjQwNTQwOTg5NjEzNDZdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDM0NDguNDA1NDA5ODk2MTM0Nl0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMzYxNC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAzNDQ4LjQwNTQwOTg5NjEzNDZdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTYyNi44MDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMTYyNi44MDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTEyMy44NjEzNjUxNjg4MDEsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzkwMjQuNTYxMzY1MTY4OCwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzkxMjMuODYxMzY1MTY4ODAxLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFszNjYuMDcyODcxNjA1NDkwMDQsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs2OC4xNzI4NzE2MDU0OTAxMywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs2OC4xNzI4NzE2MDU0OTAxNiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNjguMTcyODcxNjA1NDkwMTYsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFs2OC4xNzI4NzE2MDU0OTAxMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxOTU0Ljg3Mjg3MTYwNTQ5LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzIwNTQuMTcyODcxNjA1NDksIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxOTU0Ljg3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMjA1NC4xNzI4NzE2MDU0OSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjE1My40NzI4NzE2MDU0ODk3LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyMjUyLjc3Mjg3MTYwNTQ4OTQsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsyMzUyLjA3Mjg3MTYwNTQ4OSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjQ1MS4zNzI4NzE2MDU0ODksIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzIzNTIuMDcyODcxNjA1NDg5LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsyMjUyLjc3Mjg3MTYwNTQ4OTQsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsyMjUyLjc3Mjg3MTYwNTQ4OTQsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMjM1Mi4wNzI4NzE2MDU0ODksIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzIyNTIuNzcyODcxNjA1NDg5NCwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMjE1My40NzI4NzE2MDU0ODk3LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyMDU0LjE3Mjg3MTYwNTQ5LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxOTU0Ljg3Mjg3MTYwNTQ5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNjM4Ny43ODU0NDA5Mzc4NjVdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDYzODcuNzg1NDQwOTM3ODY1XSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbNjguMTcyODcxNjA1NDkwMTYsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDEzLCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDM5MDMuNzg1NDQwOTM3ODcyNF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM5MDMuNzg1NDQwOTM3ODcyNF0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgMzczOC4xODU0NDA5Mzc4NzI1XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgMzczOC4xODU0NDA5Mzc4NzI1XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgMzU3Mi41ODU0NDA5Mzc4NzI2XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgMzQwNi45ODU0NDA5Mzc4NzI3XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgMzI0MS4zODU0NDA5Mzc4NzI4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgMzI0MS4zODU0NDA5Mzc4NzI4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgMzQwNi45ODU0NDA5Mzc4NzI3XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCAzNTcyLjU4NTQ0MDkzNzg3MjZdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCAzNzM4LjE4NTQ0MDkzNzg3MjVdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgMzQ5NS41MDYxNDI2NDM3MTNdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDM2NjEuMTA2MTQyNjQzNzEyN10sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDM2NjEuMTA2MTQyNjQzNzEyN10sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDM2NjEuMTA2MTQyNjQzNzEyN10sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM0OTUuNTA2MTQyNjQzNzEzXSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgMzY2MS4xMDYxNDI2NDM3MTI3XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgMzgyNi43MDYxNDI2NDM3MTI2XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgMzgyNi43MDYxNDI2NDM3MTI2XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgMzk5Mi4zMDYxNDI2NDM3MTI1XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgMzk5Mi4zMDYxNDI2NDM3MTI1XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNDE1Ny45MDYxNDI2NDM3MTJdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA0MzIzLjUwNjE0MjY0MzcxMV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDQxNTcuOTA2MTQyNjQzNzEyXSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNDMyMy41MDYxNDI2NDM3MTFdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA0NDg5LjEwNjE0MjY0MzcxMV0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDQ2NTQuNzA2MTQyNjQzNzFdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDQ2NTQuNzA2MTQyNjQzNzFdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDQ4MjAuMzA2MTQyNjQzNzFdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDQ5ODUuOTA2MTQyNjQzNzA5XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA0OTg1LjkwNjE0MjY0MzcwOV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTE1MS41MDYxNDI2NDM3MDldLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDUxNTEuNTA2MTQyNjQzNzA5XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1MzE3LjEwNjE0MjY0MzcwOF0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTMxNy4xMDYxNDI2NDM3MDhdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDU0ODIuNzA2MTQyNjQzNzA4XSwKKyAgWzE4OTM1LjQxNTA0MTQwMTMzLCA1NjQ4LjMwNjE0MjY0MzcwN10sCisgIFsxODgzNi4xMTUwNDE0MDEzMzIsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxODgzNi4xMTUwNDE0MDEzMzIsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE4OTM1LjQxNTA0MTQwMTMzLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDU2NDguMzA2MTQyNjQzNzA3XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA1NjQ4LjMwNjE0MjY0MzcwN10sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNjY0MS45MDYxNDI2NDM3MDRdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDY4MDcuNTA2MTQyNjQzNzAzXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2NjQxLjkwNjE0MjY0MzcwNF0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5ODI5LjExNTA0MTQwMTMyNSwgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNjY0MS45MDYxNDI2NDM3MDRdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2ODA3LjUwNjE0MjY0MzcwM10sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDY5NzMuMTA2MTQyNjQzNzAzXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNjk3My4xMDYxNDI2NDM3MDNdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3MTM4LjcwNjE0MjY0MzcwMl0sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDcxMzguNzA2MTQyNjQzNzAyXSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzE5ODI5LjExNTA0MTQwMTMyNSwgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDc2MzUuNTA2MTQyNjQzNzAwNV0sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDc2MzUuNTA2MTQyNjQzNzAwNV0sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDIyNi4zMTUwNDE0MDEzMiwgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMzI1LjYxNTA0MTQwMTMyLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDc2MzUuNTA2MTQyNjQzNzAwNV0sCisgIFsyMDIyNi4zMTUwNDE0MDEzMiwgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzIwMTI3LjAxNTA0MTQwMTMyMiwgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzIwMTI3LjAxNTA0MTQwMTMyMiwgNzYzNS41MDYxNDI2NDM3MDA1XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFsyNjQ5LjQ5MDMwNjczMjIzNywgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFsyOTQ3LjM5MDMwNjczMjIzNjIsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszMjQ1LjI5MDMwNjczMjIzNTQsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzMzNDQuNTkwMzA2NzMyMjM1LCAzNTIyLjE1NTMxNDc0OTI4Nl0sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszNjQyLjQ5MDMwNjczMjIzNDMsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM3NDEuNzkwMzA2NzMyMjM0LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszNzQxLjc5MDMwNjczMjIzNCwgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzM4NDEuMDkwMzA2NzMyMjM0LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszODQxLjA5MDMwNjczMjIzNCwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzc0MS43OTAzMDY3MzIyMzQsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM2NDIuNDkwMzA2NzMyMjM0MywgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzY0Mi40OTAzMDY3MzIyMzQzLCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDM1MjIuMTU1MzE0NzQ5Mjg2XSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzg1My4zNTUzMTQ3NDkyODU4XSwKKyAgWzMzNDQuNTkwMzA2NzMyMjM1LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszMjQ1LjI5MDMwNjczMjIzNTQsIDM4NTMuMzU1MzE0NzQ5Mjg1OF0sCisgIFszMjQ1LjI5MDMwNjczMjIzNTQsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDM4NTMuMzU1MzE0NzQ5Mjg1OF0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDQwMTguOTU1MzE0NzQ5Mjg1N10sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDM4NTMuMzU1MzE0NzQ5Mjg1OF0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzNTIyLjE1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFsyOTQ3LjM5MDMwNjczMjIzNjIsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMjk0Ny4zOTAzMDY3MzIyMzYyLCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyMTk3LjM1NTMxNDc0OTI4NjddLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyNjQ5LjQ5MDMwNjczMjIzNywgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzI1NTAuMTkwMzA2NzMyMjM3MywgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzI0NTAuODkwMzA2NzMyMjM3NiwgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAyMTk3LjM1NTMxNDc0OTI4NjddLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDIxOTcuMzU1MzE0NzQ5Mjg2N10sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMjAzMS43NTUzMTQ3NDkyODY1XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAxODY2LjE1NTMxNDc0OTI4NjRdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDE4NjYuMTU1MzE0NzQ5Mjg2NF0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMTcwMC41NTUzMTQ3NDkyODYzXSwKKyAgWzI0NTAuODkwMzA2NzMyMjM3NiwgMTUzNC45NTUzMTQ3NDkyODYxXSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAxMzY5LjM1NTMxNDc0OTI4Nl0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAxMzY5LjM1NTMxNDc0OTI4Nl0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMTUzNC45NTUzMTQ3NDkyODYxXSwKKyAgWzIxNTIuOTkwMzA2NzMyMjM4NCwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMjA1My42OTAzMDY3MzIyMzg3LCAxMzY5LjM1NTMxNDc0OTI4Nl0sCisgIFsxOTU0LjM5MDMwNjczMjIzODcsIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxODU1LjA5MDMwNjczMjIzODgsIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNzU1Ljc5MDMwNjczMjIzODgsIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTc1NS43OTAzMDY3MzIyMzg4LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDU0MS4zNTUzMTQ3NDkyODU5XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCAzNzUuNzU1MzE0NzQ5Mjg1OV0sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzE3NTUuNzkwMzA2NzMyMjM4OCwgNDQuNTU1MzE0NzQ5Mjg1OTJdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA0NC41NTUzMTQ3NDkyODU5Ml0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMjEwLjE1NTMxNDc0OTI4NTldLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCA0NC41NTUzMTQ3NDkyODU5Ml0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgMjEwLjE1NTMxNDc0OTI4NTldLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDM3NS43NTUzMTQ3NDkyODU4NF0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgMjEwLjE1NTMxNDc0OTI4NTg1XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCAzNzUuNzU1MzE0NzQ5Mjg1ODRdLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDU0MS4zNTUzMTQ3NDkyODU5XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCAxMzY5LjM1NTMxNDc0OTI4Nl0sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTcyNTQuNTcyNTE1NTQ2NjY4LCAxNDYwLjU4MDc4MDEyNDQ5MjNdLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAxNjI2LjE4MDc4MDEyNDQ5MjVdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAxNzkxLjc4MDc4MDEyNDQ5MjZdLAorICBbMTc1NTIuNDcyNTE1NTQ2NjY2LCAxNzkxLjc4MDc4MDEyNDQ5MjZdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAxNjI2LjE4MDc4MDEyNDQ5MjVdLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAxNzkxLjc4MDc4MDEyNDQ5MjZdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAxOTU3LjM4MDc4MDEyNDQ5MjddLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAyMTIyLjk4MDc4MDEyNDQ5M10sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjYxOS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMjYxOS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjc4NS4zODA3ODAxMjQ0OTI1XSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjYxOS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3MjU0LjU3MjUxNTU0NjY2OCwgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzE3MjU0LjU3MjUxNTU0NjY2OCwgMjI4OC41ODA3ODAxMjQ0OTNdLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAyMjg4LjU4MDc4MDEyNDQ5M10sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDIxMjIuOTgwNzgwMTI0NDkzXSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMjI4OC41ODA3ODAxMjQ0OTNdLAorICBbMTc1NTIuNDcyNTE1NTQ2NjY2LCAyNDU0LjE4MDc4MDEyNDQ5MjddLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyNDU0LjE4MDc4MDEyNDQ5MjddLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDUwOTIuMzQxNjgyNjkxMjk5XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDUyNTcuOTQxNjgyNjkxMjk4XSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDUyNTcuOTQxNjgyNjkxMjk4XSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDUwOTIuMzQxNjgyNjkxMjk5XSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDUwOTIuMzQxNjgyNjkxMjk5XSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDc0NS41NzYyNDQ2NjI4MzA1LCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0ODQ0Ljg3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDc0NS41NzYyNDQ2NjI4MzA1LCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDc0NS41NzYyNDQ2NjI4MzA1LCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNDg0NC44NzYyNDQ2NjI4MzEsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzUxNDIuNzc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNTI0Mi4wNzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzUxNDIuNzc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs1MjQyLjA3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNTI0Mi4wNzYyNDQ2NjI4MzEsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzUxNDIuNzc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ5NDQuMTc2MjQ0NjYyODMxLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDk0NC4xNzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ5NDQuMTc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0ODQ0Ljg3NjI0NDY2MjgzMSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDc0NS41NzYyNDQ2NjI4MzA1LCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCAzNjAxLjk0MTY4MjY5MTMwMjVdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgMzc2Ny41NDE2ODI2OTEzMDI0XSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgMzc2Ny41NDE2ODI2OTEzMDI0XSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0MTQ5Ljc3NjI0NDY2MjgyOSwgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQwNTAuNDc2MjQ0NjYyODI5NywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDA1MC40NzYyNDQ2NjI4Mjk3LCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbMzk1MS4xNzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzM5NTEuMTc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbMzg1MS44NzYyNDQ2NjI4MzAyLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFszNzUyLjU3NjI0NDY2MjgzMDUsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzM2NTMuMjc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszNTUzLjk3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzU1My45NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzM0NTQuNjc2MjQ0NjYyODMxMywgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzU1My45NzYyNDQ2NjI4MzEsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzM2NTMuMjc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszNzUyLjU3NjI0NDY2MjgzMDUsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzM3NTIuNTc2MjQ0NjYyODMwNSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzg1MS44NzYyNDQ2NjI4MzAyLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFszODUxLjg3NjI0NDY2MjgzMDIsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM5NTEuMTc2MjQ0NjYyODMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQwNTAuNDc2MjQ0NjYyODI5NywgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDE0OS43NzYyNDQ2NjI4MjksIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs5NTc0LjA4ODkwMjEzNTYwNywgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFs5NDc0Ljc4ODkwMjEzNTYwNiwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFs5Mzc1LjQ4ODkwMjEzNTYwNSwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbOTQ3NC43ODg5MDIxMzU2MDYsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFs5NTc0LjA4ODkwMjEzNTYwNywgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzk0NzQuNzg4OTAyMTM1NjA2LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFs5NTc0LjA4ODkwMjEzNTYwNywgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbOTY3My4zODg5MDIxMzU2MDgsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFs5NjczLjM4ODkwMjEzNTYwOCwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbOTc3Mi42ODg5MDIxMzU2MSwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbOTY3My4zODg5MDIxMzU2MDgsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzk3NzIuNjg4OTAyMTM1NjEsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzk4NzEuOTg4OTAyMTM1NjEsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDYwMjcuNDYyOTM5MDU1ODE1XSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFs5ODcxLjk4ODkwMjEzNTYxLCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFs5ODcxLjk4ODkwMjEzNTYxLCA1Njk2LjI2MjkzOTA1NTgxNl0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNTUzMC42NjI5MzkwNTU4MTZdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA1NTMwLjY2MjkzOTA1NTgxNl0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDU2OTYuMjYyOTM5MDU1ODE2XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA1Njk2LjI2MjkzOTA1NTgxNl0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjAyNy40NjI5MzkwNTU4MTVdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDYwMjcuNDYyOTM5MDU1ODE1XSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDc1MTcuODYyOTM5MDU1ODFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3NjgzLjQ2MjkzOTA1NTgwOV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDc1MTcuODYyOTM5MDU1ODFdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA3NjgzLjQ2MjkzOTA1NTgwOV0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDc2ODMuNDYyOTM5MDU1ODA5XSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzUxNy44NjI5MzkwNTU4MV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwNjY2LjM4ODkwMjEzNTYxOSwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTA2NjYuMzg4OTAyMTM1NjE5LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwNzMuNjk0NDM1NDM3NDcxNCwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzk3NC4zOTQ0MzU0Mzc0NzEzLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDE5ODIuMzY4MTIwNDAzMjY1M10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgMjE0Ny45NjgxMjA0MDMyNjU0XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCAyMzEzLjU2ODEyMDQwMzI2NTNdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTE0LCAyMTQ3Ljk2ODEyMDQwMzI2NTRdLAorICBbODAuNjk0NDM1NDM3NDcxMTQsIDIzMTMuNTY4MTIwNDAzMjY1M10sCisgIFs4MC42OTQ0MzU0Mzc0NzExNCwgMjQ3OS4xNjgxMjA0MDMyNjVdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDI2NDQuNzY4MTIwNDAzMjY1XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAyNDc5LjE2ODEyMDQwMzI2NV0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMjMxMy41NjgxMjA0MDMyNjUzXSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAyMTQ3Ljk2ODEyMDQwMzI2NTRdLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDE5ODIuMzY4MTIwNDAzMjY1M10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTk4Mi4zNjgxMjA0MDMyNjUzXSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCA0OTEuOTY4MTIwNDAzMjY0OF0sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDMyNi4zNjgxMjA0MDMyNjQ4XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTYwLjc2ODEyMDQwMzI2NDgyXSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAxNjAuNzY4MTIwNDAzMjY0ODJdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDMyNi4zNjgxMjA0MDMyNjQ4XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgNDkxLjk2ODEyMDQwMzI2NDhdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTE0LCAzMjYuMzY4MTIwNDAzMjY0OF0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgNDkxLjk2ODEyMDQwMzI2NDhdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbOTc0LjM5NDQzNTQzNzQ3MTMsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDI1MjEuNDQ1NjAyMDYwNTIzXSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDI1MjEuNDQ1NjAyMDYwNTIzXSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAyNjg3LjA0NTYwMjA2MDUyM10sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMjg1Mi42NDU2MDIwNjA1MjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAyNjg3LjA0NTYwMjA2MDUyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDI1MjEuNDQ1NjAyMDYwNTIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzM4MzMuNTEzNTYyNDMxNjk1LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszOTMyLjgxMzU2MjQzMTY5NDcsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzM4MzMuNTEzNTYyNDMxNjk1LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszODMzLjUxMzU2MjQzMTY5NSwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAxMzYyLjI0NTYwMjA2MDUyMjVdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxMzYyLjI0NTYwMjA2MDUyMjVdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDExOTYuNjQ1NjAyMDYwNTIyNF0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDExOTYuNjQ1NjAyMDYwNTIyNF0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDEwMzEuMDQ1NjAyMDYwNTIyMl0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMTAzMS4wNDU2MDIwNjA1MjIyXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgODY1LjQ0NTYwMjA2MDUyMjJdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCA2OTkuODQ1NjAyMDYwNTIyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAzNjguNjQ1NjAyMDYwNTIyNDRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDIwMy4wNDU2MDIwNjA1MjI0NF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMzcuNDQ1NjAyMDYwNTIyNDU0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMjAzLjA0NTYwMjA2MDUyMjQ0XSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMzcuNDQ1NjAyMDYwNTIyNDU0XSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAzNy40NDU2MDIwNjA1MjI0NTRdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAyMDMuMDQ1NjAyMDYwNTIyNDRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAzNjguNjQ1NjAyMDYwNTIyNF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgNTM0LjI0NTYwMjA2MDUyMjRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCA2OTkuODQ1NjAyMDYwNTIyM10sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgNTM0LjI0NTYwMjA2MDUyMjRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDY5OS44NDU2MDIwNjA1MjIzXSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgODY1LjQ0NTYwMjA2MDUyMjJdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCA4NjUuNDQ1NjAyMDYwNTIyMl0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDEwMzEuMDQ1NjAyMDYwNTIyMl0sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDExOTYuNjQ1NjAyMDYwNTIyNF0sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzE2Mzg4LjQxMjExNzY3NTkyNSwgMTgzOS44MTg4ODQ4MDMyOTldLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAxODM5LjgxODg4NDgwMzI5OV0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDE2NzQuMjE4ODg0ODAzMjk4OF0sCisgIFsxNjQ4Ny43MTIxMTc2NzU5MjUsIDE1MDguNjE4ODg0ODAzMjk4N10sCisgIFsxNjQ4Ny43MTIxMTc2NzU5MjUsIDE2NzQuMjE4ODg0ODAzMjk4OF0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDE1MDguNjE4ODg0ODAzMjk4N10sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDEzNDMuMDE4ODg0ODAzMjk4NV0sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDE1MDguNjE4ODg0ODAzMjk4N10sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDE2NzQuMjE4ODg0ODAzMjk4OF0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDE4MzkuODE4ODg0ODAzMjk5XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMjAwNS40MTg4ODQ4MDMyOTldLAorICBbMTU5OTEuMjEyMTE3Njc1OTIxLCAyMTcxLjAxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDIzMzYuNjE4ODg0ODAzMjk5XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMjUwMi4yMTg4ODQ4MDMyOTldLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAyNjY3LjgxODg4NDgwMzI5ODddLAorICBbMTU5OTEuMjEyMTE3Njc1OTIxLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTU5OTEuMjEyMTE3Njc1OTIxLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTU4OTEuOTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNTg5MS45MTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2MTg5LjgxMjExNzY3NTkyMywgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2MTg5LjgxMjExNzY3NTkyMywgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2MTg5LjgxMjExNzY3NTkyMywgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2Mzg4LjQxMjExNzY3NTkyNSwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2Mzg4LjQxMjExNzY3NTkyNSwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2NDg3LjcxMjExNzY3NTkyNSwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2NTg3LjAxMjExNzY3NTkyNCwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2NTg3LjAxMjExNzY3NTkyNCwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDM4MjcuMDE4ODg0ODAzMjk4XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzOTkyLjYxODg4NDgwMzI5OF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzgyNy4wMTg4ODQ4MDMyOThdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNzI4Mi4xMTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE3MjgyLjExMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAyNjY3LjgxODg4NDgwMzI5ODddLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDI2NjcuODE4ODg0ODAzMjk4N10sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjY4Ni4zMTIxMTc2NzU5MjMsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNjQ4Ny43MTIxMTc2NzU5MjUsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjY4Ni4zMTIxMTc2NzU5MjMsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjY4Ni4zMTIxMTc2NzU5MjMsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMzcxLjQ3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTA3My41NzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzAxNC43NzAwMjI0MzY1MDVdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzAxNC43NzAwMjI0MzY1MDVdLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAyODQ5LjE3MDAyMjQzNjUwNV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzAxNC43NzAwMjI0MzY1MDVdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFs2NzYuMzc1OTkxMTI4MDc4OCwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzY3Ni4zNzU5OTExMjgwNzg4LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs2NzYuMzc1OTkxMTI4MDc4OCwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzU3Ny4wNzU5OTExMjgwNzg3LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbNTc3LjA3NTk5MTEyODA3ODcsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs2NzYuMzc1OTkxMTI4MDc4OCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEzNzEuNDc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTQ3MC43NzU5OTExMjgwNzg5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTM3MS40NzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMzcxLjQ3NTk5MTEyODA3OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzE0NzAuNzc1OTkxMTI4MDc4OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzE1NzAuMDc1OTkxMTI4MDc4OCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzE0NzAuNzc1OTkxMTI4MDc4OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzE1NzAuMDc1OTkxMTI4MDc4OCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzE2NjkuMzc1OTkxMTI4MDc4OCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzE2NjkuMzc1OTkxMTI4MDc4OCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzE3NjguNjc1OTkxMTI4MDc4NywgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzE2NjkuMzc1OTkxMTI4MDc4OCwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzE3NjguNjc1OTkxMTI4MDc4NywgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzE4NjcuOTc1OTkxMTI4MDc4NywgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzE5NjcuMjc1OTkxMTI4MDc4NywgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzIwNjYuNTc1OTkxMTI4MDc4NCwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzIxNjUuODc1OTkxMTI4MDc4LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjA2Ni41NzU5OTExMjgwNzg0LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMjE2NS44NzU5OTExMjgwNzgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsyMDY2LjU3NTk5MTEyODA3ODQsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsyMTY1Ljg3NTk5MTEyODA3OCwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzIyNjUuMTc1OTkxMTI4MDc4LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMjM2NC40NzU5OTExMjgwNzc2LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMjI2NS4xNzU5OTExMjgwNzgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyMzY0LjQ3NTk5MTEyODA3NzYsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsyNDYzLjc3NTk5MTEyODA3NzMsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyNDYzLjc3NTk5MTEyODA3NzMsIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsyMzY0LjQ3NTk5MTEyODA3NzYsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDYwNTAuODM3ODk3MDIxMzcxXSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNTg4NS4yMzc4OTcwMjEzNzFdLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA1NzE5LjYzNzg5NzAyMTM3Ml0sCisgIFs3MTUxLjg0MDAzOTIyNDc5OCwgNTg4NS4yMzc4OTcwMjEzNzFdLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA2MDUwLjgzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzY5NTMuMjQwMDM5MjI0Nzk3LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzY5NTMuMjQwMDM5MjI0Nzk3LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs2NzU0LjY0MDAzOTIyNDc5NywgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNjY1NS4zNDAwMzkyMjQ3OTcsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzY5NTMuMjQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3MTUxLjg0MDAzOTIyNDc5OCwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzE1MS44NDAwMzkyMjQ3OTgsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzI1MS4xNDAwMzkyMjQ3OTgsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzcyNTEuMTQwMDM5MjI0Nzk4LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3MzUwLjQ0MDAzOTIyNDc5OCwgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNzQ0OS43NDAwMzkyMjQ3OTgsIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzc0NDkuNzQwMDM5MjI0Nzk4LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3NTQ5LjA0MDAzOTIyNDc5OCwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzQ0OS43NDAwMzkyMjQ3OTgsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzQ0OS43NDAwMzkyMjQ3OTgsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzU0OS4wNDAwMzkyMjQ3OTgsIDYwNTAuODM3ODk3MDIxMzcxXSwKKyAgWzc2NDguMzQwMDM5MjI0Nzk5LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzc1NDkuMDQwMDM5MjI0Nzk4LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzc2NDguMzQwMDM5MjI0Nzk5LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzc3NDcuNjQwMDM5MjI0Nzk5LCA2MjE2LjQzNzg5NzAyMTM3XSwKKyAgWzc4NDYuOTQwMDM5MjI0Nzk5LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA2MzgyLjAzNzg5NzAyMTM3XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3ODQ2Ljk0MDAzOTIyNDc5OSwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA3MDQ0LjQzNzg5NzAyMTM2NzVdLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzgxNDQuODQwMDM5MjI0Nzk5NSwgNzM3NS42Mzc4OTcwMjEzNjZdLAorICBbODE0NC44NDAwMzkyMjQ3OTk1LCA3NTQxLjIzNzg5NzAyMTM2Nl0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNzM3NS42Mzc4OTcwMjEzNjZdLAorICBbODE0NC44NDAwMzkyMjQ3OTk1LCA3MjEwLjAzNzg5NzAyMTM2N10sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNzA0NC40Mzc4OTcwMjEzNjc1XSwKKyAgWzc5NDYuMjQwMDM5MjI0Nzk5LCA3MjEwLjAzNzg5NzAyMTM2N10sCisgIFs3ODQ2Ljk0MDAzOTIyNDc5OSwgNzIxMC4wMzc4OTcwMjEzNjddLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDczNzUuNjM3ODk3MDIxMzY2XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3NTQxLjIzNzg5NzAyMTM2Nl0sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDc3MDYuODM3ODk3MDIxMzY1XSwKKyAgWzgyNDQuMTQwMDM5MjI0OCwgNzU0MS4yMzc4OTcwMjEzNjZdLAorICBbODM0My40NDAwMzkyMjQ4LCA3NTQxLjIzNzg5NzAyMTM2Nl0sCisgIFs4MzQzLjQ0MDAzOTIyNDgsIDc3MDYuODM3ODk3MDIxMzY1XSwKKyAgWzgyNDQuMTQwMDM5MjI0OCwgNzcwNi44Mzc4OTcwMjEzNjVdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAyNjc1LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMjY3NS40OTc3NjgyMTQzMjM1XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAyNTA5Ljg5Nzc2ODIxNDMyMzZdLAorICBbNDA0MC40MjM4NDI2NjE5NzQ1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQwNDAuNDIzODQyNjYxOTc0NSwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCA2ODguMjk3NzY4MjE0MzIzMV0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgNTIyLjY5Nzc2ODIxNDMyMzJdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDM1Ny4wOTc3NjgyMTQzMjMyNV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzU3LjA5Nzc2ODIxNDMyMzI1XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCA1MjIuNjk3NzY4MjE0MzIzMl0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgNjg4LjI5Nzc2ODIxNDMyMzFdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCA4NTMuODk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTUxNi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDE2ODEuODk3NzY4MjE0MzIzNF0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0OTM0LjEyMzg0MjY2MTk3NiwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAyNTA5Ljg5Nzc2ODIxNDMyMzZdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjUwOS44OTc3NjgyMTQzMjM2XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAyNjc1LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDI4NDEuMDk3NzY4MjE0MzIzNF0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAzMDA2LjY5Nzc2ODIxNDMyMzNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs2NDIzLjYyMzg0MjY2MTk3OCwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjQyMy42MjM4NDI2NjE5NzgsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0MDAwLjI5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA0MDAwLjI5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDAwMC4yOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIyM10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQwMDAuMjk3NzY4MjE0MzIyM10sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMzgzNC42OTc3NjgyMTQzMjI0XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAzNjY5LjA5Nzc2ODIxNDMyMjVdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDM1MDMuNDk3NzY4MjE0MzIyNl0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMzY2OS4wOTc3NjgyMTQzMjI1XSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCAzNjY5LjA5Nzc2ODIxNDMyMjVdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCAzODM0LjY5Nzc2ODIxNDMyMjRdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0MDAwLjI5Nzc2ODIxNDMyMjNdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDQxNjUuODk3NzY4MjE0MzIyXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs2NDIzLjYyMzg0MjY2MTk3OCwgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgNDk5My44OTc3NjgyMTQzMTk1XSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA1MTU5LjQ5Nzc2ODIxNDMxOV0sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgNTE1OS40OTc3NjgyMTQzMTldLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDUzMjUuMDk3NzY4MjE0MzE4XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNTQ5MC42OTc3NjgyMTQzMThdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDU2NTYuMjk3NzY4MjE0MzE3XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNTgyMS44OTc3NjgyMTQzMTddLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1OTg3LjQ5Nzc2ODIxNDMxNl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTk4Ny40OTc3NjgyMTQzMTZdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDU4MjEuODk3NzY4MjE0MzE3XSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNTY1Ni4yOTc3NjgyMTQzMTddLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDU2NTYuMjk3NzY4MjE0MzE3XSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA1NDkwLjY5Nzc2ODIxNDMxOF0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNTQ5MC42OTc3NjgyMTQzMThdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDUzMjUuMDk3NzY4MjE0MzE4XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA1MTU5LjQ5Nzc2ODIxNDMxOV0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgNDk5My44OTc3NjgyMTQzMTk1XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA1MTU5LjQ5Nzc2ODIxNDMxOV0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDk5My44OTc3NjgyMTQzMTk1XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTYyNi44MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDQxNC43NjEzNjUxNjg4MTUsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwNjEzLjM2MTM2NTE2ODgxNywgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDYxMy4zNjEzNjUxNjg4MTcsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwOTExLjI2MTM2NTE2ODgyLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMTAxMC41NjEzNjUxNjg4MjIsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwOTExLjI2MTM2NTE2ODgyLCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDgxMS45NjEzNjUxNjg4MiwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwNjEzLjM2MTM2NTE2ODgxNywgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDQxNC43NjEzNjUxNjg4MTUsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDM0NDguNDA1NDA5ODk2MTM0Nl0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMzQ0OC40MDU0MDk4OTYxMzQ2XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzNjE0LjAwNTQwOTg5NjEzNDZdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDM0NDguNDA1NDA5ODk2MTM0Nl0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDIyODkuMjA1NDA5ODk2MTM1M10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTYyNi44MDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTEzMC4wMDU0MDk4OTYxMzQ2XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDc5OC44MDU0MDk4OTYxMzQ2XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCA2MzMuMjA1NDA5ODk2MTM0N10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5MTIzLjg2MTM2NTE2ODgwMSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTAyNC41NjEzNjUxNjg4LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTEyMy44NjEzNjUxNjg4MDEsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAwNCwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbNjguMTcyODcxNjA1NDkwMTYsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDEzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs2OC4xNzI4NzE2MDU0OTAxNiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDEzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE5NTQuODcyODcxNjA1NDksIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMjA1NC4xNzI4NzE2MDU0OSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE5NTQuODcyODcxNjA1NDksIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsyMDU0LjE3Mjg3MTYwNTQ5LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzIyNTIuNzcyODcxNjA1NDg5NCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzIzNTIuMDcyODcxNjA1NDg5LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyNDUxLjM3Mjg3MTYwNTQ4OSwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMjM1Mi4wNzI4NzE2MDU0ODksIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzIyNTIuNzcyODcxNjA1NDg5NCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjE1My40NzI4NzE2MDU0ODk3LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMjE1My40NzI4NzE2MDU0ODk3LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzIyNTIuNzcyODcxNjA1NDg5NCwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsyMzUyLjA3Mjg3MTYwNTQ4OSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzIwNTQuMTcyODcxNjA1NDksIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE5NTQuODcyODcxNjA1NDksIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA2Mzg3Ljc4NTQ0MDkzNzg2NV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNjM4Ny43ODU0NDA5Mzc4NjVdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFs2OC4xNzI4NzE2MDU0OTAxNiwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDM5MDMuNzg1NDQwOTM3ODcyNF0sCisgIFs2OC4xNzI4NzE2MDU0OTAxMywgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxMywgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCAzNzM4LjE4NTQ0MDkzNzg3MjVdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzNzM4LjE4NTQ0MDkzNzg3MjVdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzNTcyLjU4NTQ0MDkzNzg3MjZdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCAzNDA2Ljk4NTQ0MDkzNzg3MjddLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCAzMjQxLjM4NTQ0MDkzNzg3MjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzMjQxLjM4NTQ0MDkzNzg3MjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzNDA2Ljk4NTQ0MDkzNzg3MjddLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDM1NzIuNTg1NDQwOTM3ODcyNl0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDM3MzguMTg1NDQwOTM3ODcyNV0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDM5MDMuNzg1NDQwOTM3ODcyNF0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCAzNDk1LjUwNjE0MjY0MzcxM10sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgMzY2MS4xMDYxNDI2NDM3MTI3XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgMzY2MS4xMDYxNDI2NDM3MTI3XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgMzY2MS4xMDYxNDI2NDM3MTI3XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgMzQ5NS41MDYxNDI2NDM3MTNdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCAzODI2LjcwNjE0MjY0MzcxMjZdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCAzODI2LjcwNjE0MjY0MzcxMjZdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCAzOTkyLjMwNjE0MjY0MzcxMjVdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCAzOTkyLjMwNjE0MjY0MzcxMjVdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA0MTU3LjkwNjE0MjY0MzcxMl0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDQzMjMuNTA2MTQyNjQzNzExXSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNDE1Ny45MDYxNDI2NDM3MTJdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA0MzIzLjUwNjE0MjY0MzcxMV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDQ0ODkuMTA2MTQyNjQzNzExXSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNDY1NC43MDYxNDI2NDM3MV0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNDY1NC43MDYxNDI2NDM3MV0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNDgyMC4zMDYxNDI2NDM3MV0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNDk4NS45MDYxNDI2NDM3MDldLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDQ5ODUuOTA2MTQyNjQzNzA5XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1MTUxLjUwNjE0MjY0MzcwOV0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTE1MS41MDYxNDI2NDM3MDldLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDUzMTcuMTA2MTQyNjQzNzA4XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1MzE3LjEwNjE0MjY0MzcwOF0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTQ4Mi43MDYxNDI2NDM3MDhdLAorICBbMTg5MzUuNDE1MDQxNDAxMzMsIDU2NDguMzA2MTQyNjQzNzA3XSwKKyAgWzE4ODM2LjExNTA0MTQwMTMzMiwgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE4ODM2LjExNTA0MTQwMTMzMiwgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTg5MzUuNDE1MDQxNDAxMzMsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTY0OC4zMDYxNDI2NDM3MDddLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDU2NDguMzA2MTQyNjQzNzA3XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5MjMzLjMxNTA0MTQwMTMzLCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA2NjQxLjkwNjE0MjY0MzcwNF0sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjgwNy41MDYxNDI2NDM3MDNdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDY2NDEuOTA2MTQyNjQzNzA0XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5NDMxLjkxNTA0MTQwMTMyNywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTUzMS4yMTUwNDE0MDEzMjcsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA2NjQxLjkwNjE0MjY0MzcwNF0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDY4MDcuNTA2MTQyNjQzNzAzXSwKKyAgWzE5ODI5LjExNTA0MTQwMTMyNSwgNjk3My4xMDYxNDI2NDM3MDNdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA2OTczLjEwNjE0MjY0MzcwM10sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDcxMzguNzA2MTQyNjQzNzAyXSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzEzOC43MDYxNDI2NDM3MDJdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzE5ODI5LjExNTA0MTQwMTMyNSwgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzYzNS41MDYxNDI2NDM3MDA1XSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzYzNS41MDYxNDI2NDM3MDA1XSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMTI3LjAxNTA0MTQwMTMyMiwgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAzMjUuNjE1MDQxNDAxMzIsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDIyNi4zMTUwNDE0MDEzMiwgNzYzNS41MDYxNDI2NDM3MDA1XSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsyMDIyNi4zMTUwNDE0MDEzMiwgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzIwMTI3LjAxNTA0MTQwMTMyMiwgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzI5NDcuMzkwMzA2NzMyMjM2MiwgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszMjQ1LjI5MDMwNjczMjIzNTQsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzMyNDUuMjkwMzA2NzMyMjM1NCwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzM0NC41OTAzMDY3MzIyMzUsIDM1MjIuMTU1MzE0NzQ5Mjg2XSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzM2NDIuNDkwMzA2NzMyMjM0MywgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzc0MS43OTAzMDY3MzIyMzQsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM3NDEuNzkwMzA2NzMyMjM0LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMzg0MS4wOTAzMDY3MzIyMzQsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM4NDEuMDkwMzA2NzMyMjM0LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNzQxLjc5MDMwNjczMjIzNCwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzY0Mi40OTAzMDY3MzIyMzQzLCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNjQyLjQ5MDMwNjczMjIzNDMsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzUyMi4xNTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzM0NC41OTAzMDY3MzIyMzUsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMyNDUuMjkwMzA2NzMyMjM1NCwgMzg1My4zNTUzMTQ3NDkyODU4XSwKKyAgWzMyNDUuMjkwMzA2NzMyMjM1NCwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzg1My4zNTUzMTQ3NDkyODU4XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgNDAxOC45NTUzMTQ3NDkyODU3XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzg1My4zNTUzMTQ3NDkyODU4XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDM1MjIuMTU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzI5NDcuMzkwMzA2NzMyMjM2MiwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFsyOTQ3LjM5MDMwNjczMjIzNjIsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFsyNjQ5LjQ5MDMwNjczMjIzNywgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDIxOTcuMzU1MzE0NzQ5Mjg2N10sCisgIFsyNjQ5LjQ5MDMwNjczMjIzNywgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyMTk3LjM1NTMxNDc0OTI4NjddLAorICBbMjU1MC4xOTAzMDY3MzIyMzczLCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjQ1MC44OTAzMDY3MzIyMzc2LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDIxOTcuMzU1MzE0NzQ5Mjg2N10sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAyMDMxLjc1NTMxNDc0OTI4NjVdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDE4NjYuMTU1MzE0NzQ5Mjg2NF0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMTg2Ni4xNTUzMTQ3NDkyODY0XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAxNzAwLjU1NTMxNDc0OTI4NjNdLAorICBbMjQ1MC44OTAzMDY3MzIyMzc2LCAxNTM0Ljk1NTMxNDc0OTI4NjFdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAxNTM0Ljk1NTMxNDc0OTI4NjFdLAorICBbMjE1Mi45OTAzMDY3MzIyMzg0LCAxMzY5LjM1NTMxNDc0OTI4Nl0sCisgIFsyMDUzLjY5MDMwNjczMjIzODcsIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzE5NTQuMzkwMzA2NzMyMjM4NywgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzE4NTUuMDkwMzA2NzMyMjM4OCwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzE3NTUuNzkwMzA2NzMyMjM4OCwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxNzU1Ljc5MDMwNjczMjIzODgsIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgNTQxLjM1NTMxNDc0OTI4NTldLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDM3NS43NTUzMTQ3NDkyODU5XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgMjEwLjE1NTMxNDc0OTI4NTldLAorICBbMTc1NS43OTAzMDY3MzIyMzg4LCA0NC41NTUzMTQ3NDkyODU5Ml0sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDQ0LjU1NTMxNDc0OTI4NTkyXSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgMjEwLjE1NTMxNDc0OTI4NTldLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDQ0LjU1NTMxNDc0OTI4NTkyXSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgMzc1Ljc1NTMxNDc0OTI4NTg0XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCAyMTAuMTU1MzE0NzQ5Mjg1ODVdLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDM3NS43NTUzMTQ3NDkyODU4NF0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgNTQxLjM1NTMxNDc0OTI4NTldLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzE1NTcuMTkwMzA2NzMyMjM5LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxNzI1NC41NzI1MTU1NDY2NjgsIDE0NjAuNTgwNzgwMTI0NDkyM10sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDE2MjYuMTgwNzgwMTI0NDkyNV0sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDE3OTEuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDE3OTEuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDE2MjYuMTgwNzgwMTI0NDkyNV0sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDE3OTEuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDE5NTcuMzgwNzgwMTI0NDkyN10sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDIxMjIuOTgwNzgwMTI0NDkzXSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjI4OC41ODA3ODAxMjQ0OTNdLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAyNDU0LjE4MDc4MDEyNDQ5MjddLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyNjE5Ljc4MDc4MDEyNDQ5MjZdLAorICBbMTc1NTIuNDcyNTE1NTQ2NjY2LCAyNjE5Ljc4MDc4MDEyNDQ5MjZdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyNzg1LjM4MDc4MDEyNDQ5MjVdLAorICBbMTczNTMuODcyNTE1NTQ2NjY3LCAyNjE5Ljc4MDc4MDEyNDQ5MjZdLAorICBbMTcyNTQuNTcyNTE1NTQ2NjY4LCAyNDU0LjE4MDc4MDEyNDQ5MjddLAorICBbMTcyNTQuNTcyNTE1NTQ2NjY4LCAyMjg4LjU4MDc4MDEyNDQ5M10sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjEyMi45ODA3ODAxMjQ0OTNdLAorICBbMTc1NTIuNDcyNTE1NTQ2NjY2LCAyMjg4LjU4MDc4MDEyNDQ5M10sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgNTA5Mi4zNDE2ODI2OTEyOTldLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgNTI1Ny45NDE2ODI2OTEyOThdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNTI1Ny45NDE2ODI2OTEyOThdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNTA5Mi4zNDE2ODI2OTEyOTldLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgNTA5Mi4zNDE2ODI2OTEyOTldLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNDc0NS41NzYyNDQ2NjI4MzA1LCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQ4NDQuODc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs0ODQ0Ljg3NjI0NDY2MjgzMSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ5NDQuMTc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzUxNDIuNzc2MjQ0NjYyODMxLCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs1MjQyLjA3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzUyNDIuMDc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs1MjQyLjA3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzUxNDIuNzc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDk0NC4xNzYyNDQ2NjI4MzEsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDk0NC4xNzYyNDQ2NjI4MzEsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ4NDQuODc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgMzc2Ny41NDE2ODI2OTEzMDI0XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDM2MDEuOTQxNjgyNjkxMzAyNV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgMzc2Ny41NDE2ODI2OTEzMDI0XSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQxNDkuNzc2MjQ0NjYyODI5LCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDA1MC40NzYyNDQ2NjI4Mjk3LCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0MDUwLjQ3NjI0NDY2MjgyOTcsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFszOTUxLjE3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbMzk1MS4xNzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbMzg1MS44NzYyNDQ2NjI4MzAyLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszODUxLjg3NjI0NDY2MjgzMDIsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzM3NTIuNTc2MjQ0NjYyODMwNSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbMzY1My4yNzYyNDQ2NjI4MzEsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzM1NTMuOTc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszNTUzLjk3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbMzQ1NC42NzYyNDQ2NjI4MzEzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszNTUzLjk3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbMzY1My4yNzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM3NTIuNTc2MjQ0NjYyODMwNSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbMzc1Mi41NzYyNDQ2NjI4MzA1LCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszODUxLjg3NjI0NDY2MjgzMDIsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzk1MS4xNzYyNDQ2NjI4MywgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDA1MC40NzYyNDQ2NjI4Mjk3LCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0MTQ5Ljc3NjI0NDY2MjgyOSwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzk1NzQuMDg4OTAyMTM1NjA3LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzk0NzQuNzg4OTAyMTM1NjA2LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzkzNzUuNDg4OTAyMTM1NjA1LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFs5NDc0Ljc4ODkwMjEzNTYwNiwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzk1NzQuMDg4OTAyMTM1NjA3LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbOTQ3NC43ODg5MDIxMzU2MDYsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzk1NzQuMDg4OTAyMTM1NjA3LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFs5NjczLjM4ODkwMjEzNTYwOCwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzk2NzMuMzg4OTAyMTM1NjA4LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFs5NzcyLjY4ODkwMjEzNTYxLCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFs5NjczLjM4ODkwMjEzNTYwOCwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbOTc3Mi42ODg5MDIxMzU2MSwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbOTg3MS45ODg5MDIxMzU2MSwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNjAyNy40NjI5MzkwNTU4MTVdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzk4NzEuOTg4OTAyMTM1NjEsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzk4NzEuOTg4OTAyMTM1NjEsIDU2OTYuMjYyOTM5MDU1ODE2XSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA1NTMwLjY2MjkzOTA1NTgxNl0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDU1MzAuNjYyOTM5MDU1ODE2XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNTY5Ni4yNjI5MzkwNTU4MTZdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDU2OTYuMjYyOTM5MDU1ODE2XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjAyNy40NjI5MzkwNTU4MTVdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDYwMjcuNDYyOTM5MDU1ODE1XSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzUxNy44NjI5MzkwNTU4MV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDc2ODMuNDYyOTM5MDU1ODA5XSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNzUxNy44NjI5MzkwNTU4MV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDc2ODMuNDYyOTM5MDU1ODA5XSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNzY4My40NjI5MzkwNTU4MDldLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA3NTE3Ljg2MjkzOTA1NTgxXSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMjY5LjE4ODkwMjEzNTYxNSwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTA2NjYuMzg4OTAyMTM1NjE5LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDY2Ni4zODg5MDIxMzU2MTksIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTA3My42OTQ0MzU0Mzc0NzE0LCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbOTc0LjM5NDQzNTQzNzQ3MTMsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgNDkxLjk2ODEyMDQwMzI2NDhdLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgMTk4Mi4zNjgxMjA0MDMyNjUzXSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAyMTQ3Ljk2ODEyMDQwMzI2NTRdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDIzMTMuNTY4MTIwNDAzMjY1M10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDIxNDcuOTY4MTIwNDAzMjY1NF0sCisgIFs4MC42OTQ0MzU0Mzc0NzExNCwgMjMxMy41NjgxMjA0MDMyNjUzXSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTE0LCAyNDc5LjE2ODEyMDQwMzI2NV0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMjY0NC43NjgxMjA0MDMyNjVdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDI0NzkuMTY4MTIwNDAzMjY1XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAyMzEzLjU2ODEyMDQwMzI2NTNdLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDIxNDcuOTY4MTIwNDAzMjY1NF0sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMTk4Mi4zNjgxMjA0MDMyNjUzXSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAxOTgyLjM2ODEyMDQwMzI2NTNdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMzI2LjM2ODEyMDQwMzI2NDhdLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxNjAuNzY4MTIwNDAzMjY0ODJdLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDE2MC43NjgxMjA0MDMyNjQ4Ml0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgMzI2LjM2ODEyMDQwMzI2NDhdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTE0LCA0OTEuOTY4MTIwNDAzMjY0OF0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDMyNi4zNjgxMjA0MDMyNjQ4XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA0OTEuOTY4MTIwNDAzMjY0OF0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTE0LCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzU3Ny4xOTQ0MzU0Mzc0NzEsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs5NzQuMzk0NDM1NDM3NDcxMywgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs2NzYuNDk0NDM1NDM3NDcxMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMjUyMS40NDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjUyMS40NDU2MDIwNjA1MjNdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDI2ODcuMDQ1NjAyMDYwNTIzXSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAyODUyLjY0NTYwMjA2MDUyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDI2ODcuMDQ1NjAyMDYwNTIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMjUyMS40NDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzgzMy41MTM1NjI0MzE2OTUsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzM5MzIuODEzNTYyNDMxNjk0NywgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMzgzMy41MTM1NjI0MzE2OTUsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzM4MzMuNTEzNTYyNDMxNjk1LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMTE5Ni42NDU2MDIwNjA1MjI0XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTE5Ni42NDU2MDIwNjA1MjI0XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTAzMS4wNDU2MDIwNjA1MjIyXSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAxMDMxLjA0NTYwMjA2MDUyMjJdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCA4NjUuNDQ1NjAyMDYwNTIyMl0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgODY1LjQ0NTYwMjA2MDUyMjJdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCA2OTkuODQ1NjAyMDYwNTIyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDY5OS44NDU2MDIwNjA1MjIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgNTM0LjI0NTYwMjA2MDUyMjRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDM2OC42NDU2MDIwNjA1MjI0NF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMjAzLjA0NTYwMjA2MDUyMjQ0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMzcuNDQ1NjAyMDYwNTIyNDU0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAzNy40NDU2MDIwNjA1MjI0NTRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAyMDMuMDQ1NjAyMDYwNTIyNDRdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAzNy40NDU2MDIwNjA1MjI0NTRdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDIwMy4wNDU2MDIwNjA1MjI0NF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDM2OC42NDU2MDIwNjA1MjI0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDY5OS44NDU2MDIwNjA1MjIzXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgNTM0LjI0NTYwMjA2MDUyMjRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCA4NjUuNDQ1NjAyMDYwNTIyMl0sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMTAzMS4wNDU2MDIwNjA1MjIyXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMTE5Ni42NDU2MDIwNjA1MjI0XSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAxMzYyLjI0NTYwMjA2MDUyMjVdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAxMzYyLjI0NTYwMjA2MDUyMjVdLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAxNjkzLjQ0NTYwMjA2MDUyMjhdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAxODM5LjgxODg4NDgwMzI5OV0sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDE4MzkuODE4ODg0ODAzMjk5XSwKKyAgWzE2Mzg4LjQxMjExNzY3NTkyNSwgMTY3NC4yMTg4ODQ4MDMyOTg4XSwKKyAgWzE2NDg3LjcxMjExNzY3NTkyNSwgMTUwOC42MTg4ODQ4MDMyOTg3XSwKKyAgWzE2NDg3LjcxMjExNzY3NTkyNSwgMTY3NC4yMTg4ODQ4MDMyOTg4XSwKKyAgWzE2Mzg4LjQxMjExNzY3NTkyNSwgMTUwOC42MTg4ODQ4MDMyOTg3XSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMTM0My4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMTUwOC42MTg4ODQ4MDMyOTg3XSwKKyAgWzE2MTg5LjgxMjExNzY3NTkyMywgMTY3NC4yMTg4ODQ4MDMyOTg4XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMTgzOS44MTg4ODQ4MDMyOTldLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAyMDA1LjQxODg4NDgwMzI5OV0sCisgIFsxNTk5MS4yMTIxMTc2NzU5MjEsIDIxNzEuMDE4ODg0ODAzMjk5XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMjMzNi42MTg4ODQ4MDMyOTldLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAyNTAyLjIxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDI2NjcuODE4ODg0ODAzMjk4N10sCisgIFsxNTk5MS4yMTIxMTc2NzU5MjEsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNTk5MS4yMTIxMTc2NzU5MjEsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNTg5MS45MTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE1ODkxLjkxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTU5OTEuMjEyMTE3Njc1OTIxLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTYxODkuODEyMTE3Njc1OTIzLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTYxODkuODEyMTE3Njc1OTIzLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTYxODkuODEyMTE3Njc1OTIzLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjY4Ni4zMTIxMTc2NzU5MjMsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzgyNy4wMTg4ODQ4MDMyOThdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDM5OTIuNjE4ODg0ODAzMjk4XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzODI3LjAxODg4NDgwMzI5OF0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE3MjgyLjExMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTcyODIuMTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDI2NjcuODE4ODg0ODAzMjk4N10sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMjY2Ny44MTg4ODQ4MDMyOTg3XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDI5OTkuMDE4ODg0ODAzMjk4NV0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2Njg2LjMxMjExNzY3NTkyMywgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2NTg3LjAxMjExNzY3NTkyNCwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2NTg3LjAxMjExNzY3NTkyNCwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2NDg3LjcxMjExNzY3NTkyNSwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2NTg3LjAxMjExNzY3NTkyNCwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2Njg2LjMxMjExNzY3NTkyMywgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE2Njg2LjMxMjExNzY3NTkyMywgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzEzNzEuNDc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzMDE0Ljc3MDAyMjQzNjUwNV0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzMDE0Ljc3MDAyMjQzNjUwNV0sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzAxNC43NzAwMjI0MzY1MDVdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDI4NDkuMTcwMDIyNDM2NTA1XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzMDE0Ljc3MDAyMjQzNjUwNV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzY3Ni4zNzU5OTExMjgwNzg4LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzY3Ni4zNzU5OTExMjgwNzg4LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbNTc3LjA3NTk5MTEyODA3ODcsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs1NzcuMDc1OTkxMTI4MDc4NywgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzY3Ni4zNzU5OTExMjgwNzg4LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTA3My41NzU5OTExMjgwNzksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTA3My41NzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTM3MS40NzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFsxNDcwLjc3NTk5MTEyODA3ODksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMzcxLjQ3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEzNzEuNDc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTQ3MC43NzU5OTExMjgwNzg5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTU3MC4wNzU5OTExMjgwNzg4LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTQ3MC43NzU5OTExMjgwNzg5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTU3MC4wNzU5OTExMjgwNzg4LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTY2OS4zNzU5OTExMjgwNzg4LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTY2OS4zNzU5OTExMjgwNzg4LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTc2OC42NzU5OTExMjgwNzg3LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTY2OS4zNzU5OTExMjgwNzg4LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTc2OC42NzU5OTExMjgwNzg3LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMTg2Ny45NzU5OTExMjgwNzg3LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTk2Ny4yNzU5OTExMjgwNzg3LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjA2Ni41NzU5OTExMjgwNzg0LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjE2NS44NzU5OTExMjgwNzgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsyMDY2LjU3NTk5MTEyODA3ODQsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsyMTY1Ljg3NTk5MTEyODA3OCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzIwNjYuNTc1OTkxMTI4MDc4NCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzIxNjUuODc1OTkxMTI4MDc4LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjI2NS4xNzU5OTExMjgwNzgsIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsyMzY0LjQ3NTk5MTEyODA3NzYsIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsyMjY1LjE3NTk5MTEyODA3OCwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzIzNjQuNDc1OTkxMTI4MDc3NiwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzI0NjMuNzc1OTkxMTI4MDc3MywgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzI0NjMuNzc1OTkxMTI4MDc3MywgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzIzNjQuNDc1OTkxMTI4MDc3NiwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2MDUwLjgzNzg5NzAyMTM3MV0sCisgIFs2OTUzLjI0MDAzOTIyNDc5NywgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNzA1Mi41NDAwMzkyMjQ3OTc1LCA1ODg1LjIzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDU3MTkuNjM3ODk3MDIxMzcyXSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA1ODg1LjIzNzg5NzAyMTM3MV0sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDYwNTAuODM3ODk3MDIxMzcxXSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3MDUyLjU0MDAzOTIyNDc5NzUsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjg1My45NDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzY3NTQuNjQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs2NjU1LjM0MDAzOTIyNDc5NywgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbNjc1NC42NDAwMzkyMjQ3OTcsIDY4NzguODM3ODk3MDIxMzY4XSwKKyAgWzY4NTMuOTQwMDM5MjI0Nzk3LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs2ODUzLjk0MDAzOTIyNDc5NywgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNjk1My4yNDAwMzkyMjQ3OTcsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzcwNTIuNTQwMDM5MjI0Nzk3NSwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzE1MS44NDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzcxNTEuODQwMDM5MjI0Nzk4LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3MTUxLjg0MDAzOTIyNDc5OCwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3MjUxLjE0MDAzOTIyNDc5OCwgNjU0Ny42Mzc4OTcwMjEzNjldLAorICBbNzI1MS4xNDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzczNTAuNDQwMDM5MjI0Nzk4LCA2ODc4LjgzNzg5NzAyMTM2OF0sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNzQ0OS43NDAwMzkyMjQ3OTgsIDY3MTMuMjM3ODk3MDIxMzY5XSwKKyAgWzc1NDkuMDQwMDM5MjI0Nzk4LCA2NTQ3LjYzNzg5NzAyMTM2OV0sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjM4Mi4wMzc4OTcwMjEzN10sCisgIFs3NDQ5Ljc0MDAzOTIyNDc5OCwgNjIxNi40Mzc4OTcwMjEzN10sCisgIFs3NTQ5LjA0MDAzOTIyNDc5OCwgNjA1MC44Mzc4OTcwMjEzNzFdLAorICBbNzY0OC4zNDAwMzkyMjQ3OTksIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzU0OS4wNDAwMzkyMjQ3OTgsIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzY0OC4zNDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzc0Ny42NDAwMzkyMjQ3OTksIDYyMTYuNDM3ODk3MDIxMzddLAorICBbNzg0Ni45NDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDYzODIuMDM3ODk3MDIxMzddLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzc4NDYuOTQwMDM5MjI0Nzk5LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjcxMy4yMzc4OTcwMjEzNjldLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDY1NDcuNjM3ODk3MDIxMzY5XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA2NzEzLjIzNzg5NzAyMTM2OV0sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNjg3OC44Mzc4OTcwMjEzNjhdLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDcwNDQuNDM3ODk3MDIxMzY3NV0sCisgIFs4MDQ1LjU0MDAzOTIyNDc5OSwgNzIxMC4wMzc4OTcwMjEzNjddLAorICBbODE0NC44NDAwMzkyMjQ3OTk1LCA3Mzc1LjYzNzg5NzAyMTM2Nl0sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3Mzc1LjYzNzg5NzAyMTM2Nl0sCisgIFs4MTQ0Ljg0MDAzOTIyNDc5OTUsIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzgwNDUuNTQwMDM5MjI0Nzk5LCA3MDQ0LjQzNzg5NzAyMTM2NzVdLAorICBbNzk0Ni4yNDAwMzkyMjQ3OTksIDcyMTAuMDM3ODk3MDIxMzY3XSwKKyAgWzc4NDYuOTQwMDM5MjI0Nzk5LCA3MjEwLjAzNzg5NzAyMTM2N10sCisgIFs3OTQ2LjI0MDAzOTIyNDc5OSwgNzM3NS42Mzc4OTcwMjEzNjZdLAorICBbODA0NS41NDAwMzkyMjQ3OTksIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgxNDQuODQwMDM5MjI0Nzk5NSwgNzcwNi44Mzc4OTcwMjEzNjVdLAorICBbODI0NC4xNDAwMzkyMjQ4LCA3NTQxLjIzNzg5NzAyMTM2Nl0sCisgIFs4MzQzLjQ0MDAzOTIyNDgsIDc1NDEuMjM3ODk3MDIxMzY2XSwKKyAgWzgzNDMuNDQwMDM5MjI0OCwgNzcwNi44Mzc4OTcwMjEzNjVdLAorICBbODI0NC4xNDAwMzkyMjQ4LCA3NzA2LjgzNzg5NzAyMTM2NV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0NDM3LjYyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0MzM4LjMyMzg0MjY2MTk3NSwgMjUwOS44OTc3NjgyMTQzMjM2XSwKKyAgWzQyMzkuMDIzODQyNjYxOTc0LCAyNjc1LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDEzOS43MjM4NDI2NjE5NzQsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0MDQwLjQyMzg0MjY2MTk3NDUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjE3OC42OTc3NjgyMTQzMjRdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDA0MC40MjM4NDI2NjE5NzQ1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0MTM5LjcyMzg0MjY2MTk3NCwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQxMzkuNzIzODQyNjYxOTc0LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDIzOS4wMjM4NDI2NjE5NzQsIDIwMTMuMDk3NzY4MjE0MzIzN10sCisgIFs0MjM5LjAyMzg0MjY2MTk3NCwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzQzMzguMzIzODQyNjYxOTc1LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0NTM2LjkyMzg0MjY2MTk3NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDQzNy42MjM4NDI2NjE5NzUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDY4OC4yOTc3NjgyMTQzMjMxXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCA1MjIuNjk3NzY4MjE0MzIzMl0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzU3LjA5Nzc2ODIxNDMyMzI1XSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzNTcuMDk3NzY4MjE0MzIzMjVdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDUyMi42OTc3NjgyMTQzMjMyXSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCA2ODguMjk3NzY4MjE0MzIzMV0sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgODUzLjg5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxMTg1LjA5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNTAzMy40MjM4NDI2NjE5NzYsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDg1My44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMTAxOS40OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDExODUuMDk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDEwMTkuNDk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxMDE5LjQ5Nzc2ODIxNDMyM10sCisgIFs1NTI5LjkyMzg0MjY2MTk3NywgMTE4NS4wOTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAxMzUwLjY5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTg0Ny40OTc3NjgyMTQzMjM1XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAxNjgxLjg5Nzc2ODIxNDMyMzRdLAorICBbNTMzMS4zMjM4NDI2NjE5NzYsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMTM1MC42OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDEzNTAuNjk3NzY4MjE0MzIzXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAxNTE2LjI5Nzc2ODIxNDMyMzJdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDE1MTYuMjk3NzY4MjE0MzIzMl0sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMTY4MS44OTc3NjgyMTQzMjM0XSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAxODQ3LjQ5Nzc2ODIxNDMyMzVdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDE4NDcuNDk3NzY4MjE0MzIzNV0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMjAxMy4wOTc3NjgyMTQzMjM3XSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ5MzQuMTIzODQyNjYxOTc2LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDgzNC44MjM4NDI2NjE5NzU1LCAyMTc4LjY5Nzc2ODIxNDMyNF0sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDIzNDQuMjk3NzY4MjE0MzIzN10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMjM0NC4yOTc3NjgyMTQzMjM3XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyMDEzLjA5Nzc2ODIxNDMyMzddLAorICBbNDMzOC4zMjM4NDI2NjE5NzUsIDIxNzguNjk3NzY4MjE0MzI0XSwKKyAgWzQ0MzcuNjIzODQyNjYxOTc1LCAyMzQ0LjI5Nzc2ODIxNDMyMzddLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDI1MDkuODk3NzY4MjE0MzIzNl0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjY3NS40OTc3NjgyMTQzMjM1XSwKKyAgWzQ2MzYuMjIzODQyNjYxOTc1LCAyNTA5Ljg5Nzc2ODIxNDMyMzZdLAorICBbNDUzNi45MjM4NDI2NjE5NzUsIDI2NzUuNDk3NzY4MjE0MzIzNV0sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMjg0MS4wOTc3NjgyMTQzMjM0XSwKKyAgWzQ1MzYuOTIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDYzNi4yMjM4NDI2NjE5NzUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NzM1LjUyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNDczNS41MjM4NDI2NjE5NzUsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs0NjM2LjIyMzg0MjY2MTk3NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzQ3MzUuNTIzODQyNjYxOTc1LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs0ODM0LjgyMzg0MjY2MTk3NTUsIDM4MzQuNjk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzUwMzMuNDIzODQyNjYxOTc2LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzQ4MzQuODIzODQyNjYxOTc1NSwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNDkzNC4xMjM4NDI2NjE5NzYsIDMxNzIuMjk3NzY4MjE0MzIzMl0sCisgIFs1MDMzLjQyMzg0MjY2MTk3NiwgMzAwNi42OTc3NjgyMTQzMjMzXSwKKyAgWzUxMzIuNzIzODQyNjYxOTc2LCAyODQxLjA5Nzc2ODIxNDMyMzRdLAorICBbNTEzMi43MjM4NDI2NjE5NzYsIDMwMDYuNjk3NzY4MjE0MzIzM10sCisgIFs1MjMyLjAyMzg0MjY2MTk3NiwgMzE3Mi4yOTc3NjgyMTQzMjMyXSwKKyAgWzUyMzIuMDIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1MTMyLjcyMzg0MjY2MTk3NiwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTIzMi4wMjM4NDI2NjE5NzYsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1MzMxLjMyMzg0MjY2MTk3NiwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzUzMzEuMzIzODQyNjYxOTc2LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs1NDMwLjYyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNTQzMC42MjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCAzMTcyLjI5Nzc2ODIxNDMyMzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAzMzM3Ljg5Nzc2ODIxNDMyM10sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDM1MDMuNDk3NzY4MjE0MzIzXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCAzNjY5LjA5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgMzUwMy40OTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgMzMzNy44OTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDMzMzcuODk3NzY4MjE0MzIzXSwKKyAgWzY0MjMuNjIzODQyNjYxOTc4LCAzNTAzLjQ5Nzc2ODIxNDMyM10sCisgIFs2MzI0LjMyMzg0MjY2MTk3OCwgMzY2OS4wOTc3NjgyMTQzMjNdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDM2NjkuMDk3NzY4MjE0MzIzXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2NDIzLjYyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCAzODM0LjY5Nzc2ODIxNDMyM10sCisgIFs2MTI1LjcyMzg0MjY2MTk3OCwgMzgzNC42OTc3NjgyMTQzMjNdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDQwMDAuMjk3NzY4MjE0MzIzXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0MDAwLjI5Nzc2ODIxNDMyM10sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDAwMC4yOTc3NjgyMTQzMjIzXSwKKyAgWzU5MjcuMTIzODQyNjYxOTc3NSwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjAyNi40MjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU4MjcuODIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDgyOC4yOTc3NjgyMTQzMl0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDQ5Ny4wOTc3NjgyMTQzMjFdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA0MzMxLjQ5Nzc2ODIxNDMyMl0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNTcyOC41MjM4NDI2NjE5NzcsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0MTY1Ljg5Nzc2ODIxNDMyMl0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNDAwMC4yOTc3NjgyMTQzMjIzXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCAzODM0LjY5Nzc2ODIxNDMyMjRdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIyNV0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgMzUwMy40OTc3NjgyMTQzMjI2XSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCAzNjY5LjA5Nzc2ODIxNDMyMjVdLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDM2NjkuMDk3NzY4MjE0MzIyNV0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDM4MzQuNjk3NzY4MjE0MzIyNF0sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDQwMDAuMjk3NzY4MjE0MzIyM10sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNDE2NS44OTc3NjgyMTQzMjJdLAorICBbNjEyNS43MjM4NDI2NjE5NzgsIDQzMzEuNDk3NzY4MjE0MzIyXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs2MjI1LjAyMzg0MjY2MTk3OCwgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNjMyNC4zMjM4NDI2NjE5NzgsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzYyMjUuMDIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzY0MjMuNjIzODQyNjYxOTc4LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzYzMjQuMzIzODQyNjYxOTc4LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNjIyNS4wMjM4NDI2NjE5NzgsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzYxMjUuNzIzODQyNjYxOTc4LCA1MTU5LjQ5Nzc2ODIxNDMxOV0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTMyNS4wOTc3NjgyMTQzMThdLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1NDkwLjY5Nzc2ODIxNDMxOF0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTY1Ni4yOTc3NjgyMTQzMTddLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1ODIxLjg5Nzc2ODIxNDMxN10sCisgIFs1OTI3LjEyMzg0MjY2MTk3NzUsIDU5ODcuNDk3NzY4MjE0MzE2XSwKKyAgWzYwMjYuNDIzODQyNjYxOTc4LCA1OTg3LjQ5Nzc2ODIxNDMxNl0sCisgIFs2MDI2LjQyMzg0MjY2MTk3OCwgNTgyMS44OTc3NjgyMTQzMTddLAorICBbNTkyNy4xMjM4NDI2NjE5Nzc1LCA1NjU2LjI5Nzc2ODIxNDMxN10sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNTY1Ni4yOTc3NjgyMTQzMTddLAorICBbNTgyNy44MjM4NDI2NjE5NzcsIDU0OTAuNjk3NzY4MjE0MzE4XSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA1NDkwLjY5Nzc2ODIxNDMxOF0sCisgIFs1NjI5LjIyMzg0MjY2MTk3NywgNTMyNS4wOTc3NjgyMTQzMThdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDUxNTkuNDk3NzY4MjE0MzE5XSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0OTkzLjg5Nzc2ODIxNDMxOTVdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ4MjguMjk3NzY4MjE0MzJdLAorICBbNTUyOS45MjM4NDI2NjE5NzcsIDQ2NjIuNjk3NzY4MjE0MzIxXSwKKyAgWzU0MzAuNjIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU1MjkuOTIzODQyNjYxOTc3LCA0ODI4LjI5Nzc2ODIxNDMyXSwKKyAgWzU2MjkuMjIzODQyNjYxOTc3LCA0NjYyLjY5Nzc2ODIxNDMyMV0sCisgIFs1NzI4LjUyMzg0MjY2MTk3NywgNDY2Mi42OTc3NjgyMTQzMjFdLAorICBbNTYyOS4yMjM4NDI2NjE5NzcsIDQ0OTcuMDk3NzY4MjE0MzIxXSwKKyAgWzU3MjguNTIzODQyNjYxOTc3LCA0NDk3LjA5Nzc2ODIxNDMyMV0sCisgIFs1ODI3LjgyMzg0MjY2MTk3NywgNDMzMS40OTc3NjgyMTQzMjJdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMzI4Mi44MDU0MDk4OTYxMzQ3XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDIxMjMuNjA1NDA5ODk2MTM1NF0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgMTk1OC4wMDU0MDk4OTYxMzUyXSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk1MjEuMDYxMzY1MTY4ODA1LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTYyMC4zNjEzNjUxNjg4MDcsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTQ2MS4yMDU0MDk4OTYxMzQ4XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAxMjk1LjYwNTQwOTg5NjEzNDddLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5ODE4Ljk2MTM2NTE2ODgwOSwgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5OTE4LjI2MTM2NTE2ODgxLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgOTY0LjQwNTQwOTg5NjEzNDVdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbMTAxMTYuODYxMzY1MTY4ODEyLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDExMzAuMDA1NDA5ODk2MTM0Nl0sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDEyOTUuNjA1NDA5ODk2MTM0N10sCisgIFsxMDIxNi4xNjEzNjUxNjg4MTMsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAxNzkyLjQwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDE3OTIuNDA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAxOTU4LjAwNTQwOTg5NjEzNTJdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzk5MTguMjYxMzY1MTY4ODEsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFsxMDAxNy41NjEzNjUxNjg4MSwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMjEyMy42MDU0MDk4OTYxMzU0XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTAwMTcuNTYxMzY1MTY4ODEsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwMTE2Ljg2MTM2NTE2ODgxMiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTAzMTUuNDYxMzY1MTY4ODE0LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgMjQ1NC44MDU0MDk4OTYxMzVdLAorICBbMTA1MTQuMDYxMzY1MTY4ODE2LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDYxMy4zNjEzNjUxNjg4MTcsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwNTE0LjA2MTM2NTE2ODgxNiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNjEzLjM2MTM2NTE2ODgxNywgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyMjg5LjIwNTQwOTg5NjEzNTNdLAorICBbMTA3MTIuNjYxMzY1MTY4ODE5LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzExMDEwLjU2MTM2NTE2ODgyMiwgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTA5MTEuMjYxMzY1MTY4ODIsIDI0NTQuODA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyNjIwLjQwNTQwOTg5NjEzNV0sCisgIFsxMDcxMi42NjEzNjUxNjg4MTksIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwODExLjk2MTM2NTE2ODgyLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDkxMS4yNjEzNjUxNjg4MiwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA4MTEuOTYxMzY1MTY4ODIsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwNzEyLjY2MTM2NTE2ODgxOSwgMjk1MS42MDU0MDk4OTYxMzVdLAorICBbMTA2MTMuMzYxMzY1MTY4ODE3LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDUxNC4wNjEzNjUxNjg4MTYsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwNDE0Ljc2MTM2NTE2ODgxNSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTA0MTQuNzYxMzY1MTY4ODE1LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI3ODYuMDA1NDA5ODk2MTM1XSwKKyAgWzEwMjE2LjE2MTM2NTE2ODgxMywgMjYyMC40MDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAyNzg2LjAwNTQwOTg5NjEzNV0sCisgIFsxMDMxNS40NjEzNjUxNjg4MTQsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzEwMzE1LjQ2MTM2NTE2ODgxNCwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbMTAyMTYuMTYxMzY1MTY4ODEzLCAzMTE3LjIwNTQwOTg5NjEzNV0sCisgIFsxMDExNi44NjEzNjUxNjg4MTIsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMzQ0OC40MDU0MDk4OTYxMzQ2XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzNDQ4LjQwNTQwOTg5NjEzNDZdLAorICBbOTgxOC45NjEzNjUxNjg4MDksIDM2MTQuMDA1NDA5ODk2MTM0Nl0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMzQ0OC40MDU0MDk4OTYxMzQ2XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAzMjgyLjgwNTQwOTg5NjEzNDddLAorICBbOTcxOS42NjEzNjUxNjg4MDgsIDMxMTcuMjA1NDA5ODk2MTM1XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDMyODIuODA1NDA5ODk2MTM0N10sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMzExNy4yMDU0MDk4OTYxMzVdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDI5NTEuNjA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAyOTUxLjYwNTQwOTg5NjEzNV0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgMjc4Ni4wMDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDI2MjAuNDA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAyNDU0LjgwNTQwOTg5NjEzNV0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMjI4OS4yMDU0MDk4OTYxMzUzXSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAyMTIzLjYwNTQwOTg5NjEzNTRdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE5NTguMDA1NDA5ODk2MTM1Ml0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxNjI2LjgwNTQwOTg5NjEzNV0sCisgIFs5MzIyLjQ2MTM2NTE2ODgwMywgMTc5Mi40MDU0MDk4OTYxMzVdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDE2MjYuODA1NDA5ODk2MTM1XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxNDYxLjIwNTQwOTg5NjEzNDhdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDE0NjEuMjA1NDA5ODk2MTM0OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMTI5NS42MDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMTMwLjAwNTQwOTg5NjEzNDZdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDk2NC40MDU0MDk4OTYxMzQ1XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCA5NjQuNDA1NDA5ODk2MTM0NV0sCisgIFs5MjIzLjE2MTM2NTE2ODgwMiwgNzk4LjgwNTQwOTg5NjEzNDZdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA3OTguODA1NDA5ODk2MTM0Nl0sCisgIFs5NDIxLjc2MTM2NTE2ODgwNCwgNjMzLjIwNTQwOTg5NjEzNDddLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDYzMy4yMDU0MDk4OTYxMzQ3XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCA0NjcuNjA1NDA5ODk2MTM0NzRdLAorICBbOTQyMS43NjEzNjUxNjg4MDQsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzkzMjIuNDYxMzY1MTY4ODAzLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTIyMy4xNjEzNjUxNjg4MDIsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzkxMjMuODYxMzY1MTY4ODAxLCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5MDI0LjU2MTM2NTE2ODgsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5MTIzLjg2MTM2NTE2ODgwMSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzkyMjMuMTYxMzY1MTY4ODAyLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTMyMi40NjEzNjUxNjg4MDMsIDMwMi4wMDU0MDk4OTYxMzQ4XSwKKyAgWzk0MjEuNzYxMzY1MTY4ODA0LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDEzNi40MDU0MDk4OTYxMzQ3OF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk2MjAuMzYxMzY1MTY4ODA3LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NTIxLjA2MTM2NTE2ODgwNSwgMzAyLjAwNTQwOTg5NjEzNDhdLAorICBbOTUyMS4wNjEzNjUxNjg4MDUsIDQ2Ny42MDU0MDk4OTYxMzQ3NF0sCisgIFs5NjIwLjM2MTM2NTE2ODgwNywgNDY3LjYwNTQwOTg5NjEzNDc0XSwKKyAgWzk3MTkuNjYxMzY1MTY4ODA4LCAzMDIuMDA1NDA5ODk2MTM0OF0sCisgIFs5NzE5LjY2MTM2NTE2ODgwOCwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzk4MTguOTYxMzY1MTY4ODA5LCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbOTkxOC4yNjEzNjUxNjg4MSwgMTM2LjQwNTQwOTg5NjEzNDc4XSwKKyAgWzEwMDE3LjU2MTM2NTE2ODgxLCAxMzYuNDA1NDA5ODk2MTM0NzhdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDA0LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDE2LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs2OC4xNzI4NzE2MDU0OTAxNiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzE2Ny40NzI4NzE2MDU0OTAxNiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNjguMTcyODcxNjA1NDkwMTYsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbNjguMTcyODcxNjA1NDkwMTMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDA2OS4zODU0NDA5Mzc4NzIzXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxNTU3LjY3Mjg3MTYwNTQ5MDIsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTc1Ni4yNzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsyMDU0LjE3Mjg3MTYwNTQ5LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzIwNTQuMTcyODcxNjA1NDksIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA1MDYyLjk4NTQ0MDkzNzg2OTVdLAorICBbMjM1Mi4wNzI4NzE2MDU0ODksIDUyMjguNTg1NDQwOTM3ODY5XSwKKyAgWzI0NTEuMzcyODcxNjA1NDg5LCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFsyMzUyLjA3Mjg3MTYwNTQ4OSwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFsyMTUzLjQ3Mjg3MTYwNTQ4OTcsIDQ4OTcuMzg1NDQwOTM3ODddLAorICBbMjI1Mi43NzI4NzE2MDU0ODk0LCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzIzNTIuMDcyODcxNjA1NDg5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsyMjUyLjc3Mjg3MTYwNTQ4OTQsIDQ3MzEuNzg1NDQwOTM3ODcxXSwKKyAgWzIxNTMuNDcyODcxNjA1NDg5NywgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMjA1NC4xNzI4NzE2MDU0OSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbMTk1NC44NzI4NzE2MDU0OSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTg1NS41NzI4NzE2MDU0OSwgNDg5Ny4zODU0NDA5Mzc4N10sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFsxODU1LjU3Mjg3MTYwNTQ5LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNzU2LjI3Mjg3MTYwNTQ5LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbMTY1Ni45NzI4NzE2MDU0OTAxLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1MjI4LjU4NTQ0MDkzNzg2OV0sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTU1OS43ODU0NDA5Mzc4NjhdLAorICBbMTE2MC40NzI4NzE2MDU0OTA0LCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMDYxLjE3Mjg3MTYwNTQ5MDQsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzExNjAuNDcyODcxNjA1NDkwNCwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA1NzI1LjM4NTQ0MDkzNzg2N10sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzE0NTguMzcyODcxNjA1NDkwMiwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFsxMzU5LjA3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzEyNTkuNzcyODcxNjA1NDkwMywgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTM1OS4wNzI4NzE2MDU0OTAzLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxMjU5Ljc3Mjg3MTYwNTQ5MDMsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTQ1OC4zNzI4NzE2MDU0OTAyLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDYzODcuNzg1NDQwOTM3ODY1XSwKKyAgWzE1NTcuNjcyODcxNjA1NDkwMiwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA2Mzg3Ljc4NTQ0MDkzNzg2NV0sCisgIFsxNjU2Ljk3Mjg3MTYwNTQ5MDEsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzE4NTUuNTcyODcxNjA1NDksIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzE3NTYuMjcyODcxNjA1NDksIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzE2NTYuOTcyODcxNjA1NDkwMSwgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTU1Ny42NzI4NzE2MDU0OTAyLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFsxNDU4LjM3Mjg3MTYwNTQ5MDIsIDU4OTAuOTg1NDQwOTM3ODY3XSwKKyAgWzEzNTkuMDcyODcxNjA1NDkwMywgNjA1Ni41ODU0NDA5Mzc4NjZdLAorICBbMTI1OS43NzI4NzE2MDU0OTAzLCA2MjIyLjE4NTQ0MDkzNzg2Nl0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDYwNTYuNTg1NDQwOTM3ODY2XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbMTA2MS4xNzI4NzE2MDU0OTA0LCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFsxMTYwLjQ3Mjg3MTYwNTQ5MDQsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNjIyMi4xODU0NDA5Mzc4NjZdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDYyMjIuMTg1NDQwOTM3ODY2XSwKKyAgWzk2MS44NzI4NzE2MDU0OTAzLCA2MDU2LjU4NTQ0MDkzNzg2Nl0sCisgIFs5NjEuODcyODcxNjA1NDkwMywgNTg5MC45ODU0NDA5Mzc4NjddLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1NTU5Ljc4NTQ0MDkzNzg2OF0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbODYyLjU3Mjg3MTYwNTQ5MDMsIDU3MjUuMzg1NDQwOTM3ODY3XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1ODkwLjk4NTQ0MDkzNzg2N10sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNTcyNS4zODU0NDA5Mzc4NjddLAorICBbNzYzLjI3Mjg3MTYwNTQ5MDIsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs4NjIuNTcyODcxNjA1NDkwMywgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDUzOTQuMTg1NDQwOTM3ODY4XSwKKyAgWzEwNjEuMTcyODcxNjA1NDkwNCwgNTM5NC4xODU0NDA5Mzc4NjhdLAorICBbOTYxLjg3Mjg3MTYwNTQ5MDMsIDU1NTkuNzg1NDQwOTM3ODY4XSwKKyAgWzg2Mi41NzI4NzE2MDU0OTAzLCA1Mzk0LjE4NTQ0MDkzNzg2OF0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTIyOC41ODU0NDA5Mzc4NjldLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDUwNjIuOTg1NDQwOTM3ODY5NV0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNTA2Mi45ODU0NDA5Mzc4Njk1XSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0ODk3LjM4NTQ0MDkzNzg3XSwKKyAgWzY2My45NzI4NzE2MDU0OTAxLCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDczMS43ODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NzMxLjc4NTQ0MDkzNzg3MV0sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDU2Ni4xODU0NDA5Mzc4NzFdLAorICBbNDY1LjM3Mjg3MTYwNTQ5MDA1LCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzI2Ni43NzI4NzE2MDU0OTAxNCwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDE2LCA0MjM0Ljk4NTQ0MDkzNzg3Ml0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTMsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs2OC4xNzI4NzE2MDU0OTAxMywgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzY4LjE3Mjg3MTYwNTQ5MDEzLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMTY3LjQ3Mjg3MTYwNTQ5MDEzLCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbMjY2Ljc3Mjg3MTYwNTQ5MDE0LCAzOTAzLjc4NTQ0MDkzNzg3MjRdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDM3MzguMTg1NDQwOTM3ODcyNV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM3MzguMTg1NDQwOTM3ODcyNV0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM1NzIuNTg1NDQwOTM3ODcyNl0sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDM0MDYuOTg1NDQwOTM3ODcyN10sCisgIFsxNjcuNDcyODcxNjA1NDkwMTYsIDMyNDEuMzg1NDQwOTM3ODcyOF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDMyNDEuMzg1NDQwOTM3ODcyOF0sCisgIFsyNjYuNzcyODcxNjA1NDkwMTQsIDM0MDYuOTg1NDQwOTM3ODcyN10sCisgIFszNjYuMDcyODcxNjA1NDkwMSwgMzU3Mi41ODU0NDA5Mzc4NzI2XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgMzczOC4xODU0NDA5Mzc4NzI1XSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgMzkwMy43ODU0NDA5Mzc4NzI0XSwKKyAgWzM2Ni4wNzI4NzE2MDU0OTAxLCA0MDY5LjM4NTQ0MDkzNzg3MjNdLAorICBbMzY2LjA3Mjg3MTYwNTQ5MDEsIDQyMzQuOTg1NDQwOTM3ODcyXSwKKyAgWzQ2NS4zNzI4NzE2MDU0OTAwNSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNTY0LjY3Mjg3MTYwNTQ5MDEsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs0NjUuMzcyODcxNjA1NDkwMDUsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs1NjQuNjcyODcxNjA1NDkwMSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQwNjkuMzg1NDQwOTM3ODcyM10sCisgIFs2NjMuOTcyODcxNjA1NDkwMSwgNDIzNC45ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ0MDAuNTg1NDQwOTM3ODcyXSwKKyAgWzc2My4yNzI4NzE2MDU0OTAyLCA0NTY2LjE4NTQ0MDkzNzg3MV0sCisgIFs3NjMuMjcyODcxNjA1NDkwMiwgNDQwMC41ODU0NDA5Mzc4NzJdLAorICBbNjYzLjk3Mjg3MTYwNTQ5MDEsIDQ1NjYuMTg1NDQwOTM3ODcxXSwKKyAgWzU2NC42NzI4NzE2MDU0OTAxLCA0NDAwLjU4NTQ0MDkzNzg3Ml0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDM0OTUuNTA2MTQyNjQzNzEzXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCAzNjYxLjEwNjE0MjY0MzcxMjddLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCAzNDk1LjUwNjE0MjY0MzcxM10sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM2NjEuMTA2MTQyNjQzNzEyN10sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDM4MjYuNzA2MTQyNjQzNzEyNl0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM4MjYuNzA2MTQyNjQzNzEyNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDM5OTIuMzA2MTQyNjQzNzEyNV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDM5OTIuMzA2MTQyNjQzNzEyNV0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDQxNTcuOTA2MTQyNjQzNzEyXSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNDMyMy41MDYxNDI2NDM3MTFdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA0MTU3LjkwNjE0MjY0MzcxMl0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDQzMjMuNTA2MTQyNjQzNzExXSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNDQ4OS4xMDYxNDI2NDM3MTFdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA0NjU0LjcwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0NjU0LjcwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0ODIwLjMwNjE0MjY0MzcxXSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA0OTg1LjkwNjE0MjY0MzcwOV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNDk4NS45MDYxNDI2NDM3MDldLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDUxNTEuNTA2MTQyNjQzNzA5XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1MTUxLjUwNjE0MjY0MzcwOV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTMxNy4xMDYxNDI2NDM3MDhdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDUzMTcuMTA2MTQyNjQzNzA4XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1NDgyLjcwNjE0MjY0MzcwOF0sCisgIFsxODkzNS40MTUwNDE0MDEzMywgNTY0OC4zMDYxNDI2NDM3MDddLAorICBbMTg4MzYuMTE1MDQxNDAxMzMyLCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTg4MzYuMTE1MDQxNDAxMzMyLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxODkzNS40MTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkwMzQuNzE1MDQxNDAxMzMsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5MDM0LjcxNTA0MTQwMTMzLCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTAzNC43MTUwNDE0MDEzMywgNTgxMy45MDYxNDI2NDM3MDY1XSwKKyAgWzE5MTM0LjAxNTA0MTQwMTMzLCA1NjQ4LjMwNjE0MjY0MzcwN10sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNTY0OC4zMDYxNDI2NDM3MDddLAorICBbMTkxMzQuMDE1MDQxNDAxMzMsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTEzNC4wMTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTkzMzIuNjE1MDQxNDAxMzMsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2MzEwLjcwNjE0MjY0MzcwNV0sCisgIFsxOTIzMy4zMTUwNDE0MDEzMywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTkyMzMuMzE1MDQxNDAxMzMsIDY0NzYuMzA2MTQyNjQzNzA0XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDY2NDEuOTA2MTQyNjQzNzA0XSwKKyAgWzE5MzMyLjYxNTA0MTQwMTMzLCA2ODA3LjUwNjE0MjY0MzcwM10sCisgIFsxOTMzMi42MTUwNDE0MDEzMywgNjY0MS45MDYxNDI2NDM3MDRdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNjE0NS4xMDYxNDI2NDM3MDVdLAorICBbMTk0MzEuOTE1MDQxNDAxMzI3LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTQzMS45MTUwNDE0MDEzMjcsIDYxNDUuMTA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA1ODEzLjkwNjE0MjY0MzcwNjVdLAorICBbMTk2MzAuNTE1MDQxNDAxMzI2LCA1OTc5LjUwNjE0MjY0MzcwNl0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDU4MTMuOTA2MTQyNjQzNzA2NV0sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDU5NzkuNTA2MTQyNjQzNzA2XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNTk3OS41MDYxNDI2NDM3MDZdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2MTQ1LjEwNjE0MjY0MzcwNV0sCisgIFsxOTcyOS44MTUwNDE0MDEzMjUsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NjMwLjUxNTA0MTQwMTMyNiwgNjQ3Ni4zMDYxNDI2NDM3MDRdLAorICBbMTk3MjkuODE1MDQxNDAxMzI1LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDYzMTAuNzA2MTQyNjQzNzA1XSwKKyAgWzE5NTMxLjIxNTA0MTQwMTMyNywgNjMxMC43MDYxNDI2NDM3MDVdLAorICBbMTk1MzEuMjE1MDQxNDAxMzI3LCA2NDc2LjMwNjE0MjY0MzcwNF0sCisgIFsxOTYzMC41MTUwNDE0MDEzMjYsIDY2NDEuOTA2MTQyNjQzNzA0XSwKKyAgWzE5NzI5LjgxNTA0MTQwMTMyNSwgNjgwNy41MDYxNDI2NDM3MDNdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA2OTczLjEwNjE0MjY0MzcwM10sCisgIFsxOTkyOC40MTUwNDE0MDEzMjQsIDY5NzMuMTA2MTQyNjQzNzAzXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzEzOC43MDYxNDI2NDM3MDJdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3MTM4LjcwNjE0MjY0MzcwMl0sCisgIFsyMDAyNy43MTUwNDE0MDEzMjMsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzMwNC4zMDYxNDI2NDM3MDJdLAorICBbMTk4MjkuMTE1MDQxNDAxMzI1LCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsxOTgyOS4xMTUwNDE0MDEzMjUsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzE5OTI4LjQxNTA0MTQwMTMyNCwgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMTk5MjguNDE1MDQxNDAxMzI0LCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMjAwMjcuNzE1MDQxNDAxMzIzLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3ODAxLjEwNjE0MjY0MzddLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDc4MDEuMTA2MTQyNjQzN10sCisgIFsyMDMyNS42MTUwNDE0MDEzMiwgNzgwMS4xMDYxNDI2NDM3XSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3NjM1LjUwNjE0MjY0MzcwMDVdLAorICBbMjAyMjYuMzE1MDQxNDAxMzIsIDc0NjkuOTA2MTQyNjQzNzAxXSwKKyAgWzIwMjI2LjMxNTA0MTQwMTMyLCA3MzA0LjMwNjE0MjY0MzcwMl0sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDczMDQuMzA2MTQyNjQzNzAyXSwKKyAgWzIwMDI3LjcxNTA0MTQwMTMyMywgNzQ2OS45MDYxNDI2NDM3MDFdLAorICBbMjAxMjcuMDE1MDQxNDAxMzIyLCA3NDY5LjkwNjE0MjY0MzcwMV0sCisgIFsyMDEyNy4wMTUwNDE0MDEzMjIsIDc2MzUuNTA2MTQyNjQzNzAwNV0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjM2Mi45NTUzMTQ3NDkyODY2XSwKKyAgWzI4NDguMDkwMzA2NzMyMjM2NSwgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzI3NDguNzkwMzA2NzMyMjM3LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjk0Ny4zOTAzMDY3MzIyMzYyLCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDI2OTQuMTU1MzE0NzQ5Mjg2NF0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMjY5NC4xNTUzMTQ3NDkyODY0XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzMyNDUuMjkwMzA2NzMyMjM1NCwgMzE5MC45NTUzMTQ3NDkyODZdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszMzQ0LjU5MDMwNjczMjIzNSwgMzUyMi4xNTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDMzNTYuNTU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzY0Mi40OTAzMDY3MzIyMzQzLCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNzQxLjc5MDMwNjczMjIzNCwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzc0MS43OTAzMDY3MzIyMzQsIDI4NTkuNzU1MzE0NzQ5Mjg2M10sCisgIFszODQxLjA5MDMwNjczMjIzNCwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzg0MS4wOTAzMDY3MzIyMzQsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM3NDEuNzkwMzA2NzMyMjM0LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNjQyLjQ5MDMwNjczMjIzNDMsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM1NDMuMTkwMzA2NzMyMjM0NiwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAyODU5Ljc1NTMxNDc0OTI4NjNdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDMwMjUuMzU1MzE0NzQ5Mjg2XSwKKyAgWzM0NDMuODkwMzA2NzMyMjM1LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszNTQzLjE5MDMwNjczMjIzNDYsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzM2NDIuNDkwMzA2NzMyMjM0MywgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMzU0My4xOTAzMDY3MzIyMzQ2LCAzNTIyLjE1NTMxNDc0OTI4Nl0sCisgIFszNDQzLjg5MDMwNjczMjIzNSwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzQ0My44OTAzMDY3MzIyMzUsIDM4NTMuMzU1MzE0NzQ5Mjg1OF0sCisgIFszMzQ0LjU5MDMwNjczMjIzNSwgMzY4Ny43NTUzMTQ3NDkyODZdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzI0NS4yOTAzMDY3MzIyMzU0LCAzNjg3Ljc1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCA0MDE4Ljk1NTMxNDc0OTI4NTddLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzODUzLjM1NTMxNDc0OTI4NThdLAorICBbMzA0Ni42OTAzMDY3MzIyMzYsIDM2ODcuNzU1MzE0NzQ5Mjg2XSwKKyAgWzMxNDUuOTkwMzA2NzMyMjM1NywgMzUyMi4xNTUzMTQ3NDkyODZdLAorICBbMzE0NS45OTAzMDY3MzIyMzU3LCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFszMTQ1Ljk5MDMwNjczMjIzNTcsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzMwNDYuNjkwMzA2NzMyMjM2LCAzMTkwLjk1NTMxNDc0OTI4Nl0sCisgIFszMDQ2LjY5MDMwNjczMjIzNiwgMzM1Ni41NTUzMTQ3NDkyODZdLAorICBbMjk0Ny4zOTAzMDY3MzIyMzYyLCAzMzU2LjU1NTMxNDc0OTI4Nl0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDMxOTAuOTU1MzE0NzQ5Mjg2XSwKKyAgWzI5NDcuMzkwMzA2NzMyMjM2MiwgMzAyNS4zNTUzMTQ3NDkyODZdLAorICBbMjg0OC4wOTAzMDY3MzIyMzY1LCAzMDI1LjM1NTMxNDc0OTI4Nl0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjg1OS43NTUzMTQ3NDkyODYzXSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyNjk0LjE1NTMxNDc0OTI4NjRdLAorICBbMjc0OC43OTAzMDY3MzIyMzcsIDI1MjguNTU1MzE0NzQ5Mjg2NV0sCisgIFsyODQ4LjA5MDMwNjczMjIzNjUsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyNzQ4Ljc5MDMwNjczMjIzNywgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzI2NDkuNDkwMzA2NzMyMjM3LCAyMzYyLjk1NTMxNDc0OTI4NjZdLAorICBbMjY0OS40OTAzMDY3MzIyMzcsIDIxOTcuMzU1MzE0NzQ5Mjg2N10sCisgIFsyNTUwLjE5MDMwNjczMjIzNzMsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyNDUwLjg5MDMwNjczMjIzNzYsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMjUyOC41NTUzMTQ3NDkyODY1XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAyNTI4LjU1NTMxNDc0OTI4NjVdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDIzNjIuOTU1MzE0NzQ5Mjg2Nl0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMjE5Ny4zNTUzMTQ3NDkyODY3XSwKKyAgWzIzNTEuNTkwMzA2NzMyMjM4LCAyMTk3LjM1NTMxNDc0OTI4NjddLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDIwMzEuNzU1MzE0NzQ5Mjg2NV0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMTg2Ni4xNTUzMTQ3NDkyODY0XSwKKyAgWzIyNTIuMjkwMzA2NzMyMjM4LCAxODY2LjE1NTMxNDc0OTI4NjRdLAorICBbMjM1MS41OTAzMDY3MzIyMzgsIDE3MDAuNTU1MzE0NzQ5Mjg2M10sCisgIFsyNDUwLjg5MDMwNjczMjIzNzYsIDE1MzQuOTU1MzE0NzQ5Mjg2MV0sCisgIFsyMzUxLjU5MDMwNjczMjIzOCwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsyMjUyLjI5MDMwNjczMjIzOCwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMjI1Mi4yOTAzMDY3MzIyMzgsIDE1MzQuOTU1MzE0NzQ5Mjg2MV0sCisgIFsyMTUyLjk5MDMwNjczMjIzODQsIDEzNjkuMzU1MzE0NzQ5Mjg2XSwKKyAgWzIwNTMuNjkwMzA2NzMyMjM4NywgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMTk1NC4zOTAzMDY3MzIyMzg3LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTg1NS4wOTAzMDY3MzIyMzg4LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTc1NS43OTAzMDY3MzIyMzg4LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA4NzIuNTU1MzE0NzQ5Mjg1N10sCisgIFsxNjU2LjQ5MDMwNjczMjIzODksIDcwNi45NTUzMTQ3NDkyODU4XSwKKyAgWzE3NTUuNzkwMzA2NzMyMjM4OCwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCA1NDEuMzU1MzE0NzQ5Mjg1OV0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMzc1Ljc1NTMxNDc0OTI4NTldLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxNzU1Ljc5MDMwNjczMjIzODgsIDQ0LjU1NTMxNDc0OTI4NTkyXSwKKyAgWzE2NTYuNDkwMzA2NzMyMjM4OSwgNDQuNTU1MzE0NzQ5Mjg1OTJdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzE0NTcuODkwMzA2NzMyMjM5LCAyMTAuMTU1MzE0NzQ5Mjg1OV0sCisgIFsxNDU3Ljg5MDMwNjczMjIzOSwgNDQuNTU1MzE0NzQ5Mjg1OTJdLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU5XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAzNzUuNzU1MzE0NzQ5Mjg1ODRdLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDIxMC4xNTUzMTQ3NDkyODU4NV0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgMzc1Ljc1NTMxNDc0OTI4NTg0XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCA1NDEuMzU1MzE0NzQ5Mjg1OV0sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgNzA2Ljk1NTMxNDc0OTI4NThdLAorICBbMTM1OC41OTAzMDY3MzIyMzksIDg3Mi41NTUzMTQ3NDkyODU3XSwKKyAgWzEyNTkuMjkwMzA2NzMyMjM5LCA3MDYuOTU1MzE0NzQ5Mjg1OF0sCisgIFsxMjU5LjI5MDMwNjczMjIzOSwgODcyLjU1NTMxNDc0OTI4NTddLAorICBbMTI1OS4yOTAzMDY3MzIyMzksIDEwMzguMTU1MzE0NzQ5Mjg1N10sCisgIFsxMzU4LjU5MDMwNjczMjIzOSwgMTIwMy43NTUzMTQ3NDkyODU4XSwKKyAgWzEzNTguNTkwMzA2NzMyMjM5LCAxMDM4LjE1NTMxNDc0OTI4NTddLAorICBbMTQ1Ny44OTAzMDY3MzIyMzksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMTM2OS4zNTUzMTQ3NDkyODZdLAorICBbMTY1Ni40OTAzMDY3MzIyMzg5LCAxMjAzLjc1NTMxNDc0OTI4NThdLAorICBbMTU1Ny4xOTAzMDY3MzIyMzksIDEyMDMuNzU1MzE0NzQ5Mjg1OF0sCisgIFsxNTU3LjE5MDMwNjczMjIzOSwgMTAzOC4xNTUzMTQ3NDkyODU3XSwKKyAgWzE3MjU0LjU3MjUxNTU0NjY2OCwgMTQ2MC41ODA3ODAxMjQ0OTIzXSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMTYyNi4xODA3ODAxMjQ0OTI1XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTYyNi4xODA3ODAxMjQ0OTI1XSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMTc5MS43ODA3ODAxMjQ0OTI2XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMTk1Ny4zODA3ODAxMjQ0OTI3XSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjEyMi45ODA3ODAxMjQ0OTNdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyMjg4LjU4MDc4MDEyNDQ5M10sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzQ1My4xNzI1MTU1NDY2NjcsIDI3ODUuMzgwNzgwMTI0NDkyNV0sCisgIFsxNzM1My44NzI1MTU1NDY2NjcsIDI2MTkuNzgwNzgwMTI0NDkyNl0sCisgIFsxNzI1NC41NzI1MTU1NDY2NjgsIDI0NTQuMTgwNzgwMTI0NDkyN10sCisgIFsxNzI1NC41NzI1MTU1NDY2NjgsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3MzUzLjg3MjUxNTU0NjY2NywgMjI4OC41ODA3ODAxMjQ0OTNdLAorICBbMTc0NTMuMTcyNTE1NTQ2NjY3LCAyMTIyLjk4MDc4MDEyNDQ5M10sCisgIFsxNzU1Mi40NzI1MTU1NDY2NjYsIDIyODguNTgwNzgwMTI0NDkzXSwKKyAgWzE3NTUyLjQ3MjUxNTU0NjY2NiwgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzE3NDUzLjE3MjUxNTU0NjY2NywgMjQ1NC4xODA3ODAxMjQ0OTI3XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDI0OS4wNzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQzNDguMzc2MjQ0NjYyODMsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCA1MjU3Ljk0MTY4MjY5MTI5OF0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA1MjU3Ljk0MTY4MjY5MTI5OF0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCA1MDkyLjM0MTY4MjY5MTI5OV0sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0OTI2Ljc0MTY4MjY5MTI5OTVdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs0NjQ2LjI3NjI0NDY2MjgzLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs0NzQ1LjU3NjI0NDY2MjgzMDUsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNDg0NC44NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzQ4NDQuODc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNDk0NC4xNzYyNDQ2NjI4MzEsIDQ3NjEuMTQxNjgyNjkxM10sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDkyNi43NDE2ODI2OTEyOTk1XSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0NzYxLjE0MTY4MjY5MTNdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQ5MjYuNzQxNjgyNjkxMjk5NV0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDc2MS4xNDE2ODI2OTEzXSwKKyAgWzUyNDIuMDc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbNTI0Mi4wNzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzUyNDIuMDc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs1MTQyLjc3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbNTA0My40NzYyNDQ2NjI4MzEsIDQ1OTUuNTQxNjgyNjkxMzAxXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs1MDQzLjQ3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNTE0Mi43NzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzUwNDMuNDc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQ5NDQuMTc2MjQ0NjYyODMxLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0OTQ0LjE3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDg0NC44NzYyNDQ2NjI4MzEsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ3NDUuNTc2MjQ0NjYyODMwNSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbNDY0Ni4yNzYyNDQ2NjI4MywgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbNDU0Ni45NzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQ1NDYuOTc2MjQ0NjYyODMsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQ2NDYuMjc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0NTQ2Ljk3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDQ0Ny42NzYyNDQ2NjI4MywgMzYwMS45NDE2ODI2OTEzMDI1XSwKKyAgWzQ0NDcuNjc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCAzNzY3LjU0MTY4MjY5MTMwMjRdLAorICBbNDM0OC4zNzYyNDQ2NjI4MywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzQyNDkuMDc2MjQ0NjYyODMsIDM3NjcuNTQxNjgyNjkxMzAyNF0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbNDE0OS43NzYyNDQ2NjI4MjksIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFs0MDUwLjQ3NjI0NDY2MjgyOTcsIDQwOTguNzQxNjgyNjkxMzAyXSwKKyAgWzQwNTAuNDc2MjQ0NjYyODI5NywgMzkzMy4xNDE2ODI2OTEzMDIzXSwKKyAgWzM5NTEuMTc2MjQ0NjYyODMsIDM5MzMuMTQxNjgyNjkxMzAyM10sCisgIFszOTUxLjE3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFszODUxLjg3NjI0NDY2MjgzMDIsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDA5OC43NDE2ODI2OTEzMDJdLAorICBbMzc1Mi41NzYyNDQ2NjI4MzA1LCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFszNjUzLjI3NjI0NDY2MjgzMSwgNDI2NC4zNDE2ODI2OTEzMDJdLAorICBbMzU1My45NzYyNDQ2NjI4MzEsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM1NTMuOTc2MjQ0NjYyODMxLCA0NTk1LjU0MTY4MjY5MTMwMV0sCisgIFszNDU0LjY3NjI0NDY2MjgzMTMsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM1NTMuOTc2MjQ0NjYyODMxLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszNjUzLjI3NjI0NDY2MjgzMSwgNDQyOS45NDE2ODI2OTEzMDFdLAorICBbMzc1Mi41NzYyNDQ2NjI4MzA1LCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFszNzUyLjU3NjI0NDY2MjgzMDUsIDQ0MjkuOTQxNjgyNjkxMzAxXSwKKyAgWzM4NTEuODc2MjQ0NjYyODMwMiwgNDU5NS41NDE2ODI2OTEzMDFdLAorICBbMzg1MS44NzYyNDQ2NjI4MzAyLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFszOTUxLjE3NjI0NDY2MjgzLCA0NDI5Ljk0MTY4MjY5MTMwMV0sCisgIFs0MDUwLjQ3NjI0NDY2MjgyOTcsIDQyNjQuMzQxNjgyNjkxMzAyXSwKKyAgWzQxNDkuNzc2MjQ0NjYyODI5LCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0MjQ5LjA3NjI0NDY2MjgzLCA0MjY0LjM0MTY4MjY5MTMwMl0sCisgIFs0MzQ4LjM3NjI0NDY2MjgzLCA0MDk4Ljc0MTY4MjY5MTMwMl0sCisgIFs0NDQ3LjY3NjI0NDY2MjgzLCAzOTMzLjE0MTY4MjY5MTMwMjNdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbOTQ3NC43ODg5MDIxMzU2MDYsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbOTM3NS40ODg5MDIxMzU2MDUsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzk0NzQuNzg4OTAyMTM1NjA2LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFs5NDc0Ljc4ODkwMjEzNTYwNiwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbOTU3NC4wODg5MDIxMzU2MDcsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzk2NzMuMzg4OTAyMTM1NjA4LCA3MDIxLjA2MjkzOTA1NTgxMTVdLAorICBbOTY3My4zODg5MDIxMzU2MDgsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzk3NzIuNjg4OTAyMTM1NjEsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzk2NzMuMzg4OTAyMTM1NjA4LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFs5NzcyLjY4ODkwMjEzNTYxLCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFs5ODcxLjk4ODkwMjEzNTYxLCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbOTg3MS45ODg5MDIxMzU2MSwgNTg2MS44NjI5MzkwNTU4MTVdLAorICBbOTg3MS45ODg5MDIxMzU2MSwgNTY5Ni4yNjI5MzkwNTU4MTZdLAorICBbOTk3MS4yODg5MDIxMzU2MTEsIDU1MzAuNjYyOTM5MDU1ODE2XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNTUzMC42NjI5MzkwNTU4MTZdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA1Njk2LjI2MjkzOTA1NTgxNl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNTY5Ni4yNjI5MzkwNTU4MTZdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA1ODYxLjg2MjkzOTA1NTgxNV0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDYwMjcuNDYyOTM5MDU1ODE1XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjE5My4wNjI5MzkwNTU4MTRdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2MDI3LjQ2MjkzOTA1NTgxNV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDU4NjEuODYyOTM5MDU1ODE1XSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjAyNy40NjI5MzkwNTU4MTVdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDYzNTguNjYyOTM5MDU1ODE0XSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTAwNzAuNTg4OTAyMTM1NjEyLCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzk5NzEuMjg4OTAyMTM1NjExLCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFs5OTcxLjI4ODkwMjEzNTYxMSwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNzE4Ni42NjI5MzkwNTU4MTFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3MTg2LjY2MjkzOTA1NTgxMV0sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDA3MC41ODg5MDIxMzU2MTIsIDczNTIuMjYyOTM5MDU1ODFdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA3NTE3Ljg2MjkzOTA1NTgxXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzY4My40NjI5MzkwNTU4MDldLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA3NTE3Ljg2MjkzOTA1NTgxXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzY4My40NjI5MzkwNTU4MDldLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA3NjgzLjQ2MjkzOTA1NTgwOV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDc1MTcuODYyOTM5MDU1ODFdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA3MzUyLjI2MjkzOTA1NTgxXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzM1Mi4yNjI5MzkwNTU4MV0sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDcxODYuNjYyOTM5MDU1ODExXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDE2OS44ODg5MDIxMzU2MTQsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNzAyMS4wNjI5MzkwNTU4MTE1XSwKKyAgWzEwMDcwLjU4ODkwMjEzNTYxMiwgNjg1NS40NjI5MzkwNTU4MTJdLAorICBbMTAxNjkuODg4OTAyMTM1NjE0LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDI2OS4xODg5MDIxMzU2MTUsIDY2ODkuODYyOTM5MDU1ODEzXSwKKyAgWzEwMTY5Ljg4ODkwMjEzNTYxNCwgNjUyNC4yNjI5MzkwNTU4MTNdLAorICBbMTAyNjkuMTg4OTAyMTM1NjE1LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDM2OC40ODg5MDIxMzU2MTYsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwMzY4LjQ4ODkwMjEzNTYxNiwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2MzU4LjY2MjkzOTA1NTgxNF0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2MTkzLjA2MjkzOTA1NTgxNF0sCisgIFsxMDY2Ni4zODg5MDIxMzU2MTksIDYxOTMuMDYyOTM5MDU1ODE0XSwKKyAgWzEwNjY2LjM4ODkwMjEzNTYxOSwgNjM1OC42NjI5MzkwNTU4MTRdLAorICBbMTA1NjcuMDg4OTAyMTM1NjE4LCA2NTI0LjI2MjkzOTA1NTgxM10sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDY1MjQuMjYyOTM5MDU1ODEzXSwKKyAgWzEwNTY3LjA4ODkwMjEzNTYxOCwgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTA0NjcuNzg4OTAyMTM1NjE3LCA2ODU1LjQ2MjkzOTA1NTgxMl0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDQ2Ny43ODg5MDIxMzU2MTcsIDcwMjEuMDYyOTM5MDU1ODExNV0sCisgIFsxMDU2Ny4wODg5MDIxMzU2MTgsIDY4NTUuNDYyOTM5MDU1ODEyXSwKKyAgWzEwNDY3Ljc4ODkwMjEzNTYxNywgNjY4OS44NjI5MzkwNTU4MTNdLAorICBbMTAzNjguNDg4OTAyMTM1NjE2LCA2Njg5Ljg2MjkzOTA1NTgxM10sCisgIFsxMDczLjY5NDQzNTQzNzQ3MTQsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs5NzQuMzk0NDM1NDM3NDcxMywgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNzc1Ljc5NDQzNTQzNzQ3MTIsIDExNTQuMzY4MTIwNDAzMjY0Nl0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgOTg4Ljc2ODEyMDQwMzI2NDZdLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzg3NS4wOTQ0MzU0Mzc0NzEyLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDY1Ny41NjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA0OTEuOTY4MTIwNDAzMjY0OF0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFs1NzcuMTk0NDM1NDM3NDcxLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAxOTgyLjM2ODEyMDQwMzI2NTNdLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDIxNDcuOTY4MTIwNDAzMjY1NF0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgMjMxMy41NjgxMjA0MDMyNjUzXSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgMjE0Ny45NjgxMjA0MDMyNjU0XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTE0LCAyMzEzLjU2ODEyMDQwMzI2NTNdLAorICBbODAuNjk0NDM1NDM3NDcxMTQsIDI0NzkuMTY4MTIwNDAzMjY1XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExLCAyNjQ0Ljc2ODEyMDQwMzI2NV0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMjQ3OS4xNjgxMjA0MDMyNjVdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDIzMTMuNTY4MTIwNDAzMjY1M10sCisgIFs4MC42OTQ0MzU0Mzc0NzExMSwgMjE0Ny45NjgxMjA0MDMyNjU0XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxOTgyLjM2ODEyMDQwMzI2NTNdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDE5ODIuMzY4MTIwNDAzMjY1M10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTgxNi43NjgxMjA0MDMyNjUxXSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbODAuNjk0NDM1NDM3NDcxMTEsIDEzMTkuOTY4MTIwNDAzMjY0N10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzgwLjY5NDQzNTQzNzQ3MTExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbMTc5Ljk5NDQzNTQzNzQ3MTEsIDk4OC43NjgxMjA0MDMyNjQ2XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA4MjMuMTY4MTIwNDAzMjY0N10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgNjU3LjU2ODEyMDQwMzI2NDddLAorICBbMzc4LjU5NDQzNTQzNzQ3MTEsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzQ3Ny44OTQ0MzU0Mzc0NzEwMywgODIzLjE2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgNDkxLjk2ODEyMDQwMzI2NDhdLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAzMjYuMzY4MTIwNDAzMjY0OF0sCisgIFs0NzcuODk0NDM1NDM3NDcxMDMsIDE2MC43NjgxMjA0MDMyNjQ4Ml0sCisgIFszNzguNTk0NDM1NDM3NDcxMSwgMTYwLjc2ODEyMDQwMzI2NDgyXSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCAzMjYuMzY4MTIwNDAzMjY0OF0sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzE3OS45OTQ0MzU0Mzc0NzExNCwgMzI2LjM2ODEyMDQwMzI2NDhdLAorICBbMjc5LjI5NDQzNTQzNzQ3MTEsIDQ5MS45NjgxMjA0MDMyNjQ4XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA2NTcuNTY4MTIwNDAzMjY0N10sCisgIFsxNzkuOTk0NDM1NDM3NDcxMTQsIDgyMy4xNjgxMjA0MDMyNjQ3XSwKKyAgWzI3OS4yOTQ0MzU0Mzc0NzExLCA5ODguNzY4MTIwNDAzMjY0Nl0sCisgIFsyNzkuMjk0NDM1NDM3NDcxMSwgMTE1NC4zNjgxMjA0MDMyNjQ2XSwKKyAgWzM3OC41OTQ0MzU0Mzc0NzExLCAxMzE5Ljk2ODEyMDQwMzI2NDddLAorICBbNDc3Ljg5NDQzNTQzNzQ3MTAzLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNTc3LjE5NDQzNTQzNzQ3MSwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxODE2Ljc2ODEyMDQwMzI2NTFdLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE4MTYuNzY4MTIwNDAzMjY1MV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTY1MS4xNjgxMjA0MDMyNjVdLAorICBbODc1LjA5NDQzNTQzNzQ3MTIsIDE2NTEuMTY4MTIwNDAzMjY1XSwKKyAgWzk3NC4zOTQ0MzU0Mzc0NzEzLCAxNjUxLjE2ODEyMDQwMzI2NV0sCisgIFs4NzUuMDk0NDM1NDM3NDcxMiwgMTQ4NS41NjgxMjA0MDMyNjQ5XSwKKyAgWzc3NS43OTQ0MzU0Mzc0NzEyLCAxNDg1LjU2ODEyMDQwMzI2NDldLAorICBbNjc2LjQ5NDQzNTQzNzQ3MTEsIDE0ODUuNTY4MTIwNDAzMjY0OV0sCisgIFs3NzUuNzk0NDM1NDM3NDcxMiwgMTMxOS45NjgxMjA0MDMyNjQ3XSwKKyAgWzY3Ni40OTQ0MzU0Mzc0NzExLCAxMTU0LjM2ODEyMDQwMzI2NDZdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzMwMzkuMTEzNTYyNDMxNjk3LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyMTkwLjI0NTYwMjA2MDUyM10sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDIxOTAuMjQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjM1NS44NDU2MDIwNjA1MjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMjY4Ny4wNDU2MDIwNjA1MjNdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDI4NTIuNjQ1NjAyMDYwNTIzXSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMjY4Ny4wNDU2MDIwNjA1MjNdLAorICBbMzYzNC45MTM1NjI0MzE2OTU1LCAyNTIxLjQ0NTYwMjA2MDUyM10sCisgIFszNjM0LjkxMzU2MjQzMTY5NTUsIDIzNTUuODQ1NjAyMDYwNTIzXSwKKyAgWzM3MzQuMjEzNTYyNDMxNjk1LCAyMzU1Ljg0NTYwMjA2MDUyM10sCisgIFszODMzLjUxMzU2MjQzMTY5NSwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMzkzMi44MTM1NjI0MzE2OTQ3LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFszODMzLjUxMzU2MjQzMTY5NSwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzgzMy41MTM1NjI0MzE2OTUsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzczNC4yMTM1NjI0MzE2OTUsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszNzM0LjIxMzU2MjQzMTY5NSwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTY5My40NDU2MDIwNjA1MjI4XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzM1MzUuNjEzNTYyNDMxNjk1OCwgMTM2Mi4yNDU2MDIwNjA1MjI1XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCAxMDMxLjA0NTYwMjA2MDUyMjJdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDEwMzEuMDQ1NjAyMDYwNTIyMl0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCA4NjUuNDQ1NjAyMDYwNTIyMl0sCisgIFszNTM1LjYxMzU2MjQzMTY5NTgsIDY5OS44NDU2MDIwNjA1MjIzXSwKKyAgWzM2MzQuOTEzNTYyNDMxNjk1NSwgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzUzNS42MTM1NjI0MzE2OTU4LCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszNDM2LjMxMzU2MjQzMTY5NiwgMzY4LjY0NTYwMjA2MDUyMjQ0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCAyMDMuMDQ1NjAyMDYwNTIyNDRdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAzNy40NDU2MDIwNjA1MjI0NTRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDIwMy4wNDU2MDIwNjA1MjI0NF0sCisgIFszMjM3LjcxMzU2MjQzMTY5NjYsIDM3LjQ0NTYwMjA2MDUyMjQ1NF0sCisgIFszMTM4LjQxMzU2MjQzMTY5NywgMzcuNDQ1NjAyMDYwNTIyNDU0XSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgMjAzLjA0NTYwMjA2MDUyMjQ0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgMzY4LjY0NTYwMjA2MDUyMjRdLAorICBbMzQzNi4zMTM1NjI0MzE2OTYsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzMzMzcuMDEzNTYyNDMxNjk2MywgNjk5Ljg0NTYwMjA2MDUyMjNdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCA1MzQuMjQ1NjAyMDYwNTIyNF0sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDUzNC4yNDU2MDIwNjA1MjI0XSwKKyAgWzM0MzYuMzEzNTYyNDMxNjk2LCA2OTkuODQ1NjAyMDYwNTIyM10sCisgIFszMzM3LjAxMzU2MjQzMTY5NjMsIDg2NS40NDU2MDIwNjA1MjIyXSwKKyAgWzMyMzcuNzEzNTYyNDMxNjk2NiwgODY1LjQ0NTYwMjA2MDUyMjJdLAorICBbMzMzNy4wMTM1NjI0MzE2OTYzLCAxMDMxLjA0NTYwMjA2MDUyMjJdLAorICBbMzIzNy43MTM1NjI0MzE2OTY2LCAxMTk2LjY0NTYwMjA2MDUyMjRdLAorICBbMzEzOC40MTM1NjI0MzE2OTcsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMTUyNy44NDU2MDIwNjA1MjI3XSwKKyAgWzMxMzguNDEzNTYyNDMxNjk3LCAxNTI3Ljg0NTYwMjA2MDUyMjddLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDEzNjIuMjQ1NjAyMDYwNTIyNV0sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDE1MjcuODQ1NjAyMDYwNTIyN10sCisgIFsyODQwLjUxMzU2MjQzMTY5NzcsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE4NTkuMDQ1NjAyMDYwNTIzXSwKKyAgWzI4NDAuNTEzNTYyNDMxNjk3NywgMjAyNC42NDU2MDIwNjA1MjNdLAorICBbMjg0MC41MTM1NjI0MzE2OTc3LCAxODU5LjA0NTYwMjA2MDUyM10sCisgIFsyOTM5LjgxMzU2MjQzMTY5NzQsIDE2OTMuNDQ1NjAyMDYwNTIyOF0sCisgIFszMDM5LjExMzU2MjQzMTY5NywgMTg1OS4wNDU2MDIwNjA1MjNdLAorICBbMzAzOS4xMTM1NjI0MzE2OTcsIDIwMjQuNjQ1NjAyMDYwNTIzXSwKKyAgWzI5MzkuODEzNTYyNDMxNjk3NCwgMjE5MC4yNDU2MDIwNjA1MjNdLAorICBbMjkzOS44MTM1NjI0MzE2OTc0LCAyMDI0LjY0NTYwMjA2MDUyM10sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDE4MzkuODE4ODg0ODAzMjk5XSwKKyAgWzE2Mjg5LjExMjExNzY3NTkyNCwgMTgzOS44MTg4ODQ4MDMyOTldLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTYzODguNDEyMTE3Njc1OTI1LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAxMzQzLjAxODg4NDgwMzI5ODVdLAorICBbMTYyODkuMTEyMTE3Njc1OTI0LCAxNTA4LjYxODg4NDgwMzI5ODddLAorICBbMTYxODkuODEyMTE3Njc1OTIzLCAxNjc0LjIxODg4NDgwMzI5ODhdLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAxODM5LjgxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDIwMDUuNDE4ODg0ODAzMjk5XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjE3MS4wMTg4ODQ4MDMyOTldLAorICBbMTYwOTAuNTEyMTE3Njc1OTIyLCAyMzM2LjYxODg4NDgwMzI5OV0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDI1MDIuMjE4ODg0ODAzMjk5XSwKKyAgWzE2MDkwLjUxMjExNzY3NTkyMiwgMjY2Ny44MTg4ODQ4MDMyOTg3XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjgzMy40MTg4ODQ4MDMyOTg2XSwKKyAgWzE1OTkxLjIxMjExNzY3NTkyMSwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE1ODkxLjkxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTU4OTEuOTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNTk5MS4yMTIxMTc2NzU5MjEsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjA5MC41MTIxMTc2NzU5MjIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjE4OS44MTIxMTc2NzU5MjMsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjI4OS4xMTIxMTc2NzU5MjQsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjM4OC40MTIxMTc2NzU5MjUsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjQ4Ny43MTIxMTc2NzU5MjUsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjU4Ny4wMTIxMTc2NzU5MjQsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2Njg2LjMxMjExNzY3NTkyMywgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzY2MS40MTg4ODQ4MDMyOThdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDM2NjEuNDE4ODg0ODAzMjk4XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzODI3LjAxODg4NDgwMzI5OF0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzk5Mi42MTg4ODQ4MDMyOThdLAorICBbMTY5ODQuMjEyMTE3Njc1OTIsIDM4MjcuMDE4ODg0ODAzMjk4XSwKKyAgWzE3MDgzLjUxMjExNzY3NTkyLCAzNjYxLjQxODg4NDgwMzI5OF0sCisgIFsxNzE4Mi44MTIxMTc2NzU5MiwgMzQ5NS44MTg4ODQ4MDMyOTgzXSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTcyODIuMTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNzI4Mi4xMTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDMxNjQuNjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDMzMzAuMjE4ODg0ODAzMjk4NF0sCisgIFsxNjk4NC4yMTIxMTc2NzU5MiwgMzE2NC42MTg4ODQ4MDMyOTg0XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTcwODMuNTEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMjY2Ny44MTg4ODQ4MDMyOTg3XSwKKyAgWzE3MTgyLjgxMjExNzY3NTkyLCAyNjY3LjgxODg4NDgwMzI5ODddLAorICBbMTcxODIuODEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNzA4My41MTIxMTc2NzU5MiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2OTg0LjIxMjExNzY3NTkyLCAyODMzLjQxODg4NDgwMzI5ODZdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDI4MzMuNDE4ODg0ODAzMjk4Nl0sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2Nzg1LjYxMjExNzY3NTkyMiwgMjk5OS4wMTg4ODQ4MDMyOTg1XSwKKyAgWzE2ODg0LjkxMjExNzY3NTkyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAyOTk5LjAxODg4NDgwMzI5ODVdLAorICBbMTY0ODcuNzEyMTE3Njc1OTI1LCAzMTY0LjYxODg4NDgwMzI5ODRdLAorICBbMTY1ODcuMDEyMTE3Njc1OTI0LCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzNDk1LjgxODg4NDgwMzI5ODNdLAorICBbMTY2ODYuMzEyMTE3Njc1OTIzLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY3ODUuNjEyMTE3Njc1OTIyLCAzMzMwLjIxODg4NDgwMzI5ODRdLAorICBbMTY4ODQuOTEyMTE3Njc1OTIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjc4NS42MTIxMTc2NzU5MjIsIDM0OTUuODE4ODg0ODAzMjk4M10sCisgIFsxNjg4NC45MTIxMTc2NzU5MiwgMzMzMC4yMTg4ODQ4MDMyOTg0XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMTM3MS40NzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMjcyLjE3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEwNzMuNTc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTA3My41NzU5OTExMjgwNzksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCAzMDE0Ljc3MDAyMjQzNjUwNV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMjg0OS4xNzAwMjI0MzY1MDVdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDMwMTQuNzcwMDIyNDM2NTA1XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFs2NzYuMzc1OTkxMTI4MDc4OCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFs1NzcuMDc1OTkxMTI4MDc4NywgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzU3Ny4wNzU5OTExMjgwNzg3LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbNjc2LjM3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs3NzUuNjc1OTkxMTI4MDc4OSwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzc3NS42NzU5OTExMjgwNzg5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbODc0Ljk3NTk5MTEyODA3ODksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDMxODAuMzcwMDIyNDM2NTA0OF0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTA3My41NzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMTE3Mi44NzU5OTExMjgwNzksIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxMDczLjU3NTk5MTEyODA3OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzExNzIuODc1OTkxMTI4MDc5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMTA3My41NzU5OTExMjgwNzksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbOTc0LjI3NTk5MTEyODA3OSwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzg3NC45NzU5OTExMjgwNzg5LCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbNzc1LjY3NTk5MTEyODA3ODksIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFs4NzQuOTc1OTkxMTI4MDc4OSwgMzg0Mi43NzAwMjI0MzY1MDQ0XSwKKyAgWzk3NC4yNzU5OTExMjgwNzksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFs5NzQuMjc1OTkxMTI4MDc5LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMTA3My41NzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMTcyLjg3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzEyNzIuMTc1OTkxMTI4MDc5LCAzMTgwLjM3MDAyMjQzNjUwNDhdLAorICBbMTI3Mi4xNzU5OTExMjgwNzksIDMzNDUuOTcwMDIyNDM2NTA0N10sCisgIFsxMzcxLjQ3NTk5MTEyODA3OSwgMzE4MC4zNzAwMjI0MzY1MDQ4XSwKKyAgWzE0NzAuNzc1OTkxMTI4MDc4OSwgMzM0NS45NzAwMjI0MzY1MDQ3XSwKKyAgWzEzNzEuNDc1OTkxMTI4MDc5LCAzMzQ1Ljk3MDAyMjQzNjUwNDddLAorICBbMTM3MS40NzU5OTExMjgwNzksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNDcwLjc3NTk5MTEyODA3ODksIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNTcwLjA3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNDcwLjc3NTk5MTEyODA3ODksIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNTcwLjA3NTk5MTEyODA3ODgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM1MTEuNTcwMDIyNDM2NTA0Nl0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsxNzY4LjY3NTk5MTEyODA3ODcsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxNjY5LjM3NTk5MTEyODA3ODgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxNzY4LjY3NTk5MTEyODA3ODcsIDQwMDguMzcwMDIyNDM2NTA0M10sCisgIFsxODY3Ljk3NTk5MTEyODA3ODcsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsxOTY3LjI3NTk5MTEyODA3ODcsIDM2NzcuMTcwMDIyNDM2NTA0NV0sCisgIFsyMDY2LjU3NTk5MTEyODA3ODQsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyMTY1Ljg3NTk5MTEyODA3OCwgMzY3Ny4xNzAwMjI0MzY1MDQ1XSwKKyAgWzIwNjYuNTc1OTkxMTI4MDc4NCwgMzUxMS41NzAwMjI0MzY1MDQ2XSwKKyAgWzIxNjUuODc1OTkxMTI4MDc4LCAzNTExLjU3MDAyMjQzNjUwNDZdLAorICBbMjA2Ni41NzU5OTExMjgwNzg0LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjE2NS44NzU5OTExMjgwNzgsIDM4NDIuNzcwMDIyNDM2NTA0NF0sCisgIFsyMjY1LjE3NTk5MTEyODA3OCwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzIzNjQuNDc1OTkxMTI4MDc3NiwgNDAwOC4zNzAwMjI0MzY1MDQzXSwKKyAgWzIyNjUuMTc1OTkxMTI4MDc4LCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjM2NC40NzU5OTExMjgwNzc2LCAzNjc3LjE3MDAyMjQzNjUwNDVdLAorICBbMjQ2My43NzU5OTExMjgwNzczLCAzODQyLjc3MDAyMjQzNjUwNDRdLAorICBbMjQ2My43NzU5OTExMjgwNzczLCA0MDA4LjM3MDAyMjQzNjUwNDNdLAorICBbMjM2NC40NzU5OTExMjgwNzc2LCAzODQyLjc3MDAyMjQzNjUwNDRdCitdOworCitAcHJhZ21hKCdkYXJ0MmpzOmFzc3VtZUR5bmFtaWMnKQorQHByYWdtYSgnZGFydDJqczpub0lubGluZScpCitjb25mdXNlKHgpID0+IHg7CisKK21haW4oKSB7CisgIHByaW50KGNvbmZ1c2UocGFuZWxzKS5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbGl2ZW5lc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbGl2ZW5lc3NfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTYyODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9saXZlbmVzc190ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCB0ZXN0IHByb2dyYW0gdGVzdGluZyBjbG9zdXJlcy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2Zvbyh4KSB7CisgIHZhciB5ID0geDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB4Kys7CisgIHJldHVybiB5OworfQorCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKDQ5OSwgZm9vKDQ5OSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbG9hZF9pbmRleGVkX2NvbnN0YW50X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xvYWRfaW5kZXhlZF9jb25zdGFudF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjY2VlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL2xvYWRfaW5kZXhlZF9jb25zdGFudF90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCBjb25zdGFudCBwcm9wYWdhdGlvbiBvZiBsb2FkLWluZGV4ZWQgb3BlcmF0aW9ucworLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKDEwMSwgc3RyaW5nSW5kZXhlZExvYWQoKSk7CisgIEV4cGVjdC5lcXVhbHMoMTAyLCBhcnJheUluZGV4ZWRMb2FkKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBzdHJpbmdJbmRleGVkTG9hZCgpOworICAgIGFycmF5SW5kZXhlZExvYWQoKTsKKyAgfQorICBFeHBlY3QuZXF1YWxzKDEwMSwgc3RyaW5nSW5kZXhlZExvYWQoKSk7CisgIEV4cGVjdC5lcXVhbHMoMTAyLCBhcnJheUluZGV4ZWRMb2FkKCkpOworfQorCitzdHJpbmdJbmRleGVkTG9hZCgpID0+ICgiSGVsbG8iKS5jb2RlVW5pdEF0KDEpOworYXJyYXlJbmRleGVkTG9hZCgpID0+IChjb25zdCBbMTAxLCAxMDIsIDEwM10pWzFdOwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbG9jYWxfdmFyX2luX2Fubm90YXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbG9jYWxfdmFyX2luX2Fubm90YXRpb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDc0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9sb2NhbF92YXJfaW5fYW5ub3RhdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8zNzA2NQorCitjb25zdCB4ID0gMDsKK21haW4oQHggYXJncykgeworICBjb25zdCB6ID0gMDsKKyAgZm9vKEB6IGFyZ3MpIHt9CisgIGJhcihAeCBhcmdzKSB7fQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWFueV9jYWxsc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tYW55X2NhbGxzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI5ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWFueV9jYWxsc190ZXN0LmRhcnQKQEAgLTAsMCArMSwyMjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3QgbWVnYW1vcnBoaWMgY2FsbHMuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBBIHsKKyAgQSgpIHt9CisgIGYxKCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgZjIoKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKworICBmMygpIHsKKyAgICByZXR1cm4gMzsKKyAgfQorCisgIGY0KCkgeworICAgIHJldHVybiA0OworICB9CisKKyAgZjUoKSB7CisgICAgcmV0dXJuIDU7CisgIH0KKworICBmNigpIHsKKyAgICByZXR1cm4gNjsKKyAgfQorCisgIGY3KCkgeworICAgIHJldHVybiA3OworICB9CisKKyAgZjgoKSB7CisgICAgcmV0dXJuIDg7CisgIH0KKworICBmOSgpIHsKKyAgICByZXR1cm4gOTsKKyAgfQorCisgIGYxMSgpIHsKKyAgICByZXR1cm4gMTE7CisgIH0KKworICBmMTIoKSB7CisgICAgcmV0dXJuIDEyOworICB9CisKKyAgZjEzKCkgeworICAgIHJldHVybiAxMzsKKyAgfQorCisgIGYxNCgpIHsKKyAgICByZXR1cm4gMTQ7CisgIH0KKworICBmMTUoKSB7CisgICAgcmV0dXJuIDE1OworICB9CisKKyAgZjE2KCkgeworICAgIHJldHVybiAxNjsKKyAgfQorCisgIGYxNygpIHsKKyAgICByZXR1cm4gMTc7CisgIH0KKworICBmMTgoKSB7CisgICAgcmV0dXJuIDE4OworICB9CisKKyAgZjE5KCkgeworICAgIHJldHVybiAxOTsKKyAgfQorCisgIGYyMCgpIHsKKyAgICByZXR1cm4gMjA7CisgIH0KKworICBmMjEoKSB7CisgICAgcmV0dXJuIDIxOworICB9CisKKyAgZjIyKCkgeworICAgIHJldHVybiAyMjsKKyAgfQorCisgIGYyMygpIHsKKyAgICByZXR1cm4gMjM7CisgIH0KKworICBmMjQoKSB7CisgICAgcmV0dXJuIDI0OworICB9CisKKyAgZjI1KCkgeworICAgIHJldHVybiAyNTsKKyAgfQorCisgIGYyNigpIHsKKyAgICByZXR1cm4gMjY7CisgIH0KKworICBmMjcoKSB7CisgICAgcmV0dXJuIDI3OworICB9CisKKyAgZjI4KCkgeworICAgIHJldHVybiAyODsKKyAgfQorCisgIGYyOSgpIHsKKyAgICByZXR1cm4gMjk7CisgIH0KKworICBmMzAoKSB7CisgICAgcmV0dXJuIDMwOworICB9CisKKyAgZjMxKCkgeworICAgIHJldHVybiAzMTsKKyAgfQorCisgIGYzMigpIHsKKyAgICByZXR1cm4gMzI7CisgIH0KKworICBmMzMoKSB7CisgICAgcmV0dXJuIDMzOworICB9CisKKyAgZjM0KCkgeworICAgIHJldHVybiAzNDsKKyAgfQorCisgIGYzNSgpIHsKKyAgICByZXR1cm4gMzU7CisgIH0KKworICBmMzYoKSB7CisgICAgcmV0dXJuIDM2OworICB9CisKKyAgZjM3KCkgeworICAgIHJldHVybiAzNzsKKyAgfQorCisgIGYzOCgpIHsKKyAgICByZXR1cm4gMzg7CisgIH0KKworICBmMzkoKSB7CisgICAgcmV0dXJuIDM5OworICB9Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgQigpIDogc3VwZXIoKSB7fQorfQorCitjbGFzcyBNYW55Q2FsbHNUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKDEwLCBudWxsKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChsaXN0Lmxlbmd0aCB+LyAyKTsgaSsrKSB7CisgICAgICBsaXN0W2ldID0gbmV3IEEoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IChsaXN0Lmxlbmd0aCB+LyAyKTsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgIGxpc3RbaV0gPSBuZXcgQigpOworICAgIH0KKyAgICBmb3IgKGludCBsb29wID0gMDsgbG9vcCA8IDc7IGxvb3ArKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMSwgbGlzdFtpXS5mMSgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygyLCBsaXN0W2ldLmYyKCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDMsIGxpc3RbaV0uZjMoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoNCwgbGlzdFtpXS5mNCgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscyg1LCBsaXN0W2ldLmY1KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDYsIGxpc3RbaV0uZjYoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoNywgbGlzdFtpXS5mNygpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscyg4LCBsaXN0W2ldLmY4KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDksIGxpc3RbaV0uZjkoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMTEsIGxpc3RbaV0uZjExKCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDEyLCBsaXN0W2ldLmYxMigpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygxMywgbGlzdFtpXS5mMTMoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMTQsIGxpc3RbaV0uZjE0KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDE1LCBsaXN0W2ldLmYxNSgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygxNiwgbGlzdFtpXS5mMTYoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMTcsIGxpc3RbaV0uZjE3KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDE4LCBsaXN0W2ldLmYxOCgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygxOSwgbGlzdFtpXS5mMTkoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMjAsIGxpc3RbaV0uZjIwKCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDIxLCBsaXN0W2ldLmYyMSgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygyMiwgbGlzdFtpXS5mMjIoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMjMsIGxpc3RbaV0uZjIzKCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDI0LCBsaXN0W2ldLmYyNCgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygyNSwgbGlzdFtpXS5mMjUoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMjYsIGxpc3RbaV0uZjI2KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDI3LCBsaXN0W2ldLmYyNygpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygyOCwgbGlzdFtpXS5mMjgoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMjksIGxpc3RbaV0uZjI5KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDMwLCBsaXN0W2ldLmYzMCgpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygzMSwgbGlzdFtpXS5mMzEoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMzIsIGxpc3RbaV0uZjMyKCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDMzLCBsaXN0W2ldLmYzMygpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygzNCwgbGlzdFtpXS5mMzQoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMzUsIGxpc3RbaV0uZjM1KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDM2LCBsaXN0W2ldLmYzNigpKTsKKyAgICAgICAgRXhwZWN0LmVxdWFscygzNywgbGlzdFtpXS5mMzcoKSk7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMzgsIGxpc3RbaV0uZjM4KCkpOworICAgICAgICBFeHBlY3QuZXF1YWxzKDM5LCBsaXN0W2ldLmYzOSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworbWFpbigpIHsKKyAgTWFueUNhbGxzVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWFueV9tZXRob2RfY2FsbHNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWFueV9tZXRob2RfY2FsbHNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmFhOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tYW55X21ldGhvZF9jYWxsc190ZXN0LmRhcnQKQEAgLTAsMCArMSw2NjQ0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdGhhdCBjb21waWxlciBkb2VzIG5vdCBjcmFzaCBmb3IgdmVyeSBsb25nIGNoYWlucyBvZiBtZXRob2QgY2FsbHMuCisKK3ZhciBmaWVsZCA9IGZhbHNlOworCitmb28oKSB7CisgIGlmIChmaWVsZCkgeworICAgIHByaW50KCdmb28nKTsKKyAgfQorfQorCittYWluKCkgeworICBtYW55TWV0aG9kQ2FsbHMoKTsKKyAgZmllbGQgPSB0cnVlOworfQorCittYW55TWV0aG9kQ2FsbHMoKSB7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKKyAgZm9vKCk7CisgIGZvbygpOworICBmb28oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21hbnlfbmFtZWRfYXJndW1lbnRzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21hbnlfbmFtZWRfYXJndW1lbnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTVhMTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWFueV9uYW1lZF9hcmd1bWVudHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBGaXNrIHsKKyAgbWV0aG9kKAorICAgICAge2E6ICdhJywKKyAgICAgIGI6ICdiJywKKyAgICAgIGM6ICdjJywKKyAgICAgIGQ6ICdkJywKKyAgICAgIGU6ICdlJywKKyAgICAgIGY6ICdmJywKKyAgICAgIGc6ICdnJywKKyAgICAgIGg6ICdoJywKKyAgICAgIGk6ICdpJywKKyAgICAgIGo6ICdqJywKKyAgICAgIGs6ICdrJywKKyAgICAgIGw6ICdsJywKKyAgICAgIG06ICdtJywKKyAgICAgIG46ICduJywKKyAgICAgIG86ICdvJywKKyAgICAgIHA6ICdwJywKKyAgICAgIHE6ICdxJywKKyAgICAgIHI6ICdyJywKKyAgICAgIHM6ICdzJywKKyAgICAgIHQ6ICd0JywKKyAgICAgIHU6ICd1JywKKyAgICAgIHY6ICd2JywKKyAgICAgIHc6ICd3JywKKyAgICAgIHg6ICd4JywKKyAgICAgIHk6ICd5JywKKyAgICAgIHo6ICd6J30pIHsKKyAgICByZXR1cm4gJ2E6ICRhLCAnCisgICAgICAgICdiOiAkYiwgJworICAgICAgICAnYzogJGMsICcKKyAgICAgICAgJ2Q6ICRkLCAnCisgICAgICAgICdlOiAkZSwgJworICAgICAgICAnZjogJGYsICcKKyAgICAgICAgJ2c6ICRnLCAnCisgICAgICAgICdoOiAkaCwgJworICAgICAgICAnaTogJGksICcKKyAgICAgICAgJ2o6ICRqLCAnCisgICAgICAgICdrOiAkaywgJworICAgICAgICAnbDogJGwsICcKKyAgICAgICAgJ206ICRtLCAnCisgICAgICAgICduOiAkbiwgJworICAgICAgICAnbzogJG8sICcKKyAgICAgICAgJ3A6ICRwLCAnCisgICAgICAgICdxOiAkcSwgJworICAgICAgICAncjogJHIsICcKKyAgICAgICAgJ3M6ICRzLCAnCisgICAgICAgICd0OiAkdCwgJworICAgICAgICAndTogJHUsICcKKyAgICAgICAgJ3Y6ICR2LCAnCisgICAgICAgICd3OiAkdywgJworICAgICAgICAneDogJHgsICcKKyAgICAgICAgJ3k6ICR5LCAnCisgICAgICAgICd6OiAkeic7CisgIH0KK30KKworbWFpbigpIHsKKyAgdmFyIG1ldGhvZCA9IG5ldyBGaXNrKCkubWV0aG9kOworICB2YXIgbmFtZWRBcmd1bWVudHMgPSBuZXcgTWFwPFN5bWJvbCwgZHluYW1pYz4oKTsKKyAgbmFtZWRBcmd1bWVudHNbY29uc3QgU3ltYm9sKCdhJyldID0gJ2EnOworICBFeHBlY3Quc3RyaW5nRXF1YWxzKAorICAgICAgRVhQRUNURURfUkVTVUxULCBGdW5jdGlvbi5hcHBseShtZXRob2QsIFtdLCBuYW1lZEFyZ3VtZW50cykpOworICBFeHBlY3Quc3RyaW5nRXF1YWxzKAorICAgICAgRVhQRUNURURfUkVTVUxULAorICAgICAgbmV3IEZpc2soKS5tZXRob2QoCisgICAgICAgICAgYTogJ2EnLAorICAgICAgICAgIGI6ICdiJywKKyAgICAgICAgICBjOiAnYycsCisgICAgICAgICAgZDogJ2QnLAorICAgICAgICAgIGU6ICdlJywKKyAgICAgICAgICBmOiAnZicsCisgICAgICAgICAgZzogJ2cnLAorICAgICAgICAgIGg6ICdoJywKKyAgICAgICAgICBpOiAnaScsCisgICAgICAgICAgajogJ2onLAorICAgICAgICAgIGs6ICdrJywKKyAgICAgICAgICBsOiAnbCcsCisgICAgICAgICAgbTogJ20nLAorICAgICAgICAgIG46ICduJywKKyAgICAgICAgICBvOiAnbycsCisgICAgICAgICAgcDogJ3AnLAorICAgICAgICAgIHE6ICdxJywKKyAgICAgICAgICByOiAncicsCisgICAgICAgICAgczogJ3MnLAorICAgICAgICAgIHQ6ICd0JywKKyAgICAgICAgICB1OiAndScsCisgICAgICAgICAgdjogJ3YnLAorICAgICAgICAgIHc6ICd3JywKKyAgICAgICAgICB4OiAneCcsCisgICAgICAgICAgeTogJ3knLAorICAgICAgICAgIHo6ICd6JykpOworfQorCitjb25zdCBTdHJpbmcgRVhQRUNURURfUkVTVUxUID0gJ2E6IGEsICcKKyAgICAnYjogYiwgJworICAgICdjOiBjLCAnCisgICAgJ2Q6IGQsICcKKyAgICAnZTogZSwgJworICAgICdmOiBmLCAnCisgICAgJ2c6IGcsICcKKyAgICAnaDogaCwgJworICAgICdpOiBpLCAnCisgICAgJ2o6IGosICcKKyAgICAnazogaywgJworICAgICdsOiBsLCAnCisgICAgJ206IG0sICcKKyAgICAnbjogbiwgJworICAgICdvOiBvLCAnCisgICAgJ3A6IHAsICcKKyAgICAncTogcSwgJworICAgICdyOiByLCAnCisgICAgJ3M6IHMsICcKKyAgICAndDogdCwgJworICAgICd1OiB1LCAnCisgICAgJ3Y6IHYsICcKKyAgICAndzogdywgJworICAgICd4OiB4LCAnCisgICAgJ3k6IHksICcKKyAgICAnejogeic7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tZWdhX2xvYWRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWVnYV9sb2FkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc5MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbWVnYV9sb2FkX3Rlc3QuZGFydApAQCAtMCwwICsxLDIwOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCBtZWdhbW9ycGhpYywgYnV0IHNpbmdsZSB0YXJnZXQgZmllbGQgbG9hZC4KKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0xMAorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQmFzZSB7CisgIHZhciBmOworfQorCitjbGFzcyBBIGV4dGVuZHMgQmFzZSB7CisgIEEoKSB7CisgICAgdGhpcy5mID0gMDsKKyAgfQorfQorCitjbGFzcyBCIGV4dGVuZHMgQmFzZSB7CisgIEIoKSB7CisgICAgdGhpcy5mID0gMTsKKyAgfQorfQorCitjbGFzcyBDIGV4dGVuZHMgQmFzZSB7CisgIEMoKSB7CisgICAgdGhpcy5mID0gMjsKKyAgfQorfQorCitjbGFzcyBEIGV4dGVuZHMgQmFzZSB7CisgIEQoKSB7CisgICAgdGhpcy5mID0gMzsKKyAgfQorfQorCitjbGFzcyBFIGV4dGVuZHMgQmFzZSB7CisgIEUoKSB7CisgICAgdGhpcy5mID0gNDsKKyAgfQorfQorCitjbGFzcyBGIGV4dGVuZHMgQmFzZSB7CisgIEYoKSB7CisgICAgdGhpcy5mID0gNTsKKyAgfQorfQorCitjbGFzcyBHIGV4dGVuZHMgQmFzZSB7CisgIEcoKSB7CisgICAgdGhpcy5mID0gNjsKKyAgfQorfQorCitjbGFzcyBIIGV4dGVuZHMgQmFzZSB7CisgIEgoKSB7CisgICAgdGhpcy5mID0gNzsKKyAgfQorfQorCitjbGFzcyBJIGV4dGVuZHMgQmFzZSB7CisgIEkoKSB7CisgICAgdGhpcy5mID0gODsKKyAgfQorfQorCitjbGFzcyBKIGV4dGVuZHMgQmFzZSB7CisgIEooKSB7CisgICAgdGhpcy5mID0gOTsKKyAgfQorfQorCitjbGFzcyBLIGV4dGVuZHMgQmFzZSB7CisgIEsoKSB7CisgICAgdGhpcy5mID0gMTA7CisgIH0KK30KKworY2xhc3MgTCBleHRlbmRzIEJhc2UgeworICBMKCkgeworICAgIHRoaXMuZiA9IDExOworICB9Cit9CisKK2NsYXNzIE0gZXh0ZW5kcyBCYXNlIHsKKyAgTSgpIHsKKyAgICB0aGlzLmYgPSAxMjsKKyAgfQorfQorCitjbGFzcyBOIGV4dGVuZHMgQmFzZSB7CisgIE4oKSB7CisgICAgdGhpcy5mID0gMTM7CisgIH0KK30KKworY2xhc3MgTyBleHRlbmRzIEJhc2UgeworICBPKCkgeworICAgIHRoaXMuZiA9IDE0OworICB9Cit9CisKK2NsYXNzIFAgZXh0ZW5kcyBCYXNlIHsKKyAgUCgpIHsKKyAgICB0aGlzLmYgPSAxNTsKKyAgfQorfQorCitjbGFzcyBRIGV4dGVuZHMgQmFzZSB7CisgIFEoKSB7CisgICAgdGhpcy5mID0gMTY7CisgIH0KK30KKworY2xhc3MgUiBleHRlbmRzIEJhc2UgeworICBSKCkgeworICAgIHRoaXMuZiA9IDE3OworICB9Cit9CisKK2NsYXNzIFMgZXh0ZW5kcyBCYXNlIHsKKyAgUygpIHsKKyAgICB0aGlzLmYgPSAxODsKKyAgfQorfQorCitjbGFzcyBUIGV4dGVuZHMgQmFzZSB7CisgIFQoKSB7CisgICAgdGhpcy5mID0gMTk7CisgIH0KK30KKworY2xhc3MgVSBleHRlbmRzIEJhc2UgeworICBVKCkgeworICAgIHRoaXMuZiA9IDIwOworICB9Cit9CisKK2NsYXNzIFYgZXh0ZW5kcyBCYXNlIHsKKyAgVigpIHsKKyAgICB0aGlzLmYgPSAyMTsKKyAgfQorfQorCitjbGFzcyBXIGV4dGVuZHMgQmFzZSB7CisgIFYoKSB7CisgICAgdGhpcy5mID0gMjI7CisgIH0KK30KKworY2xhc3MgWCBleHRlbmRzIEJhc2UgeworICBWKCkgeworICAgIHRoaXMuZiA9IDIxOworICB9Cit9CisKK2NsYXNzIFkgZXh0ZW5kcyBCYXNlIHsKKyAgVigpIHsKKyAgICB0aGlzLmYgPSAyNDsKKyAgfQorfQorCitjbGFzcyBaIGV4dGVuZHMgQmFzZSB7CisgIFYoKSB7CisgICAgdGhpcy5mID0gMjE7CisgIH0KK30KKworYWxsb2NhdGVPYmplY3RzKCkgeworICB2YXIgbGlzdCA9IFtdOworICBsaXN0LmFkZChuZXcgQSgpKTsKKyAgbGlzdC5hZGQobmV3IEIoKSk7CisgIGxpc3QuYWRkKG5ldyBDKCkpOworICBsaXN0LmFkZChuZXcgRCgpKTsKKyAgbGlzdC5hZGQobmV3IEUoKSk7CisgIGxpc3QuYWRkKG5ldyBGKCkpOworICBsaXN0LmFkZChuZXcgRygpKTsKKyAgbGlzdC5hZGQobmV3IEgoKSk7CisgIGxpc3QuYWRkKG5ldyBJKCkpOworICBsaXN0LmFkZChuZXcgSigpKTsKKyAgbGlzdC5hZGQobmV3IEsoKSk7CisgIGxpc3QuYWRkKG5ldyBMKCkpOworICBsaXN0LmFkZChuZXcgTSgpKTsKKyAgbGlzdC5hZGQobmV3IE4oKSk7CisgIGxpc3QuYWRkKG5ldyBPKCkpOworICBsaXN0LmFkZChuZXcgUCgpKTsKKyAgbGlzdC5hZGQobmV3IFEoKSk7CisgIGxpc3QuYWRkKG5ldyBSKCkpOworICBsaXN0LmFkZChuZXcgUygpKTsKKyAgbGlzdC5hZGQobmV3IFQoKSk7CisgIGxpc3QuYWRkKG5ldyBVKCkpOworICBsaXN0LmFkZChuZXcgVigpKTsKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK2NhbGxUaGVtQWxsKHZhciBsaXN0KSB7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoaSwgbGlzdFtpXS5mKTsKKyAgfQorfQorCittYWluKCkgeworICB2YXIgbGlzdCA9IGFsbG9jYXRlT2JqZWN0cygpOworICAvLyBNYWtlIHN1cmUgdGhlIG9wdGltaXplciB0cmlnZ2VycyB0aGUgY29tcGlsYXRpb24gb2YgY2FsbFRoZW1BbGwuCisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIGNhbGxUaGVtQWxsKGxpc3QpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tZW1vcnlfc3dhcF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tZW1vcnlfc3dhcF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkMDkzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21lbW9yeV9zd2FwX3Rlc3QuZGFydApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdGhhdCB0aGUgUGFyYWxsZU1vdmVSZXNvbHZlciBpbiB0aGUgVk0gdXNlcyB2YWxpZCByZWdpc3RlcnMKKy8vIHdoZW4gcmVxdWlyaW5nIHNjcmF0Y2ggcmVnaXN0ZXJzLgorCittYWluKCkgeworICAvLyBJdGVyYXRlIGVub3VnaCB0byBlbnN1cmUgb3B0aW1pemluZyBgc3BpbGxpbmdNZXRob2RgLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisgICAgc3BpbGxpbmdNZXRob2QoaSwgKCkgPT4gMCk7CisgIH0KK30KKworc3BpbGxpbmdNZXRob2Qod2hhdCwgb2JmdXNjYXRlKSB7CisgIC8vIERlZmluZSBsb3RzIG9mIHZhcmlhYmxlcyB0byBnZXQgYSBmZXcgaW4gc3RhY2suCisgIHZhciBhID0gb2JmdXNjYXRlKCk7CisgIHZhciBiID0gb2JmdXNjYXRlKCk7CisgIHZhciBjID0gb2JmdXNjYXRlKCk7CisgIHZhciBkID0gb2JmdXNjYXRlKCk7CisgIHZhciBlID0gb2JmdXNjYXRlKCk7CisgIHZhciBmID0gb2JmdXNjYXRlKCk7CisgIHZhciBnID0gb2JmdXNjYXRlKCk7CisgIHZhciBoID0gb2JmdXNjYXRlKCk7CisgIHZhciBpID0gb2JmdXNjYXRlKCk7CisgIHZhciBqID0gb2JmdXNjYXRlKCk7CisgIHZhciBrID0gb2JmdXNjYXRlKCk7CisgIHZhciBsID0gb2JmdXNjYXRlKCk7CisgIHZhciBtID0gb2JmdXNjYXRlKCk7CisgIHZhciBuID0gb2JmdXNjYXRlKCk7CisgIHZhciBvID0gb2JmdXNjYXRlKCk7CisgIHZhciBwID0gb2JmdXNjYXRlKCk7CisgIHZhciBxID0gb2JmdXNjYXRlKCk7CisgIHZhciByID0gb2JmdXNjYXRlKCk7CisgIHZhciBzID0gb2JmdXNjYXRlKCk7CisgIHZhciB0ID0gb2JmdXNjYXRlKCk7CisgIHZhciB1ID0gb2JmdXNjYXRlKCk7CisgIHZhciB2ID0gb2JmdXNjYXRlKCk7CisKKyAgLy8gU3dhcCBhbGwgdmFyaWFibGVzLCBpbiB0aGUgaG9wZSBvZiBhIG1lbW9yeSA8LT4gbWVtb3J5IHN3YXAgb3BlcmF0aW9uLgorICB3aGlsZSAod2hhdCA9PSA0MikgeworICAgIGEgPSBiOworICAgIGIgPSBhOworICAgIGMgPSBkOworICAgIGQgPSBjOworICAgIGUgPSBmOworICAgIGYgPSBlOworICAgIGcgPSBoOworICAgIGggPSBnOworICAgIGkgPSBqOworICAgIGogPSBpOworICAgIGsgPSBsOworICAgIGwgPSBrOworICAgIG0gPSBuOworICAgIG4gPSBtOworICAgIG8gPSBwOworICAgIHAgPSBvOworICAgIHEgPSByOworICAgIHIgPSBxOworICAgIHMgPSB0OworICAgIHQgPSBzOworICAgIHUgPSB2OworICAgIHYgPSB1OworICAgIHdoYXQrKzsKKyAgfQorCisgIC8vIEtlZXAgYWxsIHZhcmlhYmxlcyBhbGl2ZS4KKyAgcmV0dXJuIGEgKworICAgICAgYiArCisgICAgICBjICsKKyAgICAgIGQgKworICAgICAgZSArCisgICAgICBmICsKKyAgICAgIGcgKworICAgICAgaCArCisgICAgICBpICsKKyAgICAgIGogKworICAgICAgayArCisgICAgICBsICsKKyAgICAgIG0gKworICAgICAgbiArCisgICAgICBvICsKKyAgICAgIHAgKworICAgICAgcSArCisgICAgICByICsKKyAgICAgIHMgKworICAgICAgdCArCisgICAgICB1ICsKKyAgICAgIHY7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9taW50X2NvbXBhcmVzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21pbnRfY29tcGFyZXNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzdkOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9taW50X2NvbXBhcmVzX3Rlc3QuZGFydApAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0IGNvbXBhcmVzIG9uIDY0LWJpdCBpbnRlZ2Vycy4KKworY29tcGFyZVRlc3QoKSB7CisgIEV4cGVjdC5pc0ZhbHNlKDQyOTQ5NjcyOTYgPCA2KTsKKyAgRXhwZWN0LmlzRmFsc2UoNDI5NDk2NzI5NiA8IDQyOTQ5NjcyOTYpOworICBFeHBlY3QuaXNGYWxzZSg0Mjk0OTY3Mjk2IDw9IDYpOworICBFeHBlY3QuaXNUcnVlKDQyOTQ5NjcyOTYgPD0gNDI5NDk2NzI5Nik7CisgIEV4cGVjdC5pc0ZhbHNlKDQyOTQ5NjcyOTYgPCA0Mjk0OTY3Mjk1KTsKKworICBFeHBlY3QuaXNUcnVlKC00Mjk0OTY3Mjk2IDwgNik7CisgIEV4cGVjdC5pc1RydWUoLTQyOTQ5NjcyOTYgPCA0Mjk0OTY3Mjk2KTsKKyAgRXhwZWN0LmlzVHJ1ZSgtNDI5NDk2NzI5NiA8PSA2KTsKKyAgRXhwZWN0LmlzVHJ1ZSgtNDI5NDk2NzI5NiA8PSA0Mjk0OTY3Mjk2KTsKKyAgRXhwZWN0LmlzVHJ1ZSgtNDI5NDk2NzI5NiA8IDQyOTQ5NjcyOTUpOworCisgIEV4cGVjdC5pc0ZhbHNlKDQyOTQ5NjcyOTYgPCAtNik7CisgIEV4cGVjdC5pc0ZhbHNlKDQyOTQ5NjcyOTYgPD0gLTYpOworICBFeHBlY3QuaXNGYWxzZSg0Mjk0OTY3Mjk2IDwgLTQyOTQ5NjcyOTUpOworCisgIEV4cGVjdC5pc1RydWUoLTQyOTQ5NjcyOTYgPCAtNik7CisgIEV4cGVjdC5pc1RydWUoLTQyOTQ5NjcyOTYgPD0gLTYpOworICBFeHBlY3QuaXNUcnVlKC00Mjk0OTY3Mjk2IDwgLTQyOTQ5NjcyOTUpOworCisgIEV4cGVjdC5pc1RydWUoNDI5NDk2NzI5NiA+IDYpOworICBFeHBlY3QuaXNGYWxzZSg0Mjk0OTY3Mjk2ID4gNDI5NDk2NzI5Nik7CisgIEV4cGVjdC5pc1RydWUoNDI5NDk2NzI5NiA+PSA2KTsKKyAgRXhwZWN0LmlzVHJ1ZSg0Mjk0OTY3Mjk2ID49IDQyOTQ5NjcyOTYpOworICBFeHBlY3QuaXNUcnVlKDQyOTQ5NjcyOTYgPiA0Mjk0OTY3Mjk1KTsKKworICBFeHBlY3QuaXNGYWxzZSgtNDI5NDk2NzI5NiA+IDYpOworICBFeHBlY3QuaXNGYWxzZSgtNDI5NDk2NzI5NiA+IDQyOTQ5NjcyOTYpOworICBFeHBlY3QuaXNGYWxzZSgtNDI5NDk2NzI5NiA+PSA2KTsKKyAgRXhwZWN0LmlzRmFsc2UoLTQyOTQ5NjcyOTYgPj0gNDI5NDk2NzI5Nik7CisgIEV4cGVjdC5pc0ZhbHNlKC00Mjk0OTY3Mjk2ID4gNDI5NDk2NzI5NSk7CisKKyAgRXhwZWN0LmlzVHJ1ZSg0Mjk0OTY3Mjk2ID4gLTYpOworICBFeHBlY3QuaXNUcnVlKDQyOTQ5NjcyOTYgPj0gLTYpOworICBFeHBlY3QuaXNUcnVlKDQyOTQ5NjcyOTYgPiAtNDI5NDk2NzI5NSk7CisKKyAgRXhwZWN0LmlzRmFsc2UoLTQyOTQ5NjcyOTYgPiAtNik7CisgIEV4cGVjdC5pc0ZhbHNlKC00Mjk0OTY3Mjk2ID49IC02KTsKKyAgRXhwZWN0LmlzRmFsc2UoLTQyOTQ5NjcyOTYgPiAtNDI5NDk2NzI5NSk7CisKKyAgRXhwZWN0LmlzVHJ1ZSg0Mjk0OTY3Mjk2IDwgOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisgIEV4cGVjdC5pc1RydWUoLTQyOTQ5NjcyOTYgPCA5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKyAgRXhwZWN0LmlzRmFsc2UoNDI5NDk2NzI5NiA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4KTsKKyAgRXhwZWN0LmlzRmFsc2UoLTQyOTQ5NjcyOTYgPCAtOTIyMzM3MjAzNjg1NDc3NTgwOCk7Cit9CisKK2NvbXBhcmVUZXN0MihsdCwgbHRlLCBndCwgZ3RlKSB7CisgIEV4cGVjdC5pc0ZhbHNlKGx0KDQyOTQ5NjcyOTYsIDYpKTsKKyAgRXhwZWN0LmlzRmFsc2UobHRlKDQyOTQ5NjcyOTYsIDYpKTsKKyAgRXhwZWN0LmlzVHJ1ZShndCg0Mjk0OTY3Mjk2LCA2KSk7CisgIEV4cGVjdC5pc1RydWUoZ3RlKDQyOTQ5NjcyOTYsIDYpKTsKKworICBFeHBlY3QuaXNUcnVlKGx0ZSgtMSwgLTEpKTsKKyAgRXhwZWN0LmlzVHJ1ZShndGUoLTEsIC0xKSk7CisgIEV4cGVjdC5pc1RydWUobHRlKC0yLCAtMSkpOworICBFeHBlY3QuaXNGYWxzZShndGUoLTIsIC0xKSk7CisgIEV4cGVjdC5pc1RydWUobHRlKC00Mjk0OTY3Mjk2LCAtMSkpOworICBFeHBlY3QuaXNGYWxzZShndGUoLTQyOTQ5NjcyOTYsIC0xKSk7CisKKyAgRXhwZWN0LmlzVHJ1ZShsdCgtMiwgLTEpKTsKKyAgRXhwZWN0LmlzRmFsc2UoZ3QoLTIsIC0xKSk7CisgIEV4cGVjdC5pc1RydWUobHQoLTQyOTQ5NjcyOTYsIC0xKSk7CisgIEV4cGVjdC5pc0ZhbHNlKGd0KC00Mjk0OTY3Mjk2LCAtMSkpOworCisgIEV4cGVjdC5pc0ZhbHNlKGx0KC0xLCAtNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNUcnVlKGd0KC0xLCAtNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNGYWxzZShsdCgyLCAtMikpOworICBFeHBlY3QuaXNUcnVlKGd0KDIsIC0yKSk7CisgIEV4cGVjdC5pc0ZhbHNlKGx0KDQyOTQ5NjcyOTYsIC0xKSk7CisgIEV4cGVjdC5pc1RydWUoZ3QoNDI5NDk2NzI5NiwgLTEpKTsKK30KKworY29tcGFyZVRlc3RXaXRoWmVybyhsdCwgbHRlLCBndCwgZ3RlLCBlcSwgbmUpIHsKKyAgRXhwZWN0LmlzRmFsc2UobHQoNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNGYWxzZShsdGUoNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNUcnVlKGd0KDQyOTQ5NjcyOTYpKTsKKyAgRXhwZWN0LmlzVHJ1ZShndGUoNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNGYWxzZShlcSg0Mjk0OTY3Mjk2KSk7CisgIEV4cGVjdC5pc1RydWUobmUoNDI5NDk2NzI5NikpOworCisgIEV4cGVjdC5pc1RydWUobHQoLTEpKTsKKyAgRXhwZWN0LmlzVHJ1ZShsdGUoLTEpKTsKKyAgRXhwZWN0LmlzRmFsc2UoZ3QoLTEpKTsKKyAgRXhwZWN0LmlzRmFsc2UoZ3RlKC0xKSk7CisgIEV4cGVjdC5pc0ZhbHNlKGVxKC0xKSk7CisgIEV4cGVjdC5pc1RydWUobmUoLTEpKTsKKworICBFeHBlY3QuaXNUcnVlKGx0KC0yKSk7CisgIEV4cGVjdC5pc1RydWUobHRlKC0yKSk7CisgIEV4cGVjdC5pc0ZhbHNlKGd0KC0yKSk7CisgIEV4cGVjdC5pc0ZhbHNlKGd0ZSgtMikpOworICBFeHBlY3QuaXNGYWxzZShlcSgtMikpOworICBFeHBlY3QuaXNUcnVlKG5lKC0yKSk7CisKKyAgRXhwZWN0LmlzVHJ1ZShsdCgtNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNUcnVlKGx0ZSgtNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNGYWxzZShndCgtNDI5NDk2NzI5NikpOworICBFeHBlY3QuaXNGYWxzZShndGUoLTQyOTQ5NjcyOTYpKTsKKyAgRXhwZWN0LmlzRmFsc2UoZXEoLTQyOTQ5NjcyOTYpKTsKKyAgRXhwZWN0LmlzVHJ1ZShuZSgtNDI5NDk2NzI5NikpOworCisgIEV4cGVjdC5pc0ZhbHNlKGx0KDApKTsKKyAgRXhwZWN0LmlzVHJ1ZShsdGUoMCkpOworICBFeHBlY3QuaXNGYWxzZShndCgwKSk7CisgIEV4cGVjdC5pc1RydWUoZ3RlKDApKTsKKyAgRXhwZWN0LmlzVHJ1ZShlcSgwKSk7CisgIEV4cGVjdC5pc0ZhbHNlKG5lKDApKTsKK30KKworYm9vbCBsdDEoYSwgYikgPT4gYSA8IGI7Citib29sIGx0ZTEoYSwgYikgPT4gYSA8PSBiOworYm9vbCBndDEoYSwgYikgPT4gYSA+IGI7Citib29sIGd0ZTEoYSwgYikgPT4gYSA+PSBiOworCitib29sIGx0MihhLCBiKSA9PiBhIDwgYiA/IHRydWUgOiBmYWxzZTsKK2Jvb2wgbHRlMihhLCBiKSA9PiBhIDw9IGIgPyB0cnVlIDogZmFsc2U7Citib29sIGd0MihhLCBiKSA9PiBhID4gYiA/IHRydWUgOiBmYWxzZTsKK2Jvb2wgZ3RlMihhLCBiKSA9PiBhID49IGIgPyB0cnVlIDogZmFsc2U7CisKK2Jvb2wgaW50X2x0MShpbnQgYSkgPT4gYSA8IDA7Citib29sIGludF9sdGUxKGludCBhKSA9PiBhIDw9IDA7Citib29sIGludF9ndDEoaW50IGEpID0+IGEgPiAwOworYm9vbCBpbnRfZ3RlMShpbnQgYSkgPT4gYSA+PSAwOworYm9vbCBpbnRfZXExKGludCBhKSA9PiBhID09IDA7Citib29sIGludF9uZTEoaW50IGEpID0+IGEgIT0gMDsKKworYm9vbCBpbnRfbHQyKGludCBhKSA9PiBhIDwgMCA/IHRydWUgOiBmYWxzZTsKK2Jvb2wgaW50X2x0ZTIoaW50IGEpID0+IGEgPD0gMCA/IHRydWUgOiBmYWxzZTsKK2Jvb2wgaW50X2d0MihpbnQgYSkgPT4gYSA+IDAgPyB0cnVlIDogZmFsc2U7Citib29sIGludF9ndGUyKGludCBhKSA9PiBhID49IDAgPyB0cnVlIDogZmFsc2U7Citib29sIGludF9lcTIoaW50IGEpID0+IGEgPT0gMCA/IHRydWUgOiBmYWxzZTsKK2Jvb2wgaW50X25lMihpbnQgYSkgPT4gYSAhPSAwID8gdHJ1ZSA6IGZhbHNlOworCittYWluKCkgeworICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBjb21wYXJlVGVzdCgpOworICAgIGNvbXBhcmVUZXN0MihsdDEsIGx0ZTEsIGd0MSwgZ3RlMSk7CisgICAgY29tcGFyZVRlc3QyKGx0MiwgbHRlMiwgZ3QyLCBndGUyKTsKKworICAgIGNvbXBhcmVUZXN0V2l0aFplcm8oaW50X2x0MSwgaW50X2x0ZTEsIGludF9ndDEsIGludF9ndGUxLCBpbnRfZXExLCBpbnRfbmUxKTsKKyAgICBjb21wYXJlVGVzdFdpdGhaZXJvKGludF9sdDIsIGludF9sdGUyLCBpbnRfZ3QyLCBpbnRfZ3RlMiwgaW50X2VxMiwgaW50X25lMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21vY2tfd3JpdGFibGVfZmluYWxfZmllbGRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbW9ja193cml0YWJsZV9maW5hbF9maWVsZF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4MmE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL21vY2tfd3JpdGFibGVfZmluYWxfZmllbGRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2ZpbmFsIHZhbHVlcyA9IDxpbnQ+W107CisKK2NsYXNzIE1vY2sgeworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpKSB7CisgICAgdmFyIGV4cGVjdGVkID0gaS5pc0dldHRlciA/ICN4IDogY29uc3QgU3ltYm9sKCJ4PSIpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWQudG9TdHJpbmcoKSwgaS5tZW1iZXJOYW1lLnRvU3RyaW5nKCkpOworICAgIHZhbHVlcy5hZGQoaS5wb3NpdGlvbmFsQXJndW1lbnRzWzBdKTsKKyAgfQorfQorCitjbGFzcyBGb28geworICAvLyBQcmV2ZW50IG9iZnVzY2F0aW9uIG9mICd4Jy4KKyAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQorICBpbnQgeCA9IC0xOworfQorCitjbGFzcyBCYXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgRm9vIHsKKyAgZmluYWwgaW50IHggPSA0MjsKK30KKworY2xhc3MgX0JheiBpbXBsZW1lbnRzIEZvbyB7CisgIGZpbmFsIGludCB4ID0gNDI7CisKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaSkgeworICAgIHZhciBleHBlY3RlZCA9IGkuaXNHZXR0ZXIgPyAjeCA6IGNvbnN0IFN5bWJvbCgieD0iKTsKKyAgICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkLnRvU3RyaW5nKCksIGkubWVtYmVyTmFtZS50b1N0cmluZygpKTsKKyAgICB2YWx1ZXMuYWRkKGkucG9zaXRpb25hbEFyZ3VtZW50c1swXSk7CisgIH0KK30KKwordm9pZCBtYWluKCkgeworICB7CisgICAgQmFyIGIgPSBuZXcgQmFyKCk7CisgICAgRXhwZWN0LmVxdWFscyhiLngsIDQyKTsKKyAgICBiLnggPSAxMjM7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWzEyM10sIHZhbHVlcyk7CisgICAgdmFsdWVzLmNsZWFyKCk7CisgIH0KKyAgeworICAgIC8vIEl0IHdvcmtzIHRoZSBzYW1lIGlmIGNhbGxlZCBzdGF0aWNhbGx5IHRocm91Z2ggdGhlIEZvbyBpbnRlcmZhY2UuCisgICAgRm9vIGIgPSBuZXcgQmFyKCk7CisgICAgRXhwZWN0LmVxdWFscyhiLngsIDQyKTsKKyAgICBiLnggPSAxMjM7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWzEyM10sIHZhbHVlcyk7CisgICAgdmFsdWVzLmNsZWFyKCk7CisgIH0KKyAgeworICAgIC8vIEl0IHdvcmtzIHRoZSBzYW1lIGlmIHRoZSBub1N1Y2hNZXRob2QgaXMgZGVmaW5lZCBkaXJlY3RseSBpbiB0aGUgY2xhc3MuCisgICAgRm9vIGIgPSBuZXcgX0JheigpOworICAgIEV4cGVjdC5lcXVhbHMoYi54LCA0Mik7CisgICAgYi54ID0gMTIzOworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsxMjNdLCB2YWx1ZXMpOworICAgIHZhbHVlcy5jbGVhcigpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tdWx0aV9wYXNzMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9tdWx0aV9wYXNzMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZDJkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3MyX3Rlc3QuZGFydApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgZm9yIGxvYWRpbmcgc2V2ZXJhbCBkYXJ0IGZpbGVzIGFuZCByZXNvbHZpbmcgc3VwZXJjbGFzc2VzIGxhemlseS4KKy8vIFNhbWUgYXMgTXVsdGlQYXNzVGVzdCwgZXhjZXB0IHRoYXQgdGhlIGZpbGUgb3JkZXIgaXMgcmV2ZXJzZWQuCisKK2xpYnJhcnkgTXVsdGlQYXNzVGVzdC5kYXJ0OworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKK3BhcnQgIm11bHRpX3Bhc3NfYS5kYXJ0IjsKK3BhcnQgIm11bHRpX3Bhc3NfYi5kYXJ0IjsKKworY2xhc3MgQmFzZSB7CisgIEJhc2UodGhpcy52YWx1ZSkge30KKyAgdmFyIHZhbHVlOworfQorCitjbGFzcyBNdWx0aVBhc3MyVGVzdCB7CisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICB2YXIgYSA9IG5ldyBCKDUpOworICAgIEV4cGVjdC5lcXVhbHMoNSwgYS52YWx1ZSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgTXVsdGlQYXNzMlRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfYS5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbXVsdGlfcGFzc19hLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyODYzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfYS5kYXJ0CkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgbG9hZGluZyBzZXZlcmFsIGRhcnQgZmlsZXMgYW5kIHJlc29sdmluZyBzdXBlcmNsYXNzZXMgbGF6aWx5LgorCitwYXJ0IG9mIE11bHRpUGFzc1Rlc3QuZGFydDsKKworY2xhc3MgQSBleHRlbmRzIEJhc2UgeworICBBKHYpIDogc3VwZXIodikge30KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfYi5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbXVsdGlfcGFzc19iLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5OWI4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfYi5kYXJ0CkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgbG9hZGluZyBzZXZlcmFsIGRhcnQgZmlsZXMgYW5kIHJlc29sdmluZyBzdXBlcmNsYXNzZXMgbGF6aWx5LgorCitwYXJ0IG9mIE11bHRpUGFzc1Rlc3QuZGFydDsKKworY2xhc3MgQiBleHRlbmRzIEEgeworICBCKHYpIDogc3VwZXIodikge30KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbXVsdGlfcGFzc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmOTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL211bHRpX3Bhc3NfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgbG9hZGluZyBzZXZlcmFsIGRhcnQgZmlsZXMgYW5kIHJlc29sdmluZyBzdXBlcmNsYXNzZXMgbGF6aWx5LgorCitsaWJyYXJ5IE11bHRpUGFzc1Rlc3QuZGFydDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitwYXJ0ICJtdWx0aV9wYXNzX2EuZGFydCI7CitwYXJ0ICJtdWx0aV9wYXNzX2IuZGFydCI7CisKK2NsYXNzIEJhc2UgeworICBCYXNlKHRoaXMudmFsdWUpIHt9CisgIHZhciB2YWx1ZTsKK30KKworY2xhc3MgTXVsdGlQYXNzVGVzdCB7CisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICB2YXIgYSA9IG5ldyBCKDUpOworICAgIEV4cGVjdC5lcXVhbHMoNSwgYS52YWx1ZSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgTXVsdGlQYXNzVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbmFtZXIyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL25hbWVyMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3ZDJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL25hbWVyMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gVGVzdCB0aGF0IHVzZXIgZmllbGQgbmFtZXMgY2Fubm90IGNsYXNoIHdpdGggaW50ZXJuYWwgbmFtZXMgb2YgdGhlCisvLyBkYXJ0MmpzIGNvbXBpbGVyLgorCitjbGFzcyBBPFQ+IHsKKyAgdmFyICRpc0E7CisgIHZhciAkZXE7CisgIHZhciAkYnVpbHRpblR5cGVJbmZvOworfQorCittYWluKCkgeworICB2YXIgYyA9IFtuZXcgQSgpXTsKKyAgRXhwZWN0LmlzVHJ1ZShjWzBdIGlzIEEpOworICBFeHBlY3QuaXNUcnVlKGNbMF0gPT0gY1swXSk7CisKKyAgYyA9IFtuZXcgQTxpbnQ+KCldOworICBjWzBdLiRidWlsdGluVHlwZUluZm8gPSA0MjsKKyAgRXhwZWN0LmlzVHJ1ZShjWzBdIGlzISBBPFN0cmluZz4pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbmFtZXJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbmFtZXJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWQ3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9uYW1lcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBhIGJ1ZyBpbiBkYXJ0MmpzIHdoZXJlIGdsb2JhbCBuYW1lcyBjb3VsZAorLy8gY29sbGlkZS4KKwordmFyIGkgPSAndG9wIGxldmVsJzsKKwordmFyIGkwID0gJ3RvcCBsZXZlbCB6ZXJvJzsKKwordmFyIGkwMCA9ICd0b3AgbGV2ZWwgemVybyB6ZXJvJzsKKwordmFyIGkyID0gJ3RvcCBsZXZlbCB0b28nOworCitjbGFzcyBBIHsKKyAgc3RhdGljIHZhciBpID0gJ0EnOworfQorCit2YXIgaiA9ICd0b3AgbGV2ZWwnOworCit2YXIgajAgPSAndG9wIGxldmVsIHplcm8nOworCit2YXIgajAwID0gJ3RvcCBsZXZlbCB6ZXJvIHplcm8nOworCit2YXIgajIgPSAndG9wIGxldmVsIHRvbyc7CisKK2NsYXNzIEIgeworICBzdGF0aWMgdmFyIGogPSAnQic7Cit9CisKK3ZhciBrID0gJ3RvcCBsZXZlbCc7CisKK3ZhciBrMCA9ICd0b3AgbGV2ZWwgemVybyc7CisKK3ZhciBrMDAgPSAndG9wIGxldmVsIHplcm8gemVybyc7CisKK3ZhciBrMiA9ICd0b3AgbGV2ZWwgdG9vJzsKKworY2xhc3MgQyB7CisgIHN0YXRpYyB2YXIgayA9ICdDJzsKK30KKworbWFpbigpIHsKKyAgLy8gT3JkZXIgbWF0dGVycy4gVGhpcyBzZXF1ZW5jZSB0cmlnZ2VyZWQgdGhlIGJ1Zy4KKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsJywgaSk7CisgIEV4cGVjdC5lcXVhbHMoJ0EnLCBBLmkpOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwgdG9vJywgaTIpOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwgemVybyB6ZXJvJywgaTAwKTsKKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsIHplcm8nLCBpMCk7CisKKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsIHplcm8gemVybycsIGowMCk7CisgIEV4cGVjdC5lcXVhbHMoJ3RvcCBsZXZlbCcsIGopOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwgdG9vJywgajIpOworICBFeHBlY3QuZXF1YWxzKCd0b3AgbGV2ZWwgemVybycsIGowKTsKKyAgRXhwZWN0LmVxdWFscygnQicsIEIuaik7CisKKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsIHRvbycsIGsyKTsKKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsIHplcm8nLCBrMCk7CisgIEV4cGVjdC5lcXVhbHMoJ3RvcCBsZXZlbCcsIGspOworICBFeHBlY3QuZXF1YWxzKCdDJywgQy5rKTsKKyAgRXhwZWN0LmVxdWFscygndG9wIGxldmVsIHplcm8gemVybycsIGswMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9uYXRpdmVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbmF0aXZlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQwMWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvbmF0aXZlX3Rlc3QuZGFydApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSB3aGljaCBzaG93cyBob3cgdG8gd3JpdGUgc2VsZiB2ZXJpZnlpbmcgdGVzdHMKKy8vIGFuZCBob3cgdG8gcHJpbnQgZGFydCBvYmplY3RzIGlmIG5lZWRlZC4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEhlbHBlciB7CisgIHN0YXRpYyBpbnQgZm9vKGludCBpKSB7CisgICAgcmV0dXJuIGkgKyAxMDsKKyAgfQorfQorCitjbGFzcyBOYXRpdmVUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIGludCBpID0gMTA7CisgICAgaW50IHJlc3VsdCA9IDEwICsgMTAgKyAxMDsKKyAgICBpID0gSGVscGVyLmZvbyhpICsgMTApOworICAgIHByaW50KCIkaSBpcyByZXN1bHQuIik7CisgICAgRXhwZWN0LmVxdWFscyhpLCByZXN1bHQpOworICB9Cit9CisKK21haW4oKSB7CisgIE5hdGl2ZVRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhcnNlX3R5cGVzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhcnNlX3R5cGVzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU3NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcGFyc2VfdHlwZXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBmb3IgdGVzdGluZyBwYXJzaW5nIG9mICJzdGFuZGFyZCIgdHlwZXMuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBQYXJzZVR5cGVzVGVzdCB7CisgIHN0YXRpYyBib29sIGNhbGxCb29sMSgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNhbGxCb29sMigpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgaW50IGNhbGxJbnQoKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKworICBzdGF0aWMgU3RyaW5nIGNhbGxTdHJpbmcoKSB7CisgICAgcmV0dXJuICJIZXkiOworICB9CisKKyAgc3RhdGljIGRvdWJsZSBjYWxsRG91YmxlKCkgeworICAgIHJldHVybiA0LjA7CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0TWFpbigpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHRydWUsIFBhcnNlVHlwZXNUZXN0LmNhbGxCb29sMSgpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGZhbHNlLCBQYXJzZVR5cGVzVGVzdC5jYWxsQm9vbDIoKSk7CisgICAgRXhwZWN0LmVxdWFscygyLCBQYXJzZVR5cGVzVGVzdC5jYWxsSW50KCkpOworICAgIEV4cGVjdC5lcXVhbHMoIkhleSIsIFBhcnNlVHlwZXNUZXN0LmNhbGxTdHJpbmcoKSk7CisgICAgRXhwZWN0LmVxdWFscyg0LjAsIFBhcnNlVHlwZXNUZXN0LmNhbGxEb3VibGUoKSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgUGFyc2VUeXBlc1Rlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhcnRpYWxfbWluX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhcnRpYWxfbWluX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjgwMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcGFydGlhbF9taW5fdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKKy8vIFRoaXMgdGVzdCB0cmlnZ2VyZWQgYW4gTlBFIGluIGRhcnQyanMuCisvLyBUaGUgYnVnIG5lZWRlZDoKKy8vIC0gZG91YmxlIHVzYWdlIG9mIHRoZSBzYW1lIHZhcmlhYmxlIGluIG9uZSBleHByZXNzaW9uICgiYiAhPSBiIikuCisvLyAtIHJlcGxhY2VtZW50IG9mICJiIiB3aXRoICJ0eXBlY2hlY2tlZCBiIi4KKy8vIC0gLi4uCisvLyBUaGUgZXhhbXBsZSBiZWxvdyBpcyBtaW5pbWFsIChhcyBmYXIgYXMgSSB3YXMgYWJsZSB0byBkbykuCisKK251bSBmb28obnVtIGEsIG51bSBiKSB7CisgIGlmIChhID4gYikgcmV0dXJuIGI7CisgIGlmIChiIGlzIGRvdWJsZSkgeworICAgIGlmICh0cnVlKSB7CisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gKGEgKyBiKSAqIGEgKiBiOworICAgICAgfQorICAgIH0KKyAgICAvLyBDaGVjayBmb3IgTmFOIGFuZCBiID09IC0wLjAuCisgICAgaWYgKGEgPT0gMCAmJiBiID09IDAgfHwgYiAhPSBiKSByZXR1cm4gYjsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK21haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoMSwgZm9vKDIsIDEpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhdGNoX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3BhdGNoX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODE1Y2JmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcGF0Y2hfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3BhdGNoKCkgeworICByZXR1cm4gMTI7Cit9CisKK21haW4oKSB7CisgIHZhciB4ID0gcGF0Y2goKTsKKyAgRXhwZWN0LmVxdWFscygxMiwgeCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9wcm9wZXJ0eV9maWVsZF9vdmVycmlkZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9wcm9wZXJ0eV9maWVsZF9vdmVycmlkZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3Yjg1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3Byb3BlcnR5X2ZpZWxkX292ZXJyaWRlX3Rlc3QuZGFydApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBUZXN0IG92ZXJyaWRpbmcgYSBnZXR0ZXIgcHJvcGVydHkgd2l0aCBhIGZpZWxkLgorYWJzdHJhY3QgY2xhc3MgQSB7CisgIGludCBnZXQgdjsgLy8gQWJzdHJhY3QuCisKKyAgaW50IGEoKSB7CisgICAgcmV0dXJuIHYgLSAxOworICB9Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgaW50IHYgPSAzOworCisgIGludCBiKCkgeworICAgIHJldHVybiArK3Y7CisgIH0KK30KKworbWFpbigpIHsKKyAgdmFyIHggPSBuZXcgQigpOworICBFeHBlY3QuZXF1YWxzKDMsIHgudik7CisgIEV4cGVjdC5lcXVhbHMoMiwgeC5hKCkpOworICBFeHBlY3QuZXF1YWxzKDQsIHguYigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JhbmdlX2FuYWx5c2lzMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yYW5nZV9hbmFseXNpczJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDM5OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yYW5nZV9hbmFseXNpczJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBkYXJ0MmpzIHRoYXQgdXNlZCB0byByZW1vdmUgYm91bmRzIGNoZWNrcyBvbgorLy8gYm94ZWQgdmFyaWFibGVzLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgdmFyIGEgPSAwOworICB2YXIgYiA9IFsxXTsKKyAgZm9vKCkgPT4gYlthLS1dICsgYlthXTsKKyAgRXhwZWN0LnRocm93c1JhbmdlRXJyb3IoZm9vKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JhbmdlX2FuYWx5c2lzM190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yYW5nZV9hbmFseXNpczNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTBlZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yYW5nZV9hbmFseXNpczNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjEwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjb25mdXNlKHgpIHsKKyAgaWYgKG5ldyBEYXRlVGltZS5ub3coKS5taWxsaXNlY29uZHNTaW5jZUVwb2NoID09IDApIHsKKyAgICByZXR1cm4gY29uZnVzZSh4ICsgMSk7CisgIH0gZWxzZSBpZiAobmV3IERhdGVUaW1lLm5vdygpLm1pbGxpc2Vjb25kc1NpbmNlRXBvY2ggPT0gMCkgeworICAgIHJldHVybiBjb25mdXNlKHggLSAxKTsKKyAgfQorICByZXR1cm4geDsKK30KKwordGVzdDEoKSB7CisgIGludCB4ID0gMDsKKyAgLy8gR2l2ZSB4IGEgcmFuZ2Ugb2YgLTEgdG8gMC4KKyAgaWYgKGNvbmZ1c2UoMCkgPT0gMSkgeCA9IC0xOworCisgIGludCB5ID0gMDsKKyAgLy8gR2l2ZSB5IGEgcmFuZ2Ugb2YgMCB0byAxLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB5ID0gMTsKKworICB2YXIgemVybyA9IDA7CisKKyAgdmFyIHN0YXR1cyA9ICJiYWQiOworICBpZiAoeCA8IHplcm8pIHsKKyAgICBFeHBlY3QuZmFpbCgidW5yZWFjaGFibGUiKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBEYXJ0MmpzIG11c3Qgbm90IGNvbmNsdWRlIHRoYXQgemVybyBoYXMgYSByYW5nZSBvZiBbLTEsIDBdLgorICAgIGlmICh5IDw9IHplcm8pIHsKKyAgICAgIHN0YXR1cyA9ICJnb29kIjsKKyAgICB9CisgIH0KKyAgRXhwZWN0LmVxdWFscygiZ29vZCIsIHN0YXR1cyk7Cit9CisKK3Rlc3QyKCkgeworICBpbnQgeCA9IDA7CisgIC8vIEdpdmUgeCBhIHJhbmdlIG9mIC0xIHRvIDAuCisgIGlmIChjb25mdXNlKDApID09IDEpIHggPSAtMTsKKworICBpbnQgeSA9IDA7CisgIC8vIEdpdmUgeSBhIHJhbmdlIG9mIC0xIHRvIDEuCisgIGlmIChjb25mdXNlKDApID09IDEpIHkgPSAxOworICBpZiAoY29uZnVzZSgxKSA9PSAyKSB5ID0gLTE7CisKKyAgdmFyIHN0YXR1cyA9ICJnb29kIjsKKyAgaWYgKHggPCB5KSB7CisgICAgRXhwZWN0LmZhaWwoInVucmVhY2hhYmxlIik7CisgIH0gZWxzZSB7CisgICAgLy8gRGFydDJqcyBtdXN0IG5vdCBjb25jbHVkZSB0aGF0IHkgaGFzIGEgcmFuZ2Ugb2YgWy0xLCAtMV0uCisgICAgaWYgKHkgPT0gLTEpIHsKKyAgICAgIHN0YXR1cyA9ICJiYWQiOworICAgIH0KKyAgfQorICBFeHBlY3QuZXF1YWxzKCJnb29kIiwgc3RhdHVzKTsKK30KKwordGVzdDNhKCkgeworICBpbnQgeCA9IDA7CisgIC8vIEdpdmUgeCBhIHJhbmdlIG9mIC0xIHRvIDEuCisgIGlmIChjb25mdXNlKDApID09IDEpIHggPSAtMTsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeCA9IDE7CisKKyAgaW50IHkgPSAwOworICAvLyBHaXZlIHkgYSByYW5nZSBvZiAtMSB0byAxLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB5ID0gMTsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeSA9IC0xOworCisgIHZhciBzdGF0dXMgPSAiZ29vZCI7CisgIGlmICh4IDwgeSkgeworICAgIEV4cGVjdC5mYWlsKCJ1bnJlYWNoYWJsZSIpOworICB9IGVsc2UgeworICAgIC8vIFRlc3QgdGhhdCB0aGUgcmFuZ2UtYW5hbHlzaXMgZG9lcyBub3QgbG9zZSBhIHZhbHVlLgorICAgIGlmICh4IDw9IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+PSAxKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA8IDApIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh4ID4gMCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xID49IHgpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgxIDw9IHgpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgwID4geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPCB4KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeSA8PSAtMSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPj0gMSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPCAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeSA+IDApIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgtMSA+PSB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMSA8PSB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMCA+IHkpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgwIDwgeSkgc3RhdHVzID0gImJhZCI7CisgIH0KKyAgRXhwZWN0LmVxdWFscygiZ29vZCIsIHN0YXR1cyk7Cit9CisKK3Rlc3QzYigpIHsKKyAgaW50IHggPSAwOworICAvLyBHaXZlIHggYSByYW5nZSBvZiAtMiB0byAwLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB4ID0gLTI7CisKKyAgaW50IHkgPSAwOworICAvLyBHaXZlIHkgYSByYW5nZSBvZiAtMSB0byAxLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB5ID0gMTsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeSA9IC0xOworCisgIHZhciBzdGF0dXMgPSAiZ29vZCI7CisgIGlmICh4IDwgeSkgeworICAgIEV4cGVjdC5mYWlsKCJ1bnJlYWNoYWJsZSIpOworICB9IGVsc2UgeworICAgIC8vIFRlc3QgdGhhdCB0aGUgcmFuZ2UtYW5hbHlzaXMgZG9lcyBub3QgbG9zZSBhIHZhbHVlLgorICAgIGlmICh4IDw9IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+PSAxKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA8IDApIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh4ID4gMCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xID49IHgpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgxIDw9IHgpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgwID4geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPCB4KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeSA8PSAtMSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPj0gMSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPCAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeSA+IDApIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgtMSA+PSB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMSA8PSB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMCA+IHkpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICgwIDwgeSkgc3RhdHVzID0gImJhZCI7CisgIH0KKyAgRXhwZWN0LmVxdWFscygiZ29vZCIsIHN0YXR1cyk7Cit9CisKK3Rlc3Q0YSgpIHsKKyAgaW50IHggPSAtMTsKKyAgLy8gR2l2ZSB4IGEgcmFuZ2Ugb2YgLTEgdG8gMS4KKyAgaWYgKGNvbmZ1c2UoMCkgPT0gMSkgeCA9IDE7CisKKyAgaW50IHkgPSAwOworICAvLyBHaXZlIHkgYSByYW5nZSBvZiAtMSB0byAxLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB5ID0gMTsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeSA9IC0xOworCisgIHZhciBzdGF0dXMgPSAiZ29vZCI7CisgIGlmICh4IDwgeSkgeworICAgIC8vIFRlc3QgdGhhdCB0aGUgcmFuZ2UtYW5hbHlzaXMgZG9lcyBub3QgbG9zZSBhIHZhbHVlLgorICAgIGlmICh4IDw9IC0yKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+PSAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA8IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoLTIgPj0geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPD0geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xID4geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xIDwgeCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPD0gLTEpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh5ID49IDEpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh5IDwgMCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPiAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoLTEgPj0geSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDEgPD0geSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPiB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMCA8IHkpIHN0YXR1cyA9ICJiYWQiOworICB9IGVsc2UgeworICAgIEV4cGVjdC5mYWlsKCJ1bnJlYWNoYWJsZSIpOworICB9CisgIEV4cGVjdC5lcXVhbHMoImdvb2QiLCBzdGF0dXMpOworfQorCit0ZXN0NGIoKSB7CisgIGludCB4ID0gLTE7CisgIC8vIEdpdmUgeCBhIHJhbmdlIG9mIC0yIHRvIDAuCisgIGlmIChjb25mdXNlKDApID09IDEpIHggPSAtMjsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeCA9IDA7CisKKyAgaW50IHkgPSAwOworICAvLyBHaXZlIHkgYSByYW5nZSBvZiAtMSB0byAxLgorICBpZiAoY29uZnVzZSgwKSA9PSAxKSB5ID0gMTsKKyAgaWYgKGNvbmZ1c2UoMSkgPT0gMikgeSA9IC0xOworCisgIHZhciBzdGF0dXMgPSAiZ29vZCI7CisgIGlmICh4IDwgeSkgeworICAgIC8vIFRlc3QgdGhhdCB0aGUgcmFuZ2UtYW5hbHlzaXMgZG9lcyBub3QgbG9zZSBhIHZhbHVlLgorICAgIGlmICh4IDw9IC0yKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+PSAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA8IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoeCA+IC0xKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoLTIgPj0geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPD0geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xID4geCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKC0xIDwgeCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPD0gLTEpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh5ID49IDEpIHN0YXR1cyA9ICJiYWQiOworICAgIGlmICh5IDwgMCkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKHkgPiAwKSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoLTEgPj0geSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDEgPD0geSkgc3RhdHVzID0gImJhZCI7CisgICAgaWYgKDAgPiB5KSBzdGF0dXMgPSAiYmFkIjsKKyAgICBpZiAoMCA8IHkpIHN0YXR1cyA9ICJiYWQiOworICB9IGVsc2UgeworICAgIEV4cGVjdC5mYWlsKCJ1bnJlYWNoYWJsZSIpOworICB9CisgIEV4cGVjdC5lcXVhbHMoImdvb2QiLCBzdGF0dXMpOworfQorCittYWluKCkgeworICB0ZXN0MSgpOworICB0ZXN0MigpOworICB0ZXN0M2EoKTsKKyAgdGVzdDNiKCk7CisgIHRlc3Q0YSgpOworICB0ZXN0NGIoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JhbmdlX2FuYWx5c2lzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JhbmdlX2FuYWx5c2lzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdiMmJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcmFuZ2VfYW5hbHlzaXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTE4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgY29uc3RydWN0b3JzIGFuZCBpbml0aWFsaXplcnMuCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1uby11c2Utb3NyCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBDaGVjayB0aGF0IHJhbmdlIGFuYWx5c2lzIGRvZXMgbm90IGVudGVyIGluZmluaXRlIGxvb3AgdHJ5aW5nIHRvIHByb3BhZ2F0ZQorLy8gcmFuZ2VzIHRocm91Z2ggZGVwZW5kYW50IHBoaXMuCitiYXIoKSB7CisgIHZhciBzdW0gPSAwOworICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBmb3IgKHZhciBqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICBmb3IgKHZhciBrID0gajsgayA8IGk7IGsrKykgeworICAgICAgICBzdW0gKz0gKGkgKyBqICsgayk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzdW07Cit9CisKK3Rlc3QxKCkgeworICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIGJhcigpOworfQorCisvLyBDaGVjayB0aGF0IHJhbmdlIGFuYWx5c2lzIGRvZXMgbm90IGVycm9uZW91c2x5IHJlbW92ZSBvdmVyZmxvdyBjaGVjay4KK3Rlc3QyKCkgeworICB2YXIgd2lkdGggPSAxMDczNzQxODIzOworICBFeHBlY3QuZXF1YWxzKHdpZHRoIC0gMSwgZm9vKHdpZHRoIC0gNTAwMCwgd2lkdGggLSAxKSk7CisgIEV4cGVjdC5lcXVhbHMod2lkdGgsIGZvbyh3aWR0aCAtIDUwMDAsIHdpZHRoKSk7Cit9CisKK2ZvbyhuLCB3KSB7CisgIHZhciB4ID0gMDsKKyAgZm9yICh2YXIgaSA9IG47IGkgPD0gdzsgaSsrKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpID4gMCk7CisgICAgeCA9IGk7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKKy8vIFRlc3QgZGV0ZWN0aW9uIG9mIHVuc2F0aXNmaWFibGUgY29uc3RyYWludHMuCitmKGEsIGIpIHsKKyAgaWYgKGEgPCBiKSB7CisgICAgaWYgKGEgPiBiKSB7CisgICAgICB0aHJvdyAidW5yZWFjaGFibGUiOworICAgIH0KKyAgICByZXR1cm4gMjsKKyAgfQorICByZXR1cm4gMzsKK30KKworZjEoYSwgYikgeworICBpZiAoYSA8IGIpIHsKKyAgICBpZiAoYSA+IGIgLSAxKSB7CisgICAgICB0aHJvdyAidW5yZWFjaGFibGUiOworICAgIH0KKyAgICByZXR1cm4gMjsKKyAgfQorICByZXR1cm4gMzsKK30KKworZjIoYSwgYikgeworICBpZiAoYSA8IGIpIHsKKyAgICBpZiAoYSA+IGIgLSAyKSB7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgdGhyb3cgInVucmVhY2hhYmxlIjsKKyAgfQorICByZXR1cm4gMzsKK30KKworZygpIHsKKyAgdmFyIGk7CisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgaWYgKGkgPCAwKSB0aHJvdyAidW5yZWFjaGFibGUiOworICB9CisgIHJldHVybiBpOworfQorCitoKG4pIHsKKyAgdmFyIGk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBpZiAoaSA8IDApIHRocm93ICJ1bnJlYWNoYWJsZSI7CisgICAgdmFyIGogPSBpIC0gMTsKKyAgICBpZiAoaiA+PSBuIC0gMSkgdGhyb3cgInVucmVhY2hhYmxlIjsKKyAgfQorICByZXR1cm4gaTsKK30KKwordGVzdDMoKSB7CisgIHRlc3RfZnVuKGZ1bikgeworICAgIEV4cGVjdC5lcXVhbHMoMiwgZnVuKDAsIDEpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDMsIGZ1bigwLCAwKSk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSsrKSBmdW4oMCwgMSk7CisgICAgRXhwZWN0LmVxdWFscygyLCBmdW4oMCwgMSkpOworICAgIEV4cGVjdC5lcXVhbHMoMywgZnVuKDAsIDApKTsKKyAgfQorCisgIHRlc3RfZnVuKGYpOworICB0ZXN0X2Z1bihmMSk7CisgIHRlc3RfZnVuKGYyKTsKKworICBFeHBlY3QuZXF1YWxzKDEwLCBnKCkpOworICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIGcoKTsKKyAgRXhwZWN0LmVxdWFscygxMCwgZygpKTsKKworICBFeHBlY3QuZXF1YWxzKDEwLCBoKDEwKSk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgaCgxMCk7CisgIEV4cGVjdC5lcXVhbHMoMTAsIGgoMTApKTsKK30KKworbWFpbigpIHsKKyAgdGVzdDEoKTsKKyAgdGVzdDIoKTsKKyAgdGVzdDMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JlY3Vyc2l2ZV9jYWxsc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yZWN1cnNpdmVfY2FsbHNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmM1M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9yZWN1cnNpdmVfY2FsbHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ludCBiYXIoeCkgPT4gZm9vKHggKyAxKTsKK2ludCBmb28oeCkgPT4geCA+IDkgPyB4IDogYmFyKHgpOworCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKGZvbyhpbnQucGFyc2UoIjEiKSksIDEwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JlY3Vyc2l2ZV9sb29wX3BoaXNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcmVjdXJzaXZlX2xvb3BfcGhpc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxYWEwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JlY3Vyc2l2ZV9sb29wX3BoaXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKKy8vIFRoaXMgcHJvZ3JhbSB0cmlwcGVkIGRhcnQyanMuCisKK2Zvbyhib29sIGIpIHsKKyAgdmFyIHggPSA0OTk7CisgIC8vIElmIHRoZSBsb29wLXBoaSBpcyBub3QgZGVjbGFyZWQgaXQgd2lsbCBhc3NpZ24gdG8gYSBnbG9iYWwgYW5kIHRoZQorICAvLyByZWN1cnNpdmUgY2FsbCB3aWxsIHNjcmV3IHVwIHRoZSBtZXRob2RzICJsb2NhbCIgc3RhdGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgaWYgKGkgPT0gMCAmJiBiKSB4ID0gNDI7CisgICAgaWYgKCFiKSBmb28odHJ1ZSk7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKK21haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoNDk5LCBmb28oZmFsc2UpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JlZmluZV9yZWNlaXZlcl9udWxsX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3JlZmluZV9yZWNlaXZlcl9udWxsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTllOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvcmVmaW5lX3JlY2VpdmVyX251bGxfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBkYXJ0MmpzIHRoYXQgdXNlZCB0byBpbmZlciB0aGF0IGNvZGUgZm9sbG93aW5nCisvLyBhIGR5bmFtaWMgY2FsbCBjb3VsZCBhc3N1bWUgdGhlIHJlY2VpdmVyIGlzIG5vdCBudWxsLiBUaGlzIGRvZXMgbm90CisvLyB3b3JrIGZvciBPYmplY3QgbWV0aG9kcy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgIi4uL2NvbXBpbGVyX2Fubm90YXRpb25zLmRhcnQiOworCittYWluKCkgeworICB2YXIgYSA9IHRydWUgPyBudWxsIDogNDI7CisgIGEudG9TdHJpbmcoKTsKKyAgZm9vKGEpOworfQorCitARG9udElubGluZSgpCitmb28oYSkgeworICB2YXIgZiA9ICgpID0+IDQyOworICBFeHBlY3QudGhyb3dzTm9TdWNoTWV0aG9kRXJyb3IoKCkgPT4gYSArIDQyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NhdmFubmFoX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NhdmFubmFoX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJiOGVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2F2YW5uYWhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCB1c2luZyBhbiBpZGVudGl0eSBoYXNoLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworYWJzdHJhY3QgY2xhc3MgQmlnR2FtZSB7CisgIFN0cmluZyBnZXQgbmFtZTsKK30KKworLy8gR2lyYWZmZSBvdmVycmlkZXMgaGFzaENvZGUgYW5kIHByb3ZpZGVzIGl0cyBvd24gaWRlbnRpdHkgaGFzaC4KK2NsYXNzIEdpcmFmZmUgaW1wbGVtZW50cyBCaWdHYW1lIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCBpZGVudGl0eUhhc2hfOworCisgIEdpcmFmZmUodGhpcy5uYW1lKSA6IGlkZW50aXR5SGFzaF8gPSBuZXh0SWQoKSB7fQorCisgIGludCBnZXQgaGFzaENvZGUgeworICAgIHJldHVybiBpZGVudGl0eUhhc2hfOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIGlkZW50aXR5IGhhc2ggZm9yIGEgZ2lyYWZmZS4KKyAgc3RhdGljIGludCBuZXh0SWRfID0gMTc7CisgIHN0YXRpYyBpbnQgbmV4dElkKCkgeworICAgIHJldHVybiBuZXh0SWRfKys7CisgIH0KK30KKworLy8gWmVicmEgcmVsaWVzIG9uIHRoZSBzeXN0ZW0gcHJvdmlkZWQgaWRlbnRpdHkgaGFzaC4KK2NsYXNzIFplYnJhIGltcGxlbWVudHMgQmlnR2FtZSB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBaZWJyYSh0aGlzLm5hbWUpIHt9Cit9CisKK2NsYXNzIFNhdmFubmFoVGVzdCB7CisgIHN0YXRpYyB2b2lkIHRlc3RNYWluKCkgeworICAgIE1hcDxCaWdHYW1lLCBTdHJpbmc+IHNhdmFubmFoID0gbmV3IE1hcDxCaWdHYW1lLCBTdHJpbmc+KCk7CisKKyAgICBHaXJhZmZlIGdpcmFmZmUxID0gbmV3IEdpcmFmZmUoIlRvbnkiKTsKKyAgICBHaXJhZmZlIGdpcmFmZmUyID0gbmV3IEdpcmFmZmUoIlJvc2UiKTsKKyAgICBzYXZhbm5haFtnaXJhZmZlMV0gPSBnaXJhZmZlMS5uYW1lOworICAgIHNhdmFubmFoW2dpcmFmZmUyXSA9IGdpcmFmZmUyLm5hbWU7CisgICAgcHJpbnQoImdpcmFmZmUxIGhhc2g6ICR7Z2lyYWZmZTEuaGFzaENvZGV9Iik7CisgICAgcHJpbnQoImdpcmFmZmUyIGhhc2g6ICR7Z2lyYWZmZTIuaGFzaENvZGV9Iik7CisKKyAgICB2YXIgY291bnQgPSBzYXZhbm5haC5sZW5ndGg7CisgICAgcHJpbnQoImdldENvdW50IGlzICRjb3VudCIpOworICAgIEV4cGVjdC5lcXVhbHMoMiwgY291bnQpOworCisgICAgcHJpbnQoImdpcmFmZmUxOiAke3NhdmFubmFoW2dpcmFmZmUxXX0iKTsKKyAgICBwcmludCgiZ2lyYWZmZTI6ICR7c2F2YW5uYWhbZ2lyYWZmZTJdfSIpOworICAgIEV4cGVjdC5lcXVhbHMoIlRvbnkiLCBzYXZhbm5haFtnaXJhZmZlMV0pOworICAgIEV4cGVjdC5lcXVhbHMoIlJvc2UiLCBzYXZhbm5haFtnaXJhZmZlMl0pOworCisgICAgWmVicmEgemVicmExID0gbmV3IFplYnJhKCJQYW9sbyIpOworICAgIFplYnJhIHplYnJhMiA9IG5ldyBaZWJyYSgiWmVldGEiKTsKKyAgICBzYXZhbm5haFt6ZWJyYTFdID0gemVicmExLm5hbWU7CisgICAgc2F2YW5uYWhbemVicmEyXSA9IHplYnJhMi5uYW1lOworICAgIHByaW50KCJ6ZWJyYTEgaGFzaDogJHt6ZWJyYTEuaGFzaENvZGV9Iik7CisgICAgcHJpbnQoInplYnJhMiBoYXNoOiAke3plYnJhMi5oYXNoQ29kZX0iKTsKKworICAgIGNvdW50ID0gc2F2YW5uYWgubGVuZ3RoOworICAgIHByaW50KCJnZXRDb3VudCBpcyAkY291bnQiKTsKKyAgICBFeHBlY3QuZXF1YWxzKDQsIGNvdW50KTsKKworICAgIHByaW50KCJ6ZWJyYTE6ICR7c2F2YW5uYWhbemVicmExXX0iKTsKKyAgICBwcmludCgiemVicmEyOiAke3NhdmFubmFoW3plYnJhMl19Iik7CisgICAgRXhwZWN0LmVxdWFscygiUGFvbG8iLCBzYXZhbm5haFt6ZWJyYTFdKTsKKyAgICBFeHBlY3QuZXF1YWxzKCJaZWV0YSIsIHNhdmFubmFoW3plYnJhMl0pOworICB9Cit9CisKK21haW4oKSB7CisgIFNhdmFubmFoVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2Nhbm5lcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zY2FubmVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVlMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2Nhbm5lcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCBkYXJ0IHNjYW5uZXIuCisKK2NsYXNzIFNjYW5uZXJUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIHZhciBzID0gIkhlbGxvXHRteVx0ZnJpZW5kXG4iOworICAgIHJldHVybiBzOworICB9Cit9CisKK21haW4oKSB7CisgIFNjYW5uZXJUZXN0LnRlc3RNYWluKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zZWNvbmRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2Vjb25kX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2RkMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2Vjb25kX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBTZWNvbmQgZGFydCB0ZXN0IHByb2dyYW0uCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBIZWxwZXIgeworICBzdGF0aWMgZW1wdHkoKSB7fQorICBzdGF0aWMgaW50IGZvbygpIHsKKyAgICByZXR1cm4gNDI7CisgIH0KK30KKworY2xhc3MgU2Vjb25kVGVzdCB7CisgIHN0YXRpYyB0ZXN0TWFpbigpIHsKKyAgICBIZWxwZXIuZW1wdHkoKTsKKyAgICBFeHBlY3QuZXF1YWxzKDQyLCBIZWxwZXIuZm9vKCkpOworICB9Cit9CisKK21haW4oKSB7CisgIFNlY29uZFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NoYWRvd19wYXJhbWV0ZXJfYW5kX2xvY2FsX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NoYWRvd19wYXJhbWV0ZXJfYW5kX2xvY2FsX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDgyZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc2hhZG93X3BhcmFtZXRlcl9hbmRfbG9jYWxfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTM0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTczMyBpbiBEREMuCitmb28oYSkgeworICB2YXIgYSA9IDEyMzsKKyAgcmV0dXJuIGE7Cit9CisKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzMwNzkyIGluIEREQy4KK2JhcihhKSBhc3luYyB7CisgIHZhciBhID0gMTIzOworICByZXR1cm4gYTsKK30KKworYmF6KGEpIHN5bmMqIHsKKyAgdmFyIGEgPSAxMjM7CisgIHlpZWxkIGE7Cit9CisKK3F1eChhKSBhc3luYyogeworICB2YXIgYSA9IDEyMzsKKyAgeWllbGQgYTsKK30KKworLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nkay9pc3N1ZXMvMzIxNDAKK2NsYXNzIEMgeworICB2YXIgeCwgeSwgbG9jYWxZLCBfdmFsdWU7CisKKyAgQyhhKSB7CisgICAgdmFyIGEgPSAxMjM7CisgICAgdGhpcy54ID0gYTsKKyAgfQorCisgIEMuaW5pdFkodGhpcy55KSB7CisgICAgdmFyIHkgPSAxMjM7CisgICAgdGhpcy5sb2NhbFkgPSB5OworICB9CisKKyAgbWV0aG9kKGEpIHsKKyAgICB2YXIgYSA9IDEyMzsKKyAgICByZXR1cm4gYTsKKyAgfQorCisgIG1PcHRpb25hbChbYSA9IDBdKSB7CisgICAgdmFyIGEgPSAxMjM7CisgICAgcmV0dXJuIGE7CisgIH0KKworICBtTmFtZWQoe2EgPSAwfSkgeworICAgIHZhciBhID0gMTIzOworICAgIHJldHVybiBhOworICB9CisKKyAgbUFzeW5jKHthOiAwfSkgYXN5bmMgeworICAgIHZhciBhID0gMTIzOworICAgIHJldHVybiBhOworICB9CisKKyAgbVN5bmNTdGFyKHthOiAwfSkgc3luYyogeworICAgIHZhciBhID0gMTIzOworICAgIHlpZWxkIGE7CisgIH0KKworICBtQXN5bmNTdGFyKHthOiAwfSkgYXN5bmMqIHsKKyAgICB2YXIgYSA9IDEyMzsKKyAgICB5aWVsZCBhOworICB9CisKKyAgZ2V0IGFjY2Vzc29yID0+IF92YWx1ZTsKKyAgc2V0IGFjY2Vzc29yKGEpIHsKKyAgICB2YXIgYSA9IDEyMzsKKyAgICB0aGlzLl92YWx1ZSA9IGE7CisgIH0KK30KKwordGVzdENhdGNoKCkgeworICB0cnkgeworICAgIHRocm93ICdvb3BzJzsKKyAgfSBjYXRjaCAoZSkgeworICAgIHZhciBlID0gMTIzOworICAgIHJldHVybiBlOworICB9Cit9CisKK3Rlc3RTdGFja1RyYWNlKCkgeworICB0cnkgeworICAgIHRocm93ICdvb3BzJzsKKyAgfSBjYXRjaCAoZSwgcykgeworICAgIHZhciBzID0gMTIzOworICAgIHJldHVybiBzOworICB9Cit9CisKK21haW4oKSBhc3luYyB7CisgIEV4cGVjdC5lcXVhbHMoMTIzLCBmb28oNDIpKTsKKyAgRXhwZWN0LmVxdWFscygxMjMsIGF3YWl0IGJhcig0MikpOworICBFeHBlY3QuZXF1YWxzKDEyMywgYmF6KDQyKS5zaW5nbGUpOworICBFeHBlY3QuZXF1YWxzKDEyMywgYXdhaXQgcXV4KDQyKS5zaW5nbGUpOworCisgIGF3YWl0IHRlc3RDbGFzcygpOworCisgIEV4cGVjdC5lcXVhbHMoMTIzLCB0ZXN0Q2F0Y2goKSk7CisgIEV4cGVjdC5lcXVhbHMoMTIzLCB0ZXN0U3RhY2tUcmFjZSgpKTsKK30KKwordGVzdENsYXNzKCkgYXN5bmMgeworICB2YXIgYyA9IG5ldyBDKCdoaScpOworICBFeHBlY3QuZXF1YWxzKDEyMywgYy54KTsKKyAgRXhwZWN0LmVxdWFscygxMjMsIGMubWV0aG9kKDQyKSk7CisgIGMuYWNjZXNzb3IgPSA0MjsKKyAgRXhwZWN0LmVxdWFscygxMjMsIGMuYWNjZXNzb3IpOworICBjID0gbmV3IEMuaW5pdFkoNDIpOworICBFeHBlY3QuZXF1YWxzKDQyLCBjLnkpOworICBFeHBlY3QuZXF1YWxzKDEyMywgYy5sb2NhbFkpOworCisgIEV4cGVjdC5lcXVhbHMoMTIzLCBjLm1PcHRpb25hbCgpKTsKKyAgRXhwZWN0LmVxdWFscygxMjMsIGMubU9wdGlvbmFsKDQyKSk7CisKKyAgRXhwZWN0LmVxdWFscygxMjMsIGMubU5hbWVkKCkpOworICBFeHBlY3QuZXF1YWxzKDEyMywgYy5tTmFtZWQoYTogNDIpKTsKKworICBFeHBlY3QuZXF1YWxzKDEyMywgYXdhaXQgYy5tQXN5bmMoKSk7CisKKyAgdmFyIGl0ZXIgPSBjLm1TeW5jU3RhcigpOworICBFeHBlY3QubGlzdEVxdWFscyhbMTIzXSwgaXRlci50b0xpc3QoKSk7CisgIEV4cGVjdC5saXN0RXF1YWxzKFsxMjNdLCBpdGVyLnRvTGlzdCgpLCAnc2Vjb25kIGl0ZXJhdGlvbiB5aWVsZHMgc2FtZSB2YWx1ZScpOworCisgIHZhciBzdHJlYW0gPSBjLm1Bc3luY1N0YXIoKTsKKyAgRXhwZWN0Lmxpc3RFcXVhbHMoWzEyM10sIGF3YWl0IHN0cmVhbS50b0xpc3QoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zaWRlX2VmZmVjdF90aHJvd190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zaWRlX2VmZmVjdF90aHJvd190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0Yjc2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NpZGVfZWZmZWN0X3Rocm93X3Rlc3QuZGFydApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBCIHsKKyAgc3RhdGljIHZhciB4OworICBvcGVyYXRvciA8PChvdGhlcikgeworICAgIHggPSBvdGhlcjsKKyAgICByZXR1cm4gMzM7CisgIH0KK30KKworY2xhc3MgQSB7CisgIGdldCBfbSA9PiBuZXcgQigpOworICBvcHNobChuKSB7CisgICAgLy8gJ24nIG11c3QgYmUgYSBudW1iZXIsIGJ1dCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gdGhyb3cgYmVmb3JlIHdlIGhhdmUKKyAgICAvLyBldmFsdWF0ZWQgX20gPDwgNDk5LgorICAgIHJldHVybiAoX20gPDwgNDk5KSB8ICgyIC0gbik7CisgIH0KK30KKworbWFpbigpIHsKKyAgdmFyIGEgPSBuZXcgQSgpOworICBFeHBlY3QudGhyb3dzKCgpID0+IGEub3BzaGwoInN0cmluZyIpKTsKKyAgRXhwZWN0LmVxdWFscyg0OTksIEIueCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zbWFsbGVyXzRfSW50ZXJmYWNlX1R5cGVzX0ExMV90MDFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc21hbGxlcl80X0ludGVyZmFjZV9UeXBlc19BMTFfdDAxX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODEzMTVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc21hbGxlcl80X0ludGVyZmFjZV9UeXBlc19BMTFfdDAxX3Rlc3QuZGFydApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisgKiBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorICogQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKyAqLworCisvLyBUaGlzIGlzIGEgc21hbGwgdmVyc2lvbiBvZiB0aGUgY28xOSB0ZXN0CisvLyBMYW5ndWFnZS8xNF9UeXBlcy80X0ludGVyZmFjZV9UeXBlc19BMTFfdDAxLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQyB7fQorCittYWluKCkgeworICBFeHBlY3QuaXNUcnVlKG5ldyBDMTI2KCkgaXMgQyk7CisgIEV4cGVjdC5pc1RydWUobmV3IEMxMjYoKSBpcyBPYmplY3QpOworfQorCitjbGFzcyBDMSBleHRlbmRzIEMge30KKworY2xhc3MgQzIgZXh0ZW5kcyBDMSB7fQorCitjbGFzcyBDMyBleHRlbmRzIEMyIHt9CisKK2NsYXNzIEM0IGV4dGVuZHMgQzMge30KKworY2xhc3MgQzUgZXh0ZW5kcyBDNCB7fQorCitjbGFzcyBDNiBleHRlbmRzIEM1IHt9CisKK2NsYXNzIEM3IGV4dGVuZHMgQzYge30KKworY2xhc3MgQzggZXh0ZW5kcyBDNyB7fQorCitjbGFzcyBDOSBleHRlbmRzIEM4IHt9CisKK2NsYXNzIEMxMCBleHRlbmRzIEM5IHt9CisKK2NsYXNzIEMxMSBleHRlbmRzIEMxMCB7fQorCitjbGFzcyBDMTIgZXh0ZW5kcyBDMTEge30KKworY2xhc3MgQzEzIGV4dGVuZHMgQzEyIHt9CisKK2NsYXNzIEMxNCBleHRlbmRzIEMxMyB7fQorCitjbGFzcyBDMTUgZXh0ZW5kcyBDMTQge30KKworY2xhc3MgQzE2IGV4dGVuZHMgQzE1IHt9CisKK2NsYXNzIEMxNyBleHRlbmRzIEMxNiB7fQorCitjbGFzcyBDMTggZXh0ZW5kcyBDMTcge30KKworY2xhc3MgQzE5IGV4dGVuZHMgQzE4IHt9CisKK2NsYXNzIEMyMCBleHRlbmRzIEMxOSB7fQorCitjbGFzcyBDMjEgZXh0ZW5kcyBDMjAge30KKworY2xhc3MgQzIyIGV4dGVuZHMgQzIxIHt9CisKK2NsYXNzIEMyMyBleHRlbmRzIEMyMiB7fQorCitjbGFzcyBDMjQgZXh0ZW5kcyBDMjMge30KKworY2xhc3MgQzI1IGV4dGVuZHMgQzI0IHt9CisKK2NsYXNzIEMyNiBleHRlbmRzIEMyNSB7fQorCitjbGFzcyBDMjcgZXh0ZW5kcyBDMjYge30KKworY2xhc3MgQzI4IGV4dGVuZHMgQzI3IHt9CisKK2NsYXNzIEMyOSBleHRlbmRzIEMyOCB7fQorCitjbGFzcyBDMzAgZXh0ZW5kcyBDMjkge30KKworY2xhc3MgQzMxIGV4dGVuZHMgQzMwIHt9CisKK2NsYXNzIEMzMiBleHRlbmRzIEMzMSB7fQorCitjbGFzcyBDMzMgZXh0ZW5kcyBDMzIge30KKworY2xhc3MgQzM0IGV4dGVuZHMgQzMzIHt9CisKK2NsYXNzIEMzNSBleHRlbmRzIEMzNCB7fQorCitjbGFzcyBDMzYgZXh0ZW5kcyBDMzUge30KKworY2xhc3MgQzM3IGV4dGVuZHMgQzM2IHt9CisKK2NsYXNzIEMzOCBleHRlbmRzIEMzNyB7fQorCitjbGFzcyBDMzkgZXh0ZW5kcyBDMzgge30KKworY2xhc3MgQzQwIGV4dGVuZHMgQzM5IHt9CisKK2NsYXNzIEM0MSBleHRlbmRzIEM0MCB7fQorCitjbGFzcyBDNDIgZXh0ZW5kcyBDNDEge30KKworY2xhc3MgQzQzIGV4dGVuZHMgQzQyIHt9CisKK2NsYXNzIEM0NCBleHRlbmRzIEM0MyB7fQorCitjbGFzcyBDNDUgZXh0ZW5kcyBDNDQge30KKworY2xhc3MgQzQ2IGV4dGVuZHMgQzQ1IHt9CisKK2NsYXNzIEM0NyBleHRlbmRzIEM0NiB7fQorCitjbGFzcyBDNDggZXh0ZW5kcyBDNDcge30KKworY2xhc3MgQzQ5IGV4dGVuZHMgQzQ4IHt9CisKK2NsYXNzIEM1MCBleHRlbmRzIEM0OSB7fQorCitjbGFzcyBDNTEgZXh0ZW5kcyBDNTAge30KKworY2xhc3MgQzUyIGV4dGVuZHMgQzUxIHt9CisKK2NsYXNzIEM1MyBleHRlbmRzIEM1MiB7fQorCitjbGFzcyBDNTQgZXh0ZW5kcyBDNTMge30KKworY2xhc3MgQzU1IGV4dGVuZHMgQzU0IHt9CisKK2NsYXNzIEM1NiBleHRlbmRzIEM1NSB7fQorCitjbGFzcyBDNTcgZXh0ZW5kcyBDNTYge30KKworY2xhc3MgQzU4IGV4dGVuZHMgQzU3IHt9CisKK2NsYXNzIEM1OSBleHRlbmRzIEM1OCB7fQorCitjbGFzcyBDNjAgZXh0ZW5kcyBDNTkge30KKworY2xhc3MgQzYxIGV4dGVuZHMgQzYwIHt9CisKK2NsYXNzIEM2MiBleHRlbmRzIEM2MSB7fQorCitjbGFzcyBDNjMgZXh0ZW5kcyBDNjIge30KKworY2xhc3MgQzY0IGV4dGVuZHMgQzYzIHt9CisKK2NsYXNzIEM2NSBleHRlbmRzIEM2NCB7fQorCitjbGFzcyBDNjYgZXh0ZW5kcyBDNjUge30KKworY2xhc3MgQzY3IGV4dGVuZHMgQzY2IHt9CisKK2NsYXNzIEM2OCBleHRlbmRzIEM2NyB7fQorCitjbGFzcyBDNjkgZXh0ZW5kcyBDNjgge30KKworY2xhc3MgQzcwIGV4dGVuZHMgQzY5IHt9CisKK2NsYXNzIEM3MSBleHRlbmRzIEM3MCB7fQorCitjbGFzcyBDNzIgZXh0ZW5kcyBDNzEge30KKworY2xhc3MgQzczIGV4dGVuZHMgQzcyIHt9CisKK2NsYXNzIEM3NCBleHRlbmRzIEM3MyB7fQorCitjbGFzcyBDNzUgZXh0ZW5kcyBDNzQge30KKworY2xhc3MgQzc2IGV4dGVuZHMgQzc1IHt9CisKK2NsYXNzIEM3NyBleHRlbmRzIEM3NiB7fQorCitjbGFzcyBDNzggZXh0ZW5kcyBDNzcge30KKworY2xhc3MgQzc5IGV4dGVuZHMgQzc4IHt9CisKK2NsYXNzIEM4MCBleHRlbmRzIEM3OSB7fQorCitjbGFzcyBDODEgZXh0ZW5kcyBDODAge30KKworY2xhc3MgQzgyIGV4dGVuZHMgQzgxIHt9CisKK2NsYXNzIEM4MyBleHRlbmRzIEM4MiB7fQorCitjbGFzcyBDODQgZXh0ZW5kcyBDODMge30KKworY2xhc3MgQzg1IGV4dGVuZHMgQzg0IHt9CisKK2NsYXNzIEM4NiBleHRlbmRzIEM4NSB7fQorCitjbGFzcyBDODcgZXh0ZW5kcyBDODYge30KKworY2xhc3MgQzg4IGV4dGVuZHMgQzg3IHt9CisKK2NsYXNzIEM4OSBleHRlbmRzIEM4OCB7fQorCitjbGFzcyBDOTAgZXh0ZW5kcyBDODkge30KKworY2xhc3MgQzkxIGV4dGVuZHMgQzkwIHt9CisKK2NsYXNzIEM5MiBleHRlbmRzIEM5MSB7fQorCitjbGFzcyBDOTMgZXh0ZW5kcyBDOTIge30KKworY2xhc3MgQzk0IGV4dGVuZHMgQzkzIHt9CisKK2NsYXNzIEM5NSBleHRlbmRzIEM5NCB7fQorCitjbGFzcyBDOTYgZXh0ZW5kcyBDOTUge30KKworY2xhc3MgQzk3IGV4dGVuZHMgQzk2IHt9CisKK2NsYXNzIEM5OCBleHRlbmRzIEM5NyB7fQorCitjbGFzcyBDOTkgZXh0ZW5kcyBDOTgge30KKworY2xhc3MgQzEwMCBleHRlbmRzIEM5OSB7fQorCitjbGFzcyBDMTAxIGV4dGVuZHMgQzEwMCB7fQorCitjbGFzcyBDMTAyIGV4dGVuZHMgQzEwMSB7fQorCitjbGFzcyBDMTAzIGV4dGVuZHMgQzEwMiB7fQorCitjbGFzcyBDMTA0IGV4dGVuZHMgQzEwMyB7fQorCitjbGFzcyBDMTA1IGV4dGVuZHMgQzEwNCB7fQorCitjbGFzcyBDMTA2IGV4dGVuZHMgQzEwNSB7fQorCitjbGFzcyBDMTA3IGV4dGVuZHMgQzEwNiB7fQorCitjbGFzcyBDMTA4IGV4dGVuZHMgQzEwNyB7fQorCitjbGFzcyBDMTA5IGV4dGVuZHMgQzEwOCB7fQorCitjbGFzcyBDMTEwIGV4dGVuZHMgQzEwOSB7fQorCitjbGFzcyBDMTExIGV4dGVuZHMgQzExMCB7fQorCitjbGFzcyBDMTEyIGV4dGVuZHMgQzExMSB7fQorCitjbGFzcyBDMTEzIGV4dGVuZHMgQzExMiB7fQorCitjbGFzcyBDMTE0IGV4dGVuZHMgQzExMyB7fQorCitjbGFzcyBDMTE1IGV4dGVuZHMgQzExNCB7fQorCitjbGFzcyBDMTE2IGV4dGVuZHMgQzExNSB7fQorCitjbGFzcyBDMTE3IGV4dGVuZHMgQzExNiB7fQorCitjbGFzcyBDMTE4IGV4dGVuZHMgQzExNyB7fQorCitjbGFzcyBDMTE5IGV4dGVuZHMgQzExOCB7fQorCitjbGFzcyBDMTIwIGV4dGVuZHMgQzExOSB7fQorCitjbGFzcyBDMTIxIGV4dGVuZHMgQzEyMCB7fQorCitjbGFzcyBDMTIyIGV4dGVuZHMgQzEyMSB7fQorCitjbGFzcyBDMTIzIGV4dGVuZHMgQzEyMiB7fQorCitjbGFzcyBDMTI0IGV4dGVuZHMgQzEyMyB7fQorCitjbGFzcyBDMTI1IGV4dGVuZHMgQzEyNCB7fQorCitjbGFzcyBDMTI2IGV4dGVuZHMgQzEyNSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc21hbGxlcl80X0ludGVyZmFjZV9UeXBlc19BMTFfdDAyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NtYWxsZXJfNF9JbnRlcmZhY2VfVHlwZXNfQTExX3QwMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyZWNjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3NtYWxsZXJfNF9JbnRlcmZhY2VfVHlwZXNfQTExX3QwMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorICogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKyAqIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisgKi8KKworLy8gVGhpcyBpcyBhIHNtYWxsIHZlcnNpb24gb2YgdGhlIGNvMTkgdGVzdAorLy8gTGFuZ3VhZ2UvMTRfVHlwZXMvNF9JbnRlcmZhY2VfVHlwZXNfQTExX3QwMi4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEMge30KKworY2xhc3MgRzxULCBTLCBVPiB7fQorCittYWluKCkgeworICBFeHBlY3QuaXNUcnVlKG5ldyBHPEMxMjYsIEMxMjYsIEMxMjY+KCkgaXMgRzxDLCBDLCBDPik7Cit9CisKK2NsYXNzIEMxIGV4dGVuZHMgQyB7fQorCitjbGFzcyBDMiBleHRlbmRzIEMxIHt9CisKK2NsYXNzIEMzIGV4dGVuZHMgQzIge30KKworY2xhc3MgQzQgZXh0ZW5kcyBDMyB7fQorCitjbGFzcyBDNSBleHRlbmRzIEM0IHt9CisKK2NsYXNzIEM2IGV4dGVuZHMgQzUge30KKworY2xhc3MgQzcgZXh0ZW5kcyBDNiB7fQorCitjbGFzcyBDOCBleHRlbmRzIEM3IHt9CisKK2NsYXNzIEM5IGV4dGVuZHMgQzgge30KKworY2xhc3MgQzEwIGV4dGVuZHMgQzkge30KKworY2xhc3MgQzExIGV4dGVuZHMgQzEwIHt9CisKK2NsYXNzIEMxMiBleHRlbmRzIEMxMSB7fQorCitjbGFzcyBDMTMgZXh0ZW5kcyBDMTIge30KKworY2xhc3MgQzE0IGV4dGVuZHMgQzEzIHt9CisKK2NsYXNzIEMxNSBleHRlbmRzIEMxNCB7fQorCitjbGFzcyBDMTYgZXh0ZW5kcyBDMTUge30KKworY2xhc3MgQzE3IGV4dGVuZHMgQzE2IHt9CisKK2NsYXNzIEMxOCBleHRlbmRzIEMxNyB7fQorCitjbGFzcyBDMTkgZXh0ZW5kcyBDMTgge30KKworY2xhc3MgQzIwIGV4dGVuZHMgQzE5IHt9CisKK2NsYXNzIEMyMSBleHRlbmRzIEMyMCB7fQorCitjbGFzcyBDMjIgZXh0ZW5kcyBDMjEge30KKworY2xhc3MgQzIzIGV4dGVuZHMgQzIyIHt9CisKK2NsYXNzIEMyNCBleHRlbmRzIEMyMyB7fQorCitjbGFzcyBDMjUgZXh0ZW5kcyBDMjQge30KKworY2xhc3MgQzI2IGV4dGVuZHMgQzI1IHt9CisKK2NsYXNzIEMyNyBleHRlbmRzIEMyNiB7fQorCitjbGFzcyBDMjggZXh0ZW5kcyBDMjcge30KKworY2xhc3MgQzI5IGV4dGVuZHMgQzI4IHt9CisKK2NsYXNzIEMzMCBleHRlbmRzIEMyOSB7fQorCitjbGFzcyBDMzEgZXh0ZW5kcyBDMzAge30KKworY2xhc3MgQzMyIGV4dGVuZHMgQzMxIHt9CisKK2NsYXNzIEMzMyBleHRlbmRzIEMzMiB7fQorCitjbGFzcyBDMzQgZXh0ZW5kcyBDMzMge30KKworY2xhc3MgQzM1IGV4dGVuZHMgQzM0IHt9CisKK2NsYXNzIEMzNiBleHRlbmRzIEMzNSB7fQorCitjbGFzcyBDMzcgZXh0ZW5kcyBDMzYge30KKworY2xhc3MgQzM4IGV4dGVuZHMgQzM3IHt9CisKK2NsYXNzIEMzOSBleHRlbmRzIEMzOCB7fQorCitjbGFzcyBDNDAgZXh0ZW5kcyBDMzkge30KKworY2xhc3MgQzQxIGV4dGVuZHMgQzQwIHt9CisKK2NsYXNzIEM0MiBleHRlbmRzIEM0MSB7fQorCitjbGFzcyBDNDMgZXh0ZW5kcyBDNDIge30KKworY2xhc3MgQzQ0IGV4dGVuZHMgQzQzIHt9CisKK2NsYXNzIEM0NSBleHRlbmRzIEM0NCB7fQorCitjbGFzcyBDNDYgZXh0ZW5kcyBDNDUge30KKworY2xhc3MgQzQ3IGV4dGVuZHMgQzQ2IHt9CisKK2NsYXNzIEM0OCBleHRlbmRzIEM0NyB7fQorCitjbGFzcyBDNDkgZXh0ZW5kcyBDNDgge30KKworY2xhc3MgQzUwIGV4dGVuZHMgQzQ5IHt9CisKK2NsYXNzIEM1MSBleHRlbmRzIEM1MCB7fQorCitjbGFzcyBDNTIgZXh0ZW5kcyBDNTEge30KKworY2xhc3MgQzUzIGV4dGVuZHMgQzUyIHt9CisKK2NsYXNzIEM1NCBleHRlbmRzIEM1MyB7fQorCitjbGFzcyBDNTUgZXh0ZW5kcyBDNTQge30KKworY2xhc3MgQzU2IGV4dGVuZHMgQzU1IHt9CisKK2NsYXNzIEM1NyBleHRlbmRzIEM1NiB7fQorCitjbGFzcyBDNTggZXh0ZW5kcyBDNTcge30KKworY2xhc3MgQzU5IGV4dGVuZHMgQzU4IHt9CisKK2NsYXNzIEM2MCBleHRlbmRzIEM1OSB7fQorCitjbGFzcyBDNjEgZXh0ZW5kcyBDNjAge30KKworY2xhc3MgQzYyIGV4dGVuZHMgQzYxIHt9CisKK2NsYXNzIEM2MyBleHRlbmRzIEM2MiB7fQorCitjbGFzcyBDNjQgZXh0ZW5kcyBDNjMge30KKworY2xhc3MgQzY1IGV4dGVuZHMgQzY0IHt9CisKK2NsYXNzIEM2NiBleHRlbmRzIEM2NSB7fQorCitjbGFzcyBDNjcgZXh0ZW5kcyBDNjYge30KKworY2xhc3MgQzY4IGV4dGVuZHMgQzY3IHt9CisKK2NsYXNzIEM2OSBleHRlbmRzIEM2OCB7fQorCitjbGFzcyBDNzAgZXh0ZW5kcyBDNjkge30KKworY2xhc3MgQzcxIGV4dGVuZHMgQzcwIHt9CisKK2NsYXNzIEM3MiBleHRlbmRzIEM3MSB7fQorCitjbGFzcyBDNzMgZXh0ZW5kcyBDNzIge30KKworY2xhc3MgQzc0IGV4dGVuZHMgQzczIHt9CisKK2NsYXNzIEM3NSBleHRlbmRzIEM3NCB7fQorCitjbGFzcyBDNzYgZXh0ZW5kcyBDNzUge30KKworY2xhc3MgQzc3IGV4dGVuZHMgQzc2IHt9CisKK2NsYXNzIEM3OCBleHRlbmRzIEM3NyB7fQorCitjbGFzcyBDNzkgZXh0ZW5kcyBDNzgge30KKworY2xhc3MgQzgwIGV4dGVuZHMgQzc5IHt9CisKK2NsYXNzIEM4MSBleHRlbmRzIEM4MCB7fQorCitjbGFzcyBDODIgZXh0ZW5kcyBDODEge30KKworY2xhc3MgQzgzIGV4dGVuZHMgQzgyIHt9CisKK2NsYXNzIEM4NCBleHRlbmRzIEM4MyB7fQorCitjbGFzcyBDODUgZXh0ZW5kcyBDODQge30KKworY2xhc3MgQzg2IGV4dGVuZHMgQzg1IHt9CisKK2NsYXNzIEM4NyBleHRlbmRzIEM4NiB7fQorCitjbGFzcyBDODggZXh0ZW5kcyBDODcge30KKworY2xhc3MgQzg5IGV4dGVuZHMgQzg4IHt9CisKK2NsYXNzIEM5MCBleHRlbmRzIEM4OSB7fQorCitjbGFzcyBDOTEgZXh0ZW5kcyBDOTAge30KKworY2xhc3MgQzkyIGV4dGVuZHMgQzkxIHt9CisKK2NsYXNzIEM5MyBleHRlbmRzIEM5MiB7fQorCitjbGFzcyBDOTQgZXh0ZW5kcyBDOTMge30KKworY2xhc3MgQzk1IGV4dGVuZHMgQzk0IHt9CisKK2NsYXNzIEM5NiBleHRlbmRzIEM5NSB7fQorCitjbGFzcyBDOTcgZXh0ZW5kcyBDOTYge30KKworY2xhc3MgQzk4IGV4dGVuZHMgQzk3IHt9CisKK2NsYXNzIEM5OSBleHRlbmRzIEM5OCB7fQorCitjbGFzcyBDMTAwIGV4dGVuZHMgQzk5IHt9CisKK2NsYXNzIEMxMDEgZXh0ZW5kcyBDMTAwIHt9CisKK2NsYXNzIEMxMDIgZXh0ZW5kcyBDMTAxIHt9CisKK2NsYXNzIEMxMDMgZXh0ZW5kcyBDMTAyIHt9CisKK2NsYXNzIEMxMDQgZXh0ZW5kcyBDMTAzIHt9CisKK2NsYXNzIEMxMDUgZXh0ZW5kcyBDMTA0IHt9CisKK2NsYXNzIEMxMDYgZXh0ZW5kcyBDMTA1IHt9CisKK2NsYXNzIEMxMDcgZXh0ZW5kcyBDMTA2IHt9CisKK2NsYXNzIEMxMDggZXh0ZW5kcyBDMTA3IHt9CisKK2NsYXNzIEMxMDkgZXh0ZW5kcyBDMTA4IHt9CisKK2NsYXNzIEMxMTAgZXh0ZW5kcyBDMTA5IHt9CisKK2NsYXNzIEMxMTEgZXh0ZW5kcyBDMTEwIHt9CisKK2NsYXNzIEMxMTIgZXh0ZW5kcyBDMTExIHt9CisKK2NsYXNzIEMxMTMgZXh0ZW5kcyBDMTEyIHt9CisKK2NsYXNzIEMxMTQgZXh0ZW5kcyBDMTEzIHt9CisKK2NsYXNzIEMxMTUgZXh0ZW5kcyBDMTE0IHt9CisKK2NsYXNzIEMxMTYgZXh0ZW5kcyBDMTE1IHt9CisKK2NsYXNzIEMxMTcgZXh0ZW5kcyBDMTE2IHt9CisKK2NsYXNzIEMxMTggZXh0ZW5kcyBDMTE3IHt9CisKK2NsYXNzIEMxMTkgZXh0ZW5kcyBDMTE4IHt9CisKK2NsYXNzIEMxMjAgZXh0ZW5kcyBDMTE5IHt9CisKK2NsYXNzIEMxMjEgZXh0ZW5kcyBDMTIwIHt9CisKK2NsYXNzIEMxMjIgZXh0ZW5kcyBDMTIxIHt9CisKK2NsYXNzIEMxMjMgZXh0ZW5kcyBDMTIyIHt9CisKK2NsYXNzIEMxMjQgZXh0ZW5kcyBDMTIzIHt9CisKK2NsYXNzIEMxMjUgZXh0ZW5kcyBDMTI0IHt9CisKK2NsYXNzIEMxMjYgZXh0ZW5kcyBDMTI1IHt9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGFja19vdmVyZmxvd19zdGFja3RyYWNlX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YWNrX292ZXJmbG93X3N0YWNrdHJhY2VfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTQ0NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGFja19vdmVyZmxvd19zdGFja3RyYWNlX3Rlc3QuZGFydApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBEYXJ0IHByb2dyYW0gdGVzdGluZyBzdGFjayBvdmVyZmxvdy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIFN0YWNrT3ZlcmZsb3dUZXN0IHsKKyAgc3RhdGljIHZvaWQgY3Vyc2VUaGVSZWN1cnNlKGEsIGIsIGMpIHsKKyAgICBjdXJzZVRoZVJlY3Vyc2UoYiwgYywgYSk7CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0TWFpbigpIHsKKyAgICBib29sIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOworICAgIHRyeSB7CisgICAgICBjdXJzZVRoZVJlY3Vyc2UoMSwgMiwgMyk7CisgICAgfSBvbiBTdGFja092ZXJmbG93RXJyb3IgY2F0Y2ggKGUsIHN0YWNrdHJhY2UpIHsKKyAgICAgIFN0cmluZyBzID0gc3RhY2t0cmFjZS50b1N0cmluZygpOworICAgICAgRXhwZWN0LmVxdWFscygtMSwgcy5pbmRleE9mKCItMTotMSIpKTsKKyAgICAgIGV4Y2VwdGlvbkNhdWdodCA9IHRydWU7CisgICAgfQorICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgZXhjZXB0aW9uQ2F1Z2h0KTsKKyAgfQorfQorCittYWluKCkgeworICBTdGFja092ZXJmbG93VGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc3RhY2tfb3ZlcmZsb3dfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc3RhY2tfb3ZlcmZsb3dfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODdhMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGFja19vdmVyZmxvd190ZXN0LmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCBwcm9ncmFtIHRlc3Rpbmcgc3RhY2sgb3ZlcmZsb3cuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBTdGFja092ZXJmbG93VGVzdCB7CisgIHN0YXRpYyB2b2lkIGN1cnNlVGhlUmVjdXJzZShhLCBiLCBjKSB7CisgICAgY3Vyc2VUaGVSZWN1cnNlKGIsIGMsIGEpOworICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdE1haW4oKSB7CisgICAgYm9vbCBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgY3Vyc2VUaGVSZWN1cnNlKDEsIDIsIDMpOworICAgIH0gb24gU3RhY2tPdmVyZmxvd0Vycm9yIGNhdGNoIChlKSB7CisgICAgICBleGNlcHRpb25DYXVnaHQgPSB0cnVlOworICAgIH0KKyAgICBFeHBlY3QuZXF1YWxzKHRydWUsIGV4Y2VwdGlvbkNhdWdodCk7CisgIH0KK30KKworbWFpbigpIHsKKyAgU3RhY2tPdmVyZmxvd1Rlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGF0ZV9tYW5nbGluZzJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTc2NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGF0ZV9tYW5nbGluZzJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ZvbyhzdGF0ZSkgeworICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuIDA7CisgIHZhciBzdW0gPSAwOworICBzdGF0ZSA9IGluc2NydXRhYmxlSWQoc3RhdGUpOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKSB7CisgICAgc3VtICs9IHN0YXRlW2ldIGFzIGludDsKKyAgfQorICBzdGF0ZSA9IGluc2NydXRhYmxlSWQoc3RhdGUpOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKSB7CisgICAgc3VtICs9IHN0YXRlW2ldIGFzIGludDsKKyAgfQorICByZXR1cm4gc3VtOworfQorCitpbnQgaW5zY3J1dGFibGUoaW50IHgpID0+IHggPT0gMCA/IDAgOiB4IHwgaW5zY3J1dGFibGUoeCAmICh4IC0gMSkpOworCitpbnNjcnV0YWJsZUlkKHgpIHsKKyAgaWYgKHggPT0gMCkgcmV0dXJuIGluc2NydXRhYmxlKHgpOworICByZXR1cm4gKDMgPT0gaW5zY3J1dGFibGUoMykpID8geCA6IGZhbHNlOworfQorCitjbGFzcyBBIHsKKyAgaW50IGxlbmd0aCA9IDM7CisgIG9wZXJhdG9yIFtdKGkpID0+IDE7Cit9CisKK21haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoMTIsIGZvbyhbMSwgMiwgM10pKTsKKyAgaWYgKGluc2NydXRhYmxlSWQoMCkgPT0gMCkgeworICAgIEV4cGVjdC5lcXVhbHMoNiwgZm9vKG5ldyBBKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc3RhdGVfbWFuZ2xpbmczX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nM190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNTMxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nM190ZXN0LmRhcnQKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworZm9vKHN0YXRlMCkgeworICBpZiAoc3RhdGUwID09IG51bGwpIHJldHVybiAwOworICB2YXIgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZTAubGVuZ3RoOyBpKyspIHsKKyAgICBzdW0gKz0gc3RhdGUwW2ldIGFzIGludDsKKyAgfQorICBzdGF0ZTAgPSBpbnNjcnV0YWJsZUlkKHN0YXRlMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUwLmxlbmd0aDsgaSsrKSB7CisgICAgc3VtICs9IHN0YXRlMFtpXSBhcyBpbnQ7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworaW50IGluc2NydXRhYmxlKGludCB4KSA9PiB4ID09IDAgPyAwIDogeCB8IGluc2NydXRhYmxlKHggJiAoeCAtIDEpKTsKKworaW5zY3J1dGFibGVJZCh4KSB7CisgIGlmICh4ID09IDApIHJldHVybiBpbnNjcnV0YWJsZSh4KTsKKyAgcmV0dXJuICgzID09IGluc2NydXRhYmxlKDMpKSA/IHggOiBmYWxzZTsKK30KKworY2xhc3MgQSB7CisgIGludCBsZW5ndGggPSAzOworICBvcGVyYXRvciBbXShpKSA9PiAxOworfQorCittYWluKCkgeworICBFeHBlY3QuZXF1YWxzKDEyLCBmb28oWzEsIDIsIDNdKSk7CisgIGlmIChpbnNjcnV0YWJsZUlkKDApID09IDApIHsKKyAgICBFeHBlY3QuZXF1YWxzKDYsIGZvbyhuZXcgQSgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nNF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGF0ZV9tYW5nbGluZzRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzBiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC9zdGF0ZV9tYW5nbGluZzRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ZvbyhlbnYxKSB7CisgIGlmIChlbnYxID09IG51bGwpIHJldHVybiAwOworICB2YXIgZW52MCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52MS5sZW5ndGg7IGkrKykgeworICAgIGVudjAgKz0gZW52MVtpXSBhcyBpbnQ7CisgIH0KKyAgZW52MSA9IGluc2NydXRhYmxlSWQobmV3IEEoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52MS5sZW5ndGg7IGkrKykgeworICAgIGVudjAgKz0gZW52MVtpXSBhcyBpbnQ7CisgIH0KKyAgcmV0dXJuIGVudjA7Cit9CisKK2ludCBpbnNjcnV0YWJsZShpbnQgeCkgPT4geCA9PSAwID8gMCA6IHggfCBpbnNjcnV0YWJsZSh4ICYgKHggLSAxKSk7CisKK2luc2NydXRhYmxlSWQoeCkgeworICBpZiAoeCA9PSAwKSByZXR1cm4gaW5zY3J1dGFibGUoeCk7CisgIHJldHVybiAoMyA9PSBpbnNjcnV0YWJsZSgzKSkgPyB4IDogZmFsc2U7Cit9CisKK2NsYXNzIEEgeworICBpbnQgbGVuZ3RoID0gMzsKKyAgb3BlcmF0b3IgW10oaSkgPT4gMTsKK30KKworbWFpbigpIHsKKyAgRXhwZWN0LmVxdWFscyg5LCBmb28oWzEsIDIsIDNdKSk7CisgIGlmIChpbnNjcnV0YWJsZUlkKDApID09IDApIHsKKyAgICBFeHBlY3QuZXF1YWxzKDYsIGZvbyhuZXcgQSgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3N0YXRlX21hbmdsaW5nX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNmNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvc3RhdGVfbWFuZ2xpbmdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ZvbyhzdGF0ZSkgeworICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuIDA7CisgIHZhciBzdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKSB7CisgICAgc3VtICs9IHN0YXRlW2ldIGFzIGludDsKKyAgfQorICBzdGF0ZSA9IGluc2NydXRhYmxlSWQoc3RhdGUpOworICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgaSsrKSB7CisgICAgc3VtICs9IHN0YXRlW2ldIGFzIGludDsKKyAgfQorICByZXR1cm4gc3VtOworfQorCitpbnQgaW5zY3J1dGFibGUoaW50IHgpID0+IHggPT0gMCA/IDAgOiB4IHwgaW5zY3J1dGFibGUoeCAmICh4IC0gMSkpOworCitpbnNjcnV0YWJsZUlkKHgpIHsKKyAgaWYgKHggPT0gMCkgcmV0dXJuIGluc2NydXRhYmxlKHgpOworICByZXR1cm4gKDMgPT0gaW5zY3J1dGFibGUoMykpID8geCA6IGZhbHNlOworfQorCitjbGFzcyBBIHsKKyAgaW50IGxlbmd0aCA9IDM7CisgIG9wZXJhdG9yIFtdKGkpID0+IDE7Cit9CisKK21haW4oKSB7CisgIEV4cGVjdC5lcXVhbHMoMTIsIGZvbyhbMSwgMiwgM10pKTsKKyAgaWYgKGluc2NydXRhYmxlSWQoMCkgPT0gMCkgeworICAgIEV4cGVjdC5lcXVhbHMoNiwgZm9vKG5ldyBBKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdGVtcF9tYW5nbGluZ190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90ZW1wX21hbmdsaW5nX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU4ZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdGVtcF9tYW5nbGluZ190ZXN0LmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgdGVzdE9uZSgpOworICB0ZXN0VHdvKCk7Cit9CisKK3Rlc3RPbmUoKSB7CisgIC8vIERhcnQySlMgdXNlcyB0WzAtOV0qIHRvIGRlY2xhcmUgdGVtcG9yYXJpZXMsIHNvIGEgbG9jYWwgdmFyaWFibGUKKyAgLy8gd2l0aCB0aGF0IHBhdHRlcm4gY2FuIGNvbmZsaWN0IHdpdGggdGhlbS4KKyAgdmFyIHQwID0gW107CisgIC8vIEJ5IHVzaW5nICdpcycgY2hlY2ssIHdlIG1ha2Ugc3VyZSAndDAubGVuZ3RoJyBkb2VzIG5vdCBiZWNvbWUKKyAgLy8gZ2VuZXJhdGUgYXQgdXNlIHNpdGUuCisgIEV4cGVjdC5pc1RydWUodDAubGVuZ3RoIGlzIGludCk7CisgIEV4cGVjdC5pc1RydWUodDAgaXMgTGlzdCk7Cit9CisKK3Rlc3RUd28oKSB7CisgIHZhciB4ID0gW107CisgIHZhciB4XzAgPSBbXTsKKyAgeworICAgIC8vIFRoaXMgdXNlZCB0byBpbnRyb2R1Y2UgeF8wLgorICAgIHZhciB4ID0gbmV3IFNldCgpOworICAgIEV4cGVjdC5lcXVhbHMoMCwgeC5sZW5ndGgpOworICAgIEV4cGVjdC5pc1RydWUoeC5pc0VtcHR5KTsKKyAgfQorICBFeHBlY3QuaXNUcnVlKHggaXMgTGlzdCk7CisgIEV4cGVjdC5pc1RydWUoeF8wIGlzIExpc3QpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdGhpcmRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdGhpcmRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjY2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90aGlyZF90ZXN0LmRhcnQKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGhpcmQgZGFydCB0ZXN0IHByb2dyYW0uCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBBIGV4dGVuZHMgQiB7CisgIHZhciBhOworICBzdGF0aWMgdmFyIHM7CisKKyAgc3RhdGljIGZvbygpIHsKKyAgICByZXR1cm4gczsKKyAgfQorCisgIEEoeCwgeSkKKyAgICAgIDogYSA9IHgsCisgICAgICAgIHN1cGVyKHkpIHt9CisKKyAgdmFsdWUoKSB7CisgICAgcmV0dXJuIGEgKyBiICsgZm9vKCk7CisgIH0KK30KKworY2xhc3MgQiB7CisgIHZhciBiOworICBzdGF0aWMgdmFyIHM7CisKKyAgc3RhdGljIGZvbyh4KSB7CisgICAgcmV0dXJuIHggKyBzOworICB9CisKKyAgdmFsdWUoKSB7CisgICAgcmV0dXJuIGIgKyBmb28ocykgKyBBLmZvbygpOworICB9CisKKyAgQih4KSA6IGIgPSB4IHsKKyAgICBiID0gYiArIDE7CisgIH0KK30KKworY2xhc3MgVGhpcmRUZXN0IHsKKyAgc3RhdGljIHRlc3RNYWluKCkgeworICAgIHZhciBhID0gbmV3IEEoMSwgMik7CisgICAgdmFyIGIgPSBuZXcgQigzKTsKKyAgICBBLnMgPSA0OworICAgIEIucyA9IDU7CisgICAgRXhwZWN0LmVxdWFscygyNiwgYS52YWx1ZSgpICsgYi52YWx1ZSgpKTsKKyAgfQorfQorCittYWluKCkgeworICBUaGlyZFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3RyZWVfc2hha2VfdHlwZWRfc2VsZWN0b3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHJlZV9zaGFrZV90eXBlZF9zZWxlY3Rvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwYzg0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3RyZWVfc2hha2VfdHlwZWRfc2VsZWN0b3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIENoZWNrIHRoYXQgZGFydDJqcyBlbWl0cyBjb2RlIGZvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGFub3RoZXIKKy8vIGNsYXNzLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQSB7CisgIGZhY3RvcnkgQSgpID0+IG5ldyBCKCk7CisgIGZvbygpID0+IDA7Cit9CisKK2NsYXNzIEIgaW1wbGVtZW50cyBBIHsKKyAgZm9vKCkgPT4gNDI7Cit9CisKK21haW4oKSB7CisgIHZhciBhID0gbmV3IEEoKTsKKyAgaWYgKGEgaXMgQSkgeworICAgIEV4cGVjdC5lcXVhbHMoNDIsIGEuZm9vKCkpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5mYWlsKCdTaG91bGQgbm90IGJlIGhlcmUnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHlwZWNoZWNrX211bHRpZmllbGRfZGVjbGFyYXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHlwZWNoZWNrX211bHRpZmllbGRfZGVjbGFyYXRpb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2NmNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90eXBlY2hlY2tfbXVsdGlmaWVsZF9kZWNsYXJhdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLy8gQ2hlY2tzIHRoYXQgd2UgY2FuIGNvcnJlY3RseSB0eXBlY2hlY2sgbXVsdGktdmFyaWFibGUgZGVjbGFyYXRpb25zIG9uIGZpZWxkcworLy8vIGFuZCB0b3AtbGV2ZWxzLiBUaGlzIGlzIGFsc28gYSByZWdyZXNzaW9uIHRlc3QgZm9yIElzc3VlIDI3NDAxLgorCitjbGFzcyBBIHt9CisKK0EgYSA9IG5ldyBBKCksIGIgPSBuZXcgQSgpOworCitjbGFzcyBCIHsKKyAgQSBhID0gbmV3IEEoKSwgYiA9IG5ldyBBKCk7Cit9CisKK21haW4oKSA9PiBbYSwgYiwgbmV3IEIoKS5hLCBuZXcgQigpLmJdOwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHlwZWRfZXF1YWxpdHlfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHlwZWRfZXF1YWxpdHlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDhlNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90eXBlZF9lcXVhbGl0eV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHA6Ly9kYXJ0YnVnLmNvbS82MDM2LiBkYXJ0MmpzIHVzZWQgdG8gZmFpbAorLy8gdGhpcyBtZXRob2QgYmVjYXVzZSBpdCB3YXMgY29tcHV0aW5nIHRoYXQgaW50ZXJzZWN0aW5nIHR5cGUgRCB3aXRoCisvLyB0eXBlIEMgaXMgY29uZmxpY3RpbmcuCisKK2ZvbyhhLCBiKSB7CisgIGlmIChpZGVudGljYWwoYSwgYikpIHJldHVybjsKKyAgdGhyb3cgJ2Jyb2tlbic7Cit9CisKK2NsYXNzIEQge30KKworY2xhc3MgQyBpbXBsZW1lbnRzIEQge30KKworbWFpbigpIHsKKyAgdmFyIGMgPSBuZXcgQygpOworICBmb28oYywgYyBhcyBEKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3R5cGVkX3NlbGVjdG9yMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90eXBlZF9zZWxlY3RvcjJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMWNjMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC90eXBlZF9zZWxlY3RvcjJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3QgZm9yIGRhcnQyanMgdG8gaGFuZGxlIGEgdHlwZWQgc2VsZWN0b3Igd2l0aCBhIHR5cGVkZWYgYXMgYQorLy8gcmVjZWl2ZXIgdHlwZS4KKworZ2V0Q29tcGFyYXRvcigpID0+IChhLCBiKSA9PiA0MjsKKworY2xhc3MgQSB7CisgIGZvbygpID0+IDQyOworfQorCittYWluKCkgeworICBDb21wYXJhdG9yIGEgPSBnZXRDb21wYXJhdG9yKCk7CisgIGlmIChhKDEsIDIpICE9IDQyKSB7CisgICAgLy8gVGhpcyBjYWxsIHVzZWQgdG8gY3Jhc2ggZGFydDJqcyBiZWNhdXNlICdmb28nIHdhcyBhIHR5cGVkCisgICAgLy8gc2VsZWN0b3Igd2l0aCBhIHR5cGVkZWYgYXMgYSByZWNlaXZlciB0eXBlLgorICAgIGEuZm9vKCk7IC8qQGNvbXBpbGUtZXJyb3I9dW5zcGVjaWZpZWQqLworICB9CisgIHZhciBiID0gbmV3IEEoKTsKKyAgYi5mb28oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3R5cGVkX3NlbGVjdG9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3R5cGVkX3NlbGVjdG9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMyZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdHlwZWRfc2VsZWN0b3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cDovL2RhcnRidWcuY29tLzYyNTkuIFRoaXMgdGVzdCB1c2VkIHRvIGZhaWwKKy8vIG9uIGRhcnQyanMgYmVjYXVzZSBjbGFzcyBBIGRvZXMgbm90IGtub3cgW0EuZG9jdW1lbnRdIGlzIGEgdGFyZ2V0IGZvcgorLy8gdGhlIGNhbGwgWzpvYmouZG9jdW1lbnQ6XSBpbiB0aGUgW21haW5dIG1ldGhvZC4gVGhlcmVmb3JlLCBkYXJ0MmpzCisvLyB3b3VsZCBub3QgY29tcGlsZSBbQS5kb2N1bWVudF0uCisKK2NsYXNzIEEgeworICBnZXQgZG9jdW1lbnQgPT4gNDI7Cit9CisKK2Fic3RyYWN0IGNsYXNzIEIgeworICBnZXQgZG9jdW1lbnQ7IC8vIEFic3RyYWN0LgorfQorCitjbGFzcyBDIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEIge30KKworaW50IGluc2NydXRhYmxlKGludCB4KSA9PiB4ID09IDAgPyAwIDogeCB8IGluc2NydXRhYmxlKHggJiAoeCAtIDEpKTsKKwordm9pZCBtYWluKCkgeworICB2YXIgdGFiID0gW25ldyBPYmplY3QoKSwgbmV3IEMoKV07CisgIHZhciBvYmogPSB0YWJbaW5zY3J1dGFibGUoMSldOworICBpbnQgcmVzID0gMDsKKyAgaWYgKG9iaiBpcyBCKSByZXMgPSBvYmouZG9jdW1lbnQ7CisgIEV4cGVjdC5lcXVhbHMoNDIsIHJlcyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC91bmV2YWx1YXRlZF9maWVsZC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdW5ldmFsdWF0ZWRfZmllbGQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzcwMWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdW5ldmFsdWF0ZWRfZmllbGQuZGFydApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3QgdGhhdCBlbnZpcm9ubWVudCBjb25zdGFudHMgaW4gZmllbGQgaW5pdGlhbGl6ZXJzIHdvcmsgcHJvcGVybHkuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjb25zdCBpbnQgZ3ggPQorICAgIGNvbnN0IGJvb2wuaGFzRW52aXJvbm1lbnQoIngiKSA/IGNvbnN0IGludC5mcm9tRW52aXJvbm1lbnQoIngiKSA6IG51bGw7CisKK2NsYXNzIEEgeworICBmaW5hbCBpbnQgeCA9IGd4OworICBmaW5hbCBpbnQgeSA9CisgICAgICBjb25zdCBib29sLmhhc0Vudmlyb25tZW50KCJ5IikgPyBjb25zdCBpbnQuZnJvbUVudmlyb25tZW50KCJ5IikgOiBudWxsOworICBjb25zdCBBKCk7Cit9CisKK21haW4oKSB7CisgIGNvbnN0IGEgPSBjb25zdCBBKCk7CisgIEV4cGVjdC5pc1RydWUoYS54ID09IG51bGwgfHwgYS54ICE9IG51bGwpOworICBFeHBlY3QuaXNUcnVlKGEueSA9PSBudWxsIHx8IGEueSAhPSBudWxsKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3VudXNlZF9vdmVycmlkZGVuX2FzeW5jX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3VudXNlZF9vdmVycmlkZGVuX2FzeW5jX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdhYTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdW51c2VkX292ZXJyaWRkZW5fYXN5bmNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KK2ltcG9ydCAnZGFydDphc3luYyc7CisKK2NsYXNzIEJhc2UgeworICBGdXR1cmU8aW50PiBtZXRob2QoKSBhc3luYyB7CisgICAgdGhyb3cgJ1Nob3VsZCBiZSB1bnVzZWQnOworICB9Cit9CisKK2NsYXNzIFN1YjEgZXh0ZW5kcyBCYXNlIHsKKyAgRnV0dXJlPGludD4gbWV0aG9kKCkgYXN5bmMgeworICAgIHJldHVybiAxOworICB9Cit9CisKK2NsYXNzIFN1YjIgZXh0ZW5kcyBCYXNlIHsKKyAgRnV0dXJlPGludD4gbWV0aG9kKCkgYXN5bmMgeworICAgIHJldHVybiAyOworICB9Cit9CisKK2hlbHAoQmFzZSBvYmplY3QpIGFzeW5jIHsKKyAgcHJpbnQoYXdhaXQgb2JqZWN0Lm1ldGhvZCgpKTsKK30KKworbWFpbigpIGFzeW5jIHsKKyAgYXdhaXQgaGVscChuZXcgU3ViMSgpKTsKKyAgYXdhaXQgaGVscChuZXcgU3ViMigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3ZhbHVlX3JhbmdlMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YWx1ZV9yYW5nZTJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGE5OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YWx1ZV9yYW5nZTJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2ludCBpbnNjcnV0YWJsZShpbnQgeCkgPT4geCA9PSAwID8gMCA6IHggfCBpbnNjcnV0YWJsZSh4ICYgKHggLSAxKSk7CisKK2ZvbygpIHsKKyAgaW50IHggPSAwOworICBpZiAoaW5zY3J1dGFibGUoMCkgPT0gMCkgeCA9IC0yOyAvLyB4IGlzIG5vdyBpbiByYW5nZSBbLTIgLi4gMF0uCisgIGludCB5ID0gMjsKKyAgaWYgKGluc2NydXRhYmxlKDApID09IDApIHkgPSA0OyAvLyB5IGlzIG5vdyBpbiByYW5nZSBbMiAuLiA0XS4KKyAgaW50IGkgPSB5IC0geDsgLy8gaSBzaG91bGQgYmUgaW4gcmFuZ2UgWzIgLi4gNl0uCisgIGkgLT0gNDsgLy8gaSBzaG91bGQgYmUgaW4gcmFuZ2UgWy0yIC4uIDJdLiBBY3R1YWwgdmFsdWU6IDIuCisgIHZhciBhID0gY29uc3QgWzFdOworICByZXR1cm4gYVtpXTsKK30KKworbWFpbigpIHsKKyAgRXhwZWN0LnRocm93c1JhbmdlRXJyb3IoKCkgPT4gZm9vKCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdW5zb3J0ZWQvdmFsdWVfcmFuZ2UzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3ZhbHVlX3JhbmdlM190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmMDVmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3ZhbHVlX3JhbmdlM190ZXN0LmRhcnQKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQSB7CisgIGNvcHkoYXJyYXksIGluZGV4MSwgaW5kZXgyKSB7CisgICAgaWYgKGluZGV4MSA8IGluZGV4MiArIGluZGV4MikgeworICAgICAgLy8gZGFydDJqcyB1c2VkIHRvIHJlbW92ZSB0aGUgYm91bmRzIGNoZWNrLgorICAgICAgcmV0dXJuIGFycmF5W2luZGV4MV07CisgICAgfQorICB9Cit9CisKK21haW4oKSB7CisgIEV4cGVjdC50aHJvd3NSYW5nZUVycm9yKCgpID0+IG5ldyBBKCkuY29weShuZXcgTGlzdC5lbXB0eSgpLCAwLCAxKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YWx1ZV9yYW5nZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YWx1ZV9yYW5nZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmY2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3ZhbHVlX3JhbmdlX3Rlc3QuZGFydApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitpbnQgaW5zY3J1dGFibGUoaW50IHgpID0+IHggPT0gMCA/IDAgOiB4IHwgaW5zY3J1dGFibGUoeCAmICh4IC0gMSkpOworCitmb28oKSB7CisgIHZhciB4ID0gMHgxMDI7CisgIGlmIChpbnNjcnV0YWJsZSh4KSA9PSAwKSB4ID0gMHgwOworICBpZiAoaW5zY3J1dGFibGUoMTApID09IDEwKSB4ID0gMHgxMDsgLy8geCBpcyBpbiByYW5nZSBbMCAuLiAweDEwMl0uCisgIHggPSB4ICYgMHhGRjsgLy8geCBzaG91bGQgYmUgaW4gcmFuZ2UgWzAgLi4gMHhGRl0uIEFjdHVhbCB2YWx1ZTogMHgxMC4KKyAgdmFyIGEgPSBjb25zdCBbMSwgMiwgM107CisgIHJldHVybiBhW3hdOworfQorCittYWluKCkgeworICBFeHBlY3QudGhyb3dzUmFuZ2VFcnJvcigoKSA9PiBmb28oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YXJfaW5pdF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS91bnNvcnRlZC92YXJfaW5pdF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3Vuc29ydGVkL3Zhcl9pbml0X3Rlc3QuZGFydApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTEsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBUZXN0aW5nIGNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGVzIGluIHNjb3Blcy4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIFZhckluaXRUZXN0IHsKKyAgc3RhdGljIHZvaWQgdGVzdE1haW4oKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICB2YXIgeDsKKyAgICAgIEV4cGVjdC5lcXVhbHMobnVsbCwgeCk7CisgICAgICB4ID0gMTsKKyAgICB9CisgIH0KK30KKworbWFpbigpIHsKKyAgVmFySW5pdFRlc3QudGVzdE1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3N5bnRheC92YXJpYW5jZV9kaXNhYmxlZF9rZXl3b3JkX2lkZW50aWZpZXJfc3ludGF4X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3N5bnRheC92YXJpYW5jZV9kaXNhYmxlZF9rZXl3b3JkX2lkZW50aWZpZXJfc3ludGF4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDY4MjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX2Rpc2FibGVkX2tleXdvcmRfaWRlbnRpZmllcl9zeW50YXhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgaWRlbnRpZmllciB1c2FnZSBvZiBrZXl3b3JkcyBgb3V0YCBhbmQgYGlub3V0YCwgY29ycmVjdCB1c2FnZSBvZiBgaW5gLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQTxvdXQ+IHt9CisKK2NsYXNzIEI8aW5vdXQ+IHt9CisKK2NsYXNzIEM8b3V0LCBpbm91dD4ge30KKworRjxpbm91dCwgb3V0PigpIHt9CisKK21peGluIEc8b3V0LCBpbm91dD4ge30KKwordHlwZWRlZiBIPGlub3V0LCBvdXQ+ID0gb3V0IEZ1bmN0aW9uKGlub3V0KTsKKworY2xhc3MgT3V0UGFyYW1ldGVyIHsKKyAgdmFyIG91dCA9IDM7CisgIGludCBmdW5jKGludCBvdXQpIHsKKyAgICByZXR1cm4gb3V0OworICB9Cit9CisKK2NsYXNzIGlub3V0IHsKKyAgdm9pZCBvdXQoaW50IHgpIHt9Cit9CisKK3ZhciBvdXQgPSA1OworCittYWluKCkgeworICBPdXRQYXJhbWV0ZXIgeCA9IG5ldyBPdXRQYXJhbWV0ZXIoKTsKKyAgRXhwZWN0LmVxdWFscygyLCB4LmZ1bmMoMikpOworICBFeHBlY3QuZXF1YWxzKDMsIHgub3V0KTsKKworICBpbm91dCBmb28gPSBpbm91dCgpOworICBmb28ub3V0KDQpOworCisgIEV4cGVjdC5lcXVhbHMoNSwgb3V0KTsKKworICB2YXIgY29sbGVjdGlvbiA9IFswLCAxLCAyXTsKKyAgZm9yICh2YXIgeCBpbiBjb2xsZWN0aW9uKSB7CisgICAgRXhwZWN0LmlzVHJ1ZSh4IGlzIGludCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3N5bnRheC92YXJpYW5jZV9kaXNhYmxlZF9zeW50YXhfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX2Rpc2FibGVkX3N5bnRheF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxMTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3N5bnRheC92YXJpYW5jZV9kaXNhYmxlZF9zeW50YXhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgd2l0aCBgdmFyaWFuY2VgIGZsYWcgZGlzYWJsZWQKKy8vIENvcnJlY3QgdmFyaWFuY2UgbW9kaWZpZXIgdXNhZ2Ugd2lsbCBpc3N1ZSBhbiBlcnJvci4KKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2Fic3RyYWN0IGNsYXNzIEE8aW4gWD4geworLy8gICAgICAgICAgICAgICBeXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhQRVJJTUVOVF9OT1RfRU5BQkxFRAorLy8gW2NmZV0gVGhpcyByZXF1aXJlcyB0aGUgJ3ZhcmlhbmNlJyBsYW5ndWFnZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQuCisgIGludCBmb28oWCBiYXIpOworfQorCitjbGFzcyBCPG91dCBYLCBpbiBZLCBpbm91dCBaPiB7fQorLy8gICAgICBeXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVSSU1FTlRfTk9UX0VOQUJMRUQKKy8vIFtjZmVdIFRoaXMgcmVxdWlyZXMgdGhlICd2YXJpYW5jZScgbGFuZ3VhZ2UgZmVhdHVyZSB0byBiZSBlbmFibGVkLgorLy8gICAgICAgICAgICAgXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVSSU1FTlRfTk9UX0VOQUJMRUQKKy8vIFtjZmVdIFRoaXMgcmVxdWlyZXMgdGhlICd2YXJpYW5jZScgbGFuZ3VhZ2UgZmVhdHVyZSB0byBiZSBlbmFibGVkLgorLy8gICAgICAgICAgICAgICAgICAgXl5eXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVSSU1FTlRfTk9UX0VOQUJMRUQKKy8vIFtjZmVdIFRoaXMgcmVxdWlyZXMgdGhlICd2YXJpYW5jZScgbGFuZ3VhZ2UgZmVhdHVyZSB0byBiZSBlbmFibGVkLgorCitjbGFzcyBDPGluIFQ+IGV4dGVuZHMgQTxUPiB7CisvLyAgICAgIF5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFUklNRU5UX05PVF9FTkFCTEVECisvLyBbY2ZlXSBUaGlzIHJlcXVpcmVzIHRoZSAndmFyaWFuY2UnIGxhbmd1YWdlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZC4KKyAgQG92ZXJyaWRlCisgIGludCBmb28oVCBiYXIpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorfQorCittaXhpbiBEPG91dCBUPiB7fQorLy8gICAgICBeXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVSSU1FTlRfTk9UX0VOQUJMRUQKKy8vIFtjZmVdIFRoaXMgcmVxdWlyZXMgdGhlICd2YXJpYW5jZScgbGFuZ3VhZ2UgZmVhdHVyZSB0byBiZSBlbmFibGVkLgorCitjbGFzcyBFMSB7fQorCittaXhpbiBFPGluIFQgZXh0ZW5kcyBFMT4ge30KKy8vICAgICAgXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVSSU1FTlRfTk9UX0VOQUJMRUQKKy8vIFtjZmVdIFRoaXMgcmVxdWlyZXMgdGhlICd2YXJpYW5jZScgbGFuZ3VhZ2UgZmVhdHVyZSB0byBiZSBlbmFibGVkLgorCitjbGFzcyBGPG91dCBUPiA9IE9iamVjdCB3aXRoIEQ8VD47CisvLyAgICAgIF5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhQRVJJTUVOVF9OT1RfRU5BQkxFRAorLy8gW2NmZV0gVGhpcyByZXF1aXJlcyB0aGUgJ3ZhcmlhbmNlJyBsYW5ndWFnZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQuCisKK2NsYXNzIEc8b3V0IG91dD4ge30KKy8vICAgICAgXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFUklNRU5UX05PVF9FTkFCTEVECisvLyBbY2ZlXSBUaGlzIHJlcXVpcmVzIHRoZSAndmFyaWFuY2UnIGxhbmd1YWdlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZC4KKworY2xhc3MgSDxvdXQgaW5vdXQ+IHt9CisvLyAgICAgIF5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuRVhQRVJJTUVOVF9OT1RfRU5BQkxFRAorLy8gW2NmZV0gVGhpcyByZXF1aXJlcyB0aGUgJ3ZhcmlhbmNlJyBsYW5ndWFnZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQuCisKK21haW4oKSB7CisgIEI8aW50LCBTdHJpbmcsIGJvb2w+IGIgPSBCKCk7CisKKyAgQzxpbnQ+IGMgPSBDKCk7CisgIEV4cGVjdC5lcXVhbHMoMiwgYy5mb28oMykpOworCisgIEY8aW50PiBmID0gRigpOworCisgIEc8aW50PiBnID0gRygpOworCisgIEg8aW50PiBoID0gSCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX2tleXdvcmRfaWRlbnRpZmllcl9zeW50YXhfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX2tleXdvcmRfaWRlbnRpZmllcl9zeW50YXhfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmYzZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS9zeW50YXgvdmFyaWFuY2Vfa2V5d29yZF9pZGVudGlmaWVyX3N5bnRheF90ZXN0LmRhcnQKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBpZGVudGlmaWVyIHVzYWdlIG9mIGtleXdvcmRzIGBvdXRgIGFuZCBgaW5vdXRgLCBjb3JyZWN0IHVzYWdlIG9mIGBpbmAKKy8vIHdpdGggdGhlIGV4cGVyaW1lbnRhbCBmbGFnIGB2YXJpYW5jZWAgZW5hYmxlZC4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBBPG91dD4ge30KKworY2xhc3MgQjxpbm91dD4ge30KKworY2xhc3MgQzxvdXQsIGlub3V0PiB7fQorCitGPGlub3V0LCBvdXQ+KCkge30KKworbWl4aW4gRzxvdXQsIGlub3V0PiB7fQorCit0eXBlZGVmIEg8aW5vdXQsIG91dD4gPSBvdXQgRnVuY3Rpb24oaW5vdXQpOworCitjbGFzcyBPdXRQYXJhbWV0ZXIgeworICB2YXIgb3V0ID0gMzsKKyAgaW50IGZ1bmMoaW50IG91dCkgeworICAgIHJldHVybiBvdXQ7CisgIH0KK30KKworY2xhc3MgaW5vdXQgeworICB2b2lkIG91dChpbnQgeCkge30KK30KKwordmFyIG91dCA9IDU7CisKK21haW4oKSB7CisgIE91dFBhcmFtZXRlciB4ID0gbmV3IE91dFBhcmFtZXRlcigpOworICBFeHBlY3QuZXF1YWxzKDIsIHguZnVuYygyKSk7CisgIEV4cGVjdC5lcXVhbHMoMywgeC5vdXQpOworCisgIGlub3V0IGZvbyA9IGlub3V0KCk7CisgIGZvby5vdXQoNCk7CisKKyAgRXhwZWN0LmVxdWFscyg1LCBvdXQpOworCisgIHZhciBjb2xsZWN0aW9uID0gWzAsIDEsIDJdOworICBmb3IgKHZhciB4IGluIGNvbGxlY3Rpb24pIHsKKyAgICBFeHBlY3QuaXNUcnVlKHggaXMgaW50KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX3N5bnRheF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS9zeW50YXgvdmFyaWFuY2Vfc3ludGF4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQwOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX3N5bnRheF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2Fic3RyYWN0IGNsYXNzIEE8aW4gWD4geworICBpbnQgZm9vKFggYmFyKTsKK30KKworY2xhc3MgQjxvdXQgWCwgaW4gWSwgaW5vdXQgWj4ge30KKworY2xhc3MgQzxpbiBUPiBleHRlbmRzIEE8VD4geworICBAb3ZlcnJpZGUKKyAgaW50IGZvbyhUIGJhcikgeworICAgIHJldHVybiAyOworICB9Cit9CisKK21peGluIEQ8b3V0IFQ+IHt9CisKK2NsYXNzIEUxIHt9CisKK21peGluIEU8aW4gVCBleHRlbmRzIEUxPiB7fQorCitjbGFzcyBGPG91dCBUPiA9IE9iamVjdCB3aXRoIEQ8VD47CisKK2NsYXNzIEc8b3V0IG91dD4ge30KKworY2xhc3MgSDxvdXQgaW5vdXQ+IHt9CisKK21haW4oKSB7CisgIEI8aW50LCBTdHJpbmcsIGJvb2w+IGIgPSBCKCk7CisKKyAgQzxpbnQ+IGMgPSBDKCk7CisgIEV4cGVjdC5lcXVhbHMoMiwgYy5mb28oMykpOworCisgIEY8aW50PiBmID0gRigpOworCisgIEc8aW50PiBnID0gRygpOworCisgIEg8aW50PiBoID0gSCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX3R5cGVfcGFyYW1ldGVyX2Vycm9yX3N5bnRheF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS9zeW50YXgvdmFyaWFuY2VfdHlwZV9wYXJhbWV0ZXJfZXJyb3Jfc3ludGF4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGMxYWRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2Uvc3ludGF4L3ZhcmlhbmNlX3R5cGVfcGFyYW1ldGVyX2Vycm9yX3N5bnRheF90ZXN0LmRhcnQKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgdXNhZ2VzIG9mIHZhcmlhbmNlIGluIHVuYXBwbGljYWJsZSB0eXBlIHBhcmFtZXRlcnMuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCit2b2lkIEEob3V0IGludCBmb28pIHsKKy8vICAgICBeXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLlVOREVGSU5FRF9DTEFTUworLy8gW2NmZV0gJ291dCcgaXNuJ3QgYSB0eXBlLgorLy8gICAgIF4KKy8vIFtjZmVdIFR5cGUgJ291dCcgbm90IGZvdW5kLgorLy8gICAgICAgICAgICAgXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFQ1RFRF9UT0tFTgorLy8gW2NmZV0gRXhwZWN0ZWQgJyknIGJlZm9yZSB0aGlzLgorICBMaXN0PG91dCBTdHJpbmc+IGJhcjsKKyAgLy8gIF4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLlVOREVGSU5FRF9PUEVSQVRPUgorICAvLyBbY2ZlXSBUaGUgb3BlcmF0b3IgJzwnIGlzbid0IGRlZmluZWQgZm9yIHRoZSBjbGFzcyAnVHlwZScuCisgIC8vICAgXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuVU5ERUZJTkVEX0lERU5USUZJRVIKKyAgLy8gW2NmZV0gRXhwZWN0ZWQgJzsnIGFmdGVyIHRoaXMuCisgIC8vICAgXl5eCisgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVDVEVEX1RPS0VOCisgIC8vIFtjZmVdIEdldHRlciBub3QgZm91bmQ6ICdvdXQnLgorICAvLyAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5VTkRFRklORURfT1BFUkFUT1IKKyAgLy8gW2NmZV0gVGhlIG9wZXJhdG9yICc+JyBpc24ndCBkZWZpbmVkIGZvciB0aGUgY2xhc3MgJ1R5cGUnLgorICAvLyAgICAgICAgICAgICAgIF5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLlVOREVGSU5FRF9JREVOVElGSUVSCisgIC8vIFtjZmVdIEdldHRlciBub3QgZm91bmQ6ICdiYXInLgorfQorCit2b2lkIEIob3V0IGZvbykge30KKy8vICAgICBeXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLlVOREVGSU5FRF9DTEFTUworLy8gW2NmZV0gJ291dCcgaXNuJ3QgYSB0eXBlLgorLy8gICAgIF4KKy8vIFtjZmVdIFR5cGUgJ291dCcgbm90IGZvdW5kLgorCitjbGFzcyBDPGluIG91dCBYLCBvdXQgb3V0IFk+IHt9CisvLyAgICAgICAgIF5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTVVMVElQTEVfVkFSSUFOQ0VfTU9ESUZJRVJTCisvLyBbY2ZlXSBFYWNoIHR5cGUgcGFyYW1ldGVyIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHZhcmlhbmNlIG1vZGlmaWVyLgorLy8gICAgICAgICAgICAgICAgICAgIF5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTVVMVElQTEVfVkFSSUFOQ0VfTU9ESUZJRVJTCisvLyBbY2ZlXSBFYWNoIHR5cGUgcGFyYW1ldGVyIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHZhcmlhbmNlIG1vZGlmaWVyLgorCitjbGFzcyBEPGluIG91dCBpbm91dCBpbiBvdXQgWD4ge30KKy8vICAgICAgICAgXl5eCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5NVUxUSVBMRV9WQVJJQU5DRV9NT0RJRklFUlMKKy8vIFtjZmVdIEVhY2ggdHlwZSBwYXJhbWV0ZXIgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdmFyaWFuY2UgbW9kaWZpZXIuCisvLyAgICAgICAgICAgICBeXl5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTVVMVElQTEVfVkFSSUFOQ0VfTU9ESUZJRVJTCisvLyBbY2ZlXSBFYWNoIHR5cGUgcGFyYW1ldGVyIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHZhcmlhbmNlIG1vZGlmaWVyLgorLy8gICAgICAgICAgICAgICAgICAgXl4KKy8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLk1VTFRJUExFX1ZBUklBTkNFX01PRElGSUVSUworLy8gW2NmZV0gRWFjaCB0eXBlIHBhcmFtZXRlciBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB2YXJpYW5jZSBtb2RpZmllci4KKy8vICAgICAgICAgICAgICAgICAgICAgIF5eXgorLy8gW2FuYWx5emVyXSBTWU5UQUNUSUNfRVJST1IuTVVMVElQTEVfVkFSSUFOQ0VfTU9ESUZJRVJTCisvLyBbY2ZlXSBFYWNoIHR5cGUgcGFyYW1ldGVyIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHZhcmlhbmNlIG1vZGlmaWVyLgorCit0eXBlZGVmIEU8b3V0IFQ+ID0gVCBGdW5jdGlvbihUIGEpOworLy8gICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFQ1RFRF9UT0tFTgorLy8gW2NmZV0gRXhwZWN0ZWQgJywnIGJlZm9yZSB0aGlzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfZG93bndhcmRzX2luZmVyZW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9kb3dud2FyZHNfaW5mZXJlbmNlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmNkMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfZG93bndhcmRzX2luZmVyZW5jZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBkb3dud2FyZHMgaW5mZXJlbmNlIGZvciBleHBsaWNpdCB2YXJpYW5jZSBtb2RpZmllcnMuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitjbGFzcyBBPG91dCBUPiB7CisgIGZpbmFsIFQgX3g7CisgIEEoVCB4KTpfeCA9IHg7CisgIFQgZ2V0IHggPT4gX3g7CisgIHZvaWQgc2V0IHgoT2JqZWN0IHZhbHVlKSB7fQorfQorCitjbGFzcyBCPGluIFQ+IHsKKyAgQihMaXN0PFQ+IHgpOworICB2b2lkIHNldCB4KFQgdmFsKSB7fQorfQorCitjbGFzcyBDPG91dCBULCBTPiB7CisgIGZpbmFsIFQgX3g7CisgIEMoVCB4LCBTIHkpOl94ID0geDsKKyAgVCBnZXQgeCA9PiBfeDsKKyAgdm9pZCBzZXQgeChPYmplY3QgdmFsdWUpIHt9CisgIHZvaWQgc2V0IHkoUyBfdmFsdWUpIHt9Cit9CisKK2NsYXNzIEQ8aW4gVD4geworICBEKFQgeCwgdm9pZCBGdW5jdGlvbihUKSB5KSB7fQorICB2b2lkIHNldCB4KFQgdmFsKSB7fQorfQorCittYWluKCkgeworICAvLyBpbnQgPDogVCA8OiBPYmplY3QKKyAgLy8gQ2hvb3NlIGludAorICBBPE9iamVjdD4gYSA9IG5ldyBBKDMpLi54Kz0xOworCisgIC8vIGludCA8OiBUCisgIC8vIG51bSA8OiBUCisgIC8vIENob29zZSBudW0KKyAgQjxpbnQ+IGIgPSBuZXcgQig8bnVtPltdKS4ueD0yLjI7CisKKyAgLy8gaW50IDw6IFQgPDogT2JqZWN0CisgIC8vIENob29zZSBpbnQKKyAgLy8gaW50IDw6IFMgPDogT2JqZWN0CisgIC8vIENob29zZSBPYmplY3QKKyAgQzxPYmplY3QsIE9iamVjdD4gYyA9IG5ldyBDKDMsIDMpLi54Kz0xLi55PSJoZWxsbyI7CisKKyAgLy8gaW50IDw6IFQgPDogbnVtCisgIC8vIENob29zZSBudW0gZHVlIHRvIGNvbnRyYXZhcmlhbnQgaGV1cmlzdGljLgorICBEPGludD4gZCA9IG5ldyBEKDMsIChudW0geCkge30pLi54PTIuMjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX2ZpZWxkX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX2ZpZWxkX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM0YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fZmllbGRfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgZXJyb25lb3VzIGZpZWxkIHVzYWdlIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIEE8aW4gVD4geworICBmaW5hbCBUIGEgPSB0aHJvdyAidW5jYWxsZWQiOworICAvLyAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgZmluYWwgVCBGdW5jdGlvbigpIGIgPSAoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworICAvLyAgICAgICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICBUIGdldCBjID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL14KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIGxhdGUgVCBkOworLy8gICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIGNvdmFyaWFudCBsYXRlIFQgZTsKKyAgLy8gICAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIFQ/IGYgPSBudWxsOworICAvLyBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorfQorCittaXhpbiBCTWl4aW48aW4gVD4geworICBmaW5hbCBUIGEgPSB0aHJvdyAidW5jYWxsZWQiOworICAvLyAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgZmluYWwgVCBGdW5jdGlvbigpIGIgPSAoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworICAvLyAgICAgICAgICAgICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICBUIGdldCBjID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL14KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIGxhdGUgVCBkOworLy8gICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIGNvdmFyaWFudCBsYXRlIFQgZTsKKyAgLy8gICAgICAgICAgICAgICBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIFQ/IGYgPSBudWxsOworICAvLyBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorfQorCithYnN0cmFjdCBjbGFzcyBDPGluIFQ+IHsKKyAgVCBnZXQgYTsKKy8vXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KK30KKworY2xhc3MgRDxpbiBUPiBleHRlbmRzIEM8VD4geworICB2YXIgYTsKKyAgLy8gIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuTk9UX0lOSVRJQUxJWkVEX05PTl9OVUxMQUJMRV9JTlNUQU5DRV9GSUVMRAorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKyAgLy8gIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gRmllbGQgJ2EnIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWNhdXNlIGl0cyB0eXBlICdUJyBkb2Vzbid0IGFsbG93IG51bGwuCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9maWVsZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9maWVsZF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2MGZiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX2ZpZWxkX3Rlc3QuZGFydApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHZhcmlvdXMgZmllbGRzIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit0eXBlZGVmIEludDJWb2lkID0gdm9pZCBGdW5jdGlvbihpbnQpOworCitjbGFzcyBBPGluIFQ+IHsKKyAgdm9pZCBzZXQgYShUIHZhbHVlKSA9PiB2YWx1ZTsKKyAgZmluYWwgdm9pZCBGdW5jdGlvbihUKSBiID0gKFQgdmFsKSB7CisgICAgRXhwZWN0LmVxdWFscygyLCB2YWwpOworICB9OworICBBPFQ+IGdldCBjID0+IHRoaXM7Cit9CisKK21peGluIEJNaXhpbjxpbiBUPiB7CisgIHZvaWQgc2V0IGEoVCB2YWx1ZSkgPT4gdmFsdWU7CisgIGZpbmFsIHZvaWQgRnVuY3Rpb24oVCkgYiA9IChUIHZhbCkgeworICAgIEV4cGVjdC5lcXVhbHMoMiwgdmFsKTsKKyAgfTsKKyAgQk1peGluPFQ+IGdldCBjID0+IHRoaXM7Cit9CisKK2NsYXNzIEIgd2l0aCBCTWl4aW48aW50PiB7fQorCit2b2lkIHRlc3RDbGFzcygpIHsKKyAgQTxpbnQ+IGEgPSBuZXcgQSgpOworCisgIGEuYSA9IDI7CisKKyAgRXhwZWN0LnR5cGU8SW50MlZvaWQ+KGEuYik7CisgIGEuYigyKTsKKworICBhLmMuYSA9IDI7Cit9CisKK3ZvaWQgdGVzdE1peGluKCkgeworICBCIGIgPSBuZXcgQigpOworCisgIGIuYSA9IDI7CisKKyAgRXhwZWN0LnR5cGU8SW50MlZvaWQ+KGIuYik7CisgIGIuYigyKTsKKworICBiLmMuYSA9IDI7Cit9CisKK21haW4oKSB7CisgIHRlc3RDbGFzcygpOworICB0ZXN0TWl4aW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX2luZmVyZW5jZV9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9pbmZlcmVuY2VfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjIwYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9pbmZlcmVuY2VfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIGxvY2FsIGluZmVyZW5jZSBlcnJvcnMgZm9yIHRoZSBgaW5gIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBFeGFjdGx5PGlub3V0IFQ+IHt9CisKK2NsYXNzIFVwcGVyIHt9CitjbGFzcyBNaWRkbGUgZXh0ZW5kcyBVcHBlciB7fQorY2xhc3MgTG93ZXIgZXh0ZW5kcyBNaWRkbGUge30KKworY2xhc3MgQ29udHJhQm91bmQ8aW4gVD4geworICBDb250cmFCb3VuZChUIHgsIHZvaWQgRnVuY3Rpb24oVCkgeSkge30KK30KKworRXhhY3RseTxUPiBpbmZlckNvdkNvbnRyYTxUPihDb3ZhcmlhbnQ8VD4geCwgQ29udHJhdmFyaWFudDxUPiB5KSA9PiBuZXcgRXhhY3RseTxUPigpOworRXhhY3RseTxUPiBpbmZlckNvbnRyYUNvbnRyYTxUPihDb250cmF2YXJpYW50PFQ+IHgsIENvbnRyYXZhcmlhbnQ8VD4geSkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKK0V4YWN0bHk8VD4gaW5mZXJDb250cmFCb3VuZDxUPihDb250cmFCb3VuZDxUPiB4KSA9PiBuZXcgRXhhY3RseTxUPigpOworCittYWluKCkgeworICBFeGFjdGx5PFVwcGVyPiB1cHBlcjsKKyAgRXhhY3RseTxMb3dlcj4gbG93ZXI7CisKKyAgLy8gVCA8OiBVcHBlciBhbmQgVCA8OiBNaWRkbGUuCisgIC8vIFdlIGNob29zZSBNaWRkbGUuCisgIHZhciBpbmZlcnJlZE1pZGRsZSA9IGluZmVyQ29udHJhQ29udHJhKENvbnRyYXZhcmlhbnQ8VXBwZXI+KCksIENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgdXBwZXIgPSBpbmZlcnJlZE1pZGRsZTsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxNaWRkbGU+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0V4YWN0bHk8VXBwZXI+Jy4KKworICAvLyBUIDw6IFVwcGVyIGFuZCBUIDw6IExvd2VyLgorICAvLyBXZSBjaG9vc2UgTG93ZXIuCisgIHZhciBpbmZlcnJlZExvd2VyID0gaW5mZXJDb250cmFDb250cmEoQ29udHJhdmFyaWFudDxVcHBlcj4oKSwgQ29udHJhdmFyaWFudDxMb3dlcj4oKSk7CisgIHVwcGVyID0gaW5mZXJyZWRMb3dlcjsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PExvd2VyPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PFVwcGVyPicuCisKKyAgLy8gaW50IDw6IFQgPDogU3RyaW5nIGlzIG5vdCBhIHZhbGlkIGNvbnN0cmFpbnQuCisgIGluZmVyQ292Q29udHJhKENvdmFyaWFudDxpbnQ+KCksIENvbnRyYXZhcmlhbnQ8U3RyaW5nPigpKTsKKy8vXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPVUxEX05PVF9JTkZFUgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnQ29udHJhdmFyaWFudDxTdHJpbmc+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0NvbnRyYXZhcmlhbnQ8aW50PicuCisKKyAgLy8gU3RyaW5nIDw6IFQgPDogaW50IGlzIG5vdCBhIHZhbGlkIGNvbnN0cmFpbnQuCisgIGluZmVyQ292Q29udHJhKENvdmFyaWFudDxTdHJpbmc+KCksIENvbnRyYXZhcmlhbnQ8aW50PigpKTsKKy8vXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPVUxEX05PVF9JTkZFUgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnQ29udHJhdmFyaWFudDxpbnQ+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0NvbnRyYXZhcmlhbnQ8U3RyaW5nPicuCisKKyAgLy8gTWlkZGxlIDw6IFQgPDogTG93ZXIgaXMgbm90IGEgdmFsaWQgY29uc3RyYWludAorICBpbmZlckNvdkNvbnRyYShDb3ZhcmlhbnQ8TWlkZGxlPigpLCBDb250cmF2YXJpYW50PExvd2VyPigpKTsKKy8vXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPVUxEX05PVF9JTkZFUgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5JTlZBTElEX0NBU1RfTkVXX0VYUFIKKy8vIFtjZmVdIFRoZSBhcmd1bWVudCB0eXBlICdDb250cmF2YXJpYW50PExvd2VyPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICdDb250cmF2YXJpYW50PE1pZGRsZT4nLgorCisgIC8vIFVwcGVyIDw6IFQgPDogTG93ZXIgaXMgbm90IGEgdmFsaWQgY29uc3RyYWludAorICBpbmZlckNvdkNvbnRyYShDb3ZhcmlhbnQ8VXBwZXI+KCksIENvbnRyYXZhcmlhbnQ8TG93ZXI+KCkpOworLy9eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ09VTERfTk9UX0lORkVSCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9DQVNUX05FV19FWFBSCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnQ29udHJhdmFyaWFudDxMb3dlcj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnQ29udHJhdmFyaWFudDxVcHBlcj4nLgorCisgIC8vIFVwcGVyIDw6IFQgPDogTWlkZGxlIGlzIG5vdCBhIHZhbGlkIGNvbnN0cmFpbnQKKyAgaW5mZXJDb3ZDb250cmEoQ292YXJpYW50PFVwcGVyPigpLCBDb250cmF2YXJpYW50PE1pZGRsZT4oKSk7CisvL15eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT1VMRF9OT1RfSU5GRVIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9DQVNUX05FV19FWFBSCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnQ29udHJhdmFyaWFudDxNaWRkbGU+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0NvbnRyYXZhcmlhbnQ8VXBwZXI+Jy4KKworICAvLyBJbmZlcmVuY2UgZm9yIENvbnRyYWJvdW5kKC4uLikgcHJvZHVjZXMgTG93ZXIgPDogVCA8OiBVcHBlci4KKyAgLy8gU2luY2UgVCBpcyBjb250cmF2YXJpYW50LCB3ZSBjaG9vc2UgVXBwZXIgYXMgdGhlIHNvbHV0aW9uLgorICB2YXIgaW5mZXJyZWRDb250cmFVcHBlciA9IGluZmVyQ29udHJhQm91bmQoQ29udHJhQm91bmQoTG93ZXIoKSwgKFVwcGVyIHgpIHt9KSk7CisgIGxvd2VyID0gaW5mZXJyZWRDb250cmFVcHBlcjsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PFVwcGVyPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PExvd2VyPicuCisKKyAgLy8gSW5mZXJlbmNlIGZvciBDb250cmFib3VuZCguLi4pIHByb2R1Y2VzIExvd2VyIDw6IFQgPDogTWlkZGxlLgorICAvLyBTaW5jZSBUIGlzIGNvbnRyYXZhcmlhbnQsIHdlIGNob29zZSBNaWRkbGUgYXMgdGhlIHNvbHV0aW9uLgorICB2YXIgaW5mZXJyZWRDb250cmFNaWRkbGUgPSBpbmZlckNvbnRyYUJvdW5kKENvbnRyYUJvdW5kKExvd2VyKCksIChNaWRkbGUgeCkge30pKTsKKyAgbG93ZXIgPSBpbmZlcnJlZENvbnRyYU1pZGRsZTsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxNaWRkbGU+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0V4YWN0bHk8TG93ZXI+Jy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX2luZmVyZW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9pbmZlcmVuY2VfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjc3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9pbmZlcmVuY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgbG9jYWwgaW5mZXJlbmNlIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KKworY2xhc3MgRXhhY3RseTxpbm91dCBUPiB7fQorCitjbGFzcyBVcHBlciB7fQorY2xhc3MgTWlkZGxlIGV4dGVuZHMgVXBwZXIge30KK2NsYXNzIExvd2VyIGV4dGVuZHMgTWlkZGxlIHt9CisKK2NsYXNzIENvbnRyYUJvdW5kPGluIFQ+IHsKKyAgQ29udHJhQm91bmQoVCB4LCB2b2lkIEZ1bmN0aW9uKFQpIHkpIHt9Cit9CisKK0V4YWN0bHk8VD4gaW5mZXJDb3ZDb250cmE8VD4oQ292YXJpYW50PFQ+IHgsIENvbnRyYXZhcmlhbnQ8VD4geSkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKK0V4YWN0bHk8VD4gaW5mZXJDb250cmFDb250cmE8VD4oQ29udHJhdmFyaWFudDxUPiB4LCBDb250cmF2YXJpYW50PFQ+IHkpID0+IG5ldyBFeGFjdGx5PFQ+KCk7CitFeGFjdGx5PFQ+IGluZmVyQ29udHJhQm91bmQ8VD4oQ29udHJhQm91bmQ8VD4geCkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKKworbWFpbigpIHsKKyAgRXhhY3RseTxVcHBlcj4gdXBwZXI7CisgIEV4YWN0bHk8TWlkZGxlPiBtaWRkbGU7CisgIEV4YWN0bHk8TG93ZXI+IGxvd2VyOworCisgIC8vIExvd2VyIDw6IFQKKyAgLy8gVCA8OiBMb3dlcgorICAvLyBDaG9vc2UgTG93ZXIgZm9yIExvd2VyIDw6IFQgPDogTG93ZXIKKyAgdmFyIGluZmVycmVkTG93ZXIgPSBpbmZlckNvdkNvbnRyYShDb3ZhcmlhbnQ8TG93ZXI+KCksIENvbnRyYXZhcmlhbnQ8TG93ZXI+KCkpOworICBsb3dlciA9IGluZmVycmVkTG93ZXI7CisKKyAgLy8gTG93ZXIgPDogVAorICAvLyBUIDw6IE1pZGRsZQorICAvLyBDaG9vc2UgTG93ZXIgZm9yIExvd2VyIDw6IFQgPDogTWlkZGxlCisgIHZhciBpbmZlcnJlZExvd2VyMiA9IGluZmVyQ292Q29udHJhKENvdmFyaWFudDxMb3dlcj4oKSwgQ29udHJhdmFyaWFudDxNaWRkbGU+KCkpOworICBsb3dlciA9IGluZmVycmVkTG93ZXIyOworCisgIC8vIExvd2VyIDw6IFQKKyAgLy8gVCA8OiBVcHBlcgorICAvLyBDaG9vc2UgTG93ZXIgZm9yIExvd2VyIDw6IFQgPDogVXBwZXIKKyAgdmFyIGluZmVycmVkTG93ZXIzID0gaW5mZXJDb3ZDb250cmEoQ292YXJpYW50PExvd2VyPigpLCBDb250cmF2YXJpYW50PFVwcGVyPigpKTsKKyAgbG93ZXIgPSBpbmZlcnJlZExvd2VyMzsKKworICAvLyBUIDw6IFVwcGVyCisgIC8vIFQgPDogTWlkZGxlCisgIC8vIENob29zZSBNaWRkbGUgc2luY2UgaXQgaXMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIG9mIFVwcGVyIGFuZCBNaWRkbGUuCisgIHZhciBpbmZlcnJlZE1pZGRsZSA9IGluZmVyQ29udHJhQ29udHJhKENvbnRyYXZhcmlhbnQ8VXBwZXI+KCksIENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgbWlkZGxlID0gaW5mZXJyZWRNaWRkbGU7CisKKyAgLy8gVCA8OiBVcHBlcgorICAvLyBUIDw6IExvd2VyCisgIC8vIENob29zZSBMb3dlciBzaW5jZSBpdCBpcyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgb2YgVXBwZXIgYW5kIExvd2VyLgorICB2YXIgaW5mZXJyZWRMb3dlcjQgPSBpbmZlckNvbnRyYUNvbnRyYShDb250cmF2YXJpYW50PExvd2VyPigpLCBDb250cmF2YXJpYW50PFVwcGVyPigpKTsKKyAgbG93ZXIgPSBpbmZlcnJlZExvd2VyNDsKKworICAvLyBUIDw6IE1pZGRsZQorICAvLyBUIDw6IExvd2VyCisgIC8vIENob29zZSBMb3dlciBzaW5jZSBpdCBpcyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgb2YgTWlkZGxlIGFuZCBMb3dlci4KKyAgdmFyIGluZmVycmVkTG93ZXI1ID0gaW5mZXJDb250cmFDb250cmEoQ29udHJhdmFyaWFudDxMb3dlcj4oKSwgQ29udHJhdmFyaWFudDxNaWRkbGU+KCkpOworICBsb3dlciA9IGluZmVycmVkTG93ZXI1OworCisgIC8vIExvd2VyIDw6IFQgPDogVXBwZXIKKyAgLy8gQ2hvb3NlIFVwcGVyLgorICB2YXIgaW5mZXJyZWRDb250cmFVcHBlciA9IGluZmVyQ29udHJhQm91bmQoQ29udHJhQm91bmQoTG93ZXIoKSwgKFVwcGVyIHgpIHt9KSk7CisgIHVwcGVyID0gaW5mZXJyZWRDb250cmFVcHBlcjsKKworICAvLyBMb3dlciA8OiBUIDw6IE1pZGRsZQorICAvLyBDaG9vc2UgTWlkZGxlLgorICB2YXIgaW5mZXJyZWRDb250cmFNaWRkbGUgPSBpbmZlckNvbnRyYUJvdW5kKENvbnRyYUJvdW5kKExvd2VyKCksIChNaWRkbGUgeCkge30pKTsKKyAgbWlkZGxlID0gaW5mZXJyZWRDb250cmFNaWRkbGU7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9tZXRob2RfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fbWV0aG9kX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY1NjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fbWV0aG9kX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDM0OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgbWV0aG9kIHNpZ25hdHVyZXMgYW5kIHJldHVybiB0eXBlcyBmb3IgdGhlIGBpbmAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCit0eXBlZGVmIEludjxUPiA9IHZvaWQgRnVuY3Rpb248WCBleHRlbmRzIFQ+KCk7Cit0eXBlZGVmIENvdjxUPiA9IFQgRnVuY3Rpb24oKTsKK3R5cGVkZWYgQ29udHJhPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKKworY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorY2xhc3MgSW52YXJpYW50PGlub3V0IFQ+IHt9CisKK2NsYXNzIEE8aW4gVD4geworICBUIG1ldGhvZDEoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworLy9eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgdm9pZCBtZXRob2QyKENvbnRyYTxUPiB4KSB7fQorICAvLyAgICAgICAgICAgXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIENvdjxUPiBtZXRob2QzKCkgeworLy9eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorICAgIHJldHVybiAoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworICB9CisKKyAgdm9pZCBtZXRob2Q0KENvbnRyYTxDb3Y8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kNShDb3Y8Q29udHJhPFQ+PiB4KSB7fQorICAvLyAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICBDb250cmE8Q29udHJhPFQ+PiBtZXRob2Q2KCkgPT4gKENvbnRyYTxUPiB4KSB7fTsKKy8vXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgQ292PENvdjxUPj4gbWV0aG9kNygpIHsKKy8vXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuICgpIHsKKyAgICAgIHJldHVybiAoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworICAgIH07CisgIH0KKworICBJbnY8VD4gbWV0aG9kOCgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL15eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDkoSW52PFQ+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICBDb3ZhcmlhbnQ8VD4gbWV0aG9kMTAoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworLy9eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDExKENvbnRyYXZhcmlhbnQ8VD4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgSW52YXJpYW50PFQ+IG1ldGhvZDEyKCkgPT4gdGhyb3cgInVuY2FsbGVkIjsKKy8vXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDEzKEludmFyaWFudDxUPiB4KSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE0KENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PFQ+PiB4KSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QxNShDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4gbWV0aG9kMTYoKSA9PiBDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+KCk7CisvL15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgQ292YXJpYW50PENvdmFyaWFudDxUPj4gbWV0aG9kMTcoKSA9PiBDb3ZhcmlhbnQ8Q292YXJpYW50PFQ+PigpOworLy9eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgdm9pZCBtZXRob2QxODxYIGV4dGVuZHMgVD4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QxOTxYIGV4dGVuZHMgQ292PFQ+PigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjA8WCBleHRlbmRzIENvdmFyaWFudDxUPj4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIxKHtyZXF1aXJlZCBDb250cmE8VD4geH0pIHt9CisgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjIoe3JlcXVpcmVkIENvbnRyYXZhcmlhbnQ8VD4geH0pIHt9CisgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMyh7cmVxdWlyZWQgQ292YXJpYW50PFQ+IHgsIHJlcXVpcmVkIENvbnRyYXZhcmlhbnQ8VD4geX0pIHt9CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDI0PFggZXh0ZW5kcyBDb250cmE8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyNTxYIGV4dGVuZHMgQ29udHJhdmFyaWFudDxUPj4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCit9CisKK21peGluIEJNaXhpbjxpbiBUPiB7CisgIFQgbWV0aG9kMSgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL14KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDIoQ29udHJhPFQ+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgQ292PFQ+IG1ldGhvZDMoKSB7CisvL15eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuICgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisgIH0KKworICB2b2lkIG1ldGhvZDQoQ29udHJhPENvdjxUPj4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2Q1KENvdjxDb250cmE8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIENvbnRyYTxDb250cmE8VD4+IG1ldGhvZDYoKSA9PiAoQ29udHJhPFQ+IHgpIHt9OworLy9eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICBDb3Y8Q292PFQ+PiBtZXRob2Q3KCkgeworLy9eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKyAgICByZXR1cm4gKCkgeworICAgICAgcmV0dXJuICgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisgICAgfTsKKyAgfQorCisgIEludjxUPiBtZXRob2Q4KCkgPT4gdGhyb3cgInVuY2FsbGVkIjsKKy8vXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kOShJbnY8VD4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIENvdmFyaWFudDxUPiBtZXRob2QxMCgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kMTEoQ29udHJhdmFyaWFudDxUPiB4KSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICBJbnZhcmlhbnQ8VD4gbWV0aG9kMTIoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworLy9eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kMTMoSW52YXJpYW50PFQ+IHgpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMTQoQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE1KENvdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PiB4KSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgQ29udHJhdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PiBtZXRob2QxNigpID0+IENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4oKTsKKy8vXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICBDb3ZhcmlhbnQ8Q292YXJpYW50PFQ+PiBtZXRob2QxNygpID0+IENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+KCk7CisvL15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDE4PFggZXh0ZW5kcyBUPigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE5PFggZXh0ZW5kcyBDb3Y8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMDxYIGV4dGVuZHMgQ292YXJpYW50PFQ+PigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjEoe3JlcXVpcmVkIENvbnRyYTxUPiB4fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMih7cmVxdWlyZWQgQ29udHJhdmFyaWFudDxUPiB4fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIzKHtyZXF1aXJlZCBDb3ZhcmlhbnQ8VD4geCwgcmVxdWlyZWQgQ29udHJhdmFyaWFudDxUPiB5fSkge30KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjQ8WCBleHRlbmRzIENvbnRyYTxUPj4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDI1PFggZXh0ZW5kcyBDb250cmF2YXJpYW50PFQ+PigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KK30KKworY2xhc3MgQjxpbiBUPiB7CisgIHZvaWQgbWV0aG9kMShBPFQ+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbi4KKyAgQ29udHJhPEE8VD4+IG1ldGhvZDIoKSB7CisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgdGhyb3cgInVuY2FsbGVkIjsKKyAgfQorfQorCitjbGFzcyBDPFQ+IHsKKyAgdm9pZCBtZXRob2QoVCB4KSB7fQorfQorCitjbGFzcyBEPGluIFQ+IGV4dGVuZHMgQzx2b2lkIEZ1bmN0aW9uKFQpPiB7CisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZCh2b2lkIEZ1bmN0aW9uKFQpIHgpIHt9CisgIC8vICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24uCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9tZXRob2RfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fbWV0aG9kX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk0OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fbWV0aG9kX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0NiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBtZXRob2Qgc2lnbmF0dXJlcyBhbmQgcmV0dXJuIHR5cGVzIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit0eXBlZGVmIENvdjxUPiA9IFQgRnVuY3Rpb24oKTsKK3R5cGVkZWYgQ29udHJhPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKKworQ292PGludD4gY292RnVuY3Rpb24gPSAoKSA9PiAyOworQ29udHJhPGludD4gY29udHJhRnVuY3Rpb24gPSAoaW50IHZhbCkge307CisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KKworY2xhc3MgQTxpbiBUPiB7CisgIHZvaWQgbWV0aG9kMShUIHgpIHt9CisgIHZvaWQgbWV0aG9kMihDb3Y8VD4geCkge30KKyAgQ29udHJhPFQ+IG1ldGhvZDMoKSB7CisgICAgcmV0dXJuIChUIHZhbCkgeworICAgICAgRXhwZWN0LmVxdWFscygyLCB2YWwpOworICAgIH07CisgIH0KKworICB2b2lkIG1ldGhvZDQoQ292PENvdjxUPj4geCkge30KKyAgQ29udHJhPENvdjxUPj4gbWV0aG9kNSgpIHsKKyAgICByZXR1cm4gKENvdjxUPiBtZXRob2QpIHsKKyAgICAgIEV4cGVjdC50eXBlPENvdjxUPj4obWV0aG9kKTsKKyAgICB9OworICB9CisgIENvdjxDb250cmE8VD4+IG1ldGhvZDYoKSB7CisgICAgcmV0dXJuICgpIHsKKyAgICAgIHJldHVybiAoVCB4KSB7CisgICAgICAgIEV4cGVjdC5lcXVhbHMoMiwgeCk7CisgICAgICB9OworICAgIH07CisgIH0KKyAgdm9pZCBtZXRob2Q3KENvbnRyYTxDb250cmE8VD4+IHgpIHt9CisKKyAgdm9pZCBtZXRob2Q4KENvdmFyaWFudDxUPiB4KSB7fQorICBDb250cmF2YXJpYW50PFQ+PyBtZXRob2Q5KCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QxMChDb3ZhcmlhbnQ8Q292YXJpYW50PFQ+PiB4KSB7fQorICBDb250cmF2YXJpYW50PENvdmFyaWFudDxUPj4/IG1ldGhvZDExKCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QxMihDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHgpIHt9CisgIENvdmFyaWFudDxDb250cmF2YXJpYW50PFQ+Pj8gbWV0aG9kMTMoKSA9PiBudWxsOworCisgIHZvaWQgbWV0aG9kMTQoY292YXJpYW50IFQgeCkge30KKyAgdm9pZCBtZXRob2QxNShjb3ZhcmlhbnQgQ29udHJhPFQ+IHgpIHt9CisgIHZvaWQgbWV0aG9kMTYoY292YXJpYW50IENvdjxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE3KGNvdmFyaWFudCBDb250cmF2YXJpYW50PFQ+IHgpIHt9CisgIHZvaWQgbWV0aG9kMTgoY292YXJpYW50IENvdmFyaWFudDxUPiB4KSB7fQorCisgIHZvaWQgbWV0aG9kMTkoe1Q/IHh9KSB7fQorICB2b2lkIG1ldGhvZDIwKHtDb3ZhcmlhbnQ8VD4/IHh9KSB7fQorICB2b2lkIG1ldGhvZDIxKHtDb3Y8VD4/IHh9KSB7fQorfQorCittaXhpbiBCTWl4aW48aW4gVD4geworICB2b2lkIG1ldGhvZDEoVCB4KSB7fQorICB2b2lkIG1ldGhvZDIoQ292PFQ+IHgpIHt9CisgIENvbnRyYTxUPiBtZXRob2QzKCkgeworICAgIHJldHVybiAoVCB2YWwpIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMiwgdmFsKTsKKyAgICB9OworICB9CisKKyAgdm9pZCBtZXRob2Q0KENvdjxDb3Y8VD4+IHgpIHt9CisgIENvbnRyYTxDb3Y8VD4+IG1ldGhvZDUoKSB7CisgICAgcmV0dXJuIChDb3Y8VD4gbWV0aG9kKSB7CisgICAgICBFeHBlY3QudHlwZTxDb3Y8VD4+KG1ldGhvZCk7CisgICAgfTsKKyAgfQorICBDb3Y8Q29udHJhPFQ+PiBtZXRob2Q2KCkgeworICAgIHJldHVybiAoKSB7CisgICAgICByZXR1cm4gKFQgeCkgeworICAgICAgICBFeHBlY3QuZXF1YWxzKDIsIHgpOworICAgICAgfTsKKyAgICB9OworICB9CisgIHZvaWQgbWV0aG9kNyhDb250cmE8Q29udHJhPFQ+PiB4KSB7fQorCisgIHZvaWQgbWV0aG9kOChDb3ZhcmlhbnQ8VD4geCkge30KKyAgQ29udHJhdmFyaWFudDxUPj8gbWV0aG9kOSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTAoQ292YXJpYW50PENvdmFyaWFudDxUPj4geCkge30KKyAgQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+PyBtZXRob2QxMSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTIoQ29udHJhdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PiB4KSB7fQorICBDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4/IG1ldGhvZDEzKCkgPT4gbnVsbDsKKworICB2b2lkIG1ldGhvZDE0KGNvdmFyaWFudCBUIHgpIHt9CisgIHZvaWQgbWV0aG9kMTUoY292YXJpYW50IENvbnRyYTxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE2KGNvdmFyaWFudCBDb3Y8VD4geCkge30KKyAgdm9pZCBtZXRob2QxNyhjb3ZhcmlhbnQgQ29udHJhdmFyaWFudDxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE4KGNvdmFyaWFudCBDb3ZhcmlhbnQ8VD4geCkge30KKworICB2b2lkIG1ldGhvZDE5KHtUPyB4fSkge30KKyAgdm9pZCBtZXRob2QyMCh7Q292YXJpYW50PFQ+PyB4fSkge30KKyAgdm9pZCBtZXRob2QyMSh7Q292PFQ+PyB4fSkge30KK30KKworY2xhc3MgQiB3aXRoIEJNaXhpbjxpbnQ+IHt9CisKK2NsYXNzIEM8aW4gVD4geworICB2b2lkIG1ldGhvZDEoQ29udHJhPEE8VD4+IHgpIHt9CisgIEE8VD4gbWV0aG9kMigpIHsKKyAgICByZXR1cm4gQTxUPigpOworICB9Cit9CisKK2NsYXNzIEQ8VD4geworICBsYXRlIFQgeDsKKyAgVD8gbWV0aG9kKCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QyKFQgeCkge30KKyAgdm9pZCBtZXRob2QzKGNvdmFyaWFudCBUIHgpIHt9Cit9CisKK2NsYXNzIEU8aW4gVD4gZXh0ZW5kcyBEPHZvaWQgRnVuY3Rpb24oVCk+IHsKKyAgQG92ZXJyaWRlCisgIHZvaWQgRnVuY3Rpb24oVCkgbWV0aG9kKCkgPT4gKFQgeCkge307CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMyhjb3ZhcmlhbnQgdm9pZCBGdW5jdGlvbihUKSB4KSB7fQorfQorCit2b2lkIHRlc3RDbGFzcygpIHsKKyAgQTxpbnQ+IGEgPSBuZXcgQSgpOworCisgIGEubWV0aG9kMSgyKTsKKworICBhLm1ldGhvZDIoY292RnVuY3Rpb24pOworCisgIEV4cGVjdC50eXBlPENvbnRyYTxpbnQ+PihhLm1ldGhvZDMoKSk7CisgIENvbnRyYTxpbnQ+IG1ldGhvZDNGdW5jdGlvbiA9IGEubWV0aG9kMygpOworICBtZXRob2QzRnVuY3Rpb24oMik7CisKKyAgYS5tZXRob2Q0KCgpIHsKKyAgICByZXR1cm4gY292RnVuY3Rpb247CisgIH0pOworCisgIEV4cGVjdC50eXBlPENvbnRyYTxDb3Y8aW50Pj4+KGEubWV0aG9kNSgpKTsKKyAgQ29udHJhPENvdjxpbnQ+PiBtZXRob2Q1RnVuY3Rpb24gPSBhLm1ldGhvZDUoKTsKKyAgbWV0aG9kNUZ1bmN0aW9uKGNvdkZ1bmN0aW9uKTsKKworICBFeHBlY3QudHlwZTxDb3Y8Q29udHJhPGludD4+PihhLm1ldGhvZDYoKSk7CisgIENvdjxDb250cmE8aW50Pj4gbWV0aG9kNkZ1bmN0aW9uID0gYS5tZXRob2Q2KCk7CisgIEV4cGVjdC50eXBlPENvbnRyYTxpbnQ+PihtZXRob2Q2RnVuY3Rpb24oKSk7CisgIENvbnRyYTxpbnQ+IG1ldGhvZDZOZXN0ZWRGdW5jdGlvbiA9IG1ldGhvZDZGdW5jdGlvbigpOworICBtZXRob2Q2TmVzdGVkRnVuY3Rpb24oMik7CisKKyAgYS5tZXRob2Q3KChDb250cmE8aW50PiB4KSB7fSk7CisKKyAgYS5tZXRob2Q4KENvdmFyaWFudDxpbnQ+KCkpOworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kOSgpKTsKKyAgYS5tZXRob2QxMChDb3ZhcmlhbnQ8Q292YXJpYW50PGludD4+KCkpOworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kMTEoKSk7CisgIGEubWV0aG9kMTIoQ29udHJhdmFyaWFudDxDb250cmF2YXJpYW50PGludD4+KCkpOworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kMTMoKSk7CisKKyAgYS5tZXRob2QxNCgzKTsKKyAgYS5tZXRob2QxNShjb250cmFGdW5jdGlvbik7CisgIGEubWV0aG9kMTYoY292RnVuY3Rpb24pOworICBhLm1ldGhvZDE3KENvbnRyYXZhcmlhbnQ8aW50PigpKTsKKyAgYS5tZXRob2QxOChDb3ZhcmlhbnQ8aW50PigpKTsKKworICBhLm1ldGhvZDE5KCk7CisgIGEubWV0aG9kMjAoKTsKKyAgYS5tZXRob2QyMSgpOworfQorCit2b2lkIHRlc3RNaXhpbigpIHsKKyAgQiBiID0gbmV3IEIoKTsKKworICBiLm1ldGhvZDEoMik7CisKKyAgYi5tZXRob2QyKGNvdkZ1bmN0aW9uKTsKKworICBFeHBlY3QudHlwZTxDb250cmE8aW50Pj4oYi5tZXRob2QzKCkpOworICBDb250cmE8aW50PiBtZXRob2QzUmV0dXJuID0gYi5tZXRob2QzKCk7CisgIG1ldGhvZDNSZXR1cm4oMik7CisKKyAgYi5tZXRob2Q0KCgpIHsKKyAgICByZXR1cm4gY292RnVuY3Rpb247CisgIH0pOworCisgIEV4cGVjdC50eXBlPENvbnRyYTxDb3Y8aW50Pj4+KGIubWV0aG9kNSgpKTsKKyAgQ29udHJhPENvdjxpbnQ+PiBtZXRob2Q1UmV0dXJuID0gYi5tZXRob2Q1KCk7CisgIG1ldGhvZDVSZXR1cm4oY292RnVuY3Rpb24pOworCisgIEV4cGVjdC50eXBlPENvdjxDb250cmE8aW50Pj4+KGIubWV0aG9kNigpKTsKKyAgQ292PENvbnRyYTxpbnQ+PiBtZXRob2Q2RnVuY3Rpb24gPSBiLm1ldGhvZDYoKTsKKyAgRXhwZWN0LnR5cGU8Q29udHJhPGludD4+KG1ldGhvZDZGdW5jdGlvbigpKTsKKyAgQ29udHJhPGludD4gbWV0aG9kNk5lc3RlZEZ1bmN0aW9uID0gbWV0aG9kNkZ1bmN0aW9uKCk7CisgIG1ldGhvZDZOZXN0ZWRGdW5jdGlvbigyKTsKKworICBiLm1ldGhvZDcoKENvbnRyYTxpbnQ+IHgpIHt9KTsKKworICBiLm1ldGhvZDgoQ292YXJpYW50PGludD4oKSk7CisgIEV4cGVjdC5pc051bGwoYi5tZXRob2Q5KCkpOworICBiLm1ldGhvZDEwKENvdmFyaWFudDxDb3ZhcmlhbnQ8aW50Pj4oKSk7CisgIEV4cGVjdC5pc051bGwoYi5tZXRob2QxMSgpKTsKKyAgYi5tZXRob2QxMihDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8aW50Pj4oKSk7CisgIEV4cGVjdC5pc051bGwoYi5tZXRob2QxMygpKTsKKworICBiLm1ldGhvZDE0KDMpOworICBiLm1ldGhvZDE1KGNvbnRyYUZ1bmN0aW9uKTsKKyAgYi5tZXRob2QxNihjb3ZGdW5jdGlvbik7CisgIGIubWV0aG9kMTcoQ29udHJhdmFyaWFudDxpbnQ+KCkpOworICBiLm1ldGhvZDE4KENvdmFyaWFudDxpbnQ+KCkpOworCisgIGIubWV0aG9kMTkoKTsKKyAgYi5tZXRob2QyMCgpOworICBiLm1ldGhvZDIxKCk7Cit9CisKK3ZvaWQgdGVzdENsYXNzSW5NZXRob2RzKCkgeworICBDPGludD4gYyA9IG5ldyBDKCk7CisKKyAgYy5tZXRob2QxKChBPGludD4geCkge30pOworCisgIEV4cGVjdC50eXBlPEE8aW50Pj4oYy5tZXRob2QyKCkpOworfQorCit2b2lkIHRlc3RPdmVycmlkZUxlZ2FjeU1ldGhvZHMoKSB7CisgIEU8aW50PiBlID0gbmV3IEUoKTsKKyAgRXhwZWN0LmlzVHJ1ZShlLm1ldGhvZCgpIGlzIEZ1bmN0aW9uKTsKKyAgZS5tZXRob2QyKGNvbnRyYUZ1bmN0aW9uKTsKKyAgZS5tZXRob2QzKGNvbnRyYUZ1bmN0aW9uKTsKKyAgZS54ID0gY29udHJhRnVuY3Rpb247CisKKyAgRDxPYmplY3Q+IGQgPSBlOworICBFeHBlY3QudGhyb3dzKCgpID0+IGQueCA9ICJ0ZXN0Iik7CisKKyAgZSA9IG5ldyBFPE9iamVjdD4oKTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiBlLm1ldGhvZDIoY29udHJhRnVuY3Rpb24pKTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiBlLm1ldGhvZDMoY29udHJhRnVuY3Rpb24pKTsKK30KKworbWFpbigpIHsKKyAgdGVzdENsYXNzKCk7CisgIHRlc3RNaXhpbigpOworICB0ZXN0Q2xhc3NJbk1ldGhvZHMoKTsKKyAgdGVzdE92ZXJyaWRlTGVnYWN5TWV0aG9kcygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fc3ViY2xhc3NfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fc3ViY2xhc3NfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyM2IzZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9zdWJjbGFzc19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNDQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgZXJyb25lb3VzIHN1YmNsYXNzIHVzYWdlIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK3R5cGVkZWYgQ292RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKCk7Cit0eXBlZGVmIENvbnRyYUZ1bmN0aW9uPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKK3R5cGVkZWYgSW52RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKFQpOworCitjbGFzcyBMZWdhY3lDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorbWl4aW4gTUxlZ2FjeUNvdmFyaWFudDxUPiB7fQorbWl4aW4gTUNvdmFyaWFudDxvdXQgVD4ge30KK21peGluIE1Db250cmF2YXJpYW50PGluIFQ+IHt9CittaXhpbiBNSW52YXJpYW50PGlub3V0IFQ+IHt9CisKK2NsYXNzIEE8aW4gVD4gZXh0ZW5kcyBMZWdhY3lDb3ZhcmlhbnQ8VD4ge30KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTGVnYWN5Q292YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgQjxpbiBUPiBpbXBsZW1lbnRzIExlZ2FjeUNvdmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdMZWdhY3lDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBDPGluIFQ+IHdpdGggTUxlZ2FjeUNvdmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNTGVnYWN5Q292YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgRDxpbiBUPiBleHRlbmRzIENvdmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBFPGluIFQ+IGltcGxlbWVudHMgQ292YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEY8aW4gVD4gd2l0aCBNQ292YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ01Db3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBHPGluIFQ+IGV4dGVuZHMgSW52YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnSW52YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgSDxpbiBUPiBpbXBsZW1lbnRzIEludmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0ludmFyaWFudCcuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEk8aW4gVD4gd2l0aCBNSW52YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTUludmFyaWFudCcuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEo8aW4gVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q292YXJpYW50PFQ+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBLPGluIFQ+IGV4dGVuZHMgQ29udHJhdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb250cmF2YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgTDxpbiBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZGdW5jdGlvbjxUPj4ge30KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnQ292YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgTTxpbiBUPiBleHRlbmRzIENvdmFyaWFudDxDb250cmFGdW5jdGlvbjxDb250cmFGdW5jdGlvbjxUPj4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIE48aW4gVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PENvdkZ1bmN0aW9uPENvbnRyYXZhcmlhbnQ8VD4+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb250cmF2YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgTzxpbiBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZGdW5jdGlvbjxDb3ZhcmlhbnQ8VD4+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBQPGluIFQ+IGV4dGVuZHMgQ292YXJpYW50PENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBRPGluIFQ+IGV4dGVuZHMgSW52YXJpYW50PEludkZ1bmN0aW9uPFQ+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0ludmFyaWFudCcuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIFI8aW4gVD4gPSBDb3ZhcmlhbnQ8VD4gd2l0aCBNQ29udHJhdmFyaWFudDxUPjsKKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdvdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnQ292YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgUzxpbiBUPiA9IENvbnRyYXZhcmlhbnQ8VD4gd2l0aCBNQ292YXJpYW50PFQ+OworLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNQ292YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgVDxpbiBYPiA9IEludmFyaWFudDxYPiB3aXRoIE1JbnZhcmlhbnQ8WD47CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdYJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnSW52YXJpYW50Jy4KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnaW4nIHR5cGUgdmFyaWFibGUgJ1gnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNSW52YXJpYW50Jy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX3N1YmNsYXNzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX3N1YmNsYXNzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2EzMTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fc3ViY2xhc3NfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgc3ViY2xhc3MgdXNhZ2UgZm9yIHRoZSBgaW5gIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKwordHlwZWRlZiBDb3ZGdW5jdGlvbjxUPiA9IFQgRnVuY3Rpb24oKTsKK3R5cGVkZWYgQ29udHJhRnVuY3Rpb248VD4gPSB2b2lkIEZ1bmN0aW9uKFQpOworCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CitjbGFzcyBDb250cmF2YXJpYW50PGluIFQ+IHt9CittaXhpbiBNQ29udHJhdmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBBPGluIFQ+IGV4dGVuZHMgQ29udHJhdmFyaWFudDxUPiB7fQorY2xhc3MgQjxpbiBUPiBpbXBsZW1lbnRzIENvbnRyYXZhcmlhbnQ8VD4ge30KK2NsYXNzIEM8aW4gVD4gd2l0aCBNQ29udHJhdmFyaWFudDxUPiB7fQorCitjbGFzcyBEPGluIFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHt9CitjbGFzcyBFPGluIFQ+IGV4dGVuZHMgQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHt9CisKK2NsYXNzIEY8aW4gVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q29udHJhRnVuY3Rpb248VD4+IHt9CitjbGFzcyBHPGluIFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYUZ1bmN0aW9uPENvdkZ1bmN0aW9uPFQ+Pj4ge30KK2NsYXNzIEg8aW4gVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q292RnVuY3Rpb248Q29udHJhRnVuY3Rpb248VD4+PiB7fQorCitjbGFzcyBJPGluIFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYUZ1bmN0aW9uPENvdmFyaWFudDxUPj4+IHt9CisKK2NsYXNzIEo8aW4gVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4+IHt9CisKK2NsYXNzIEs8aW4gVD4gPSBDb250cmF2YXJpYW50PFQ+IHdpdGggTUNvbnRyYXZhcmlhbnQ8VD47CitjbGFzcyBMPGluIFQ+ID0gQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHdpdGggTUNvbnRyYXZhcmlhbnQ8VD47CitjbGFzcyBNPGluIFQ+ID0gQ29udHJhdmFyaWFudDxUPiB3aXRoIE1Db250cmF2YXJpYW50PENvdmFyaWFudDxUPj47CisKK21haW4oKSB7CisgIEE8bnVtPiBhID0gQSgpOworICBCPG51bT4gYiA9IEIoKTsKKyAgQzxudW0+IGMgPSBDKCk7CisgIEQ8bnVtPiBkID0gRCgpOworICBFPG51bT4gZSA9IEUoKTsKKyAgRjxudW0+IGYgPSBGKCk7CisgIEc8bnVtPiBnID0gRygpOworICBIPG51bT4gaCA9IEgoKTsKKyAgSTxudW0+IGkgPSBJKCk7CisgIEo8bnVtPiBqID0gSigpOworICBLPG51bT4gayA9IEsoKTsKKyAgTDxudW0+IGwgPSBMKCk7CisgIE08bnVtPiBtID0gTSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5fc3VidHlwaW5nX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2OTdjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgc3VidHlwaW5nIGZvciB0aGUgYGluYCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KKworY2xhc3MgVXBwZXIge30KK2NsYXNzIE1pZGRsZSBleHRlbmRzIFVwcGVyIHt9CitjbGFzcyBMb3dlciBleHRlbmRzIE1pZGRsZSB7fQorCitjbGFzcyBBIHsKKyAgQ29udHJhdmFyaWFudDxNaWRkbGU+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBDb250cmF2YXJpYW50PE1pZGRsZT4oKTsKKyAgfQorCisgIHZvaWQgbWV0aG9kMihDb250cmF2YXJpYW50PE1pZGRsZT4geCkge30KK30KKworY2xhc3MgQiBleHRlbmRzIEEgeworICBAb3ZlcnJpZGUKKyAgQ29udHJhdmFyaWFudDxMb3dlcj4gbWV0aG9kMSgpIHsKKyAgLy8gICAgICAgICAgICAgICAgICAgXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5JTlZBTElEX09WRVJSSURFCisgIC8vIFtjZmVdIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICdCLm1ldGhvZDEnIGlzICdDb250cmF2YXJpYW50PExvd2VyPicsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJ0NvbnRyYXZhcmlhbnQ8TWlkZGxlPicsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJ0EubWV0aG9kMScuCisgICAgcmV0dXJuIG5ldyBDb250cmF2YXJpYW50PExvd2VyPigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihDb250cmF2YXJpYW50PFVwcGVyPiB4KSB7fQorICAvLyAgIF5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9PVkVSUklERQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUaGUgcGFyYW1ldGVyICd4JyBvZiB0aGUgbWV0aG9kICdCLm1ldGhvZDInIGhhcyB0eXBlICdDb250cmF2YXJpYW50PFVwcGVyPicsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICdDb250cmF2YXJpYW50PE1pZGRsZT4nLCBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICdBLm1ldGhvZDInLgorfQorCitjbGFzcyBDPG91dCBUIGV4dGVuZHMgQ29udHJhdmFyaWFudDxNaWRkbGU+PiB7fQorCitjbGFzcyBEIHsKKyAgQzxDb250cmF2YXJpYW50PExvd2VyPj4gbWV0aG9kMSgpIHsKKyAgLy9eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gVHlwZSBhcmd1bWVudCAnQ29udHJhdmFyaWFudDxMb3dlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0NvbnRyYXZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdDJyBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuIEM8Q29udHJhdmFyaWFudDxMb3dlcj4+KCk7CisgICAgLy8gICAgIF4KKyAgICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdDb250cmF2YXJpYW50PExvd2VyPicgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnQ29udHJhdmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0MnLgorICAgIC8vICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eCisgICAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTCisgIH0KK30KKwordm9pZCB0ZXN0Q2FsbChJdGVyYWJsZTxDb250cmF2YXJpYW50PE1pZGRsZT4+IHgpIHt9CisKK21haW4oKSB7CisgIEM8Q29udHJhdmFyaWFudDxMb3dlcj4+IGMgPSBuZXcgQzxDb250cmF2YXJpYW50PExvd2VyPj4oKTsKKyAgLy9eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdDb250cmF2YXJpYW50PExvd2VyPicgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnQ29udHJhdmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0MnLgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gVHlwZSBhcmd1bWVudCAnQ29udHJhdmFyaWFudDxMb3dlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0NvbnRyYXZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdDJy4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUworCisgIEl0ZXJhYmxlPENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4gaXRlcmFibGVNaWRkbGUgPSBbbmV3IENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpXTsKKyAgTGlzdDxDb250cmF2YXJpYW50PExvd2VyPj4gbGlzdExvd2VyID0gW25ldyBDb250cmF2YXJpYW50PExvd2VyPigpXTsKKyAgaXRlcmFibGVNaWRkbGUgPSBsaXN0TG93ZXI7CisgIC8vICAgICAgICAgICAgICAgXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdMaXN0PENvbnRyYXZhcmlhbnQ8TG93ZXI+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdJdGVyYWJsZTxDb250cmF2YXJpYW50PE1pZGRsZT4+Jy4KKworICB0ZXN0Q2FsbChsaXN0TG93ZXIpOworICAvLyAgICAgICBeXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisgIC8vIFtjZmVdIFRoZSBhcmd1bWVudCB0eXBlICdMaXN0PENvbnRyYXZhcmlhbnQ8TG93ZXI+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICdJdGVyYWJsZTxDb250cmF2YXJpYW50PE1pZGRsZT4+Jy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2luX3N1YnR5cGluZ190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9zdWJ0eXBpbmdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODliMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbl9zdWJ0eXBpbmdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHN1YnR5cGluZyBmb3IgdGhlIGBpbmAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBVcHBlciB7fQorY2xhc3MgTWlkZGxlIGV4dGVuZHMgVXBwZXIge30KK2NsYXNzIExvd2VyIGV4dGVuZHMgTWlkZGxlIHt9CisKK2NsYXNzIEEgeworICBDb250cmF2YXJpYW50PE1pZGRsZT4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gQ29udHJhdmFyaWFudDxNaWRkbGU+KCk7CisgIH0KKworICB2b2lkIG1ldGhvZDIoQ29udHJhdmFyaWFudDxNaWRkbGU+IHgpIHt9Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgQG92ZXJyaWRlCisgIENvbnRyYXZhcmlhbnQ8VXBwZXI+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBDb250cmF2YXJpYW50PFVwcGVyPigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihDb250cmF2YXJpYW50PExvd2VyPiB4KSB7fQorfQorCitjbGFzcyBDIGV4dGVuZHMgQSB7CisgIEBvdmVycmlkZQorICBDb250cmF2YXJpYW50PE1pZGRsZT4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gbmV3IENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihDb250cmF2YXJpYW50PE1pZGRsZT4geCkge30KK30KKworY2xhc3MgRDxvdXQgVCBleHRlbmRzIENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4ge30KKworY2xhc3MgRSB7CisgIEQ8Q29udHJhdmFyaWFudDxVcHBlcj4+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIEQ8Q29udHJhdmFyaWFudDxVcHBlcj4+KCk7CisgIH0KK30KKworY2xhc3MgRiB7CisgIEQ8Q29udHJhdmFyaWFudDxNaWRkbGU+PiBtZXRob2QxKCkgeworICAgIHJldHVybiBEPENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4oKTsKKyAgfQorfQorCit2b2lkIHRlc3RDYWxsKEl0ZXJhYmxlPENvbnRyYXZhcmlhbnQ8TG93ZXI+PiB4KSB7fQorCittYWluKCkgeworICBBIGEgPSBuZXcgQSgpOworICBFeHBlY3QudHlwZTxDb250cmF2YXJpYW50PE1pZGRsZT4+KGEubWV0aG9kMSgpKTsKKyAgRXhwZWN0LnR5cGU8Q29udHJhdmFyaWFudDxMb3dlcj4+KGEubWV0aG9kMSgpKTsKKyAgRXhwZWN0Lm5vdFR5cGU8Q29udHJhdmFyaWFudDxVcHBlcj4+KGEubWV0aG9kMSgpKTsKKyAgYS5tZXRob2QyKG5ldyBDb250cmF2YXJpYW50PE1pZGRsZT4oKSk7CisgIGEubWV0aG9kMihuZXcgQ29udHJhdmFyaWFudDxVcHBlcj4oKSk7CisKKyAgQiBiID0gbmV3IEIoKTsKKyAgRXhwZWN0LnR5cGU8Q29udHJhdmFyaWFudDxVcHBlcj4+KGIubWV0aG9kMSgpKTsKKyAgRXhwZWN0LnR5cGU8Q29udHJhdmFyaWFudDxNaWRkbGU+PihiLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPENvbnRyYXZhcmlhbnQ8TG93ZXI+PihiLm1ldGhvZDEoKSk7CisgIGIubWV0aG9kMihuZXcgQ29udHJhdmFyaWFudDxMb3dlcj4oKSk7CisgIGIubWV0aG9kMihuZXcgQ29udHJhdmFyaWFudDxNaWRkbGU+KCkpOworCisgIEMgYyA9IG5ldyBDKCk7CisgIEV4cGVjdC50eXBlPENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4oYy5tZXRob2QxKCkpOworICBFeHBlY3QudHlwZTxDb250cmF2YXJpYW50PExvd2VyPj4oYy5tZXRob2QxKCkpOworICBFeHBlY3Qubm90VHlwZTxDb250cmF2YXJpYW50PFVwcGVyPj4oYy5tZXRob2QxKCkpOworICBjLm1ldGhvZDIobmV3IENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgYy5tZXRob2QyKG5ldyBDb250cmF2YXJpYW50PFVwcGVyPigpKTsKKworICBEPENvbnRyYXZhcmlhbnQ8VXBwZXI+PiBkVXBwZXIgPSBuZXcgRDxDb250cmF2YXJpYW50PFVwcGVyPj4oKTsKKyAgRDxDb250cmF2YXJpYW50PE1pZGRsZT4+IGRNaWRkbGUgPSBuZXcgRDxDb250cmF2YXJpYW50PE1pZGRsZT4+KCk7CisKKyAgRSBlID0gbmV3IEUoKTsKKyAgRXhwZWN0LnR5cGU8RDxDb250cmF2YXJpYW50PFVwcGVyPj4+KGUubWV0aG9kMSgpKTsKKyAgRXhwZWN0LnR5cGU8RDxDb250cmF2YXJpYW50PE1pZGRsZT4+PihlLm1ldGhvZDEoKSk7CisKKyAgRiBmID0gbmV3IEYoKTsKKyAgRXhwZWN0LnR5cGU8RDxDb250cmF2YXJpYW50PE1pZGRsZT4+PihlLm1ldGhvZDEoKSk7CisKKyAgSXRlcmFibGU8Q29udHJhdmFyaWFudDxMb3dlcj4+IGl0ZXJhYmxlTG93ZXIgPSBbbmV3IENvbnRyYXZhcmlhbnQ8TG93ZXI+KCldOworICBMaXN0PENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4gbGlzdE1pZGRsZSA9IFtuZXcgQ29udHJhdmFyaWFudDxNaWRkbGU+KCldOworICBpdGVyYWJsZUxvd2VyID0gbGlzdE1pZGRsZTsKKworICB0ZXN0Q2FsbChsaXN0TWlkZGxlKTsKKworICBFeHBlY3Quc3VidHlwZTxDb250cmF2YXJpYW50PFVwcGVyPiwgQ29udHJhdmFyaWFudDxNaWRkbGU+PigpOworICBFeHBlY3Quc3VidHlwZTxDb250cmF2YXJpYW50PE1pZGRsZT4sIENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4oKTsKKyAgRXhwZWN0Lm5vdFN1YnR5cGU8Q29udHJhdmFyaWFudDxMb3dlcj4sIENvbnRyYXZhcmlhbnQ8TWlkZGxlPj4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X2ZpZWxkX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X2ZpZWxkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQzNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5vdXRfZmllbGRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgdmFyaW91cyBmaWVsZHMgZm9yIHRoZSBgaW5vdXRgIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3R5cGVkZWYgVm9pZDJJbnQgPSBpbnQ/IEZ1bmN0aW9uKCk7Cit0eXBlZGVmIEludDJWb2lkID0gdm9pZCBGdW5jdGlvbihpbnQpOworCitjbGFzcyBBPGlub3V0IFQ+IHsKKyAgbGF0ZSBUIGE7CisgIGZpbmFsIFQ/IGIgPSBudWxsOworICBmaW5hbCBUPyBGdW5jdGlvbigpIGMgPSAoKSA9PiBudWxsOworICBmaW5hbCB2b2lkIEZ1bmN0aW9uKFQpIGQgPSAoVCB2YWwpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDIsIHZhbCk7CisgIH07CisgIEE8VD4gZ2V0IGUgPT4gdGhpczsKKyAgY292YXJpYW50IGxhdGUgVCBmOworICBUPyBnZXQgZyA9PiBudWxsOworICB2b2lkIHNldCBoKFQgdmFsdWUpID0+IHZhbHVlOworICB2b2lkIHNldCBpKGNvdmFyaWFudCBUIHZhbHVlKSA9PiB2YWx1ZTsKK30KKworbWl4aW4gQk1peGluPGlub3V0IFQ+IHsKKyAgbGF0ZSBUIGE7CisgIGZpbmFsIFQ/IGIgPSBudWxsOworICBmaW5hbCBUPyBGdW5jdGlvbigpIGMgPSAoKSA9PiBudWxsOworICBmaW5hbCB2b2lkIEZ1bmN0aW9uKFQpIGQgPSAoVCB2YWwpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDIsIHZhbCk7CisgIH07CisgIEJNaXhpbjxUPiBnZXQgZSA9PiB0aGlzOworICBjb3ZhcmlhbnQgbGF0ZSBUIGY7CisgIFQ/IGdldCBnID0+IG51bGw7CisgIHZvaWQgc2V0IGgoVCB2YWx1ZSkgPT4gdmFsdWU7CisgIHZvaWQgc2V0IGkoY292YXJpYW50IFQgdmFsdWUpID0+IHZhbHVlOworfQorCitjbGFzcyBCIHdpdGggQk1peGluPGludD4ge30KKwordm9pZCB0ZXN0Q2xhc3MoKSB7CisgIEE8aW50PiBhID0gbmV3IEEoKTsKKworICBhLmEgPSAyOworICBFeHBlY3QuZXF1YWxzKDIsIGEuYSk7CisKKyAgRXhwZWN0LmlzTnVsbChhLmIpOworCisgIEV4cGVjdC50eXBlPFZvaWQySW50PihhLmMpOworICBFeHBlY3QuaXNOdWxsKGEuYygpKTsKKworICBFeHBlY3QudHlwZTxJbnQyVm9pZD4oYS5kKTsKKyAgYS5kKDIpOworCisgIGEuZS5hID0gMzsKKworICBhLmYgPSAyOworICBFeHBlY3QuZXF1YWxzKDIsIGEuZik7CisKKyAgRXhwZWN0LmlzTnVsbChhLmcpOworCisgIGEuaCA9IDI7CisKKyAgYS5pID0gMjsKK30KKwordm9pZCB0ZXN0TWl4aW4oKSB7CisgIEIgYiA9IG5ldyBCKCk7CisKKyAgYi5hID0gMjsKKyAgRXhwZWN0LmVxdWFscygyLCBiLmEpOworCisgIEV4cGVjdC5pc051bGwoYi5iKTsKKworICBFeHBlY3QudHlwZTxWb2lkMkludD4oYi5jKTsKKyAgRXhwZWN0LmlzTnVsbChiLmMoKSk7CisKKyAgRXhwZWN0LnR5cGU8SW50MlZvaWQ+KGIuZCk7CisgIGIuZCgyKTsKKworICBiLmUuYSA9IDM7CisKKyAgYi5mID0gMjsKKyAgRXhwZWN0LmVxdWFscygyLCBiLmYpOworCisgIEV4cGVjdC5pc051bGwoYi5nKTsKKworICBiLmggPSAyOworCisgIGIuaSA9IDI7Cit9CisKK21haW4oKSB7CisgIHRlc3RDbGFzcygpOworICB0ZXN0TWl4aW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X2luZmVyZW5jZV9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9pbmZlcmVuY2VfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzI2NTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5vdXRfaW5mZXJlbmNlX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIGxvY2FsIGluZmVyZW5jZSBlcnJvcnMgZm9yIHRoZSBgaW5vdXRgIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorY2xhc3MgSW52YXJpYW50PGlub3V0IFQ+IHt9CisKK2NsYXNzIEV4YWN0bHk8aW5vdXQgVD4ge30KKworY2xhc3MgVXBwZXIge30KK2NsYXNzIE1pZGRsZSBleHRlbmRzIFVwcGVyIHt9CitjbGFzcyBMb3dlciBleHRlbmRzIE1pZGRsZSB7fQorCitFeGFjdGx5PFQ+IGluZmVySW52SW52PFQ+KEludmFyaWFudDxUPiB4LCBJbnZhcmlhbnQ8VD4geSkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKK0V4YWN0bHk8VD4gaW5mZXJJbnZDb3Y8VD4oSW52YXJpYW50PFQ+IHgsIENvdmFyaWFudDxUPiB5KSA9PiBuZXcgRXhhY3RseTxUPigpOworRXhhY3RseTxUPiBpbmZlckludkNvbnRyYTxUPihJbnZhcmlhbnQ8VD4geCwgQ29udHJhdmFyaWFudDxUPiB5KSA9PiBuZXcgRXhhY3RseTxUPigpOworCittYWluKCkgeworICAvLyBNaWRkbGUgPDogVCA8OiBNaWRkbGUgYW5kIGludCA8OiBUIDw6IGludCBhcmUgbm90IHZhbGlkIGNvbnN0cmFpbnRzLgorICBpbmZlckludkludihJbnZhcmlhbnQ8TWlkZGxlPigpLCBJbnZhcmlhbnQ8aW50PigpKTsKKy8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnSW52YXJpYW50PE1pZGRsZT4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnSW52YXJpYW50PE9iamVjdD4nLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEUKKy8vIFtjZmVdIFRoZSBhcmd1bWVudCB0eXBlICdJbnZhcmlhbnQ8aW50PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICdJbnZhcmlhbnQ8T2JqZWN0PicuCisKKyAgLy8gTWlkZGxlIDw6IFQgPDogTWlkZGxlIGFuZCBVcHBlciA8OiBUIDw6IFVwcGVyIGFyZSBub3QgdmFsaWQgY29uc3RyYWludHMuCisgIGluZmVySW52SW52KEludmFyaWFudDxNaWRkbGU+KCksIEludmFyaWFudDxVcHBlcj4oKSk7CisvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRQorLy8gW2NmZV0gVGhlIGFyZ3VtZW50IHR5cGUgJ0ludmFyaWFudDxNaWRkbGU+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0ludmFyaWFudDxVcHBlcj4nLgorCisgIC8vIE1pZGRsZSA8OiBUIDw6IE1pZGRsZSBhbmQgTG93ZXIgPDogVCA8OiBMb3dlciBhcmUgbm90IHZhbGlkIGNvbnN0cmFpbnRzLgorICBpbmZlckludkludihJbnZhcmlhbnQ8TWlkZGxlPigpLCBJbnZhcmlhbnQ8TG93ZXI+KCkpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRQorLy8gW2NmZV0gVGhlIGFyZ3VtZW50IHR5cGUgJ0ludmFyaWFudDxMb3dlcj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnSW52YXJpYW50PE1pZGRsZT4nLgorCisgIC8vIFVwcGVyIDw6IFQKKyAgLy8gTWlkZGxlIDw6IFQgPDogTWlkZGxlCisgIC8vIFVwcGVyIDw6IFQgPDogTWlkZGxlIGlzIG5vdCBhIHZhbGlkIGNvbnN0cmFpbnQuCisgIGluZmVySW52Q292KEludmFyaWFudDxNaWRkbGU+KCksIENvdmFyaWFudDxVcHBlcj4oKSk7CisvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRQorLy8gW2NmZV0gVGhlIGFyZ3VtZW50IHR5cGUgJ0ludmFyaWFudDxNaWRkbGU+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0ludmFyaWFudDxVcHBlcj4nLgorCisgIC8vIFQgPDogTG93ZXIKKyAgLy8gTWlkZGxlIDw6IFQgPDogTG93ZXIKKyAgLy8gTWlkZGxlIDw6IFQgPDogTG93ZXIgaXMgbm90IGEgdmFsaWQgY29uc3RyYWludAorICBpbmZlckludkNvbnRyYShJbnZhcmlhbnQ8TWlkZGxlPigpLCBDb250cmF2YXJpYW50PExvd2VyPigpKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnQ29udHJhdmFyaWFudDxMb3dlcj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnQ29udHJhdmFyaWFudDxNaWRkbGU+Jy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X2luZmVyZW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9pbmZlcmVuY2VfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9pbmZlcmVuY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgbG9jYWwgaW5mZXJlbmNlIGZvciB0aGUgYGlub3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorCitjbGFzcyBFeGFjdGx5PGlub3V0IFQ+IHt9CisKK2NsYXNzIFVwcGVyIHt9CitjbGFzcyBNaWRkbGUgZXh0ZW5kcyBVcHBlciB7fQorY2xhc3MgTG93ZXIgZXh0ZW5kcyBNaWRkbGUge30KKworRXhhY3RseTxUPiBpbmZlckludkludjxUPihJbnZhcmlhbnQ8VD4geCwgSW52YXJpYW50PFQ+IHkpID0+IG5ldyBFeGFjdGx5PFQ+KCk7CitFeGFjdGx5PFQ+IGluZmVySW52Q292PFQ+KEludmFyaWFudDxUPiB4LCBDb3ZhcmlhbnQ8VD4geSkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKK0V4YWN0bHk8VD4gaW5mZXJJbnZDb250cmE8VD4oSW52YXJpYW50PFQ+IHgsIENvbnRyYXZhcmlhbnQ8VD4geSkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKKworbWFpbigpIHsKKyAgRXhhY3RseTxNaWRkbGU+IG1pZGRsZTsKKworICAvLyBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgLy8gQ2hvb3NlIE1pZGRsZQorICB2YXIgaW5mZXJyZWRNaWRkbGUgPSBpbmZlckludkludihJbnZhcmlhbnQ8TWlkZGxlPigpLCBJbnZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgbWlkZGxlID0gaW5mZXJyZWRNaWRkbGU7CisKKyAgLy8gTG93ZXIgPDogVAorICAvLyBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgLy8gQ2hvb3NlIE1pZGRsZSBzaW5jZSB0aGlzIG1lcmdlcyB0byBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgdmFyIGluZmVycmVkTWlkZGxlMiA9IGluZmVySW52Q292KEludmFyaWFudDxNaWRkbGU+KCksIENvdmFyaWFudDxMb3dlcj4oKSk7CisgIG1pZGRsZSA9IGluZmVycmVkTWlkZGxlMjsKKworICAvLyBNaWRkbGUgPDogVAorICAvLyBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgLy8gQ2hvb3NlIE1pZGRsZSBzaW5jZSB0aGlzIG1lcmdlcyB0byBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgdmFyIGluZmVycmVkTWlkZGxlMyA9IGluZmVySW52Q292KEludmFyaWFudDxNaWRkbGU+KCksIENvdmFyaWFudDxNaWRkbGU+KCkpOworICBtaWRkbGUgPSBpbmZlcnJlZE1pZGRsZTM7CisKKyAgLy8gVCA8OiBVcHBlcgorICAvLyBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgLy8gQ2hvb3NlIE1pZGRsZSBzaW5jZSB0aGlzIG1lcmdlcyB0byBNaWRkbGUgPDogVCA8OiBNaWRkbGUKKyAgdmFyIGluZmVycmVkTWlkZGxlNCA9IGluZmVySW52Q29udHJhKEludmFyaWFudDxNaWRkbGU+KCksIENvbnRyYXZhcmlhbnQ8VXBwZXI+KCkpOworICBtaWRkbGUgPSBpbmZlcnJlZE1pZGRsZTQ7CisKKyAgLy8gVCA8OiBNaWRkbGUKKyAgLy8gTWlkZGxlIDw6IFQgPDogTWlkZGxlCisgIC8vIENob29zZSBNaWRkbGUgc2luY2UgdGhpcyBtZXJnZXMgdG8gTWlkZGxlIDw6IFQgPDogTWlkZGxlCisgIHZhciBpbmZlcnJlZE1pZGRsZTUgPSBpbmZlckludkNvbnRyYShJbnZhcmlhbnQ8TWlkZGxlPigpLCBDb250cmF2YXJpYW50PE1pZGRsZT4oKSk7CisgIG1pZGRsZSA9IGluZmVycmVkTWlkZGxlNTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X21ldGhvZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9tZXRob2RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmYxOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9tZXRob2RfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjg4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIG1ldGhvZCBzaWduYXR1cmVzIGFuZCByZXR1cm4gdHlwZXMgZm9yIHRoZSBgaW5vdXRgIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3R5cGVkZWYgQ292PFQ+ID0gVCBGdW5jdGlvbigpOwordHlwZWRlZiBDb250cmE8VD4gPSB2b2lkIEZ1bmN0aW9uKFQpOworCitDb3Y8aW50PiBjb3ZGdW5jdGlvbiA9ICgpID0+IDI7CitDb250cmE8aW50PiBjb250cmFGdW5jdGlvbiA9IChpbnQgdmFsKSB7fTsKK0NvdjxudW0+IGNvdkZ1bmN0aW9uTnVtID0gKCkgPT4gMjsKK0NvbnRyYTxudW0+IGNvbnRyYUZ1bmN0aW9uTnVtID0gKG51bSB2YWwpIHt9OworCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CitjbGFzcyBDb250cmF2YXJpYW50PGluIFQ+IHt9CitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD4ge30KKworY2xhc3MgQTxpbm91dCBUPiB7CisgIHZvaWQgbWV0aG9kMShUIHgpIHt9CisgIHZvaWQgbWV0aG9kMihDb3Y8VD4geCkge30KKyAgQ29udHJhPFQ+IG1ldGhvZDMoKSB7CisgICAgcmV0dXJuIChUIHZhbCkgeworICAgICAgRXhwZWN0LmVxdWFscygyLCB2YWwpOworICAgIH07CisgIH0KKworICBUPyBtZXRob2Q0KCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2Q1KENvbnRyYTxUPiB4KSB7fQorICBDb3Y8VD8+IG1ldGhvZDYoKSB7CisgICAgcmV0dXJuICgpID0+IG51bGw7CisgIH0KKworICBUIG1ldGhvZDcoVCB4KSA9PiB4OworICBDb250cmE8VD4gbWV0aG9kOChDb250cmE8VD4geCkgPT4geDsKKyAgQ292PFQ+IG1ldGhvZDkoQ292PFQ+IHgpID0+IHg7CisKKyAgVCBtZXRob2QxMDxTIGV4dGVuZHMgVD4oUyB4KSA9PiB4OworCisgIHZvaWQgbWV0aG9kMTEoQ292YXJpYW50PFQ+IHgpIHt9CisgIENvdmFyaWFudDxUPj8gbWV0aG9kMTIoKSA9PiBudWxsOworICB2b2lkIG1ldGhvZDEzKENvbnRyYXZhcmlhbnQ8VD4geCkge30KKyAgQ29udHJhdmFyaWFudDxUPj8gbWV0aG9kMTQoKSA9PiBudWxsOworICB2b2lkIG1ldGhvZDE1KEludmFyaWFudDxUPiB4KSB7fQorICBJbnZhcmlhbnQ8VD4/IG1ldGhvZDE2KCkgPT4gbnVsbDsKKworICB2b2lkIG1ldGhvZDE3KGNvdmFyaWFudCBUIHgpIHt9CisgIHZvaWQgbWV0aG9kMTgoY292YXJpYW50IENvbnRyYTxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE5KGNvdmFyaWFudCBDb3Y8VD4geCkge30KKyAgdm9pZCBtZXRob2QyMChjb3ZhcmlhbnQgQ29udHJhdmFyaWFudDxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDIxKGNvdmFyaWFudCBDb3ZhcmlhbnQ8VD4geCkge30KKworICB2b2lkIG1ldGhvZDIyPFMgZXh0ZW5kcyBDb250cmF2YXJpYW50PFQ+PigpIHt9CisgIHZvaWQgbWV0aG9kMjM8UyBleHRlbmRzIENvdmFyaWFudDxUPj4oKSB7fQorICB2b2lkIG1ldGhvZDI0PFMgZXh0ZW5kcyBDb250cmE8VD4+KCkge30KKyAgdm9pZCBtZXRob2QyNTxTIGV4dGVuZHMgQ292PFQ+PigpIHt9CisKKyAgdm9pZCBtZXRob2QyNih7Q29udHJhPFQ+PyBhLCBDb3Y8VD4/IGIsIFQ/IGN9KSB7fQorICB2b2lkIG1ldGhvZDI3KHtDb250cmF2YXJpYW50PFQ+PyBhLCBDb3ZhcmlhbnQ8VD4/IGJ9KSB7fQorfQorCittaXhpbiBCTWl4aW48aW5vdXQgVD4geworICB2b2lkIG1ldGhvZDEoVCB4KSB7fQorICB2b2lkIG1ldGhvZDIoQ292PFQ+IHgpIHt9CisgIENvbnRyYTxUPiBtZXRob2QzKCkgeworICAgIHJldHVybiAoVCB2YWwpIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMiwgdmFsKTsKKyAgICB9OworICB9CisKKyAgVD8gbWV0aG9kNCgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kNShDb250cmE8VD4geCkge30KKyAgQ292PFQ/PiBtZXRob2Q2KCkgeworICAgIHJldHVybiAoKSA9PiBudWxsOworICB9CisKKyAgVCBtZXRob2Q3KFQgeCkgPT4geDsKKyAgQ29udHJhPFQ+IG1ldGhvZDgoQ29udHJhPFQ+IHgpID0+IHg7CisgIENvdjxUPiBtZXRob2Q5KENvdjxUPiB4KSA9PiB4OworCisgIFQgbWV0aG9kMTA8UyBleHRlbmRzIFQ+KFMgeCkgPT4geDsKKworICB2b2lkIG1ldGhvZDExKENvdmFyaWFudDxUPiB4KSB7fQorICBDb3ZhcmlhbnQ8VD4/IG1ldGhvZDEyKCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QxMyhDb250cmF2YXJpYW50PFQ+IHgpIHt9CisgIENvbnRyYXZhcmlhbnQ8VD4/IG1ldGhvZDE0KCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QxNShJbnZhcmlhbnQ8VD4geCkge30KKyAgSW52YXJpYW50PFQ+PyBtZXRob2QxNigpID0+IG51bGw7CisKKyAgdm9pZCBtZXRob2QxNyhjb3ZhcmlhbnQgVCB4KSB7fQorICB2b2lkIG1ldGhvZDE4KGNvdmFyaWFudCBDb250cmE8VD4geCkge30KKyAgdm9pZCBtZXRob2QxOShjb3ZhcmlhbnQgQ292PFQ+IHgpIHt9CisgIHZvaWQgbWV0aG9kMjAoY292YXJpYW50IENvbnRyYXZhcmlhbnQ8VD4geCkge30KKyAgdm9pZCBtZXRob2QyMShjb3ZhcmlhbnQgQ292YXJpYW50PFQ+IHgpIHt9CisKKyAgdm9pZCBtZXRob2QyMjxTIGV4dGVuZHMgQ29udHJhdmFyaWFudDxUPj4oKSB7fQorICB2b2lkIG1ldGhvZDIzPFMgZXh0ZW5kcyBDb3ZhcmlhbnQ8VD4+KCkge30KKyAgdm9pZCBtZXRob2QyNDxTIGV4dGVuZHMgQ29udHJhPFQ+PigpIHt9CisgIHZvaWQgbWV0aG9kMjU8UyBleHRlbmRzIENvdjxUPj4oKSB7fQorCisgIHZvaWQgbWV0aG9kMjYoe0NvbnRyYTxUPj8gYSwgQ292PFQ+PyBiLCBUPyBjfSkge30KKyAgdm9pZCBtZXRob2QyNyh7Q29udHJhdmFyaWFudDxUPj8gYSwgQ292YXJpYW50PFQ+PyBifSkge30KK30KKworY2xhc3MgQiB3aXRoIEJNaXhpbjxudW0+IHt9CisKK2NsYXNzIEM8aW5vdXQgVD4geworICB2b2lkIG1ldGhvZDEoQ29udHJhPEE8VD4+IHgpIHt9CisgIHZvaWQgbWV0aG9kMihDb3Y8QTxUPj4geCkge30KKyAgQTxUPiBtZXRob2QzKCkgeworICAgIHJldHVybiBBPFQ+KCk7CisgIH0KK30KKworY2xhc3MgRDxUPiB7CisgIFQ/IG1ldGhvZCgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMihUIHgpIHt9CisgIHZvaWQgbWV0aG9kMyhjb3ZhcmlhbnQgVCB4KSB7fQorfQorCitjbGFzcyBFPGlub3V0IFQ+IGV4dGVuZHMgRDxUPiB7CisgIEBvdmVycmlkZQorICBUPyBtZXRob2QoKSA9PiBudWxsOworCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoVCB4KSB7fQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDMoY292YXJpYW50IFQgeCkge30KK30KKworYWJzdHJhY3QgY2xhc3MgRjxUPiB7CisgIGludCBtZXRob2QoVCB4KTsKK30KKworY2xhc3MgRzxpbm91dCBUPiB7CisgIGZpbmFsIHZvaWQgRnVuY3Rpb24oVCkgZjsKKyAgRyh0aGlzLmYpOworICBpbnQgbWV0aG9kKFQgeCkgeworICAgIGYoeCk7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2NsYXNzIEg8aW5vdXQgVD4gZXh0ZW5kcyBHPFQ+IGltcGxlbWVudHMgRjxUPiB7CisgIEgodm9pZCBGdW5jdGlvbihUKSBmKSA6IHN1cGVyKGYpOworfQorCit2b2lkIHRlc3RDbGFzcygpIHsKKyAgQTxpbnQ+IGEgPSBuZXcgQSgpOworCisgIGEubWV0aG9kMSgyKTsKKworICBhLm1ldGhvZDIoKCkgPT4gMik7CisKKyAgRXhwZWN0LnR5cGU8Q29udHJhPGludD4+KGEubWV0aG9kMygpKTsKKyAgQ29udHJhPGludD4gbWV0aG9kM0Z1bmN0aW9uID0gYS5tZXRob2QzKCk7CisgIG1ldGhvZDNGdW5jdGlvbigyKTsKKworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kNCgpKTsKKworICBhLm1ldGhvZDUoKGludCB2YWwpIHt9KTsKKworICBFeHBlY3QudHlwZTxDb3Y8aW50Pz4+KGEubWV0aG9kNigpKTsKKyAgQ292PGludD8+IG1ldGhvZDZGdW5jdGlvbiA9IGEubWV0aG9kNigpOworICBFeHBlY3QuaXNOdWxsKG1ldGhvZDZGdW5jdGlvbigpKTsKKworICBFeHBlY3QuZXF1YWxzKDMsIGEubWV0aG9kNygzKSk7CisKKyAgRXhwZWN0LnR5cGU8Q29udHJhPGludD4+KGEubWV0aG9kOChjb250cmFGdW5jdGlvbikpOworICBFeHBlY3QuZXF1YWxzKGNvbnRyYUZ1bmN0aW9uLCBhLm1ldGhvZDgoY29udHJhRnVuY3Rpb24pKTsKKworICBFeHBlY3QudHlwZTxDb3Y8aW50Pj4oYS5tZXRob2Q5KGNvdkZ1bmN0aW9uKSk7CisgIEV4cGVjdC5lcXVhbHMoY292RnVuY3Rpb24sIGEubWV0aG9kOShjb3ZGdW5jdGlvbikpOworCisgIEE8bnVtPiBhYSA9IG5ldyBBKCk7CisgIEV4cGVjdC50eXBlPG51bT4oYWEubWV0aG9kMTAoMykpOworCisgIGEubWV0aG9kMTEoQ292YXJpYW50PGludD4oKSk7CisgIEV4cGVjdC5pc051bGwoYS5tZXRob2QxMigpKTsKKyAgYS5tZXRob2QxMyhDb250cmF2YXJpYW50PGludD4oKSk7CisgIEV4cGVjdC5pc051bGwoYS5tZXRob2QxNCgpKTsKKyAgYS5tZXRob2QxNShJbnZhcmlhbnQ8aW50PigpKTsKKyAgRXhwZWN0LmlzTnVsbChhLm1ldGhvZDE2KCkpOworCisgIGEubWV0aG9kMTcoMyk7CisgIGEubWV0aG9kMTgoY29udHJhRnVuY3Rpb24pOworICBhLm1ldGhvZDE5KGNvdkZ1bmN0aW9uKTsKKyAgYS5tZXRob2QyMChDb250cmF2YXJpYW50PGludD4oKSk7CisgIGEubWV0aG9kMjEoQ292YXJpYW50PGludD4oKSk7CisKKyAgYS5tZXRob2QyMjxDb250cmF2YXJpYW50PGludD4+KCk7CisgIGEubWV0aG9kMjM8Q292YXJpYW50PGludD4+KCk7CisgIGEubWV0aG9kMjQ8Q29udHJhPGludD4+KCk7CisgIGEubWV0aG9kMjU8Q292PGludD4+KCk7CisKKyAgYS5tZXRob2QyNigpOworICBhLm1ldGhvZDI3KCk7Cit9CisKK3ZvaWQgdGVzdE1peGluKCkgeworICBCIGIgPSBuZXcgQigpOworCisgIGIubWV0aG9kMSgyKTsKKworICBiLm1ldGhvZDIoKCkgPT4gMik7CisKKyAgRXhwZWN0LnR5cGU8Q29udHJhPG51bT4+KGIubWV0aG9kMygpKTsKKyAgQ29udHJhPG51bT4gbWV0aG9kM0Z1bmN0aW9uID0gYi5tZXRob2QzKCk7CisgIG1ldGhvZDNGdW5jdGlvbigyKTsKKworICBFeHBlY3QuaXNOdWxsKGIubWV0aG9kNCgpKTsKKworICBiLm1ldGhvZDUoKG51bSB2YWwpIHt9KTsKKworICBFeHBlY3QudHlwZTxDb3Y8bnVtPz4+KGIubWV0aG9kNigpKTsKKyAgQ292PG51bT8+IG1ldGhvZDZGdW5jdGlvbiA9IGIubWV0aG9kNigpOworICBFeHBlY3QuaXNOdWxsKG1ldGhvZDZGdW5jdGlvbigpKTsKKworICBFeHBlY3QuZXF1YWxzKDMsIGIubWV0aG9kNygzKSk7CisKKyAgRXhwZWN0LnR5cGU8Q29udHJhPG51bT4+KGIubWV0aG9kOChjb250cmFGdW5jdGlvbk51bSkpOworICBFeHBlY3QuZXF1YWxzKGNvbnRyYUZ1bmN0aW9uTnVtLCBiLm1ldGhvZDgoY29udHJhRnVuY3Rpb25OdW0pKTsKKworICBFeHBlY3QudHlwZTxDb3Y8bnVtPj4oYi5tZXRob2Q5KGNvdkZ1bmN0aW9uTnVtKSk7CisgIEV4cGVjdC5lcXVhbHMoY292RnVuY3Rpb25OdW0sIGIubWV0aG9kOShjb3ZGdW5jdGlvbk51bSkpOworCisgIEV4cGVjdC50eXBlPG51bT4oYi5tZXRob2QxMCgzKSk7CisKKyAgYi5tZXRob2QxMShDb3ZhcmlhbnQ8bnVtPigpKTsKKyAgRXhwZWN0LmlzTnVsbChiLm1ldGhvZDEyKCkpOworICBiLm1ldGhvZDEzKENvbnRyYXZhcmlhbnQ8bnVtPigpKTsKKyAgRXhwZWN0LmlzTnVsbChiLm1ldGhvZDE0KCkpOworICBiLm1ldGhvZDE1KEludmFyaWFudDxudW0+KCkpOworICBFeHBlY3QuaXNOdWxsKGIubWV0aG9kMTYoKSk7CisKKyAgYi5tZXRob2QxNygzKTsKKyAgYi5tZXRob2QxOChjb250cmFGdW5jdGlvbk51bSk7CisgIGIubWV0aG9kMTkoY292RnVuY3Rpb25OdW0pOworICBiLm1ldGhvZDIwKENvbnRyYXZhcmlhbnQ8bnVtPigpKTsKKyAgYi5tZXRob2QyMShDb3ZhcmlhbnQ8bnVtPigpKTsKKworICBiLm1ldGhvZDIyPENvbnRyYXZhcmlhbnQ8bnVtPj4oKTsKKyAgYi5tZXRob2QyMzxDb3ZhcmlhbnQ8bnVtPj4oKTsKKyAgYi5tZXRob2QyNDxDb250cmE8bnVtPj4oKTsKKyAgYi5tZXRob2QyNTxDb3Y8bnVtPj4oKTsKKworICBiLm1ldGhvZDI2KCk7CisgIGIubWV0aG9kMjcoKTsKK30KKwordm9pZCB0ZXN0Q2xhc3NJbk1ldGhvZHMoKSB7CisgIEM8aW50PiBjID0gbmV3IEMoKTsKKworICBjLm1ldGhvZDEoKEE8aW50PiB4KSB7fSk7CisgIGMubWV0aG9kMigoKSA9PiB0aHJvdyAidW5jYWxsZWQiKTsKKworICBFeHBlY3QudHlwZTxBPGludD4+KGMubWV0aG9kMygpKTsKK30KKwordm9pZCB0ZXN0T3ZlcnJpZGVMZWdhY3lNZXRob2RzKCkgeworICBFPGludD4gZSA9IG5ldyBFKCk7CisgIEV4cGVjdC5pc051bGwoZS5tZXRob2QoKSk7CisgIGUubWV0aG9kMigzKTsKKyAgZS5tZXRob2QzKDMpOworCisgIEQ8T2JqZWN0PiBkID0gZTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiBkLm1ldGhvZDIoInRlc3QiKSk7CisgIEV4cGVjdC50aHJvd3MoKCkgPT4gZC5tZXRob2QzKCJ0ZXN0IikpOworCisgIEY8T2JqZWN0PiBmID0gbmV3IEg8U3RyaW5nPigoU3RyaW5nIHMpIHt9KTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiBmLm1ldGhvZCgzKSk7CisKKyAgLy8gVGVzdHMgcmVpZmllZCB0eXBlIGlzIHRoZSB0eXBlIGV4cGVjdGVkIGZvciBGIGFuZCBub3QgRy4KKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKE9iamVjdCk+KGYubWV0aG9kKTsKKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKE9iamVjdCk+KG5ldyBIPFN0cmluZz4oKFN0cmluZyBzKXt9KS5tZXRob2QpOworfQorCittYWluKCkgeworICB0ZXN0Q2xhc3MoKTsKKyAgdGVzdE1peGluKCk7CisgIHRlc3RDbGFzc0luTWV0aG9kcygpOworICB0ZXN0T3ZlcnJpZGVMZWdhY3lNZXRob2RzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9zdWJjbGFzc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9zdWJjbGFzc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiNzEyMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9zdWJjbGFzc190ZXN0LmRhcnQKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBzdWJjbGFzcyB1c2FnZSBmb3IgdGhlIGBpbm91dGAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCit0eXBlZGVmIENvdkZ1bmN0aW9uPFQ+ID0gVCBGdW5jdGlvbigpOwordHlwZWRlZiBDb250cmFGdW5jdGlvbjxUPiA9IHZvaWQgRnVuY3Rpb24oVCk7Cit0eXBlZGVmIEludkZ1bmN0aW9uPFQ+ID0gVCBGdW5jdGlvbihUKTsKKworY2xhc3MgTGVnYWN5Q292YXJpYW50PFQ+IHt9CitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD57fQorY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorbWl4aW4gTUxlZ2FjeUNvdmFyaWFudDxUPiB7fQorbWl4aW4gTUNvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK21peGluIE1Db3ZhcmlhbnQ8b3V0IFQ+IHt9CittaXhpbiBNSW52YXJpYW50PGlub3V0IFQ+IHt9CisKK2NsYXNzIEE8aW5vdXQgVD4gZXh0ZW5kcyBMZWdhY3lDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEI8aW5vdXQgVD4gZXh0ZW5kcyBJbnZhcmlhbnQ8VD4ge30KK2NsYXNzIEM8aW5vdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEQ8aW5vdXQgVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PFQ+IHt9CisKK2NsYXNzIEU8aW5vdXQgVD4gaW1wbGVtZW50cyBMZWdhY3lDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEY8aW5vdXQgVD4gaW1wbGVtZW50cyBJbnZhcmlhbnQ8VD4ge30KK2NsYXNzIEc8aW5vdXQgVD4gaW1wbGVtZW50cyBDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEg8aW5vdXQgVD4gaW1wbGVtZW50cyBDb250cmF2YXJpYW50PFQ+IHt9CisKK2NsYXNzIEk8aW5vdXQgVD4gd2l0aCBNTGVnYWN5Q292YXJpYW50PFQ+IHt9CitjbGFzcyBKPGlub3V0IFQ+IHdpdGggTUludmFyaWFudDxUPiB7fQorY2xhc3MgSzxpbm91dCBUPiB3aXRoIE1Db3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEw8aW5vdXQgVD4gd2l0aCBNQ29udHJhdmFyaWFudDxUPiB7fQorCitjbGFzcyBNPGlub3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHt9CitjbGFzcyBOPGlub3V0IFQ+IGV4dGVuZHMgQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHt9CitjbGFzcyBPPGlub3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYUZ1bmN0aW9uPFQ+PiB7fQorY2xhc3MgUDxpbm91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb250cmFGdW5jdGlvbjxDb3ZGdW5jdGlvbjxUPj4+IHt9CitjbGFzcyBRPGlub3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvdkZ1bmN0aW9uPENvbnRyYUZ1bmN0aW9uPFQ+Pj4ge30KK2NsYXNzIFI8aW5vdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q29udHJhRnVuY3Rpb248Q292YXJpYW50PFQ+Pj4ge30KK2NsYXNzIFM8aW5vdXQgVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4+IHt9CisKK2NsYXNzIFQ8aW5vdXQgWD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q292YXJpYW50PFg+PiB7fQorY2xhc3MgVTxpbm91dCBUPiBleHRlbmRzIENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4ge30KK2NsYXNzIFY8aW5vdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q292RnVuY3Rpb248VD4+IHt9CitjbGFzcyBXPGlub3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvbnRyYUZ1bmN0aW9uPENvbnRyYUZ1bmN0aW9uPFQ+Pj4ge30KK2NsYXNzIFg8aW5vdXQgVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PENvdkZ1bmN0aW9uPENvbnRyYXZhcmlhbnQ8VD4+PiB7fQorY2xhc3MgWTxpbm91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZGdW5jdGlvbjxDb3ZhcmlhbnQ8VD4+PiB7fQorY2xhc3MgWjxpbm91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZhcmlhbnQ8Q292YXJpYW50PFQ+Pj4ge30KKworY2xhc3MgQUE8aW5vdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8SW52RnVuY3Rpb248VD4+IHt9CisKK2NsYXNzIEFCPGlub3V0IFQ+ID0gSW52YXJpYW50PFQ+IHdpdGggTUludmFyaWFudDxUPjsKK2NsYXNzIEFDPGlub3V0IFQ+ID0gQ292YXJpYW50PFQ+IHdpdGggTUNvdmFyaWFudDxUPjsKK2NsYXNzIEFEPGlub3V0IFQ+ID0gQ29udHJhdmFyaWFudDxUPiB3aXRoIE1Db250cmF2YXJpYW50PFQ+OworCittYWluKCkgeworICBBPG51bT4gYSA9IEEoKTsKKyAgQjxudW0+IGIgPSBCKCk7CisgIEM8bnVtPiBjID0gQygpOworICBEPG51bT4gZCA9IEQoKTsKKyAgRTxudW0+IGUgPSBFKCk7CisgIEY8bnVtPiBmID0gRigpOworICBHPG51bT4gZyA9IEcoKTsKKyAgSDxudW0+IGggPSBIKCk7CisgIEk8bnVtPiBpID0gSSgpOworICBKPG51bT4gaiA9IEooKTsKKyAgSzxudW0+IGsgPSBLKCk7CisgIEw8bnVtPiBsID0gTCgpOworICBNPG51bT4gbSA9IE0oKTsKKyAgTjxudW0+IG4gPSBOKCk7CisgIE88bnVtPiBvID0gTygpOworICBQPG51bT4gcCA9IFAoKTsKKyAgUTxudW0+IHEgPSBRKCk7CisgIFI8bnVtPiByID0gUigpOworICBTPG51bT4gcyA9IFMoKTsKKyAgVDxudW0+IHQgPSBUKCk7CisgIFU8bnVtPiB1ID0gVSgpOworICBWPG51bT4gdiA9IFYoKTsKKyAgVzxudW0+IHcgPSBXKCk7CisgIFg8bnVtPiB4ID0gWCgpOworICBZPG51bT4geSA9IFkoKTsKKyAgWjxudW0+IHogPSBaKCk7CisgIEFBPG51bT4gYWEgPSBBQSgpOworICBBQjxudW0+IGFiID0gQUIoKTsKKyAgQUM8bnVtPiBhYyA9IEFDKCk7CisgIEFEPG51bT4gYWQgPSBBRCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5vdXRfc3VidHlwaW5nX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2ZjMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX2lub3V0X3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgZXJyb25lb3VzIHN1YnR5cGluZyBmb3IgdGhlIGBpbm91dGAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD4ge30KKworY2xhc3MgVXBwZXIge30KK2NsYXNzIE1pZGRsZSBleHRlbmRzIFVwcGVyIHt9CitjbGFzcyBMb3dlciBleHRlbmRzIE1pZGRsZSB7fQorCitjbGFzcyBBIHsKKyAgSW52YXJpYW50PE1pZGRsZT4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gSW52YXJpYW50PE1pZGRsZT4oKTsKKyAgfQorCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8TWlkZGxlPiB4KSB7fQorfQorCitjbGFzcyBCIGV4dGVuZHMgQSB7CisgIEBvdmVycmlkZQorICBJbnZhcmlhbnQ8VXBwZXI+IG1ldGhvZDEoKSB7CisgIC8vICAgICAgICAgICAgICAgXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5JTlZBTElEX09WRVJSSURFCisgIC8vIFtjZmVdIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kICdCLm1ldGhvZDEnIGlzICdJbnZhcmlhbnQ8VXBwZXI+Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlLCAnSW52YXJpYW50PE1pZGRsZT4nLCBvZiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICdBLm1ldGhvZDEnLgorICAgIHJldHVybiBuZXcgSW52YXJpYW50PFVwcGVyPigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8TG93ZXI+IHgpIHt9CisgIC8vICAgXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5JTlZBTElEX09WRVJSSURFCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gVGhlIHBhcmFtZXRlciAneCcgb2YgdGhlIG1ldGhvZCAnQi5tZXRob2QyJyBoYXMgdHlwZSAnSW52YXJpYW50PExvd2VyPicsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUsICdJbnZhcmlhbnQ8TWlkZGxlPicsIGluIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJ0EubWV0aG9kMicuCit9CisKK2NsYXNzIEMgZXh0ZW5kcyBBIHsKKyAgQG92ZXJyaWRlCisgIEludmFyaWFudDxMb3dlcj4gbWV0aG9kMSgpIHsKKyAgLy8gICAgICAgICAgICAgICBeXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLklOVkFMSURfT1ZFUlJJREUKKyAgLy8gW2NmZV0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgJ0MubWV0aG9kMScgaXMgJ0ludmFyaWFudDxMb3dlcj4nLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUsICdJbnZhcmlhbnQ8TWlkZGxlPicsIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgJ0EubWV0aG9kMScuCisgICAgcmV0dXJuIG5ldyBJbnZhcmlhbnQ8TG93ZXI+KCk7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCBtZXRob2QyKEludmFyaWFudDxVcHBlcj4geCkge30KKyAgLy8gICBeXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLklOVkFMSURfT1ZFUlJJREUKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUaGUgcGFyYW1ldGVyICd4JyBvZiB0aGUgbWV0aG9kICdDLm1ldGhvZDInIGhhcyB0eXBlICdJbnZhcmlhbnQ8VXBwZXI+Jywgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSwgJ0ludmFyaWFudDxNaWRkbGU+JywgaW4gdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnQS5tZXRob2QyJy4KK30KKworY2xhc3MgRDxvdXQgVCBleHRlbmRzIEludmFyaWFudDxNaWRkbGU+PiB7fQorCitjbGFzcyBFIHsKKyAgRDxJbnZhcmlhbnQ8VXBwZXI+PiBtZXRob2QxKCkgeworICAvL15eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gVHlwZSBhcmd1bWVudCAnSW52YXJpYW50PFVwcGVyPicgZG9lc24ndCBjb25mb3JtIHRvIHRoZSBib3VuZCAnSW52YXJpYW50PE1pZGRsZT4nIG9mIHRoZSB0eXBlIHZhcmlhYmxlICdUJyBvbiAnRCcgaW4gdGhlIHJldHVybiB0eXBlLgorICAgIHJldHVybiBEPEludmFyaWFudDxVcHBlcj4+KCk7CisgICAgLy8gICAgIF4KKyAgICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdJbnZhcmlhbnQ8VXBwZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdJbnZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdEJy4KKyAgICAvLyAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgICAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTCisgIH0KKworICBEPEludmFyaWFudDxMb3dlcj4+IG1ldGhvZDIoKSB7CisgIC8vXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdJbnZhcmlhbnQ8TG93ZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdJbnZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdEJyBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuIEQ8SW52YXJpYW50PExvd2VyPj4oKTsKKyAgICAvLyAgICAgXgorICAgIC8vIFtjZmVdIFR5cGUgYXJndW1lbnQgJ0ludmFyaWFudDxMb3dlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0ludmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0QnLgorICAgIC8vICAgICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgfQorfQorCit2b2lkIHRlc3RDYWxsPFQ+KEl0ZXJhYmxlPEludmFyaWFudDxUPj4geCkge30KKworbWFpbigpIHsKKyAgRDxJbnZhcmlhbnQ8VXBwZXI+PiBkVXBwZXIgPSBuZXcgRDxJbnZhcmlhbnQ8VXBwZXI+PigpOworICAvL15eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTCisgIC8vICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdJbnZhcmlhbnQ8VXBwZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdJbnZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdEJy4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdJbnZhcmlhbnQ8VXBwZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdJbnZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdEJy4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLlRZUEVfQVJHVU1FTlRfTk9UX01BVENISU5HX0JPVU5EUworICBEPEludmFyaWFudDxMb3dlcj4+IGRMb3dlciA9IG5ldyBEPEludmFyaWFudDxMb3dlcj4+KCk7CisgIC8vXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIFR5cGUgYXJndW1lbnQgJ0ludmFyaWFudDxMb3dlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0ludmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0QnLgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIFR5cGUgYXJndW1lbnQgJ0ludmFyaWFudDxMb3dlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0ludmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0QnLgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuVFlQRV9BUkdVTUVOVF9OT1RfTUFUQ0hJTkdfQk9VTkRTCisKKyAgSXRlcmFibGU8SW52YXJpYW50PExvd2VyPj4gaXRlcmFibGVMb3dlciA9IFtuZXcgSW52YXJpYW50PExvd2VyPigpXTsKKyAgTGlzdDxJbnZhcmlhbnQ8TWlkZGxlPj4gbGlzdE1pZGRsZSA9IFtuZXcgSW52YXJpYW50PE1pZGRsZT4oKV07CisgIGl0ZXJhYmxlTG93ZXIgPSBsaXN0TWlkZGxlOworICAvLyAgICAgICAgICAgICAgXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnTGlzdDxJbnZhcmlhbnQ8TWlkZGxlPj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnSXRlcmFibGU8SW52YXJpYW50PExvd2VyPj4nLgorCisgIEl0ZXJhYmxlPEludmFyaWFudDxNaWRkbGU+PiBpdGVyYWJsZU1pZGRsZSA9IFtuZXcgSW52YXJpYW50PE1pZGRsZT4oKV07CisgIExpc3Q8SW52YXJpYW50PExvd2VyPj4gbGlzdExvd2VyID0gW25ldyBJbnZhcmlhbnQ8TG93ZXI+KCldOworICBpdGVyYWJsZU1pZGRsZSA9IGxpc3RMb3dlcjsKKyAgLy8gICAgICAgICAgICAgICBeXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0xpc3Q8SW52YXJpYW50PExvd2VyPj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnSXRlcmFibGU8SW52YXJpYW50PE1pZGRsZT4+Jy4KKworICB0ZXN0Q2FsbDxMb3dlcj4obGlzdE1pZGRsZSk7CisgIC8vICAgICAgICAgICAgICBeXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRQorICAvLyBbY2ZlXSBUaGUgYXJndW1lbnQgdHlwZSAnTGlzdDxJbnZhcmlhbnQ8TWlkZGxlPj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZSAnSXRlcmFibGU8SW52YXJpYW50PExvd2VyPj4nLgorCisgIHRlc3RDYWxsPE1pZGRsZT4obGlzdExvd2VyKTsKKyAgLy8gICAgICAgICAgICAgICBeXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisgIC8vIFtjZmVdIFRoZSBhcmd1bWVudCB0eXBlICdMaXN0PEludmFyaWFudDxMb3dlcj4+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byB0aGUgcGFyYW1ldGVyIHR5cGUgJ0l0ZXJhYmxlPEludmFyaWFudDxNaWRkbGU+PicuCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9pbm91dF9zdWJ0eXBpbmdfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5vdXRfc3VidHlwaW5nX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI1MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfaW5vdXRfc3VidHlwaW5nX3Rlc3QuZGFydApAQCAtMCwwICsxLDE3MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBzdWJ0eXBpbmcgZm9yIHRoZSBgaW5vdXRgIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorCitjbGFzcyBVcHBlciB7fQorY2xhc3MgTWlkZGxlIGV4dGVuZHMgVXBwZXIge30KK2NsYXNzIExvd2VyIGV4dGVuZHMgTWlkZGxlIHt9CisKK2NsYXNzIEEgeworICBJbnZhcmlhbnQ8TWlkZGxlPiBtZXRob2QxKCkgeworICAgIHJldHVybiBuZXcgSW52YXJpYW50PE1pZGRsZT4oKTsKKyAgfQorCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8TWlkZGxlPiB4KSB7fQorfQorCitjbGFzcyBCIGV4dGVuZHMgQSB7CisgIEBvdmVycmlkZQorICBJbnZhcmlhbnQ8TWlkZGxlPiBtZXRob2QxKCkgeworICAgIHJldHVybiBuZXcgSW52YXJpYW50PE1pZGRsZT4oKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoSW52YXJpYW50PE1pZGRsZT4geCkge30KK30KKworY2xhc3MgQzxvdXQgWCBleHRlbmRzIEludmFyaWFudDxNaWRkbGU+PiB7fQorCitjbGFzcyBEIHsKKyAgQzxJbnZhcmlhbnQ8TWlkZGxlPj4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gQzxJbnZhcmlhbnQ8TWlkZGxlPj4oKTsKKyAgfQorfQorCitjbGFzcyBFIHsKKyAgSW52YXJpYW50PGR5bmFtaWM+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhcmlhbnQ8ZHluYW1pYz4oKTsKKyAgfQorCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8T2JqZWN0Pz4geCkge30KK30KKworY2xhc3MgRiBleHRlbmRzIEUgeworICBAb3ZlcnJpZGUKKyAgSW52YXJpYW50PE9iamVjdD8+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhcmlhbnQ8T2JqZWN0Pz4oKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoSW52YXJpYW50PGR5bmFtaWM+IHgpIHt9Cit9CisKK2NsYXNzIEcgeworICBJbnZhcmlhbnQ8ZHluYW1pYz4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gbmV3IEludmFyaWFudDxkeW5hbWljPigpOworICB9CisKKyAgdm9pZCBtZXRob2QyKEludmFyaWFudDxGdXR1cmVPcjxkeW5hbWljPj4geCkge30KK30KKworY2xhc3MgSCBleHRlbmRzIEcgeworICBAb3ZlcnJpZGUKKyAgSW52YXJpYW50PEZ1dHVyZU9yPGR5bmFtaWM+PiBtZXRob2QxKCkgeworICAgIHJldHVybiBuZXcgSW52YXJpYW50PEZ1dHVyZU9yPGR5bmFtaWM+PigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8ZHluYW1pYz4geCkge30KK30KKworY2xhc3MgSSB7CisgIEludmFyaWFudDxGdXR1cmVPcjxOZXZlcj4+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhcmlhbnQ8RnV0dXJlT3I8TmV2ZXI+PigpOworICB9CisKKyAgdm9pZCBtZXRob2QyKEludmFyaWFudDxGdXR1cmU8TmV2ZXI+PiB4KSB7fQorfQorCitjbGFzcyBKIGV4dGVuZHMgSSB7CisgIEBvdmVycmlkZQorICBJbnZhcmlhbnQ8RnV0dXJlPE5ldmVyPj4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gbmV3IEludmFyaWFudDxGdXR1cmU8TmV2ZXI+PigpOworICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgbWV0aG9kMihJbnZhcmlhbnQ8RnV0dXJlT3I8TmV2ZXI+PiB4KSB7fQorfQorCit2b2lkIHRlc3RDYWxsKEl0ZXJhYmxlPEludmFyaWFudDxNaWRkbGU+PiB4KSB7fQorCittYWluKCkgeworICBBIGEgPSBuZXcgQSgpOworICBFeHBlY3QudHlwZTxJbnZhcmlhbnQ8TWlkZGxlPj4oYS5tZXRob2QxKCkpOworICBFeHBlY3Qubm90VHlwZTxJbnZhcmlhbnQ8VXBwZXI+PihhLm1ldGhvZDEoKSk7CisgIEV4cGVjdC5ub3RUeXBlPEludmFyaWFudDxMb3dlcj4+KGEubWV0aG9kMSgpKTsKKyAgYS5tZXRob2QyKG5ldyBJbnZhcmlhbnQ8TWlkZGxlPigpKTsKKworICBCIGIgPSBuZXcgQigpOworICBFeHBlY3QudHlwZTxJbnZhcmlhbnQ8TWlkZGxlPj4oYi5tZXRob2QxKCkpOworICBFeHBlY3Qubm90VHlwZTxJbnZhcmlhbnQ8VXBwZXI+PihiLm1ldGhvZDEoKSk7CisgIEV4cGVjdC5ub3RUeXBlPEludmFyaWFudDxMb3dlcj4+KGIubWV0aG9kMSgpKTsKKyAgYi5tZXRob2QyKG5ldyBJbnZhcmlhbnQ8TWlkZGxlPigpKTsKKworICBDPEludmFyaWFudDxNaWRkbGU+PiBjID0gbmV3IEM8SW52YXJpYW50PE1pZGRsZT4+KCk7CisKKyAgRCBkID0gbmV3IEQoKTsKKyAgRXhwZWN0LnR5cGU8QzxJbnZhcmlhbnQ8TWlkZGxlPj4+KGQubWV0aG9kMSgpKTsKKworICBFIGUgPSBuZXcgRSgpOworICBFeHBlY3QudHlwZTxJbnZhcmlhbnQ8ZHluYW1pYz4+KGUubWV0aG9kMSgpKTsKKyAgZS5tZXRob2QyKG5ldyBJbnZhcmlhbnQ8T2JqZWN0Pz4oKSk7CisKKyAgLy8gSW52YXJpYW50PGR5bmFtaWM+IDw6PiBJbnZhcmlhbnQ8T2JqZWN0Pz4KKyAgRiBmID0gbmV3IEYoKTsKKyAgRXhwZWN0LnR5cGU8SW52YXJpYW50PE9iamVjdD8+PihmLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPEludmFyaWFudDxkeW5hbWljPj4oZi5tZXRob2QxKCkpOworICBmLm1ldGhvZDIobmV3IEludmFyaWFudDxPYmplY3Q/PigpKTsKKyAgZi5tZXRob2QyKG5ldyBJbnZhcmlhbnQ8ZHluYW1pYz4oKSk7CisKKyAgRyBnID0gbmV3IEcoKTsKKyAgRXhwZWN0LnR5cGU8SW52YXJpYW50PGR5bmFtaWM+PihnLm1ldGhvZDEoKSk7CisgIGcubWV0aG9kMihuZXcgSW52YXJpYW50PEZ1dHVyZU9yPGR5bmFtaWM+PigpKTsKKworICAvLyBJbnZhcmlhbnQ8RnV0dXJlT3I8ZHluYW1pYz4+IDw6PiBJbnZhcmlhbnQ8ZHluYW1pYz4KKyAgSCBoID0gbmV3IEgoKTsKKyAgRXhwZWN0LnR5cGU8SW52YXJpYW50PEZ1dHVyZU9yPGR5bmFtaWM+Pj4oaC5tZXRob2QxKCkpOworICBFeHBlY3QudHlwZTxJbnZhcmlhbnQ8ZHluYW1pYz4+KGgubWV0aG9kMSgpKTsKKyAgaC5tZXRob2QyKG5ldyBJbnZhcmlhbnQ8RnV0dXJlT3I8ZHluYW1pYz4+KCkpOworICBoLm1ldGhvZDIobmV3IEludmFyaWFudDxkeW5hbWljPigpKTsKKworICBJIGkgPSBuZXcgSSgpOworICBFeHBlY3QudHlwZTxJbnZhcmlhbnQ8RnV0dXJlT3I8TmV2ZXI+Pj4oaS5tZXRob2QxKCkpOworICBpLm1ldGhvZDIobmV3IEludmFyaWFudDxGdXR1cmU8TmV2ZXI+PigpKTsKKworICAvLyBJbnZhcmlhbnQ8RnV0dXJlT3I8TmV2ZXI+PiA8Oj4gSW52YXJpYW50PEZ1dHVyZTxOZXZlcj4+CisgIEogaiA9IG5ldyBKKCk7CisgIEV4cGVjdC50eXBlPEludmFyaWFudDxGdXR1cmVPcjxOZXZlcj4+PihqLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPEludmFyaWFudDxGdXR1cmU8TmV2ZXI+Pj4oai5tZXRob2QxKCkpOworICBqLm1ldGhvZDIobmV3IEludmFyaWFudDxGdXR1cmVPcjxOZXZlcj4+KCkpOworICBqLm1ldGhvZDIobmV3IEludmFyaWFudDxGdXR1cmU8TmV2ZXI+PigpKTsKKworICBJdGVyYWJsZTxJbnZhcmlhbnQ8TWlkZGxlPj4gaXRlcmFibGVNaWRkbGUgPSBbbmV3IEludmFyaWFudDxNaWRkbGU+KCldOworICBMaXN0PEludmFyaWFudDxNaWRkbGU+PiBsaXN0TWlkZGxlID0gW25ldyBJbnZhcmlhbnQ8TWlkZGxlPigpXTsKKyAgaXRlcmFibGVNaWRkbGUgPSBsaXN0TWlkZGxlOworCisgIHRlc3RDYWxsKGxpc3RNaWRkbGUpOworCisgIEV4cGVjdC5zdWJ0eXBlPEludmFyaWFudDxNaWRkbGU+LCBJbnZhcmlhbnQ8TWlkZGxlPj4oKTsKKyAgRXhwZWN0Lm5vdFN1YnR5cGU8SW52YXJpYW50PExvd2VyPiwgSW52YXJpYW50PE1pZGRsZT4+KCk7CisgIEV4cGVjdC5ub3RTdWJ0eXBlPEludmFyaWFudDxVcHBlcj4sIEludmFyaWFudDxNaWRkbGU+PigpOworCisgIEV4cGVjdC5zdWJ0eXBlPEludmFyaWFudDxkeW5hbWljPiwgSW52YXJpYW50PE9iamVjdD8+PigpOworICBFeHBlY3Quc3VidHlwZTxJbnZhcmlhbnQ8T2JqZWN0Pz4sIEludmFyaWFudDxkeW5hbWljPj4oKTsKKworICBFeHBlY3Quc3VidHlwZTxJbnZhcmlhbnQ8RnV0dXJlT3I8ZHluYW1pYz4+LCBJbnZhcmlhbnQ8ZHluYW1pYz4+KCk7CisgIEV4cGVjdC5zdWJ0eXBlPEludmFyaWFudDxkeW5hbWljPiwgSW52YXJpYW50PEZ1dHVyZU9yPGR5bmFtaWM+Pj4oKTsKKworICBFeHBlY3Quc3VidHlwZTxJbnZhcmlhbnQ8RnV0dXJlT3I8TmV2ZXI+PiwgSW52YXJpYW50PEZ1dHVyZTxOZXZlcj4+PigpOworICBFeHBlY3Quc3VidHlwZTxJbnZhcmlhbnQ8RnV0dXJlPE5ldmVyPj4sIEludmFyaWFudDxGdXR1cmVPcjxOZXZlcj4+PigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfbWV0aG9kX3RlYXJvZmZfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfbWV0aG9kX3RlYXJvZmZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjlkNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9tZXRob2RfdGVhcm9mZl90ZXN0LmRhcnQKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyByZWlmaWVkIHR5cGVzIG9mIHRvcm4tb2ZmIG1ldGhvZHMgd2l0aCB0eXBlIHBhcmFtZXRlcnMgdGhhdCBoYXZlCisvLyBleHBsaWNpdCB2YXJpYW5jZSBtb2RpZmllcnMuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7CisgIGludCBtZXRob2QoVCB4KSB7IHJldHVybiAtMTsgfQorfQorCitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD4geworICBUIG1ldGhvZChUIHgpIHsgcmV0dXJuIHg7IH0KK30KKworY2xhc3MgTGVnYWN5Q292YXJpYW50PFQ+IHsKKyAgaW50IG1ldGhvZChUIHgpIHsgcmV0dXJuIC0xOyB9Cit9CisKK2NsYXNzIE5vU3VjaE1ldGhvZDxpbm91dCBUPiBpbXBsZW1lbnRzIEludmFyaWFudDxUPiB7CisgIG5vU3VjaE1ldGhvZChfKSA9PiAzOworfQorCittYWluKCkgeworICBDb250cmF2YXJpYW50PGludD4gY29udHJhRGlmZiA9IG5ldyBDb250cmF2YXJpYW50PG51bT4oKTsKKyAgRXhwZWN0Lm5vdFR5cGU8aW50IEZ1bmN0aW9uKE9iamVjdCk+KGNvbnRyYURpZmYubWV0aG9kKTsKKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKG51bSk+KGNvbnRyYURpZmYubWV0aG9kKTsKKworICBDb250cmF2YXJpYW50PG51bT4gY29udHJhU2FtZSA9IG5ldyBDb250cmF2YXJpYW50PG51bT4oKTsKKyAgRXhwZWN0Lm5vdFR5cGU8aW50IEZ1bmN0aW9uKE9iamVjdCk+KGNvbnRyYVNhbWUubWV0aG9kKTsKKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKG51bSk+KGNvbnRyYVNhbWUubWV0aG9kKTsKKworICBJbnZhcmlhbnQ8bnVtPiBpbnZTYW1lID0gbmV3IEludmFyaWFudDxudW0+KCk7CisgIEV4cGVjdC5ub3RUeXBlPG51bSBGdW5jdGlvbihPYmplY3QpPihpbnZTYW1lLm1ldGhvZCk7CisgIEV4cGVjdC50eXBlPG51bSBGdW5jdGlvbihudW0pPihpbnZTYW1lLm1ldGhvZCk7CisKKyAgTGVnYWN5Q292YXJpYW50PG51bT4gbGVnYWN5RGlmZiA9IG5ldyBMZWdhY3lDb3ZhcmlhbnQ8aW50PigpOworICBFeHBlY3QudHlwZTxpbnQgRnVuY3Rpb24oT2JqZWN0KT4obGVnYWN5RGlmZi5tZXRob2QpOworICBFeHBlY3QudHlwZTxpbnQgRnVuY3Rpb24obnVtKT4obGVnYWN5RGlmZi5tZXRob2QpOworCisgIExlZ2FjeUNvdmFyaWFudDxudW0+IGxlZ2FjeVNhbWUgPSBuZXcgTGVnYWN5Q292YXJpYW50PG51bT4oKTsKKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKE9iamVjdCk+KGxlZ2FjeVNhbWUubWV0aG9kKTsKKyAgRXhwZWN0LnR5cGU8aW50IEZ1bmN0aW9uKG51bSk+KGxlZ2FjeVNhbWUubWV0aG9kKTsKKworICBOb1N1Y2hNZXRob2Q8bnVtPiBuc20gPSBuZXcgTm9TdWNoTWV0aG9kPG51bT4oKTsKKyAgRXhwZWN0Lm5vdFR5cGU8bnVtIEZ1bmN0aW9uKE9iamVjdCk+KG5zbS5tZXRob2QpOworICBFeHBlY3QudHlwZTxudW0gRnVuY3Rpb24obnVtKT4obnNtLm1ldGhvZCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9tdWx0aV9zdWJjbGFzc19lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9tdWx0aV9zdWJjbGFzc19lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3OTBjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX211bHRpX3N1YmNsYXNzX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIGVycm9uZW91cyB2YXJpYW5jZSB1c2FnZSBtdWx0aXBsZSB0eXBlIHBhcmFtZXRlcnMuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCit0eXBlZGVmIENvdkZ1bmN0aW9uPFQ+ID0gVCBGdW5jdGlvbigpOwordHlwZWRlZiBDb250cmFGdW5jdGlvbjxUPiA9IHZvaWQgRnVuY3Rpb24oVCk7CisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KKworY2xhc3MgTXVsdGlUd288aW4gVCwgb3V0IFU+IHt9CitjbGFzcyBNdWx0aVRocmVlPGluIFQsIG91dCBVLCBpbm91dCBWPiB7fQorCitjbGFzcyBBPGluIFQsIG91dCBVLCBpbm91dCBWPiBleHRlbmRzIENvdmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBCPGluIFQ+IGV4dGVuZHMgTXVsdGlUaHJlZTxULCBULCBUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ011bHRpVGhyZWUnLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBDPGluIFQsIG91dCBVLCBpbm91dCBWPiBleHRlbmRzIE11bHRpVHdvPFUsIFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ011bHRpVHdvJy4KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdVJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTXVsdGlUd28nLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorLy8gICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgRDxpbiBULCBvdXQgVSwgaW5vdXQgVj4gZXh0ZW5kcyBNdWx0aVRocmVlPFYsIFUsIFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTXVsdGlUaHJlZScuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEU8aW4gVCwgb3V0IFUsIGlub3V0IFY+IGV4dGVuZHMgTXVsdGlUaHJlZTxDb3ZhcmlhbnQ8VT4sIENvdmFyaWFudDxUPiwgQ292YXJpYW50PFU+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNdWx0aVRocmVlJy4KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdVJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTXVsdGlUaHJlZScuCisvLyAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisvLyAgICAgICAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBGPGluIFQsIG91dCBVLCBpbm91dCBWPiBleHRlbmRzIE11bHRpVHdvPENvbnRyYXZhcmlhbnQ8VD4sIENvbnRyYXZhcmlhbnQ8VT4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ011bHRpVHdvJy4KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdVJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTXVsdGlUd28nLgorLy8gICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorLy8gICAgICAgICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgRzxpbiBULCBvdXQgVSwgaW5vdXQgVj4gZXh0ZW5kcyBNdWx0aVRocmVlPENvdkZ1bmN0aW9uPFU+LCBDb3ZGdW5jdGlvbjxUPiwgQ292RnVuY3Rpb248VT4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ2luJyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnb3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ011bHRpVGhyZWUnLgorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1UnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNdWx0aVRocmVlJy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKy8vICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEg8aW4gVCwgb3V0IFUsIGlub3V0IFY+IGV4dGVuZHMgTXVsdGlUd288Q29udHJhRnVuY3Rpb248VD4sIENvbnRyYUZ1bmN0aW9uPFU+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdpbicgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ291dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNdWx0aVR3bycuCisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVScgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ011bHRpVHdvJy4KKy8vICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKy8vICAgICAgICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9tdWx0aV9zdWJjbGFzc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9tdWx0aV9zdWJjbGFzc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0ZjU3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX211bHRpX3N1YmNsYXNzX3Rlc3QuZGFydApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHZhcmlhbmNlIHVzYWdlIG11bHRpcGxlIHR5cGUgcGFyYW1ldGVycy4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK3R5cGVkZWYgQ292RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKCk7Cit0eXBlZGVmIENvbnRyYUZ1bmN0aW9uPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKKworY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBBPGluIFQsIG91dCBVPiB7fQorY2xhc3MgQjxpbiBULCBvdXQgVSwgaW5vdXQgVj4ge30KKworY2xhc3MgQzxpbm91dCBULCBpbiBVLCBvdXQgVj4gZXh0ZW5kcyBBPFQsIFY+IHt9CitjbGFzcyBEPGlub3V0IFQsIGluIFUsIG91dCBWPiBleHRlbmRzIEI8VSwgViwgVD4ge30KK2NsYXNzIEU8aW5vdXQgVCwgaW4gVSwgb3V0IFY+IGV4dGVuZHMgQjxULCBULCBUPiB7fQorCitjbGFzcyBGPGlub3V0IFQsIGluIFUsIG91dCBWPiBleHRlbmRzIEE8Q29udHJhdmFyaWFudDxWPiwgQ29udHJhdmFyaWFudDxVPj4ge30KK2NsYXNzIEc8aW5vdXQgVCwgaW4gVSwgb3V0IFY+IGV4dGVuZHMgQTxDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxWPj4sIENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PFU+Pj4ge30KK2NsYXNzIEg8aW5vdXQgVCwgaW4gVSwgb3V0IFY+IGV4dGVuZHMgQjxDb3ZhcmlhbnQ8VT4sIENvdmFyaWFudDxWPiwgQ292YXJpYW50PFQ+PiB7fQorCitjbGFzcyBJPGlub3V0IFQsIGluIFUsIG91dCBWPiBleHRlbmRzIEE8Q29udHJhRnVuY3Rpb248Vj4sIENvbnRyYUZ1bmN0aW9uPFU+PiB7fQorY2xhc3MgSjxpbm91dCBULCBpbiBVLCBvdXQgVj4gZXh0ZW5kcyBBPENvdkZ1bmN0aW9uPENvbnRyYUZ1bmN0aW9uPFY+PiwgQ29udHJhRnVuY3Rpb248Q292RnVuY3Rpb248VT4+PiB7fQorY2xhc3MgSzxpbm91dCBULCBpbiBVLCBvdXQgVj4gZXh0ZW5kcyBCPENvdkZ1bmN0aW9uPFU+LCBDb3ZGdW5jdGlvbjxWPiwgQ292RnVuY3Rpb248VD4+IHt9CisKK21haW4oKSB7CisgIEE8bnVtLCBib29sPiBhID0gQSgpOworICBCPG51bSwgYm9vbCwgU3RyaW5nPiBiID0gQigpOworICBDPG51bSwgYm9vbCwgU3RyaW5nPiBjID0gQygpOworICBEPG51bSwgYm9vbCwgU3RyaW5nPiBkID0gRCgpOworICBFPG51bSwgYm9vbCwgU3RyaW5nPiBlID0gRSgpOworICBGPG51bSwgYm9vbCwgU3RyaW5nPiBmID0gRigpOworICBHPG51bSwgYm9vbCwgU3RyaW5nPiBnID0gRygpOworICBIPG51bSwgYm9vbCwgU3RyaW5nPiBoID0gSCgpOworICBJPG51bSwgYm9vbCwgU3RyaW5nPiBpID0gSSgpOworICBKPG51bSwgYm9vbCwgU3RyaW5nPiBqID0gSigpOworICBLPG51bSwgYm9vbCwgU3RyaW5nPiBrID0gSygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X2ZpZWxkX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9maWVsZF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjNzlhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9maWVsZF9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgZmllbGQgdXNhZ2UgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIEE8b3V0IFQ+IHsKKyAgdm9pZCBzZXQgYShUIHZhbHVlKSA9PiB2YWx1ZTsKKyAgLy8gICAgICAgICBeXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorICBmaW5hbCB2b2lkIEZ1bmN0aW9uKFQpIGIgPSAoVCB2YWwpIHt9OworICAvLyAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisgIGxhdGUgVCBjOworLy8gICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIFQ/IGQgPSBudWxsOworICAvLyBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorfQorCittaXhpbiBCTWl4aW48b3V0IFQ+IHsKKyAgdm9pZCBzZXQgYShUIHZhbHVlKSA9PiB2YWx1ZTsKKyAgLy8gICAgICAgICBeXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorICBmaW5hbCB2b2lkIEZ1bmN0aW9uKFQpIGIgPSAoVCB2YWwpIHt9OworICAvLyAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisgIGxhdGUgVCBjOworLy8gICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIFQ/IGQgPSBudWxsOworICAvLyBeCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorfQorCithYnN0cmFjdCBjbGFzcyBDPG91dCBUPiB7CisgIHZvaWQgc2V0IGEoVCB2YWx1ZSkgPT4gdmFsdWU7CisgIC8vICAgICAgICAgXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KK30KKworY2xhc3MgRDxvdXQgVD4gZXh0ZW5kcyBDPFQ+IHsKKyAgbGF0ZSB2YXIgYTsKKyAgLy8gICAgICAgXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9maWVsZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfZmllbGRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTljYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfZmllbGRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgdmFyaW91cyBmaWVsZHMgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit0eXBlZGVmIFZvaWQySW50ID0gaW50PyBGdW5jdGlvbigpOworCitjbGFzcyBBPG91dCBUPiB7CisgIGZpbmFsIFQ/IGEgPSBudWxsOworICBmaW5hbCBUPyBGdW5jdGlvbigpIGIgPSAoKSA9PiBudWxsOworICBUPyBnZXQgYyA9PiBudWxsOworICBBPFQ+IGdldCBkID0+IHRoaXM7CisgIGNvdmFyaWFudCBsYXRlIFQgZTsKKyAgdm9pZCBzZXQgZihjb3ZhcmlhbnQgVCB2YWx1ZSkgPT4gdmFsdWU7Cit9CisKK21peGluIEJNaXhpbjxvdXQgVD4geworICBmaW5hbCBUPyBhID0gbnVsbDsKKyAgZmluYWwgVD8gRnVuY3Rpb24oKSBiID0gKCkgPT4gbnVsbDsKKyAgVD8gZ2V0IGMgPT4gbnVsbDsKKyAgQk1peGluPFQ+IGdldCBkID0+IHRoaXM7CisgIGNvdmFyaWFudCBsYXRlIFQgZTsKKyAgdm9pZCBzZXQgZihjb3ZhcmlhbnQgVCB2YWx1ZSkgPT4gdmFsdWU7Cit9CisKK2NsYXNzIEIgd2l0aCBCTWl4aW48aW50PiB7fQorCit2b2lkIHRlc3RDbGFzcygpIHsKKyAgQTxpbnQ+IGEgPSBuZXcgQSgpOworCisgIEV4cGVjdC5pc051bGwoYS5hKTsKKworICBFeHBlY3QudHlwZTxWb2lkMkludD4oYS5iKTsKKyAgRXhwZWN0LmlzTnVsbChhLmIoKSk7CisKKyAgRXhwZWN0LmlzTnVsbChhLmMpOworCisgIEV4cGVjdC5pc051bGwoYS5kLmEpOworCisgIGEuZSA9IDI7CisgIEV4cGVjdC5lcXVhbHMoMiwgYS5lKTsKKworICBhLmYgPSAyOworfQorCit2b2lkIHRlc3RNaXhpbigpIHsKKyAgQiBiID0gbmV3IEIoKTsKKworICBFeHBlY3QuaXNOdWxsKGIuYSk7CisKKyAgRXhwZWN0LnR5cGU8Vm9pZDJJbnQ+KGIuYik7CisgIEV4cGVjdC5pc051bGwoYi5iKCkpOworCisgIEV4cGVjdC5pc051bGwoYi5jKTsKKworICBFeHBlY3QuaXNOdWxsKGIuZC5hKTsKKworICBiLmUgPSAyOworICBFeHBlY3QuZXF1YWxzKDIsIGIuZSk7CisKKyAgYi5mID0gMjsKK30KKworbWFpbigpIHsKKyAgdGVzdENsYXNzKCk7CisgIHRlc3RNaXhpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X2luZmVyZW5jZV9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfaW5mZXJlbmNlX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDljZGZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X2luZmVyZW5jZV9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBsb2NhbCBpbmZlcmVuY2UgZXJyb3JzIGZvciB0aGUgYG91dGAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CisKK2NsYXNzIEV4YWN0bHk8aW5vdXQgVD4ge30KKworY2xhc3MgVXBwZXIge30KK2NsYXNzIE1pZGRsZSBleHRlbmRzIFVwcGVyIHt9CitjbGFzcyBMb3dlciBleHRlbmRzIE1pZGRsZSB7fQorCitjbGFzcyBDb3ZCb3VuZDxvdXQgVD4geworICBDb3ZCb3VuZChUIHgsIHZvaWQgRnVuY3Rpb24oVCkgeSkge30KK30KKworRXhhY3RseTxUPiBpbmZlckNvdkNvdjxUPihDb3ZhcmlhbnQ8VD4geCwgQ292YXJpYW50PFQ+IHkpID0+IG5ldyBFeGFjdGx5PFQ+KCk7CitFeGFjdGx5PFQ+IGluZmVyQ292Qm91bmQ8VD4oQ292Qm91bmQ8VD4geCkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKKworbWFpbigpIHsKKyAgRXhhY3RseTxVcHBlcj4gdXBwZXI7CisgIEV4YWN0bHk8TWlkZGxlPiBtaWRkbGU7CisgIEV4YWN0bHk8TG93ZXI+IGxvd2VyOworCisgIC8vIExvd2VyIDw6IFQgPDogTWlkZGxlLgorICAvLyBXZSBjaG9vc2UgTWlkZGxlLgorICB2YXIgaW5mZXJyZWRNaWRkbGUgPSBpbmZlckNvdkNvdihDb3ZhcmlhbnQ8TG93ZXI+KCksIENvdmFyaWFudDxNaWRkbGU+KCkpOworICBsb3dlciA9IGluZmVycmVkTWlkZGxlOworICAvLyAgICAgIF5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PE1pZGRsZT4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRXhhY3RseTxMb3dlcj4nLgorCisgIC8vIExvd2VyIDw6IFQgPDogVXBwZXIuCisgIC8vIFdlIGNob29zZSBVcHBlci4KKyAgdmFyIGluZmVycmVkVXBwZXIgPSBpbmZlckNvdkNvdihDb3ZhcmlhbnQ8TG93ZXI+KCksIENvdmFyaWFudDxVcHBlcj4oKSk7CisgIGxvd2VyID0gaW5mZXJyZWRVcHBlcjsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PFVwcGVyPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PExvd2VyPicuCisKKyAgLy8gSW5mZXJlbmNlIGZvciBDb3Zib3VuZCguLi4pIHByb2R1Y2VzIExvd2VyIDw6IFQgPDogVXBwZXIuCisgIC8vIFNpbmNlIFQgaXMgY292YXJpYW50LCB3ZSBjaG9vc2UgTG93ZXIgYXMgdGhlIHNvbHV0aW9uLgorICB2YXIgaW5mZXJyZWRDb3ZMb3dlciA9IGluZmVyQ292Qm91bmQoQ292Qm91bmQoTG93ZXIoKSwgKFVwcGVyIHgpIHt9KSk7CisgIHVwcGVyID0gaW5mZXJyZWRDb3ZMb3dlcjsKKyAgLy8gICAgICBeXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PExvd2VyPicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PFVwcGVyPicuCisKKyAgLy8gSW5mZXJlbmNlIGZvciBDb3Zib3VuZCguLi4pIHByb2R1Y2VzIExvd2VyIDw6IFQgPDogTWlkZGxlLgorICAvLyBTaW5jZSBUIGlzIGNvdmFyaWFudCwgd2UgY2hvb3NlIExvd2VyIGFzIHRoZSBzb2x1dGlvbi4KKyAgdmFyIGluZmVycmVkQ292TG93ZXIyID0gaW5mZXJDb3ZCb3VuZChDb3ZCb3VuZChMb3dlcigpLCAoTWlkZGxlIHgpIHt9KSk7CisgIG1pZGRsZSA9IGluZmVycmVkQ292TG93ZXIyOworICAvLyAgICAgICBeXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxMb3dlcj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRXhhY3RseTxNaWRkbGU+Jy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9pbmZlcmVuY2VfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X2luZmVyZW5jZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiNDllMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9pbmZlcmVuY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgbG9jYWwgaW5mZXJlbmNlIGZvciB0aGUgYG91dGAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CisKK2NsYXNzIEV4YWN0bHk8aW5vdXQgVD4ge30KKworY2xhc3MgVXBwZXIge30KK2NsYXNzIE1pZGRsZSBleHRlbmRzIFVwcGVyIHt9CitjbGFzcyBMb3dlciBleHRlbmRzIE1pZGRsZSB7fQorCitjbGFzcyBDb3ZCb3VuZDxvdXQgVD4geworICBDb3ZCb3VuZChUIHgsIHZvaWQgRnVuY3Rpb24oVCkgeSkge30KK30KKworRXhhY3RseTxUPiBpbmZlckNvdkNvdjxUPihDb3ZhcmlhbnQ8VD4geCwgQ292YXJpYW50PFQ+IHkpID0+IG5ldyBFeGFjdGx5PFQ+KCk7CitFeGFjdGx5PFQ+IGluZmVyQ292Qm91bmQ8VD4oQ292Qm91bmQ8VD4geCkgPT4gbmV3IEV4YWN0bHk8VD4oKTsKKworbWFpbigpIHsKKyAgRXhhY3RseTxVcHBlcj4gdXBwZXI7CisgIEV4YWN0bHk8TG93ZXI+IGxvd2VyOworCisgIC8vIFVwcGVyIDw6IFQKKyAgLy8gVXBwZXIgPDogVAorICAvLyBDaG9vc2UgVXBwZXIKKyAgdmFyIGluZmVycmVkVXBwZXIgPSBpbmZlckNvdkNvdihDb3ZhcmlhbnQ8VXBwZXI+KCksIENvdmFyaWFudDxVcHBlcj4oKSk7CisgIHVwcGVyID0gaW5mZXJyZWRVcHBlcjsKKworICAvLyBVcHBlciA8OiBUCisgIC8vIE1pZGRsZSA8OiBUCisgIC8vIENob29zZSBVcHBlciBzaW5jZSBpdCBpcyB0aGUgbG93ZXN0IHVwcGVyIGJvdW5kIG9mIFVwcGVyIGFuZCBNaWRkbGUuCisgIHZhciBpbmZlcnJlZFVwcGVyMiA9IGluZmVyQ292Q292KENvdmFyaWFudDxVcHBlcj4oKSwgQ292YXJpYW50PE1pZGRsZT4oKSk7CisgIHVwcGVyID0gaW5mZXJyZWRVcHBlcjI7CisKKyAgLy8gVXBwZXIgPDogVAorICAvLyBMb3dlciA8OiBUCisgIC8vIENob29zZSBVcHBlciBzaW5jZSBpdCBpcyB0aGUgbG93ZXN0IHVwcGVyIGJvdW5kIG9mIFVwcGVyIGFuZCBMb3dlci4KKyAgdmFyIGluZmVycmVkVXBwZXIzID0gaW5mZXJDb3ZDb3YoQ292YXJpYW50PFVwcGVyPigpLCBDb3ZhcmlhbnQ8TG93ZXI+KCkpOworICB1cHBlciA9IGluZmVycmVkVXBwZXIzOworCisgIC8vIExvd2VyIDw6IFQgPDogVXBwZXIKKyAgLy8gQ2hvb3NlIExvd2VyLgorICB2YXIgaW5mZXJyZWRDb3ZMb3dlciA9IGluZmVyQ292Qm91bmQoQ292Qm91bmQoTG93ZXIoKSwgKFVwcGVyIHgpIHt9KSk7CisgIGxvd2VyID0gaW5mZXJyZWRDb3ZMb3dlcjsKKworICAvLyBMb3dlciA8OiBUIDw6IE1pZGRsZQorICAvLyBDaG9vc2UgTG93ZXIuCisgIHZhciBpbmZlcnJlZENvdkxvd2VyMiA9IGluZmVyQ292Qm91bmQoQ292Qm91bmQoTG93ZXIoKSwgKE1pZGRsZSB4KSB7fSkpOworICBsb3dlciA9IGluZmVycmVkQ292TG93ZXIyOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X21ldGhvZF9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfbWV0aG9kX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGViZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X21ldGhvZF9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwzNTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgZXJyb25lb3VzIG1ldGhvZCBzaWduYXR1cmVzIGFuZCByZXR1cm4gdHlwZXMgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK3R5cGVkZWYgSW52PFQ+ID0gdm9pZCBGdW5jdGlvbjxYIGV4dGVuZHMgVD4oKTsKK3R5cGVkZWYgQ292PFQ+ID0gVCBGdW5jdGlvbigpOwordHlwZWRlZiBDb250cmE8VD4gPSB2b2lkIEZ1bmN0aW9uKFQpOworCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CitjbGFzcyBDb250cmF2YXJpYW50PGluIFQ+IHt9CitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD4ge30KKworY2xhc3MgQTxvdXQgVD4geworICB2b2lkIG1ldGhvZDEoVCB4KSB7fQorICAvLyAgICAgICAgICAgXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyKENvdjxUPiB4KSB7fQorICAvLyAgICAgICAgICAgXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIENvbnRyYTxUPiBtZXRob2QzKCkgPT4gKFQgdmFsKSB7fTsKKy8vXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDQoQ292PENvdjxUPj4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgQ29udHJhPENvdjxUPj4gbWV0aG9kNSgpID0+IChDb3Y8VD4gbWV0aG9kKSB7fTsKKy8vXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgQ292PENvbnRyYTxUPj4gbWV0aG9kNigpIHsKKy8vXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuICgpIHsKKyAgICAgIHJldHVybiAoVCB4KSB7fTsKKyAgICB9OworICB9CisKKyAgdm9pZCBtZXRob2Q3KENvbnRyYTxDb250cmE8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIEludjxUPiBtZXRob2Q4KCkgPT4gdGhyb3cgInVuY2FsbGVkIjsKKy8vXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDkoSW52PFQ+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgQ29udHJhdmFyaWFudDxUPiBtZXRob2QxMCgpID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL15eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgdm9pZCBtZXRob2QxMShDb3ZhcmlhbnQ8VD4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIEludmFyaWFudDxUPiBtZXRob2QxMigpID0+IHRocm93ICJ1bmNhbGxlZCI7CisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kMTMoSW52YXJpYW50PFQ+IHgpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE0KENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QxNShDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHgpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PFQ+PiBtZXRob2QxNigpID0+IENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PFQ+PigpOworLy9eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICBDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4gbWV0aG9kMTcoKSA9PiBDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4oKTsKKy8vXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgdm9pZCBtZXRob2QxODxYIGV4dGVuZHMgQ29udHJhPFQ+PigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE5PFggZXh0ZW5kcyBDb250cmF2YXJpYW50PFQ+PigpIHt9CisgIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMCh7cmVxdWlyZWQgVCB4fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIxKHtyZXF1aXJlZCBDb3Y8VD4geH0pIHt9CisgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjIoe3JlcXVpcmVkIENvdmFyaWFudDxUPiB4fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMyh7cmVxdWlyZWQgQ292YXJpYW50PFQ+IHgsIHJlcXVpcmVkIENvbnRyYXZhcmlhbnQ8VD4geX0pIHt9CisgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjQ8WCBleHRlbmRzIFQ+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDI1PFggZXh0ZW5kcyBDb250cmE8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjY8WCBleHRlbmRzIENvbnRyYXZhcmlhbnQ8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KK30KKworbWl4aW4gQk1peGluPG91dCBUPiB7CisgIHZvaWQgbWV0aG9kMShUIHgpIHt9CisgIC8vICAgICAgICAgICBeXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIoQ292PFQ+IHgpIHt9CisgIC8vICAgICAgICAgICBeXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgQ29udHJhPFQ+IG1ldGhvZDMoKSA9PiAoVCB2YWwpIHt9OworLy9eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kNChDb3Y8Q292PFQ+PiB4KSB7fQorICAvLyAgICAgICAgICAgXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKworICBDb250cmE8Q292PFQ+PiBtZXRob2Q1KCkgPT4gKENvdjxUPiBtZXRob2QpIHt9OworLy9eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICBDb3Y8Q29udHJhPFQ+PiBtZXRob2Q2KCkgeworLy9eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKyAgICByZXR1cm4gKCkgeworICAgICAgcmV0dXJuIChUIHgpIHt9OworICAgIH07CisgIH0KKworICB2b2lkIG1ldGhvZDcoQ29udHJhPENvbnRyYTxUPj4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgSW52PFQ+IG1ldGhvZDgoKSA9PiB0aHJvdyAidW5jYWxsZWQiOworLy9eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIHZvaWQgbWV0aG9kOShJbnY8VD4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICBDb250cmF2YXJpYW50PFQ+IG1ldGhvZDEwKCkgPT4gdGhyb3cgInVuY2FsbGVkIjsKKy8vXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDExKENvdmFyaWFudDxUPiB4KSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgSW52YXJpYW50PFQ+IG1ldGhvZDEyKCkgPT4gdGhyb3cgInVuY2FsbGVkIjsKKy8vXl5eXl5eXl5eXl5eCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorLy8gICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisKKyAgdm9pZCBtZXRob2QxMyhJbnZhcmlhbnQ8VD4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMTQoQ292YXJpYW50PENvdmFyaWFudDxUPj4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDE1KENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4geCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IG1ldGhvZDE2KCkgPT4gQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+KCk7CisvL15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24gaW4gdGhlIHJldHVybiB0eXBlLgorCisgIENvdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PiBtZXRob2QxNygpID0+IENvdmFyaWFudDxDb250cmF2YXJpYW50PFQ+PigpOworLy9eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHRoZSByZXR1cm4gdHlwZS4KKworICB2b2lkIG1ldGhvZDE4PFggZXh0ZW5kcyBDb250cmE8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMTk8WCBleHRlbmRzIENvbnRyYXZhcmlhbnQ8VD4+KCkge30KKyAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIwKHtyZXF1aXJlZCBUIHh9KSB7fQorICAvLyAgICAgICAgICAgICBeXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjEoe3JlcXVpcmVkIENvdjxUPiB4fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyMih7cmVxdWlyZWQgQ292YXJpYW50PFQ+IHh9KSB7fQorICAvLyAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9QT1NJVElPTgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKworICB2b2lkIG1ldGhvZDIzKHtyZXF1aXJlZCBDb3ZhcmlhbnQ8VD4geCwgcmVxdWlyZWQgQ29udHJhdmFyaWFudDxUPiB5fSkge30KKyAgLy8gICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyNDxYIGV4dGVuZHMgVD4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorCisgIHZvaWQgbWV0aG9kMjU8WCBleHRlbmRzIENvbnRyYTxUPj4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24uCisKKyAgdm9pZCBtZXRob2QyNjxYIGV4dGVuZHMgQ29udHJhdmFyaWFudDxUPj4oKSB7fQorICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW5vdXQnIHBvc2l0aW9uLgorfQorCitjbGFzcyBCPG91dCBUPiB7CisgIHZvaWQgbWV0aG9kMShDb3Y8QTxUPj4geCkge30KKyAgLy8gICAgICAgICAgIF5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX1BPU0lUSU9OCisgIC8vICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbi4KKyAgQ29udHJhPEE8VD4+IG1ldGhvZDIoKSB7CisvL15eXl5eXl5eXl5eXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKy8vICAgICAgICAgICAgICAgICAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgdGhyb3cgInVuY2FsbGVkIjsKKyAgfQorfQorCitjbGFzcyBDPFQ+IHsKKyAgdm9pZCBtZXRob2QoVCB4KSB7fQorfQorCitjbGFzcyBEPG91dCBUPiBleHRlbmRzIEM8VD4geworICBAb3ZlcnJpZGUKKyAgdm9pZCBtZXRob2QoVCB4KSB7fQorICAvLyAgICAgICAgICBeXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfUE9TSVRJT04KKyAgLy8gICAgICAgICAgICBeCisgIC8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uLgorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X21ldGhvZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfbWV0aG9kX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDNhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X21ldGhvZF90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMzEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgbWV0aG9kIHNpZ25hdHVyZXMgYW5kIHJldHVybiB0eXBlcyBmb3IgdGhlIGBvdXRgIHZhcmlhbmNlIG1vZGlmaWVyLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9dmFyaWFuY2UKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3R5cGVkZWYgQ292PFQ+ID0gVCBGdW5jdGlvbigpOwordHlwZWRlZiBDb250cmE8VD4gPSB2b2lkIEZ1bmN0aW9uKFQpOworCitDb3Y8aW50PiBjb3ZGdW5jdGlvbiA9ICgpID0+IDI7CitDb250cmE8aW50PiBjb250cmFGdW5jdGlvbiA9IChpbnQgdmFsKSB7fTsKKworY2xhc3MgQ292YXJpYW50PG91dCBUPiB7fQorY2xhc3MgQ29udHJhdmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBBPG91dCBUPiB7CisgIFQ/IG1ldGhvZDEoKSA9PiBudWxsOworICB2b2lkIG1ldGhvZDIoQ29udHJhPFQ+IHgpIHt9CisgIENvdjxUPz4gbWV0aG9kMygpIHsKKyAgICByZXR1cm4gKCkgPT4gbnVsbDsKKyAgfQorCisgIHZvaWQgbWV0aG9kNChDb250cmE8Q292PFQ+PiB4KSB7fQorICB2b2lkIG1ldGhvZDUoQ292PENvbnRyYTxUPj4geCkge30KKyAgQ29udHJhPENvbnRyYTxUPj4gbWV0aG9kNigpIHsKKyAgICByZXR1cm4gKENvbnRyYTxUPiB4KSB7CisgICAgICBFeHBlY3QudHlwZTxDb250cmE8VD4+KHgpOworICAgIH07CisgIH0KKworICBDb3Y8Q292PFQ/Pj4gbWV0aG9kNygpIHsKKyAgICByZXR1cm4gKCkgeworICAgICAgcmV0dXJuICgpID0+IG51bGw7CisgICAgfTsKKyAgfQorCisgIHZvaWQgbWV0aG9kOChDb250cmF2YXJpYW50PFQ+IHgpIHt9CisgIENvdmFyaWFudDxUPj8gbWV0aG9kOSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTAoQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHgpIHt9CisgIENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+PyBtZXRob2QxMSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTIoQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHgpIHt9CisgIENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4/IG1ldGhvZDEzKCkgPT4gbnVsbDsKKworICB2b2lkIG1ldGhvZDE0KGNvdmFyaWFudCBUIHgpIHt9CisgIHZvaWQgbWV0aG9kMTUoY292YXJpYW50IENvbnRyYTxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE2KGNvdmFyaWFudCBDb3Y8VD4geCkge30KKyAgdm9pZCBtZXRob2QxNyhjb3ZhcmlhbnQgQ29udHJhdmFyaWFudDxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE4KGNvdmFyaWFudCBDb3ZhcmlhbnQ8VD4geCkge30KKworICB2b2lkIG1ldGhvZDE5KHtDb250cmF2YXJpYW50PFQ+PyB4fSkge30KKyAgdm9pZCBtZXRob2QyMCh7Q29udHJhPFQ+PyB4fSkge30KK30KKworbWl4aW4gQk1peGluPG91dCBUPiB7CisgIFQ/IG1ldGhvZDEoKSA9PiBudWxsOworICB2b2lkIG1ldGhvZDIoQ29udHJhPFQ+IHgpIHt9CisgIENvdjxUPz4gbWV0aG9kMygpIHsKKyAgICByZXR1cm4gKCkgPT4gbnVsbDsKKyAgfQorCisgIHZvaWQgbWV0aG9kNChDb250cmE8Q292PFQ+PiB4KSB7fQorICB2b2lkIG1ldGhvZDUoQ292PENvbnRyYTxUPj4geCkge30KKyAgQ29udHJhPENvbnRyYTxUPj4gbWV0aG9kNigpIHsKKyAgICByZXR1cm4gKENvbnRyYTxUPiB4KSB7CisgICAgICBFeHBlY3QudHlwZTxDb250cmE8VD4+KHgpOworICAgIH07CisgIH0KKworICBDb3Y8Q292PFQ/Pj4gbWV0aG9kNygpIHsKKyAgICByZXR1cm4gKCkgeworICAgICAgcmV0dXJuICgpID0+IG51bGw7CisgICAgfTsKKyAgfQorCisgIHZvaWQgbWV0aG9kOChDb250cmF2YXJpYW50PFQ+IHgpIHt9CisgIENvdmFyaWFudDxUPj8gbWV0aG9kOSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTAoQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHgpIHt9CisgIENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+PyBtZXRob2QxMSgpID0+IG51bGw7CisgIHZvaWQgbWV0aG9kMTIoQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8VD4+IHgpIHt9CisgIENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4/IG1ldGhvZDEzKCkgPT4gbnVsbDsKKworICB2b2lkIG1ldGhvZDE0KGNvdmFyaWFudCBUIHgpIHt9CisgIHZvaWQgbWV0aG9kMTUoY292YXJpYW50IENvbnRyYTxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE2KGNvdmFyaWFudCBDb3Y8VD4geCkge30KKyAgdm9pZCBtZXRob2QxNyhjb3ZhcmlhbnQgQ29udHJhdmFyaWFudDxUPiB4KSB7fQorICB2b2lkIG1ldGhvZDE4KGNvdmFyaWFudCBDb3ZhcmlhbnQ8VD4geCkge30KKworICB2b2lkIG1ldGhvZDE5KHtDb250cmF2YXJpYW50PFQ+PyB4fSkge30KKyAgdm9pZCBtZXRob2QyMCh7Q29udHJhPFQ+PyB4fSkge30KK30KKworY2xhc3MgQiB3aXRoIEJNaXhpbjxpbnQ+IHt9CisKK2NsYXNzIEM8b3V0IFQ+IHsKKyAgdm9pZCBtZXRob2QxKENvbnRyYTxBPFQ+PiB4KSB7fQorICBBPFQ+IG1ldGhvZDIoKSB7CisgICAgcmV0dXJuIEE8VD4oKTsKKyAgfQorfQorCitjbGFzcyBEPFQ+IHsKKyAgVD8gbWV0aG9kKCkgPT4gbnVsbDsKKyAgdm9pZCBtZXRob2QyKFQgeCkge30KKyAgdm9pZCBtZXRob2QzKGNvdmFyaWFudCBUIHgpIHt9Cit9CisKK2NsYXNzIEU8b3V0IFQ+IGV4dGVuZHMgRDxUPiB7CisgIEBvdmVycmlkZQorICBUPyBtZXRob2QoKSA9PiBudWxsOworCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDMoY292YXJpYW50IFQgeCkge30KK30KKwordm9pZCB0ZXN0Q2xhc3MoKSB7CisgIEE8aW50PiBhID0gbmV3IEEoKTsKKworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kMSgpKTsKKworICBhLm1ldGhvZDIoY29udHJhRnVuY3Rpb24pOworCisgIEV4cGVjdC50eXBlPENvdjxpbnQ/Pj4oYS5tZXRob2QzKCkpOworICBDb3Y8aW50Pz4gbWV0aG9kM0Z1bmN0aW9uID0gYS5tZXRob2QzKCk7CisgIEV4cGVjdC5pc051bGwobWV0aG9kM0Z1bmN0aW9uKCkpOworCisgIGEubWV0aG9kNCgoQ292PGludD4geCkge30pOworCisgIGEubWV0aG9kNSgoKSB7CisgICAgcmV0dXJuIGNvbnRyYUZ1bmN0aW9uOworICB9KTsKKworICBFeHBlY3QudHlwZTxDb250cmE8Q29udHJhPGludD4+PihhLm1ldGhvZDYoKSk7CisgIENvbnRyYTxDb250cmE8aW50Pj4gbWV0aG9kNkZ1bmN0aW9uID0gYS5tZXRob2Q2KCk7CisgIG1ldGhvZDZGdW5jdGlvbihjb250cmFGdW5jdGlvbik7CisKKyAgRXhwZWN0LnR5cGU8Q292PENvdjxpbnQ/Pj4+KGEubWV0aG9kNygpKTsKKyAgQ292PENvdjxpbnQ/Pj4gbWV0aG9kN0Z1bmN0aW9uID0gYS5tZXRob2Q3KCk7CisgIEV4cGVjdC50eXBlPENvdjxpbnQ/Pj4obWV0aG9kN0Z1bmN0aW9uKCkpOworICBDb3Y8aW50Pz4gbWV0aG9kN05lc3RlZEZ1bmN0aW9uID0gbWV0aG9kN0Z1bmN0aW9uKCk7CisgIEV4cGVjdC5pc051bGwobWV0aG9kN05lc3RlZEZ1bmN0aW9uKCkpOworCisgIGEubWV0aG9kOChDb250cmF2YXJpYW50PGludD4oKSk7CisgIEV4cGVjdC5pc051bGwoYS5tZXRob2Q5KCkpOworICBhLm1ldGhvZDEwKENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PGludD4+KCkpOworICBFeHBlY3QuaXNOdWxsKGEubWV0aG9kMTEoKSk7CisgIGEubWV0aG9kMTIoQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8aW50Pj4oKSk7CisgIEV4cGVjdC5pc051bGwoYS5tZXRob2QxMygpKTsKKworICBhLm1ldGhvZDE0KDMpOworICBhLm1ldGhvZDE1KGNvbnRyYUZ1bmN0aW9uKTsKKyAgYS5tZXRob2QxNihjb3ZGdW5jdGlvbik7CisgIGEubWV0aG9kMTcoQ29udHJhdmFyaWFudDxpbnQ+KCkpOworICBhLm1ldGhvZDE4KENvdmFyaWFudDxpbnQ+KCkpOworCisgIGEubWV0aG9kMTkoKTsKKyAgYS5tZXRob2QyMCgpOworfQorCit2b2lkIHRlc3RNaXhpbigpIHsKKyAgQiBiID0gbmV3IEIoKTsKKworICBFeHBlY3QuaXNOdWxsKGIubWV0aG9kMSgpKTsKKworICBiLm1ldGhvZDIoY29udHJhRnVuY3Rpb24pOworCisgIEV4cGVjdC50eXBlPENvdjxpbnQ/Pj4oYi5tZXRob2QzKCkpOworICBDb3Y8aW50Pz4gbWV0aG9kM0Z1bmN0aW9uID0gYi5tZXRob2QzKCk7CisgIEV4cGVjdC5pc051bGwobWV0aG9kM0Z1bmN0aW9uKCkpOworCisgIGIubWV0aG9kNCgoQ292PGludD4geCkge30pOworCisgIGIubWV0aG9kNSgoKSB7CisgICAgcmV0dXJuIGNvbnRyYUZ1bmN0aW9uOworICB9KTsKKworICBFeHBlY3QudHlwZTxDb250cmE8Q29udHJhPGludD4+PihiLm1ldGhvZDYoKSk7CisgIENvbnRyYTxDb250cmE8aW50Pj4gbWV0aG9kNkZ1bmN0aW9uID0gYi5tZXRob2Q2KCk7CisgIG1ldGhvZDZGdW5jdGlvbihjb250cmFGdW5jdGlvbik7CisKKyAgRXhwZWN0LnR5cGU8Q292PENvdjxpbnQ/Pj4+KGIubWV0aG9kNygpKTsKKyAgQ292PENvdjxpbnQ/Pj4gbWV0aG9kN0Z1bmN0aW9uID0gYi5tZXRob2Q3KCk7CisgIEV4cGVjdC50eXBlPENvdjxpbnQ/Pj4obWV0aG9kN0Z1bmN0aW9uKCkpOworICBDb3Y8aW50Pz4gbWV0aG9kN05lc3RlZEZ1bmN0aW9uID0gbWV0aG9kN0Z1bmN0aW9uKCk7CisgIEV4cGVjdC5pc051bGwobWV0aG9kN05lc3RlZEZ1bmN0aW9uKCkpOworCisgIGIubWV0aG9kOChDb250cmF2YXJpYW50PGludD4oKSk7CisgIEV4cGVjdC5pc051bGwoYi5tZXRob2Q5KCkpOworICBiLm1ldGhvZDEwKENvbnRyYXZhcmlhbnQ8Q292YXJpYW50PGludD4+KCkpOworICBFeHBlY3QuaXNOdWxsKGIubWV0aG9kMTEoKSk7CisgIGIubWV0aG9kMTIoQ292YXJpYW50PENvbnRyYXZhcmlhbnQ8aW50Pj4oKSk7CisgIEV4cGVjdC5pc051bGwoYi5tZXRob2QxMygpKTsKKworICBiLm1ldGhvZDE0KDMpOworICBiLm1ldGhvZDE1KGNvbnRyYUZ1bmN0aW9uKTsKKyAgYi5tZXRob2QxNihjb3ZGdW5jdGlvbik7CisgIGIubWV0aG9kMTcoQ29udHJhdmFyaWFudDxpbnQ+KCkpOworICBiLm1ldGhvZDE4KENvdmFyaWFudDxpbnQ+KCkpOworCisgIGIubWV0aG9kMTkoKTsKKyAgYi5tZXRob2QyMCgpOworfQorCit2b2lkIHRlc3RDbGFzc0luTWV0aG9kcygpIHsKKyAgQzxpbnQ+IGMgPSBuZXcgQygpOworCisgIGMubWV0aG9kMSgoQTxpbnQ+IHgpIHt9KTsKKworICBFeHBlY3QudHlwZTxBPGludD4+KGMubWV0aG9kMigpKTsKK30KKwordm9pZCB0ZXN0T3ZlcnJpZGVMZWdhY3lNZXRob2RzKCkgeworICBFPGludD4gZSA9IG5ldyBFKCk7CisgIEV4cGVjdC5pc051bGwoZS5tZXRob2QoKSk7CisgIGUubWV0aG9kMigzKTsKKyAgZS5tZXRob2QzKDMpOworCisgIEQ8T2JqZWN0PiBkID0gZTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiBkLm1ldGhvZDIoInRlc3QiKSk7CisgIEV4cGVjdC50aHJvd3MoKCkgPT4gZC5tZXRob2QzKCJ0ZXN0IikpOworfQorCittYWluKCkgeworICB0ZXN0Q2xhc3MoKTsKKyAgdGVzdE1peGluKCk7CisgIHRlc3RDbGFzc0luTWV0aG9kcygpOworICB0ZXN0T3ZlcnJpZGVMZWdhY3lNZXRob2RzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3ViY2xhc3NfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X3N1YmNsYXNzX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDYzOTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X3N1YmNsYXNzX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgc3ViY2xhc3MgdXNhZ2UgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK3R5cGVkZWYgQ292RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKCk7Cit0eXBlZGVmIENvbnRyYUZ1bmN0aW9uPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKK3R5cGVkZWYgSW52RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKFQpOworCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CitjbGFzcyBDb250cmF2YXJpYW50PGluIFQ+IHt9CitjbGFzcyBJbnZhcmlhbnQ8aW5vdXQgVD4ge30KK21peGluIE1Db3ZhcmlhbnQ8b3V0IFQ+IHt9CittaXhpbiBNQ29udHJhdmFyaWFudDxpbiBUPiB7fQorbWl4aW4gTUludmFyaWFudDxpbiBUPiB7fQorCitjbGFzcyBBPG91dCBUPiBleHRlbmRzIENvbnRyYXZhcmlhbnQ8VD4ge30KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnQ29udHJhdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBCPG91dCBUPiBpbXBsZW1lbnRzIENvbnRyYXZhcmlhbnQ8VD4ge30KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnQ29udHJhdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBDPG91dCBUPiB3aXRoIE1Db250cmF2YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ01Db250cmF2YXJpYW50Jy4KKy8vICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEQ8b3V0IFQ+IGV4dGVuZHMgSW52YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0ludmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBFPG91dCBUPiBpbXBsZW1lbnRzIEludmFyaWFudDxUPiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbm91dCcgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdJbnZhcmlhbnQnLgorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgRjxvdXQgVD4gd2l0aCBNSW52YXJpYW50PFQ+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ01JbnZhcmlhbnQnLgorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgRzxvdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4ge30KKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnQ292YXJpYW50Jy4KKy8vICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIEg8b3V0IFQ+IGV4dGVuZHMgQ29udHJhdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvbnRyYXZhcmlhbnQnLgorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgSTxvdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q29udHJhRnVuY3Rpb248VD4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBKPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb250cmFGdW5jdGlvbjxDb3ZGdW5jdGlvbjxUPj4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBLPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZGdW5jdGlvbjxDb250cmFGdW5jdGlvbjxUPj4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBMPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb250cmFGdW5jdGlvbjxDb3ZhcmlhbnQ8VD4+PiB7fQorLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb3ZhcmlhbnQnLgorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgTTxvdXQgVD4gZXh0ZW5kcyBDb250cmF2YXJpYW50PENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2luJyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvbnRyYXZhcmlhbnQnLgorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKKworY2xhc3MgTjxvdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8SW52RnVuY3Rpb248VD4+IHt9CisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0NvdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBPPG91dCBUPiA9IENvdmFyaWFudDxUPiB3aXRoIE1Db250cmF2YXJpYW50PFQ+OworLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdNQ29udHJhdmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorCitjbGFzcyBQPG91dCBUPiA9IENvbnRyYXZhcmlhbnQ8VD4gd2l0aCBNQ292YXJpYW50PFQ+OworLy8gICAgXgorLy8gW2NmZV0gQ2FuJ3QgdXNlICdvdXQnIHR5cGUgdmFyaWFibGUgJ1QnIGluIGFuICdpbicgcG9zaXRpb24gaW4gc3VwZXJ0eXBlICdDb250cmF2YXJpYW50Jy4KKy8vICAgICAgICAgIF4KKy8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLldST05HX0VYUExJQ0lUX1RZUEVfUEFSQU1FVEVSX1ZBUklBTkNFX0lOX1NVUEVSSU5URVJGQUNFCisKK2NsYXNzIFE8b3V0IFQ+ID0gSW52YXJpYW50PFQ+IHdpdGggTUludmFyaWFudDxUPjsKKy8vICAgIF4KKy8vIFtjZmVdIENhbid0IHVzZSAnb3V0JyB0eXBlIHZhcmlhYmxlICdUJyBpbiBhbiAnaW4nIHBvc2l0aW9uIGluIHN1cGVydHlwZSAnTUludmFyaWFudCcuCisvLyAgICBeCisvLyBbY2ZlXSBDYW4ndCB1c2UgJ291dCcgdHlwZSB2YXJpYWJsZSAnVCcgaW4gYW4gJ2lub3V0JyBwb3NpdGlvbiBpbiBzdXBlcnR5cGUgJ0ludmFyaWFudCcuCisvLyAgICAgICAgICBeCisvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5XUk9OR19FWFBMSUNJVF9UWVBFX1BBUkFNRVRFUl9WQVJJQU5DRV9JTl9TVVBFUklOVEVSRkFDRQorLy8gICAgICAgICAgXgorLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuV1JPTkdfRVhQTElDSVRfVFlQRV9QQVJBTUVURVJfVkFSSUFOQ0VfSU5fU1VQRVJJTlRFUkZBQ0UKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9zdWJjbGFzc190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3ViY2xhc3NfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODg2MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3ViY2xhc3NfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdHMgc3ViY2xhc3MgdXNhZ2UgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK3R5cGVkZWYgQ292RnVuY3Rpb248VD4gPSBUIEZ1bmN0aW9uKCk7Cit0eXBlZGVmIENvbnRyYUZ1bmN0aW9uPFQ+ID0gdm9pZCBGdW5jdGlvbihUKTsKKworY2xhc3MgTGVnYWN5Q292YXJpYW50PFQ+IHt9CitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CitjbGFzcyBDb250cmF2YXJpYW50PGluIFQ+IHt9CittaXhpbiBNTGVnYWN5Q292YXJpYW50PFQ+IHt9CittaXhpbiBNQ292YXJpYW50PG91dCBUPiB7fQorCitjbGFzcyBBPG91dCBUPiBleHRlbmRzIExlZ2FjeUNvdmFyaWFudDxUPiB7fQorY2xhc3MgQjxvdXQgVD4gaW1wbGVtZW50cyBMZWdhY3lDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEM8b3V0IFQ+IHdpdGggTUxlZ2FjeUNvdmFyaWFudDxUPiB7fQorCitjbGFzcyBEPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxUPiB7fQorY2xhc3MgRTxvdXQgVD4gaW1wbGVtZW50cyBDb3ZhcmlhbnQ8VD4ge30KK2NsYXNzIEY8b3V0IFQ+IHdpdGggTUNvdmFyaWFudDxUPiB7fQorCitjbGFzcyBHPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+IHt9CitjbGFzcyBIPG91dCBUPiBleHRlbmRzIENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4ge30KKworY2xhc3MgSTxvdXQgVD4gZXh0ZW5kcyBDb3ZhcmlhbnQ8Q292RnVuY3Rpb248VD4+IHt9CitjbGFzcyBKPG91dCBUPiBleHRlbmRzIENvdmFyaWFudDxDb250cmFGdW5jdGlvbjxDb250cmFGdW5jdGlvbjxUPj4+IHt9CitjbGFzcyBLPG91dCBUPiBleHRlbmRzIENvbnRyYXZhcmlhbnQ8Q292RnVuY3Rpb248Q29udHJhdmFyaWFudDxUPj4+IHt9CisKK2NsYXNzIEw8b3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvdkZ1bmN0aW9uPENvdmFyaWFudDxUPj4+IHt9CisKK2NsYXNzIE08b3V0IFQ+IGV4dGVuZHMgQ292YXJpYW50PENvdmFyaWFudDxDb3ZhcmlhbnQ8VD4+PiB7fQorCitjbGFzcyBOPG91dCBUPiA9IENvdmFyaWFudDxUPiB3aXRoIE1Db3ZhcmlhbnQ8VD47CitjbGFzcyBPPG91dCBUPiA9IENvbnRyYXZhcmlhbnQ8Q29udHJhdmFyaWFudDxUPj4gd2l0aCBNQ292YXJpYW50PFQ+OworY2xhc3MgUDxvdXQgVD4gPSBDb3ZhcmlhbnQ8VD4gd2l0aCBNQ292YXJpYW50PENvdmFyaWFudDxUPj47CisKK21haW4oKSB7CisgIEE8bnVtPiBhID0gQSgpOworICBCPG51bT4gYiA9IEIoKTsKKyAgQzxudW0+IGMgPSBDKCk7CisgIEQ8bnVtPiBkID0gRCgpOworICBFPG51bT4gZSA9IEUoKTsKKyAgRjxudW0+IGYgPSBGKCk7CisgIEc8bnVtPiBnID0gRygpOworICBIPG51bT4gaCA9IEgoKTsKKyAgSTxudW0+IGkgPSBJKCk7CisgIEo8bnVtPiBqID0gSigpOworICBLPG51bT4gayA9IEsoKTsKKyAgTDxudW0+IGwgPSBMKCk7CisgIE08bnVtPiBtID0gTSgpOworICBOPG51bT4gbiA9IE4oKTsKKyAgTzxudW0+IG8gPSBPKCk7CisgIFA8bnVtPiBwID0gUCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3VidHlwaW5nX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVmNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2Vfb3V0X3N1YnR5cGluZ19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgc3VidHlwaW5nIGZvciB0aGUgYG91dGAgdmFyaWFuY2UgbW9kaWZpZXIuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD12YXJpYW5jZQorCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CisKK2NsYXNzIFVwcGVyIHt9CitjbGFzcyBNaWRkbGUgZXh0ZW5kcyBVcHBlciB7fQorY2xhc3MgTG93ZXIge30KKworY2xhc3MgQSB7CisgIENvdmFyaWFudDxNaWRkbGU+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIENvdmFyaWFudDxNaWRkbGU+KCk7CisgIH0KKworICB2b2lkIG1ldGhvZDIoQ292YXJpYW50PE1pZGRsZT4geCkge30KK30KKworY2xhc3MgQiBleHRlbmRzIEEgeworICBAb3ZlcnJpZGUKKyAgQ292YXJpYW50PFVwcGVyPiBtZXRob2QxKCkgeworICAvLyAgICAgICAgICAgICAgIF5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9PVkVSUklERQorICAvLyBbY2ZlXSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCAnQi5tZXRob2QxJyBpcyAnQ292YXJpYW50PFVwcGVyPicsIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSwgJ0NvdmFyaWFudDxNaWRkbGU+Jywgb2YgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLCAnQS5tZXRob2QxJy4KKyAgICByZXR1cm4gbmV3IENvdmFyaWFudDxVcHBlcj4oKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoQ292YXJpYW50PExvd2VyPiB4KSB7fQorICAvLyAgIF5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU5WQUxJRF9PVkVSUklERQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIFRoZSBwYXJhbWV0ZXIgJ3gnIG9mIHRoZSBtZXRob2QgJ0IubWV0aG9kMicgaGFzIHR5cGUgJ0NvdmFyaWFudDxMb3dlcj4nLCB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyB0eXBlLCAnQ292YXJpYW50PE1pZGRsZT4nLCBpbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsICdBLm1ldGhvZDInLgorfQorCitjbGFzcyBDPG91dCBUIGV4dGVuZHMgQ292YXJpYW50PE1pZGRsZT4+IHt9CisKK2NsYXNzIEQgeworICBDPENvdmFyaWFudDxVcHBlcj4+IG1ldGhvZDEoKSB7CisgIC8vXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdDb3ZhcmlhbnQ8VXBwZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdDb3ZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdDJyBpbiB0aGUgcmV0dXJuIHR5cGUuCisgICAgcmV0dXJuIEM8Q292YXJpYW50PFVwcGVyPj4oKTsKKyAgICAvLyAgICAgXgorICAgIC8vIFtjZmVdIFR5cGUgYXJndW1lbnQgJ0NvdmFyaWFudDxVcHBlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0NvdmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0MnLgorICAgIC8vICAgICAgIF5eXl5eXl5eXl5eXl5eXl4KKyAgICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgfQorfQorCit2b2lkIHRlc3RDYWxsKEl0ZXJhYmxlPENvdmFyaWFudDxMb3dlcj4+IHgpIHt9CisKK21haW4oKSB7CisgIEM8Q292YXJpYW50PFVwcGVyPj4gYyA9IG5ldyBDPENvdmFyaWFudDxVcHBlcj4+KCk7CisgIC8vXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKyAgLy8gICAgICAgICAgICAgICAgICBeCisgIC8vIFtjZmVdIFR5cGUgYXJndW1lbnQgJ0NvdmFyaWFudDxVcHBlcj4nIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgYm91bmQgJ0NvdmFyaWFudDxNaWRkbGU+JyBvZiB0aGUgdHlwZSB2YXJpYWJsZSAnVCcgb24gJ0MnLgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAvLyBbY2ZlXSBUeXBlIGFyZ3VtZW50ICdDb3ZhcmlhbnQ8VXBwZXI+JyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIGJvdW5kICdDb3ZhcmlhbnQ8TWlkZGxlPicgb2YgdGhlIHR5cGUgdmFyaWFibGUgJ1QnIG9uICdDJy4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5UWVBFX0FSR1VNRU5UX05PVF9NQVRDSElOR19CT1VORFMKKworICBJdGVyYWJsZTxDb3ZhcmlhbnQ8TG93ZXI+PiBpdGVyYWJsZUxvd2VyID0gW25ldyBDb3ZhcmlhbnQ8TG93ZXI+KCldOworICBMaXN0PENvdmFyaWFudDxNaWRkbGU+PiBsaXN0TWlkZGxlID0gW25ldyBDb3ZhcmlhbnQ8TWlkZGxlPigpXTsKKyAgaXRlcmFibGVMb3dlciA9IGxpc3RNaWRkbGU7CisgIC8vICAgICAgICAgICAgICBeXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdMaXN0PENvdmFyaWFudDxNaWRkbGU+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdJdGVyYWJsZTxDb3ZhcmlhbnQ8TG93ZXI+PicuCisKKyAgdGVzdENhbGwobGlzdE1pZGRsZSk7CisgIC8vICAgICAgIF5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFCisgIC8vIFtjZmVdIFRoZSBhcmd1bWVudCB0eXBlICdMaXN0PENvdmFyaWFudDxNaWRkbGU+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gdGhlIHBhcmFtZXRlciB0eXBlICdJdGVyYWJsZTxDb3ZhcmlhbnQ8TG93ZXI+PicuCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3VidHlwaW5nX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX291dF9zdWJ0eXBpbmdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjVlZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV9vdXRfc3VidHlwaW5nX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBzdWJ0eXBpbmcgZm9yIHRoZSBgb3V0YCB2YXJpYW5jZSBtb2RpZmllci4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBDb3ZhcmlhbnQ8b3V0IFQ+IHt9CisKK2NsYXNzIFVwcGVyIHt9CitjbGFzcyBNaWRkbGUgZXh0ZW5kcyBVcHBlciB7fQorY2xhc3MgTG93ZXIgZXh0ZW5kcyBNaWRkbGUge30KKworY2xhc3MgQSB7CisgIENvdmFyaWFudDxNaWRkbGU+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIG5ldyBDb3ZhcmlhbnQ8TWlkZGxlPigpOworICB9CisKKyAgdm9pZCBtZXRob2QyKENvdmFyaWFudDxNaWRkbGU+IHgpIHt9Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgQG92ZXJyaWRlCisgIENvdmFyaWFudDxMb3dlcj4gbWV0aG9kMSgpIHsKKyAgICByZXR1cm4gbmV3IENvdmFyaWFudDxMb3dlcj4oKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoQ292YXJpYW50PFVwcGVyPiB4KSB7fQorfQorCitjbGFzcyBDIGV4dGVuZHMgQSB7CisgIEBvdmVycmlkZQorICBDb3ZhcmlhbnQ8TWlkZGxlPiBtZXRob2QxKCkgeworICAgIHJldHVybiBuZXcgQ292YXJpYW50PE1pZGRsZT4oKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIG1ldGhvZDIoQ292YXJpYW50PE1pZGRsZT4geCkge30KK30KKworY2xhc3MgRDxvdXQgVCBleHRlbmRzIENvdmFyaWFudDxNaWRkbGU+PiB7fQorCitjbGFzcyBFIHsKKyAgRDxDb3ZhcmlhbnQ8TG93ZXI+PiBtZXRob2QxKCkgeworICAgIHJldHVybiBEPENvdmFyaWFudDxMb3dlcj4+KCk7CisgIH0KK30KKworY2xhc3MgRiB7CisgIEQ8Q292YXJpYW50PE1pZGRsZT4+IG1ldGhvZDEoKSB7CisgICAgcmV0dXJuIEQ8Q292YXJpYW50PE1pZGRsZT4+KCk7CisgIH0KK30KKwordm9pZCB0ZXN0Q2FsbChJdGVyYWJsZTxDb3ZhcmlhbnQ8TWlkZGxlPj4geCkge30KKworbWFpbigpIHsKKyAgQSBhID0gbmV3IEEoKTsKKyAgRXhwZWN0LnR5cGU8Q292YXJpYW50PE1pZGRsZT4+KGEubWV0aG9kMSgpKTsKKyAgRXhwZWN0LnR5cGU8Q292YXJpYW50PFVwcGVyPj4oYS5tZXRob2QxKCkpOworICBFeHBlY3Qubm90VHlwZTxDb3ZhcmlhbnQ8TG93ZXI+PihhLm1ldGhvZDEoKSk7CisgIGEubWV0aG9kMihuZXcgQ292YXJpYW50PE1pZGRsZT4oKSk7CisgIGEubWV0aG9kMihuZXcgQ292YXJpYW50PExvd2VyPigpKTsKKworICBCIGIgPSBuZXcgQigpOworICBFeHBlY3QudHlwZTxDb3ZhcmlhbnQ8VXBwZXI+PihiLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPENvdmFyaWFudDxNaWRkbGU+PihiLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPENvdmFyaWFudDxMb3dlcj4+KGIubWV0aG9kMSgpKTsKKyAgYi5tZXRob2QyKG5ldyBDb3ZhcmlhbnQ8VXBwZXI+KCkpOworICBiLm1ldGhvZDIobmV3IENvdmFyaWFudDxNaWRkbGU+KCkpOworCisgIEMgYyA9IG5ldyBDKCk7CisgIEV4cGVjdC50eXBlPENvdmFyaWFudDxNaWRkbGU+PihjLm1ldGhvZDEoKSk7CisgIEV4cGVjdC50eXBlPENvdmFyaWFudDxVcHBlcj4+KGMubWV0aG9kMSgpKTsKKyAgRXhwZWN0Lm5vdFR5cGU8Q292YXJpYW50PExvd2VyPj4oYy5tZXRob2QxKCkpOworICBjLm1ldGhvZDIobmV3IENvdmFyaWFudDxNaWRkbGU+KCkpOworICBjLm1ldGhvZDIobmV3IENvdmFyaWFudDxMb3dlcj4oKSk7CisKKyAgRDxDb3ZhcmlhbnQ8TG93ZXI+PiBkTG93ZXIgPSBuZXcgRDxDb3ZhcmlhbnQ8TG93ZXI+PigpOworICBEPENvdmFyaWFudDxNaWRkbGU+PiBkTWlkZGxlID0gbmV3IEQ8Q292YXJpYW50PE1pZGRsZT4+KCk7CisKKyAgRSBlID0gbmV3IEUoKTsKKyAgRXhwZWN0LnR5cGU8RDxDb3ZhcmlhbnQ8TG93ZXI+Pj4oZS5tZXRob2QxKCkpOworICBFeHBlY3QudHlwZTxEPENvdmFyaWFudDxNaWRkbGU+Pj4oZS5tZXRob2QxKCkpOworCisgIEYgZiA9IG5ldyBGKCk7CisgIEV4cGVjdC50eXBlPEQ8Q292YXJpYW50PE1pZGRsZT4+PihmLm1ldGhvZDEoKSk7CisKKyAgSXRlcmFibGU8Q292YXJpYW50PE1pZGRsZT4+IGl0ZXJhYmxlTWlkZGxlID0gW25ldyBDb3ZhcmlhbnQ8TWlkZGxlPigpXTsKKyAgTGlzdDxDb3ZhcmlhbnQ8TG93ZXI+PiBsaXN0TG93ZXIgPSBbbmV3IENvdmFyaWFudDxMb3dlcj4oKV07CisgIGl0ZXJhYmxlTWlkZGxlID0gbGlzdExvd2VyOworCisgIHRlc3RDYWxsKGxpc3RMb3dlcik7CisKKyAgRXhwZWN0LnN1YnR5cGU8Q292YXJpYW50PExvd2VyPiwgQ292YXJpYW50PE1pZGRsZT4+KCk7CisgIEV4cGVjdC5zdWJ0eXBlPENvdmFyaWFudDxNaWRkbGU+LCBDb3ZhcmlhbnQ8TWlkZGxlPj4oKTsKKyAgRXhwZWN0Lm5vdFN1YnR5cGU8Q292YXJpYW50PFVwcGVyPiwgQ292YXJpYW50PE1pZGRsZT4+KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV91bmNvbnN0cmFpbmVkX2luZmVyZW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV91bmNvbnN0cmFpbmVkX2luZmVyZW5jZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNDYwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlL3ZhcmlhbmNlL3ZhcmlhbmNlX3VuY29uc3RyYWluZWRfaW5mZXJlbmNlX3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHVuY29uc3RyYWluZWQgaW5mZXJlbmNpbmcgd2l0aCBzb3VuZCB2YXJpYW5jZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorCit2b2lkIGNvdmFyaWFudExpc3RJbmZlcjxUPihDb3ZhcmlhbnQ8TGlzdDxUPj4geCkge30KK3ZvaWQgY29udHJhdmFyaWFudExpc3RJbmZlcjxUPihDb250cmF2YXJpYW50PExpc3Q8VD4+IHgpIHt9Cit2b2lkIGludmFyaWFudExpc3RJbmZlcjxUPihJbnZhcmlhbnQ8TGlzdDxUPj4geCkge30KKworbWFpbigpIHsKKyAgdmFyIGNvdiA9IG5ldyBDb3ZhcmlhbnQoKTsKKyAgY292YXJpYW50TGlzdEluZmVyKENvdmFyaWFudCgpKTsKKworICB2YXIgY29udHJhID0gbmV3IENvbnRyYXZhcmlhbnQoKTsKKyAgY29udHJhdmFyaWFudExpc3RJbmZlcihDb250cmF2YXJpYW50KCkpOworCisgIHZhciBpbnYgPSBuZXcgSW52YXJpYW50KCk7CisgIGludmFyaWFudExpc3RJbmZlcihJbnZhcmlhbnQoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV91cHBlcl9sb3dlcl9ib3VuZHNfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfdXBwZXJfbG93ZXJfYm91bmRzX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY5MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfdXBwZXJfbG93ZXJfYm91bmRzX2Vycm9yX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0cyBlcnJvbmVvdXMgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBjb21wdXRhdGlvbiB3aXRoIHJlc3BlY3QgdG8KKy8vIHZhcmlhbmNlIG1vZGlmaWVycy4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorY2xhc3MgTGVnYWN5Q292YXJpYW50PFQ+IHt9CisKK2NsYXNzIE11bHRpPG91dCBULCBpbm91dCBVLCBpbiBWPiB7fQorCitjbGFzcyBFeGFjdGx5PGlub3V0IFQ+IHt9CitFeGFjdGx5PFQ+IGV4YWN0bHk8VD4oVCB4KSA9PiBuZXcgRXhhY3RseTxUPigpOworCitjbGFzcyBVcHBlciB7fQorY2xhc3MgTWlkZGxlIGV4dGVuZHMgVXBwZXIge30KK2NsYXNzIExvd2VyIGV4dGVuZHMgTWlkZGxlIHt9CisKK21haW4oKSB7CisgIGJvb2wgY29uZGl0aW9uID0gdHJ1ZTsKKworICB2YXIgY29udHJhTG93ZXJBY3R1YWwgPQorICAgICAgZXhhY3RseShjb25kaXRpb24gPyBDb250cmF2YXJpYW50PFVwcGVyPigpIDogQ29udHJhdmFyaWFudDxMb3dlcj4oKSk7CisgIEV4YWN0bHk8Q29udHJhdmFyaWFudDxVcHBlcj4+IGNvbnRyYVVwcGVyRXhwZWN0ZWQgPSBjb250cmFMb3dlckFjdHVhbDsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PENvbnRyYXZhcmlhbnQ8TG93ZXI+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PENvbnRyYXZhcmlhbnQ8VXBwZXI+PicuCisKKyAgdmFyIGNvbnRyYU1pZGRsZUFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IENvbnRyYXZhcmlhbnQ8VXBwZXI+KCkgOiBDb250cmF2YXJpYW50PE1pZGRsZT4oKSk7CisgIGNvbnRyYVVwcGVyRXhwZWN0ZWQgPSBjb250cmFNaWRkbGVBY3R1YWw7CisgIC8vICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0V4YWN0bHk8Q29udHJhdmFyaWFudDxNaWRkbGU+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PENvbnRyYXZhcmlhbnQ8VXBwZXI+PicuCisKKyAgdmFyIGNvdk1pZGRsZUFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IENvdmFyaWFudDxNaWRkbGU+KCkgOiBDb3ZhcmlhbnQ8TG93ZXI+KCkpOworICBFeGFjdGx5PENvdmFyaWFudDxMb3dlcj4+IGNvdkxvd2VyRXhwZWN0ZWQgPSBjb3ZNaWRkbGVBY3R1YWw7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxDb3ZhcmlhbnQ8TWlkZGxlPj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRXhhY3RseTxDb3ZhcmlhbnQ8TG93ZXI+PicuCisKKyAgdmFyIGNvdlVwcGVyQWN0dWFsID0KKyAgICAgIGV4YWN0bHkoY29uZGl0aW9uID8gQ292YXJpYW50PFVwcGVyPigpIDogQ292YXJpYW50PExvd2VyPigpKTsKKyAgY292TG93ZXJFeHBlY3RlZCA9IGNvdlVwcGVyQWN0dWFsOworICAvLyAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0V4YWN0bHk8Q292YXJpYW50PFVwcGVyPj4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRXhhY3RseTxDb3ZhcmlhbnQ8TG93ZXI+PicuCisKKyAgdmFyIGludk9iamVjdEFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IEludmFyaWFudDxVcHBlcj4oKSA6IEludmFyaWFudDxNaWRkbGU+KCkpOworICBFeGFjdGx5PEludmFyaWFudDxNaWRkbGU+PiBpbnZNaWRkbGVFeHBlY3RlZCA9IGludk9iamVjdEFjdHVhbDsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0V4YWN0bHk8T2JqZWN0PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PEludmFyaWFudDxNaWRkbGU+PicuCisgIEV4YWN0bHk8SW52YXJpYW50PFVwcGVyPj4gaW52VXBwZXJFeHBlY3RlZCA9IGludk9iamVjdEFjdHVhbDsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PE9iamVjdD4nIGNhbid0IGJlIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAnRXhhY3RseTxJbnZhcmlhbnQ8VXBwZXI+PicuCisKKyAgdmFyIGxlZ2FjeUNvdk1pZGRsZUFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IExlZ2FjeUNvdmFyaWFudDxNaWRkbGU+KCkgOiBMZWdhY3lDb3ZhcmlhbnQ8TG93ZXI+KCkpOworICBFeGFjdGx5PExlZ2FjeUNvdmFyaWFudDxMb3dlcj4+IGxlZ2FjeUNvdkxvd2VyRXhwZWN0ZWQgPQorICAgICAgbGVnYWN5Q292TWlkZGxlQWN0dWFsOworICAvLyAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PExlZ2FjeUNvdmFyaWFudDxNaWRkbGU+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PExlZ2FjeUNvdmFyaWFudDxMb3dlcj4+Jy4KKworICB2YXIgbGVnYWN5Q292VXBwZXJBY3R1YWwgPQorICAgICAgZXhhY3RseShjb25kaXRpb24gPyBMZWdhY3lDb3ZhcmlhbnQ8VXBwZXI+KCkgOiBMZWdhY3lDb3ZhcmlhbnQ8TG93ZXI+KCkpOworICBsZWdhY3lDb3ZMb3dlckV4cGVjdGVkID0gbGVnYWN5Q292VXBwZXJBY3R1YWw7CisgIC8vICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxMZWdhY3lDb3ZhcmlhbnQ8VXBwZXI+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PExlZ2FjeUNvdmFyaWFudDxMb3dlcj4+Jy4KKworICB2YXIgbXVsdGlBY3R1YWwgPSBleGFjdGx5KGNvbmRpdGlvbgorICAgICAgPyBNdWx0aTxNaWRkbGUsIE1pZGRsZSwgTWlkZGxlPigpCisgICAgICA6IE11bHRpPExvd2VyLCBNaWRkbGUsIExvd2VyPigpKTsKKyAgRXhhY3RseTxNdWx0aTxMb3dlciwgTWlkZGxlLCBMb3dlcj4+IG11bHRpRXhwZWN0ZWQgPSBtdWx0aUFjdHVhbDsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXgorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuSU5WQUxJRF9BU1NJR05NRU5UCisgIC8vIFtjZmVdIEEgdmFsdWUgb2YgdHlwZSAnRXhhY3RseTxNdWx0aTxNaWRkbGUsIE1pZGRsZSwgTG93ZXI+PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PE11bHRpPExvd2VyLCBNaWRkbGUsIExvd2VyPj4nLgorCisgIHZhciBtdWx0aUFjdHVhbDIgPSBleGFjdGx5KAorICAgICAgY29uZGl0aW9uID8gTXVsdGk8TWlkZGxlLCBpbnQsIE1pZGRsZT4oKSA6IE11bHRpPExvd2VyLCBNaWRkbGUsIExvd2VyPigpKTsKKyAgRXhhY3RseTxNdWx0aTxNaWRkbGUsIE9iamVjdCwgTG93ZXI+PiBtdWx0aU9iamVjdEV4cGVjdGVkID0gbXVsdGlBY3R1YWwyOworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl4KKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLklOVkFMSURfQVNTSUdOTUVOVAorICAvLyBbY2ZlXSBBIHZhbHVlIG9mIHR5cGUgJ0V4YWN0bHk8T2JqZWN0PicgY2FuJ3QgYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlICdFeGFjdGx5PE11bHRpPE1pZGRsZSwgT2JqZWN0LCBMb3dlcj4+Jy4KKworICB2YXIgbXVsdGlBY3R1YWwzID0gZXhhY3RseSgKKyAgICAgIGNvbmRpdGlvbiA/IE11bHRpPGludCwgTWlkZGxlLCBNaWRkbGU+KCkgOiBNdWx0aTxMb3dlciwgTWlkZGxlLCBMb3dlcj4oKSk7CisgIEV4YWN0bHk8T2JqZWN0PiBtdWx0aU9iamVjdEV4cGVjdGVkMiA9IG11bHRpQWN0dWFsMzsKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eCisgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5JTlZBTElEX0FTU0lHTk1FTlQKKyAgLy8gW2NmZV0gQSB2YWx1ZSBvZiB0eXBlICdFeGFjdGx5PE11bHRpPE9iamVjdCwgTWlkZGxlLCBMb3dlcj4+JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgJ0V4YWN0bHk8T2JqZWN0PicuCit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS92YXJpYW5jZS92YXJpYW5jZV91cHBlcl9sb3dlcl9ib3VuZHNfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfdXBwZXJfbG93ZXJfYm91bmRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI5YWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvdmFyaWFuY2UvdmFyaWFuY2VfdXBwZXJfbG93ZXJfYm91bmRzX3Rlc3QuZGFydApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTksIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRlc3RzIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgY29tcHV0YXRpb24gd2l0aCByZXNwZWN0IHRvIHZhcmlhbmNlIG1vZGlmaWVycy4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PXZhcmlhbmNlCisKK2NsYXNzIENvdmFyaWFudDxvdXQgVD4ge30KK2NsYXNzIENvbnRyYXZhcmlhbnQ8aW4gVD4ge30KK2NsYXNzIEludmFyaWFudDxpbm91dCBUPiB7fQorY2xhc3MgTGVnYWN5Q292YXJpYW50PFQ+IHt9CisKK2NsYXNzIE11bHRpPG91dCBULCBpbm91dCBVLCBpbiBWPiB7fQorCitjbGFzcyBFeGFjdGx5PGlub3V0IFQ+IHt9CitFeGFjdGx5PFQ+IGV4YWN0bHk8VD4oVCB4KSA9PiBuZXcgRXhhY3RseTxUPigpOworCitjbGFzcyBVcHBlciB7fQorY2xhc3MgTWlkZGxlIGV4dGVuZHMgVXBwZXIge30KK2NsYXNzIExvd2VyIGV4dGVuZHMgTWlkZGxlIHt9CisKK21haW4oKSB7CisgIGJvb2wgY29uZGl0aW9uID0gdHJ1ZTsKKworICB2YXIgY29udHJhTG93ZXJBY3R1YWwgPQorICAgICAgZXhhY3RseShjb25kaXRpb24gPyBDb250cmF2YXJpYW50PFVwcGVyPigpIDogQ29udHJhdmFyaWFudDxMb3dlcj4oKSk7CisgIEV4YWN0bHk8Q29udHJhdmFyaWFudDxMb3dlcj4+IGNvbnRyYUxvd2VyRXhwZWN0ZWQgPSBjb250cmFMb3dlckFjdHVhbDsKKworICB2YXIgY29udHJhTWlkZGxlQWN0dWFsID0KKyAgICAgIGV4YWN0bHkoY29uZGl0aW9uID8gQ29udHJhdmFyaWFudDxVcHBlcj4oKSA6IENvbnRyYXZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgRXhhY3RseTxDb250cmF2YXJpYW50PE1pZGRsZT4+IGNvbnRyYU1pZGRsZUV4cGVjdGVkID0gY29udHJhTWlkZGxlQWN0dWFsOworCisgIHZhciBjb3ZNaWRkbGVBY3R1YWwgPQorICAgICAgZXhhY3RseShjb25kaXRpb24gPyBDb3ZhcmlhbnQ8TWlkZGxlPigpIDogQ292YXJpYW50PExvd2VyPigpKTsKKyAgRXhhY3RseTxDb3ZhcmlhbnQ8TWlkZGxlPj4gY292TWlkZGxlRXhwZWN0ZWQgPSBjb3ZNaWRkbGVBY3R1YWw7CisKKyAgdmFyIGNvdlVwcGVyQWN0dWFsID0KKyAgICAgIGV4YWN0bHkoY29uZGl0aW9uID8gQ292YXJpYW50PFVwcGVyPigpIDogQ292YXJpYW50PExvd2VyPigpKTsKKyAgRXhhY3RseTxDb3ZhcmlhbnQ8VXBwZXI+PiBjb3ZVcHBlckV4cGVjdGVkID0gY292VXBwZXJBY3R1YWw7CisKKyAgdmFyIGludk1pZGRsZUFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IEludmFyaWFudDxNaWRkbGU+KCkgOiBJbnZhcmlhbnQ8TWlkZGxlPigpKTsKKyAgRXhhY3RseTxJbnZhcmlhbnQ8TWlkZGxlPj4gaW52TWlkZGxlRXhwZWN0ZWQgPSBpbnZNaWRkbGVBY3R1YWw7CisKKyAgdmFyIGludk9iamVjdEFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IEludmFyaWFudDxVcHBlcj4oKSA6IEludmFyaWFudDxNaWRkbGU+KCkpOworICBFeGFjdGx5PE9iamVjdD4gaW52T2JqZWN0RXhwZWN0ZWQgPSBpbnZPYmplY3RBY3R1YWw7CisKKyAgdmFyIGxlZ2FjeUNvdk1pZGRsZUFjdHVhbCA9CisgICAgICBleGFjdGx5KGNvbmRpdGlvbiA/IExlZ2FjeUNvdmFyaWFudDxNaWRkbGU+KCkgOiBMZWdhY3lDb3ZhcmlhbnQ8TG93ZXI+KCkpOworICBFeGFjdGx5PExlZ2FjeUNvdmFyaWFudDxNaWRkbGU+PiBsZWdhY3lDb3ZNaWRkbGVFeHBlY3RlZCA9CisgICAgICBsZWdhY3lDb3ZNaWRkbGVBY3R1YWw7CisKKyAgdmFyIGxlZ2FjeUNvdlVwcGVyQWN0dWFsID0KKyAgICAgIGV4YWN0bHkoY29uZGl0aW9uID8gTGVnYWN5Q292YXJpYW50PFVwcGVyPigpIDogTGVnYWN5Q292YXJpYW50PExvd2VyPigpKTsKKyAgRXhhY3RseTxMZWdhY3lDb3ZhcmlhbnQ8VXBwZXI+PiBsZWdhY3lDb3ZVcHBlckV4cGVjdGVkID0gbGVnYWN5Q292VXBwZXJBY3R1YWw7CisKKyAgdmFyIG11bHRpQWN0dWFsID0gZXhhY3RseShjb25kaXRpb24KKyAgICAgID8gTXVsdGk8TWlkZGxlLCBNaWRkbGUsIE1pZGRsZT4oKQorICAgICAgOiBNdWx0aTxMb3dlciwgTWlkZGxlLCBMb3dlcj4oKSk7CisgIEV4YWN0bHk8TXVsdGk8TWlkZGxlLCBNaWRkbGUsIExvd2VyPj4gbXVsdGlFeHBlY3RlZCA9IG11bHRpQWN0dWFsOworCisgIHZhciBtdWx0aUFjdHVhbDIgPSBleGFjdGx5KAorICAgICAgY29uZGl0aW9uID8gTXVsdGk8TWlkZGxlLCBpbnQsIE1pZGRsZT4oKSA6IE11bHRpPExvd2VyLCBNaWRkbGUsIExvd2VyPigpKTsKKyAgRXhhY3RseTxPYmplY3Q+IG11bHRpT2JqZWN0RXhwZWN0ZWQgPSBtdWx0aUFjdHVhbDI7CisKKyAgdmFyIG11bHRpQWN0dWFsMyA9IGV4YWN0bHkoCisgICAgICBjb25kaXRpb24gPyBNdWx0aTxpbnQsIE1pZGRsZSwgTWlkZGxlPigpIDogTXVsdGk8TG93ZXIsIE1pZGRsZSwgTG93ZXI+KCkpOworICBFeGFjdGx5PE11bHRpPE9iamVjdCwgTWlkZGxlLCBMb3dlcj4+IG11bHRpT2JqZWN0RXhwZWN0ZWQyID0gbXVsdGlBY3R1YWwzOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvdm0vbm9fc3VjaF9hcmdzX2Vycm9yX21lc3NhZ2Vfdm1fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2Uvdm0vbm9fc3VjaF9hcmdzX2Vycm9yX21lc3NhZ2Vfdm1fdGVzdC5kYXJ0CmluZGV4IDM0MDI0NzIuLmQzY2E1MTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlL3ZtL25vX3N1Y2hfYXJnc19lcnJvcl9tZXNzYWdlX3ZtX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZS92bS9ub19zdWNoX2FyZ3NfZXJyb3JfbWVzc2FnZV92bV90ZXN0LmRhcnQKQEAgLTIsNiArMiw3IEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIC8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0xMCAtLW5vLXVzZS1vc3IgLS1uby1iYWNrZ3JvdW5kLWNvbXBpbGF0aW9uCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1uby11c2Utb3NyIC0tbm8tYmFja2dyb3VuZC1jb21waWxhdGlvbiAtLW5vLWxhenktZGlzcGF0Y2hlcnMKIAogaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CiAKQEAgLTE0LDggKzE1LDEwIEBACiAgIHRyeSB7CiAgICAgY2FsbF93aXRoX2JhcigoKSB7fSk7CiAgIH0gY2F0Y2ggKGUpIHsKLSAgICBFeHBlY3QuaXNUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygKLSAgICAgICAgIlRyaWVkIGNhbGxpbmc6IHRlc3RDbG9zdXJlTWVzc2FnZS48YW5vbnltb3VzIGNsb3N1cmU+KFwiYmFyXCIpIikpOworICAgIGZpbmFsIGV4cGVjdGVkU3RyaW5ncyA9IFsKKyAgICAgICdUcmllZCBjYWxsaW5nOiB0ZXN0Q2xvc3VyZU1lc3NhZ2UuPGFub255bW91cyBjbG9zdXJlPigiYmFyIiknLAorICAgIF07CisgICAgRXhwZWN0LnN0cmluZ0NvbnRhaW5zSW5PcmRlcihlLnRvU3RyaW5nKCksIGV4cGVjdGVkU3RyaW5ncyk7CiAgIH0KIH0KIApAQCAtMjUsNyArMjgsMTAgQEAKICAgdHJ5IHsKICAgICBjYWxsX3dpdGhfYmFyKG5vYXJncyk7CiAgIH0gY2F0Y2ggKGUpIHsKLSAgICBFeHBlY3QuaXNUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiVHJpZWQgY2FsbGluZzogbm9hcmdzKFwiYmFyXCIpIikpOworICAgIGZpbmFsIGV4cGVjdGVkU3RyaW5ncyA9IFsKKyAgICAgICdUcmllZCBjYWxsaW5nOiBub2FyZ3MoImJhciIpJywKKyAgICBdOworICAgIEV4cGVjdC5zdHJpbmdDb250YWluc0luT3JkZXIoZS50b1N0cmluZygpLCBleHBlY3RlZFN0cmluZ3MpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvY2FsbC9jb25zdHJ1Y3Rvcl9vbl91bnJlc29sdmFibGVfY2xhc3NfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9jYWxsL2NvbnN0cnVjdG9yX29uX3VucmVzb2x2YWJsZV9jbGFzc190ZXN0LmRhcnQKaW5kZXggZjNmYTQ4Mi4uM2IzMjk4NyAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9jYWxsL2NvbnN0cnVjdG9yX29uX3VucmVzb2x2YWJsZV9jbGFzc190ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9jYWxsL2NvbnN0cnVjdG9yX29uX3VucmVzb2x2YWJsZV9jbGFzc190ZXN0LmRhcnQKQEAgLTExLDE0ICsxMSwxNCBAQAogbWFpbigpIHsKICAgbmV3IEEoKTsKICAgLy8gIF4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0EnLgogICBuZXcgQS5mb28oKTsKICAgLy8gIF5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdBLmZvbycuCiAgIG5ldyBsaWIuQSgpOwogICAvLyAgXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ2xpYi5BJy4KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvY2xhc3MvdmFyaWFibGVfc2hhZG93X2NsYXNzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvY2xhc3MvdmFyaWFibGVfc2hhZG93X2NsYXNzX3Rlc3QuZGFydAppbmRleCAzNWExZmRhLi41ZTI0MzkwIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZV8yL2NsYXNzL3ZhcmlhYmxlX3NoYWRvd19jbGFzc190ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9jbGFzcy92YXJpYWJsZV9zaGFkb3dfY2xhc3NfdGVzdC5kYXJ0CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgLy8gTm93IHRoaXMgcmVmZXJzIHRvIHRoZSB2YXJpYWJsZS4KICAgICB2YXIgaSA9IG5ldyBUZXN0Lm5hbWVkKDEwKTsKICAgICAvLyAgICAgICAgICBeXl5eXl5eXl5eCi0gICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAgIC8vICAgICAgICAgIF5eXl4KICAgICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnVGVzdC5uYW1lZCcuCiAgICAgRXhwZWN0LmVxdWFscygxMCwgaS5maWVsZCk7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL2Nsb3N1cmUvd2l0aF9zdXBlcl9maWVsZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL2Nsb3N1cmUvd2l0aF9zdXBlcl9maWVsZF90ZXN0LmRhcnQKaW5kZXggNjhjYzNiZS4uNjAzYzBmNiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9jbG9zdXJlL3dpdGhfc3VwZXJfZmllbGRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvY2xvc3VyZS93aXRoX3N1cGVyX2ZpZWxkX3Rlc3QuZGFydApAQCAtMywxMCArMyw4IEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCIgc2hvdyB2aXJ0dWFsOwogCiBjbGFzcyBBIHsKLSAgQHZpcnR1YWwKICAgaW50IGE7CiAgIEEoKSA6IGEgPSA0MjsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvY29uc3QvY29uc3RydWN0b3Jfbm9uY29uc3RfZmllbGRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdC9jb25zdHJ1Y3Rvcl9ub25jb25zdF9maWVsZF90ZXN0LmRhcnQKaW5kZXggZDJlNzAzMC4uMzUzMzg0MiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdC9jb25zdHJ1Y3Rvcl9ub25jb25zdF9maWVsZF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdC9jb25zdHJ1Y3Rvcl9ub25jb25zdF9maWVsZF90ZXN0LmRhcnQKQEAgLTEwLDcgKzEwLDcgQEAKICAgLy8gW2NmZV0gTWV0aG9kIGludm9jYXRpb24gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KICAgZmluYWwgaW50IGogPSAxOwogICBjb25zdCBBKCk7Ci0vL15eXl5eXl5eXl4KKy8vXl5eXl4KIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPTlNUX0NPTlNUUlVDVE9SX1dJVEhfRklFTERfSU5JVElBTElaRURfQllfTk9OX0NPTlNUCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvY29uc3RydWN0b3IvbmFtZWRfY29uc3RydWN0b3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdHJ1Y3Rvci9uYW1lZF9jb25zdHJ1Y3Rvcl90ZXN0LmRhcnQKaW5kZXggOTE1ZjE0Ny4uMTJhNThiMSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdHJ1Y3Rvci9uYW1lZF9jb25zdHJ1Y3Rvcl90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdHJ1Y3Rvci9uYW1lZF9jb25zdHJ1Y3Rvcl90ZXN0LmRhcnQKQEAgLTM2LDEzICszNiwxMyBAQAogICAvLyAncHJlZml4JyBpcyBub3QgYSB0eXBlOgogICBuZXcgcHJlZml4PGludD4uQ2xhc3MoKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgbmV3IHByZWZpeC5DbGFzczxpbnQ+KCkudmFsdWU7CiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzczxpbnQ+JyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzPGludD4oKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgLy8gICAgICAgICAgICAgIF5eXl5eCiAgIC8vIFthbmFseXplcl0gU1RBVElDX1RZUEVfV0FSTklORy5XUk9OR19OVU1CRVJfT0ZfVFlQRV9BUkdVTUVOVFNfQ09OU1RSVUNUT1IKQEAgLTUyLDcgKzUyLDcgQEAKICAgLy8gJ3ByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkJyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkKCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNZTlRBQ1RJQ19FUlJPUi5FWFBFQ1RFRF9UT0tFTgpAQCAtNzAsNyArNzAsNyBAQAogICAvLyAncHJlZml4PGludD4uQ2xhc3M8aW50PicgZG9lc24ndCBmaXQgdGhlIGdyYW1tYXIgc3ludGF4IFQuaWQ6CiAgIG5ldyBwcmVmaXg8aW50Pi5DbGFzczxpbnQ+Lm5hbWVkKCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SCkBAIC04MCw3ICs4MCw3IEBACiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzcy5uYW1lZDxpbnQ+JyBkb2Vzbid0IGZpdCB0aGUgZ3JhbW1hciBzeW50YXggVC5pZDoKICAgbmV3IHByZWZpeDxpbnQ+LkNsYXNzLm5hbWVkPGludD4oKS52YWx1ZTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAncHJlZml4LkNsYXNzJy4KICAgLy8gICAgICAgICAgICAgIF5eXl5eCiAgIC8vIFthbmFseXplcl0gU1lOVEFDVElDX0VSUk9SLkVYUEVDVEVEX1RPS0VOCkBAIC05Niw3ICs5Niw3IEBACiAgIC8vICdwcmVmaXg8aW50Pi5DbGFzczxpbnQ+Lm5hbWVkPGludD4nIGRvZXNuJ3QgZml0IHRoZSBncmFtbWFyIHN5bnRheCBULmlkOgogICBuZXcgcHJlZml4PGludD4uQ2xhc3M8aW50Pi5uYW1lZDxpbnQ+KCkudmFsdWU7CiAgIC8vICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeC5DbGFzcycuCiAgIC8vICAgICAgICAgICAgICBeXl5eXgogICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL2NvbnN0cnVjdG9yL3JlZmVyZW5jZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL2NvbnN0cnVjdG9yL3JlZmVyZW5jZV90ZXN0LmRhcnQKaW5kZXggY2VjZmJmMy4uN2FhYjFmZiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9jb25zdHJ1Y3Rvci9yZWZlcmVuY2VfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvY29uc3RydWN0b3IvcmVmZXJlbmNlX3Rlc3QuZGFydApAQCAtMTMsNyArMTMsNyBAQAogICBuZXcgRm9vLmJhcigpOwogICBuZXcgRm9vLmJhci5iYXooKTsKICAgLy8gIF5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgXgogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnRm9vLmJhci5iYXonLgogICBuZXcgRm9vPGludD4oKTsKQEAgLTM0LDEyICszNCwxMiBAQAogICAvLyAgICAgIF4KICAgLy8gW2NmZV0gQSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIGNhbid0IGhhdmUgdHlwZSBhcmd1bWVudHMgb24gdGhlIGNvbnN0cnVjdG9yIG5hbWUuCiAgIC8vICBeXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vICAgICAgICAgICAgICAgXgogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnRm9vLmJhci5iYXonLgogICBuZXcgRm9vLmJhci5iYXo8aW50PigpOwogICAvLyAgXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyAgICAgICAgICBeXl4KICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLldST05HX05VTUJFUl9PRl9UWVBFX0FSR1VNRU5UU19DT05TVFJVQ1RPUgogICAvLyBbY2ZlXSBBIGNvbnN0cnVjdG9yIGludm9jYXRpb24gY2FuJ3QgaGF2ZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY29uc3RydWN0b3IgbmFtZS4KQEAgLTUwLDcgKzUwLDcgQEAKICAgY29uc3QgRm9vLmJhcigpOwogICBjb25zdCBGb28uYmFyLmJheigpOwogICAvLyAgICBeXl5eXl5eCi0gIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPTlNUX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyAgICAgICAgICAgIF4KICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0Zvby5iYXIuYmF6Jy4KICAgY29uc3QgRm9vPGludD4oKTsKQEAgLTcxLDEyICs3MSwxMiBAQAogICAvLyAgICAgICAgXgogICAvLyBbY2ZlXSBBIGNvbnN0cnVjdG9yIGludm9jYXRpb24gY2FuJ3QgaGF2ZSB0eXBlIGFyZ3VtZW50cyBvbiB0aGUgY29uc3RydWN0b3IgbmFtZS4KICAgLy8gICAgXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIENPTVBJTEVfVElNRV9FUlJPUi5DT05TVF9XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgICAgICAgIF4KICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0Zvby5iYXIuYmF6Jy4KICAgY29uc3QgRm9vLmJhci5iYXo8aW50PigpOwogICAvLyAgICBeXl5eXl5eCi0gIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPTlNUX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyAgICAgICAgICAgIF5eXgogICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuV1JPTkdfTlVNQkVSX09GX1RZUEVfQVJHVU1FTlRTX0NPTlNUUlVDVE9SCiAgIC8vIFtjZmVdIEEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLgpAQCAtMTA3LDcgKzEwNyw3IEBACiAgIC8vICBeCiAgIC8vIFtjZmVdIEEgY29uc3RydWN0b3IgaW52b2NhdGlvbiBjYW4ndCBoYXZlIHR5cGUgYXJndW1lbnRzIG9uIHRoZSBjb25zdHJ1Y3RvciBuYW1lLgogLy9eXl5eXl5eCi0vLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gICAgICAgICAgIF4KICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0Zvby5iYXIuYmF6Jy4KICAgRm9vLmJhci5iYXo8aW50PigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9maWVsZC9vdmVycmlkZV9vcHRpbWl6YXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9maWVsZC9vdmVycmlkZV9vcHRpbWl6YXRpb25fdGVzdC5kYXJ0CmluZGV4IDVlMmIxM2EuLmViYjc2NTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvZmllbGQvb3ZlcnJpZGVfb3B0aW1pemF0aW9uX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL2ZpZWxkL292ZXJyaWRlX29wdGltaXphdGlvbl90ZXN0LmRhcnQKQEAgLTMsMTIgKzMsOSBAQAogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7Ci1pbXBvcnQgInBhY2thZ2U6bWV0YS9tZXRhLmRhcnQiOwogCiBjbGFzcyBBIHsKLSAgQHZpcnR1YWwKICAgZmluYWwgYm9vbCBmbGFnID0gdHJ1ZTsKLSAgQHZpcnR1YWwKICAgZmluYWwgaW50IHggPSA0MjsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9nZW5lcmljL2luc3RhbnRpYXRlX3R5cGVfdmFyaWFibGVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9nZW5lcmljL2luc3RhbnRpYXRlX3R5cGVfdmFyaWFibGVfdGVzdC5kYXJ0CmluZGV4IDcyZmM2OGMuLjdmYjUwM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvZ2VuZXJpYy9pbnN0YW50aWF0ZV90eXBlX3ZhcmlhYmxlX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL2dlbmVyaWMvaW5zdGFudGlhdGVfdHlwZV92YXJpYWJsZV90ZXN0LmRhcnQKQEAgLTExLDcgKzExLDcgQEAKICAgICAvLyAgICAgXl5eXl5eXgogICAgIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLklOVkFMSURfQ0FTVF9ORVdfRVhQUgogICAgIC8vICAgICAgICAgXgotICAgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnVCcuCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbWFsZm9ybWVkL21hbGZvcm1lZF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL21hbGZvcm1lZC9tYWxmb3JtZWRfdGVzdC5kYXJ0CmluZGV4IGUyZWUxM2EuLjExOTAwMWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvbWFsZm9ybWVkL21hbGZvcm1lZF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9tYWxmb3JtZWQvbWFsZm9ybWVkX3Rlc3QuZGFydApAQCAtMTA1LDExICsxMDUsMTEgQEAKIAogICBuZXcgdW5kZWNsYXJlZF9wcmVmaXguVW5yZXNvbHZlZCgpOwogICAvLyAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAndW5kZWNsYXJlZF9wcmVmaXguVW5yZXNvbHZlZCcuCiAgIG5ldyB1bmRlY2xhcmVkX3ByZWZpeC5VbnJlc29sdmVkPGludD4oKTsKICAgLy8gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3VuZGVjbGFyZWRfcHJlZml4LlVucmVzb2x2ZWQnLgogCiAgIHRyeSB7CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL21ldGhvZC9ub3RfZm91bmRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9tZXRob2Qvbm90X2ZvdW5kX3Rlc3QuZGFydAppbmRleCAxZWFlYTI2Li40NzU1Y2JhIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZV8yL21ldGhvZC9ub3RfZm91bmRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbWV0aG9kL25vdF9mb3VuZF90ZXN0LmRhcnQKQEAgLTEzLDcgKzEzLDcgQEAKICAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuSU1QTElDSVRfVEhJU19SRUZFUkVOQ0VfSU5fSU5JVElBTElaRVIKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ0InLgogICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeCi0gIC8vIFthbmFseXplcl0gQ09NUElMRV9USU1FX0VSUk9SLkNPTlNUX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBDT01QSUxFX1RJTUVfRVJST1IuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBDYW4ndCBhY2Nlc3MgJ3RoaXMnIGluIGEgZmllbGQgaW5pdGlhbGl6ZXIgdG8gcmVhZCAnQicuCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbmV3L2NyZWF0ZV91bnJlc29sdmVkX3R5cGVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvY3JlYXRlX3VucmVzb2x2ZWRfdHlwZV90ZXN0LmRhcnQKaW5kZXggYjFjZTU2MC4uNmQyMTVhYiAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvY3JlYXRlX3VucmVzb2x2ZWRfdHlwZV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvY3JlYXRlX3VucmVzb2x2ZWRfdHlwZV90ZXN0LmRhcnQKQEAgLTUsNiArNSw2IEBACiBtYWluKCkgewogICBuZXcgRjxpbnQ+KCk7CiAgIC8vICBeCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdGJy4KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbmV3L2V4cHJlc3Npb25fdHlwZV9hcmdzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbmV3L2V4cHJlc3Npb25fdHlwZV9hcmdzX3Rlc3QuZGFydAppbmRleCBkZWJmMjQ4Li5iMzJmMGUxIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZV8yL25ldy9leHByZXNzaW9uX3R5cGVfYXJnc190ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvZXhwcmVzc2lvbl90eXBlX2FyZ3NfdGVzdC5kYXJ0CkBAIC03LDExICs3LDExIEBACiAgIC8vIENhbid0IGluc3RhbnRpYXRlIHR5cGUgcGFyYW1ldGVyICh3aXRoaW4gc3RhdGljIG9yIGluc3RhbmNlIG1ldGhvZCkuCiAgIG0xKCkgPT4gbmV3IFQoKTsKICAgLy8gICAgICAgICAgXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnVCcuCiAgIHN0YXRpYyBtMigpID0+IG5ldyBUKCk7CiAgIC8vICAgICAgICAgICAgICAgICBeCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdUJy4KICAgLy8gICAgICAgICAgICAgICAgIF4KICAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0VEX0JZX1NUQVRJQwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvcHJlZml4X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbmV3L3ByZWZpeF90ZXN0LmRhcnQKaW5kZXggNzI3OTRjOC4uYmVmMGQ2OSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9uZXcvcHJlZml4X3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25ldy9wcmVmaXhfdGVzdC5kYXJ0CkBAIC03LDYgKzcsNiBAQAogbWFpbigpIHsKICAgcmV0dXJuIG5ldyBwcmVmaXgoKTsKICAgLy8gICAgICAgICBeXl5eXl4KLSAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5ORVdfV0lUSF9OT05fVFlQRQorICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKICAgLy8gW2NmZV0gTWV0aG9kIG5vdCBmb3VuZDogJ3ByZWZpeCcuCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wMV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OWM5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAxX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2FmMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPT4gRCgpOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WD4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzAzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRhMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0+IEQ8WD4odCk7Cit9CisKK2NsYXNzIEQ8WD4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wNF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wNF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZWM4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxudW0+IHgxID0gVCh0eXBlT2Y8TGlzdDxudW0+PigpKTsKKyAgQzxJdGVyYWJsZTxudW0+PiB4MiA9IFQodHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wNV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wNV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0ZGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA1X3Rlc3QuZGFydApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCwgWT4geworICBmYWN0b3J5IEMoVHlwZSB0eCwgVHlwZSB0eSkgPT4gRDxYLCBZPih0eCwgdHkpOworfQorCitjbGFzcyBEPFgsIFk+IGltcGxlbWVudHMgQzxYLCBZPiB7CisgIEQoVHlwZSB0eCwgVHlwZSB0eSkgeworICAgIEV4cGVjdC5lcXVhbHModHgsIFgpOworICAgIEV4cGVjdC5lcXVhbHModHksIFkpOworICB9Cit9CisKK3R5cGVkZWYgVDxZLCBYPiA9IEM8WCwgWT47CisKK3ZvaWQgbWFpbigpIHsKKyAgVDxpbnQsIFN0cmluZz4geDEgPSBUKFN0cmluZywgaW50KTsKKyAgQzxTdHJpbmcsIGludD4geDIgPSBUKFN0cmluZywgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA2X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA2X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI4Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDZfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPT4gRDxYPih4LCB0KTsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQoMSwgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA3X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA3X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQxZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPT4gRDxYPih4LCB0KTsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPExpc3Q8WD4+OworCitUeXBlIHR5cGVPZjxYPigpID0+IFg7CisKK3ZvaWQgbWFpbigpIHsKKyAgVCg8bnVtPlsxXSwgdHlwZU9mPExpc3Q8bnVtPj4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wOF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wOF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0YjdlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIG51bT4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9PiBEPFg+KHQpOworfQorCitjbGFzcyBEPFggZXh0ZW5kcyBudW0+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIGludD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50PiB4MSA9IFQoaW50KTsKKyAgQzxpbnQ+IHgyID0gVChpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDlfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMDlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWE4YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8wOV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPT4gRCgpOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WCBleHRlbmRzIG51bT4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzEwX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzEwX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRjNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTBfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0+IEQ8WD4odCk7Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIG51bT4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8xMV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX2ZhY3RvcnlfaW52b2NhdGlvbl8xMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYWFiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzExX3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIEl0ZXJhYmxlPG51bT4+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPT4gRDxYPih0KTsKK30KKworY2xhc3MgRDxYIGV4dGVuZHMgSXRlcmFibGU8bnVtPj4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVDxYIGV4dGVuZHMgaW50PiA9IEM8TGlzdDxYPj47CisKK1R5cGUgdHlwZU9mPFg+KCkgPT4gWDsKKwordm9pZCBtYWluKCkgeworICBUPGludD4geDEgPSBUKHR5cGVPZjxMaXN0PGludD4+KCkpOworICBDPEl0ZXJhYmxlPG51bT4+IHgyID0gVCh0eXBlT2Y8TGlzdDxpbnQ+PigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzEyX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfZmFjdG9yeV9pbnZvY2F0aW9uXzEyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDRhNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgU3RyaW5nLCBZIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHR4LCBUeXBlIHR5KSA9PiBEPFgsIFk+KHR4LCB0eSk7Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIFN0cmluZywgWSBleHRlbmRzIG51bT4gaW1wbGVtZW50cyBDPFgsIFk+IHsKKyAgRChUeXBlIHR4LCBUeXBlIHR5KSB7CisgICAgRXhwZWN0LmVxdWFscyh0eCwgWCk7CisgICAgRXhwZWN0LmVxdWFscyh0eSwgWSk7CisgIH0KK30KKwordHlwZWRlZiBUPFkgZXh0ZW5kcyBpbnQsIFggZXh0ZW5kcyBTdHJpbmc+ID0gQzxYLCBZPjsKKwordm9pZCBtYWluKCkgeworICBUPGludCwgU3RyaW5nPiB4MSA9IFQoU3RyaW5nLCBpbnQpOworICBDPFN0cmluZywgaW50PiB4MiA9IFQoU3RyaW5nLCBpbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDFfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTFkYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wMV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFg+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQobnVtKTsKKyAgQzxudW0+IHgyID0gVChudW0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmE4YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDIHsKKyAgZmFjdG9yeSBDKCkgPSBEOworfQorCitjbGFzcyBEIGltcGxlbWVudHMgQyB7fQorCit0eXBlZGVmIFQ8WD4gPSBDOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQoKTsKKyAgQyB4MiA9IFQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzAzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVmZDgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0gRDxYPjsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUID0gQzxudW0+OworCit2b2lkIG1haW4oKSB7CisgIFQgeDEgPSBUKG51bSk7CisgIEM8bnVtPiB4MiA9IFQobnVtKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA0N2RhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0gRDxYPjsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFg+ID0gQzxMaXN0PFg+PjsKKworVHlwZSB0eXBlT2Y8WD4oKSA9PiBYOworCit2b2lkIG1haW4oKSB7CisgIFQ8bnVtPiB4MSA9IFQodHlwZU9mPExpc3Q8bnVtPj4oKSk7CisgIEM8SXRlcmFibGU8bnVtPj4geDIgPSBUKHR5cGVPZjxMaXN0PG51bT4+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzFiMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFgsIFk+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdHgsIFR5cGUgdHkpID0gRDxYLCBZPjsKK30KKworY2xhc3MgRDxYLCBZPiBpbXBsZW1lbnRzIEM8WCwgWT4geworICBEKFR5cGUgdHgsIFR5cGUgdHkpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHR4LCBYKTsKKyAgICBFeHBlY3QuZXF1YWxzKHR5LCBZKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WSwgWD4gPSBDPFgsIFk+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50LCBTdHJpbmc+IHgxID0gVChTdHJpbmcsIGludCk7CisgIEM8U3RyaW5nLCBpbnQ+IHgyID0gVChTdHJpbmcsIGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8wNl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkN2Y4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA2X3Rlc3QuZGFydApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WD4geworICBmYWN0b3J5IEMoWCB4LCBUeXBlIHQpID0gRDxYPjsKK30KKworY2xhc3MgRDxYPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFggeCwgVHlwZSB0KSB7CisgICAgRXhwZWN0LmVxdWFscyh0LCBYKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WD4gPSBDPFg+OworCit2b2lkIG1haW4oKSB7CisgIFQoMSwgaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA3X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA3X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTgxNjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYPiB7CisgIGZhY3RvcnkgQyhYIHgsIFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFg+IGltcGxlbWVudHMgQzxYPiB7CisgIEQoWCB4LCBUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVDxYPiA9IEM8TGlzdDxYPj47CisKK1R5cGUgdHlwZU9mPFg+KCkgPT4gWDsKKwordm9pZCBtYWluKCkgeworICBUKDxudW0+WzFdLCB0eXBlT2Y8TGlzdDxudW0+PigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA4X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTM5NzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQzxYIGV4dGVuZHMgbnVtPiB7CisgIGZhY3RvcnkgQyhUeXBlIHQpID0gRDxYPjsKK30KKworY2xhc3MgRDxYIGV4dGVuZHMgbnVtPiBpbXBsZW1lbnRzIEM8WD4geworICBEKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFggZXh0ZW5kcyBpbnQ+ID0gQzxYPjsKKwordm9pZCBtYWluKCkgeworICBUPGludD4geDEgPSBUKGludCk7CisgIEM8aW50PiB4MiA9IFQoaW50KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA5X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzA5X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RjOTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMDlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2hhcmVkT3B0aW9ucz0tLWVuYWJsZS1leHBlcmltZW50PW5vbmZ1bmN0aW9uLXR5cGUtYWxpYXNlcworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworY2xhc3MgQyB7CisgIGZhY3RvcnkgQygpID0gRDsKK30KKworY2xhc3MgRCBpbXBsZW1lbnRzIEMge30KKwordHlwZWRlZiBUPFggZXh0ZW5kcyBudW0+ID0gQzsKKwordm9pZCBtYWluKCkgeworICBUPG51bT4geDEgPSBUKCk7CisgIEMgeDIgPSBUKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzYWFlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzEwX3Rlc3QuZGFydApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIG51bT4geworICBmYWN0b3J5IEMoVHlwZSB0KSA9IEQ8WD47Cit9CisKK2NsYXNzIEQ8WCBleHRlbmRzIG51bT4gaW1wbGVtZW50cyBDPFg+IHsKKyAgRChUeXBlIHQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHQsIFgpOworICB9Cit9CisKK3R5cGVkZWYgVCA9IEM8bnVtPjsKKwordm9pZCBtYWluKCkgeworICBUIHgxID0gVChudW0pOworICBDPG51bT4geDIgPSBUKG51bSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlNzAzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL2luZmVyX2FsaWFzZWRfcmVkaXJlY3RpbmdfZmFjdG9yeV9pbnZvY2F0aW9uXzExX3Rlc3QuZGFydApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFNoYXJlZE9wdGlvbnM9LS1lbmFibGUtZXhwZXJpbWVudD1ub25mdW5jdGlvbi10eXBlLWFsaWFzZXMKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK2NsYXNzIEM8WCBleHRlbmRzIEl0ZXJhYmxlPG51bT4+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdCkgPSBEPFg+OworfQorCitjbGFzcyBEPFggZXh0ZW5kcyBJdGVyYWJsZTxudW0+PiBpbXBsZW1lbnRzIEM8WD4geworICBEKFR5cGUgdCkgeworICAgIEV4cGVjdC5lcXVhbHModCwgWCk7CisgIH0KK30KKwordHlwZWRlZiBUPFggZXh0ZW5kcyBpbnQ+ID0gQzxMaXN0PFg+PjsKKworVHlwZSB0eXBlT2Y8WD4oKSA9PiBYOworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50PiB4MSA9IFQodHlwZU9mPExpc3Q8aW50Pj4oKSk7CisgIEM8SXRlcmFibGU8bnVtPj4geDIgPSBUKHR5cGVPZjxMaXN0PGludD4+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9ub25mdW5jdGlvbl90eXBlX2FsaWFzZXMvaW5mZXJfYWxpYXNlZF9yZWRpcmVjdGluZ19mYWN0b3J5X2ludm9jYXRpb25fMTJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzJhZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy9pbmZlcl9hbGlhc2VkX3JlZGlyZWN0aW5nX2ZhY3RvcnlfaW52b2NhdGlvbl8xMl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBTaGFyZWRPcHRpb25zPS0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzCisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitjbGFzcyBDPFggZXh0ZW5kcyBTdHJpbmcsIFkgZXh0ZW5kcyBudW0+IHsKKyAgZmFjdG9yeSBDKFR5cGUgdHgsIFR5cGUgdHkpID0gRDxYLCBZPjsKK30KKworY2xhc3MgRDxYIGV4dGVuZHMgU3RyaW5nLCBZIGV4dGVuZHMgbnVtPiBpbXBsZW1lbnRzIEM8WCwgWT4geworICBEKFR5cGUgdHgsIFR5cGUgdHkpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHR4LCBYKTsKKyAgICBFeHBlY3QuZXF1YWxzKHR5LCBZKTsKKyAgfQorfQorCit0eXBlZGVmIFQ8WSBleHRlbmRzIGludCwgWCBleHRlbmRzIFN0cmluZz4gPSBDPFgsIFk+OworCit2b2lkIG1haW4oKSB7CisgIFQ8aW50LCBTdHJpbmc+IHgxID0gVChTdHJpbmcsIGludCk7CisgIEM8U3RyaW5nLCBpbnQ+IHgyID0gVChTdHJpbmcsIGludCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV9udWxsX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0CmluZGV4IDExN2QyMTguLjgzNGI1ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX251bGxfZXJyb3JfdGVzdC5kYXJ0CkBAIC00Nyw4ICs0Nyw2IEBACiAKIFggZm9vPFg+KFggeCkgPT4geDsKIAotVCBGdW5jdGlvbihUKSBpZCA9ICh4KSA9PiB4OwotCiBtYWluKCkgewogICB2YXIgdjEzID0gPFQ+W107CiAgIHZhciB2MTQgPSA8U2V0PFQ+LCBTZXQ8VD4+e3t9OiB7fX07CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL25vbmZ1bmN0aW9uX3R5cGVfYWxpYXNlcy91c2FnZV92b2lkX2Vycm9yX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX3ZvaWRfZXJyb3JfdGVzdC5kYXJ0CmluZGV4IDcyMWNiYjcuLjhiOTcxMTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX3ZvaWRfZXJyb3JfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvbm9uZnVuY3Rpb25fdHlwZV9hbGlhc2VzL3VzYWdlX3ZvaWRfZXJyb3JfdGVzdC5kYXJ0CkBAIC00MSw4ICs0MSw2IEBACiAKIFggZm9vPFg+KFggeCkgPT4geDsKIAotVCBGdW5jdGlvbihUKSBpZCA9ICh4KSA9PiB4OwotCiBtYWluKCkgewogICB2YXIgdjE0ID0gPFNldDxUPiwgU2V0PFQ+Pnt7fToge319OwogICB2MTRbe31dID0ge1QoKX07CmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL292ZXJyaWRlL2luaGVyaXRhbmNlX2ZpZWxkX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvb3ZlcnJpZGUvaW5oZXJpdGFuY2VfZmllbGRfdGVzdC5kYXJ0CmluZGV4IGQ5NDMwZTEuLjgyZWU5YTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvb3ZlcnJpZGUvaW5oZXJpdGFuY2VfZmllbGRfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvb3ZlcnJpZGUvaW5oZXJpdGFuY2VfZmllbGRfdGVzdC5kYXJ0CkBAIC0yLDggKzIsNiBAQAogLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKIC8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCIgc2hvdyB2aXJ0dWFsOwotCiBjbGFzcyBBIHsKICAgZ2V0IGdldHRlcjEgPT4gbnVsbDsgLy8jIDAxOiBvawogICBudW0gZ2V0IGdldHRlcjIgPT4gbnVsbDsgLy8jIDAyOiBvawpAQCAtMjYsMTIgKzI0LDEyIEBACiAgIHNldCBzZXR0ZXIxMChpbnQgXykgPT4gbnVsbDsgLy8jIDMwOiBjb21waWxlLXRpbWUgZXJyb3IKICAgc2V0IHNldHRlcjExKGludCBfKSA9PiBudWxsOyAvLyMgMzE6IGNvbXBpbGUtdGltZSBlcnJvcgogCi0gIEB2aXJ0dWFsIGludCBmaWVsZDE7IC8vIyA0MTogb2sKKyAgaW50IGZpZWxkMTsgLy8jIDQxOiBvawogICBudW0gZmllbGQyOyAvLyMgNDI6IGNvbXBpbGUtdGltZSBlcnJvcgogICBpbnQgZmllbGQzOyAvLyMgNDM6IGNvbXBpbGUtdGltZSBlcnJvcgogICBpbnQgZmllbGQ0OyAvLyMgNDQ6IGNvbXBpbGUtdGltZSBlcnJvcgogICBpbnQgZmllbGQ1OyAvLyMgNDU6IGNvbXBpbGUtdGltZSBlcnJvcgotICBAdmlydHVhbCBudW0gZmllbGQ2OyAvLyMgNDY6IG9rCisgIG51bSBmaWVsZDY7IC8vIyA0Njogb2sKICAgbnVtIGZpZWxkNzsgLy8jIDQ3OiBjb21waWxlLXRpbWUgZXJyb3IKICAgbnVtIGdldCBmaWVsZDggPT4gbnVsbDsgLy8jIDQ4OiBjb21waWxlLXRpbWUgZXJyb3IKICAgbnVtIGZpZWxkOTsgLy8jIDQ5OiBjb21waWxlLXRpbWUgZXJyb3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3ByZWZpeF90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL3ByZWZpeC90cmFuc2l0aXZlX2ltcG9ydF9wcmVmaXhfdGVzdC5kYXJ0CmluZGV4IDkxODY1NjAuLjM0YzMwMjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3ByZWZpeF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfcHJlZml4X3Rlc3QuZGFydApAQCAtNyw3ICs3LDcgQEAKICAgLy8gTGlicmFyeSBwcmVmaXhlcyBpbiB0aGUgaW1wb3J0ZWQgbGlicmFyaWVzIHNob3VsZCBub3QgYmUgdmlzaWJsZSBoZXJlLgogICBuZXcgbGliMTEuTGlicmFyeTExKDEpOwogICAvLyAgXl5eXl5eXl5eXl5eXl5eCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdsaWIxMS5MaWJyYXJ5MTEnLgogICBsaWIxMS5MaWJyYXJ5MTEuc3RhdGljX2Z1bmMoKTsKIC8vXl5eXl4KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvcHJlZml4L3RyYW5zaXRpdmVfaW1wb3J0X3Rlc3QuZGFydAppbmRleCAwYWUzZmE3Li4yNTY4OTRjIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZV8yL3ByZWZpeC90cmFuc2l0aXZlX2ltcG9ydF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9wcmVmaXgvdHJhbnNpdGl2ZV9pbXBvcnRfdGVzdC5kYXJ0CkBAIC0xMCw3ICsxMCw3IEBACiAgIC8vIENsYXNzIHNob3VsZCBub3QgYmUgdmlzaWJsZS4KICAgbmV3IGxpYjEyLkxpYnJhcnkxMSgxKTsKICAgLy8gICAgICAgIF5eXl5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnTGlicmFyeTExJy4KIAogICAvLyBWYXJpYWJsZSBzaG91bGQgbm90IGJlIHZpc2libGUuCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZV8yL3ByaXZhdGUvYWNjZXNzX3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlXzIvcHJpdmF0ZS9hY2Nlc3NfdGVzdC5kYXJ0CmluZGV4IGExY2Y2YTEuLjAxNmU0ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvcHJpdmF0ZS9hY2Nlc3NfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xhbmd1YWdlXzIvcHJpdmF0ZS9hY2Nlc3NfdGVzdC5kYXJ0CkBAIC0xOSw3ICsxOSw3IEBACiAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19UWVBFX1dBUk5JTkcuVU5ERUZJTkVEX0ZVTkNUSU9OCiAgIG5ldyBfQ2xhc3MoKTsKICAgLy8gIF5eXl5eXgotICAvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisgIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuQ1JFQVRJT05fV0lUSF9OT05fVFlQRQogICAvLyBbY2ZlXSBNZXRob2Qgbm90IGZvdW5kOiAnX0NsYXNzJy4KICAgcHJpdmF0ZS5fQ2xhc3MoKTsKIC8vXgpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL3JlZ3Jlc3MvcmVncmVzczIxNzkzX3Rlc3QuZGFydAppbmRleCBkNzY3NjkwLi4yNmQ5ZmY2ZCAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MyMTc5M190ZXN0LmRhcnQKQEAgLTE1LDYgKzE1LDYgQEAKIG1haW4oKSB7CiAgIHByaW50KG5ldyBBKCkoNDk5KSk7CiAgIC8vICAgICAgICBeCi0gIC8vIFthbmFseXplcl0gU1RBVElDX1dBUk5JTkcuTkVXX1dJVEhfTk9OX1RZUEUKKyAgLy8gW2FuYWx5emVyXSBTVEFUSUNfV0FSTklORy5DUkVBVElPTl9XSVRIX05PTl9UWVBFCiAgIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdBJy4KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvcmVncmVzcy9yZWdyZXNzMzQ0OTVfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MzNDQ5NV90ZXN0LmRhcnQKaW5kZXggY2NlOWJmZS4uZjMzZjRjNSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MzNDQ5NV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9yZWdyZXNzL3JlZ3Jlc3MzNDQ5NV90ZXN0LmRhcnQKQEAgLTQsNyArNCw3IEBACiAKIGZpbmFsIGZvbyA9IEE8Qj4uZm9vKCk7CiAvLyAgICAgICAgICBeCi0vLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLk5FV19XSVRIX05PTl9UWVBFCisvLyBbYW5hbHl6ZXJdIFNUQVRJQ19XQVJOSU5HLkNSRUFUSU9OX1dJVEhfTk9OX1RZUEUKIC8vIFtjZmVdIE1ldGhvZCBub3QgZm91bmQ6ICdBJy4KIC8vICAgICAgICAgICAgXgogLy8gW2FuYWx5emVyXSBTVEFUSUNfVFlQRV9XQVJOSU5HLk5PTl9UWVBFX0FTX1RZUEVfQVJHVU1FTlQKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvc3VwZXIvZmllbGRfMl90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL3N1cGVyL2ZpZWxkXzJfdGVzdC5kYXJ0CmluZGV4IDUxY2M5MjYuLjgyYjg5OWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xhbmd1YWdlXzIvc3VwZXIvZmllbGRfMl90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9zdXBlci9maWVsZF8yX3Rlc3QuZGFydApAQCAtMywxMCArMyw4IEBACiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCIgc2hvdyB2aXJ0dWFsOwogCiBjbGFzcyBBIHsKLSAgQHZpcnR1YWwKICAgdmFyIGZvbzsKICAgQSh0aGlzLmZvbyk7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlXzIvc3VwZXIvZmllbGRfdGVzdC5kYXJ0IGIvdGVzdHMvbGFuZ3VhZ2VfMi9zdXBlci9maWVsZF90ZXN0LmRhcnQKaW5kZXggYWE1NmViMi4uODVhZThlOSAxMDA2NDQKLS0tIGEvdGVzdHMvbGFuZ3VhZ2VfMi9zdXBlci9maWVsZF90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGFuZ3VhZ2VfMi9zdXBlci9maWVsZF90ZXN0LmRhcnQKQEAgLTQsNyArNCw2IEBACiAvLyBEYXJ0IHRlc3QgZm9yIHRlc3Rpbmcgc3VwZXIgZmllbGQgYWNjZXNzLgogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKLWltcG9ydCAicGFja2FnZTptZXRhL21ldGEuZGFydCIgc2hvdyB2aXJ0dWFsOwogCiBjbGFzcyBBIHsKICAgQSgpIHsKQEAgLTE0LDcgKzEzLDYgQEAKICAgICByZXR1cm4gIkdydWV6aSI7CiAgIH0KIAotICBAdmlydHVhbAogICBTdHJpbmcgY2l0eTsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2VfMi92bS9ub19zdWNoX2FyZ3NfZXJyb3JfbWVzc2FnZV92bV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZV8yL3ZtL25vX3N1Y2hfYXJnc19lcnJvcl9tZXNzYWdlX3ZtX3Rlc3QuZGFydAppbmRleCAzNDAyNDcyLi5kM2NhNTEwIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZV8yL3ZtL25vX3N1Y2hfYXJnc19lcnJvcl9tZXNzYWdlX3ZtX3Rlc3QuZGFydAorKysgYi90ZXN0cy9sYW5ndWFnZV8yL3ZtL25vX3N1Y2hfYXJnc19lcnJvcl9tZXNzYWdlX3ZtX3Rlc3QuZGFydApAQCAtMiw2ICsyLDcgQEAKIC8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCiAvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTEwIC0tbm8tdXNlLW9zciAtLW5vLWJhY2tncm91bmQtY29tcGlsYXRpb24KKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0xMCAtLW5vLXVzZS1vc3IgLS1uby1iYWNrZ3JvdW5kLWNvbXBpbGF0aW9uIC0tbm8tbGF6eS1kaXNwYXRjaGVycwogCiBpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKIApAQCAtMTQsOCArMTUsMTAgQEAKICAgdHJ5IHsKICAgICBjYWxsX3dpdGhfYmFyKCgpIHt9KTsKICAgfSBjYXRjaCAoZSkgewotICAgIEV4cGVjdC5pc1RydWUoZS50b1N0cmluZygpLmNvbnRhaW5zKAotICAgICAgICAiVHJpZWQgY2FsbGluZzogdGVzdENsb3N1cmVNZXNzYWdlLjxhbm9ueW1vdXMgY2xvc3VyZT4oXCJiYXJcIikiKSk7CisgICAgZmluYWwgZXhwZWN0ZWRTdHJpbmdzID0gWworICAgICAgJ1RyaWVkIGNhbGxpbmc6IHRlc3RDbG9zdXJlTWVzc2FnZS48YW5vbnltb3VzIGNsb3N1cmU+KCJiYXIiKScsCisgICAgXTsKKyAgICBFeHBlY3Quc3RyaW5nQ29udGFpbnNJbk9yZGVyKGUudG9TdHJpbmcoKSwgZXhwZWN0ZWRTdHJpbmdzKTsKICAgfQogfQogCkBAIC0yNSw3ICsyOCwxMCBAQAogICB0cnkgewogICAgIGNhbGxfd2l0aF9iYXIobm9hcmdzKTsKICAgfSBjYXRjaCAoZSkgewotICAgIEV4cGVjdC5pc1RydWUoZS50b1N0cmluZygpLmNvbnRhaW5zKCJUcmllZCBjYWxsaW5nOiBub2FyZ3MoXCJiYXJcIikiKSk7CisgICAgZmluYWwgZXhwZWN0ZWRTdHJpbmdzID0gWworICAgICAgJ1RyaWVkIGNhbGxpbmc6IG5vYXJncygiYmFyIiknLAorICAgIF07CisgICAgRXhwZWN0LnN0cmluZ0NvbnRhaW5zSW5PcmRlcihlLnRvU3RyaW5nKCksIGV4cGVjdGVkU3RyaW5ncyk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2FzeW5jL2Z1dHVyZV9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy9saWIvYXN5bmMvZnV0dXJlX2Vycm9yX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBjMzkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2FzeW5jL2Z1dHVyZV9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworbWFpbigpIHsKKyAgLy8gVGhlIGVycm9yIGNhbm5vdCBiZSBudWxsLgorICBFeHBlY3QudGhyb3dzTnVsbENoZWNrRXJyb3IoKCkgeworICAgIEZ1dHVyZS5lcnJvcihudWxsIGFzIGR5bmFtaWMpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fY29udHJvbGxlcl9hZGRfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL3N0cmVhbV9jb250cm9sbGVyX2FkZF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5NWZlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fY29udHJvbGxlcl9hZGRfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK21haW4oKSB7CisgIC8vIFNpbmdsZS1jYXN0IGFzeW5jLgorICB2YXIgY29udHJvbGxlciA9IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgRXhwZWN0LnRocm93c051bGxDaGVja0Vycm9yKCgpIHsKKyAgICBjb250cm9sbGVyLmFkZEVycm9yKG51bGwgYXMgZHluYW1pYyk7CisgIH0pOworCisgIEV4cGVjdC50aHJvd3NOdWxsQ2hlY2tFcnJvcigoKSB7CisgICAgY29udHJvbGxlci5zaW5rLmFkZEVycm9yKG51bGwgYXMgZHluYW1pYyk7CisgIH0pOworCisgIC8vIFNpbmdsZS1jYXN0IHN5bmMuCisgIGNvbnRyb2xsZXIgPSBTdHJlYW1Db250cm9sbGVyKHN5bmM6IHRydWUpOworICBFeHBlY3QudGhyb3dzTnVsbENoZWNrRXJyb3IoKCkgeworICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IobnVsbCBhcyBkeW5hbWljKTsKKyAgfSk7CisKKyAgRXhwZWN0LnRocm93c051bGxDaGVja0Vycm9yKCgpIHsKKyAgICBjb250cm9sbGVyLnNpbmsuYWRkRXJyb3IobnVsbCBhcyBkeW5hbWljKTsKKyAgfSk7CisKKyAgLy8gQnJvYWRjYXN0IGFzeW5jLgorICBjb250cm9sbGVyID0gU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKTsKKyAgRXhwZWN0LnRocm93c051bGxDaGVja0Vycm9yKCgpIHsKKyAgICBjb250cm9sbGVyLmFkZEVycm9yKG51bGwgYXMgZHluYW1pYyk7CisgIH0pOworCisgIEV4cGVjdC50aHJvd3NOdWxsQ2hlY2tFcnJvcigoKSB7CisgICAgY29udHJvbGxlci5zaW5rLmFkZEVycm9yKG51bGwgYXMgZHluYW1pYyk7CisgIH0pOworCisgIC8vIEJyb2FkY2FzdCBzeW5jLgorICBjb250cm9sbGVyID0gU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogdHJ1ZSk7CisgIEV4cGVjdC50aHJvd3NOdWxsQ2hlY2tFcnJvcigoKSB7CisgICAgY29udHJvbGxlci5hZGRFcnJvcihudWxsIGFzIGR5bmFtaWMpOworICB9KTsKKworICBFeHBlY3QudGhyb3dzTnVsbENoZWNrRXJyb3IoKCkgeworICAgIGNvbnRyb2xsZXIuc2luay5hZGRFcnJvcihudWxsIGFzIGR5bmFtaWMpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fbXVsdGlfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL3N0cmVhbV9tdWx0aV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YzRmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fbXVsdGlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICJwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCI7CisKK2V4dGVuc2lvbiBTdHJlYW1SZXBlYXRMYXRlc3RFeHRlbnNpb248VCBleHRlbmRzIE9iamVjdD4gb24gU3RyZWFtPFQ+IHsKKyAgU3RyZWFtPFQ+IHJlcGVhdExhdGVzdCgpIHsKKyAgICB2YXIgZG9uZSA9IGZhbHNlOworICAgIFQ/IGxhdGVzdCA9IG51bGw7CisgICAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSA8TXVsdGlTdHJlYW1Db250cm9sbGVyPFQ+Pnt9OworICAgIHRoaXMubGlzdGVuKChldmVudCkgeworICAgICAgbGF0ZXN0ID0gZXZlbnQ7CisgICAgICBmb3IgKHZhciBsaXN0ZW5lciBpbiBbLi4uY3VycmVudExpc3RlbmVyc10pIGxpc3RlbmVyLmFkZFN5bmMoZXZlbnQpOworICAgIH0sIG9uRXJyb3I6IChPYmplY3QgZXJyb3IsIFN0YWNrVHJhY2Ugc3RhY2spIHsKKyAgICAgIGZvciAodmFyIGxpc3RlbmVyIGluIFsuLi5jdXJyZW50TGlzdGVuZXJzXSkKKyAgICAgICAgbGlzdGVuZXIuYWRkRXJyb3JTeW5jKGVycm9yLCBzdGFjayk7CisgICAgfSwgb25Eb25lOiAoKSB7CisgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgIGxhdGVzdCA9IG51bGw7CisgICAgICBmb3IgKHZhciBsaXN0ZW5lciBpbiBjdXJyZW50TGlzdGVuZXJzKSBsaXN0ZW5lci5jbG9zZVN5bmMoKTsKKyAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICB9KTsKKyAgICByZXR1cm4gU3RyZWFtLm11bHRpKChjb250cm9sbGVyKSB7CisgICAgICBpZiAoZG9uZSkgeworICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRMaXN0ZW5lcnMuYWRkKGNvbnRyb2xsZXIpOworICAgICAgdmFyIGxhdGVzdFZhbHVlID0gbGF0ZXN0OworICAgICAgaWYgKGxhdGVzdFZhbHVlICE9IG51bGwpIGNvbnRyb2xsZXIuYWRkKGxhdGVzdFZhbHVlKTsKKyAgICAgIGNvbnRyb2xsZXIub25DYW5jZWwgPSAoKSB7CisgICAgICAgIGN1cnJlbnRMaXN0ZW5lcnMucmVtb3ZlKGNvbnRyb2xsZXIpOworICAgICAgfTsKKyAgICB9KTsKKyAgfQorfQorCit2b2lkIG1haW4oKSB7CisgIGFzeW5jU3RhcnQoKTsKKyAgdGVzdFN0cmVhbXNJbmRlcGVuZGVudCgpOworICBhc3luY1Rlc3QodGVzdFN0cmVhbU5vbk92ZXJsYXApOworICBhc3luY1Rlc3QodGVzdFJlcGVhdExhdGVzdCk7CisgIGFzeW5jRW5kKCk7Cit9CisKKy8vLyBUZXN0IHRoYXQgdGhlIHN0cmVhbXMgY2FuIHByb3ZpZGUgZGlmZmVyZW50IGV2ZW50cy4KK3ZvaWQgdGVzdFN0cmVhbXNJbmRlcGVuZGVudCgpIHsKKyAgdmFyIGxvZyA9IDxTdHJpbmc+W107CisgIHZhciBpbmRleCA9IDA7CisgIHZhciBtdWx0aSA9IFN0cmVhbTxMaXN0PGludD4+Lm11bHRpKChjKSB7CisgICAgdmFyIGlkID0gKytpbmRleDsKKyAgICBsb2cuYWRkKCIkaWQiKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkICsgMTsgaSsrKSB7CisgICAgICBjLmFkZChbaWQsIGldKTsKKyAgICB9CisgICAgYy5jbG9zZSgpOworICB9KTsKKyAgdm9pZCBsb2dMaXN0KExpc3Q8aW50PiBsKSB7CisgICAgbG9nLmFkZCgiJHtsLmZpcnN0fS0ke2wubGFzdH0iKTsKKyAgfQorCisgIGFzeW5jU3RhcnQoKTsKKyAgRnV0dXJlLndhaXQoW211bHRpLmZvckVhY2gobG9nTGlzdCksIG11bHRpLmZvckVhY2gobG9nTGlzdCldKQorICAgICAgLndoZW5Db21wbGV0ZSgoKSB7CisgICAgRXhwZWN0LmVxdWFscyg3LCBsb2cubGVuZ3RoKTsKKyAgICBmb3IgKHZhciBlbGVtZW50IGluIFsiMSIsICIxLTAiLCAiMS0xIiwgIjIiLCAiMi0wIiwgIjItMSIsICIyLTIiXSkgeworICAgICAgRXhwZWN0LmlzVHJ1ZShsb2cuY29udGFpbnMoZWxlbWVudCkpOworICAgIH0KKyAgICBhc3luY0VuZCgpOworICB9KTsKK30KKworLy8vIFRlc3QgdGhhdCBzdHJlYW0gY2FuIGJlIGxpc3RlbmVkIHRvIGFnYWluIGFmdGVyIGhhdmluZyBubyBsaXN0ZW5lci4KK0Z1dHVyZTx2b2lkPiB0ZXN0U3RyZWFtTm9uT3ZlcmxhcCgpIGFzeW5jIHsKKyAgdmFyIGNvbXBsZXRlciA9IENvbXBsZXRlcjxPYmplY3Q/PigpOworICBNdWx0aVN0cmVhbUNvbnRyb2xsZXI8aW50Pj8gY29udHJvbGxlcjsKKyAgdmFyIHN0cmVhbSA9IFN0cmVhbTxpbnQ+Lm11bHRpKChjKSB7CisgICAgY29udHJvbGxlciA9IGM7CisgICAgYy5vbkNhbmNlbCA9ICgpIHsKKyAgICAgIGNvbnRyb2xsZXIgPSBudWxsOworICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKKyAgICB9OworICB9KTsKKyAgZm9yICh2YXIgaSBpbiBbMSwgMiwgM10pIHsKKyAgICB2YXIgbG9nID0gPE9iamVjdD8+W107CisgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHN0cmVhbS5saXN0ZW4oKHYpIHsKKyAgICAgIGxvZy5hZGQodik7CisgICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgY29tcGxldGVyLmNvbXBsZXRlKHYpOworICAgIH0sIG9uRXJyb3I6IChlLCBzKSB7CisgICAgICBsb2cuYWRkKGUpOworICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZShlKTsKKyAgICB9LCBvbkRvbmU6ICgpIHsKKyAgICAgIGxvZy5hZGQobnVsbCk7CisgICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgY29tcGxldGVyLmNvbXBsZXRlKG51bGwpOworICAgIH0pOworICAgIEV4cGVjdC5pc05vdE51bGwoY29udHJvbGxlcik7CisgICAgY29udHJvbGxlciEuYWRkKDEpOworICAgIGF3YWl0IGNvbXBsZXRlci5mdXR1cmU7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWzFdLCBsb2cpOworCisgICAgY29tcGxldGVyID0gQ29tcGxldGVyKCk7CisgICAgY29udHJvbGxlciEuYWRkKDIpOworICAgIGF3YWl0IGNvbXBsZXRlci5mdXR1cmU7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWzEsIDJdLCBsb2cpOworCisgICAgY29tcGxldGVyID0gQ29tcGxldGVyKCk7CisgICAgaWYgKGkgPT0gMikgeworICAgICAgc3Vic2NyaXB0aW9uLmNhbmNlbCgpOworICAgIH0gZWxzZSB7CisgICAgICBjb250cm9sbGVyIS5jbG9zZSgpOworICAgIH0KKyAgICBhd2FpdCBjb21wbGV0ZXIuZnV0dXJlOworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsxLCAyLCBpZiAoaSAhPSAyKSBudWxsXSwgbG9nKTsKKyAgfQorfQorCisvLy8gVGVzdCB0aGF0IHRoZSBbU3RyZWFtLnJlcGVhdExhdGVzdF0gZXhhbXBsZSBjb2RlIHdvcmtzIGFzIGRlc2NyaWJlZC4KK0Z1dHVyZTx2b2lkPiB0ZXN0UmVwZWF0TGF0ZXN0KCkgYXN5bmMgeworICB2YXIgYyA9IFN0cmVhbUNvbnRyb2xsZXI8aW50PigpOworICB2YXIgcmVwU3RyZWFtID0gYy5zdHJlYW0ucmVwZWF0TGF0ZXN0KCk7CisKKyAgdmFyIGYxID0gcmVwU3RyZWFtLmZpcnN0OworICBjLmFkZCgxKTsKKyAgdmFyIHYxID0gYXdhaXQgZjE7CisgIEV4cGVjdC5lcXVhbHMoMSwgdjEpOworCisgIHZhciBmMiA9IHJlcFN0cmVhbS50YWtlKDIpLnRvTGlzdCgpOworICBjLmFkZCgyKTsKKyAgdmFyIGwyID0gYXdhaXQgZjI7CisgIEV4cGVjdC5saXN0RXF1YWxzKFsxLCAyXSwgbDIpOworCisgIHZhciBmMyA9IHJlcFN0cmVhbS50YWtlKDIpLnRvTGlzdCgpOworICBjLmFkZCgzKTsKKyAgdmFyIGwzID0gYXdhaXQgZjM7CisgIEV4cGVjdC5saXN0RXF1YWxzKFsyLCAzXSwgbDMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2FzeW5jL3pvbmVfYXN5bmNfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL3pvbmVfYXN5bmNfZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmM4N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvYXN5bmMvem9uZV9hc3luY19lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworbWFpbigpIHsKKyAgLy8gVGhlIGVycm9yIGNhbm5vdCBiZSBudWxsLgorICBFeHBlY3QudGhyb3dzTnVsbENoZWNrRXJyb3IoKCkgeworICAgIEFzeW5jRXJyb3IobnVsbCBhcyBkeW5hbWljLCBTdGFja1RyYWNlLmN1cnJlbnQpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9hdXRvbWF0aWNfcmVzb2x1dGlvbl9yb290L3BhY2thZ2VfcmVzb2x2ZV90ZXN0LmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fcm9vdC9wYWNrYWdlX3Jlc29sdmVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2NiZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fcm9vdC9wYWNrYWdlX3Jlc29sdmVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDppc29sYXRlJzsKKworZmluYWwgUEFDS0FHRV9VUkkgPSAicGFja2FnZTpmb28vYmFyLmRhcnQiOworCittYWluKFthcmdzLCBwb3J0XSkgYXN5bmMgeworICBpZiAocG9ydCAhPSBudWxsKSB7CisgICAgdGVzdFBhY2thZ2VSZXNvbHV0aW9uKHBvcnQpOworICAgIHJldHVybjsKKyAgfQorICB2YXIgcCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOworICBJc29sYXRlLnNwYXduVXJpKFBsYXRmb3JtLnNjcmlwdCwgW10sIHAuc2VuZFBvcnQsCisgICAgICBhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbjogdHJ1ZSk7CisgIHAuaGFuZGxlciA9IChtc2cpIHsKKyAgICBwLmNsb3NlKCk7CisgICAgaWYgKG1zZyBpcyEgTGlzdCkgeworICAgICAgcHJpbnQobXNnLnJ1bnRpbWVUeXBlKTsKKyAgICAgIHRocm93ICJGYWlsdXJlIHJldHVybiBmcm9tIHNwYXduZWQgaXNvbGF0ZTpcblxuJG1zZyI7CisgICAgfQorICAgIGlmIChtc2dbMF0gIT0gbnVsbCkgeworICAgICAgdGhyb3cgIkJhZCBwYWNrYWdlIHJvb3QgaW4gY2hpbGQgaXNvbGF0ZTogJHttc2dbMF19LlxuIgorICAgICAgICAgICJFeHBlY3RlZDogbnVsbCI7CisgICAgfQorICAgIGlmIChtc2dbMV0gIT0gbnVsbCkgeworICAgICAgdGhyb3cgIlBhY2thZ2UgcGF0aCBub3QgbWF0Y2hpbmc6ICR7bXNnWzFdfVxuIgorICAgICAgICAgICJFeHBlY3RlZDogbnVsbCI7CisgICAgfQorICAgIHByaW50KCJTVUNDRVNTIik7CisgIH07CisgIHByaW50KCJTcGF3bmluZyBpc29sYXRlJ3MgcGFja2FnZSByb290OiAke2F3YWl0IElzb2xhdGUucGFja2FnZVJvb3R9Iik7Cit9CisKK3Rlc3RQYWNrYWdlUmVzb2x1dGlvbihwb3J0KSBhc3luYyB7CisgIHRyeSB7CisgICAgdmFyIHBhY2thZ2VSb290U3RyID0gUGxhdGZvcm0ucGFja2FnZVJvb3Q7CisgICAgdmFyIHBhY2thZ2VDb25maWdTdHIgPSBQbGF0Zm9ybS5wYWNrYWdlQ29uZmlnOworICAgIHZhciBwYWNrYWdlUm9vdCA9IGF3YWl0IElzb2xhdGUucGFja2FnZVJvb3Q7CisgICAgdmFyIHJlc29sdmVkUGtnID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShVcmkucGFyc2UoUEFDS0FHRV9VUkkpKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcGFja2FnZSByb290IGZsYWc6ICRwYWNrYWdlUm9vdFN0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBwYWNrYWdlIGNvbmZpZyBmbGFnOiAkcGFja2FnZUNvbmZpZ1N0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBsb2FkZWQgcGFja2FnZSByb290OiAkcGFja2FnZVJvb3QiKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcmVzb2x2ZWQgcGFja2FnZSBwYXRoOiAkcmVzb2x2ZWRQa2ciKTsKKyAgICBwb3J0LnNlbmQoW3BhY2thZ2VSb290Py50b1N0cmluZygpLCByZXNvbHZlZFBrZz8udG9TdHJpbmcoKV0pOworICB9IGNhdGNoIChlLCBzKSB7CisgICAgcG9ydC5zZW5kKCIkZVxuJHNcbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fc3BlYy8ucGFja2FnZXMgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fc3BlYy8ucGFja2FnZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliY2Y0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9hdXRvbWF0aWNfcmVzb2x1dGlvbl9zcGVjLy5wYWNrYWdlcwpAQCAtMCwwICsxIEBACitmb286ZmlsZTovLy9uby9zdWNoL2RpcmVjdG9yeS8KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9hdXRvbWF0aWNfcmVzb2x1dGlvbl9zcGVjL3BhY2thZ2VfcmVzb2x2ZV90ZXN0LmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fc3BlYy9wYWNrYWdlX3Jlc29sdmVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYXV0b21hdGljX3Jlc29sdXRpb25fc3BlYy9wYWNrYWdlX3Jlc29sdmVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDppc29sYXRlJzsKKworZmluYWwgUEFDS0FHRV9VUkkgPSAicGFja2FnZTpmb28vYmFyLmRhcnQiOworZmluYWwgUEFDS0FHRV9QQVRIID0gImZpbGU6Ly8vbm8vc3VjaC9kaXJlY3RvcnkvYmFyLmRhcnQiOworCittYWluKFthcmdzLCBwb3J0XSkgYXN5bmMgeworICBpZiAocG9ydCAhPSBudWxsKSB7CisgICAgdGVzdFBhY2thZ2VSZXNvbHV0aW9uKHBvcnQpOworICAgIHJldHVybjsKKyAgfQorICB2YXIgcCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOworICBJc29sYXRlLnNwYXduVXJpKFBsYXRmb3JtLnNjcmlwdCwgW10sIHAuc2VuZFBvcnQsCisgICAgICBhdXRvbWF0aWNQYWNrYWdlUmVzb2x1dGlvbjogdHJ1ZSk7CisgIHAuaGFuZGxlciA9IChtc2cpIHsKKyAgICBwLmNsb3NlKCk7CisgICAgaWYgKG1zZyBpcyEgTGlzdCkgeworICAgICAgcHJpbnQobXNnLnJ1bnRpbWVUeXBlKTsKKyAgICAgIHRocm93ICJGYWlsdXJlIHJldHVybiBmcm9tIHNwYXduZWQgaXNvbGF0ZTpcblxuJG1zZyI7CisgICAgfQorICAgIHZhciBjaGlsZF9wa2dfY29uZmlnID0gUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoIi5wYWNrYWdlcyIpOworICAgIGlmIChtc2dbMF0gIT0gY2hpbGRfcGtnX2NvbmZpZy50b1N0cmluZygpKSB7CisgICAgICB0aHJvdyAiQmFkIHBhY2thZ2UgY29uZmlnIGluIGNoaWxkIGlzb2xhdGU6ICR7bXNnWzBdfVxuIgorICAgICAgICAgICJFeHBlY3RlZDogJGNoaWxkX3BrZ19jb25maWciOworICAgIH0KKyAgICBpZiAobXNnWzFdICE9IFBBQ0tBR0VfUEFUSCkgeworICAgICAgdGhyb3cgIlBhY2thZ2UgcGF0aCBub3QgbWF0Y2hpbmc6ICR7bXNnWzFdfSI7CisgICAgfQorICAgIHByaW50KCJTVUNDRVNTIik7CisgIH07CisgIHByaW50KCJTcGF3bmluZyBpc29sYXRlJ3MgcGFja2FnZSByb290OiAke2F3YWl0IElzb2xhdGUucGFja2FnZVJvb3R9Iik7Cit9CisKK3Rlc3RQYWNrYWdlUmVzb2x1dGlvbihwb3J0KSBhc3luYyB7CisgIHRyeSB7CisgICAgdmFyIHBhY2thZ2VSb290U3RyID0gUGxhdGZvcm0ucGFja2FnZVJvb3Q7CisgICAgdmFyIHBhY2thZ2VDb25maWdTdHIgPSBQbGF0Zm9ybS5wYWNrYWdlQ29uZmlnOworICAgIHZhciBwYWNrYWdlQ29uZmlnID0gYXdhaXQgSXNvbGF0ZS5wYWNrYWdlQ29uZmlnOworICAgIHZhciByZXNvbHZlZFBrZyA9IGF3YWl0IElzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmkoVXJpLnBhcnNlKFBBQ0tBR0VfVVJJKSk7CisgICAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSdzIHBhY2thZ2Ugcm9vdCBmbGFnOiAkcGFja2FnZVJvb3RTdHIiKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcGFja2FnZSBjb25maWcgZmxhZzogJHBhY2thZ2VDb25maWdTdHIiKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgbG9hZGVkIHBhY2thZ2UgY29uZmlnOiAkcGFja2FnZUNvbmZpZyIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyByZXNvbHZlZCBwYWNrYWdlIHBhdGg6ICRyZXNvbHZlZFBrZyIpOworICAgIHBvcnQuc2VuZChbcGFja2FnZUNvbmZpZz8udG9TdHJpbmcoKSwgcmVzb2x2ZWRQa2c/LnRvU3RyaW5nKCldKTsKKyAgfSBjYXRjaCAoZSwgcykgeworICAgIHBvcnQuc2VuZCgiJGVcbiRzXG4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL2JhZF9yZXNvbHZlX3BhY2thZ2UvYmFkX3Jlc29sdmVfcGFja2FnZV90ZXN0LmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvYmFkX3Jlc29sdmVfcGFja2FnZS9iYWRfcmVzb2x2ZV9wYWNrYWdlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY2NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL2JhZF9yZXNvbHZlX3BhY2thZ2UvYmFkX3Jlc29sdmVfcGFja2FnZV90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CisKK21haW4oW2FyZ3MsIHBvcnRdKSBhc3luYyB7CisgIGlmIChwb3J0ICE9IG51bGwpIHsKKyAgICB0ZXN0QmFkUmVzb2x2ZVBhY2thZ2UocG9ydCk7CisgICAgcmV0dXJuOworICB9CisgIHZhciBwID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CisgIElzb2xhdGUuc3Bhd25VcmkoUGxhdGZvcm0uc2NyaXB0LCBbXSwgcC5zZW5kUG9ydCk7CisgIHAuaGFuZGxlciA9IChtc2cpIHsKKyAgICBwLmNsb3NlKCk7CisgICAgaWYgKG1zZyBpcyEgTGlzdCkgeworICAgICAgcHJpbnQobXNnLnJ1bnRpbWVUeXBlKTsKKyAgICAgIHRocm93ICJGYWlsdXJlIHJldHVybiBmcm9tIHNwYXduZWQgaXNvbGF0ZTpcblxuJG1zZyI7CisgICAgfQorICAgIC8vIEV4cGVjdGluZyBhIG51bGwgcmVzb2x1dGlvbiBmb3IgaW5leGlzdGVudCBwYWNrYWdlIG1hcHBpbmcuCisgICAgaWYgKG1zZ1swXSAhPSBudWxsKSB7CisgICAgICB0aHJvdyAiQmFkIHBhY2thZ2UgY29uZmlnIGluIGNoaWxkIGlzb2xhdGU6ICR7bXNnWzBdfVxuIgorICAgICAgICAgICJFeHBlY3RlZDogJ0ZvbyciOworICAgIH0KKyAgICBwcmludCgiU1VDQ0VTUyIpOworICB9OworfQorCit0ZXN0QmFkUmVzb2x2ZVBhY2thZ2UocG9ydCkgYXN5bmMgeworICB0cnkgeworICAgIHZhciBwYWNrYWdlUm9vdFN0ciA9IFBsYXRmb3JtLnBhY2thZ2VSb290OworICAgIHZhciBwYWNrYWdlQ29uZmlnU3RyID0gUGxhdGZvcm0ucGFja2FnZUNvbmZpZzsKKyAgICB2YXIgcGFja2FnZUNvbmZpZyA9IGF3YWl0IElzb2xhdGUucGFja2FnZUNvbmZpZzsKKyAgICB2YXIgYmFkUGFja2FnZVVyaSA9IFVyaS5wYXJzZSgicGFja2FnZTphc2RmL3F3ZXJ0eS5kYXJ0Iik7CisgICAgdmFyIHJlc29sdmVkUGtnID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShiYWRQYWNrYWdlVXJpKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcGFja2FnZSByb290IGZsYWc6ICRwYWNrYWdlUm9vdFN0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBwYWNrYWdlIGNvbmZpZyBmbGFnOiAkcGFja2FnZUNvbmZpZ1N0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBsb2FkZWQgcGFja2FnZSBjb25maWc6ICRwYWNrYWdlQ29uZmlnIik7CisgICAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSdzIHJlc29sdmVkIHBhY2thZ2UgcGF0aDogJHJlc29sdmVkUGtnIik7CisgICAgcG9ydC5zZW5kKFtyZXNvbHZlZFBrZ10pOworICB9IGNhdGNoIChlLCBzKSB7CisgICAgcG9ydC5zZW5kKCIkZVxuJHNcbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9kYXRhX3VyaV9zcGVjL3BhY2thZ2VfcmVzb2x2ZV90ZXN0LmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9kYXRhX3VyaV9zcGVjL3BhY2thZ2VfcmVzb2x2ZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ODZhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX2RhdGFfdXJpX3NwZWMvcGFja2FnZV9yZXNvbHZlX3Rlc3QuZGFydApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWVuYWJsZS1pc29sYXRlLWdyb3VwcworLy8gVk1PcHRpb25zPS0tbm8tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CisKK2ZpbmFsIHBhY2thZ2VVcmlUb1Jlc29sdmUgPSAicGFja2FnZTpmb28vYmFyLmRhcnQiOworZmluYWwgcGFja2FnZVJlc29sdmVkVXJpID0gImZpbGU6Ly8vbm8vc3VjaC9kaXJlY3RvcnkvbGliL2Jhci5kYXJ0IjsKKworZmluYWwgZG90UGFja2FnZXMgPSAiIiIKKyMgVGhpcyBpcyB0aGUgY29udGVudCBvZiBhIC5wYWNrYWdlcyBmaWxlLgorZm9vOmZpbGU6Ly8vbm8vc3VjaC9kaXJlY3RvcnkvbGliLworIiIiOworCitmaW5hbCBwYWNrYWdlQ29uZmlnSnNvbiA9ICIiIgoreworICAiY29uZmlnVmVyc2lvbiI6IDIsCisgICJwYWNrYWdlcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJmb28iLAorICAgICAgInJvb3RVcmkiOiAiZmlsZTovLy9uby9zdWNoL2RpcmVjdG9yeSIsCisgICAgICAicGFja2FnZVVyaSI6ICJsaWIvIiwKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi43IgorICAgIH0KKyAgXQorfQorIiIiOworCittYWluKFthcmdzLCBwb3J0XSkgYXN5bmMgeworICBpZiAocG9ydCAhPSBudWxsKSB7CisgICAgdGVzdFBhY2thZ2VSZXNvbHV0aW9uKHBvcnQpOworICAgIHJldHVybjsKKyAgfQorICBhd2FpdCBydW5UZXN0KGRvdFBhY2thZ2VzKTsKKyAgYXdhaXQgcnVuVGVzdChwYWNrYWdlQ29uZmlnSnNvbik7Cit9CisKK0Z1dHVyZSBydW5UZXN0KFN0cmluZyBwYWNrYWdlQ29uZmlnKSBhc3luYyB7CisgIGZpbmFsIGRhdGEgPSBVcmkuZGF0YUZyb21TdHJpbmcocGFja2FnZUNvbmZpZyk7CisgIGZpbmFsIHBvcnQgPSBSZWNlaXZlUG9ydCgpOworICBhd2FpdCBJc29sYXRlLnNwYXduVXJpKFBsYXRmb3JtLnNjcmlwdCwgW10sIHBvcnQuc2VuZFBvcnQsCisgICAgICBwYWNrYWdlQ29uZmlnOiBkYXRhKTsKKyAgZmluYWwgbXNnID0gYXdhaXQgcG9ydC5maXJzdDsKKyAgaWYgKG1zZyBpcyEgTGlzdCkgeworICAgIHByaW50KG1zZy5ydW50aW1lVHlwZSk7CisgICAgdGhyb3cgIkZhaWx1cmUgcmV0dXJuIGZyb20gc3Bhd25lZCBpc29sYXRlOlxuXG4kbXNnIjsKKyAgfQorICBpZiAobXNnWzBdICE9IGRhdGEudG9TdHJpbmcoKSkgeworICAgIHRocm93ICJCYWQgcGFja2FnZSBjb25maWcgaW4gY2hpbGQgaXNvbGF0ZTogJHttc2dbMF19XG4iCisgICAgICAgICJFeHBlY3RlZDogJGRhdGEiOworICB9CisgIGlmIChtc2dbMV0gIT0gcGFja2FnZVJlc29sdmVkVXJpKSB7CisgICAgdGhyb3cgIlBhY2thZ2UgcGF0aCBub3QgbWF0Y2hpbmc6ICR7bXNnWzFdfSI7CisgIH0KKyAgcHJpbnQoIlNVQ0NFU1MiKTsKK30KKwordGVzdFBhY2thZ2VSZXNvbHV0aW9uKHBvcnQpIGFzeW5jIHsKKyAgdHJ5IHsKKyAgICB2YXIgcGFja2FnZUNvbmZpZ1N0ciA9IFBsYXRmb3JtLnBhY2thZ2VDb25maWc7CisgICAgdmFyIHBhY2thZ2VDb25maWcgPSBhd2FpdCBJc29sYXRlLnBhY2thZ2VDb25maWc7CisgICAgdmFyIHJlc29sdmVkUGtnID0KKyAgICAgICAgYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShVcmkucGFyc2UocGFja2FnZVVyaVRvUmVzb2x2ZSkpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBwYWNrYWdlIGNvbmZpZyBmbGFnOiAkcGFja2FnZUNvbmZpZ1N0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBsb2FkZWQgcGFja2FnZSBjb25maWc6ICRwYWNrYWdlQ29uZmlnIik7CisgICAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSdzIHJlc29sdmVkIHBhY2thZ2UgcGF0aDogJHJlc29sdmVkUGtnIik7CisgICAgcG9ydC5zZW5kKFtwYWNrYWdlQ29uZmlnPy50b1N0cmluZygpLCByZXNvbHZlZFBrZz8udG9TdHJpbmcoKV0pOworICB9IGNhdGNoIChlLCBzKSB7CisgICAgcG9ydC5zZW5kKCIkZVxuJHNcbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290Ly5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbiBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjkzNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290Ly5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJjb25maWdWZXJzaW9uIjogMiwKKyAgInBhY2thZ2VzIjogWworICAgIHsKKyAgICAgICJuYW1lIjogImZvbyIsCisgICAgICAicm9vdFVyaSI6ICIuLi9wYWNrYWdlcy9mb28iLAorICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjkiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJiYXIiLAorICAgICAgInJvb3RVcmkiOiAiLi4vcGFja2FnZXMvYmFyIiwKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi45IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfcm9vdC9wYWNrYWdlX3JlbGF0aXZlX3Jvb3RfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfcm9vdC9wYWNrYWdlX3JlbGF0aXZlX3Jvb3RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDg4MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VfcmVsYXRpdmVfcm9vdF90ZXN0LmRhcnQKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CisKK2ltcG9ydCAicGFja2FnZTpmb28vZm9vLmRhcnQiOworaW1wb3J0ICJwYWNrYWdlOmJhci9iYXIuZGFydCI7CisKK3ZhciBDT05GSUdfVVJJID0gInBhY2thZ2U6YmFyL3NwYXduZWRfcGFja2FnZXMvIjsKKworbWFpbihbYXJncywgcG9ydF0pIGFzeW5jIHsKKyAgaWYgKHBvcnQgIT0gbnVsbCkgeworICAgIHRlc3RDb3JyZWN0QmFyUGFja2FnZShwb3J0KTsKKyAgICByZXR1cm47CisgIH0KKyAgdmFyIHAgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKKyAgSXNvbGF0ZS5zcGF3blVyaShQbGF0Zm9ybS5zY3JpcHQsIFtdLCBwLnNlbmRQb3J0LAorICAgICAgcGFja2FnZVJvb3Q6IFVyaS5wYXJzZShDT05GSUdfVVJJKSk7CisgIHAuaGFuZGxlciA9IChtc2cpIHsKKyAgICBwLmNsb3NlKCk7CisgICAgaWYgKG1zZyBpcyEgTGlzdCkgeworICAgICAgcHJpbnQobXNnLnJ1bnRpbWVUeXBlKTsKKyAgICAgIHRocm93ICJGYWlsdXJlIHJldHVybiBmcm9tIHNwYXduZWQgaXNvbGF0ZTpcblxuJG1zZyI7CisgICAgfQorICAgIGlmIChtc2dbMF0gIT0gIkZvbyIpIHsKKyAgICAgIHRocm93ICJCYWQgcGFja2FnZSBjb25maWcgaW4gY2hpbGQgaXNvbGF0ZTogJHttc2dbMF19XG4iCisgICAgICAgICAgIkV4cGVjdGVkOiAnRm9vJyI7CisgICAgfQorICAgIGlmIChtc2dbMV0gIT0gIkJhcjEiKSB7CisgICAgICB0aHJvdyAiUGFja2FnZSBwYXRoIG5vdCBtYXRjaGluZzogJHttc2dbMV19XG4iCisgICAgICAgICAgIkV4cGVjdGVkOiAnQmFyMSciOworICAgIH0KKyAgICBwcmludCgiU1VDQ0VTUyIpOworICB9OworICBpZiAoQmFyLnZhbHVlICE9ICJCYXIxIikgeworICAgIHRocm93ICJTcGF3bmluZyBpc29sYXRlIHBhY2thZ2U6YmFyIGludmFsaWQuIjsKKyAgfQorICBwcmludCgiU3Bhd25lZCBpc29sYXRlIHJlc29sdmVkICRDT05GSUdfVVJJIHRvOiAiCisgICAgICAiJHthd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKFVyaS5wYXJzZShDT05GSUdfVVJJKSl9Iik7Cit9CisKK3Rlc3RDb3JyZWN0QmFyUGFja2FnZShwb3J0KSBhc3luYyB7CisgIHRyeSB7CisgICAgdmFyIHBhY2thZ2VSb290U3RyID0gUGxhdGZvcm0ucGFja2FnZVJvb3Q7CisgICAgdmFyIHBhY2thZ2VDb25maWdTdHIgPSBQbGF0Zm9ybS5wYWNrYWdlQ29uZmlnOworICAgIHZhciBwYWNrYWdlQ29uZmlnID0gYXdhaXQgSXNvbGF0ZS5wYWNrYWdlQ29uZmlnOworICAgIHZhciByZXNvbHZlZFBrZyA9IGF3YWl0IElzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmkoVXJpLnBhcnNlKENPTkZJR19VUkkpKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcGFja2FnZSByb290IGZsYWc6ICRwYWNrYWdlUm9vdFN0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBwYWNrYWdlIGNvbmZpZyBmbGFnOiAkcGFja2FnZUNvbmZpZ1N0ciIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyBsb2FkZWQgcGFja2FnZSBjb25maWc6ICRwYWNrYWdlQ29uZmlnIik7CisgICAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSdzIHJlc29sdmVkIHBhY2thZ2UgcGF0aDogJHJlc29sdmVkUGtnIik7CisgICAgcG9ydC5zZW5kKFtGb28udmFsdWUsIEJhci52YWx1ZV0pOworICB9IGNhdGNoIChlLCBzKSB7CisgICAgcG9ydC5zZW5kKCIkZVxuJHNcbiIpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9iYXIuZGFydCBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvcGFja2FnZXMvYmFyL2Jhci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjk5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9iYXIuZGFydApAQCAtMCwwICsxLDMgQEAKK2NsYXNzIEJhciB7CisgIHN0YXRpYyB2YXIgdmFsdWUgPSAiQmFyMSI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9zcGF3bmVkX3BhY2thZ2VzL2Jhci9iYXIuZGFydCBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvcGFja2FnZXMvYmFyL3NwYXduZWRfcGFja2FnZXMvYmFyL2Jhci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjcyM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9zcGF3bmVkX3BhY2thZ2VzL2Jhci9iYXIuZGFydApAQCAtMCwwICsxLDMgQEAKK2NsYXNzIEJhciB7CisgIHN0YXRpYyB2YXIgdmFsdWUgPSAiQmFyMiI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9zcGF3bmVkX3BhY2thZ2VzL2Zvby9mb28uZGFydCBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvcGFja2FnZXMvYmFyL3NwYXduZWRfcGFja2FnZXMvZm9vL2Zvby5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTA3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9yb290L3BhY2thZ2VzL2Jhci9zcGF3bmVkX3BhY2thZ2VzL2Zvby9mb28uZGFydApAQCAtMCwwICsxLDMgQEAKK2NsYXNzIEZvbyB7CisgIHN0YXRpYyB2YXIgdmFsdWUgPSAiRm9vIjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvcGFja2FnZXMvZm9vL2Zvby5kYXJ0IGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfcm9vdC9wYWNrYWdlcy9mb28vZm9vLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5MDdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3Jvb3QvcGFja2FnZXMvZm9vL2Zvby5kYXJ0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgRm9vIHsKKyAgc3RhdGljIHZhciB2YWx1ZSA9ICJGb28iOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy8uZGFydF90b29sL3BhY2thZ2VfY29uZmlnLmpzb24gYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjLy5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFkYjhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy8uZGFydF90b29sL3BhY2thZ2VfY29uZmlnLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAiY29uZmlnVmVyc2lvbiI6IDIsCisgICJwYWNrYWdlcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJmb28iLAorICAgICAgInJvb3RVcmkiOiAiLi4vZm9vX3BhY2thZ2UiLAorICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjkiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJiYXIiLAorICAgICAgInJvb3RVcmkiOiAiLi4vYmFyMV9wYWNrYWdlIiwKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi45IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIxX3BhY2thZ2UvYmFyLmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjL2JhcjFfcGFja2FnZS9iYXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmI5OWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIxX3BhY2thZ2UvYmFyLmRhcnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBCYXIgeworICBzdGF0aWMgdmFyIHZhbHVlID0gIkJhcjEiOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIxX3BhY2thZ2UvcGFja2FnZS5jb25maWcgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjL2JhcjFfcGFja2FnZS9wYWNrYWdlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYzMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIxX3BhY2thZ2UvcGFja2FnZS5jb25maWcKQEAgLTAsMCArMSwxNSBAQAoreworICAiY29uZmlnVmVyc2lvbiI6IDIsCisgICJwYWNrYWdlcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJmb28iLAorICAgICAgInJvb3RVcmkiOiAiLi4vZm9vX3BhY2thZ2UiLAorICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjkiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJiYXIiLAorICAgICAgInJvb3RVcmkiOiAiLi4vYmFyMl9wYWNrYWdlIiwKKyAgICAgICJsYW5ndWFnZVZlcnNpb24iOiAiMi45IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIyX3BhY2thZ2UvYmFyLmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjL2JhcjJfcGFja2FnZS9iYXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY3MjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9iYXIyX3BhY2thZ2UvYmFyLmRhcnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBCYXIgeworICBzdGF0aWMgdmFyIHZhbHVlID0gIkJhcjIiOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3BhY2thZ2VfcmVsYXRpdmVfc3BlYy9mb29fcGFja2FnZS9mb28uZGFydCBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3NwZWMvZm9vX3BhY2thZ2UvZm9vLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5MDdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3NwZWMvZm9vX3BhY2thZ2UvZm9vLmRhcnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBGb28geworICBzdGF0aWMgdmFyIHZhbHVlID0gIkZvbyI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjL3BhY2thZ2VfcmVsYXRpdmVfc3BlY190ZXN0LmRhcnQgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3MvcGFja2FnZV9yZWxhdGl2ZV9zcGVjL3BhY2thZ2VfcmVsYXRpdmVfc3BlY190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YjYwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9wYWNrYWdlX3JlbGF0aXZlX3NwZWMvcGFja2FnZV9yZWxhdGl2ZV9zcGVjX3Rlc3QuZGFydApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFBhY2thZ2VzPW5vbmUKKworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDppc29sYXRlJzsKKworaW1wb3J0ICJwYWNrYWdlOmZvby9mb28uZGFydCI7CitpbXBvcnQgInBhY2thZ2U6YmFyL2Jhci5kYXJ0IjsKKwordmFyIENPTkZJR19VUkkgPSAicGFja2FnZTpiYXIvcGFja2FnZS5jb25maWciOworCittYWluKFthcmdzLCBwb3J0XSkgYXN5bmMgeworICBpZiAocG9ydCAhPSBudWxsKSB7CisgICAgdGVzdENvcnJlY3RCYXJQYWNrYWdlKHBvcnQpOworICAgIHJldHVybjsKKyAgfQorICB2YXIgcCA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOworICBJc29sYXRlLnNwYXduVXJpKFBsYXRmb3JtLnNjcmlwdCwgW10sIHAuc2VuZFBvcnQsCisgICAgICBwYWNrYWdlQ29uZmlnOiBVcmkucGFyc2UoQ09ORklHX1VSSSkpOworICBwLmhhbmRsZXIgPSAobXNnKSB7CisgICAgcC5jbG9zZSgpOworICAgIGlmIChtc2cgaXMhIExpc3QpIHsKKyAgICAgIHByaW50KG1zZy5ydW50aW1lVHlwZSk7CisgICAgICB0aHJvdyAiRmFpbHVyZSByZXR1cm4gZnJvbSBzcGF3bmVkIGlzb2xhdGU6XG5cbiRtc2ciOworICAgIH0KKyAgICBpZiAobXNnWzBdICE9ICJGb28iKSB7CisgICAgICB0aHJvdyAiQmFkIHBhY2thZ2UgY29uZmlnIGluIGNoaWxkIGlzb2xhdGU6ICR7bXNnWzBdfVxuIgorICAgICAgICAgICJFeHBlY3RlZDogJ0ZvbyciOworICAgIH0KKyAgICBpZiAobXNnWzFdICE9ICJCYXIyIikgeworICAgICAgdGhyb3cgIlBhY2thZ2UgcGF0aCBub3QgbWF0Y2hpbmc6ICR7bXNnWzFdfVxuIgorICAgICAgICAgICJFeHBlY3RlZDogJ0JhcjInIjsKKyAgICB9CisgICAgcHJpbnQoIlNVQ0NFU1MiKTsKKyAgfTsKKyAgaWYgKEJhci52YWx1ZSAhPSAiQmFyMSIpIHsKKyAgICB0aHJvdyAiU3Bhd25pbmcgaXNvbGF0ZSBwYWNrYWdlOmJhciBpbnZhbGlkLiI7CisgIH0KKyAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSByZXNvbHZlZCAkQ09ORklHX1VSSSB0bzogIgorICAgICAgIiR7YXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShVcmkucGFyc2UoQ09ORklHX1VSSSkpfSIpOworfQorCit0ZXN0Q29ycmVjdEJhclBhY2thZ2UocG9ydCkgYXN5bmMgeworICB0cnkgeworICAgIHZhciBwYWNrYWdlUm9vdFN0ciA9IFBsYXRmb3JtLnBhY2thZ2VSb290OworICAgIHZhciBwYWNrYWdlQ29uZmlnU3RyID0gUGxhdGZvcm0ucGFja2FnZUNvbmZpZzsKKyAgICB2YXIgcGFja2FnZUNvbmZpZyA9IGF3YWl0IElzb2xhdGUucGFja2FnZUNvbmZpZzsKKyAgICB2YXIgcmVzb2x2ZWRQa2cgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKFVyaS5wYXJzZShDT05GSUdfVVJJKSk7CisgICAgcHJpbnQoIlNwYXduZWQgaXNvbGF0ZSdzIHBhY2thZ2Ugcm9vdCBmbGFnOiAkcGFja2FnZVJvb3RTdHIiKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgcGFja2FnZSBjb25maWcgZmxhZzogJHBhY2thZ2VDb25maWdTdHIiKTsKKyAgICBwcmludCgiU3Bhd25lZCBpc29sYXRlJ3MgbG9hZGVkIHBhY2thZ2UgY29uZmlnOiAkcGFja2FnZUNvbmZpZyIpOworICAgIHByaW50KCJTcGF3bmVkIGlzb2xhdGUncyByZXNvbHZlZCBwYWNrYWdlIHBhdGg6ICRyZXNvbHZlZFBrZyIpOworICAgIHBvcnQuc2VuZChbRm9vLnZhbHVlLCBCYXIudmFsdWVdKTsKKyAgfSBjYXRjaCAoZSwgcykgeworICAgIHBvcnQuc2VuZCgiJGVcbiRzXG4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3Nob3J0X3BhY2thZ2UvLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uIGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3Nob3J0X3BhY2thZ2UvLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Nzg4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3Mvc2hvcnRfcGFja2FnZS8uZGFydF90b29sL3BhY2thZ2VfY29uZmlnLmpzb24KQEAgLTAsMCArMSwxMCBAQAoreworICAiY29uZmlnVmVyc2lvbiI6IDIsCisgICJwYWNrYWdlcyI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJmbHUiLAorICAgICAgInJvb3RVcmkiOiAiLi4vZmx1X3BhY2thZ2UiLAorICAgICAgImxhbmd1YWdlVmVyc2lvbiI6ICIyLjkiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3Mvc2hvcnRfcGFja2FnZS9mbHVfcGFja2FnZS9mbHUuZGFydCBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9zaG9ydF9wYWNrYWdlL2ZsdV9wYWNrYWdlL2ZsdS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzNmN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWIvaXNvbGF0ZS9zY2VuYXJpb3Mvc2hvcnRfcGFja2FnZS9mbHVfcGFja2FnZS9mbHUuZGFydApAQCAtMCwwICsxLDMgQEAKK2NsYXNzIEZsdSB7CisgIHN0YXRpYyB2YXIgdmFsdWUgPSAiRmx1IjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9zaG9ydF9wYWNrYWdlL2ZsdV9wYWNrYWdlL2ZsdS50ZXh0IGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3Nob3J0X3BhY2thZ2UvZmx1X3BhY2thZ2UvZmx1LnRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkM2E5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9zaG9ydF9wYWNrYWdlL2ZsdV9wYWNrYWdlL2ZsdS50ZXh0CkBAIC0wLDAgKzEgQEAKK0JhcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9zaG9ydF9wYWNrYWdlL3Nob3J0X3BhY2thZ2VfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2lzb2xhdGUvc2NlbmFyaW9zL3Nob3J0X3BhY2thZ2Uvc2hvcnRfcGFja2FnZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkZmI4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9pc29sYXRlL3NjZW5hcmlvcy9zaG9ydF9wYWNrYWdlL3Nob3J0X3BhY2thZ2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9bm9uZQorCitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworCitpbXBvcnQgInBhY2thZ2U6Zmx1L2ZsdS5kYXJ0IjsKKwordmFyIFBBQ0tBR0VfRkxVID0gInBhY2thZ2U6Zmx1IjsKK3ZhciBGTFVfVEVYVCA9ICJmbHUudGV4dCI7CisKK3Rlc3RTaG9ydFJlc29sdXRpb24ocGFja2FnZV91cmkpIGFzeW5jIHsKKyAgdmFyIGZsdVBhY2thZ2UgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKFVyaS5wYXJzZShwYWNrYWdlX3VyaSkpOworICBwcmludCgiUmVzb2x2ZWQgJHBhY2thZ2VfdXJpIHRvICRmbHVQYWNrYWdlIik7CisgIGlmIChmbHVQYWNrYWdlID09IG51bGwpIHsKKyAgICB0aHJvdyAiUGFja2FnZSByZXNvbHZlcyB0byBudWxsIGZvciAkcGFja2FnZV91cmkuXG4iOworICB9CisgIHZhciBmbHVUZXh0ID0gZmx1UGFja2FnZS5yZXNvbHZlKEZMVV9URVhUKTsKKyAgcHJpbnQoIlJlc29sdmVkICRGTFVfVEVYVCBmcm9tICRwYWNrYWdlX3VyaSB0byAkZmx1VGV4dCIpOworICB2YXIgZmx1RmlsZSA9IG5ldyBGaWxlLmZyb21VcmkoZmx1VGV4dCk7CisgIHZhciBmbHVTdHJpbmcgPSBhd2FpdCBmbHVGaWxlLnJlYWRBc1N0cmluZygpOworICBpZiAoZmx1U3RyaW5nICE9ICJCYXIiKSB7CisgICAgdGhyb3cgIkNvbnRlbnRzIG9mICRGTFVfVEVYVCBub3QgbWF0Y2hpbmcuXG4iCisgICAgICAgICJHb3Q6ICRmbHVTdHJpbmdcbiIKKyAgICAgICAgIkV4cGVjdGVkOiBCYXIiOworICB9Cit9CisKK21haW4oW2FyZ3MsIHBvcnRdKSBhc3luYyB7CisgIGlmIChGbHUudmFsdWUgIT0gIkZsdSIpIHsKKyAgICB0aHJvdyAiSW1wb3J0IG9mIHdyb25nIEZsdSBwYWNrYWdlLiI7CisgIH0KKy8vICBhd2FpdCB0ZXN0U2hvcnRSZXNvbHV0aW9uKFBBQ0tBR0VfRkxVKTsKKyAgYXdhaXQgdGVzdFNob3J0UmVzb2x1dGlvbihQQUNLQUdFX0ZMVSArICIvIik7CisgIGF3YWl0IHRlc3RTaG9ydFJlc29sdXRpb24oUEFDS0FHRV9GTFUgKyAiL2FiYy5kZWYiKTsKKyAgcHJpbnQoIlNVQ0NFU1MiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9saWIuc3RhdHVzIGIvdGVzdHMvbGliL2xpYi5zdGF0dXMKaW5kZXggOWI4N2E4ZC4uODdmNTdkMyAxMDA2NDQKLS0tIGEvdGVzdHMvbGliL2xpYi5zdGF0dXMKKysrIGIvdGVzdHMvbGliL2xpYi5zdGF0dXMKQEAgLTM4LDYgKzM4LDkgQEAKIGpzL2luc3RhbmNlb2ZfdGVzdDogU2tpcEJ5RGVzaWduICMgSXNzdWUgNDIwODUuIENTUCBwb2xpY3kgZGlzYWxsb3dzIGluamVjdGVkIEpTIGNvZGUKIGpzL3BhcmFtZXRlcnNfdGVzdDogU2tpcEJ5RGVzaWduICMgSXNzdWUgNDIwODUuCiAKK1sgJGNvbXBpbGVyICE9IGRhcnQyanMgJiYgJGNvbXBpbGVyICE9IGRhcnRkZXZrIF0KK3dlYi8qOiBTa2lwQnlEZXNpZ24KKwogWyAkcnVudGltZSA9PSBjaHJvbWUgJiYgJHN5c3RlbSA9PSBsaW51eCBdCiBtaXJyb3JzL25hdGl2ZV9jbGFzc190ZXN0OiBTbG93LCBQYXNzCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9taXJyb3JzL2luc3RhbmNlX21lbWJlcnNfd2l0aF9vdmVycmlkZV90ZXN0LmRhcnQgYi90ZXN0cy9saWIvbWlycm9ycy9pbnN0YW5jZV9tZW1iZXJzX3dpdGhfb3ZlcnJpZGVfdGVzdC5kYXJ0CmluZGV4IDczMjUyNDguLjZlMWI5NjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYi9taXJyb3JzL2luc3RhbmNlX21lbWJlcnNfd2l0aF9vdmVycmlkZV90ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGliL21pcnJvcnMvaW5zdGFuY2VfbWVtYmVyc193aXRoX292ZXJyaWRlX3Rlc3QuZGFydApAQCAtNiwxMiArNiw5IEBACiAKIGltcG9ydCAnZGFydDptaXJyb3JzJzsKIGltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JyBzaG93IHZpcnR1YWw7CiAKIGNsYXNzIFMgewotICBAdmlydHVhbAogICB2YXIgZmllbGQ7Ci0gIEB2aXJ0dWFsCiAgIGZpbmFsIGZpbmFsRmllbGQgPSAwOwogICBtZXRob2QoKSB7fQogICBnZXQgZ2V0dGVyIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvd2ViL21pcnJvcnNfc3VwcG9ydF90ZXN0LmRhcnQgYi90ZXN0cy9saWIvd2ViL21pcnJvcnNfc3VwcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkYzJkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi93ZWIvbWlycm9yc19zdXBwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vICdkYXJ0Om1pcnJvcnMnIHByb3ZpZGVzIG5vIGZ1bmN0aW9uYWxpdHkgaW4gZGFydC13ZWIsIGJ1dCBjYW4gYmUgaW1wb3J0ZWQgYW5kCisvLyBhbGwgQVBJcyB0aHJvdy4KK2ltcG9ydCAnZGFydDptaXJyb3JzJzsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCittYWluKCkgeworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gcmVmbGVjdChtYWluKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gcmVmbGVjdENsYXNzKE9iamVjdCkpOworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IHJlZmxlY3RUeXBlKE9iamVjdCkpOworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IE1pcnJvclN5c3RlbS5nZXROYW1lKCNjb3JlKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gTWlycm9yU3lzdGVtLmdldFN5bWJvbCgiY29yZSIpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYl8yL2FzeW5jL3N0cmVhbV9tdWx0aV90ZXN0LmRhcnQgYi90ZXN0cy9saWJfMi9hc3luYy9zdHJlYW1fbXVsdGlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGQ3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJfMi9hc3luYy9zdHJlYW1fbXVsdGlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTM5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICJwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCI7CisKK2V4dGVuc2lvbiBTdHJlYW1SZXBlYXRMYXRlc3RFeHRlbnNpb248VD4gb24gU3RyZWFtPFQ+IHsKKyAgU3RyZWFtPFQ+IHJlcGVhdExhdGVzdCgpIHsKKyAgICB2YXIgZG9uZSA9IGZhbHNlOworICAgIFQgbGF0ZXN0ID0gbnVsbDsKKyAgICB2YXIgY3VycmVudExpc3RlbmVycyA9IDxNdWx0aVN0cmVhbUNvbnRyb2xsZXI8VD4+e307CisgICAgdGhpcy5saXN0ZW4oKGV2ZW50KSB7CisgICAgICBsYXRlc3QgPSBldmVudDsKKyAgICAgIGZvciAodmFyIGxpc3RlbmVyIGluIFsuLi5jdXJyZW50TGlzdGVuZXJzXSkgbGlzdGVuZXIuYWRkU3luYyhldmVudCk7CisgICAgfSwgb25FcnJvcjogKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFjaykgeworICAgICAgZm9yICh2YXIgbGlzdGVuZXIgaW4gWy4uLmN1cnJlbnRMaXN0ZW5lcnNdKQorICAgICAgICBsaXN0ZW5lci5hZGRFcnJvclN5bmMoZXJyb3IsIHN0YWNrKTsKKyAgICB9LCBvbkRvbmU6ICgpIHsKKyAgICAgIGRvbmUgPSB0cnVlOworICAgICAgbGF0ZXN0ID0gbnVsbDsKKyAgICAgIGZvciAodmFyIGxpc3RlbmVyIGluIGN1cnJlbnRMaXN0ZW5lcnMpIGxpc3RlbmVyLmNsb3NlU3luYygpOworICAgICAgY3VycmVudExpc3RlbmVycy5jbGVhcigpOworICAgIH0pOworICAgIHJldHVybiBTdHJlYW0ubXVsdGkoKGNvbnRyb2xsZXIpIHsKKyAgICAgIGlmIChkb25lKSB7CisgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY3VycmVudExpc3RlbmVycy5hZGQoY29udHJvbGxlcik7CisgICAgICBpZiAobGF0ZXN0ICE9IG51bGwpIGNvbnRyb2xsZXIuYWRkKGxhdGVzdCk7CisgICAgICBjb250cm9sbGVyLm9uQ2FuY2VsID0gKCkgeworICAgICAgICBjdXJyZW50TGlzdGVuZXJzLnJlbW92ZShjb250cm9sbGVyKTsKKyAgICAgIH07CisgICAgfSk7CisgIH0KK30KKwordm9pZCBtYWluKCkgeworICBhc3luY1N0YXJ0KCk7CisgIHRlc3RTdHJlYW1zSW5kZXBlbmRlbnQoKTsKKyAgYXN5bmNUZXN0KHRlc3RTdHJlYW1Ob25PdmVybGFwKTsKKyAgYXN5bmNUZXN0KHRlc3RSZXBlYXRMYXRlc3QpOworICBhc3luY0VuZCgpOworfQorCisvLy8gVGVzdCB0aGF0IHRoZSBzdHJlYW1zIGNhbiBwcm92aWRlIGRpZmZlcmVudCBldmVudHMuCit2b2lkIHRlc3RTdHJlYW1zSW5kZXBlbmRlbnQoKSB7CisgIHZhciBsb2cgPSA8U3RyaW5nPltdOworICB2YXIgaW5kZXggPSAwOworICB2YXIgbXVsdGkgPSBTdHJlYW08TGlzdDxpbnQ+Pi5tdWx0aSgoYykgeworICAgIHZhciBpZCA9ICsraW5kZXg7CisgICAgbG9nLmFkZCgiJGlkIik7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZCArIDE7IGkrKykgeworICAgICAgYy5hZGQoW2lkLCBpXSk7CisgICAgfQorICAgIGMuY2xvc2UoKTsKKyAgfSk7CisgIHZvaWQgbG9nTGlzdChMaXN0PGludD4gbCkgeworICAgIGxvZy5hZGQoIiR7bC5maXJzdH0tJHtsLmxhc3R9Iik7CisgIH0KKworICBhc3luY1N0YXJ0KCk7CisgIEZ1dHVyZS53YWl0KFttdWx0aS5mb3JFYWNoKGxvZ0xpc3QpLCBtdWx0aS5mb3JFYWNoKGxvZ0xpc3QpXSkKKyAgICAgIC53aGVuQ29tcGxldGUoKCkgeworICAgIEV4cGVjdC5lcXVhbHMoNywgbG9nLmxlbmd0aCk7CisgICAgZm9yICh2YXIgZWxlbWVudCBpbiBbIjEiLCAiMS0wIiwgIjEtMSIsICIyIiwgIjItMCIsICIyLTEiLCAiMi0yIl0pIHsKKyAgICAgIEV4cGVjdC5pc1RydWUobG9nLmNvbnRhaW5zKGVsZW1lbnQpKTsKKyAgICB9CisgICAgYXN5bmNFbmQoKTsKKyAgfSk7Cit9CisKKy8vLyBUZXN0IHRoYXQgc3RyZWFtIGNhbiBiZSBsaXN0ZW5lZCB0byBhZ2FpbiBhZnRlciBoYXZpbmcgbm8gbGlzdGVuZXIuCitGdXR1cmU8dm9pZD4gdGVzdFN0cmVhbU5vbk92ZXJsYXAoKSBhc3luYyB7CisgIHZhciBjb21wbGV0ZXIgPSBDb21wbGV0ZXI8T2JqZWN0PigpOworICBNdWx0aVN0cmVhbUNvbnRyb2xsZXI8aW50PiBjb250cm9sbGVyOworICB2YXIgc3RyZWFtID0gU3RyZWFtPGludD4ubXVsdGkoKGMpIHsKKyAgICBjb250cm9sbGVyID0gYzsKKyAgICBjLm9uQ2FuY2VsID0gKCkgeworICAgICAgY29udHJvbGxlciA9IG51bGw7CisgICAgICBpZiAoIWNvbXBsZXRlci5pc0NvbXBsZXRlZCkgY29tcGxldGVyLmNvbXBsZXRlKG51bGwpOworICAgIH07CisgIH0pOworICBmb3IgKHZhciBpIGluIFsxLCAyLCAzXSkgeworICAgIHZhciBsb2cgPSA8T2JqZWN0PltdOworICAgIHZhciBzdWJzY3JpcHRpb24gPSBzdHJlYW0ubGlzdGVuKCh2KSB7CisgICAgICBsb2cuYWRkKHYpOworICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZSh2KTsKKyAgICB9LCBvbkVycm9yOiAoZSwgcykgeworICAgICAgbG9nLmFkZChlKTsKKyAgICAgIGlmICghY29tcGxldGVyLmlzQ29tcGxldGVkKSBjb21wbGV0ZXIuY29tcGxldGUoZSk7CisgICAgfSwgb25Eb25lOiAoKSB7CisgICAgICBsb2cuYWRkKG51bGwpOworICAgICAgaWYgKCFjb21wbGV0ZXIuaXNDb21wbGV0ZWQpIGNvbXBsZXRlci5jb21wbGV0ZShudWxsKTsKKyAgICB9KTsKKyAgICBFeHBlY3QuaXNOb3ROdWxsKGNvbnRyb2xsZXIpOworICAgIGNvbnRyb2xsZXIuYWRkKDEpOworICAgIGF3YWl0IGNvbXBsZXRlci5mdXR1cmU7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWzFdLCBsb2cpOworCisgICAgY29tcGxldGVyID0gQ29tcGxldGVyKCk7CisgICAgY29udHJvbGxlci5hZGQoMik7CisgICAgYXdhaXQgY29tcGxldGVyLmZ1dHVyZTsKKyAgICBFeHBlY3QubGlzdEVxdWFscyhbMSwgMl0sIGxvZyk7CisKKyAgICBjb21wbGV0ZXIgPSBDb21wbGV0ZXIoKTsKKyAgICBpZiAoaSA9PSAyKSB7CisgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKKyAgICB9CisgICAgYXdhaXQgY29tcGxldGVyLmZ1dHVyZTsKKyAgICBFeHBlY3QubGlzdEVxdWFscyhbMSwgMiwgaWYgKGkgIT0gMikgbnVsbF0sIGxvZyk7CisgIH0KK30KKworLy8vIFRlc3QgdGhhdCB0aGUgW1N0cmVhbS5yZXBlYXRMYXRlc3RdIGV4YW1wbGUgY29kZSB3b3JrcyBhcyBkZXNjcmliZWQuCitGdXR1cmU8dm9pZD4gdGVzdFJlcGVhdExhdGVzdCgpIGFzeW5jIHsKKyAgdmFyIGMgPSBTdHJlYW1Db250cm9sbGVyPGludD4oKTsKKyAgdmFyIHJlcFN0cmVhbSA9IGMuc3RyZWFtLnJlcGVhdExhdGVzdCgpOworCisgIHZhciBmMSA9IHJlcFN0cmVhbS5maXJzdDsKKyAgYy5hZGQoMSk7CisgIHZhciB2MSA9IGF3YWl0IGYxOworICBFeHBlY3QuZXF1YWxzKDEsIHYxKTsKKworICB2YXIgZjIgPSByZXBTdHJlYW0udGFrZSgyKS50b0xpc3QoKTsKKyAgYy5hZGQoMik7CisgIHZhciBsMiA9IGF3YWl0IGYyOworICBFeHBlY3QubGlzdEVxdWFscyhbMSwgMl0sIGwyKTsKKworICB2YXIgZjMgPSByZXBTdHJlYW0udGFrZSgyKS50b0xpc3QoKTsKKyAgYy5hZGQoMyk7CisgIHZhciBsMyA9IGF3YWl0IGYzOworICBFeHBlY3QubGlzdEVxdWFscyhbMiwgM10sIGwzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYl8yL2xpYl8yLnN0YXR1cyBiL3Rlc3RzL2xpYl8yL2xpYl8yLnN0YXR1cwppbmRleCA1YTA1Yjk1Li5kMTdhNjM2IDEwMDY0NAotLS0gYS90ZXN0cy9saWJfMi9saWJfMi5zdGF0dXMKKysrIGIvdGVzdHMvbGliXzIvbGliXzIuc3RhdHVzCkBAIC0zOCw2ICszOCw5IEBACiBqcy9pbnN0YW5jZW9mX3Rlc3Q6IFNraXBCeURlc2lnbiAjIElzc3VlIDQyMDg1LiBDU1AgcG9saWN5IGRpc2FsbG93cyBpbmplY3RlZCBKUyBjb2RlCiBqcy9wYXJhbWV0ZXJzX3Rlc3Q6IFNraXBCeURlc2lnbiAjIElzc3VlIDQyMDg1LgogCitbICRjb21waWxlciAhPSBkYXJ0MmpzICYmICRjb21waWxlciAhPSBkYXJ0ZGV2ayBdCit3ZWIvKjogU2tpcEJ5RGVzaWduCisKIFsgJHJ1bnRpbWUgPT0gY2hyb21lICYmICRzeXN0ZW0gPT0gbGludXggXQogbWlycm9ycy9uYXRpdmVfY2xhc3NfdGVzdDogU2xvdywgUGFzcwogCmRpZmYgLS1naXQgYS90ZXN0cy9saWJfMi9taXJyb3JzL2luc3RhbmNlX21lbWJlcnNfd2l0aF9vdmVycmlkZV90ZXN0LmRhcnQgYi90ZXN0cy9saWJfMi9taXJyb3JzL2luc3RhbmNlX21lbWJlcnNfd2l0aF9vdmVycmlkZV90ZXN0LmRhcnQKaW5kZXggNDFkMWJjYy4uMWRjZTBjNiAxMDA2NDQKLS0tIGEvdGVzdHMvbGliXzIvbWlycm9ycy9pbnN0YW5jZV9tZW1iZXJzX3dpdGhfb3ZlcnJpZGVfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xpYl8yL21pcnJvcnMvaW5zdGFuY2VfbWVtYmVyc193aXRoX292ZXJyaWRlX3Rlc3QuZGFydApAQCAtNiwxMiArNiw5IEBACiAKIGltcG9ydCAnZGFydDptaXJyb3JzJzsKIGltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOm1ldGEvbWV0YS5kYXJ0JyBzaG93IHZpcnR1YWw7CiAKIGNsYXNzIFMgewotICBAdmlydHVhbAogICB2YXIgZmllbGQ7Ci0gIEB2aXJ0dWFsCiAgIGZpbmFsIGZpbmFsRmllbGQgPSAwOwogICBtZXRob2QoKSB7fQogICBnZXQgZ2V0dGVyIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9saWJfMi93ZWIvbWlycm9yc19zdXBwb3J0X3Rlc3QuZGFydCBiL3Rlc3RzL2xpYl8yL3dlYi9taXJyb3JzX3N1cHBvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZGMyZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saWJfMi93ZWIvbWlycm9yc19zdXBwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vICdkYXJ0Om1pcnJvcnMnIHByb3ZpZGVzIG5vIGZ1bmN0aW9uYWxpdHkgaW4gZGFydC13ZWIsIGJ1dCBjYW4gYmUgaW1wb3J0ZWQgYW5kCisvLyBhbGwgQVBJcyB0aHJvdy4KK2ltcG9ydCAnZGFydDptaXJyb3JzJzsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCittYWluKCkgeworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IGN1cnJlbnRNaXJyb3JTeXN0ZW0oKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gcmVmbGVjdChtYWluKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gcmVmbGVjdENsYXNzKE9iamVjdCkpOworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IHJlZmxlY3RUeXBlKE9iamVjdCkpOworICBFeHBlY3QudGhyb3dzPFVuc3VwcG9ydGVkRXJyb3I+KCgpID0+IE1pcnJvclN5c3RlbS5nZXROYW1lKCNjb3JlKSk7CisgIEV4cGVjdC50aHJvd3M8VW5zdXBwb3J0ZWRFcnJvcj4oKCkgPT4gTWlycm9yU3lzdGVtLmdldFN5bWJvbCgiY29yZSIpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvYnl0ZV9hcnJheV92aWV3X29wdGltaXplZF90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2J5dGVfYXJyYXlfdmlld19vcHRpbWl6ZWRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjIyZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2J5dGVfYXJyYXlfdmlld19vcHRpbWl6ZWRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGVzdCBvcHRpbWl6YXRpb24gb2YgYnl0ZSBhcnJheSB2aWV3cyBvbiBleHRlcm5hbCBkYXRhLgorCisvLyBMaWJyYXJ5IHRhZyB0byBiZSBhYmxlIHRvIHJ1biBpbiBodG1sIHRlc3QgZnJhbWV3b3JrLgorbGlicmFyeSBCeXRlQXJyYXlWaWV3T3B0aW1pemVkVGVzdDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgImRhcnQ6dHlwZWRfZGF0YSI7CisKK2xpMTYodikgPT4gdlswXTsKKworbWFpbigpIHsKKyAgdmFyIGEgPSBuZXcgVWludDhMaXN0KDIpOworICBhWzBdID0gYVsxXSA9IDB4ZmY7CisgIHZhciBiID0gbmV3IEludDE2TGlzdC52aWV3KGEuYnVmZmVyKTsKKyAgRXhwZWN0LmVxdWFscygtMSwgbGkxNihiKSk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgbGkxNihiKTsKKyAgRXhwZWN0LmVxdWFscygtMSwgbGkxNihiKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2J5dGVkYXRhX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvYnl0ZWRhdGFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGFjZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2J5dGVkYXRhX3Rlc3QuZGFydApAQCAtMCwwICsxLDMzOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIHR5cGVkIGRhdGEuCisKKy8vIExpYnJhcnkgdGFnIHRvIGJlIGFibGUgdG8gcnVuIGluIGh0bWwgdGVzdCBmcmFtZXdvcmsuCitsaWJyYXJ5IEJ5dGVEYXRhVGVzdDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK3Rlc3RHZXR0ZXJzKCkgeworICBib29sIGhvc3RfaXNfbGl0dGxlX2VuZGlhbiA9CisgICAgICAobmV3IFVpbnQ4TGlzdC52aWV3KG5ldyBVaW50MTZMaXN0LmZyb21MaXN0KFsxXSkuYnVmZmVyKSlbMF0gPT0gMTsKKworICB2YXIgbGlzdCA9IG5ldyBVaW50OExpc3QoOCk7CisgIGxpc3RbMF0gPSAweGYxOworICBsaXN0WzFdID0gMHhmMjsKKyAgbGlzdFsyXSA9IDB4ZjM7CisgIGxpc3RbM10gPSAweGY0OworICBsaXN0WzRdID0gMHhmNTsKKyAgbGlzdFs1XSA9IDB4ZjY7CisgIGxpc3RbNl0gPSAweGY3OworICBsaXN0WzddID0gMHhmODsKKyAgdmFyIGJhID0gbGlzdC5idWZmZXI7CisKKyAgQnl0ZURhdGEgYmQgPSBuZXcgQnl0ZURhdGEudmlldyhiYSk7CisgIHZhciB2YWx1ZTsKKyAgaW50IGV4cGVjdGVkX3ZhbHVlX2JlID0gLTM1OTg7CisgIGludCBleHBlY3RlZF92YWx1ZV9sZSA9IC0zMzQzOworCisgIHZhbHVlID0gYmQuZ2V0SW50MTYoMCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfdmFsdWVfYmUsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRJbnQxNigwLCBFbmRpYW4uYmlnKTsKKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF92YWx1ZV9iZSwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldEludDE2KDAsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX3ZhbHVlX2xlLCB2YWx1ZSk7CisgIHZhbHVlID0gYmQuZ2V0SW50MTYoMCwgRW5kaWFuLmhvc3QpOworICBpZiAoaG9zdF9pc19saXR0bGVfZW5kaWFuKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5saXR0bGUpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX3ZhbHVlX2xlLCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5iaWcpKTsKKyAgICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX3ZhbHVlX2JlLCB2YWx1ZSk7CisgIH0KKworICB2YWx1ZSA9IGJkLmdldFVpbnQxNigwKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgRXhwZWN0LmVxdWFscygweGYxZjIsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRVaW50MTYoMCwgRW5kaWFuLmJpZyk7CisgIEV4cGVjdC5lcXVhbHMoMHhmMWYyLCB2YWx1ZSk7CisgIHZhbHVlID0gYmQuZ2V0VWludDE2KDAsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKDB4ZjJmMSwgdmFsdWUpOworICBpZiAoaG9zdF9pc19saXR0bGVfZW5kaWFuKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5saXR0bGUpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDB4ZjJmMSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgRXhwZWN0LmVxdWFscygweGYxZjIsIHZhbHVlKTsKKyAgfQorCisgIGV4cGVjdGVkX3ZhbHVlX2JlID0gLTIzNTczNjA3NjsKKyAgZXhwZWN0ZWRfdmFsdWVfbGUgPSAtMTg1MzM5MTUxOworCisgIHZhbHVlID0gYmQuZ2V0SW50MzIoMCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfdmFsdWVfYmUsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRJbnQzMigwLCBFbmRpYW4uYmlnKTsKKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF92YWx1ZV9iZSwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldEludDMyKDAsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX3ZhbHVlX2xlLCB2YWx1ZSk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfdmFsdWVfbGUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfdmFsdWVfYmUsIHZhbHVlKTsKKyAgfQorCisgIHZhbHVlID0gYmQuZ2V0VWludDMyKDApOyAvLyBEZWZhdWx0IGlzIGJpZyBlbmRpYW4gYWNjZXNzLgorICBFeHBlY3QuZXF1YWxzKDB4ZjFmMmYzZjQsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRVaW50MzIoMCwgRW5kaWFuLmJpZyk7CisgIEV4cGVjdC5lcXVhbHMoMHhmMWYyZjNmNCwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldFVpbnQzMigwLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygweGY0ZjNmMmYxLCB2YWx1ZSk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoMHhmNGYzZjJmMSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgRXhwZWN0LmVxdWFscygweGYxZjJmM2Y0LCB2YWx1ZSk7CisgIH0KKworICBleHBlY3RlZF92YWx1ZV9iZSA9IC0xMDEyNDc4NzMyNzgwNzY3MjQwOworICBleHBlY3RlZF92YWx1ZV9sZSA9IC01MDY2NjQ4OTY4MTg4NDI4OTU7CisKKyAgdmFsdWUgPSBiZC5nZXRJbnQ2NCgwKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF92YWx1ZV9iZSwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldEludDY0KDAsIEVuZGlhbi5iaWcpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX3ZhbHVlX2JlLCB2YWx1ZSk7CisgIHZhbHVlID0gYmQuZ2V0SW50NjQoMCwgRW5kaWFuLmxpdHRsZSk7CisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfdmFsdWVfbGUsIHZhbHVlKTsKKyAgaWYgKGhvc3RfaXNfbGl0dGxlX2VuZGlhbikgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4ubGl0dGxlKSk7CisgICAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF92YWx1ZV9sZSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF92YWx1ZV9iZSwgdmFsdWUpOworICB9CisKKyAgdmFsdWUgPSBiZC5nZXRVaW50NjQoMCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIEV4cGVjdC5lcXVhbHMoMHhmMWYyZjNmNGY1ZjZmN2Y4LCB2YWx1ZSk7CisgIHZhbHVlID0gYmQuZ2V0VWludDY0KDAsIEVuZGlhbi5iaWcpOworICBFeHBlY3QuZXF1YWxzKDB4ZjFmMmYzZjRmNWY2ZjdmOCwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldFVpbnQ2NCgwLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygweGY4ZjdmNmY1ZjRmM2YyZjEsIHZhbHVlKTsKKyAgaWYgKGhvc3RfaXNfbGl0dGxlX2VuZGlhbikgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4ubGl0dGxlKSk7CisgICAgRXhwZWN0LmVxdWFscygweGY4ZjdmNmY1ZjRmM2YyZjEsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIEV4cGVjdC5lcXVhbHMoMHhmMWYyZjNmNGY1ZjZmN2Y4LCB2YWx1ZSk7CisgIH0KKworICBkb3VibGUgZXhwZWN0ZWRfYmVfdmFsdWUgPSAtMi40MDYwODkzOTU0NjczMTc4ZSszMDsKKyAgZG91YmxlIGV4cGVjdGVkX2xlX3ZhbHVlID0gLTEuNTQ2MjEwNDE3MTU3MjQyMWUrMzI7CisgIHZhbHVlID0gYmQuZ2V0RmxvYXQzMigwKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF9iZV92YWx1ZSwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldEZsb2F0MzIoMCwgRW5kaWFuLmJpZyk7CisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfYmVfdmFsdWUsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRGbG9hdDMyKDAsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX2xlX3ZhbHVlLCB2YWx1ZSk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfbGVfdmFsdWUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfYmVfdmFsdWUsIHZhbHVlKTsKKyAgfQorCisgIGV4cGVjdGVkX2JlX3ZhbHVlID0gLTcuODk4NjYxNzQwOTc2NjAyZSsyNDA7CisgIGV4cGVjdGVkX2xlX3ZhbHVlID0gLTUuMTg1NzA1OTU2NzM2MzY2ZSsyNzQ7CisgIHZhbHVlID0gYmQuZ2V0RmxvYXQ2NCgwKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgRXhwZWN0LmVxdWFscyhleHBlY3RlZF9iZV92YWx1ZSwgdmFsdWUpOworICB2YWx1ZSA9IGJkLmdldEZsb2F0NjQoMCwgRW5kaWFuLmJpZyk7CisgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfYmVfdmFsdWUsIHZhbHVlKTsKKyAgdmFsdWUgPSBiZC5nZXRGbG9hdDY0KDAsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKGV4cGVjdGVkX2xlX3ZhbHVlLCB2YWx1ZSk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfbGVfdmFsdWUsIHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIEV4cGVjdC5lcXVhbHMoZXhwZWN0ZWRfYmVfdmFsdWUsIHZhbHVlKTsKKyAgfQorfQorCit2YWxpZGF0ZTE2YmUodmFyIGxpc3QpIHsKKyAgRXhwZWN0LmVxdWFscygweGYxLCBsaXN0WzBdKTsKKyAgRXhwZWN0LmVxdWFscygweGYyLCBsaXN0WzFdKTsKK30KKwordmFsaWRhdGUxNmxlKHZhciBsaXN0KSB7CisgIEV4cGVjdC5lcXVhbHMoMHhmMiwgbGlzdFswXSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmMSwgbGlzdFsxXSk7Cit9CisKK3ZhbGlkYXRlMzJiZSh2YXIgbGlzdCkgeworICBFeHBlY3QuZXF1YWxzKDB4ZjEsIGxpc3RbMF0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjIsIGxpc3RbMV0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjMsIGxpc3RbMl0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjQsIGxpc3RbM10pOworfQorCit2YWxpZGF0ZTMybGUodmFyIGxpc3QpIHsKKyAgRXhwZWN0LmVxdWFscygweGY0LCBsaXN0WzBdKTsKKyAgRXhwZWN0LmVxdWFscygweGYzLCBsaXN0WzFdKTsKKyAgRXhwZWN0LmVxdWFscygweGYyLCBsaXN0WzJdKTsKKyAgRXhwZWN0LmVxdWFscygweGYxLCBsaXN0WzNdKTsKK30KKwordmFsaWRhdGU2NGJlKHZhciBsaXN0KSB7CisgIEV4cGVjdC5lcXVhbHMoMHhmMSwgbGlzdFswXSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmMiwgbGlzdFsxXSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmMywgbGlzdFsyXSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmNCwgbGlzdFszXSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmNSwgbGlzdFs0XSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmNiwgbGlzdFs1XSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmNywgbGlzdFs2XSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmOCwgbGlzdFs3XSk7Cit9CisKK3ZhbGlkYXRlNjRsZSh2YXIgbGlzdCkgeworICBFeHBlY3QuZXF1YWxzKDB4ZjgsIGxpc3RbMF0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjcsIGxpc3RbMV0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjYsIGxpc3RbMl0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjUsIGxpc3RbM10pOworICBFeHBlY3QuZXF1YWxzKDB4ZjQsIGxpc3RbNF0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjMsIGxpc3RbNV0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjIsIGxpc3RbNl0pOworICBFeHBlY3QuZXF1YWxzKDB4ZjEsIGxpc3RbN10pOworfQorCit0ZXN0U2V0dGVycygpIHsKKyAgYm9vbCBob3N0X2lzX2xpdHRsZV9lbmRpYW4gPQorICAgICAgKG5ldyBVaW50OExpc3QudmlldyhuZXcgVWludDE2TGlzdC5mcm9tTGlzdChbMV0pLmJ1ZmZlcikpWzBdID09IDE7CisKKyAgdmFyIGxpc3QgPSBuZXcgVWludDhMaXN0KDgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICBsaXN0W2ldID0gMDsKKyAgfQorICB2YXIgYmEgPSBsaXN0LmJ1ZmZlcjsKKyAgQnl0ZURhdGEgYmQgPSBuZXcgQnl0ZURhdGEudmlldyhiYSk7CisKKyAgYmQuc2V0SW50MTYoMCwgMHhmMWYyKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgdmFsaWRhdGUxNmJlKGxpc3QpOworICBiZC5zZXRJbnQxNigwLCAweGYxZjIsIEVuZGlhbi5iaWcpOworICB2YWxpZGF0ZTE2YmUobGlzdCk7CisgIGJkLnNldEludDE2KDAsIDB4ZjFmMiwgRW5kaWFuLmxpdHRsZSk7CisgIHZhbGlkYXRlMTZsZShsaXN0KTsKKyAgYmQuc2V0SW50MTYoMCwgMHhmMWYyLCBFbmRpYW4uaG9zdCk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIHZhbGlkYXRlMTZsZShsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIHZhbGlkYXRlMTZiZShsaXN0KTsKKyAgfQorCisgIGJkLnNldFVpbnQxNigwLCAweGYxZjIpOyAvLyBEZWZhdWx0IGlzIGJpZyBlbmRpYW4gYWNjZXNzLgorICB2YWxpZGF0ZTE2YmUobGlzdCk7CisgIGJkLnNldFVpbnQxNigwLCAweGYxZjIsIEVuZGlhbi5iaWcpOworICB2YWxpZGF0ZTE2YmUobGlzdCk7CisgIGJkLnNldFVpbnQxNigwLCAweGYxZjIsIEVuZGlhbi5saXR0bGUpOworICB2YWxpZGF0ZTE2bGUobGlzdCk7CisgIGJkLnNldFVpbnQxNigwLCAweGYxZjIsIEVuZGlhbi5ob3N0KTsKKyAgaWYgKGhvc3RfaXNfbGl0dGxlX2VuZGlhbikgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4ubGl0dGxlKSk7CisgICAgdmFsaWRhdGUxNmxlKGxpc3QpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgdmFsaWRhdGUxNmJlKGxpc3QpOworICB9CisKKyAgYmQuc2V0SW50MzIoMCwgMHhmMWYyZjNmNCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIHZhbGlkYXRlMzJiZShsaXN0KTsKKyAgYmQuc2V0SW50MzIoMCwgMHhmMWYyZjNmNCwgRW5kaWFuLmJpZyk7CisgIHZhbGlkYXRlMzJiZShsaXN0KTsKKyAgYmQuc2V0SW50MzIoMCwgMHhmMWYyZjNmNCwgRW5kaWFuLmxpdHRsZSk7CisgIHZhbGlkYXRlMzJsZShsaXN0KTsKKyAgYmQuc2V0SW50MzIoMCwgMHhmMWYyZjNmNCwgRW5kaWFuLmhvc3QpOworICBpZiAoaG9zdF9pc19saXR0bGVfZW5kaWFuKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5saXR0bGUpKTsKKyAgICB2YWxpZGF0ZTMybGUobGlzdCk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5iaWcpKTsKKyAgICB2YWxpZGF0ZTMyYmUobGlzdCk7CisgIH0KKworICBiZC5zZXRVaW50MzIoMCwgMHhmMWYyZjNmNCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIHZhbGlkYXRlMzJiZShsaXN0KTsKKyAgYmQuc2V0VWludDMyKDAsIDB4ZjFmMmYzZjQsIEVuZGlhbi5iaWcpOworICB2YWxpZGF0ZTMyYmUobGlzdCk7CisgIGJkLnNldFVpbnQzMigwLCAweGYxZjJmM2Y0LCBFbmRpYW4ubGl0dGxlKTsKKyAgdmFsaWRhdGUzMmxlKGxpc3QpOworICBiZC5zZXRVaW50MzIoMCwgMHhmMWYyZjNmNCwgRW5kaWFuLmhvc3QpOworICBpZiAoaG9zdF9pc19saXR0bGVfZW5kaWFuKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5saXR0bGUpKTsKKyAgICB2YWxpZGF0ZTMybGUobGlzdCk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5iaWcpKTsKKyAgICB2YWxpZGF0ZTMyYmUobGlzdCk7CisgIH0KKworICBiZC5zZXRJbnQ2NCgwLCAweGYxZjJmM2Y0ZjVmNmY3ZjgpOyAvLyBEZWZhdWx0IGlzIGJpZyBlbmRpYW4gYWNjZXNzLgorICB2YWxpZGF0ZTY0YmUobGlzdCk7CisgIGJkLnNldEludDY0KDAsIDB4ZjFmMmYzZjRmNWY2ZjdmOCwgRW5kaWFuLmJpZyk7CisgIHZhbGlkYXRlNjRiZShsaXN0KTsKKyAgYmQuc2V0SW50NjQoMCwgMHhmMWYyZjNmNGY1ZjZmN2Y4LCBFbmRpYW4ubGl0dGxlKTsKKyAgdmFsaWRhdGU2NGxlKGxpc3QpOworICBiZC5zZXRJbnQ2NCgwLCAweGYxZjJmM2Y0ZjVmNmY3ZjgsIEVuZGlhbi5ob3N0KTsKKyAgaWYgKGhvc3RfaXNfbGl0dGxlX2VuZGlhbikgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4ubGl0dGxlKSk7CisgICAgdmFsaWRhdGU2NGxlKGxpc3QpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgdmFsaWRhdGU2NGJlKGxpc3QpOworICB9CisKKyAgYmQuc2V0VWludDY0KDAsIDB4ZjFmMmYzZjRmNWY2ZjdmOCk7IC8vIERlZmF1bHQgaXMgYmlnIGVuZGlhbiBhY2Nlc3MuCisgIHZhbGlkYXRlNjRiZShsaXN0KTsKKyAgYmQuc2V0VWludDY0KDAsIDB4ZjFmMmYzZjRmNWY2ZjdmOCwgRW5kaWFuLmJpZyk7CisgIHZhbGlkYXRlNjRiZShsaXN0KTsKKyAgYmQuc2V0VWludDY0KDAsIDB4ZjFmMmYzZjRmNWY2ZjdmOCwgRW5kaWFuLmxpdHRsZSk7CisgIHZhbGlkYXRlNjRsZShsaXN0KTsKKyAgYmQuc2V0VWludDY0KDAsIDB4ZjFmMmYzZjRmNWY2ZjdmOCwgRW5kaWFuLmhvc3QpOworICBpZiAoaG9zdF9pc19saXR0bGVfZW5kaWFuKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5saXR0bGUpKTsKKyAgICB2YWxpZGF0ZTY0bGUobGlzdCk7CisgIH0gZWxzZSB7CisgICAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoRW5kaWFuLmhvc3QsIEVuZGlhbi5iaWcpKTsKKyAgICB2YWxpZGF0ZTY0YmUobGlzdCk7CisgIH0KKworICBiZC5zZXRGbG9hdDMyKDAsIC0yLjQwNjA4OTM5NTQ2NzMxNzhlKzMwKTsgLy8gRGVmYXVsdCBpcyBiaWcgZW5kaWFuIGFjY2Vzcy4KKyAgdmFsaWRhdGUzMmJlKGxpc3QpOworICBiZC5zZXRGbG9hdDMyKDAsIC0yLjQwNjA4OTM5NTQ2NzMxNzhlKzMwLCBFbmRpYW4uYmlnKTsKKyAgdmFsaWRhdGUzMmJlKGxpc3QpOworICBiZC5zZXRGbG9hdDMyKDAsIC0yLjQwNjA4OTM5NTQ2NzMxNzhlKzMwLCBFbmRpYW4ubGl0dGxlKTsKKyAgdmFsaWRhdGUzMmxlKGxpc3QpOworICBiZC5zZXRGbG9hdDMyKDAsIC0yLjQwNjA4OTM5NTQ2NzMxNzhlKzMwLCBFbmRpYW4uaG9zdCk7CisgIGlmIChob3N0X2lzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmxpdHRsZSkpOworICAgIHZhbGlkYXRlMzJsZShsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBFeHBlY3QuaXNUcnVlKGlkZW50aWNhbChFbmRpYW4uaG9zdCwgRW5kaWFuLmJpZykpOworICAgIHZhbGlkYXRlMzJiZShsaXN0KTsKKyAgfQorCisgIGJkLnNldEZsb2F0NjQoMCwgLTcuODk4NjYxNzQwOTc2NjAyZSsyNDApOyAvLyBEZWZhdWx0IGlzIGJpZyBlbmRpYW4gYWNjZXNzLgorICB2YWxpZGF0ZTY0YmUobGlzdCk7CisgIGJkLnNldEZsb2F0NjQoMCwgLTcuODk4NjYxNzQwOTc2NjAyZSsyNDAsIEVuZGlhbi5iaWcpOworICB2YWxpZGF0ZTY0YmUobGlzdCk7CisgIGJkLnNldEZsb2F0NjQoMCwgLTcuODk4NjYxNzQwOTc2NjAyZSsyNDAsIEVuZGlhbi5saXR0bGUpOworICB2YWxpZGF0ZTY0bGUobGlzdCk7CisgIGJkLnNldEZsb2F0NjQoMCwgLTcuODk4NjYxNzQwOTc2NjAyZSsyNDAsIEVuZGlhbi5ob3N0KTsKKyAgaWYgKGhvc3RfaXNfbGl0dGxlX2VuZGlhbikgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4ubGl0dGxlKSk7CisgICAgdmFsaWRhdGU2NGxlKGxpc3QpOworICB9IGVsc2UgeworICAgIEV4cGVjdC5pc1RydWUoaWRlbnRpY2FsKEVuZGlhbi5ob3N0LCBFbmRpYW4uYmlnKSk7CisgICAgdmFsaWRhdGU2NGJlKGxpc3QpOworICB9Cit9CisKK21haW4oKSB7CisgIHRlc3RHZXR0ZXJzKCk7CisgIHRlc3RTZXR0ZXJzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2NhdXNhbF9hc3luY19zdGFja190ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2NhdXNhbF9hc3luY19zdGFja190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0NGJlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvY2F1c2FsX2FzeW5jX3N0YWNrX3Rlc3QuZGFydApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBWTU9wdGlvbnM9LS1jYXVzYWxfYXN5bmNfc3RhY2tzIC0tbm8tbGF6eS1hc3luYy1zdGFja3MKKy8vIFZNT3B0aW9ucz0tLW5vLWNhdXNhbF9hc3luY19zdGFja3MgLS1sYXp5LWFzeW5jLXN0YWNrcworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbm9vcCgpIGFzeW5jID0+IEZ1dHVyZS52YWx1ZShudWxsKTsKKworYmF6KCkgYXN5bmMgeworICAvLyBUaHJvdyBleGNlcHRpb24gYWZ0ZXIgdGhlIGZpcnN0IGNvbnRpbnVhdGlvbiwgd2hlbiB0aGVyZSBpcyBubworICAvLyBvcmlnaW5hbCBzdGFjayB0cmFjZS4KKyAgYXdhaXQgbm9vcCgpOworICB0aHJvdyAiQmFkISI7Cit9CisKK2JhcigpIGFzeW5jIHsKKyAgYXdhaXQgYmF6KCk7Cit9CisKK2ZvbygpIGFzeW5jIHsKKyAgYXdhaXQgYmFyKCk7Cit9CisKK21haW4oKSBhc3luYyB7CisgIHRyeSB7CisgICAgYXdhaXQgZm9vKCk7CisgIH0gY2F0Y2ggKGUsIHN0KSB7CisgICAgRXhwZWN0LmlzVHJ1ZShzdC50b1N0cmluZygpLmNvbnRhaW5zKCJiYXoiKSk7CisgICAgRXhwZWN0LmlzVHJ1ZShzdC50b1N0cmluZygpLmNvbnRhaW5zKCJiYXIiKSk7CisgICAgRXhwZWN0LmlzVHJ1ZShzdC50b1N0cmluZygpLmNvbnRhaW5zKCJmb28iKSk7CisgICAgRXhwZWN0LmlzVHJ1ZShzdC50b1N0cmluZygpLmNvbnRhaW5zKCJtYWluIikpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2NoZWNrX2NsYXNzX2NoYV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2NoZWNrX2NsYXNzX2NoYV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkNjY2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvY2hlY2tfY2xhc3NfY2hhX3Rlc3QuZGFydApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBDbGFzcyBoaWVyYXJjaHkgb24gYW4gYWJzdHJhY3QgY2xhc3MKKy8vIHRoYXQgZGVmaW5lcyBhICJuZXh0IiBzdHJ1Y3R1cmUuCisKK2Fic3RyYWN0IGNsYXNzIEEgeworICBBPyBuZXh0OworfQorCitjbGFzcyBCIGV4dGVuZHMgQSB7CisgIEIoQT8gbikgeworICAgIHRoaXMubmV4dCA9IG47CisgIH0KK30KKworLy8gTWV0aG9kIHRoYXQgY291bnRzIGxlbmd0aCBvZiBsaXN0LgorLy8gV2l0aCBvbmx5IEJzLCB0aGUgZ2V0dGVyIGNhbiBiZQorLy8gaW5saW5lZCB3aXRob3V0IGNoZWNrIGNsYXNzLgoraW50IGNvdW50TWUoQT8gaSkgeworICBpbnQgeCA9IDA7CisgIHdoaWxlIChpICE9IG51bGwpIHsKKyAgICBBPyBuZXh0ID0gaS5uZXh0OworICAgIHgrKzsKKyAgICBpID0gbmV4dDsKKyAgfQorICByZXR1cm4geDsKK30KKworaW50IGRvaXRIb3QoQT8gYSkgeworICAvLyBXYXJtIHVwIHRoZSBKSVQuCisgIGludCBkID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICBkICs9IGNvdW50TWUoYSk7CisgIH0KKyAgcmV0dXJuIGQ7Cit9CisKKy8vIE5hc3R5IGNsYXNzIHRoYXQgb3ZlcnJpZGVzIHRoZSBnZXR0ZXIuCitjbGFzcyBDIGV4dGVuZHMgQSB7CisgIEMoQT8gbikgeworICAgIHRoaXMubmV4dCA9IG47CisgIH0KKyAgLy8gTmV3IG92ZXJyaWRlLgorICBBPyBnZXQgbmV4dCA9PiBudWxsOworfQorCitpbnQgYnJpbmdJbkMoQT8gYSkgeworICAvLyBJbnRyb2R1Y2UgQyB0byBjb21waWxlci4KKyAgYSA9IG5ldyBDKGEpOworICByZXR1cm4gZG9pdEhvdChhKTsKK30KKworbWFpbigpIHsKKyAgLy8gTWFrZSBhIGxpc3Qgd2l0aCBqdXN0IEJzLgorICBBPyBhID0gbnVsbDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICBhID0gbmV3IEIoYSk7CisgIH0KKworICBFeHBlY3QuZXF1YWxzKDEwMDAgKiAxMDAwLCBkb2l0SG90KGEpKTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCBicmluZ0luQyhhKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2NoZWNrX251bGxfY2hhX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvY2hlY2tfbnVsbF9jaGFfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDE3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2NoZWNrX251bGxfY2hhX3Rlc3QuZGFydApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTgsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCisvLyBBIGNsYXNzIHRoZSBoYXMgYSBnZXR0ZXIgYWxzbyBwcm92aWRlZCBieSBPYmplY3QKKy8vIChoaWdoZXIgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeSkgYW5kIHRodXMgYWxzbyB0aGUKKy8vIE51bGwgY2xhc3MgKGJlc2lkZXMgWCBpbiB0aGUgY2xhc3MgaGllcmFyY2h5KS4KK2NsYXNzIFggeworICBpbnQgaGFzaENvZGUgPSAtMTsKKyAgWCgpIHsKKyAgICBoYXNoQ29kZSA9IDE7CisgIH0KK30KKworLy8gVXNlIHRoaXMgZ2V0dGVyIG9uIFggcmVjZWl2ZXIuCitpbnQgaGFzaE1lKFg/IHgpIHsKKyAgaW50IGQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBkICs9IHguaGFzaENvZGU7CisgIH0KKyAgcmV0dXJuIGQ7Cit9CisKKy8vIFVzZSB0aGlzIGdldHRlciBvbiBOdWxsIGNsYXNzIHJlY2VpdmVyLgorLy8gT25seSBwb3NzaWJsZSB2YWx1ZSBpcyBudWxsLgoraW50IGhhc2hOdWxsKE51bGwgeCkgeworICBpbnQgZCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIGQgKz0geC5oYXNoQ29kZTsKKyAgfQorICByZXR1cm4gZDsKK30KKworbWFpbigpIHsKKyAgLy8gV2FybSB1cCB0aGUgSklUIHdpdGgganVzdCBhbiBYIG9iamVjdC4gSGF2aW5nIGEgc2luZ2xlIHJlY2VpdmVyCisgIC8vIG9mIHR5cGUgWCB3aXRoIG5vdGhpbmcgYmVsb3cgaW4gdGhlIGhpZXJhcmNoeSB0aGF0IG92ZXJyaWRlcworICAvLyBoYXNoQ29kZSBjb3VsZCB0ZW1wdCB0aGUgSklUIHRvIGlubGluZSB0aGUgZ2V0dGVyIHdpdGggQ0hBCisgIC8vIHRoYXQgZGVvcHRzIHdoZW4gWCBpcyBzdWJjbGFzc2VkIGluIHRoZSBmdXR1cmUuCisgIFggeCA9IG5ldyBYKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygxMCwgaGFzaE1lKHgpKTsKKyAgfQorCisgIC8vIEhvd2V2ZXIsIHRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBhbHNvIHdvcmtzIG9uIG51bGwKKyAgLy8gKGNhbGxpbmcgT2JqZWN0J3MgaGFzaENvZGUpLiBTbyB0aGlzIHNob3VsZCBub3QgdGhyb3cgYW4KKyAgLy8gZXhjZXB0aW9uLiBIYWQgd2UgaW5saW5lZCwgdGhpcyB3b3VsZCBoYXZlIGhpdCB0aGUgbnVsbAorICAvLyBjaGVjayBhbmQgdGhyb3duIGFuIGV4Y2VwdGlvbi4KKyAgRXhwZWN0Lm5vdEVxdWFscygwLCBoYXNoTWUobnVsbCkpOworCisgIC8vIEFsc28gd2FybSB1cCB0aGUgSklUIG9uIGEgZGlyZWN0IE51bGwgcmVjZWl2ZXIuCisgIGludCBkID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICBkICs9IGhhc2hOdWxsKG51bGwpOworICB9CisgIEV4cGVjdC5ub3RFcXVhbHMoMCwgZCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2NvbnN0YW50X2xlZnRfc2hpZnRfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9jb25zdGFudF9sZWZ0X3NoaWZ0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjg3NjUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9jb25zdGFudF9sZWZ0X3NoaWZ0X3Rlc3QuZGFydApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgbGVmdCBzaGlmdHMgb2YgYSBjb25zdGFudC4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK3NoaWZ0TGVmdDAoYykgPT4gMCA8PCBjOworc2hpZnRMZWZ0MShjKSA9PiAxIDw8IGM7CitzaGlmdExlZnQ4NDQ4KGMpID0+IDg0NDggPDwgYzsKKworc2hpZnRMZWZ0TmVnMShjKSA9PiAtMSA8PCBjOworc2hpZnRMZWZ0TmVnODQ0OChjKSA9PiAtODQ0OCA8PCBjOworCittYWluKCkgeworICAvLyBPcHRpbWl6ZSBzaGlmdHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjAwMDsgaSsrKSB7CisgICAgc2hpZnRMZWZ0MSgyKTsKKyAgICBzaGlmdExlZnQwKDIpOworICAgIHNoaWZ0TGVmdDg0NDgoMik7CisgICAgc2hpZnRMZWZ0TmVnMSgyKTsKKyAgICBzaGlmdExlZnROZWc4NDQ4KDIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgODA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMCwgc2hpZnRMZWZ0MChpKSk7CisgIH0KKyAgLy8gRXhjZXB0aW9ucy4KKyAgRXhwZWN0LnRocm93cygoKSA9PiBzaGlmdExlZnQwKC0xKSk7CisKKyAgRXhwZWN0LmVxdWFscygxLCBzaGlmdExlZnQxKDApKTsKKyAgRXhwZWN0LmVxdWFscygxMjgsIHNoaWZ0TGVmdDEoNykpOworICBFeHBlY3QuZXF1YWxzKDUzNjg3MDkxMiwgc2hpZnRMZWZ0MSgyOSkpOworICAvLyBEZW9wdGltaXplIG9uIDMyLWJpdC4KKyAgRXhwZWN0LmVxdWFscygxMDczNzQxODI0LCBzaGlmdExlZnQxKDMwKSk7CisgIEV4cGVjdC5lcXVhbHMoMjE0NzQ4MzY0OCwgc2hpZnRMZWZ0MSgzMSkpOworICBFeHBlY3QuZXF1YWxzKDExNTI5MjE1MDQ2MDY4NDY5NzYsIHNoaWZ0TGVmdDEoNjApKTsKKyAgRXhwZWN0LmVxdWFscygyMzA1ODQzMDA5MjEzNjkzOTUyLCBzaGlmdExlZnQxKDYxKSk7CisgIC8vIERlb3B0aW1pemUgb24gNjQgYml0cy4KKyAgRXhwZWN0LmVxdWFscyg0NjExNjg2MDE4NDI3Mzg3OTA0LCBzaGlmdExlZnQxKDYyKSk7CisgIEV4cGVjdC5lcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIHNoaWZ0TGVmdDEoNjMpKTsKKworICBFeHBlY3QuZXF1YWxzKDg0NDgsIHNoaWZ0TGVmdDg0NDgoMCkpOworICBFeHBlY3QuZXF1YWxzKDEwODEzNDQsIHNoaWZ0TGVmdDg0NDgoNykpOworICBFeHBlY3QuZXF1YWxzKDU1MzY0ODEyOCwgc2hpZnRMZWZ0ODQ0OCgxNikpOworICAvLyBEZW9wdGltaXplIG9uIDMyLWJpdC4KKyAgRXhwZWN0LmVxdWFscygxMTA3Mjk2MjU2LCBzaGlmdExlZnQ4NDQ4KDE3KSk7CisgIEV4cGVjdC5lcXVhbHMoMjIxNDU5MjUxMiwgc2hpZnRMZWZ0ODQ0OCgxOCkpOworICBFeHBlY3QuZXF1YWxzKDExODg5NTAzMDE2MjU4MTA5NDQsIHNoaWZ0TGVmdDg0NDgoNDcpKTsKKyAgRXhwZWN0LmVxdWFscygyMzc3OTAwNjAzMjUxNjIxODg4LCBzaGlmdExlZnQ4NDQ4KDQ4KSk7CisgIC8vIERlb3B0aW1pemUgb24gNjQgYml0cy4KKyAgRXhwZWN0LmVxdWFscyg0NzU1ODAxMjA2NTAzMjQzNzc2LCBzaGlmdExlZnQ4NDQ4KDQ5KSk7CisgIEV4cGVjdC5lcXVhbHMoLTg5MzUxNDE2NjA3MDMwNjQwNjQsIHNoaWZ0TGVmdDg0NDgoNTApKTsKKworICBFeHBlY3QuZXF1YWxzKC0xLCBzaGlmdExlZnROZWcxKDApKTsKKyAgRXhwZWN0LmVxdWFscygtMTI4LCBzaGlmdExlZnROZWcxKDcpKTsKKyAgRXhwZWN0LmVxdWFscygtNTM2ODcwOTEyLCBzaGlmdExlZnROZWcxKDI5KSk7CisgIC8vIERlb3B0aW1pemUgb24gMzItYml0LgorICBFeHBlY3QuZXF1YWxzKC0xMDczNzQxODI0LCBzaGlmdExlZnROZWcxKDMwKSk7CisgIEV4cGVjdC5lcXVhbHMoLTIxNDc0ODM2NDgsIHNoaWZ0TGVmdE5lZzEoMzEpKTsKKyAgRXhwZWN0LmVxdWFscygtMTE1MjkyMTUwNDYwNjg0Njk3Niwgc2hpZnRMZWZ0TmVnMSg2MCkpOworICBFeHBlY3QuZXF1YWxzKC0yMzA1ODQzMDA5MjEzNjkzOTUyLCBzaGlmdExlZnROZWcxKDYxKSk7CisgIC8vIERlb3B0aW1pemUgb24gNjQgYml0cy4KKyAgRXhwZWN0LmVxdWFscygtNDYxMTY4NjAxODQyNzM4NzkwNCwgc2hpZnRMZWZ0TmVnMSg2MikpOworICBFeHBlY3QuZXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA4LCBzaGlmdExlZnROZWcxKDYzKSk7CisKKyAgRXhwZWN0LmVxdWFscygtODQ0OCwgc2hpZnRMZWZ0TmVnODQ0OCgwKSk7CisgIEV4cGVjdC5lcXVhbHMoLTEwODEzNDQsIHNoaWZ0TGVmdE5lZzg0NDgoNykpOworICBFeHBlY3QuZXF1YWxzKC01NTM2NDgxMjgsIHNoaWZ0TGVmdE5lZzg0NDgoMTYpKTsKKyAgLy8gRGVvcHRpbWl6ZSBvbiAzMi1iaXQuCisgIEV4cGVjdC5lcXVhbHMoLTExMDcyOTYyNTYsIHNoaWZ0TGVmdE5lZzg0NDgoMTcpKTsKKyAgRXhwZWN0LmVxdWFscygtMjIxNDU5MjUxMiwgc2hpZnRMZWZ0TmVnODQ0OCgxOCkpOworICBFeHBlY3QuZXF1YWxzKC0xMTg4OTUwMzAxNjI1ODEwOTQ0LCBzaGlmdExlZnROZWc4NDQ4KDQ3KSk7CisgIEV4cGVjdC5lcXVhbHMoLTIzNzc5MDA2MDMyNTE2MjE4ODgsIHNoaWZ0TGVmdE5lZzg0NDgoNDgpKTsKKyAgLy8gRGVvcHRpbWl6ZSBvbiA2NCBiaXRzLgorICBFeHBlY3QuZXF1YWxzKC00NzU1ODAxMjA2NTAzMjQzNzc2LCBzaGlmdExlZnROZWc4NDQ4KDQ5KSk7CisgIEV4cGVjdC5lcXVhbHMoODkzNTE0MTY2MDcwMzA2NDA2NCwgc2hpZnRMZWZ0TmVnODQ0OCg1MCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kYXJ0X2RldmVsb3Blcl9kaXNhYmxlZF9lbnZfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kYXJ0X2RldmVsb3Blcl9kaXNhYmxlZF9lbnZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTY1M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2RhcnRfZGV2ZWxvcGVyX2Rpc2FibGVkX2Vudl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVk1PcHRpb25zPS0tbm9fY2F1c2FsX2FzeW5jX3N0YWNrcworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgRXhwZWN0LmlzRmFsc2UoCisgICAgICBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgnZGFydC5kZXZlbG9wZXIuY2F1c2FsX2FzeW5jX3N0YWNrcycpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvZGFydF9kZXZlbG9wZXJfZW52Ml90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2RhcnRfZGV2ZWxvcGVyX2VudjJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTg4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2RhcnRfZGV2ZWxvcGVyX2VudjJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFZNT3B0aW9ucz0tLWxhenktYXN5bmMtc3RhY2tzIC0tbm8tY2F1c2FsLWFzeW5jLXN0YWNrcworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgRXhwZWN0LmlzRmFsc2UoCisgICAgICBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgnZGFydC5kZXZlbG9wZXIuY2F1c2FsX2FzeW5jX3N0YWNrcycpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvZGFydF9kZXZlbG9wZXJfZW52X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvZGFydF9kZXZlbG9wZXJfZW52X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI3YmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kYXJ0X2RldmVsb3Blcl9lbnZfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFZNT3B0aW9ucz0tLW5vLWxhenktYXN5bmMtc3RhY2tzIC0tY2F1c2FsLWFzeW5jLXN0YWNrcworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgRXhwZWN0CisgICAgICAuaXNUcnVlKGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCdkYXJ0LmRldmVsb3Blci5jYXVzYWxfYXN5bmNfc3RhY2tzJykpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC9hbHBoYS5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC9hbHBoYS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYWFjODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2RlZmVycmVkL2FscGhhLmRhcnQKQEAgLTAsMCArMSwyIEBACisvLyBiZXRhLmRhcnQgZG9lcyBub3QgZXhpc3QhCitpbXBvcnQgJ2JldGEuZGFydCc7CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2RlZmVycmVkL2V4aXN0cy5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC9leGlzdHMuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNjMTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC9leGlzdHMuZGFydApAQCAtMCwwICsxIEBACit2YXIgeCA9IDk5OwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC90cmFuc2l0aXZlX2Vycm9yLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2RlZmVycmVkL3RyYW5zaXRpdmVfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE5YWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZC90cmFuc2l0aXZlX2Vycm9yLmRhcnQKQEAgLTAsMCArMSBAQAoraW1wb3J0ICdhbHBoYS5kYXJ0JzsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvZGVmZXJyZWRfdHJhbnNpdGl2ZV9pbXBvcnRfZXJyb3JfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kZWZlcnJlZF90cmFuc2l0aXZlX2ltcG9ydF9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1YzljZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvZGVmZXJyZWRfdHJhbnNpdGl2ZV9pbXBvcnRfZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisvLyBBIGRlZmVycmVkIGxpYnJhcnkgdGhhdCBkb2Vzbid0IGV4aXN0LgoraW1wb3J0ICdwYWNrYWdlOmZvby9mb28uZGFydCcgZGVmZXJyZWQgYXMgZm9vOworLy8gQSBkZWZlcnJlZCBsaWJyYXJ5IHRoYXQgZG9lcyBleGlzdC4KK2ltcG9ydCAnZGVmZXJyZWQvZXhpc3RzLmRhcnQnIGRlZmVycmVkIGFzIGV4aXN0czsKKy8vIEEgZGVmZXJyZWQgbGlicmFyeSB0aGF0IHRyYW5zaXRpdmVseSB3aWxsIGZhaWwgZHVlIHRvIGEgZmlsZSBub3QgZm91bmQuCitpbXBvcnQgJ2RlZmVycmVkL3RyYW5zaXRpdmVfZXJyb3IuZGFydCcgZGVmZXJyZWQgYXMgdGU7CisKK21haW4oKSBhc3luYyB7CisgIC8vIEF0dGVtcHQgdG8gbG9hZCBmb28gd2hpY2ggd2lsbCBmYWlsLgorICB2YXIgZm9vRXJyb3I7CisgIGF3YWl0IGZvby5sb2FkTGlicmFyeSgpLmNhdGNoRXJyb3IoKGUpIHsKKyAgICBmb29FcnJvciA9IGU7CisgIH0pOworICBFeHBlY3QuaXNOb3ROdWxsKGZvb0Vycm9yKTsKKyAgYXdhaXQgZXhpc3RzLmxvYWRMaWJyYXJ5KCk7CisgIEV4cGVjdC5lcXVhbHMoOTksIGV4aXN0cy54KTsKKyAgLyogVE9ETyhqb2hubWNjdXRjaGFuKTogSW1wbGVtZW50IHRyYW5zaXRpdmUgZXJyb3IgcmVwb3J0aW5nLgorICB2YXIgdGVFcnJvcjsKKyAgYXdhaXQgdGUubG9hZExpYnJhcnkoKS5jYXRjaEVycm9yKChlKSB7CisgICAgdGVFcnJvciA9IGU7CisgIH0pOworICBFeHBlY3QuaXNOb3ROdWxsKHRlRXJyb3IpOworICAqLworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kZW55X2xpc3RlZF90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2RlbnlfbGlzdGVkX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE2YjIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kZW55X2xpc3RlZF90ZXN0LmRhcnQKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCB0ZXN0IGNoZWNraW5nIHRoYXQgc3RhdGljL2luc3RhbmNlIGZpZWxkIHNoYWRvd2luZyBkbyBub3QgY29uZmxpY3QuCisKKy8vIFRlc3QgdGhhdCBjZXJ0YWluIGludGVyZmFjZXMvY2xhc3NlcyBhcmUgZGVueWxpc3RlZCBmcm9tIGJlaW5nCisvLyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCAoVk0gY29yZWxpYiBvbmx5KS4KKworbGlicmFyeSBCbGFja0xpc3RlZFRlc3Q7CisKK2NsYXNzIE15Qm9vbCBleHRlbmRzIEJvb2wge30gLy8gLy8jIDAxOiBjb21waWxlLXRpbWUgZXJyb3IKKworY2xhc3MgTXlEb3VibGUgZXh0ZW5kcyBEb3VibGUge30gLy8gLy8jIDAyOiBjb21waWxlLXRpbWUgZXJyb3IKKworY2xhc3MgTXlPYmplY3RBcnJheSBleHRlbmRzIE9iamVjdEFycmF5IHt9IC8vIC8vIyAwMzogY29tcGlsZS10aW1lIGVycm9yCisKK2NsYXNzIE15SW1tdXRhYmxlQXJyYXkgZXh0ZW5kcyBJbW11dGFibGVBcnJheSB7fSAvLyAvLyMgMDQ6IGNvbXBpbGUtdGltZSBlcnJvcgorCitjbGFzcyBNeUdyb3dhYmxlT2JqZWN0QXJyYXkgZXh0ZW5kcyBHcm93YWJsZU9iamVjdEFycmF5IHt9IC8vIC8vIyAwNTogY29tcGlsZS10aW1lIGVycm9yCisKK2NsYXNzIE15SW50ZWdlckltcGxlbWVudGF0aW9uIGV4dGVuZHMgSW50ZWdlckltcGxlbWVudGF0aW9uIHt9IC8vIC8vIyAwNjogY29tcGlsZS10aW1lIGVycm9yCisKK2NsYXNzIE15U21pIGV4dGVuZHMgU21pIHt9IC8vIC8vIyAwNzogY29tcGlsZS10aW1lIGVycm9yCisKK2NsYXNzIE15TWludCBleHRlbmRzIE1pbnQge30gLy8gLy8jIDA4OiBjb21waWxlLXRpbWUgZXJyb3IKKworY2xhc3MgTXlCaWdpbnQgZXh0ZW5kcyBCaWdpbnQge30gLy8gLy8jIDA5OiBjb21waWxlLXRpbWUgZXJyb3IKKworY2xhc3MgTXlPbmVCeXRlU3RyaW5nIGV4dGVuZHMgT25lQnl0ZVN0cmluZyB7fSAvLyAvLyMgMTA6IGNvbXBpbGUtdGltZSBlcnJvcgorCitjbGFzcyBNeVR3b0J5dGVTdHJpbmcgZXh0ZW5kcyBUd29CeXRlU3RyaW5nIHt9IC8vIC8vIyAxMTogY29tcGlsZS10aW1lIGVycm9yCisKK2NsYXNzIE15Rm91ckJ5dGVTdHJpbmcgZXh0ZW5kcyBGb3VyQnl0ZVN0cmluZyB7fSAvLyAvLyMgMTI6IGNvbXBpbGUtdGltZSBlcnJvcgorCittYWluKCkgeworICBuZXcgTXlCb29sKCk7IC8vIyAwMTogY29udGludWVkCisKKyAgbmV3IE15RG91YmxlKCk7IC8vIyAwMjogY29udGludWVkCisKKyAgbmV3IE15T2JqZWN0QXJyYXkoKTsgLy8jIDAzOiBjb250aW51ZWQKKworICBuZXcgTXlJbW11dGFibGVBcnJheSgpOyAvLyMgMDQ6IGNvbnRpbnVlZAorCisgIG5ldyBNeUdyb3dhYmxlT2JqZWN0QXJyYXkoKTsgLy8jIDA1OiBjb250aW51ZWQKKworICBuZXcgTXlJbnRlZ2VySW1wbGVtZW50YXRpb24oKTsgLy8jIDA2OiBjb250aW51ZWQKKworICBuZXcgTXlTbWkoKTsgLy8jIDA3OiBjb250aW51ZWQKKworICBuZXcgTXlNaW50KCk7IC8vIyAwODogY29udGludWVkCisKKyAgbmV3IE15QmlnaW50KCk7IC8vIyAwOTogY29udGludWVkCisKKyAgbmV3IE15T25lQnl0ZVN0cmluZygpOyAvLyMgMTA6IGNvbnRpbnVlZAorCisgIG5ldyBNeVR3b0J5dGVTdHJpbmcoKTsgLy8jIDExOiBjb250aW51ZWQKKworICBuZXcgTXlGb3VyQnl0ZVN0cmluZygpOyAvLyMgMTI6IGNvbnRpbnVlZAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kZW9wdGltaXphdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2Rlb3B0aW1pemF0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBmNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kZW9wdGltaXphdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMTUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3QgZGVvcHRpbWl6YXRpb24uCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBTbWlDb21wYXJlcyB7CisgIC8vIFRlc3QgZGVvcHRpbWl6YXRpb24gd2hlbiBvbmUgYXJndW1lbnQgaXMga25vd24gdG8gYmUgU21pLgorICBzdGF0aWMgYm9vbCBzbWlDb21wYXJlTGVzc1RoYW4yKGEpIHsKKyAgICByZXR1cm4gYSA8IDI7CisgIH0KKworICAvLyBUZXN0IGRlb3B0aW1pemF0aW9uIHdoZW4gb25lIGFyZ3VtZW50IGlzIGtub3duIHRvIGJlIFNtaS4KKyAgc3RhdGljIGJvb2wgc21pQ29tcGFyZUdyZWF0ZXJUaGFuMihhKSB7CisgICAgcmV0dXJuIDIgPCBhOworICB9CisKKyAgLy8gVGVzdCBkZW9wdGltaXphdGlvbiB3aGVuIGJvdGggYXJndW1lbnRzIHVua25vd24uCisgIHN0YXRpYyBib29sIHNtaUNvbXBhcmVMZXNzVGhhbihhLCBiKSB7CisgICAgcmV0dXJuIGEgPCBiOworICB9CisKKyAgLy8gVGVzdCBkZW9wdGltaXphdGlvbiB3aGVuIGJvdGggYXJndW1lbnRzIHVua25vd24uCisgIHN0YXRpYyBib29sIHNtaUNvbXBhcmVHcmVhdGVyVGhhbihhLCBiKSB7CisgICAgcmV0dXJuIGEgPiBiOworICB9CisKKyAgc3RhdGljIHNtaUNvbXBhcmVzVGVzdCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgeworICAgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBzbWlDb21wYXJlTGVzc1RoYW4yKDEpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoZmFsc2UsIHNtaUNvbXBhcmVMZXNzVGhhbjIoMykpOworICAgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgc21pQ29tcGFyZUdyZWF0ZXJUaGFuMigxKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKHRydWUsIHNtaUNvbXBhcmVHcmVhdGVyVGhhbjIoMykpOworICAgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBzbWlDb21wYXJlTGVzc1RoYW4oMSwgMikpOworICAgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgc21pQ29tcGFyZUdyZWF0ZXJUaGFuKDEsIDIpKTsKKyAgICB9CisgICAgLy8gRGVvcHRpbWl6ZSBieSBwYXNzaW5nIGEgZG91YmxlIGluc3RlYWQgb2YgU21pCisgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBzbWlDb21wYXJlTGVzc1RoYW4yKDEuMCkpOworICAgIEV4cGVjdC5lcXVhbHMoZmFsc2UsIHNtaUNvbXBhcmVHcmVhdGVyVGhhbjIoMS4wKSk7CisgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBzbWlDb21wYXJlTGVzc1RoYW4oMS4wLCAyKSk7CisgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgc21pQ29tcGFyZUdyZWF0ZXJUaGFuKDEsIDIuMCkpOworICB9Cit9CisKK2NsYXNzIFNtaUJpbm9wIHsKKyAgc3RhdGljIHN1YldpdGhMaXRlcmFsKGEpIHsKKyAgICByZXR1cm4gYSAtIDE7CisgIH0KKworICBzdGF0aWMgdm9pZCBzbWlCaW5vcFRlc3QoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMiwgc3ViV2l0aExpdGVyYWwoMykpOworICAgIH0KKyAgICAvLyBEZW9wdGltaXplLgorICAgIEV4cGVjdC5lcXVhbHMoMi4wLCBzdWJXaXRoTGl0ZXJhbCgzLjApKTsKKyAgfQorCisgIHN0YXRpYyBtdWwoeCkgeworICAgIHJldHVybiB4ICogMTAyNDsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNtaUJpbm9wT3ZlcmZsb3dUZXN0KCkgeworICAgIGZpbmFsIGludCBiaWcgPSA1MzY4NzA5MTI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMTAyNCwgbXVsKDEpKTsKKyAgICB9CisgICAgLy8gRGVvcHRpbWl6ZSBieSBvdmVyZmxvdy4KKyAgICBFeHBlY3QuZXF1YWxzKDEwMjQgKiBiaWcsIG11bChiaWcpKTsKKyAgfQorfQorCitjbGFzcyBPYmplY3RzRXF1YWxpdHkgeworICBzdGF0aWMgYm9vbCBjb21wYXJlRXF1YWwoYSwgYikgeworICAgIHJldHVybiBhID09IGI7CisgIH0KKworICBzdGF0aWMgYm9vbCBjb21wYXJlTm90RXF1YWwoYSwgYikgeworICAgIHJldHVybiBhICE9IGI7CisgIH0KKworICAvLyBVc2Ugb25seSBPYmplY3QuPT0uCisgIHN0YXRpYyB2b2lkIG9iamVjdHNFcXVhbGl0eVRlc3QoKSB7CisgICAgdmFyIGEgPSBuZXcgT2JqZWN0c0VxdWFsaXR5KCk7CisgICAgdmFyIGIgPSBuZXcgT2JqZWN0c0VxdWFsaXR5KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgY29tcGFyZUVxdWFsKGEsIGEpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgY29tcGFyZUVxdWFsKG51bGwsIG51bGwpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoZmFsc2UsIGNvbXBhcmVFcXVhbChudWxsLCBhKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKGZhbHNlLCBjb21wYXJlRXF1YWwoYSwgbnVsbCkpOworICAgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBjb21wYXJlRXF1YWwoYiwgYikpOworICAgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgY29tcGFyZUVxdWFsKGEsIGIpKTsKKworICAgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgY29tcGFyZU5vdEVxdWFsKGEsIGEpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoZmFsc2UsIGNvbXBhcmVOb3RFcXVhbChudWxsLCBudWxsKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKHRydWUsIGNvbXBhcmVOb3RFcXVhbChudWxsLCBhKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKHRydWUsIGNvbXBhcmVOb3RFcXVhbChhLCBudWxsKSk7CisgICAgICBFeHBlY3QuZXF1YWxzKGZhbHNlLCBjb21wYXJlTm90RXF1YWwoYiwgYikpOworICAgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBjb21wYXJlTm90RXF1YWwoYSwgYikpOworICAgIH0KKyAgICB2YXIgYyA9IG5ldyBTbWlCaW5vcCgpOworICAgIC8vIERlb3B0aW1pemUuCisgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBjb21wYXJlRXF1YWwoYywgYykpOworICAgIEV4cGVjdC5lcXVhbHMoZmFsc2UsIGNvbXBhcmVFcXVhbChjLCBudWxsKSk7CisgICAgRXhwZWN0LmVxdWFscyhmYWxzZSwgY29tcGFyZU5vdEVxdWFsKGMsIGMpKTsKKyAgICBFeHBlY3QuZXF1YWxzKHRydWUsIGNvbXBhcmVOb3RFcXVhbChjLCBudWxsKSk7CisgIH0KK30KKworY2xhc3MgRGVvcHRpbWl6YXRpb25UZXN0IHsKKyAgc3RhdGljIGZvbyhhLCBiKSB7CisgICAgcmV0dXJuIGEgLSBiOworICB9CisKKyAgc3RhdGljIHRlc3QxKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKDIsIGZvbygzLCAxKSk7IC8vIDwtLSBPcHRpbWl6ZXMgJ2ZvbycsCisgICAgfQorICAgIEV4cGVjdC5lcXVhbHMoMi4yLCBmb28oMS4yLCAtMS4wKSk7IC8vIDwtLSBEZW9wdGltaXplcyAnZm9vJy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMiwgZm9vKDMsIDEpKTsgLy8gPC0tIE9wdGltaXplcyAnZm9vJy4KKyAgICB9CisgICAgRXhwZWN0LmVxdWFscygyLjIsIGZvbygxLjIsIC0xKSk7IC8vIDwtLSBEZW9wdGltaXplcyAnZm9vJy4KKyAgfQorCisgIHN0YXRpYyBtb28obikgeworICAgIHJldHVybiArK247CisgIH0KKworICBzdGF0aWMgdGVzdDIoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoNCwgbW9vKDMpKTsgLy8gPC0tIE9wdGltaXplcyAnbW9vJywKKyAgICB9CisgICAgRXhwZWN0LmVxdWFscygyLjIsIG1vbygxLjIpKTsgLy8gPC0tIERlb3B0aW1pemVzICdtb28nLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworICAgICAgRXhwZWN0LmVxdWFscyg0LCBtb28oMykpOyAvLyA8LS0gT3B0aW1pemVzICdtb28nLgorICAgIH0KKyAgICBFeHBlY3QuZXF1YWxzKDIuMiwgbW9vKDEuMikpOyAvLyA8LS0gRGVvcHRpbWl6ZXMgJ21vbycuCisgIH0KKworICBzdGF0aWMgdGVzdDMoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMi4wLCBmb28oMy4wLCAxLjApKTsgLy8gPC0tIE9wdGltaXplcyAnZm9vJywKKyAgICB9CisgICAgRXhwZWN0LmVxdWFscygyLCBmb28oMSwgLTEpKTsgLy8gPC0tIERlb3B0aW1pemVzICdmb28nLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKDIuMCwgZm9vKDMuMCwgMS4wKSk7IC8vIDwtLSBPcHRpbWl6ZXMgJ2ZvbycsCisgICAgfQorICAgIEV4cGVjdC5lcXVhbHMoMi4yLCBtb28oMS4yKSk7IC8vIDwtLSBEZW9wdGltaXplcyAnbW9vJy4KKyAgfQorCisgIHN0YXRpYyBib29sIGNvbXBhcmVJbnQoYSwgYikgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNvbXBhcmVEb3VibGUoYSwgYikgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorCisgIHN0YXRpYyB0ZXN0NCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgeworICAgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBjb21wYXJlSW50KDEsIDIpKTsKKyAgICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgY29tcGFyZURvdWJsZSgxLjAsIDIuMCkpOworICAgIH0KKyAgICAvLyBUcmlnZ2VyIGRlb3B0aW1pemF0aW9uIGluIGNvbXBhcmVJbnQgYW5kIGNvbXBhcmVEb3VibGUuCisgICAgRXhwZWN0LmVxdWFscyh0cnVlLCBjb21wYXJlSW50KDEsIDIuMCkpOworICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgY29tcGFyZURvdWJsZSgxLjAsIDIpKTsKKyAgfQorCisgIHN0YXRpYyBzbWlSaWdodFNoaWZ0KCkgeworICAgIGludCBTaGlmdFJpZ2h0KGludCBhLCBpbnQgYikgeworICAgICAgcmV0dXJuIGEgPj4gYjsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgeworICAgICAgdmFyIHIgPSBTaGlmdFJpZ2h0KDEwLCAyKTsKKyAgICAgIEV4cGVjdC5lcXVhbHMoMiwgcik7CisgICAgfQorICAgIC8vIFNoaWZ0UmlnaHQgaXMgb3B0aW1pemVkLgorICAgIEV4cGVjdC5lcXVhbHMoMCwgU2hpZnRSaWdodCgxMCwgNjQpKTsKKyAgICAvLyBEZW9wdGltaXplIFNoaWZ0UmlnaHQgYmVjYXVzZSAnYScgaXMgYSBNaW50LgorICAgIHZhciBtaW50ID0gMSA8PCA2MzsKKyAgICBFeHBlY3QuZXF1YWxzKC0xIDw8IDMsIFNoaWZ0UmlnaHQobWludCwgNjApKTsKKyAgfQorCisgIHN0YXRpYyBkb3VibGVVbmFyeSgpIHsKKyAgICBudW0gdW5hcnkobnVtIGEpIHsKKyAgICAgIHJldHVybiAtYTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwMDA7IGkrKykgeworICAgICAgdmFyIHIgPSB1bmFyeSgyLjApOworICAgICAgRXhwZWN0LmVxdWFscygtMi4wLCByKTsKKyAgICB9CisgICAgdmFyIHIgPSB1bmFyeSg1KTsKKyAgICBFeHBlY3QuZXF1YWxzKC01LCByKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHRlc3RNYWluKCkgeworICAgIHRlc3QxKCk7CisgICAgdGVzdDIoKTsKKyAgICB0ZXN0MygpOworICAgIHRlc3Q0KCk7CisgICAgU21pQ29tcGFyZXMuc21pQ29tcGFyZXNUZXN0KCk7CisgICAgU21pQmlub3Auc21pQmlub3BUZXN0KCk7CisgICAgU21pQmlub3Auc21pQmlub3BPdmVyZmxvd1Rlc3QoKTsKKyAgICBPYmplY3RzRXF1YWxpdHkub2JqZWN0c0VxdWFsaXR5VGVzdCgpOworICAgIHNtaVJpZ2h0U2hpZnQoKTsKKyAgICBkb3VibGVVbmFyeSgpOworICB9Cit9CisKK21haW4oKSB7CisgIERlb3B0aW1pemF0aW9uVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfaGFzaF9kaXN0cmlidXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfaGFzaF9kaXN0cmlidXRpb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjZlMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2RvdWJsZV9oYXNoX2Rpc3RyaWJ1dGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUZXN0IHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBoYXNoIGNvZGVzIGZvciBkb3VibGVzIGlzIHJlYXNvbmFibGUuCisKKy8vIFZNT3B0aW9ucz0tLWludHJpbnNpZnkKKy8vIFZNT3B0aW9ucz0tLW5vX2ludHJpbnNpZnkKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK21haW4oKSB7CisgIEV4cGVjdC5pc1RydWUocmF0aW8oMCwgMSkgPj0gMC45NSk7CisgIEV4cGVjdC5pc1RydWUocmF0aW8oMCwgMTAwKSA+PSAwLjk1KTsKKyAgRXhwZWN0LmlzVHJ1ZShyYXRpbygwLCAweGZmZmZmZikgPj0gMC45NSk7CisgIEV4cGVjdC5pc1RydWUocmF0aW8oMHhmZmZmZmYpID49IDAuOTUpOworICBFeHBlY3QuaXNUcnVlKHJhdGlvKDB4ZmZmZmZmZmYpID49IDAuOTUpOworICBFeHBlY3QuaXNUcnVlKHJhdGlvKDB4ZmZmZmZmZmZmZmZmZmYpID49IDAuOTUpOworCisgIEV4cGVjdC5pc1RydWUocmF0aW8oMCwgLTEpID49IDAuOTUpOworICBFeHBlY3QuaXNUcnVlKHJhdGlvKDAsIC0xMDApID49IDAuOTUpOworICBFeHBlY3QuaXNUcnVlKHJhdGlvKDAsIC0weGZmZmZmZikgPj0gMC45NSk7CisgIEV4cGVjdC5pc1RydWUocmF0aW8oLTB4ZmZmZmZmKSA+PSAwLjk1KTsKKyAgRXhwZWN0LmlzVHJ1ZShyYXRpbygtMHhmZmZmZmZmZikgPj0gMC45NSk7CisgIEV4cGVjdC5pc1RydWUocmF0aW8oLTB4ZmZmZmZmZmZmZmZmZmYpID49IDAuOTUpOworfQorCitkb3VibGUgcmF0aW8obnVtIHN0YXJ0LCBbbnVtPyBlbmRdKSB7CisgIGZpbmFsIG4gPSAxMDAwOworICBlbmQgPz89IChzdGFydCArIDEpICogMjsKKworICAvLyBDb2xsZWN0IHRoZSBzZXQgb2YgZGlzdGluY3QgZG91YmxlcyBhbmQgdGhlCisgIC8vIHNldCBvZiBkaXN0aW5jdCBoYXNoIGNvZGVzLgorICBmaW5hbCBkb3VibGVzID0gbmV3IFNldDxkb3VibGU+KCk7CisgIGZpbmFsIGNvZGVzID0gbmV3IFNldDxpbnQ+KCk7CisKKyAgZmluYWwgc3RlcCA9IChlbmQudG9Eb3VibGUoKSAtIHN0YXJ0LnRvRG91YmxlKCkpIC8gbjsKKyAgdmFyIGN1cnJlbnQgPSBzdGFydC50b0RvdWJsZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgIGRvdWJsZXMuYWRkKGN1cnJlbnQpOworICAgIGNvZGVzLmFkZChjdXJyZW50Lmhhc2hDb2RlKTsKKyAgICBjdXJyZW50ICs9IHN0ZXA7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIHJhdGlvIGJldHdlZW4gZGlzdGluY3QgZG91YmxlcyBhbmQKKyAgLy8gZGlzdGluY3QgaGFzaCBjb2Rlcy4KKyAgcmV0dXJuIGNvZGVzLmxlbmd0aCAvIGRvdWJsZXMubGVuZ3RoOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfc21pX2NvbXBhcmlzb25fdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfc21pX2NvbXBhcmlzb25fdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2RvdWJsZV9zbWlfY29tcGFyaXNvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCBjb3JyZWN0IGNvbXBhcmlzb24gKGVxdWFsaXR5IGFuZCByZWxhdGlvbmFsKSB3aGVuIG1peGluZyBkb3VibGUgYW5kCisvLyBTbWkgYXJndW1lbnRzLiBXZSBjb252ZXJ0IFNtaSB0byBkb3VibGVzIGFuZCB0byB0aGUgb3BlcmF0aW9uLiBUaGlzIGlzCisvLyBub3QgY29ycmVjdCBpbiA2NC1iaXQgbW9kZSB3aGVyZSBub3QgZXZlcnkgU21pIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQorLy8gZG91YmxlIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24uCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1uby11c2Utb3NyIC0tbm8tYmFja2dyb3VuZC1jb21waWxhdGlvbgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworZXF1YWxpdHlGdW5jKGEsIGIpID0+IGEgPT0gYjsKKworbGVzc1RoYW5GdW5jKGEsIGIpID0+IGEgPCBiOworCittYWluKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBFeHBlY3QuaXNGYWxzZShlcXVhbGl0eUZ1bmMoMS4wLCA0KSk7CisgICAgRXhwZWN0LmlzVHJ1ZShsZXNzVGhhbkZ1bmMoMS4wLCA0KSk7CisgIH0KKyAgRXhwZWN0LmlzRmFsc2UoZXF1YWxpdHlGdW5jKDM0NTkwNDU5ODg3OTcyNTE3NzYsIDM0NTkwNDU5ODg3OTcyNTE3NzcpKTsKKyAgRXhwZWN0LmlzVHJ1ZShsZXNzVGhhbkZ1bmMoMzQ1OTA0NTk4ODc5NzI1MTc3NiwgMzQ1OTA0NTk4ODc5NzI1MTc3NykpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfdGVtcF90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2RvdWJsZV90ZW1wX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU1ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfdGVtcF90ZXN0LmRhcnQKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCBjb3JyZWN0IHVzYWdlIG9mIGlubGluZWQgZG91YmxlIHRlbXBvcmFyeSBvYmplY3RzLgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICB0ZXN0QmluYXJ5T3AoKTsKKyAgICB0ZXN0VW5hcnlPcCgpOworICB9Cit9CisKKy8vIFZNOiB0ZW1wb3JhcnkgZG91YmxlIHNob3VsZCBub3QgYmUgdXNlZCBhcyByZXN1bHQgb2YgZGl2aXNpb24sCisvLyBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIG9iamVjdC4KK2RvdWJsZSBkaXZpZGUoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisgIHJldHVybiBhIC8gYjsKK30KKwordGVzdEJpbmFyeU9wKCkgeworICB2YXIgeCA9IGRpdmlkZSgxLjAsIDIuMCk7CisgIHZhciB5ID0gZGl2aWRlKDIuMCwgMy4wKTsKKyAgRXhwZWN0Lm5vdEVxdWFscyh4LCB5KTsKK30KKworLy8gVk06IHRlbXBvcmFyeSBkb3VibGUgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgIi1iIiwgb3RoZXJ3aXNlIHRoZQorLy8gZnVuY3Rpb24gd291bGQgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBvYmplY3QuCitkb3VibGUgdW5hcnkoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisgIHJldHVybiAtKGEgKiAoLWIpKTsKK30KKwordGVzdFVuYXJ5T3AoKSB7CisgIHZhciB4ID0gdW5hcnkoMS4wLCAyLjApOworICB2YXIgeSA9IHVuYXJ5KDMuMCwgNC4wKTsKKyAgRXhwZWN0LmVxdWFscygyLjAsIHgpOworICBFeHBlY3QuZXF1YWxzKDEyLjAsIHkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9kb3VibGVfdG9faW50X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvZG91YmxlX3RvX2ludF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMDdhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvZG91YmxlX3RvX2ludF90ZXN0LmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIFRlc3RzIG9wdGltaXphdGlvbjogdHJhbnNmb3JtIGRvdWJsZS50b0ludCgpIHRvIERvdWJsZVRvU21pCisvLyB1bmxlc3Mgd2UgZW5jb3VudGVyIGEgbm9uLVNtaSByZXN1bHQsIGluIHdoaWNoIGNhc2Ugd2UgZGVvcHRpbWl6ZSBhbmQKKy8vIG9wdGltaXplIGl0IGxhdGVyIHRvIERvdWJsZVRvSW50LgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MDA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMTAwLCBmb28oMTAwLCAxLjIpKTsKKyAgfQorICAvLyBEZW9wdGltaXplICdmb28nLCBkMnNtaSAtPiBkMmludC4KKyAgRXhwZWN0LmVxdWFscygzNjUwNzIyMjAxNiAqIDIsIGZvbygyLCAzNjUwNzIyMjAxNi42KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDEwMCwgZm9vKDEwMCwgMS4yKSk7CisgIH0KKyAgRXhwZWN0LmVxdWFscygzNjUwNzIyMjAxNiAqIDIsIGZvbygyLCAzNjUwNzIyMjAxNi42KSk7Cit9CisKK2ZvbyhuLCBhKSB7CisgIGludCBrID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBrICs9IGdvbyhhKTsKKyAgfQorICByZXR1cm4gazsKK30KKworaW50IGdvbyhhKSB7CisgIHJldHVybiBhLnRvSW50KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2VudHJ5cG9pbnRzX3ZlcmlmaWNhdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2VudHJ5cG9pbnRzX3ZlcmlmaWNhdGlvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjODA1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvZW50cnlwb2ludHNfdmVyaWZpY2F0aW9uX3Rlc3QuZGFydApAQCAtMCwwICsxLDEwNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIFZNT3B0aW9ucz0tLXZlcmlmeS1lbnRyeS1wb2ludHM9dHJ1ZQorCitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0Om1hdGgnOworaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworaW1wb3J0ICdkYXJ0LWV4dDplbnRyeXBvaW50c192ZXJpZmljYXRpb25fdGVzdF9leHRlbnNpb24nOworCit2b2lkIFJ1blRlc3QoKSBuYXRpdmUgIlJ1blRlc3QiOworCittYWluKCkgeworICBSdW5UZXN0KCk7CisKKyAgbmV3IEMoKTsKKyAgbmV3IEQoKTsKK30KKworY2xhc3MgQyB7fQorCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCitjbGFzcyBEIHsKKyAgRCgpOworCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKKyAgRC5kZWZpbmVkKCk7CisKKyAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQorICBmYWN0b3J5IEQuZmFjdCgpID0+IEUuY3RvcigpOworCisgIHZvaWQgZm4wKCkge30KKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCisgIHZvaWQgZm4xKCkge30KKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJnZXQiKQorICB2b2lkIGZuMV9nZXQoKSB7fQorCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQorICB2b2lkIGZuMV9jYWxsKCkge30KKworICBzdGF0aWMgdm9pZCBmbjIoKSB7fQorCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKKyAgc3RhdGljIHZvaWQgZm4zKCkge30KKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJjYWxsIikKKyAgc3RhdGljIHZvaWQgZm4zX2NhbGwoKSB7fQorCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImdldCIpCisgIHN0YXRpYyB2b2lkIGZuM19nZXQoKSB7fQorCisgIHZvaWQgRnVuY3Rpb24oKT8gZmxkMDsKKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIpCisgIHZvaWQgRnVuY3Rpb24oKT8gZmxkMTsKKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJnZXQiKQorICB2b2lkIEZ1bmN0aW9uKCk/IGZsZDI7CisKKyAgQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAic2V0IikKKyAgdm9pZCBGdW5jdGlvbigpPyBmbGQzOworfQorCit2b2lkIGZuMCgpIHt9CisKK0BwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKK3ZvaWQgZm4xKCkge30KKworQHByYWdtYSgidm06ZW50cnktcG9pbnQiLCAiZ2V0IikKK3ZvaWQgZm4xX2dldCgpIHt9CisKK0BwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgImNhbGwiKQordm9pZCBmbjFfY2FsbCgpIHt9CisKK2NsYXNzIEUgZXh0ZW5kcyBEIHsKKyAgRS5jdG9yKCk7Cit9CisKK0BwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKK2NsYXNzIEYgeworICBzdGF0aWMgdm9pZCBGdW5jdGlvbigpPyBmbGQwOworCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IikKKyAgc3RhdGljIHZvaWQgRnVuY3Rpb24oKT8gZmxkMTsKKworICBAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJnZXQiKQorICBzdGF0aWMgdm9pZCBGdW5jdGlvbigpPyBmbGQyOworCisgIEBwcmFnbWEoInZtOmVudHJ5LXBvaW50IiwgInNldCIpCisgIHN0YXRpYyB2b2lkIEZ1bmN0aW9uKCk/IGZsZDM7Cit9CisKK3ZvaWQgRnVuY3Rpb24oKT8gZmxkMDsKKworQHByYWdtYSgidm06ZW50cnktcG9pbnQiKQordm9pZCBGdW5jdGlvbigpPyBmbGQxOworCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJnZXQiKQordm9pZCBGdW5jdGlvbigpPyBmbGQyOworCitAcHJhZ21hKCJ2bTplbnRyeS1wb2ludCIsICJzZXQiKQordm9pZCBGdW5jdGlvbigpPyBmbGQzOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9lbnZfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9lbnZfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODBmNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2Vudl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gU2hhcmVkT3B0aW9ucz0tRHZhciAtRCAtRD12YXIgLUR2YXI9aW52YWxpZCAtRHZhcj12YWxpZCAtRHZhcgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgRXhwZWN0LmVxdWFscygndmFsaWQnLCBjb25zdCBTdHJpbmcuZnJvbUVudmlyb25tZW50KCd2YXInKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2ZpZWxkc19tYXlfYmVfcmVzZXRfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9maWVsZHNfbWF5X2JlX3Jlc2V0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI2ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9maWVsZHNfbWF5X2JlX3Jlc2V0X3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tZmllbGRzX21heV9iZV9yZXNldAorCittYWluKCkgeworICBwcmludCgiT2theSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9mbG9hdF9hcnJheV9zdGF0aWNfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9mbG9hdF9hcnJheV9zdGF0aWNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODliOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2Zsb2F0X2FycmF5X3N0YXRpY190ZXN0LmRhcnQKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIG5hdGl2ZSBmbG9hdCBhcnJheXMuCisKKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbl9jb3VudGVyX3RocmVzaG9sZD0xMCAtLW5vLWJhY2tncm91bmRfY29tcGlsYXRpb24KKworLy8gTGlicmFyeSB0YWcgdG8gYmUgYWJsZSB0byBydW4gaW4gaHRtbCB0ZXN0IGZyYW1ld29yay4KK2xpYnJhcnkgRmxvYXRBcnJheVRlc3Q7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCit2b2lkIHRlc3RJbmRleE9mMzIoKSB7CisgIHZhciBsaXN0ID0gbmV3IEZsb2F0MzJMaXN0KDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgbGlzdFtpXSA9IGkgKyAxMC4wOworICB9CisgIC8qQGNvbXBpbGUtZXJyb3I9dW5zcGVjaWZpZWQqLyBFeHBlY3QuZXF1YWxzKDAsIGxpc3QuaW5kZXhPZigxMCkpOworICAvKkBjb21waWxlLWVycm9yPXVuc3BlY2lmaWVkKi8gRXhwZWN0LmVxdWFscyg1LCBsaXN0LmluZGV4T2YoMTUpKTsKKyAgLypAY29tcGlsZS1lcnJvcj11bnNwZWNpZmllZCovIEV4cGVjdC5lcXVhbHMoOSwgbGlzdC5pbmRleE9mKDE5KSk7CisgIC8qQGNvbXBpbGUtZXJyb3I9dW5zcGVjaWZpZWQqLyBFeHBlY3QuZXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoMjApKTsKK30KKwordm9pZCB0ZXN0QmFkVmFsdWVzMzIoKSB7CisgIHZhciBsaXN0ID0gbmV3IEZsb2F0MzJMaXN0KDEwKTsKKyAgbGlzdFswXSA9IDIuMDsKKyAgLypAY29tcGlsZS1lcnJvcj11bnNwZWNpZmllZCovIGxpc3RbMF0gPSAyOworICAvKkBjb21waWxlLWVycm9yPXVuc3BlY2lmaWVkKi8gbGlzdFswXSA9ICJoZWxsbyI7Cit9CisKK3ZvaWQgdGVzdEluZGV4T2Y2NCgpIHsKKyAgdmFyIGxpc3QgPSBuZXcgRmxvYXQ2NExpc3QoMTApOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICBsaXN0W2ldID0gaSArIDEwLjA7CisgIH0KKyAgLypAY29tcGlsZS1lcnJvcj11bnNwZWNpZmllZCovIEV4cGVjdC5lcXVhbHMoMCwgbGlzdC5pbmRleE9mKDEwKSk7CisgIC8qQGNvbXBpbGUtZXJyb3I9dW5zcGVjaWZpZWQqLyBFeHBlY3QuZXF1YWxzKDUsIGxpc3QuaW5kZXhPZigxNSkpOworICAvKkBjb21waWxlLWVycm9yPXVuc3BlY2lmaWVkKi8gRXhwZWN0LmVxdWFscyg5LCBsaXN0LmluZGV4T2YoMTkpKTsKKyAgLypAY29tcGlsZS1lcnJvcj11bnNwZWNpZmllZCovIEV4cGVjdC5lcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigyMCkpOworfQorCit2b2lkIHRlc3RCYWRWYWx1ZXM2NCgpIHsKKyAgdmFyIGxpc3QgPSBuZXcgRmxvYXQ2NExpc3QoMTApOworICBsaXN0WzBdID0gMi4wOworICAvKkBjb21waWxlLWVycm9yPXVuc3BlY2lmaWVkKi8gbGlzdFswXSA9IDI7CisgIC8qQGNvbXBpbGUtZXJyb3I9dW5zcGVjaWZpZWQqLyBsaXN0WzBdID0gImhlbGxvIjsKK30KKworbWFpbigpIHsKKyAgdGVzdEluZGV4T2YzMigpOworICB0ZXN0SW5kZXhPZjY0KCk7CisgIHRlc3RCYWRWYWx1ZXMzMigpOworICB0ZXN0QmFkVmFsdWVzNjQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvZmxvYXRfYXJyYXlfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9mbG9hdF9hcnJheV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlNzg0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvZmxvYXRfYXJyYXlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTg2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgbmF0aXZlIGZsb2F0IGFycmF5cy4KKworLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uX2NvdW50ZXJfdGhyZXNob2xkPTEwIC0tbm8tYmFja2dyb3VuZF9jb21waWxhdGlvbgorCisvLyBMaWJyYXJ5IHRhZyB0byBiZSBhYmxlIHRvIHJ1biBpbiBodG1sIHRlc3QgZnJhbWV3b3JrLgorbGlicmFyeSBGbG9hdEFycmF5VGVzdDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK3ZvaWQgdGVzdENyZWF0ZUZsb2F0MzJBcnJheSgpIHsKKyAgRmxvYXQzMkxpc3QgZmxvYXRBcnJheTsKKworICBmbG9hdEFycmF5ID0gbmV3IEZsb2F0MzJMaXN0KDApOworICBFeHBlY3QuZXF1YWxzKDAsIGZsb2F0QXJyYXkubGVuZ3RoKTsKKworICBmbG9hdEFycmF5ID0gbmV3IEZsb2F0MzJMaXN0KDEwKTsKKyAgRXhwZWN0LmVxdWFscygxMCwgZmxvYXRBcnJheS5sZW5ndGgpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDAuMCwgZmxvYXRBcnJheVtpXSk7CisgIH0KK30KKwordm9pZCB0ZXN0U2V0UmFuZ2UzMigpIHsKKyAgRmxvYXQzMkxpc3QgZmxvYXRBcnJheSA9IG5ldyBGbG9hdDMyTGlzdCgzKTsKKworICBMaXN0PGRvdWJsZT4gbGlzdCA9IFsxMC4wLCAxMS4wLCAxMi4wXTsKKyAgZmxvYXRBcnJheS5zZXRSYW5nZSgwLCAzLCBsaXN0KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDEwICsgaSwgZmxvYXRBcnJheVtpXSk7CisgIH0KKworICBmbG9hdEFycmF5WzBdID0gMjAuMDsKKyAgZmxvYXRBcnJheVsxXSA9IDIxLjA7CisgIGZsb2F0QXJyYXlbMl0gPSAyMi4wOworICBsaXN0LnNldFJhbmdlKDAsIDMsIGZsb2F0QXJyYXkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMjAgKyBpLCBsaXN0W2ldKTsKKyAgfQorCisgIC8vIDQuMGU0MCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIGZsb2F0LgorICBmbG9hdEFycmF5LnNldFJhbmdlKDEsIDMsIGNvbnN0IFs4LjAsIDQuMGU0MF0pOworICBFeHBlY3QuZXF1YWxzKDIwLCBmbG9hdEFycmF5WzBdKTsKKyAgRXhwZWN0LmVxdWFscyg4LCBmbG9hdEFycmF5WzFdKTsKKyAgRXhwZWN0LmVxdWFscyhkb3VibGUuaW5maW5pdHksIGZsb2F0QXJyYXlbMl0pOworfQorCit2b2lkIHRlc3RJbmRleE91dE9mUmFuZ2UzMigpIHsKKyAgRmxvYXQzMkxpc3QgZmxvYXRBcnJheSA9IG5ldyBGbG9hdDMyTGlzdCgzKTsKKyAgTGlzdDxkb3VibGU+IGxpc3QgPSBjb25zdCBbMC4wLCAxLjAsIDIuMCwgMy4wXTsKKworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBmbG9hdEFycmF5WzVdID0gMi4wOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgZmxvYXRBcnJheS5zZXRSYW5nZSgwLCA0LCBsaXN0KTsKKyAgfSk7CisKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgZmxvYXRBcnJheS5zZXRSYW5nZSgzLCA0LCBsaXN0KTsKKyAgfSk7Cit9CisKK3ZvaWQgdGVzdEluZGV4T2YzMigpIHsKKyAgdmFyIGxpc3QgPSBuZXcgRmxvYXQzMkxpc3QoMTApOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICBsaXN0W2ldID0gaSArIDEwLjA7CisgIH0KKyAgRXhwZWN0LmVxdWFscygwLCBsaXN0LmluZGV4T2YoMTAuMCkpOworICBFeHBlY3QuZXF1YWxzKDUsIGxpc3QuaW5kZXhPZigxNS4wKSk7CisgIEV4cGVjdC5lcXVhbHMoOSwgbGlzdC5pbmRleE9mKDE5LjApKTsKKyAgRXhwZWN0LmVxdWFscygtMSwgbGlzdC5pbmRleE9mKDIwLjApKTsKK30KKwordm9pZCB0ZXN0Q3JlYXRlRmxvYXQ2NEFycmF5KCkgeworICBGbG9hdDY0TGlzdCBmbG9hdEFycmF5OworCisgIGZsb2F0QXJyYXkgPSBuZXcgRmxvYXQ2NExpc3QoMCk7CisgIEV4cGVjdC5lcXVhbHMoMCwgZmxvYXRBcnJheS5sZW5ndGgpOworCisgIGZsb2F0QXJyYXkgPSBuZXcgRmxvYXQ2NExpc3QoMTApOworICBFeHBlY3QuZXF1YWxzKDEwLCBmbG9hdEFycmF5Lmxlbmd0aCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMC4wLCBmbG9hdEFycmF5W2ldKTsKKyAgfQorfQorCit2b2lkIHRlc3RTZXRSYW5nZTY0KCkgeworICBGbG9hdDY0TGlzdCBmbG9hdEFycmF5ID0gbmV3IEZsb2F0NjRMaXN0KDMpOworCisgIExpc3Q8ZG91YmxlPiBsaXN0ID0gWzEwLjAsIDExLjAsIDEyLjBdOworICBmbG9hdEFycmF5LnNldFJhbmdlKDAsIDMsIGxpc3QpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMTAgKyBpLCBmbG9hdEFycmF5W2ldKTsKKyAgfQorCisgIGZsb2F0QXJyYXlbMF0gPSAyMC4wOworICBmbG9hdEFycmF5WzFdID0gMjEuMDsKKyAgZmxvYXRBcnJheVsyXSA9IDIyLjA7CisgIGxpc3Quc2V0UmFuZ2UoMCwgMywgZmxvYXRBcnJheSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygyMCArIGksIGxpc3RbaV0pOworICB9CisKKyAgLy8gVW5saWtlIEZsb2F0MzJBcnJheSB3ZSBjYW4gcHJvcGVybHkgcmVwcmVzZW50IDQuMGU0MAorICBmbG9hdEFycmF5LnNldFJhbmdlKDEsIDMsIGNvbnN0IFs4LjAsIDQuMGU0MF0pOworICBFeHBlY3QuZXF1YWxzKDIwLCBmbG9hdEFycmF5WzBdKTsKKyAgRXhwZWN0LmVxdWFscyg4LCBmbG9hdEFycmF5WzFdKTsKKyAgRXhwZWN0LmVxdWFscyg0LjBlNDAsIGZsb2F0QXJyYXlbMl0pOworfQorCit2b2lkIHRlc3RJbmRleE91dE9mUmFuZ2U2NCgpIHsKKyAgRmxvYXQ2NExpc3QgZmxvYXRBcnJheSA9IG5ldyBGbG9hdDY0TGlzdCgzKTsKKyAgTGlzdDxkb3VibGU+IGxpc3QgPSBjb25zdCBbMC4wLCAxLjAsIDIuMCwgMy4wXTsKKworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICBmbG9hdEFycmF5WzVdID0gMi4wOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgZmxvYXRBcnJheS5zZXRSYW5nZSgwLCA0LCBsaXN0KTsKKyAgfSk7CisKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgZmxvYXRBcnJheS5zZXRSYW5nZSgzLCA0LCBsaXN0KTsKKyAgfSk7Cit9CisKK3ZvaWQgdGVzdEluZGV4T2Y2NCgpIHsKKyAgdmFyIGxpc3QgPSBuZXcgRmxvYXQ2NExpc3QoMTApOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICBsaXN0W2ldID0gaSArIDEwLjA7CisgIH0KKyAgRXhwZWN0LmVxdWFscygwLCBsaXN0LmluZGV4T2YoMTAuMCkpOworICBFeHBlY3QuZXF1YWxzKDUsIGxpc3QuaW5kZXhPZigxNS4wKSk7CisgIEV4cGVjdC5lcXVhbHMoOSwgbGlzdC5pbmRleE9mKDE5LjApKTsKKyAgRXhwZWN0LmVxdWFscygtMSwgbGlzdC5pbmRleE9mKDIwLjApKTsKK30KKworc3RvcmVJdDMyKEZsb2F0MzJMaXN0IGEsIGludCBpbmRleCwgdmFsdWUpIHsKKyAgYVtpbmRleF0gPSB2YWx1ZTsKK30KKworc3RvcmVJdDY0KEZsb2F0NjRMaXN0IGEsIGludCBpbmRleCwgdmFsdWUpIHsKKyAgYVtpbmRleF0gPSB2YWx1ZTsKK30KKwordGVzdFBvbHltb3JwaGljTG9hZCh2YXIgbGlzdCkgeworICByZXR1cm4gbGlzdFswXTsKK30KKworbWFpbigpIHsKKyAgdmFyIGEzMiA9IG5ldyBGbG9hdDMyTGlzdCg1KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgdGVzdENyZWF0ZUZsb2F0MzJBcnJheSgpOworICAgIHRlc3RTZXRSYW5nZTMyKCk7CisgICAgdGVzdEluZGV4T3V0T2ZSYW5nZTMyKCk7CisgICAgdGVzdEluZGV4T2YzMigpOworICAgIHN0b3JlSXQzMihhMzIsIDEsIDIuMCk7CisgICAgdGVzdFBvbHltb3JwaGljTG9hZChhMzIpOworICB9CisgIHZhciBhNjQgPSBuZXcgRmxvYXQ2NExpc3QoNSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIHRlc3RDcmVhdGVGbG9hdDY0QXJyYXkoKTsKKyAgICB0ZXN0U2V0UmFuZ2U2NCgpOworICAgIHRlc3RJbmRleE91dE9mUmFuZ2U2NCgpOworICAgIHRlc3RJbmRleE9mNjQoKTsKKyAgICBzdG9yZUl0NjQoYTY0LCAxLCAyLjApOworICAgIHRlc3RQb2x5bW9ycGhpY0xvYWQoYTY0KTsKKyAgfQorICB2YXIgZjMyeDQgPSBuZXcgRmxvYXQzMng0TGlzdCg1KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgdGVzdFBvbHltb3JwaGljTG9hZChmMzJ4NCk7CisgIH0KKworICAvLyBDaGVjayBvcHRpbWl6ZWQgKGlubGluZWQpIHZlcnNpb24gb2YgW109CisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIHN0b3JlSXQzMihhMzIsIDEsIDIpOworICB9KTsKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgc3RvcmVJdDY0KGE2NCwgMSwgMik7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9mcmFnbWVudGF0aW9uX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvZnJhZ21lbnRhdGlvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmMjFjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvZnJhZ21lbnRhdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBEZWxpYmVyYXRlbHkgZnJhZ21lbnQgdGhlIGhlYXAgYW5kIHRlc3QgdGhhdCBHQyBwZWZvcm1hbmNlIGRvZXMgbm90CisvLyBicmVhayBkb3duLiAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8yOTU4OAorLy8gTm9ybWFsbHkgcnVucyBpbiBhYm91dCA2LTcgc2Vjb25kcyBvbiBhbiB4NjQgbWFjaGluZSwgdXNpbmcgYWJvdXQgMi41R2J5dGVzCisvLyBvZiBtZW1vcnkuCisvLworLy8gVGhpcyB0ZXN0IGlzIGRlbGliZXJhdGVseSBDUFUtbGlnaHQgYW5kIHNvIGl0IGNhbiBtYWtlIGEgbG90IG9mCisvLyBwcm9ncmVzcyBiZWZvcmUgdGhlIGNvbmN1cnJlbnQgc3dlZXBlcnMgYXJlIGRvbmUgc3dlZXBpbmcgdGhlIGhlYXAuCisvLyBJbiB0aGF0IHRpbWUgdGhlcmUgaXMgbm8gZnJlZWxpc3QgYW5kIHNvIHRoZSBpc3N1ZSBkb2VzIG5vdCBhcmlzZS4KKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLW5vX2NvbmN1cnJlbnRfc3dlZXAKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLWNvbmN1cnJlbnRfc3dlZXAKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLXVzZV9jb21wYWN0b3IKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLXVzZV9jb21wYWN0b3IgLS1mb3JjZV9ldmFjdWF0aW9uCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS1ub19jb25jdXJyZW50X3N3ZWVwCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS1jb25jdXJyZW50X3N3ZWVwCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS11c2VfY29tcGFjdG9yCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS11c2VfY29tcGFjdG9yIC0tZm9yY2VfZXZhY3VhdGlvbgorLy8gVk1PcHRpb25zPS0tc2NhdmVuZ2VyX3Rhc2tzPTAKKy8vIFZNT3B0aW9ucz0tLXNjYXZlbmdlcl90YXNrcz0xCisvLyBWTU9wdGlvbnM9LS1zY2F2ZW5nZXJfdGFza3M9MgorLy8gVk1PcHRpb25zPS0tc2NhdmVuZ2VyX3Rhc2tzPTMKKworbWFpbigpIHsKKyAgZmluYWwgTGlzdDxMaXN0Pz4gYXJyYXlzID0gW107CisgIC8vIEZpbGwgdXAgaGVhcCB3aXRoIGFsdGVybmF0ZSBsYXJnZS1zbWFsbCBpdGVtcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwMDA7IGkrKykgeworICAgIGFycmF5cy5hZGQobmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKDI2MCwgbnVsbCkpOworICAgIGFycmF5cy5hZGQobmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKDEsIG51bGwpKTsKKyAgfQorICAvLyBDbGVhciB0aGUgbGFyZ2UgaXRlbXMgc28gdGhhdCB0aGUgaGVhcCBpcyBmdWxsIG9mIDI2MC13b3JkIGdhcHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgYXJyYXlzW2ldID0gbnVsbDsKKyAgfQorICAvLyBBbGxvY2F0ZSBhIGxvdCBvZiAzMDAtd29yZCBvYmplY3RzIHRoYXQgZG9uJ3QgZml0IGluIHRoZSBnYXBzLgorICBmb3IgKGludCBpID0gMDsgaSA8IDYwMDAwMDsgaSsrKSB7CisgICAgYXJyYXlzLmFkZChuZXcgTGlzdDxkeW5hbWljPi5maWxsZWQoMzAwLCBudWxsKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvZnJhZ21lbnRhdGlvbl90eXBlZF9kYXRhX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvZnJhZ21lbnRhdGlvbl90eXBlZF9kYXRhX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU3N2YyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9mcmFnbWVudGF0aW9uX3R5cGVkX2RhdGFfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxOSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2VlIGZyYWdtZW50YXRpb25fdGVzdC5kYXJ0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorLy8KKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLW5vX2NvbmN1cnJlbnRfc3dlZXAKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLWNvbmN1cnJlbnRfc3dlZXAKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLXVzZV9jb21wYWN0b3IKKy8vIFZNT3B0aW9ucz0tLW5vX2NvbmN1cnJlbnRfbWFyayAtLXVzZV9jb21wYWN0b3IgLS1mb3JjZV9ldmFjdWF0aW9uCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS1ub19jb25jdXJyZW50X3N3ZWVwCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS1jb25jdXJyZW50X3N3ZWVwCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS11c2VfY29tcGFjdG9yCisvLyBWTU9wdGlvbnM9LS1jb25jdXJyZW50X21hcmsgLS11c2VfY29tcGFjdG9yIC0tZm9yY2VfZXZhY3VhdGlvbgorCitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCittYWluKCkgeworICAvLyBXZSBoYXZlIGxlc3MgbWVtb3J5IGF2YWlsYWJsZSBvbiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGRldmljZXMsIGFuZCBpZiB3ZQorICAvLyBhbGxvY2F0ZSB0byBtdWNoIHRoZSBrZXJuZWwgbWF5IHN1bW1hcmlseSB0ZXJtaW5hdGUgdXMuCisgIGZpbmFsIGRvdWJsZSBmYWN0b3IgPSBQbGF0Zm9ybS5pc0FuZHJvaWQgPyAwLjUgOiAxLjA7CisKKyAgZmluYWwgTGlzdDxMaXN0Pz4gYXJyYXlzID0gW107CisgIC8vIEZpbGwgdXAgaGVhcCB3aXRoIGFsdGVybmF0ZSBsYXJnZS1zbWFsbCBpdGVtcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwMDAgKiBmYWN0b3I7IGkrKykgeworICAgIGFycmF5cy5hZGQobmV3IFVpbnQzMkxpc3QoMjYwKSk7CisgICAgYXJyYXlzLmFkZChuZXcgVWludDMyTGlzdCgxKSk7CisgIH0KKyAgLy8gQ2xlYXIgdGhlIGxhcmdlIGl0ZW1zIHNvIHRoZSBoZWFwIGhhcyBsYXJnZSBnYXBzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5cy5sZW5ndGg7IGkgKz0gMikgeworICAgIGFycmF5c1tpXSA9IG51bGw7CisgIH0KKyAgLy8gQWxsb2NhdGUgYSBsb3Qgb2YgbGFyZ2UgaXRlbXMgd2hpY2ggZG9uJ3QgZml0IGluIHRoZSBnYXBzIGNyZWF0ZWQgYWJvdmUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjAwMDAwICogZmFjdG9yOyBpKyspIHsKKyAgICBhcnJheXMuYWRkKG5ldyBVaW50MzJMaXN0KDMwMCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX2RhdGEvLmRhcnRfdG9vbC9wYWNrYWdlX2NvbmZpZy5qc29uIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhLy5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmYyODkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhLy5kYXJ0X3Rvb2wvcGFja2FnZV9jb25maWcuanNvbgpAQCAtMCwwICsxLDkgQEAKK3sKKyAgImNvbmZpZ1ZlcnNpb24iOiAyLAorICAicGFja2FnZXMiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAic2ltcGxlIiwKKyAgICAgICJyb290VXJpIjogIi4uL3RoZV9wYWNrYWdlcy9zaW1wbGUiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX2RhdGEvLnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhLy5wYWNrYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdmZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhLy5wYWNrYWdlcwpAQCAtMCwwICsxIEBACitzaW1wbGU6dGhlX3BhY2thZ2VzL3NpbXBsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL2h0dHBfaXNvbGF0ZV9tYWluLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX2RhdGEvaHR0cF9pc29sYXRlX21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYzMDZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL2h0dHBfaXNvbGF0ZV9tYWluLmRhcnQKQEAgLTAsMCArMSwxMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CisKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MsIFNlbmRQb3J0IHJlcGx5VG8pIHsKKyAgdmFyIGRhdGEgPSBhcmdzWzBdOworICByZXBseVRvLnNlbmQoZGF0YSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX2RhdGEvaHR0cF9sYXVuY2hfbWFpbi5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL2h0dHBfbGF1bmNoX21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL2h0dHBfbGF1bmNoX21haW4uZGFydApAQCAtMCwwICsxLDExIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgaHR0cF9sYXVuY2hfbWFpbjsKKworaW1wb3J0ICdwYWNrYWdlOnNpbXBsZS9zaW1wbGUuZGFydCc7CisKK21haW4oKSB7CisgIHByaW50KGdldFNpbXBsZVN0cmluZygpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvaHR0cF9sYXVuY2hfZGF0YS9odHRwX3NwYXduX21haW4uZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvaHR0cF9sYXVuY2hfZGF0YS9odHRwX3NwYXduX21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmIxYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL2h0dHBfc3Bhd25fbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBodHRwX2xhdW5jaF9tYWluOworCitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCittYWluKExpc3Q8U3RyaW5nPiBhcmd1bWVudHMpIHsKKyAgaW50IHBvcnQgPSBpbnQucGFyc2UoYXJndW1lbnRzWzBdKTsKKyAgUmVjZWl2ZVBvcnQgcmVjZWl2ZVBvcnQgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgSXNvbGF0ZS5zcGF3blVyaShVcmkucGFyc2UoJ2h0dHA6Ly8xMjcuMC4wLjE6JHBvcnQvaHR0cF9pc29sYXRlX21haW4uZGFydCcpLAorICAgICAgWydoZWxsbyddLCByZWNlaXZlUG9ydC5zZW5kUG9ydCk7CisgIHJlY2VpdmVQb3J0LmZpcnN0LnRoZW4oKHJlc3BvbnNlKSB7CisgICAgcHJpbnQocmVzcG9uc2UpOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvaHR0cF9sYXVuY2hfZGF0YS90aGVfcGFja2FnZXMvc2ltcGxlL3NpbXBsZS5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9odHRwX2xhdW5jaF9kYXRhL3RoZV9wYWNrYWdlcy9zaW1wbGUvc2ltcGxlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3ZTdlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvaHR0cF9sYXVuY2hfZGF0YS90aGVfcGFja2FnZXMvc2ltcGxlL3NpbXBsZS5kYXJ0CkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IHNpbXBsZTsKKworU3RyaW5nIGdldFNpbXBsZVN0cmluZygpID0+ICdoZWxsbyc7CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvaHR0cF9sYXVuY2hfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOWY4YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2h0dHBfbGF1bmNoX3Rlc3QuZGFydApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVk1PcHRpb25zPQorLy8gVk1PcHRpb25zPS0tc2hvcnRfc29ja2V0X3JlYWQKKy8vIFZNT3B0aW9ucz0tLXNob3J0X3NvY2tldF93cml0ZQorLy8gVk1PcHRpb25zPS0tc2hvcnRfc29ja2V0X3JlYWQgLS1zaG9ydF9zb2NrZXRfd3JpdGUKKy8vIE90aGVyUmVzb3VyY2VzPWh0dHBfbGF1bmNoX2RhdGEvaHR0cF9pc29sYXRlX21haW4uZGFydAorLy8gT3RoZXJSZXNvdXJjZXM9aHR0cF9sYXVuY2hfZGF0YS9odHRwX2xhdW5jaF9tYWluLmRhcnQKKy8vIE90aGVyUmVzb3VyY2VzPWh0dHBfbGF1bmNoX2RhdGEvaHR0cF9zcGF3bl9tYWluLmRhcnQKKy8vIE90aGVyUmVzb3VyY2VzPWh0dHBfbGF1bmNoX2RhdGEvdGhlX3BhY2thZ2VzL3NpbXBsZS9zaW1wbGUuZGFydAorLy8gT3RoZXJSZXNvdXJjZXM9aHR0cF9sYXVuY2hfZGF0YS8ucGFja2FnZXMKKy8vCisvLyBUZXN0OgorLy8gICAqKSBMYXVuY2hpbmcgYSBzY3JpcHQgZmV0Y2hlZCBvdmVyIEhUVFAuCisvLyAgICopIEltcG9ydGluZyBhIGxpYnJhcnkgZmV0Y2hlZCBvdmVyIEhUVFAuCisvLyAgICopIEF1dG9tYXRpY2FsbHkgcmVzb2x2aW5nIHBhY2thZ2Vfcm9vdCB3aGVuIHNjcmlwdCBpcyBmZXRjaGVkIG92ZXIgSFRUUC4KKy8vICAgKikgU3Bhd25pbmcgYSBVUkkgb3ZlciBIVFRQLgorCitsaWJyYXJ5IGh0dHBfbGF1bmNoX3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK1N0cmluZyBwYXRoVG9FeGVjdXRhYmxlID0gUGxhdGZvcm0uZXhlY3V0YWJsZTsKK0xpc3Q8U3RyaW5nPiBleGVjdXRhYmxlQXJndW1lbnRzID0gUGxhdGZvcm0uZXhlY3V0YWJsZUFyZ3VtZW50cworICAgIC53aGVyZSgoYXJnKSA9PiAhYXJnLnN0YXJ0c1dpdGgoJy0tcGFja2FnZXM9JykpCisgICAgLnRvTGlzdCgpOworVXJpIHBhdGhPZkRhdGEgPSBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgnaHR0cF9sYXVuY2hfZGF0YS8nKTsKK2xhdGUgaW50IHBvcnQ7CisKK19zZW5kTm90Rm91bmQoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLm5vdEZvdW5kOworICByZXNwb25zZS5jbG9zZSgpOworfQorCitoYW5kbGVSZXF1ZXN0KEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgZmluYWwgU3RyaW5nIHBhdGggPSByZXF1ZXN0LnVyaS5wYXRoLnN1YnN0cmluZygxKTsKKyAgZmluYWwgVXJpIHJlcXVlc3RQYXRoID0gcGF0aE9mRGF0YS5yZXNvbHZlKHBhdGgpOworICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXF1ZXN0UGF0aC50b0ZpbGVQYXRoKCkpOworICBmaWxlLmV4aXN0cygpLnRoZW4oKGJvb2wgZm91bmQpIHsKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgIGZpbGUub3BlblJlYWQoKS5jYXN0PExpc3Q8aW50Pj4oKS5waXBlKHJlcXVlc3QucmVzcG9uc2UpLmNhdGNoRXJyb3IoKGUpIHsKKyAgICAgICAgX3NlbmROb3RGb3VuZChyZXF1ZXN0LnJlc3BvbnNlKTsKKyAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBfc2VuZE5vdEZvdW5kKHJlcXVlc3QucmVzcG9uc2UpOworICAgIH0KKyAgfSk7Cit9CisKK3NlcnZlclJ1bm5pbmcoSHR0cFNlcnZlciBzZXJ2ZXIpIHsKKyAgcG9ydCA9IHNlcnZlci5wb3J0OworICBzZXJ2ZXIubGlzdGVuKGhhbmRsZVJlcXVlc3QpOworICBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gbm9faHR0cF9ydW4gPSBQcm9jZXNzLnJ1bigKKyAgICAgIHBhdGhUb0V4ZWN1dGFibGUsCisgICAgICBbXQorICAgICAgICAuLmFkZEFsbChleGVjdXRhYmxlQXJndW1lbnRzKQorICAgICAgICAuLmFkZChwYXRoT2ZEYXRhLnJlc29sdmUoJ2h0dHBfbGF1bmNoX21haW4uZGFydCcpLnRvRmlsZVBhdGgoKSkpOworICBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gaHR0cF9ydW4gPSBQcm9jZXNzLnJ1bigKKyAgICAgIHBhdGhUb0V4ZWN1dGFibGUsCisgICAgICBbXQorICAgICAgICAuLmFkZEFsbChleGVjdXRhYmxlQXJndW1lbnRzKQorICAgICAgICAuLmFkZCgnaHR0cDovLzEyNy4wLjAuMTokcG9ydC9odHRwX2xhdW5jaF9tYWluLmRhcnQnKSk7CisgIEZ1dHVyZTxQcm9jZXNzUmVzdWx0PiBodHRwX3BrZ19yb290X3J1biA9IFByb2Nlc3MucnVuKAorICAgICAgcGF0aFRvRXhlY3V0YWJsZSwKKyAgICAgIFtdCisgICAgICAgIC4uYWRkQWxsKGV4ZWN1dGFibGVBcmd1bWVudHMpCisgICAgICAgIC4uYWRkQWxsKFsnaHR0cDovLzEyNy4wLjAuMTokcG9ydC9odHRwX2xhdW5jaF9tYWluLmRhcnQnXSkpOworICBGdXR1cmU8UHJvY2Vzc1Jlc3VsdD4gaXNvbGF0ZV9ydW4gPSBQcm9jZXNzLnJ1bigKKyAgICAgIHBhdGhUb0V4ZWN1dGFibGUsCisgICAgICBbXQorICAgICAgICAuLmFkZEFsbChleGVjdXRhYmxlQXJndW1lbnRzKQorICAgICAgICAuLmFkZEFsbChbJ2h0dHA6Ly8xMjcuMC4wLjE6JHBvcnQvaHR0cF9zcGF3bl9tYWluLmRhcnQnLCAnJHBvcnQnXSkpOworICBGdXR1cmU8TGlzdDxQcm9jZXNzUmVzdWx0Pj4gcmVzdWx0cyA9CisgICAgICBGdXR1cmUud2FpdChbbm9faHR0cF9ydW4sIGh0dHBfcnVuLCBodHRwX3BrZ19yb290X3J1biwgaXNvbGF0ZV9ydW5dKTsKKyAgcmVzdWx0cy50aGVuKChyZXN1bHRzKSB7CisgICAgLy8gQ2xvc2Ugc2VydmVyLgorICAgIHNlcnZlci5jbG9zZSgpOworICAgIC8vIENoZWNrIHJlc3VsdHMuCisgICAgY2hlY2tSZXN1bHRzKHJlc3VsdHMpOworICB9KTsKK30KKworY2hlY2tSZXN1bHRzKExpc3Q8UHJvY2Vzc1Jlc3VsdD4gcmVzdWx0cykgeworICBFeHBlY3QuZXF1YWxzKDQsIHJlc3VsdHMubGVuZ3RoKTsKKyAgLy8gRXhpdGVkIGNsZWFubHkuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgeworICAgIFByb2Nlc3NSZXN1bHQgcmVzdWx0ID0gcmVzdWx0c1tpXTsKKyAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9IDApIHsKKyAgICAgIHByaW50KCJFeGl0IGNvZGUgZm9yIHByb2Nlc3MgJGkgPSAke3Jlc3VsdC5leGl0Q29kZX0iKTsKKyAgICAgIHByaW50KCItLS1zdGRvdXQ6LS0tXG4ke3Jlc3VsdC5zdGRvdXR9Iik7CisgICAgICBwcmludCgiLS0tc3RkZXJyOi0tLVxuJHtyZXN1bHQuc3RkZXJyfVxuLS0tIik7CisgICAgfQorICAgIEV4cGVjdC5lcXVhbHMoMCwgcmVzdWx0LmV4aXRDb2RlKTsKKyAgfQorICBTdHJpbmcgc3Rkb3V0ID0gcmVzdWx0c1swXS5zdGRvdXQ7CisgIC8vIE91dHB1dCBpcyB0aGUgc3RyaW5nICdoZWxsbycuIFVzZSBzdGFydHNXaXRoIHRvIGF2b2lkIG5ldyBsaW5lIGRpZmZlcmVuY2VzLgorICBpZiAoIXN0ZG91dC5zdGFydHNXaXRoKCdoZWxsbycpKSB7CisgICAgcHJpbnQoIi0tLS0gc3Rkb3V0IG9mIHJlbW90ZSBwcm9jZXNzOlxuJHN0ZG91dFxuLS0tLSIpOworICB9CisgIEV4cGVjdC5pc1RydWUoc3Rkb3V0LnN0YXJ0c1dpdGgoJ2hlbGxvJykpOworICAvLyBTYW1lIG91dHB1dCBmcm9tIGFsbCB0aHJlZSBwcm9jZXNzIHJ1bnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoc3Rkb3V0LCByZXN1bHRzW2ldLnN0ZG91dCk7CisgIH0KK30KKworbWFpbigpIHsKKyAgSHR0cFNlcnZlci5iaW5kKEludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjQsIDApLnRoZW4oc2VydmVyUnVubmluZyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2ludF9hcnJheV9kZW9wdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9pbnRfYXJyYXlfZGVvcHQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTJiOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9pbnRfYXJyYXlfZGVvcHQuZGFydApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gRGFydCBkZW9wdGltaXphdGlvbiBvZiBVaW50MzJBcnJheSBhbmQgSW50MzJBcnJheSBsb2Fkcy4KKworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK2xvYWRJMzIoYSkgPT4gYVswXSArIDE7Citsb2FkVWkzMihhKSA9PiBhWzBdICsgMTsKKworbWFpbigpIHsKKyAgdmFyIGkzMiA9IG5ldyBJbnQzMkxpc3QoMTApOworICB2YXIgdWkzMiA9IG5ldyBVaW50MzJMaXN0KDEwKTsKKyAgaTMyWzBdID0gdWkzMlswXSA9IDg7CisgIC8vIE9wdGltaXplIGxvYWRJMzIgYW5kIExvYWRVaTMyIGZvciBTbWkgcmVzdWx0IG9mIGluZGV4ZWQgbG9hZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDksIGxvYWRJMzIoaTMyKSk7CisgICAgRXhwZWN0LmVxdWFscyg5LCBsb2FkVWkzMih1aTMyKSk7CisgIH0KKyAgLy8gT24gaWEzMiwgZGVvcHRpbWl6ZSB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBhIHZhbHVlIHRoYXQgZXhjZWVkcworICAvLyBTbWkgcmFuZ2UuCisgIGkzMlswXSA9IHVpMzJbMF0gPSAyMTQ3NDgzNjQ3OworICBFeHBlY3QuZXF1YWxzKDIxNDc0ODM2NDgsIGxvYWRJMzIoaTMyKSk7CisgIEV4cGVjdC5lcXVhbHMoMjE0NzQ4MzY0OCwgbG9hZFVpMzIodWkzMikpOworICAvLyBSZW9wdGltaXplIGFnYWluLCBidXQgdGhpcyB0aW1lIGFzc3VtZSBtaXhlZCBTbWkvTWludCByZXN1bHRzCisgIGkzMlswXSA9IHVpMzJbMF0gPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDExLCBsb2FkSTMyKGkzMikpOworICAgIEV4cGVjdC5lcXVhbHMoMTEsIGxvYWRVaTMyKHVpMzIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9pbnRfYXJyYXlfbG9hZF9lbGltaW5hdGlvbl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2ludF9hcnJheV9sb2FkX2VsaW1pbmF0aW9uX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThkZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9pbnRfYXJyYXlfbG9hZF9lbGltaW5hdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIFRlc3QgY29ycmVjdCBsb2FkIGVsaW1pbmF0aW9uIGZvciBzY2FsYXIgbGlzdHMuCisKKy8vIFRPRE86IHJlbW92ZSBvbmNlIGJ1ZyAyMjY0IGZpeGVkLgorbGlicmFyeSBpbnRfYXJyYXlfbG9hZF9lbGltaW5hdGlvbjsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK3ZvaWQgdGVzdFVpbnQxNigpIHsKKyAgVWludDE2TGlzdCBpbnRBcnJheSA9IG5ldyBVaW50MTZMaXN0KDEpOworICBpbnRBcnJheVswXSA9IC0xOworICB2YXIgeCA9IGludEFycmF5WzBdOworICBFeHBlY3QuZXF1YWxzKDY1NTM1LCB4KTsKK30KKworbWFpbigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICB0ZXN0VWludDE2KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvaW50X2FycmF5X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvaW50X2FycmF5X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQzMjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9pbnRfYXJyYXlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTM5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgbmF0aXZlIGludCBhcnJheXMuCisKKy8vIExpYnJhcnkgdGFnIHRvIGJlIGFibGUgdG8gcnVuIGluIGh0bWwgdGVzdCBmcmFtZXdvcmsuCitsaWJyYXJ5IEludEFycmF5VGVzdDsKKworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK3ZvaWQgdGVzdEludDE2KCkgeworICBJbnQxNkxpc3QgaW50QXJyYXkgPSBuZXcgSW50MTZMaXN0KDQpOworICBpbnRBcnJheVswXSA9IDA7CisgIGludEFycmF5WzFdID0gLTE7CisgIGludEFycmF5WzJdID0gLTI7CisgIGludEFycmF5WzNdID0gLTM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50QXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICBpbnRBcnJheVtpXSsrOworICB9CisgIHZhciB4ID0gaW50QXJyYXlbMF07CisgIHZhciB5ID0gaW50QXJyYXlbMV07CisgIHZhciB6ID0gaW50QXJyYXlbMl07CisgIHZhciB3ID0gaW50QXJyYXlbM107CisgIEV4cGVjdC5lcXVhbHMoMSwgeCk7CisgIEV4cGVjdC5lcXVhbHMoMCwgeSk7CisgIEV4cGVjdC5lcXVhbHMoLTEsIHopOworICBFeHBlY3QuZXF1YWxzKC0yLCB3KTsKKyAgdmFyIHQgPSB5ICsgMTsKKyAgaW50QXJyYXlbMF0gPSB0OworICBFeHBlY3QuZXF1YWxzKHQsIGludEFycmF5WzBdKTsKK30KKwordm9pZCB0ZXN0VWludDE2KCkgeworICBVaW50MTZMaXN0IGludEFycmF5ID0gbmV3IFVpbnQxNkxpc3QoNCk7CisgIGludEFycmF5WzBdID0gMDsKKyAgaW50QXJyYXlbMV0gPSAxOworICBpbnRBcnJheVsyXSA9IDI7CisgIGludEFycmF5WzNdID0gMzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRBcnJheS5sZW5ndGg7IGkrKykgeworICAgIGludEFycmF5W2ldLS07CisgIH0KKyAgdmFyIHggPSBpbnRBcnJheVswXTsKKyAgdmFyIHkgPSBpbnRBcnJheVsxXTsKKyAgdmFyIHogPSBpbnRBcnJheVsyXTsKKyAgdmFyIHcgPSBpbnRBcnJheVszXTsKKyAgRXhwZWN0LmVxdWFscyg2NTUzNSwgeCk7CisgIEV4cGVjdC5lcXVhbHMoMCwgeSk7CisgIEV4cGVjdC5lcXVhbHMoMSwgeik7CisgIEV4cGVjdC5lcXVhbHMoMiwgdyk7CisgIHZhciB0ID0geSArIDE7CisgIGludEFycmF5WzBdID0gdDsKKyAgRXhwZWN0LmVxdWFscyh0LCBpbnRBcnJheVswXSk7Cit9CisKK3ZvaWQgdGVzdEludDMyVG9TbWkoKSB7CisgIEludDMyTGlzdCBpbnRBcnJheTsKKworICBpbnRBcnJheSA9IG5ldyBJbnQzMkxpc3QoNCk7CisgIGludEFycmF5WzBdID0gMTA3Mzc0MTgyMzsgLy8gU21pTWF4CisgIGludEFycmF5WzFdID0gLTEwNzM3NDE4MjQ7IC8vIFNtaU1pbgorICBpbnRBcnJheVsyXSA9IDEwNzM3NDE4MjQ7IC8vIFNtaU1heCsxCisgIGludEFycmF5WzNdID0gLTEwNzM3NDE4MjU7IC8vIFNtaU1pbi0xCisgIHZhciB4ID0gaW50QXJyYXlbMF07CisgIHZhciB5ID0gaW50QXJyYXlbMV07CisgIHZhciB6ID0gaW50QXJyYXlbMl07CisgIHZhciB3ID0gaW50QXJyYXlbM107CisgIEV4cGVjdC5lcXVhbHMoMTA3Mzc0MTgyMywgeCk7CisgIEV4cGVjdC5lcXVhbHMoLTEwNzM3NDE4MjQsIHkpOworICBFeHBlY3QuZXF1YWxzKDEwNzM3NDE4MjQsIHopOworICBFeHBlY3QuZXF1YWxzKC0xMDczNzQxODI1LCB3KTsKK30KKwordm9pZCB0ZXN0VWludDMyVG9TbWkoKSB7CisgIFVpbnQzMkxpc3QgaW50QXJyYXk7CisKKyAgaW50QXJyYXkgPSBuZXcgVWludDMyTGlzdCg0KTsKKyAgaW50QXJyYXlbMF0gPSAxMDczNzQxODIzOyAvLyBTbWlNYXgKKyAgaW50QXJyYXlbMV0gPSAtMTsgLy8gMHhGRkZGRkZGRiA6IDQyOTQ5NjcyOTUKKyAgaW50QXJyYXlbMl0gPSAxMDczNzQxODMwOyAvLyBTbWlNYXgrNworICBpbnRBcnJheVszXSA9IC0xMDczNzQxODI1OyAvLyAweGJmZmZmZmZmIDogMzIyMTIyNTQ3MQorICB2YXIgeCA9IGludEFycmF5WzBdOworICB2YXIgeSA9IGludEFycmF5WzFdOworICB2YXIgeiA9IGludEFycmF5WzJdOworICB2YXIgdyA9IGludEFycmF5WzNdOworICBFeHBlY3QuZXF1YWxzKDEwNzM3NDE4MjMsIHgpOworICBFeHBlY3QuZXF1YWxzKDQyOTQ5NjcyOTUsIHkpOworICBFeHBlY3QuZXF1YWxzKDEwNzM3NDE4MzAsIHopOworICBFeHBlY3QuZXF1YWxzKDMyMjEyMjU0NzEsIHcpOworfQorCit2b2lkIHRlc3RJbnQ2NFRvU21pKCkgeworICBJbnQ2NExpc3QgaW50QXJyYXk7CisKKyAgaW50QXJyYXkgPSBuZXcgSW50NjRMaXN0KDQpOworICBpbnRBcnJheVswXSA9IDQ2MTE2ODYwMTg0MjczODc5MDM7IC8vIFNtaU1heAorICBpbnRBcnJheVsxXSA9IC00NjExNjg2MDE4NDI3Mzg3OTA0OyAvLyBTbWlNaW4KKyAgaW50QXJyYXlbMl0gPSA0NjExNjg2MDE4NDI3Mzg3OTA0OyAvLyBTbWlNYXgrMQorICBpbnRBcnJheVszXSA9IC00NjExNjg2MDE4NDI3Mzg3OTA1OyAvLyBTbWlNaW4tMQorICB2YXIgeCA9IGludEFycmF5WzBdOworICB2YXIgeSA9IGludEFycmF5WzFdOworICB2YXIgeiA9IGludEFycmF5WzJdOworICB2YXIgdyA9IGludEFycmF5WzNdOworICBFeHBlY3QuZXF1YWxzKDQ2MTE2ODYwMTg0MjczODc5MDMsIHgpOworICBFeHBlY3QuZXF1YWxzKC00NjExNjg2MDE4NDI3Mzg3OTA0LCB5KTsKKyAgRXhwZWN0LmVxdWFscyg0NjExNjg2MDE4NDI3Mzg3OTA0LCB6KTsKKyAgRXhwZWN0LmVxdWFscygtNDYxMTY4NjAxODQyNzM4NzkwNSwgdyk7Cit9CisKK3ZvaWQgdGVzdFVpbnQ2NFRvU21pKCkgeworICBVaW50NjRMaXN0IGludEFycmF5OworCisgIGludEFycmF5ID0gbmV3IFVpbnQ2NExpc3QoNCk7CisgIGludEFycmF5WzBdID0gNDYxMTY4NjAxODQyNzM4NzkwMzsgLy8gU21pTWF4CisgIGludEFycmF5WzFdID0gLTE7IC8vIDB4RkZGRkZGRkZGRkZGRkZGRiA6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1CisgIGludEFycmF5WzJdID0gNDYxMTY4NjAxODQyNzM4NzkwNDsgLy8gU21pTWF4KzEKKyAgaW50QXJyYXlbM10gPSAtOTIyMzM3MjAzNjg1NDc3NTgwODsKKyAgdmFyIHggPSBpbnRBcnJheVswXTsKKyAgdmFyIHkgPSBpbnRBcnJheVsxXTsKKyAgdmFyIHogPSBpbnRBcnJheVsyXTsKKyAgdmFyIHcgPSBpbnRBcnJheVszXTsKKyAgRXhwZWN0LmVxdWFscyg0NjExNjg2MDE4NDI3Mzg3OTAzLCB4KTsKKyAgRXhwZWN0LmVxdWFscygtMSwgeSk7CisgIEV4cGVjdC5lcXVhbHMoNDYxMTY4NjAxODQyNzM4NzkwNCwgeik7CisgIEV4cGVjdC5lcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIHcpOworfQorCittYWluKCkgeworICB0ZXN0VWludDY0VG9TbWkoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKyAgICB0ZXN0SW50MTYoKTsKKyAgICB0ZXN0VWludDE2KCk7CisgICAgdGVzdEludDMyVG9TbWkoKTsKKyAgICB0ZXN0VWludDMyVG9TbWkoKTsKKyAgICB0ZXN0SW50NjRUb1NtaSgpOworICAgIHRlc3RVaW50NjRUb1NtaSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL2ludF9saXN0X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvaW50X2xpc3RfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTlmNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2ludF9saXN0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gRGFydCBNaW50IHJlcHJlc2VudGF0aW9ucyBhbmQgdHlwZSBwcm9wYWdhdGlvbiBpc3N1ZS4KKy8vIFRlc3RpbmcgSW50MzJMaXN0IGFuZCBVaW50MzJMaXN0IGxvYWRzLgorLy8KKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD01IC0tbm8tdXNlLW9zciAtLW5vLWJhY2tncm91bmQtY29tcGlsYXRpb24KKworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CisKK21haW4oKSB7CisgIHZhciBhID0gbmV3IFVpbnQzMkxpc3QoMTAwKTsKKyAgYVsyXSA9IDM7CisgIHZhciByZXMgPSBzdW1JdDEoYSwgMik7CisgIEV4cGVjdC5lcXVhbHMoMyAqIDEwLCByZXMpOworICByZXMgPSBzdW1JdDEoYSwgMik7CisgIEV4cGVjdC5lcXVhbHMoMyAqIDEwLCByZXMpOworICB2YXIgYTEgPSBuZXcgSW50MzJMaXN0KDEwMCk7CisgIGExWzJdID0gMzsKKyAgcmVzID0gc3VtSXQyKGExLCAyKTsKKyAgRXhwZWN0LmVxdWFscygzICogMTAsIHJlcyk7CisgIHJlcyA9IHN1bUl0MihhMSwgMik7CisgIEV4cGVjdC5lcXVhbHMoMyAqIDEwLCByZXMpOworfQorCitzdW1JdDEoVWludDMyTGlzdCBhLCBpbnQgbikgeworICB2YXIgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgc3VtICs9IGFbbl07CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworc3VtSXQyKEludDMyTGlzdCBhLCBpbnQgbikgeworICB2YXIgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgc3VtICs9IGFbbl07CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvbGVmdF9zaGlmdF9iaXRfYW5kX29wX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvbGVmdF9zaGlmdF9iaXRfYW5kX29wX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQwY2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9sZWZ0X3NoaWZ0X2JpdF9hbmRfb3BfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBUZXN0cyBvcHRpbWl6aW5nIChhIDw8IGIpICYgYyBpZiBjIGlzIGEgU21pIGNvbnN0YW50LgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKworbWFpbigpIHsKKyAgY2hlY2tzaGlmdEFuZDMyKCk7CisgIGNoZWNrU2hpZnRBbmQ2NCgpOworICAvLyBPcHRpbWl6ZSBzaGlmdEFuZDMyLgorICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKyAgICBBLnNoaWZ0QW5kMzIoMTIsIDE3KTsKKyAgICBBLnNoaWZ0QW5kNjQoMTIsIDE3KTsKKyAgICBFeHBlY3QuZXF1YWxzKDcyLCBBLm11bHRpcGxlQ29uc3RhbnRVc2VzKDMsIDQpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDM0NDkzOTU2MDk2LCBBLm11bHRpcGxlU2hpZnRVc2UoMTM0NzQyMDE2LCA4KSk7CisgIH0KKyAgY2hlY2tzaGlmdEFuZDMyKCk7CisgIGNoZWNrU2hpZnRBbmQ2NCgpOworCisgIEV4cGVjdC50aHJvd3MoKCkgPT4gQS5zaGlmdEFuZDMyKDEyLCAtNSkpOworCisgIC8vIENoZWNrIGVudmlyb25tZW50IGRlcGVuZGVuY3kuCisgIGZpbmFsIGEgPSBuZXcgQSgpLCBiID0gbmV3IEIoKTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygwLCBiYXIoYSkpOworICB9CisgIEV4cGVjdC5lcXVhbHMoNDI5NDk2NzI5NiwgYmFyKGIpKTsKK30KKworY2hlY2tzaGlmdEFuZDMyKCkgeworICBFeHBlY3QuZXF1YWxzKDE1NzI4NjQsIEEuc2hpZnRBbmQzMigxMiwgMTcpKTsKKyAgRXhwZWN0LmVxdWFscygxMiwgQS5zaGlmdEFuZDMyKDEyLCAwKSk7CisgIEV4cGVjdC5lcXVhbHMoMjg1MjEyNjcyLCBBLnNoaWZ0QW5kMzIoMTY3NzkzOTIsIDE3KSk7Cit9CisKK2NoZWNrU2hpZnRBbmQ2NCgpIHsKKyAgRXhwZWN0LmVxdWFscygxMTI1OTM2NDgxMTczNTA0LCBBLnNoaWZ0QW5kNjQoNDYxMTY5NDgxNDgwNjE0NzA3MiwgNykpOworfQorCitjbGFzcyBBIHsKKyAgc3RhdGljIGNvbnN0IGludCBNQVNLXzMyID0gKDEgPDwgMzApIC0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBNQVNLXzY0ID0gKDEgPDwgNjIpIC0gMTsKKworICBzdGF0aWMgc2hpZnRBbmQzMihhLCBjKSB7CisgICAgcmV0dXJuIChhIDw8IGMpICYgTUFTS18zMjsKKyAgfQorCisgIHN0YXRpYyBzaGlmdEFuZDY0KGEsIGMpIHsKKyAgICByZXR1cm4gKGEgPDwgYykgJiBNQVNLXzY0OworICB9CisKKyAgc3RhdGljIG11bHRpcGxlQ29uc3RhbnRVc2VzKGEsIGMpIHsKKyAgICB2YXIgaiA9IChhIDw8IGMpICYgMHhGRjsKKyAgICB2YXIgayA9IChhIDw8IDMpICYgMHhGRjsKKyAgICByZXR1cm4gaiArIGs7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhhdCBsZWZ0IHNoaWZ0IGlzIG5vciBtYXJrZWQgYXMgdHJ1bmNhdGluZy4KKyAgc3RhdGljIG11bHRpcGxlU2hpZnRVc2UoYSwgYykgeworICAgIHZhciB5ID0gKGEgPDwgYyk7CisgICAgdmFyIHggPSB5ICYgMHg3RjsKKyAgICByZXR1cm4geSArIHg7CisgIH0KKworICBmb28oeCkgeworICAgIHJldHVybiB4ICYgMHhmOworICB9Cit9CisKK2NsYXNzIEIgeworICBmb28oeCkgeworICAgIHJldHVybiB4OworICB9Cit9CisKK2JhcihvKSB7CisgIHJldHVybiBvLmZvbygxIDw8IDMyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvbGlua19uYXRpdmVzX2xhemlseV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL2xpbmtfbmF0aXZlc19sYXppbHlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTUzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL2xpbmtfbmF0aXZlc19sYXppbHlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1saW5rX25hdGl2ZXNfbGF6aWx5CisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL21hcF9pbnNlcnRfcmVtb3ZlX29vbV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL21hcF9pbnNlcnRfcmVtb3ZlX29vbV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzZmQxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvbWFwX2luc2VydF9yZW1vdmVfb29tX3Rlc3QuZGFydApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLworLy8gVk1PcHRpb25zPS0tb2xkX2dlbl9oZWFwX3NpemU9MTIKKy8vCisvLyBOb3RpY2Ugd2Ugc2V0IHRoZSBvbGQgZ2VuIGhlYXAgc2l6ZSB0byAxMiBNQiwgd2hpY2ggc2VlbXMgdG8gYmUgdGhlIG1pbmltdW0KKy8vIChpbiBkZWJ1ZyBtb2RlKSB0byBub3QgY2F1c2UgdXMgcnVuIE9PTSBkdXJpbmcgaXNvbGF0ZSBpbml0aWFsaXphdGlvbi4gIFRoZQorLy8gcHJvYmxlbSBoZXJlIGlzIHRoYXQgd2UgcHJlLWFsbG9jYXRlIGNlcnRhaW4gZXhjZXB0aW9ucywgZS5nLiBOdWxsVGhyb3duRXJyb3IKKy8vIGR1cmluZyBpc29sYXRlIGluaXRpYWxpemF0aW9uLCBidXQgaWYgd2UgaGF2ZSBhbiBhbGxvY2F0aW9uIGZhaWx1cmUgYmVmb3JlCisvLyB0aGF0LCB3ZSBlbmQgdXAgcnVubmluZyBpbnRvIGEgcmVjdXJzaXZlIGFsbG9jYXRlL3Rocm93IGxvb3AuCisvLworLy8gVGVzdCB0aGF0IGNvbXBhY3Rpb24gZG9lcyBvY2N1ciBvbiByZXBlYXRlZCBhZGQvcmVtb3ZlLgorCittYWluKCkgeworICB2YXIgeCA9IHt9OworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDA7IGkrKykgeworICAgIHhbaV0gPSAxMDsKKyAgICB4LnJlbW92ZShpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9tZWRpdW1faW50ZWdlcl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL21lZGl1bV9pbnRlZ2VyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODUzMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9tZWRpdW1faW50ZWdlcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3RpbmcgTWludHMuIE5vdGUgdGhhdCB0aGUgdGVzdHMgbWF5IG5vdCB3b3JrIG9uIDY0LWJpdCBtYWNoaW5lcywKKy8vIGFzIFNtaSdzIHdvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IG1hbnkgb2YgdGhlIG51bWJlcnMuCisKK2xpYnJhcnkgTWVkaXVtSW50ZWdlclRlc3Q7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBNZWRpdW1JbnRlZ2VyVGVzdCB7CisgIHN0YXRpYyBpbnQgZ2V0TWludCgpIHsKKyAgICByZXR1cm4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTsKKyAgfQorCisgIHN0YXRpYyB0ZXN0U21pT3ZlcmZsb3coKSB7CisgICAgaW50IGEgPSAxMDczNzQxODIzOworICAgIGludCBiID0gMTA3Mzc0MTgyMjsKKyAgICBFeHBlY3QuZXF1YWxzKDIxNDc0ODM2NDUsIGEgKyBiKTsKKyAgICBFeHBlY3QuZXF1YWxzKDExNTI5MjE1MDEzODU2MjE1MDYsIGEgKiBiKTsKKyAgICBFeHBlY3QuZXF1YWxzKC0yMTQ3NDgzNjQ1LCAtYSAtIGIpOworICB9CisKKyAgc3RhdGljIHRlc3RNaW50QWRkKCkgeworICAgIC8vIE1pbnQgYW5kIFNtaS4KKyAgICB2YXIgYSA9IDEyMzQ1Njc4OTAxMjM0NTY3ODk7CisgICAgdmFyIGIgPSAyOworICAgIEV4cGVjdC5lcXVhbHMoMTIzNDU2Nzg5MDEyMzQ1Njc5MSwgYSArIGIpOworICAgIEV4cGVjdC5lcXVhbHMoMTIzNDU2Nzg5MDEyMzQ1Njc5MSwgYiArIGEpOworICAgIGEgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIEV4cGVjdC5lcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIGEgKyAxKTsKKworICAgIC8vIE1pbnQgYW5kIE1pbnQuCisgICAgYSA9IDEwMDAwMDAwMDAwMDAwMDAwMTsKKyAgICBFeHBlY3QuZXF1YWxzKDIwMDAwMDAwMDAwMDAwMDAwMiwgYSArIGEpOworICAgIGEgPSA5MjIzMzcyMDM2ODU0Nzc1ODAwOworICAgIGIgPSAxMDAwMDAwMDAwMDAwMDAwMDAwOworICAgIEV4cGVjdC5lcXVhbHMoLTgyMjMzNzIwMzY4NTQ3NzU4MTYsIGEgKyBiKTsKKworICAgIC8vIE1pbnQgYW5kIGRvdWJsZS4KKyAgICB2YXIgZGEgPSAxMDAwMDAwMDAwMDAuMDsKKyAgICBiID0gMTAwMDAwMDAwMDAwOworICAgIEV4cGVjdC5lcXVhbHMoMjAwMDAwMDAwMDAwLjAsIGRhICsgYik7CisgICAgRXhwZWN0LmVxdWFscygyMDAwMDAwMDAwMDAuMCwgYiArIGRhKTsKKyAgfQorCisgIHN0YXRpYyB0ZXN0TWludFN1YigpIHsKKyAgICAvLyBNaW50IGFuZCBTbWkuCisgICAgdmFyIGEgPSAxMjM0NTY3ODkwMTIzNDU2Nzg5OworICAgIHZhciBiID0gMjsKKyAgICBFeHBlY3QuZXF1YWxzKDEyMzQ1Njc4OTAxMjM0NTY3ODcsIGEgLSBiKTsKKyAgICBhID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDg7CisgICAgRXhwZWN0LmVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3LCBhIC0gMSk7CisKKyAgICAvLyBNaW50IGFuZCBNaW50LgorICAgIGEgPSAxMjM0NTY3ODkwMTIzNDU2Nzg5OworICAgIGIgPSAxMDAwMDAwMDAwMDAwMDAwMDAwOworICAgIEV4cGVjdC5lcXVhbHMoMjM0NTY3ODkwMTIzNDU2Nzg5LCBhIC0gYik7CisgICAgYSA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4OworICAgIGIgPSAxMDAwMDAwMDAwMDAwMDAwMDAwOworICAgIEV4cGVjdC5lcXVhbHMoODIyMzM3MjAzNjg1NDc3NTgwOCwgYSAtIGIpOworICB9CisKKyAgc3RhdGljIHRlc3RNaW50RGl2KCkgeworICAgIC8vIE1pbnQgYW5kIFNtaS4KKyAgICB2YXIgYSA9IDEyMzQ1Njc4OTAxMjM0NTY3ODg7CisgICAgdmFyIGIgPSAyOworICAgIEV4cGVjdC5lcXVhbHMoNjE3MjgzOTQ1MDYxNzI4Mzk0LjAsIGEgLyBiKTsKKyAgfQorCisgIHN0YXRpYyB0ZXN0TWludE11bCgpIHsKKyAgICAvLyBNaW50IGFuZCBTbWkuCisgICAgdmFyIGEgPSA0NjExNjg2MDE4NDI3Mzg3OTA0OworICAgIHZhciBiID0gMTA7CisgICAgRXhwZWN0LmVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwOCwgYSAqIGIpOworICAgIGIgPSAxMDAwMDAwMDAwMDAwMDAwMDAwOworICAgIEV4cGVjdC5lcXVhbHMoMCwgYSAqIGIpOworICB9CisKKyAgc3RhdGljIHRlc3RNaW50QW5kKG1pbnQpIHsKKyAgICAvLyBJc3N1ZSAxODQ1LgorICAgIGZpbmFsIGludCB0ID0gMDsKKyAgICB2YXIgcmVzID0gbWludCAmICh0IC0gMSk7CisgICAgRXhwZWN0LmVxdWFscyhtaW50LCByZXMpOworICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdE1haW4oKSB7CisgICAgRXhwZWN0LmVxdWFscygxMjM0NTY3ODkwMTIzNDU2Nzg5LCBnZXRNaW50KCkpOworICAgIHRlc3RTbWlPdmVyZmxvdygpOworICAgIHRlc3RNaW50QWRkKCk7CisgICAgdGVzdE1pbnRTdWIoKTsKKyAgICB0ZXN0TWludE11bCgpOworICAgIHRlc3RNaW50RGl2KCk7CisgICAgdGVzdE1pbnRBbmQoLTE5MjUxNDk5NTIpOworICAgIHRlc3RNaW50QW5kKDE5MjUxNDk5NTIpOworICAgIHRlc3RNaW50QW5kKDB4MTAwMDAwMDAxKTsKKyAgICB2YXIgYSA9IDEwMDAwMDAwMDAwMDsKKyAgICB2YXIgYiA9IDEwMDAwMDAwMDAwMTsKKyAgICBFeHBlY3QuZXF1YWxzKGZhbHNlLCBhLmhhc2hDb2RlID09IGIuaGFzaENvZGUpOworICAgIEV4cGVjdC5lcXVhbHModHJ1ZSwgYS5oYXNoQ29kZSA9PSAoYiAtIDEpLmhhc2hDb2RlKTsKKyAgfQorfQorCittYWluKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDQwMDA7IGkrKykgeworICAgIE1lZGl1bUludGVnZXJUZXN0LnRlc3RNYWluKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvbm9fYWxsb3dfYWJzb2x1dGVfYWRkcmVzc2VzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvbm9fYWxsb3dfYWJzb2x1dGVfYWRkcmVzc2VzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDEzYzVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9ub19hbGxvd19hYnNvbHV0ZV9hZGRyZXNzZXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1ub19hbGxvd19hYnNvbHV0ZV9hZGRyZXNzZXMKKworbWFpbigpIHsKKyAgcHJpbnQoIk9rYXkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvbm9fbGF6eV9kaXNwYXRjaGVyc190ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL25vX2xhenlfZGlzcGF0Y2hlcnNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWJhMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL25vX2xhenlfZGlzcGF0Y2hlcnNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1ub19sYXp5X2Rpc3BhdGNoZXJzCisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL25vX3Byb2ZpbGVyX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvbm9fcHJvZmlsZXJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjEyZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL25vX3Byb2ZpbGVyX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tbm9fcHJvZmlsZXIKKworbWFpbigpIHsKKyAgcHJpbnQoIk9rYXkiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvbm9fc3VwcG9ydF9hc3RfcHJpbnRlcl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfYXN0X3ByaW50ZXJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZmZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfYXN0X3ByaW50ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1uby1zdXBwb3J0X2FzdF9wcmludGVyCisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfZGVidWdnZXJfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X2RlYnVnZ2VyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIwYzlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X2RlYnVnZ2VyX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tbm8tc3VwcG9ydF9kZWJ1Z2dlcgorCittYWluKCkgeworICBwcmludCgiT2theSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X2Rpc2Fzc2VtYmxlcl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfZGlzYXNzZW1ibGVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjBhY2EwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X2Rpc2Fzc2VtYmxlcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTYsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLW5vX3N1cHBvcnRfZGlzYXNzZW1ibGVyCisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfaWxfcHJpbnRlcl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfaWxfcHJpbnRlcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViYmEzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvbm9fc3VwcG9ydF9pbF9wcmludGVyX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tbm8tc3VwcG9ydF9pbF9wcmludGVyCisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfc2VydmljZV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfc2VydmljZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzMWRiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvbm9fc3VwcG9ydF9zZXJ2aWNlX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tbm8tc3VwcG9ydF9zZXJ2aWNlCisKK21haW4oKSB7CisgIHByaW50KCJPa2F5Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL25vX3N1cHBvcnRfdGltZWxpbmVfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X3RpbWVsaW5lX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTVhNDQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9ub19zdXBwb3J0X3RpbWVsaW5lX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tbm8tc3VwcG9ydF90aW1lbGluZQorCittYWluKCkgeworICBwcmludCgiT2theSIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9udW1iZXJfaWRlbnRpdHlfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9udW1iZXJfaWRlbnRpdHlfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWNiZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL251bWJlcl9pZGVudGl0eV90ZXN0LmRhcnQKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgcGFyYW1zLgorLy8KKy8vIFRlc3RzICdpZGVudGljYWwnIGZvciBjYXNlcyB0aGF0IG5vdCBzdXBwb3J0ZWQgaW4gZGFydDJqcyAoYmlnaW50LAorLy8gZGlzYW1iaWd1YXRpb24gaW50L2RvdWJsZSkuCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCittYWluKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgdGVzdE51bWJlcklkZW50aXR5KCk7Cit9CisKK3Rlc3ROdW1iZXJJZGVudGl0eSgpIHsKKyAgY29uc3QgaW50IHNtaSA9IDg7CisgIGNvbnN0IGludCBtaW50ID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgY29uc3QgZG91YmxlIGRibCA9IDguMDsKKyAgLy8gTm8gaW50L2RvdWJsZSBkaWZmZXJlbmNlcyBpbiBkYXJ0MmpzLgorICB2YXIgYSA9IHNtaSArIDA7CisgIEV4cGVjdC5pc0ZhbHNlKGlkZW50aWNhbChhLCBkYmwpKTsKKyAgdmFyIGMgPSBkYmwgKyAwLjA7CisgIEV4cGVjdC5pc0ZhbHNlKGlkZW50aWNhbChjLCBzbWkpKTsKKworICBhID0gbWludDsKKyAgdmFyIGIgPSBhICsgMDsKKyAgRXhwZWN0LmlzVHJ1ZShpZGVudGljYWwoYSwgYikpOworICBiID0gYSArIDE7CisgIEV4cGVjdC5pc0ZhbHNlKGlkZW50aWNhbChhLCBiKSk7IC8vIEZhaWxzIHdpdGggZGFydDJqcy4KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvb29tX2Vycm9yX3N0YWNrdHJhY2VfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9vb21fZXJyb3Jfc3RhY2t0cmFjZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyODllMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvb29tX2Vycm9yX3N0YWNrdHJhY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIERhcnQgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIHRocm93IHN0YXRlbWVudAorLy8gVk1PcHRpb25zPS0tb2xkX2dlbl9oZWFwX3NpemU9NTEyCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBIZWxwZXIxIHsKKyAgc3RhdGljIGludCBmdW5jMSgpIHsKKyAgICByZXR1cm4gZnVuYzIoKTsKKyAgfQorCisgIHN0YXRpYyBpbnQgZnVuYzIoKSB7CisgICAgcmV0dXJuIGZ1bmMzKCk7CisgIH0KKworICBzdGF0aWMgaW50IGZ1bmMzKCkgeworICAgIHJldHVybiBmdW5jNCgpOworICB9CisKKyAgc3RhdGljIGludCBmdW5jNCgpIHsKKyAgICB2YXIgaSA9IDA7CisgICAgdHJ5IHsKKyAgICAgIGkgPSAxMDsKKyAgICAgIGZ1bmM1KCk7CisgICAgfSBvbiBPdXRPZk1lbW9yeUVycm9yIGNhdGNoIChlKSB7CisgICAgICBpID0gMTAwOworICAgICAgRXhwZWN0LmlzTnVsbChlLnN0YWNrVHJhY2UsICJPT00gc2hvdWxkIG5vdCBoYXZlIGEgc3RhY2tUcmFjZSBvbiB0aHJvdyIpOworICAgIH0KKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHN0YXRpYyBMaXN0IGZ1bmM1KCkgeworICAgIC8vIENhdXNlIGFuIE9PTShvdXQgb2YgbWVtb3J5KSBleGNlcHRpb24uCisgICAgdmFyIGwxID0gbmV3IExpc3Q8ZHluYW1pYz4uZmlsbGVkKDI2ODQzNTQ1NSwgbnVsbCk7CisgICAgcmV0dXJuIGwxOworICB9Cit9CisKK2NsYXNzIE9PTUVycm9yU3RhY2tUcmFjZVRlc3QgeworICBzdGF0aWMgdGVzdE1haW4oKSB7CisgICAgRXhwZWN0LmVxdWFscygxMDAsIEhlbHBlcjEuZnVuYzEoKSk7CisgIH0KK30KKworbWFpbigpIHsKKyAgT09NRXJyb3JTdGFja1RyYWNlVGVzdC50ZXN0TWFpbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9vdXRfb2ZfbWVtb3J5X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvb3V0X29mX21lbW9yeV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4NWE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvb3V0X29mX21lbW9yeV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVk1PcHRpb25zPS0tb2xkX2dlbl9oZWFwX3NpemU9NTEyCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCit2b2lkIG1haW4oKSB7CisgIHZhciBudW1iZXJfb2ZfaW50cyA9IDEzNDAwMDAwMDsKKyAgdmFyIGV4Y2VwdGlvbl90aHJvd24gPSBmYWxzZTsKKyAgdHJ5IHsKKyAgICBMaXN0PGludD4gYnVmID0gbmV3IExpc3Q8aW50Pi5maWxsZWQobnVtYmVyX29mX2ludHMsIC0xKTsKKyAgfSBvbiBPdXRPZk1lbW9yeUVycm9yIGNhdGNoIChleGMpIHsKKyAgICBleGNlcHRpb25fdGhyb3duID0gdHJ1ZTsKKyAgfQorICBFeHBlY3QuaXNUcnVlKGV4Y2VwdGlvbl90aHJvd24pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL2ludmFsaWRfdXJpX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9pbnZhbGlkX3VyaV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MTg2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9pbnZhbGlkX3VyaV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IGludmFsaWRfdXJpX3Rlc3Q7CisKKyAvLyBTaG91bGQgbm90IGNvbnRhaW4gIi8vIi4KK2ltcG9ydCAncGFja2FnZTovL2xpYjEuZGFydCc7IC8vIyAwMTogY29tcGlsZS10aW1lIGVycm9yCisKK3ZvaWQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2UvcGFja2FnZTFfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3BhY2thZ2UxX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4ODI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3BhY2thZ2UxX3Rlc3QuZGFydApAQCAtMCwwICsxLDEzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFBhY2thZ2VzPW5vbmUKKworbGlicmFyeSBwYWNrYWdlMV90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6cGFja2FnZTEuZGFydCcgYXMgcDE7CisKK21haW4oKSB7CisgIHAxLm1haW4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9wYWNrYWdlX2lzb2xhdGVfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3BhY2thZ2VfaXNvbGF0ZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzMGNiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9wYWNrYWdlX2lzb2xhdGVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBwYWNrYWdlX2lzb2xhdGVfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlcy9zaGFyZWQuZGFydCcgYXMgc2hhcmVkOworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworaW1wb3J0ICcuLi8uLi8uLi9wa2cvYXN5bmNfaGVscGVyL2xpYi9hc3luY19oZWxwZXIuZGFydCc7CitpbXBvcnQgJy4uLy4uLy4uL3BrZy9leHBlY3QvbGliL2V4cGVjdC5kYXJ0JzsKKworZXhwZWN0UmVzcG9uc2UoKSB7CisgIGFzeW5jU3RhcnQoKTsKKyAgdmFyIHJlY2VpdmVQb3J0ID0gbmV3IFJlY2VpdmVQb3J0KCk7CisgIHJlY2VpdmVQb3J0LmZpcnN0LnRoZW4oKG1zZykgeworICAgIEV4cGVjdC5lcXVhbHMoJ2lzb2xhdGUnLCBtc2cpOworICAgIEV4cGVjdC5lcXVhbHMoJ21haW4nLCBzaGFyZWQub3V0cHV0KTsKKyAgICBhc3luY0VuZCgpOworICB9KTsKKyAgcmV0dXJuIHJlY2VpdmVQb3J0OworfQorCit2b2lkIG1haW4oKSB7CisgIHsKKyAgICB2YXIgcmVwbHlQb3J0ID0gZXhwZWN0UmVzcG9uc2UoKS5zZW5kUG9ydDsKKyAgICBzaGFyZWQub3V0cHV0ID0gJ21haW4nOworICAgIElzb2xhdGUuc3Bhd24oaXNvbGF0ZV9tYWluLCByZXBseVBvcnQpOworICB9CisKKyAgeworICAgIC8vIFBhY2thZ2UgaW4gc3Bhd25VcmkoKSBvZiBzaWJsaW5nIGZpbGUuCisgICAgdmFyIHJlcGx5UG9ydCA9IGV4cGVjdFJlc3BvbnNlKCkuc2VuZFBvcnQ7CisgICAgc2hhcmVkLm91dHB1dCA9ICdtYWluJzsKKyAgICBJc29sYXRlLnNwYXduVXJpKFVyaS5wYXJzZSgnc2libGluZ19pc29sYXRlLmRhcnQnKSwgW10sIHJlcGx5UG9ydCk7CisgIH0KKworICB7CisgICAgLy8gUGFja2FnZSBpbiBzcGF3blVyaSgpIG9mIGZpbGUgaW4gZm9sZGVyLgorICAgIHZhciByZXBseVBvcnQgPSBleHBlY3RSZXNwb25zZSgpLnNlbmRQb3J0OworICAgIHNoYXJlZC5vdXRwdXQgPSAnbWFpbic7CisgICAgSXNvbGF0ZS5zcGF3blVyaSgKKyAgICAgICAgVXJpLnBhcnNlKCd0ZXN0X2ZvbGRlci9mb2xkZXJfaXNvbGF0ZS5kYXJ0JyksIFtdLCByZXBseVBvcnQpOworICB9Cit9CisKK3ZvaWQgaXNvbGF0ZV9tYWluKFNlbmRQb3J0IHJlcGx5VG8pIHsKKyAgc2hhcmVkLm91dHB1dCA9ICdpc29sYXRlJzsKKyAgcmVwbHlUby5zZW5kKHNoYXJlZC5vdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3BhY2thZ2VfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3BhY2thZ2VfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2U1MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2UvcGFja2FnZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2xpYnJhcnkgcGFja2FnZV90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6bGliMS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgb3V0cHV0ID0gJ21haW4nOworICAvLyBDYWxsIGFuIGltcG9ydGVkIGxpYiwgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgc29tZSBvdGhlcnMuCisgIGxpYjEoKTsKKworICAvLyBNYWtlIHN1cmUgdGhleSB3ZXJlIGFsbCByZWFjaGVkIHN1Y2Nlc3NmdWxseS4KKyAgaWYgKG91dHB1dCAhPSAnbWFpbnxsaWIxfGxpYjJ8bGliMycpIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoImxpYnJhcmllcyB3ZXJlIG5vdCByZWFjaGVkIHN1Y2Nlc3NmdWxseSIpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2JvdGhfZGlyX2FuZF9maWxlLy5wYWNrYWdlcyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvYm90aF9kaXJfYW5kX2ZpbGUvLnBhY2thZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWU3MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2JvdGhfZGlyX2FuZF9maWxlLy5wYWNrYWdlcwpAQCAtMCwwICsxIEBACitmb286Zm9vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvYm90aF9kaXJfYW5kX2ZpbGUvYm90aF9kaXJfYW5kX2ZpbGVfbm9pbXBvcnRzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvYm90aF9kaXJfYW5kX2ZpbGUvYm90aF9kaXJfYW5kX2ZpbGVfbm9pbXBvcnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE5NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9ib3RoX2Rpcl9hbmRfZmlsZS9ib3RoX2Rpcl9hbmRfZmlsZV9ub2ltcG9ydHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2xpYnJhcnkgYm90aF9kaXJfYW5kX2ZpbGVfbm9pbXBvcnRzX3Rlc3Q7CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9ib3RoX2Rpcl9hbmRfZmlsZS9mb28vZm9vLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2JvdGhfZGlyX2FuZF9maWxlL2Zvby9mb28uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTYwYmNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9ib3RoX2Rpcl9hbmRfZmlsZS9mb28vZm9vLmRhcnQKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgZm9vOworCitTdHJpbmcgYmFyID0gJ2dvb2QnOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9ib3RoX2Rpcl9hbmRfZmlsZS9wcmVmZXJzX3BhY2thZ2VzX2ZpbGVfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9ib3RoX2Rpcl9hbmRfZmlsZS9wcmVmZXJzX3BhY2thZ2VzX2ZpbGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmZjNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2JvdGhfZGlyX2FuZF9maWxlL3ByZWZlcnNfcGFja2FnZXNfZmlsZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2xpYnJhcnkgcHJlZmVyc19wYWNrYWdlc19maWxlX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnIGFzIGZvbzsKKworbWFpbigpIHsKKyAgaWYgKGZvby5iYXIgIT0gJ2dvb2QnKSB7CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigncGFja2FnZSAiZm9vIiB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseScpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2VtcHR5X3BhY2thZ2VzX2ZpbGUvLnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9lbXB0eV9wYWNrYWdlc19maWxlLy5wYWNrYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9lbXB0eV9wYWNrYWdlc19maWxlLy5wYWNrYWdlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9lbXB0eV9wYWNrYWdlc19maWxlL2VtcHR5X3BhY2thZ2VzX2ZpbGVfZGlzY292ZXJ5X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX2Rpc2NvdmVyeV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MTU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX2Rpc2NvdmVyeV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2xpYnJhcnkgZW1wdHlfcGFja2FnZXNfZmlsZV9kaXNjb3ZlcnlfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZvby9mb28uZGFydCc7CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9lbXB0eV9wYWNrYWdlc19maWxlL2VtcHR5X3BhY2thZ2VzX2ZpbGVfbm9pbXBvcnRzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX25vaW1wb3J0c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmRlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX25vaW1wb3J0c190ZXN0LmRhcnQKQEAgLTAsMCArMSwxMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz0ucGFja2FnZXMKKworLy8gV2UgZXhwZWN0IHRoaXMgdG8gbm90IGNhdXNlIGFueSBlcnJvcnMuIEFuIGVtcHR5IHBhY2thZ2VzIGZpbGUgaXMgdmFsaWQsCisvLyB5b3Ugc2hvdWxkIG9ubHkgcnVuIGludG8gcHJvYmxlbXMgaWYgeW91IHRyeSB0byByZXNvbHZlIGEgcGFja2FnZSBpbXBvcnQuCitsaWJyYXJ5IGVtcHR5X3BhY2thZ2VzX2ZpbGVfbm9pbXBvcnRzX3Rlc3Q7CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9lbXB0eV9wYWNrYWdlc19maWxlL2VtcHR5X3BhY2thZ2VzX2ZpbGVfb3B0aW9uX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX29wdGlvbl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwZjVmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvZW1wdHlfcGFja2FnZXNfZmlsZS9lbXB0eV9wYWNrYWdlc19maWxlX29wdGlvbl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz0ucGFja2FnZXMKKworbGlicmFyeSBlbXB0eV9wYWNrYWdlc19maWxlX29wdGlvbl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6Zm9vL2Zvby5kYXJ0JzsKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvZm9vL2Zvby5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2Zvby9mb28uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2Zvby9mb28uZGFydApAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBmb287CisKK1N0cmluZyBmb28gPSAnZm9vJzsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9pbnZhbGlkX3BhY2thZ2VfbmFtZS5wYWNrYWdlcyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9pbnZhbGlkX3BhY2thZ2VfbmFtZS5wYWNrYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzRkMjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2ludmFsaWRfcGFja2FnZV9uYW1lLnBhY2thZ2VzCkBAIC0wLDAgKzEsMiBAQAorLi46bm9uZXhpc3RlbnQvCitmb286Zm9vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9pbnZhbGlkX3BhY2thZ2VfbmFtZV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvaW52YWxpZF9wYWNrYWdlX25hbWVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjc4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvaW52YWxpZF9wYWNrYWdlX25hbWVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9aW52YWxpZF9wYWNrYWdlX25hbWUucGFja2FnZXMKKworbGlicmFyeSBpbnZhbGlkX3BhY2thZ2VfbmFtZV90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6Zm9vL2Zvby5kYXJ0JyBhcyBmb287CisKK21haW4oKSB7CisgIGlmIChmb28uZm9vICE9ICdmb28nKSB7CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigncGFja2FnZSAiZm9vIiB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseScpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvaW52YWxpZF91dGY4LnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2ludmFsaWRfdXRmOC5wYWNrYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGMwOWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2ludmFsaWRfdXRmOC5wYWNrYWdlcwpAQCAtMCwwICsxIEBACiv+OmZvby8KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9pbnZhbGlkX3V0ZjhfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL2ludmFsaWRfdXRmOF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ZmM4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9pbnZhbGlkX3V0ZjhfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1pbnZhbGlkX3V0ZjgucGFja2FnZXMKKworbGlicmFyeSBpbnZhbGlkX3V0ZjhfdGVzdDsKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvbm9uX2V4aXN0ZW50X3BhY2thZ2VzX2ZpbGVfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL25vbl9leGlzdGVudF9wYWNrYWdlc19maWxlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzczODBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL25vbl9leGlzdGVudF9wYWNrYWdlc19maWxlX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9bm9uX2V4aXN0ZW50LnBhY2thZ2VzCisKK2xpYnJhcnkgbm9uX2V4aXN0ZW50X3BhY2thZ2VzX2ZpbGVfdGVzdDsKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL2ludmFsaWQvc2FtZV9wYWNrYWdlX3R3aWNlLnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL3NhbWVfcGFja2FnZV90d2ljZS5wYWNrYWdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQ1N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL3NhbWVfcGFja2FnZV90d2ljZS5wYWNrYWdlcwpAQCAtMCwwICsxLDMgQEAKK2Zvbzpub25leGlzdGVudGRpci8KKyMgVGhpcyBvdmVycmlkZXMgdGhlIHByZXZpb3VzIGVudHJ5Citmb286Zm9vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9zYW1lX3BhY2thZ2VfdHdpY2VfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9pbnZhbGlkL3NhbWVfcGFja2FnZV90d2ljZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlZGI0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvaW52YWxpZC9zYW1lX3BhY2thZ2VfdHdpY2VfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9c2FtZV9wYWNrYWdlX3R3aWNlLnBhY2thZ2VzCisKK2xpYnJhcnkgc2FtZV9wYWNrYWdlX3R3aWNlX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnIGFzIGZvbzsKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfaW5fcGFyZW50Ly5wYWNrYWdlcyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnQvLnBhY2thZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWU3MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfaW5fcGFyZW50Ly5wYWNrYWdlcwpAQCAtMCwwICsxIEBACitmb286Zm9vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnQvZm9vL2Zvby5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX2luX3BhcmVudC9mb28vZm9vLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOWJkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnQvZm9vL2Zvby5kYXJ0CkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IGZvbzsKKworU3RyaW5nIGJhciA9ICdoZWxsbyc7CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfaW5fcGFyZW50L3N1Yi9wYWNrYWdlc19maWxlX2luX3BhcmVudF9ub2ltcG9ydHNfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX2luX3BhcmVudC9zdWIvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnRfbm9pbXBvcnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE5NGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX2luX3BhcmVudC9zdWIvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnRfbm9pbXBvcnRzX3Rlc3QuZGFydApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9bm9uZQorCitsaWJyYXJ5IHBhY2thZ2VzX2ZpbGVfaW5fcGFyZW50X25vaW1wb3J0c190ZXN0OworCittYWluKCkge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnQvc3ViL3BhY2thZ2VzX2ZpbGVfaW5fcGFyZW50X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnQvc3ViL3BhY2thZ2VzX2ZpbGVfaW5fcGFyZW50X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTUxZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX2luX3BhcmVudC9zdWIvcGFja2FnZXNfZmlsZV9pbl9wYXJlbnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9bm9uZQorCitsaWJyYXJ5IHBhY2thZ2VzX2ZpbGVfaW5fcGFyZW50X3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnIGFzIGZvbzsKKworbWFpbigpIHsKKyAgaWYgKGZvby5iYXIgIT0gJ2hlbGxvJykgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ3BhY2thZ2UgImZvbyIgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHknKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX29ubHkvLnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX29ubHkvLnBhY2thZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWU3MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfb25seS8ucGFja2FnZXMKQEAgLTAsMCArMSBAQAorZm9vOmZvby8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfb25seS9mb28vZm9vLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfb25seS9mb28vZm9vLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOWJkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9vbmx5L2Zvby9mb28uZGFydApAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBmb287CisKK1N0cmluZyBiYXIgPSAnaGVsbG8nOwpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX29ubHkvcGFja2FnZXNfZmlsZV9vbmx5X25vaW1wb3J0c190ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfb25seS9wYWNrYWdlc19maWxlX29ubHlfbm9pbXBvcnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk1MjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX29ubHkvcGFja2FnZXNfZmlsZV9vbmx5X25vaW1wb3J0c190ZXN0LmRhcnQKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFBhY2thZ2VzPW5vbmUKKworbGlicmFyeSBwYWNrYWdlc19maWxlX29ubHlfbm9pbXBvcnRzX3Rlc3Q7CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX29ubHkvcGFja2FnZXNfZmlsZV9vbmx5X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9vbmx5L3BhY2thZ2VzX2ZpbGVfb25seV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZjNiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9vbmx5L3BhY2thZ2VzX2ZpbGVfb25seV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1ub25lCisKK2xpYnJhcnkgcGFja2FnZXNfZmlsZV9vbmx5X3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnIGFzIGZvbzsKKworbWFpbigpIHsKKyAgaWYgKGZvby5iYXIgIT0gJ2hlbGxvJykgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ3BhY2thZ2UgImZvbyIgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHknKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9iYXIvYmFyLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2Jhci9iYXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYyY2IwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9iYXIvYmFyLmRhcnQKQEAgLTAsMCArMSw3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgYmFyOworCitTdHJpbmcgYmFyID0gJ2Jhcic7CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2Jhei9iYXouZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvYmF6L2Jhei5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDU5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2Jhei9iYXouZGFydApAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBiYXo7CisKK1N0cmluZyBiYXogPSAnYmF6JzsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvZW1wdHlfbGluZXMucGFja2FnZXMgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2VtcHR5X2xpbmVzLnBhY2thZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTA5OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2VtcHR5X2xpbmVzLnBhY2thZ2VzCkBAIC0wLDAgKzEsMjAgQEAKKworCisKKworZm9vOmZvby8KKworCitiYXI6YmFyLworCisKKworCisKKworCisKK2JhejpiYXovCisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2VtcHR5X2xpbmVzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvZW1wdHlfbGluZXNfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTU5N2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2VtcHR5X2xpbmVzX3Rlc3QuZGFydApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTUsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFBhY2thZ2VzPWVtcHR5X2xpbmVzLnBhY2thZ2VzCisKK2xpYnJhcnkgZW1wdHlfbGluZXNfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZvby9mb28uZGFydCcgYXMgZm9vOworaW1wb3J0ICdwYWNrYWdlOmJhci9iYXIuZGFydCcgYXMgYmFyOworaW1wb3J0ICdwYWNrYWdlOmJhei9iYXouZGFydCcgYXMgYmF6OworCittYWluKCkgeworICBpZiAoZm9vLmZvbyAhPSAnZm9vJykgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ3BhY2thZ2UgImZvbyIgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHknKTsKKyAgfQorICBpZiAoYmFyLmJhciAhPSAnYmFyJykgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ3BhY2thZ2UgImJhciIgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHknKTsKKyAgfQorICBpZiAoYmF6LmJheiAhPSAnYmF6JykgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ3BhY2thZ2UgImJheiIgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHknKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9lbXB0eV9wYWNrYWdlX2Rpci5wYWNrYWdlcyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvZW1wdHlfcGFja2FnZV9kaXIucGFja2FnZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1MmE3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvZW1wdHlfcGFja2FnZV9kaXIucGFja2FnZXMKQEAgLTAsMCArMSBAQAorZm9vOgpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9lbXB0eV9wYWNrYWdlX2Rpcl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2VtcHR5X3BhY2thZ2VfZGlyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2NkZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9lbXB0eV9wYWNrYWdlX2Rpcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1lbXB0eV9wYWNrYWdlX2Rpci5wYWNrYWdlcworCisvLyBJbiB0aGlzIHRlc3QsIHdlIGdpdmUgYSBwYWNrYWdlcyBmaWxlIHRoYXQgYXNzb2NpYXRlcyB0aGUgcGFja2FnZSAnZm9vJyB3aXRoCisvLyB0aGUgZW1wdHkgc3RyaW5nLiBUaGlzIGNhdXNlcyBib3RoIHRoZSBWTSBhbmQgZGFydDJqcyB0byByZXNvbHZlCisvLyAncGFja2FnZTpmb28nIGltcG9ydHMgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5LiBTbyB0aGUgaW1wb3J0IHN0YXRlbWVudAorLy8gYGltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnYCBpcyBlcXVpdmFsZW50IHRvIGBpbXBvcnQgJy9mb28uZGFydCdgLgorbGlicmFyeSBlbXB0eV9wYWNrYWdlX2Rpcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6Zm9vL2Zvby5kYXJ0JzsKKworbWFpbigpIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2Zvby9mb28uZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvZm9vL2Zvby5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWMwNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX2ZpbGVfc3RyYW5nZV9mb3JtYXR0aW5nL2Zvby9mb28uZGFydApAQCAtMCwwICsxLDcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbGlicmFyeSBmb287CisKK1N0cmluZyBmb28gPSAnZm9vJzsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvbWl4ZWRfbGluZV9lbmRzLnBhY2thZ2VzIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9taXhlZF9saW5lX2VuZHMucGFja2FnZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkM2U3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvbWl4ZWRfbGluZV9lbmRzLnBhY2thZ2VzCkBAIC0wLDAgKzEsMyBAQAorZm9vOmZvby8KK2JhcjpiYXIvDQorYmF6OmJhei8KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvbWl4ZWRfbGluZV9lbmRzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfZmlsZV9zdHJhbmdlX2Zvcm1hdHRpbmcvbWl4ZWRfbGluZV9lbmRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTllYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19maWxlX3N0cmFuZ2VfZm9ybWF0dGluZy9taXhlZF9saW5lX2VuZHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZXM9bWl4ZWRfbGluZV9lbmRzLnBhY2thZ2VzCisKK2xpYnJhcnkgbWl4ZWRfbGluZV9lbmRzX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmb28vZm9vLmRhcnQnIGFzIGZvbzsKK2ltcG9ydCAncGFja2FnZTpiYXIvYmFyLmRhcnQnIGFzIGJhcjsKK2ltcG9ydCAncGFja2FnZTpiYXovYmF6LmRhcnQnIGFzIGJhejsKKworbWFpbigpIHsKKyAgaWYgKGZvby5mb28gIT0gJ2ZvbycpIHsKKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdwYWNrYWdlICJmb28iIHdhcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5Jyk7CisgIH0KKyAgaWYgKGJhci5iYXIgIT0gJ2JhcicpIHsKKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdwYWNrYWdlICJiYXIiIHdhcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5Jyk7CisgIH0KKyAgaWYgKGJhei5iYXogIT0gJ2JheicpIHsKKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdwYWNrYWdlICJiYXoiIHdhcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5Jyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfb3B0aW9uX29ubHkvcGFja2FnZXNfb3B0aW9uX29ubHlfbm9pbXBvcnRzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfb3B0aW9uX29ubHkvcGFja2FnZXNfb3B0aW9uX29ubHlfbm9pbXBvcnRzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmUxY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19vcHRpb25fb25seS9wYWNrYWdlc19vcHRpb25fb25seV9ub2ltcG9ydHNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1zdWIvLnBhY2thZ2VzCisKK2xpYnJhcnkgcGFja2FnZXNfb3B0aW9uX29ubHlfbm9pbXBvcnRzX3Rlc3Q7CisKK21haW4oKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19vcHRpb25fb25seS9wYWNrYWdlc19vcHRpb25fb25seV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX29wdGlvbl9vbmx5L3BhY2thZ2VzX29wdGlvbl9vbmx5X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZkY2RlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19vcHRpb25fb25seS9wYWNrYWdlc19vcHRpb25fb25seV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQYWNrYWdlcz1zdWIvLnBhY2thZ2VzCisKK2xpYnJhcnkgcGFja2FnZXNfb3B0aW9uX29ubHlfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZvby9mb28uZGFydCcgYXMgZm9vOworCittYWluKCkgeworICBpZiAoZm9vLmJhciAhPSAnaGVsbG8nKSB7CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigncGFja2FnZSAiZm9vIiB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseScpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX29wdGlvbl9vbmx5L3N1Yi8ucGFja2FnZXMgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2NlbmFyaW9zL3BhY2thZ2VzX29wdGlvbl9vbmx5L3N1Yi8ucGFja2FnZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhZTczNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfb3B0aW9uX29ubHkvc3ViLy5wYWNrYWdlcwpAQCAtMCwwICsxIEBACitmb286Zm9vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfb3B0aW9uX29ubHkvc3ViL2Zvby9mb28uZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zY2VuYXJpb3MvcGFja2FnZXNfb3B0aW9uX29ubHkvc3ViL2Zvby9mb28uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ5YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3NjZW5hcmlvcy9wYWNrYWdlc19vcHRpb25fb25seS9zdWIvZm9vL2Zvby5kYXJ0CkBAIC0wLDAgKzEsNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IGZvbzsKKworU3RyaW5nIGJhciA9ICdoZWxsbyc7CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2libGluZ19pc29sYXRlLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2Uvc2libGluZ19pc29sYXRlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0MTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZS9zaWJsaW5nX2lzb2xhdGUuZGFydApAQCAtMCwwICsxLDE0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgc2libGluZ19pc29sYXRlOworCitpbXBvcnQgJ3BhY2thZ2U6c2hhcmVkLmRhcnQnIGFzIHNoYXJlZDsKK2ltcG9ydCAnZGFydDppc29sYXRlJzsKKworLy8gVGhpcyBmaWxlIGlzIHNwYXduZWQgZnJvbSBwYWNrYWdlX2lzb2xhdGVfdGVzdC5kYXJ0CittYWluKExpc3Q8U3RyaW5nPiBhcmdzLCBTZW5kUG9ydCByZXBseSkgeworICBzaGFyZWQub3V0cHV0ID0gJ2lzb2xhdGUnOworICByZXBseS5zZW5kKHNoYXJlZC5vdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3Rlc3RfZm9sZGVyL2ZvbGRlcl9pc29sYXRlLmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2UvdGVzdF9mb2xkZXIvZm9sZGVyX2lzb2xhdGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU2NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wYWNrYWdlL3Rlc3RfZm9sZGVyL2ZvbGRlcl9pc29sYXRlLmRhcnQKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IGZvbGRlcl9pc29sYXRlOworCisvLyBUaGlzIGlzIGEgcGFja2FnZSB0aGF0J3Mgbm90IGF2YWlsYWJsZSB0byB0aGUgbWFpbiBpc29sYXRlCitpbXBvcnQgJ3BhY2thZ2U6Zm9sZGVyX2xpYi5kYXJ0JyBhcyBpc29sYXRlX3BhY2thZ2U7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CisKKy8vIFRoaXMgZmlsZSBpcyBzcGF3bmVkIGZyb20gcGFja2FnZV9pc29sYXRlX3Rlc3QuZGFydAorbWFpbihMaXN0PFN0cmluZz4gYXJncywgU2VuZHBvcnQgcmVwbHlUbykgeworICBpc29sYXRlX3BhY2thZ2UuY291bnQgPSAxOworICByZXBseVRvLnNlbmQoJ2lzb2xhdGUnKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcGFja2FnZXNfZmlsZV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2VzX2ZpbGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzJhYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhY2thZ2VzX2ZpbGVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTAxMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1lbmFibGUtaXNvbGF0ZS1ncm91cHMKKy8vIFZNT3B0aW9ucz0tLW5vLWVuYWJsZS1pc29sYXRlLWdyb3VwcworCitpbXBvcnQgImRhcnQ6YXN5bmMiOworaW1wb3J0ICJkYXJ0OmlvIjsKK2ltcG9ydCAiZGFydDpjb252ZXJ0IiBzaG93IGpzb247CitpbXBvcnQgInBhY2thZ2U6cGF0aC9wYXRoLmRhcnQiIGFzIHA7CitpbXBvcnQgInBhY2thZ2U6YXN5bmNfaGVscGVyL2FzeW5jX2hlbHBlci5kYXJ0IjsKKworLy8vIFJvb3QgZGlyZWN0b3J5IG9mIGdlbmVyYXRlZCBmaWxlcy4KKy8vLyBQYXRoIGNvbnRhaW5zIHRyYWlsaW5nIHNsYXNoLgorLy8vIEVhY2ggY29uZmlndXJhdGlvbiBnZXRzIGl0cyBvd24gc3ViLWRpcmVjdG9yeS4KK0RpcmVjdG9yeSBmaWxlUm9vdDsKKworLy8vIFNoYXJlZCBIVFRQIHNlcnZlciBzZXJ2aW5nIHRoZSBmaWxlcyBpbiBbaHR0cEZpbGVzXS4KKy8vLyBFYWNoIGNvbmZpZ3VyYXRpb24gZ2V0cyBpdHMgb3duICJzdWItZGlyIiBlbnRyeSBpbiBgaHR0cEZpbGVzYC4KK0h0dHBTZXJ2ZXIgaHR0cFNlcnZlcjsKKworLy8vIERpcmVjdG9yeSBzdHJ1Y3R1cmUgc2VydmVkIGJ5IEhUVFAgc2VydmVyLgorTWFwPFN0cmluZywgZHluYW1pYz4gaHR0cEZpbGVzID0ge307CisKKy8vLyBMaXN0IG9mIGNvbmZpZ3VyYXRpb25zLgorTGlzdDxDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9ucyA9IFtdOworCisvLy8gQ29sbGVjdGlvbiBvZiBmYWlsaW5nIHRlc3RzIGFuZCB0aGVpciBmYWlsdXJlIG1lc3NhZ2VzLgorLy8vCisvLy8gRWFjaCB0ZXN0IG1heSBmYWlsIGluIG1vcmUgdGhhbiBvbmUgd2F5LgordmFyIGZhaWxpbmdUZXN0cyA9IDxTdHJpbmcsIExpc3Q8U3RyaW5nPj57fTsKKworbWFpbigpIGFzeW5jIHsKKyAgYXN5bmNTdGFydCgpOworICBhd2FpdCBzZXRVcCgpOworCisgIGF3YWl0IHJ1blRlc3RzKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAwMTogb2sKKyAgYXdhaXQgcnVuVGVzdHMoW3NwYXduXSk7IC8vICAgICAgICAgICAgICAgICAgLy8jIDAyOiBvaworICBhd2FpdCBydW5UZXN0cyhbc3Bhd24sIHNwYXduXSk7IC8vICAgICAgICAgICAvLyMgMDM6IG9rCisgIGF3YWl0IHJ1blRlc3RzKFtzcGF3blVyaUluaGVyaXRdKTsgLy8gICAgICAgIC8vIyAwNDogb2sKKyAgYXdhaXQgcnVuVGVzdHMoW3NwYXduVXJpSW5oZXJpdCwgc3Bhd25dKTsgLy8gLy8jIDA1OiBvaworICBhd2FpdCBydW5UZXN0cyhbc3Bhd24sIHNwYXduVXJpSW5oZXJpdF0pOyAvLyAvLyMgMDY6IG9rCisKKyAgLy8gVGVzdCB0aGF0IHNwYXduaW5nIGEgbmV3IFZNIHdpdGggZmlsZSBwYXRocyBpbnN0ZWFkIG9mIFVSSXMgYXMgYXJndW1lbnRzCisgIC8vIGdpdmVzIHRoZSBzYW1lIFVSSXMgaW4gdGhlIGludGVybmFsIHZhbHVlcy4KKyAgYXdhaXQgcnVuVGVzdHMoW2FzUGF0aF0pOyAvLyAgICAgICAgICAgICAgICAgLy8jIDA3OiBvaworCisgIC8vIFRlc3QgdGhhdCBzcGF3blVyaSBjYW4gcmVwcm9kdWNlIHRoZSBiZWhhdmlvciBvZiBWTSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycworICAvLyBleGFjdGx5LgorICAvLyAoRG9uJ3QgcnVuIGFsbCBjb25maWd1cmF0aW9uIGNvbWJpbmF0aW9ucyBpbiB0aGUgc2FtZSB0ZXN0LCBzbworICAvLyB1bnJvbGwgdGhlIGNvbmZpZ3VyYXRpb25zIGludG8gbXVsdGlwbGUgZ3JvdXBzIGFuZCBydW4gZWFjaCBncm91cAorICAvLyBhcyBpdHMgb3duIG11bHRpdGVzdC4KKyAgeworICAgIHZhciBncm91cENvdW50ID0gODsKKyAgICB2YXIgZ3JvdXBzID0gbmV3IExpc3QuZ2VuZXJhdGUoOCwgKF8pID0+IFtdKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICBncm91cHNbaSAlIGdyb3VwQ291bnRdLmFkZChjb25maWd1cmF0aW9uc1tpXSk7CisgICAgfQorICAgIHZhciBncm91cCA9IC0xOworICAgIGdyb3VwID0gMDsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTA6IG9rCisgICAgZ3JvdXAgPSAxOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxMTogb2sKKyAgICBncm91cCA9IDI7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDEyOiBvaworICAgIGdyb3VwID0gMzsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTM6IG9rCisgICAgZ3JvdXAgPSA0OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNDogb2sKKyAgICBncm91cCA9IDU7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8jIDE1OiBvaworICAgIGdyb3VwID0gNjsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyMgMTY6IG9rCisgICAgZ3JvdXAgPSA3OyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIyAxNzogb2sKKyAgICBpZiAoZ3JvdXAgPj0gMCkgeworICAgICAgZm9yICh2YXIgb3RoZXIgaW4gZ3JvdXBzW2dyb3VwXSkgeworICAgICAgICBhd2FpdCBydW5UZXN0cyhbc3Bhd25VcmlPdGhlcihvdGhlcildKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBhd2FpdCB0ZWFyRG93bigpOworCisgIGlmIChmYWlsaW5nVGVzdHMuaXNOb3RFbXB0eSkgeworICAgIHByaW50KCJFcnJvcnMgZm91bmQgaW4gdGVzdHM6Iik7CisgICAgZmFpbGluZ1Rlc3RzLmZvckVhY2goKHRlc3QsIGFjdHVhbCkgeworICAgICAgcHJpbnQoIiR0ZXN0OlxuICAke2FjdHVhbC5qb2luKCJcbiAgIil9Iik7CisgICAgfSk7CisgICAgZXhpdCgyNTUpOworICB9CisKKyAgYXN5bmNFbmQoKTsKK30KKworLy8vIFRlc3QgcnVubmluZyB0aGUgdGVzdCBvZiB0aGUgY29uZmlndXJhdGlvbiB0aHJvdWdoIFtJc29sYXRlLnNwYXduXS4KKy8vLworLy8vIFRoaXMgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGV4cGVjdGVkIHJlc3VsdHMgY29tcGFyZWQgdG8gcnVubmluZyBpdAorLy8vIGRpcmVjdGx5LgorQ29uZmlndXJhdGlvbiBzcGF3bihDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgcmV0dXJuIGNvbmYudXBkYXRlKAorICAgICAgZGVzY3JpcHRpb246IGNvbmYuZGVzY3JpcHRpb24gKyAiL3NwYXduIiwKKyAgICAgIG1haW46ICJzcGF3bk1haW4iLAorICAgICAgbmV3QXJnczogW2NvbmYubWFpblR5cGVdLAorICAgICAgZXhwZWN0OiBudWxsKTsKK30KKworLy8vIFRlc3RzIHJ1bm5pbmcgYSBzcGF3blVyaSBvbiB0b3Agb2YgdGhlIGNvbmZpZ3VyYXRpb24gYmVmb3JlIHRlc3RpbmcuCisvLy8KKy8vLyBUaGUgYHNwYXduVXJpYCBjYWxsIGhhcyBubyBleHBsaWNpdCByb290IG9yIGNvbmZpZyBwYXJhbWV0ZXIsIGFuZAorLy8vIHNob3VsZG4ndCBzZWFyY2ggZm9yIG9uZSwgc28gaXQgaW1wbGljaXRseSBpbmhlcml0cyB0aGUgY3VycmVudCBpc29sYXRlJ3MKKy8vLyBhY3R1YWwgcm9vdCBvciBjb25maWd1cmF0aW9uLgorQ29uZmlndXJhdGlvbiBzcGF3blVyaUluaGVyaXQoQ29uZmlndXJhdGlvbiBjb25mKSB7CisgIGlmIChjb25mLmV4cGVjdFsiaXJvb3QiXSA9PSBudWxsICYmCisgICAgICBjb25mLmV4cGVjdFsiaWNvbmYiXSA9PSBudWxsICYmCisgICAgICBjb25mLmV4cGVjdFsicGNvbmYiXSAhPSBudWxsKSB7CisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBmaWxlIGRpZG4ndCBleGlzdC4KKyAgICAvLyBzcGF3bmluZyBhIG5ldyBVUkkgdG8gImluaGVyaXQiIHRoYXQgd2lsbCBhY3R1YWxseSBkbyBhbiBhdXRvbWF0aWMKKyAgICAvLyBwYWNrYWdlIHJlc29sdXRpb24gc2VhcmNoIHdpdGggcmVzdWx0cyB0aGF0IGFyZSB1bnByZWRpY3RhYmxlLgorICAgIC8vIFRoYXQgYmVoYXZpb3Igd2lsbCBiZSB0ZXN0ZWQgaW4gYSBzZXR0aW5nIHdoZXJlIHdlIGhhdmUgbW9yZSBjb250cm9sIG92ZXIKKyAgICAvLyB0aGUgZmlsZXMgYXJvdW5kIHRoZSBzcGF3bmVkIFVSSS4KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICByZXR1cm4gY29uZi51cGRhdGUoCisgICAgICBkZXNjcmlwdGlvbjogY29uZi5kZXNjcmlwdGlvbiArICIvc3Bhd25VcmktaW5oZXJpdCIsCisgICAgICBtYWluOiAic3Bhd25VcmlNYWluIiwKKyAgICAgIC8vIGVuY29kZSBudWxsIHBhcmFtZXRlcnMgYXMgIi0iLiBXaW5kb3dzIGZhaWxzIGlmIHVzaW5nIGVtcHR5IHN0cmluZy4KKyAgICAgIG5ld0FyZ3M6IFsKKyAgICAgICAgY29uZi5tYWluRmlsZSwKKyAgICAgICAgIi0iLAorICAgICAgICAiLSIsCisgICAgICAgICJmYWxzZSIKKyAgICAgIF0sCisgICAgICBleHBlY3Q6IHsKKyAgICAgICAgInByb290IjogY29uZi5leHBlY3RbImlyb290Il0sCisgICAgICAgICJwY29uZiI6IGNvbmYuZXhwZWN0WyJpY29uZiJdLAorICAgICAgfSk7Cit9CisKKy8vLyBUZXN0cyBydW5uaW5nIGEgc3Bhd25Vcmkgd2l0aCBhbiBleHBsaWNpdCBjb25maWd1cmF0aW9uIGRpZmZlcmVudAorLy8vIGZyb20gdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24uCisvLy8KKy8vLyBEdXBsaWNhdGVzIHRoZSBleHBsaWNpdCBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cyB0byB0aGUgc3Bhd25lZCBpc29sYXRlLgorQ29uZmlndXJhdGlvblRyYW5zZm9ybWVyIHNwYXduVXJpT3RoZXIoQ29uZmlndXJhdGlvbiBvdGhlcikgeworICByZXR1cm4gKENvbmZpZ3VyYXRpb24gY29uZikgeworICAgIGJvb2wgc2VhcmNoID0gKG90aGVyLmNvbmZpZyA9PSBudWxsKSAmJiAob3RoZXIucm9vdCA9PSBudWxsKTsKKyAgICByZXR1cm4gY29uZi51cGRhdGUoCisgICAgICAgIGRlc2NyaXB0aW9uOiAiJHtjb25mLmRlc2NyaXB0aW9ufSAtc3Bhd25VcmktPiAke290aGVyLmRlc2NyaXB0aW9ufSIsCisgICAgICAgIG1haW46ICJzcGF3blVyaU1haW4iLAorICAgICAgICBuZXdBcmdzOiBbCisgICAgICAgICAgb3RoZXIubWFpbkZpbGUsCisgICAgICAgICAgb3RoZXIuY29uZmlnID8/ICItIiwKKyAgICAgICAgICBvdGhlci5yb290ID8/ICItIiwKKyAgICAgICAgICAiJHNlYXJjaCIKKyAgICAgICAgXSwKKyAgICAgICAgZXhwZWN0OiBvdGhlci5leHBlY3QpOworICB9OworfQorCisvLy8gQ29udmVydCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyB0byBmaWxlIHBhdGhzLgorLy8vCisvLy8gVGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCB3aXRoIGBzcGF3blVyaWAuCitDb25maWd1cmF0aW9uIGFzUGF0aChDb25maWd1cmF0aW9uIGNvbmYpIHsKKyAgYm9vbCBjaGFuZ2UgPSBmYWxzZTsKKworICBTdHJpbmcgdG9QYXRoKFN0cmluZyBzdHJpbmcpIHsKKyAgICBpZiAoc3RyaW5nID09IG51bGwpIHJldHVybiBudWxsOworICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgY2hhbmdlID0gdHJ1ZTsKKyAgICAgIHJldHVybiBuZXcgRmlsZS5mcm9tVXJpKFVyaS5wYXJzZShzdHJpbmcpKS5wYXRoOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5nOworICB9CisKKyAgdmFyIG1haW5GaWxlID0gdG9QYXRoKGNvbmYubWFpbkZpbGUpOworICB2YXIgcm9vdCA9IHRvUGF0aChjb25mLnJvb3QpOworICB2YXIgY29uZmlnID0gdG9QYXRoKGNvbmYuY29uZmlnKTsKKyAgaWYgKCFjaGFuZ2UpIHJldHVybiBudWxsOworICByZXR1cm4gY29uZi51cGRhdGUoCisgICAgICBkZXNjcmlwdGlvbjogY29uZi5kZXNjcmlwdGlvbiArICIvYXMgcGF0aCIsCisgICAgICBtYWluRmlsZTogbWFpbkZpbGUsCisgICAgICByb290OiByb290LAorICAgICAgY29uZmlnOiBjb25maWcpOworfQorCisvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnV0dXJlIHNldFVwKCkgYXN5bmMgeworICBmaWxlUm9vdCA9IGNyZWF0ZVRlbXBEaXIoKTsKKyAgLy8gcHJpbnQoIkZJTEVTOiAkZmlsZVJvb3QiKTsKKyAgaHR0cFNlcnZlciA9IGF3YWl0IHN0YXJ0U2VydmVyKGh0dHBGaWxlcyk7CisgIC8vIHByaW50KCJIVFRQUzogJHtodHRwU2VydmVyLmFkZHJlc3MuYWRkcmVzc306JHtodHRwU2VydmVyLnBvcnR9Iik7CisgIGNyZWF0ZUNvbmZpZ3VyYXRpb25zKCk7Cit9CisKK0Z1dHVyZSB0ZWFyRG93bigpIGFzeW5jIHsKKyAgZmlsZVJvb3QuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOworICBhd2FpdCBodHRwU2VydmVyLmNsb3NlKCk7Cit9CisKK3R5cGVkZWYgQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uVHJhbnNmb3JtZXIoQ29uZmlndXJhdGlvbiBjb25mKTsKKworRnV0dXJlIHJ1blRlc3RzKFtMaXN0PENvbmZpZ3VyYXRpb25UcmFuc2Zvcm1lcj4gdHJhbnNmb3JtYXRpb25zXSkgYXN5bmMgeworICBvdXRlcjoKKyAgZm9yICh2YXIgY29uZmlnIGluIGNvbmZpZ3VyYXRpb25zKSB7CisgICAgaWYgKHRyYW5zZm9ybWF0aW9ucyAhPSBudWxsKSB7CisgICAgICBmb3IgKGludCBpID0gdHJhbnNmb3JtYXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGNvbmZpZyA9IHRyYW5zZm9ybWF0aW9uc1tpXShjb25maWcpOworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICBjb250aW51ZSBvdXRlcjsgLy8gQ2FuIGJlIHVzZWQgdG8gc2tpcCBzb21lIHRlc3RzLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGF3YWl0IHRlc3RDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhIGNvbWJpbmF0aW9uIG9mIGNvbmZpZ3VyYXRpb25zIGZvciBydW5uaW5nIHRoZSBEYXJ0IFZNLgorLy8KKy8vIFRoZSBjb21iaW5hdGlvbnMgY292ZXJzIG1vc3QgY29uZmlndXJhdGlvbnMgb2YgaW1wbGljaXQgYW5kIGV4cGxpY2l0CisvLyBwYWNrYWdlIGNvbmZpZ3VyYXRpb25zIG92ZXIgYm90aCBmaWxlOiBhbmQgaHR0cDogZmlsZSBzb3VyY2VzLgorLy8gSXQgYWxzbyBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGZvciBhIFZNCisvLyBydW4gaW4gdGhhdCBjb25maWd1cmF0aW9uLgorLy8KKy8vICogYFByb2Nlc3MucGFja2FnZVJvb3RgCisvLyAqIGBQcm9jZXNzLnBhY2thZ2VDb25maWdgCisvLyAqIGBJc29sYXRlLnBhY2thZ2VSb290YAorLy8gKiBgSXNvbGF0ZS5wYWNrYWdlUm9vdGAKKy8vICogYElzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmlgIG9mIHZhcmlvdXMgaW5wdXRzLgorLy8gKiBBIHZhcmlhYmxlIGRlZmluZWQgaW4gYSBsaWJyYXJ5IGxvYWRlZCB1c2luZyBhIGBwYWNrYWdlOmAgVVJJLgorLy8KKy8vIFRoZSBjb25maWd1cmF0aW9ucyBhbGwgaGF2ZSBVUklzIGFzIGByb290YCwgYGNvbmZpZ2AgYW5kIGBtYWluRmlsZWAgc3RyaW5ncywKKy8vIGhhdmUgZW1wdHkgYXJndW1lbnQgbGlzdHMgYW5kIGBtYWluRmlsZWAgcG9pbnRzIHRvIHRoZSBgbWFpbi5kYXJ0YCBmaWxlLgordm9pZCBjcmVhdGVDb25maWd1cmF0aW9ucygpIHsKKyAgYWRkKFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIG1haW5EaXIsCisgICAgICB7U3RyaW5nIHJvb3QsIFN0cmluZyBjb25maWcsIE1hcCBmaWxlLCBNYXAgaHR0cCwgTWFwIGV4cGVjdH0pIHsKKyAgICB2YXIgaWQgPSBmcmVzaE5hbWUoImNvbmYiKTsKKworICAgIGZpbGUgPz89IHt9OworICAgIGh0dHAgPz89IHt9OworCisgICAgLy8gRml4LXVwIHBhdGhzLgorICAgIFN0cmluZyBmaWxlVXJpID0gZmlsZVJvb3QudXJpLnJlc29sdmUoIiRpZC8iKS50b1N0cmluZygpOworICAgIFN0cmluZyBodHRwVXJpID0KKyAgICAgICAgImh0dHA6Ly8ke2h0dHBTZXJ2ZXIuYWRkcmVzcy5hZGRyZXNzfToke2h0dHBTZXJ2ZXIucG9ydH0vJGlkLyI7CisKKyAgICBTdHJpbmcgZml4UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgcmV0dXJuIHBhdGg/LnJlcGxhY2VBbGxNYXBwZWQoZmlsZUh0dHBSZWdleHAsIChtYXRjaCkgeworICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIlZmlsZS8iLCBtYXRjaC5zdGFydCkpIHJldHVybiBmaWxlVXJpOworICAgICAgICByZXR1cm4gaHR0cFVyaTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgZml4UGF0aHMoTWFwIGRpcnMpIHsKKyAgICAgIGZvciAodmFyIG5hbWUgaW4gZGlycy5rZXlzKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGRpcnNbbmFtZV07CisgICAgICAgIGlmICh2YWx1ZSBpcyBNYXApIHsKKyAgICAgICAgICBNYXAgc3ViRGlyID0gdmFsdWU7CisgICAgICAgICAgZml4UGF0aHMoc3ViRGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBmaXhQYXRoKHZhbHVlKTsKKyAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gdmFsdWUpIGRpcnNbbmFtZV0gPSBuZXdWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghbWFpbkRpci5lbmRzV2l0aCgiLyIpKSBtYWluRGlyICs9ICIvIjsKKyAgICAvLyBJbnNlcnQgbWFpbiBmaWxlcyBpbnRvIHRoZSBtYWluLWRpciBtYXAuCisgICAgTWFwIG1haW5EaXJNYXA7CisgICAgeworICAgICAgaWYgKG1haW5EaXIuc3RhcnRzV2l0aCgiJWZpbGUvIikpIHsKKyAgICAgICAgbWFpbkRpck1hcCA9IGZpbGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYWluRGlyTWFwID0gaHR0cDsKKyAgICAgIH0KKyAgICAgIHZhciBwYXJ0cyA9IG1haW5EaXIuc3BsaXQoJy8nKTsKKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7CisgICAgICAgIHZhciBkaXJOYW1lID0gcGFydHNbaV07CisgICAgICAgIG1haW5EaXJNYXAgPSBtYWluRGlyTWFwW2Rpck5hbWVdID8/IChtYWluRGlyTWFwW2Rpck5hbWVdID0ge30pOworICAgICAgfQorICAgIH0KKworICAgIG1haW5EaXJNYXBbIm1haW4iXSA9IHRlc3RNYWluOworICAgIG1haW5EaXJNYXBbInNwYXduTWFpbiJdID0gc3Bhd25NYWluLnJlcGxhY2VBbGwoIiVtYWluRGlyLyIsIG1haW5EaXIpOworICAgIG1haW5EaXJNYXBbInNwYXduVXJpTWFpbiJdID0gc3Bhd25VcmlNYWluOworCisgICAgbWFpbkRpciA9IGZpeFBhdGgobWFpbkRpcik7CisgICAgcm9vdCA9IGZpeFBhdGgocm9vdCk7CisgICAgY29uZmlnID0gZml4UGF0aChjb25maWcpOworICAgIGZpeFBhdGhzKGZpbGUpOworICAgIGZpeFBhdGhzKGh0dHApOworICAgIC8vIFRoZXNlIGV4cGVjdGF0aW9ucyBhcmUgZGVmYXVsdC4gSWYgbm90IG92ZXJyaWRkZW4gdGhlIHZhbHVlIHdpbGwgYmUKKyAgICAvLyBleHBlY3RlZCB0byBiZSBudWxsLiBUaGF0IGlzLCB5b3UgY2FuJ3QgYXZvaWQgdGVzdGluZyB0aGUgYWN0dWFsCisgICAgLy8gdmFsdWUgb2YgdGhlc2UsIHlvdSBjYW4gb25seSBjaGFuZ2Ugd2hhdCB2YWx1ZSB0byBleHBlY3QuCisgICAgLy8gRm9yIHZhbHVlcyBub3QgaW5jbHVkZWQgaGVyZSAoY29tbWVudGVkIG91dCksIHRoZSByZXN1bHQgaXMgbm90IHRlc3RlZAorICAgIC8vIHVubGVzcyBhIHZhbHVlIChtYXliZSBudWxsKSBpcyBwcm92aWRlZC4KKyAgICBmaXhQYXRocyhleHBlY3QpOworCisgICAgZXhwZWN0ID0geworICAgICAgInBjb25mIjogbnVsbCwKKyAgICAgICJwcm9vdCI6IG51bGwsCisgICAgICAiaWNvbmYiOiBudWxsLAorICAgICAgImlyb290IjogbnVsbCwKKyAgICAgICJmb28iOiBudWxsLAorICAgICAgImZvby8iOiBudWxsLAorICAgICAgImZvby9iYXIiOiBudWxsLAorICAgICAgImZvby54IjogInF1eCIsCisgICAgICAiYmFyL2JhciI6IG51bGwsCisgICAgICAicmVsYXRpdmUiOiAicmVsYXRpdmUvcGF0aCIsCisgICAgICAibm9ucGtnIjogImh0dHA6Ly9leGFtcGxlLm9yZy9maWxlIgorICAgIH0uLmFkZEFsbChleHBlY3QgPz8gY29uc3Qge30pOworCisgICAgLy8gQWRkIGh0dHAgZmlsZXMgdG8gdGhlIGh0dHAgc2VydmVyLgorICAgIGlmIChodHRwLmlzTm90RW1wdHkpIHsKKyAgICAgIGh0dHBGaWxlc1tpZF0gPSBodHRwOworICAgIH0KKyAgICAvLyBBZGQgZmlsZSBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCisgICAgaWYgKGZpbGUuaXNOb3RFbXB0eSkgeworICAgICAgY3JlYXRlRmlsZXMoZmlsZVJvb3QsIGlkLCBmaWxlKTsKKyAgICB9CisKKyAgICBjb25maWd1cmF0aW9ucy5hZGQobmV3IENvbmZpZ3VyYXRpb24oCisgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwKKyAgICAgICAgcm9vdDogcm9vdCwKKyAgICAgICAgY29uZmlnOiBjb25maWcsCisgICAgICAgIG1haW5GaWxlOiBtYWluRGlyICsgIm1haW4uZGFydCIsCisgICAgICAgIGFyZ3M6IGNvbnN0IFtdLAorICAgICAgICBleHBlY3Q6IGV4cGVjdCkpOworICB9CisKKyAgLy8gVGhlIGB0ZXN0YCBmdW5jdGlvbiBjYW4gZ2VuZXJhdGUgZmlsZSBvciBodHRwIHJlc291cmNlcy4KKyAgLy8gSXQgcmVwbGFjZXMgIiVmaWxlLyIgd2l0aCBVUkkgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGdlbmVyYXRlZCBmaWxlcyBhbmQKKyAgLy8gIiVodHRwLyIgd2l0aCB0aGUgVVJJIG9mIHRoZSBIVFRQIHNlcnZlcidzIHJvb3QgaW4gYXBwcm9wcmlhdGUgY29udGV4dHMKKyAgLy8gKGFsbCBmaWxlIGNvbnRlbnRzIGFuZCBwYXJhbWV0ZXJzKS4KKworICAvLyBUZXN0cyB0aGF0IG9ubHkgdXNlIG9uZSBzY2hlbWUgdG8gYWNjZXNzIGZpbGVzLgorICBmb3IgKHZhciBzY2hlbWUgaW4gWyJmaWxlIiwgImh0dHAiXSkgeworICAgIC8vLyBSdW4gYSB0ZXN0IGluIHRoZSBjdXJyZW50IHNjaGVtZS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGZpbGVzIGFyZSBzZXJ2ZWQgZWl0aGVyIHRocm91Z2ggSFRUUCBvciBpbiBhIGxvY2FsIGRpcmVjdG9yeS4KKyAgICAvLy8gVXNlICIlJHNjaGVtZS8iIHRvIHJlZmVyIHRvIHRoZSByb290IG9mIHRoZSBzZXJ2ZWQgZmlsZXMuCisgICAgYWRkU2NoZW1lKGRlc2NyaXB0aW9uLCBtYWluLCB7ZXhwZWN0LCBmaWxlcywgYXJncywgcm9vdCwgY29uZmlnfSkgeworICAgICAgYWRkKCIkc2NoZW1lLyRkZXNjcmlwdGlvbiIsIG1haW4sCisgICAgICAgICAgZXhwZWN0OiBleHBlY3QsCisgICAgICAgICAgcm9vdDogcm9vdCwKKyAgICAgICAgICBjb25maWc6IGNvbmZpZywKKyAgICAgICAgICBmaWxlOiAoc2NoZW1lID09ICJmaWxlIikgPyBmaWxlcyA6IG51bGwsCisgICAgICAgICAgaHR0cDogKHNjaGVtZSA9PSAiaHR0cCIpID8gZmlsZXMgOiBudWxsKTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBObyBwYXJhbWV0ZXJzLCBubyAucGFja2FnZXMgZmlsZXMgb3IgcGFja2FnZXMvIGRpci4KKyAgICAgIC8vIEEgImZpbGU6IiBzb3VyY2UgcmVhbGl6ZXMgdGhlcmUgaXMgbm8gY29uZmlndXJhdGlvbiBhbmQgY2FuJ3QgcmVzb2x2ZQorICAgICAgLy8gYW55IHBhY2thZ2VzLCBidXQgYSAiaHR0cDoiIHNvdXJjZSBhc3N1bWVzIGEgInBhY2thZ2VzLyIgZGlyZWN0b3J5LgorICAgICAgYWRkU2NoZW1lKCJubyByZXNvbHV0aW9uIiwgIiUkc2NoZW1lLyIsCisgICAgICAgICAgZmlsZXM6IHt9LAorICAgICAgICAgIGV4cGVjdDogKHNjaGVtZSA9PSAiZmlsZSIpCisgICAgICAgICAgICAgID8geyJmb28ueCI6IG51bGx9CisgICAgICAgICAgICAgIDogeworICAgICAgICAgICAgICAgICAgImlyb290IjogIiVodHRwL3BhY2thZ2VzLyIsCisgICAgICAgICAgICAgICAgICAiZm9vIjogIiVodHRwL3BhY2thZ2VzL2ZvbyIsCisgICAgICAgICAgICAgICAgICAiZm9vLyI6ICIlaHR0cC9wYWNrYWdlcy9mb28vIiwKKyAgICAgICAgICAgICAgICAgICJmb28vYmFyIjogIiVodHRwL3BhY2thZ2VzL2Zvby9iYXIiLAorICAgICAgICAgICAgICAgICAgImZvby54IjogbnVsbCwKKyAgICAgICAgICAgICAgICAgICJiYXIvYmFyIjogIiVodHRwL3BhY2thZ2VzL2Jhci9iYXIiLAorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIE5vIHBhcmFtZXRlcnMsIG5vIC5wYWNrYWdlcyBmaWxlcywKKyAgICAgIC8vIHBhY2thZ2VzLyBkaXIgZXhpc3RzIGFuZCBpcyBkZXRlY3RlZC4KKyAgICAgIHZhciBmaWxlcyA9IHsicGFja2FnZXMiOiBmb29QYWNrYWdlfTsKKyAgICAgIGFkZFNjaGVtZSgiaW1wbGljaXQgcGFja2FnZXMgZGlyIiwgIiUkc2NoZW1lLyIsIGZpbGVzOiBmaWxlcywgZXhwZWN0OiB7CisgICAgICAgICJpcm9vdCI6ICIlJHNjaGVtZS9wYWNrYWdlcy8iLAorICAgICAgICAiZm9vIjogIiUkc2NoZW1lL3BhY2thZ2VzL2ZvbyIsCisgICAgICAgICJmb28vIjogIiUkc2NoZW1lL3BhY2thZ2VzL2Zvby8iLAorICAgICAgICAiZm9vL2JhciI6ICIlJHNjaGVtZS9wYWNrYWdlcy9mb28vYmFyIiwKKyAgICAgICAgImJhci9iYXIiOiAiJSRzY2hlbWUvcGFja2FnZXMvYmFyL2JhciIsCisgICAgICB9KTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBObyBwYXJhbWV0ZXJzLCBubyAucGFja2FnZXMgZmlsZXMgaW4gY3VycmVudCBkaXIsIGJ1dCBvbmUgaW4gcGFyZW50LAorICAgICAgLy8gcGFja2FnZXMvIGRpciBleGlzdHMgYW5kIGlzIHVzZWQuCisgICAgICAvLworICAgICAgLy8gU2hvdWxkIG5vdCBkZXRlY3QgdGhlIC5wYWNrYWdlcyBmaWxlIGluIHBhcmVudCBkaXJlY3RvcnkuCisgICAgICAvLyBUaGF0IGZpbGUgaXMgZW1wdHksIHNvIGlmIGl0IGlzIHVzZWQsIHRoZSBzeXN0ZW0gY2Fubm90IHJlc29sdmUgImZvbyIuCisgICAgICB2YXIgZmlsZXMgPSB7CisgICAgICAgICJzdWIiOiB7InBhY2thZ2VzIjogZm9vUGFja2FnZX0sCisgICAgICAgICIucGFja2FnZXMiOiAiIgorICAgICAgfTsKKyAgICAgIGFkZFNjaGVtZSgKKyAgICAgICAgICAiaW1wbGljaXQgcGFja2FnZXMgZGlyIG92ZXJyaWRlcyBwYXJlbnQgLnBhY2thZ2VzIiwgIiUkc2NoZW1lL3N1Yi8iLAorICAgICAgICAgIGZpbGVzOiBmaWxlcywKKyAgICAgICAgICBleHBlY3Q6IHsKKyAgICAgICAgICAgICJpcm9vdCI6ICIlJHNjaGVtZS9zdWIvcGFja2FnZXMvIiwKKyAgICAgICAgICAgICJmb28iOiAiJSRzY2hlbWUvc3ViL3BhY2thZ2VzL2ZvbyIsCisgICAgICAgICAgICAiZm9vLyI6ICIlJHNjaGVtZS9zdWIvcGFja2FnZXMvZm9vLyIsCisgICAgICAgICAgICAiZm9vL2JhciI6ICIlJHNjaGVtZS9zdWIvcGFja2FnZXMvZm9vL2JhciIsCisgICAgICAgICAgICAvLyAiZm9vLngiOiAicXV4IiwgIC8vIEJsb2NrZWQgYnkgaXNzdWUgaHR0cDovL2RhcnRidWcuY29tLzI2NDgyCisgICAgICAgICAgICAiYmFyL2JhciI6ICIlJHNjaGVtZS9zdWIvcGFja2FnZXMvYmFyL2JhciIsCisgICAgICAgICAgfSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gTm8gcGFyYW1ldGVycywgYSAucGFja2FnZXMgZmlsZSBuZXh0IHRvIGVudHJ5IGlzIGZvdW5kIGFuZCB1c2VkLgorICAgICAgLy8gQSBwYWNrYWdlcy8gZGlyZWN0b3J5IGlzIGlnbm9yZWQuCisgICAgICB2YXIgZmlsZXMgPSB7CisgICAgICAgICIucGFja2FnZXMiOiAiZm9vOnBrZ3MvZm9vLyIsCisgICAgICAgICJwYWNrYWdlcyI6IHt9LAorICAgICAgICAicGtncyI6IGZvb1BhY2thZ2UKKyAgICAgIH07CisgICAgICBhZGRTY2hlbWUoImltcGxpY2l0IC5wYWNrYWdlcyBmaWxlIiwgIiUkc2NoZW1lLyIsIGZpbGVzOiBmaWxlcywgZXhwZWN0OiB7CisgICAgICAgICJpY29uZiI6ICIlJHNjaGVtZS8ucGFja2FnZXMiLAorICAgICAgICAiZm9vLyI6ICIlJHNjaGVtZS9wa2dzL2Zvby8iLAorICAgICAgICAiZm9vL2JhciI6ICIlJHNjaGVtZS9wa2dzL2Zvby9iYXIiLAorICAgICAgfSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gTm8gcGFyYW1ldGVycywgYSAucGFja2FnZXMgZmlsZSBpbiBwYXJlbnQgZGlyLCBubyBwYWNrYWdlcy8gZGlyLgorICAgICAgLy8gV2l0aCBhIGZpbGU6IFVSSSwgZmluZCB0aGUgLnBhY2thZ2VzIGZpbGUuCisgICAgICAvLyBXSXRoIGEgaHR0cDogVVJJLCBhc3N1bWUgYSBwYWNrYWdlcy8gZGlyLgorICAgICAgdmFyIGZpbGVzID0geyJzdWIiOiB7fSwgIi5wYWNrYWdlcyI6ICJmb286cGtncy9mb28vIiwgInBrZ3MiOiBmb29QYWNrYWdlfTsKKyAgICAgIGFkZFNjaGVtZSgiLnBhY2thZ2VzIGZpbGUgaW4gcGFyZW50IiwgIiUkc2NoZW1lL3N1Yi8iLAorICAgICAgICAgIGZpbGVzOiBmaWxlcywKKyAgICAgICAgICBleHBlY3Q6IChzY2hlbWUgPT0gImZpbGUiKQorICAgICAgICAgICAgICA/IHsKKyAgICAgICAgICAgICAgICAgICJpY29uZiI6ICIlZmlsZS8ucGFja2FnZXMiLAorICAgICAgICAgICAgICAgICAgImZvby8iOiAiJWZpbGUvcGtncy9mb28vIiwKKyAgICAgICAgICAgICAgICAgICJmb28vYmFyIjogIiVmaWxlL3BrZ3MvZm9vL2JhciIsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICA6IHsKKyAgICAgICAgICAgICAgICAgICJpcm9vdCI6ICIlaHR0cC9zdWIvcGFja2FnZXMvIiwKKyAgICAgICAgICAgICAgICAgICJmb28iOiAiJWh0dHAvc3ViL3BhY2thZ2VzL2ZvbyIsCisgICAgICAgICAgICAgICAgICAiZm9vLyI6ICIlaHR0cC9zdWIvcGFja2FnZXMvZm9vLyIsCisgICAgICAgICAgICAgICAgICAiZm9vL2JhciI6ICIlaHR0cC9zdWIvcGFja2FnZXMvZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAiZm9vLngiOiBudWxsLAorICAgICAgICAgICAgICAgICAgImJhci9iYXIiOiAiJWh0dHAvc3ViL3BhY2thZ2VzL2Jhci9iYXIiLAorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIFNwZWNpZmllZCBwYWNrYWdlIHJvb3QgdGhhdCBkb2Vzbid0IGV4aXN0LgorICAgICAgLy8gSWdub3JlcyBleGlzdGluZyAucGFja2FnZXMgZmlsZSBhbmQgcGFja2FnZXMvIGRpci4KKyAgICAgIGFkZFNjaGVtZSgiZXhwbGljaXQgcm9vdCBub3QgdGhlcmUiLCAiJSRzY2hlbWUvIiwKKyAgICAgICAgICBmaWxlczogeworICAgICAgICAgICAgInBhY2thZ2VzIjogZm9vUGFja2FnZSwKKyAgICAgICAgICAgICIucGFja2FnZXMiOiAiZm9vOiUkc2NoZW1lL3BhY2thZ2VzLyIKKyAgICAgICAgICB9LAorICAgICAgICAgIHJvb3Q6ICIlJHNjaGVtZS9ub3R0aGVyZS8iLAorICAgICAgICAgIGV4cGVjdDogeworICAgICAgICAgICAgInByb290IjogIiUkc2NoZW1lL25vdHRoZXJlLyIsCisgICAgICAgICAgICAiaXJvb3QiOiAiJSRzY2hlbWUvbm90dGhlcmUvIiwKKyAgICAgICAgICAgICJmb28iOiAiJSRzY2hlbWUvbm90dGhlcmUvZm9vIiwKKyAgICAgICAgICAgICJmb28vIjogIiUkc2NoZW1lL25vdHRoZXJlL2Zvby8iLAorICAgICAgICAgICAgImZvby9iYXIiOiAiJSRzY2hlbWUvbm90dGhlcmUvZm9vL2JhciIsCisgICAgICAgICAgICAiZm9vLngiOiBudWxsLAorICAgICAgICAgICAgImJhci9iYXIiOiAiJSRzY2hlbWUvbm90dGhlcmUvYmFyL2JhciIsCisgICAgICAgICAgfSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gU3BlY2lmaWVkIHBhY2thZ2UgY29uZmlnIHRoYXQgZG9lc24ndCBleGlzdC4KKyAgICAgIC8vIElnbm9yZXMgZXhpc3RpbmcgLnBhY2thZ2VzIGZpbGUgYW5kIHBhY2thZ2VzLyBkaXIuCisgICAgICBhZGRTY2hlbWUoImV4cGxpY2l0IGNvbmZpZyBub3QgdGhlcmUiLCAiJSRzY2hlbWUvIiwKKyAgICAgICAgICBmaWxlczogeyIucGFja2FnZXMiOiAiZm9vOnBhY2thZ2VzL2Zvby8iLCAicGFja2FnZXMiOiBmb29QYWNrYWdlfSwKKyAgICAgICAgICBjb25maWc6ICIlJHNjaGVtZS8ubm90dGhlcmUiLAorICAgICAgICAgIGV4cGVjdDogeworICAgICAgICAgICAgInBjb25mIjogIiUkc2NoZW1lLy5ub3R0aGVyZSIsCisgICAgICAgICAgICAiaWNvbmYiOiBudWxsLCAvLyAgIDwtIE9ubHkgdGhlcmUgaWYgYWN0dWFsbHkgbG9hZGVkICh1bnNwZWNpZmllZCkuCisgICAgICAgICAgICAiZm9vLyI6IG51bGwsCisgICAgICAgICAgICAiZm9vL2JhciI6IG51bGwsCisgICAgICAgICAgICAiZm9vLngiOiBudWxsLAorICAgICAgICAgIH0pOworICAgIH0KKworICAgIHsKKyAgICAgIC8vIFNwZWNpZmllZCBwYWNrYWdlIHJvb3Qgd2l0aCBubyB0cmFpbGluZyBzbGFzaC4KKyAgICAgIC8vIFRoZSBQbGF0Zm9ybS5wYWNrYWdlUm9vdCBhbmQgSXNvbGF0ZS5wYWNrYWdlUm9vdCBoYXMgYSB0cmFpbGluZyBzbGFzaC4KKyAgICAgIHZhciBmaWxlcyA9IHsKKyAgICAgICAgIi5wYWNrYWdlcyI6ICJmb286cGFja2FnZXMvZm9vLyIsCisgICAgICAgICJwYWNrYWdlcyI6IHt9LAorICAgICAgICAicGtncyI6IGZvb1BhY2thZ2UKKyAgICAgIH07CisgICAgICBhZGRTY2hlbWUoImV4cGxpY2l0IHBhY2thZ2Ugcm9vdCwgbm8gc2xhc2giLCAiJSRzY2hlbWUvIiwKKyAgICAgICAgICBmaWxlczogZmlsZXMsCisgICAgICAgICAgcm9vdDogIiUkc2NoZW1lL3BrZ3MiLAorICAgICAgICAgIGV4cGVjdDogeworICAgICAgICAgICAgInByb290IjogIiUkc2NoZW1lL3BrZ3MvIiwKKyAgICAgICAgICAgICJpcm9vdCI6ICIlJHNjaGVtZS9wa2dzLyIsCisgICAgICAgICAgICAiZm9vIjogIiUkc2NoZW1lL3BrZ3MvZm9vIiwKKyAgICAgICAgICAgICJmb28vIjogIiUkc2NoZW1lL3BrZ3MvZm9vLyIsCisgICAgICAgICAgICAiZm9vL2JhciI6ICIlJHNjaGVtZS9wa2dzL2Zvby9iYXIiLAorICAgICAgICAgICAgImJhci9iYXIiOiAiJSRzY2hlbWUvcGtncy9iYXIvYmFyIiwKKyAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBTcGVjaWZpZWQgcGFja2FnZSByb290IHdpdGggdHJhaWxpbmcgc2xhc2guCisgICAgICB2YXIgZmlsZXMgPSB7CisgICAgICAgICIucGFja2FnZXMiOiAiZm9vOnBhY2thZ2VzL2Zvby8iLAorICAgICAgICAicGFja2FnZXMiOiB7fSwKKyAgICAgICAgInBrZ3MiOiBmb29QYWNrYWdlCisgICAgICB9OworICAgICAgYWRkU2NoZW1lKCJleHBsaWNpdCBwYWNrYWdlIHJvb3QsIHNsYXNoIiwgIiUkc2NoZW1lLyIsCisgICAgICAgICAgZmlsZXM6IGZpbGVzLAorICAgICAgICAgIHJvb3Q6ICIlJHNjaGVtZS9wa2dzIiwKKyAgICAgICAgICBleHBlY3Q6IHsKKyAgICAgICAgICAgICJwcm9vdCI6ICIlJHNjaGVtZS9wa2dzLyIsCisgICAgICAgICAgICAiaXJvb3QiOiAiJSRzY2hlbWUvcGtncy8iLAorICAgICAgICAgICAgImZvbyI6ICIlJHNjaGVtZS9wa2dzL2ZvbyIsCisgICAgICAgICAgICAiZm9vLyI6ICIlJHNjaGVtZS9wa2dzL2Zvby8iLAorICAgICAgICAgICAgImZvby9iYXIiOiAiJSRzY2hlbWUvcGtncy9mb28vYmFyIiwKKyAgICAgICAgICAgICJiYXIvYmFyIjogIiUkc2NoZW1lL3BrZ3MvYmFyL2JhciIsCisgICAgICAgICAgfSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gU3BlY2lmaWVkIHBhY2thZ2UgY29uZmlnLgorICAgICAgdmFyIGZpbGVzID0geworICAgICAgICAiLnBhY2thZ2VzIjogImZvbzpwYWNrYWdlcy9mb28vIiwKKyAgICAgICAgInBhY2thZ2VzIjoge30sCisgICAgICAgICIucGtncyI6ICJmb286cGtncy9mb28vIiwKKyAgICAgICAgInBrZ3MiOiBmb29QYWNrYWdlCisgICAgICB9OworICAgICAgYWRkU2NoZW1lKCJleHBsaWNpdCBwYWNrYWdlIGNvbmZpZyBmaWxlIiwgIiUkc2NoZW1lLyIsCisgICAgICAgICAgZmlsZXM6IGZpbGVzLAorICAgICAgICAgIGNvbmZpZzogIiUkc2NoZW1lLy5wa2dzIiwKKyAgICAgICAgICBleHBlY3Q6IHsKKyAgICAgICAgICAgICJwY29uZiI6ICIlJHNjaGVtZS8ucGtncyIsCisgICAgICAgICAgICAiaWNvbmYiOiAiJSRzY2hlbWUvLnBrZ3MiLAorICAgICAgICAgICAgImZvby8iOiAiJSRzY2hlbWUvcGtncy9mb28vIiwKKyAgICAgICAgICAgICJmb28vYmFyIjogIiUkc2NoZW1lL3BrZ3MvZm9vL2JhciIsCisgICAgICAgICAgfSk7CisgICAgfQorCisgICAgeworICAgICAgLy8gU3BlY2lmaWVkIHBhY2thZ2UgY29uZmlnIGFzIGRhdGE6IFVSSS4KKyAgICAgIC8vIFRoZSBwYWNrYWdlIGNvbmZpZyBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgZGF0YTogVVJJLgorICAgICAgLy8gKEluIHRoYXQgY2FzZSwgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgaW4gdGhlIGNvbmZpZyBmaWxlIHdvbid0IHdvcmspLgorICAgICAgdmFyIGZpbGVzID0geworICAgICAgICAiLnBhY2thZ2VzIjogImZvbzpwYWNrYWdlcy9mb28vIiwKKyAgICAgICAgInBhY2thZ2VzIjoge30sCisgICAgICAgICJwa2dzIjogZm9vUGFja2FnZQorICAgICAgfTsKKyAgICAgIHZhciBkYXRhVXJpID0gImRhdGE6LGZvbzolJHNjaGVtZS9wa2dzL2Zvby9cbiI7CisgICAgICBhZGRTY2hlbWUoImV4cGxpY2l0IGRhdGE6IGNvbmZpZyBmaWxlIiwgIiUkc2NoZW1lLyIsCisgICAgICAgICAgZmlsZXM6IGZpbGVzLAorICAgICAgICAgIGNvbmZpZzogZGF0YVVyaSwKKyAgICAgICAgICBleHBlY3Q6IHsKKyAgICAgICAgICAgICJwY29uZiI6IGRhdGFVcmksCisgICAgICAgICAgICAiaWNvbmYiOiBkYXRhVXJpLAorICAgICAgICAgICAgImZvby8iOiAiJSRzY2hlbWUvcGtncy9mb28vIiwKKyAgICAgICAgICAgICJmb28vYmFyIjogIiUkc2NoZW1lL3BrZ3MvZm9vL2JhciIsCisgICAgICAgICAgfSk7CisgICAgfQorICB9CisKKyAgLy8gVGVzdHMgd2hlcmUgdGhlcmUgYXJlIGZpbGVzIG9uIGJvdGggaHR0cDogYW5kIGZpbGU6IHNvdXJjZXMuCisKKyAgZm9yICh2YXIgZW50cnlTY2hlbWUgaW4gY29uc3QgWyJmaWxlIiwgImh0dHAiXSkgeworICAgIGZvciAodmFyIHBrZ1NjaGVtZSBpbiBjb25zdCBbImZpbGUiLCAiaHR0cCJdKSB7CisgICAgICAvLyBQYWNrYWdlIHJvb3QuCisgICAgICBpZiAoZW50cnlTY2hlbWUgIT0gcGtnU2NoZW1lKSB7CisgICAgICAgIC8vIFBhY2thZ2UgZGlyIGFuZCBlbnRyeSBwb2ludCBvbiBkaWZmZXJlbnQgc2NoZW1lcy4KKyAgICAgICAgdmFyIGZpbGVzID0ge307CisgICAgICAgIHZhciBodHRwcyA9IHt9OworICAgICAgICAoZW50cnlTY2hlbWUgPT0gImZpbGUiID8gZmlsZXMgOiBodHRwcylbIm1haW4iXSA9IHRlc3RNYWluOworICAgICAgICAocGtnU2NoZW1lID09ICJmaWxlIiA/IGZpbGVzIDogaHR0cHMpWyJwa2dzIl0gPSBmb29QYWNrYWdlOworICAgICAgICBhZGQoIiRwa2dTY2hlbWUgcGtnLyRlbnRyeVNjaGVtZSBtYWluIiwgIiUkZW50cnlTY2hlbWUvIiwKKyAgICAgICAgICAgIGZpbGU6IGZpbGVzLAorICAgICAgICAgICAgaHR0cDogaHR0cHMsCisgICAgICAgICAgICByb290OiAiJSRwa2dTY2hlbWUvcGtncy8iLAorICAgICAgICAgICAgZXhwZWN0OiB7CisgICAgICAgICAgICAgICJwcm9vdCI6ICIlJHBrZ1NjaGVtZS9wa2dzLyIsCisgICAgICAgICAgICAgICJpcm9vdCI6ICIlJHBrZ1NjaGVtZS9wa2dzLyIsCisgICAgICAgICAgICAgICJmb28iOiAiJSRwa2dTY2hlbWUvcGtncy9mb28iLAorICAgICAgICAgICAgICAiZm9vLyI6ICIlJHBrZ1NjaGVtZS9wa2dzL2Zvby8iLAorICAgICAgICAgICAgICAiZm9vL2JhciI6ICIlJHBrZ1NjaGVtZS9wa2dzL2Zvby9iYXIiLAorICAgICAgICAgICAgICAiYmFyL2JhciI6ICIlJHBrZ1NjaGVtZS9wa2dzL2Jhci9iYXIiLAorICAgICAgICAgICAgICAiZm9vLngiOiAicXV4IiwKKyAgICAgICAgICAgIH0pOworICAgICAgfQorICAgICAgLy8gUGFja2FnZSBjb25maWcuIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgbWF5IGFsc28gYmUgb24gZWl0aGVyIHNvdXJjZS4KKyAgICAgIGZvciAodmFyIGNvbmZpZ1NjaGVtZSBpbiBjb25zdCBbImZpbGUiLCAiaHR0cCJdKSB7CisgICAgICAgIC8vIERvbid0IGRvIHRoZSBib3Jpbmcgc3R1ZmYhCisgICAgICAgIGlmIChlbnRyeVNjaGVtZSA9PSBjb25maWdTY2hlbWUgJiYgZW50cnlTY2hlbWUgPT0gcGtnU2NoZW1lKSBjb250aW51ZTsKKyAgICAgICAgLy8gUGFja2FnZSBjb25maWcsIHBhY2thZ2VzIGFuZCBlbnRyeSBwb2ludCBub3QgYWxsIG9uIHNhbWUgc2NoZW1lLgorICAgICAgICB2YXIgZmlsZXMgPSB7fTsKKyAgICAgICAgdmFyIGh0dHBzID0ge307CisgICAgICAgIChlbnRyeVNjaGVtZSA9PSAiZmlsZSIgPyBmaWxlcyA6IGh0dHBzKVsibWFpbiJdID0gdGVzdE1haW47CisgICAgICAgIChjb25maWdTY2hlbWUgPT0gImZpbGUiID8gZmlsZXMgOiBodHRwcylbIi5wa2dzIl0gPQorICAgICAgICAgICAgImZvbzolJHBrZ1NjaGVtZS9wa2dzL2Zvby9cbiI7CisgICAgICAgIChwa2dTY2hlbWUgPT0gImZpbGUiID8gZmlsZXMgOiBodHRwcylbInBrZ3MiXSA9IGZvb1BhY2thZ2U7CisgICAgICAgIGFkZCgiJHBrZ1NjaGVtZSBwa2cvJGNvbmZpZ1NjaGVtZSBjb25maWcvJGVudHJ5U2NoZW1lIG1haW4iLAorICAgICAgICAgICAgIiUkZW50cnlTY2hlbWUvIiwKKyAgICAgICAgICAgIGZpbGU6IGZpbGVzLAorICAgICAgICAgICAgaHR0cDogaHR0cHMsCisgICAgICAgICAgICBjb25maWc6ICIlJGNvbmZpZ1NjaGVtZS8ucGtncyIsCisgICAgICAgICAgICBleHBlY3Q6IHsKKyAgICAgICAgICAgICAgInBjb25mIjogIiUkY29uZmlnU2NoZW1lLy5wa2dzIiwKKyAgICAgICAgICAgICAgImljb25mIjogIiUkY29uZmlnU2NoZW1lLy5wa2dzIiwKKyAgICAgICAgICAgICAgImZvby8iOiAiJSRwa2dTY2hlbWUvcGtncy9mb28vIiwKKyAgICAgICAgICAgICAgImZvby9iYXIiOiAiJSRwa2dTY2hlbWUvcGtncy9mb28vYmFyIiwKKyAgICAgICAgICAgICAgImZvby54IjogInF1eCIsCisgICAgICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25hbGl0eS4KKwordmFyIGZpbGVIdHRwUmVnZXhwID0gbmV3IFJlZ0V4cChyIiUoPzpmaWxlfGh0dHApLyIpOworCisvLyBFeGVjdXRlcyBhIHRlc3QgaW4gYSBjb25maWd1cmF0aW9uLgorLy8KKy8vIFRoZSB0ZXN0IG11c3Qgc3BlY2lmeSB3aGljaCBtYWluIGZpbGUgdG8gdXNlCisvLyAoYG1haW5gLCBgc3Bhd25NYWluYCBvciBgc3Bhd25VcmlNYWluYCkKKy8vIGFuZCBhbnkgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBgc3Bhd25NYWluYCBhbmQgYHNwYXduVXJpTWFpbmAuCisvLworLy8gVGhlIFtleHBlY3RdIG1hcCBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZQorLy8gY29uZmlndXJhdGlvbiBvbiBhIHZhbHVlLWJ5LXZhbHVlIGJhc2lzLiBQYXNzaW5nLCBlLmcuLCBgeyJwY29uZiI6IG51bGx9YAorLy8gd2lsbCBvdmVycmlkZSBvbmx5IHRoZSBgcGNvbmZgIChgUGxhdGZvcm0ucGFja2FnZUNvbmZpZ2ApIGV4cGVjdGF0aW9uLgorRnV0dXJlIHRlc3RDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZikgYXN5bmMgeworICBwcmludCgiLS0gJHtjb25mLmRlc2NyaXB0aW9ufSIpOworICB2YXIgZGVzY3JpcHRpb24gPSBjb25mLmRlc2NyaXB0aW9uOworICB0cnkgeworICAgIHZhciBvdXRwdXQgPSBhd2FpdCBleGVjRGFydChjb25mLm1haW5GaWxlLAorICAgICAgICByb290OiBjb25mLnJvb3QsIGNvbmZpZzogY29uZi5jb25maWcsIHNjcmlwdEFyZ3M6IGNvbmYuYXJncyk7CisgICAgbWF0Y2goanNvbi5kZWNvZGUob3V0cHV0KSwgY29uZi5leHBlY3QsIGRlc2NyaXB0aW9uLCBvdXRwdXQpOworICB9IGNhdGNoIChlLCBzKSB7CisgICAgLy8gVW5leHBlY3RlZCBlcnJvciBjYWxsaW5nIGV4ZWNEYXJ0IG9yIHBhcnNpbmcgdGhlIHJlc3VsdC4KKyAgICAvLyBSZXBvcnQgaXQgYW5kIGNvbnRpbnVlLgorICAgIHByaW50KCJFUlJPUiBydW5uaW5nICRkZXNjcmlwdGlvbjogJGVcbiRzIik7CisgICAgZmFpbGluZ1Rlc3RzLnB1dElmQWJzZW50KGRlc2NyaXB0aW9uLCAoKSA9PiBbXSkuYWRkKCIkZSIpOworICB9Cit9CisKKy8vLyBUZXN0IHRoYXQgdGhlIG91dHB1dCBvZiBydW5uaW5nIHRlc3RNYWluIG1hdGNoZXMgdGhlIGV4cGVjdGF0aW9ucy4KKy8vLworLy8vIFRoZSBvdXRwdXQgaXMgYSBzdHJpbmcgd2hpY2ggaXMgcGFyc2UgYXMgYSBKU09OIGxpdGVyYWwuCisvLy8gVGhlIHJlc3VsdGluZyBtYXAgaXMgYWx3YXlzIG1hcHBpbmcgc3RyaW5ncyB0byBzdHJpbmdzLCBvciBwb3NzaWJseSBgbnVsbGAuCisvLy8gVGhlIGV4cGVjdGF0aW9ucyBjYW4gaGF2ZSBub24tc3RyaW5nIHZhbHVlcyBvdGhlciB0aGFuIG51bGwsCisvLy8gdGhleSBhcmUgYHRvU3RyaW5nYCdlZCAgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIChzbyB0aGUgY2FsbGVyIGNhbiB1c2UgYSBVUkkKKy8vLyBvciBhIEZpbGUvRGlyZWN0b3J5IGRpcmVjdGx5IGFzIGFuIGV4cGVjdGF0aW9uKS4KK3ZvaWQgbWF0Y2goTWFwIGFjdHVhbHMsIE1hcCBleHBlY3RhdGlvbnMsIFN0cmluZyBkZXNjLCBTdHJpbmcgYWN0dWFsSnNvbikgeworICBmb3IgKHZhciBrZXkgaW4gZXhwZWN0YXRpb25zLmtleXMpIHsKKyAgICB2YXIgZXhwZWN0YXRpb24gPSBleHBlY3RhdGlvbnNba2V5XT8udG9TdHJpbmcoKTsKKyAgICB2YXIgYWN0dWFsID0gYWN0dWFsc1trZXldOworICAgIGlmIChleHBlY3RhdGlvbiAhPSBhY3R1YWwpIHsKKyAgICAgIHByaW50KCJFUlJPUjogJGRlc2M6ICRrZXk6IEV4cGVjdGVkOiA8JGV4cGVjdGF0aW9uPiBGb3VuZDogPCRhY3R1YWw+Iik7CisgICAgICBmYWlsaW5nVGVzdHMKKyAgICAgICAgICAucHV0SWZBYnNlbnQoZGVzYywgKCkgPT4gW10pCisgICAgICAgICAgLmFkZCgiJGtleTogJGV4cGVjdGF0aW9uICE9ICRhY3R1YWwiKTsKKyAgICB9CisgIH0KK30KKworY29uc3QgU3RyaW5nIGltcHJvdCA9ICJpbXBvcnQiOyAvLyBBdm9pZCBtdWx0aXRlc3QgaW1wb3J0IHJld3JpdGluZy4KKworLy8vIFNjcmlwdCB0aGF0IHByaW50cyB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlIHJlc3VsdCBvZiByZXNvbHZpbmcKKy8vLyBhIGZldyBwYWNrYWdlIFVSSXMuIFRoaXMgc2NyaXB0IHdpbGwgYmUgaW52b2tlZCBpbiBkaWZmZXJlbnQgc2V0dGluZ3MsCisvLy8gYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBwYXJzZWQgYW5kIGNvbXBhcmVkIHRvIHRoZSBleHBlY3RhdGlvbnMuCitjb25zdCBTdHJpbmcgdGVzdE1haW4gPSAiIiIKKyRpbXByb3QgImRhcnQ6Y29udmVydCIgc2hvdyBqc29uOworJGltcHJvdCAiZGFydDppbyIgc2hvdyBQbGF0Zm9ybSwgRGlyZWN0b3J5OworJGltcHJvdCAiZGFydDppc29sYXRlIiBzaG93IElzb2xhdGU7CiskaW1wcm90ICJwYWNrYWdlOmZvby9mb28uZGFydCIgZGVmZXJyZWQgYXMgZm9vOworbWFpbihfKSBhc3luYyB7CisgIFN0cmluZyBwbGF0Zm9ybVJvb3QgPSBhd2FpdCBQbGF0Zm9ybS5wYWNrYWdlUm9vdDsKKyAgU3RyaW5nIHBsYXRmb3JtQ29uZmlnID0gYXdhaXQgUGxhdGZvcm0ucGFja2FnZUNvbmZpZzsKKyAgRGlyZWN0b3J5IGN3ZCA9IERpcmVjdG9yeS5jdXJyZW50OworICBVcmkgc2NyaXB0ID0gUGxhdGZvcm0uc2NyaXB0OworICBVcmkgaXNvbGF0ZVJvb3QgPSBhd2FpdCBJc29sYXRlLnBhY2thZ2VSb290OworICBVcmkgaXNvbGF0ZUNvbmZpZyA9IGF3YWl0IElzb2xhdGUucGFja2FnZUNvbmZpZzsKKyAgVXJpIGJhc2UgPSBVcmkuYmFzZTsKKyAgVXJpIHJlczEgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKFVyaS5wYXJzZSgicGFja2FnZTpmb28iKSk7CisgIFVyaSByZXMyID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShVcmkucGFyc2UoInBhY2thZ2U6Zm9vLyIpKTsKKyAgVXJpIHJlczMgPSBhd2FpdCBJc29sYXRlLnJlc29sdmVQYWNrYWdlVXJpKFVyaS5wYXJzZSgicGFja2FnZTpmb28vYmFyIikpOworICBVcmkgcmVzNCA9IGF3YWl0IElzb2xhdGUucmVzb2x2ZVBhY2thZ2VVcmkoVXJpLnBhcnNlKCJwYWNrYWdlOmJhci9iYXIiKSk7CisgIFVyaSByZXM1ID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaShVcmkucGFyc2UoInJlbGF0aXZlL3BhdGgiKSk7CisgIFVyaSByZXM2ID0gYXdhaXQgSXNvbGF0ZS5yZXNvbHZlUGFja2FnZVVyaSgKKyAgICAgIFVyaS5wYXJzZSgiaHR0cDovL2V4YW1wbGUub3JnL2ZpbGUiKSk7CisgIFN0cmluZyBmb29YID0gYXdhaXQgZm9vCisgICAgLmxvYWRMaWJyYXJ5KCkKKyAgICAudGltZW91dChjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAxKSkKKyAgICAudGhlbigoXykgPT4gZm9vLngsIG9uRXJyb3I6IChfKSA9PiBudWxsKTsKKyAgcHJpbnQoanNvbi5lbmNvZGUoeworICAgICJjd2QiOiBjd2QucGF0aCwKKyAgICAiYmFzZSI6IGJhc2U/LnRvU3RyaW5nKCksCisgICAgInNjcmlwdCI6IHNjcmlwdD8udG9TdHJpbmcoKSwKKyAgICAicHJvb3QiOiBwbGF0Zm9ybVJvb3QsCisgICAgInBjb25mIjogcGxhdGZvcm1Db25maWcsCisgICAgImlyb290IiA6IGlzb2xhdGVSb290Py50b1N0cmluZygpLAorICAgICJpY29uZiIgOiBpc29sYXRlQ29uZmlnPy50b1N0cmluZygpLAorICAgICJmb28iOiByZXMxPy50b1N0cmluZygpLAorICAgICJmb28vIjogcmVzMj8udG9TdHJpbmcoKSwKKyAgICAiZm9vL2JhciI6IHJlczM/LnRvU3RyaW5nKCksCisgICAgImZvby54IjogZm9vWD8udG9TdHJpbmcoKSwKKyAgICAiYmFyL2JhciI6IHJlczQ/LnRvU3RyaW5nKCksCisgICAgInJlbGF0aXZlIjogcmVzNT8udG9TdHJpbmcoKSwKKyAgICAibm9ucGtnIjogcmVzNj8udG9TdHJpbmcoKSwKKyAgfSkpOworfQorIiIiOworCisvLy8gU2NyaXB0IHRoYXQgc3Bhd25zIGEgbmV3IElzb2xhdGUgdXNpbmcgSXNvbGF0ZS5zcGF3blVyaS4KKy8vLworLy8vIFRha2VzIFVSSSBvZiB0YXJnZXQgaXNvbGF0ZSwgcGFja2FnZSBjb25maWcsIHBhY2thZ2Ugcm9vdCBhbmQKKy8vLyBhdXRvbWF0aWMgcGFja2FnZSByZXNvbHV0aW9uLWZsYWcgcGFyYW1ldGVycyBhcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorLy8vIEFueSBmdXJ0aGVyIGFyZ3VtZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBzcGF3bmVkIGlzb2xhdGUuCitjb25zdCBTdHJpbmcgc3Bhd25VcmlNYWluID0gIiIiCiskaW1wcm90ICJkYXJ0Omlzb2xhdGUiOworJGltcHJvdCAiZGFydDphc3luYyI7CittYWluKGFyZ3MpIGFzeW5jIHsKKyAgVXJpIHRhcmdldCA9IFVyaS5wYXJzZShhcmdzWzBdKTsKKyAgVXJpIGNvbmZpZyA9IChhcmdzWzFdID09ICItIikgPyBudWxsIDogVXJpLnBhcnNlKGFyZ3NbMV0pOworICBVcmkgcm9vdCA9IChhcmdzWzJdID09ICItIikgPyBudWxsIDogVXJpLnBhcnNlKGFyZ3NbMl0pOworICBib29sIHNlYXJjaCA9IGFyZ3NbM10gPT0gInRydWUiOworICB2YXIgcmVzdEFyZ3MgPSBhcmdzLnNraXAoNCkudG9MaXN0KCk7CisgIC8vIFBvcnQga2VlcHMgaXNvbGF0ZSBhbGl2ZSB1bnRpbCBzcGF3bmVkIGlzb2xhdGUgdGVybWluYXRlcy4KKyAgdmFyIHBvcnQgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKKyAgcG9ydC5oYW5kbGVyID0gKHJlcykgYXN5bmMgeworICAgIHBvcnQuY2xvc2UoKTsgIC8vIENsb3NlIG9uIGV4aXQgb3IgZmlyc3QgZXJyb3IuCisgICAgaWYgKHJlcyAhPSBudWxsKSB7CisgICAgICBhd2FpdCBuZXcgRnV0dXJlLmVycm9yKHJlc1swXSwgbmV3IFN0YWNrVHJhY2UuZnJvbVN0cmluZyhyZXNbMV0pKTsKKyAgICB9CisgIH07CisgIElzb2xhdGUuc3Bhd25VcmkodGFyZ2V0LCByZXN0QXJncywgbnVsbCwKKyAgICAgICAgICAgICAgICAgICBwYWNrYWdlUm9vdDogcm9vdCwgcGFja2FnZUNvbmZpZzogY29uZmlnLAorICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY1BhY2thZ2VSZXNvbHV0aW9uOiBzZWFyY2gsCisgICAgICAgICAgICAgICAgICAgb25FcnJvcjogcG9ydC5zZW5kUG9ydCwgb25FeGl0OiBwb3J0LnNlbmRQb3J0KTsKK30KKyIiIjsKKworLy8vIFNjcmlwdCB0aGF0IHNwYXducyBhIG5ldyBJc29sYXRlIHVzaW5nIElzb2xhdGUuc3Bhd24uCisvLy8KKy8vLyBVc2VzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZWxlY3Qgd2hpY2ggdGFyZ2V0IHRvIHNwYXduLgorLy8vIFNob3VsZCBiZSBlaXRoZXIgInRlc3QiLCAidXJpIiBvciAic3Bhd24iLgorY29uc3QgU3RyaW5nIHNwYXduTWFpbiA9ICIiIgorJGltcHJvdCAiZGFydDphc3luYyI7CiskaW1wcm90ICJkYXJ0Omlzb2xhdGUiOworJGltcHJvdCAiJW1haW5EaXIvbWFpbi5kYXJ0IiBhcyB0ZXN0OworJGltcHJvdCAiJW1haW5EaXIvc3Bhd25VcmlNYWluLmRhcnQiIGFzIHNwYXduVXJpOworbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgeworICAvLyBQb3J0IGtlZXBzIGlzb2xhdGUgYWxpdmUgdW50aWwgc3Bhd25lZCBpc29sYXRlIHRlcm1pbmF0ZXMuCisgIHZhciBwb3J0ID0gbmV3IFJhd1JlY2VpdmVQb3J0KCk7CisgIHBvcnQuaGFuZGxlciA9IChyZXMpIGFzeW5jIHsKKyAgICBwb3J0LmNsb3NlKCk7ICAvLyBDbG9zZSBvbiBleGl0IG9yIGZpcnN0IGVycm9yLgorICAgIGlmIChyZXMgIT0gbnVsbCkgeworICAgICAgYXdhaXQgbmV3IEZ1dHVyZS5lcnJvcihyZXNbMF0sIG5ldyBTdGFja1RyYWNlLmZyb21TdHJpbmcocmVzWzFdKSk7CisgICAgfQorICB9OworICB2YXIgYXJnID0gYXJncy5maXJzdDsKKyAgdmFyIHJlc3QgPSBhcmdzLnNraXAoMSkudG9MaXN0KCk7CisgIHZhciB0YXJnZXQ7CisgIGlmIChhcmcgPT0gIm1haW4iKSB7CisgICAgdGFyZ2V0ID0gdGVzdC5tYWluOworICB9IGVsc2UgaWYgKGFyZyA9PSAic3Bhd25VcmlNYWluIikgeworICAgIHRhcmdldCA9IHNwYXduVXJpLm1haW47CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0ID0gbWFpbjsKKyAgfQorICBJc29sYXRlLnNwYXduKHRhcmdldCwgcmVzdCwgb25FcnJvcjogcG9ydC5zZW5kUG9ydCwgb25FeGl0OiBwb3J0LnNlbmRQb3J0KTsKK30KKyIiIjsKKworLy8vIEEgcGFja2FnZSBkaXJlY3RvcnkgY29udGFpbmluZyBvbmx5IG9uZSBwYWNrYWdlLCAiZm9vIiwgd2l0aCBvbmUgZmlsZS4KK2NvbnN0IE1hcCBmb29QYWNrYWdlID0gY29uc3QgeworICAiZm9vIjogY29uc3QgeyJmb28iOiAidmFyIHggPSAncXV4JzsifQorfTsKKworLy8vIFJ1bnMgdGhlIERhcnQgZXhlY3V0YWJsZSB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgorLy8vCisvLy8gQ2FwdHVyZXMgYW5kIHJldHVybnMgdGhlIG91dHB1dC4KK0Z1dHVyZTxTdHJpbmc+IGV4ZWNEYXJ0KFN0cmluZyBzY3JpcHQsCisgICAge1N0cmluZyByb290LCBTdHJpbmcgY29uZmlnLCBJdGVyYWJsZTxTdHJpbmc+IHNjcmlwdEFyZ3N9KSBhc3luYyB7CisgIHZhciBjaGVja2VkID0gZmFsc2U7CisgIGFzc2VydCgoY2hlY2tlZCA9IHRydWUpKTsKKyAgLy8gVE9ETzogRmluZCBhIHdheSB0byBjaGFuZ2UgQ1dEIGJlZm9yZSBydW5uaW5nIHNjcmlwdC4KKyAgdmFyIGV4ZWN1dGFibGUgPSBQbGF0Zm9ybS5leGVjdXRhYmxlOworICB2YXIgYXJncyA9IFtdOworICBpZiAoY2hlY2tlZCkgYXJncy5hZGQoIi0tY2hlY2tlZCIpOworICBpZiAocm9vdCAhPSBudWxsKSBhcmdzLmFkZCgiLS1wYWNrYWdlLXJvb3Q9JHJvb3QiKTsKKyAgaWYgKGNvbmZpZyAhPSBudWxsKSBhcmdzLmFkZCgiLS1wYWNrYWdlcz0kY29uZmlnIik7CisgIGFyZ3MuYWRkKHNjcmlwdCk7CisgIGlmIChzY3JpcHRBcmdzICE9IG51bGwpIHsKKyAgICBhcmdzLmFkZEFsbChzY3JpcHRBcmdzKTsKKyAgfQorICByZXR1cm4gUHJvY2Vzcy5ydW4oZXhlY3V0YWJsZSwgYXJncykudGhlbigocmVzdWx0cykgeworICAgIGlmIChyZXN1bHRzLmV4aXRDb2RlICE9IDAgfHwgcmVzdWx0cy5zdGRlcnIuaXNOb3RFbXB0eSkgeworICAgICAgdGhyb3cgcmVzdWx0cy5zdGRlcnI7CisgICAgfQorICAgIHJldHVybiByZXN1bHRzLnN0ZG91dDsKKyAgfSk7Cit9CisKKy8vLyBDcmVhdGVzIGEgbnVtYmVyIG9mIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KKy8vLworLy8vIFRoZSBbY29udGVudF0gaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGRpcmVjdG9yeSBpdHNlbGYuIFRoZSBtYXAga2V5cyBhcmUKKy8vLyBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgZWl0aGVyIHN0cmluZ3MgdGhhdCByZXByZXNlbnQgRGFydCBmaWxlIGNvbnRlbnRzCisvLy8gb3IgbWFwcyB0aGF0IHJlcHJlc2VudCBzdWJkaXJlY3Rvcmllcy4KK3ZvaWQgY3JlYXRlRmlsZXMoRGlyZWN0b3J5IHRlbXBEaXIsIFN0cmluZyBzdWJEaXIsIE1hcCBjb250ZW50KSB7CisgIERpcmVjdG9yeSBjcmVhdGVEaXIoRGlyZWN0b3J5IGJhc2UsIFN0cmluZyBuYW1lKSB7CisgICAgRGlyZWN0b3J5IG5ld0RpciA9IG5ldyBEaXJlY3RvcnkocC5qb2luKGJhc2UucGF0aCwgbmFtZSkpOworICAgIG5ld0Rpci5jcmVhdGVTeW5jKCk7CisgICAgcmV0dXJuIG5ld0RpcjsKKyAgfQorCisgIHZvaWQgY3JlYXRlVGV4dEZpbGUoRGlyZWN0b3J5IGJhc2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudCkgeworICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHAuam9pbihiYXNlLnBhdGgsIG5hbWUpKTsKKyAgICBuZXdGaWxlLndyaXRlQXNTdHJpbmdTeW5jKGNvbnRlbnQpOworICB9CisKKyAgdm9pZCBjcmVhdGVSZWN1cnNpdmUoRGlyZWN0b3J5IGRpciwgTWFwIG1hcCkgeworICAgIGZvciAodmFyIG5hbWUgaW4gbWFwLmtleXMpIHsKKyAgICAgIHZhciBjb250ZW50ID0gbWFwW25hbWVdOworICAgICAgaWYgKGNvbnRlbnQgaXMgU3RyaW5nKSB7CisgICAgICAgIC8vIElmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICIuIiBpdCdzIGEgLnBhY2thZ2VzIGZpbGUsIG90aGVyd2lzZSBpdCdzCisgICAgICAgIC8vIGEgZGFydCBmaWxlLiBUaG9zZSBhcmUgdGhlIG9ubHkgZmlsZXMgd2UgY2FyZSBhYm91dCBpbiB0aGlzIHRlc3QuCisgICAgICAgIGNyZWF0ZVRleHRGaWxlKAorICAgICAgICAgICAgZGlyLCBuYW1lLnN0YXJ0c1dpdGgoIi4iKSA/IG5hbWUgOiBuYW1lICsgIi5kYXJ0IiwgY29udGVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoY29udGVudCBpcyBNYXApOworICAgICAgICB2YXIgc3ViZGlyID0gY3JlYXRlRGlyKGRpciwgbmFtZSk7CisgICAgICAgIGNyZWF0ZVJlY3Vyc2l2ZShzdWJkaXIsIGNvbnRlbnQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNyZWF0ZVJlY3Vyc2l2ZShjcmVhdGVEaXIodGVtcERpciwgc3ViRGlyKSwgY29udGVudCk7Cit9CisKKy8vLyBTdGFydCBhbiBIVFRQIHNlcnZlciB3aGljaCBzZXJ2ZXMgYSBkaXJlY3RvcnkvZmlsZSBzdHJ1Y3R1cmUuCisvLy8KKy8vLyBUaGUgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIGFyZSBkZXNjcmliZWQgYnkgW2ZpbGVzXS4KKy8vLworLy8vIEVhY2ggbWFwIGtleSBpcyBhbiBlbnRyeSBpbiBhIGRpcmVjdG9yeS4gQSBgTWFwYCB2YWx1ZSBpcyBhIHN1Yi1kaXJlY3RvcnkKKy8vLyBhbmQgYSBgU3RyaW5nYCB2YWx1ZSBpcyBhIHRleHQgZmlsZS4KKy8vLyBUaGUgZmlsZSBjb250ZW50cyBhcmUgcnVuIHRocm91Z2ggW2ZpeFBhdGhzXSB0byBhbGxvdyB0aGVtIHRvIGJlIHNlbGYtCisvLy8gcmVmZXJlbnRpYWwuCitGdXR1cmU8SHR0cFNlcnZlcj4gc3RhcnRTZXJ2ZXIoTWFwIGZpbGVzKSBhc3luYyB7CisgIHJldHVybiAoYXdhaXQgSHR0cFNlcnZlci5iaW5kKEludGVybmV0QWRkcmVzcy5sb29wYmFja0lQdjQsIDApKQorICAgIC4uZm9yRWFjaCgocmVxdWVzdCkgeworICAgICAgdmFyIHJlc3VsdCA9IGZpbGVzOworICAgICAgb25GYWlsdXJlOgorICAgICAgeworICAgICAgICBmb3IgKHZhciBwYXJ0IGluIHJlcXVlc3QudXJpLnBhdGhTZWdtZW50cykgeworICAgICAgICAgIGlmIChwYXJ0LmVuZHNXaXRoKCIuZGFydCIpKSB7CisgICAgICAgICAgICBwYXJ0ID0gcGFydC5zdWJzdHJpbmcoMCwgcGFydC5sZW5ndGggLSA1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJlc3VsdCBpcyBNYXApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXJ0XTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWsgb25GYWlsdXJlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0IGlzIFN0cmluZykgeworICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2UKKyAgICAgICAgICAgIC4ud3JpdGUocmVzdWx0KQorICAgICAgICAgICAgLi5jbG9zZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVxdWVzdC5yZXNwb25zZQorICAgICAgICAuLnN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzLm5vdEZvdW5kCisgICAgICAgIC4uY2xvc2UoKTsKKyAgICB9KTsKK30KKworLy8gQ291bnRlciB1c2VkIHRvIGF2b2lkIHJldXNpbmcgdGVtcG9yYXJ5IGZpbGUgb3IgZGlyZWN0b3J5IG5hbWVzLgorLy8KKy8vIFVzZWQgd2hlbiBhZGRpbmcgZXh0cmEgZmlsZXMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSwKKy8vIGFuZCB3aGVuIGNyZWF0aW5nIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKy8vCisvLyBTb21lIHBsYXRmb3JtIHRlbXBvcmFyeS1kaXJlY3RvcnkgaW1wbGVtZW50YXRpb25zIGFyZSB0aW1lciBiYXNlZCwKKy8vIGFuZCBjcmVhdGluZyB0d28gdGVtcC1kaXJzIHdpdGhpbmcgYSBzaG9ydCBkdXJhdGlvbiBtYXkgY2F1c2UgYSBjb2xsaXNpb24uCitpbnQgdG1wTmFtZUNvdW50ZXIgPSAwOworCisvLyBGcmVzaCBmaWxlIG5hbWUuCitTdHJpbmcgZnJlc2hOYW1lKFtTdHJpbmcgYmFzZSA9ICJ0bXAiXSkgPT4gIiRiYXNlJHt0bXBOYW1lQ291bnRlcisrfSI7CisKK0RpcmVjdG9yeSBjcmVhdGVUZW1wRGlyKCkgeworICByZXR1cm4gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoZnJlc2hOYW1lKCJwZnRlc3QtIikpOworfQorCit0eXBlZGVmIHZvaWQgQ29uZmlnVXBkYXRlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7CisKKy8vLyBUaGUgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgdGVzdC4KK2NsYXNzIENvbmZpZ3VyYXRpb24geworICAvLy8gVGhlICJkZXNjcmlwdGlvbiIgb2YgdGhlIHRlc3QgLSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXQtdXAuCisgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAvLy8gVGhlIHBhY2thZ2Ugcm9vdCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBEYXJ0IGlzb2xhdGUuCisgIC8vLworICAvLy8gQXQgbW9zdCBvbmUgb2YgW3Jvb3RdIGFuZCBbY29uZmlnXSBzaG91bGQgYmUgc3VwcGxpZWQuIElmIGJvdGggYXJlCisgIC8vLyBvbWl0dGVkLCBhIFZNIHdpbGwgc2VhcmNoIGZvciBhIHBhY2thZ2VzIGZpbGUgb3IgZGlyLgorICBmaW5hbCBTdHJpbmcgcm9vdDsKKworICAvLy8gVGhlIHBhY2thZ2UgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uIHBhc3NlZCB0byB0aGUgRGFydCBpc29sYXRlLgorICBmaW5hbCBTdHJpbmcgY29uZmlnOworCisgIC8vLyBQYXRoIHRvIHRoZSBtYWluIGZpbGUgdG8gcnVuLgorICBmaW5hbCBTdHJpbmcgbWFpbkZpbGU7CisKKyAgLy8vIExpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1haW4gZnVuY3Rpb24uCisgIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmdzOworCisgIC8vLyBUaGUgZXhwZWN0ZWQgdmFsdWVzIGZvciBgUGxhdGZvcm0ucGFja2FnZXtSb290LENvbmZpZ31gLAorICAvLy8gYElzb2xhdGUucGFja2FnZXtSb290LENvbmZpZ31gIGFuZCByZXNvbHV0aW9uIG9mIHBhY2thZ2UgVVJJcworICAvLy8gaW4gYSBgZm9vYCBwYWNrYWdlLgorICAvLy8KKyAgLy8vIFRoZSByZXN1bHRzIGFyZSBmb3VuZCBieSBydW5uaW5nIHRoZSBgbWFpbi5kYXJ0YCBmaWxlIGluc2lkZSBbbWFpbkRpcl0uCisgIC8vLyBUaGUgdGVzdHMgY2FuIHJ1biB0aGlzIGZpbGUgYWZ0ZXIgZG9pbmcgb3RoZXIgYHNwYXduYCBvciBgc3Bhd25VcmlgIGNhbGxzLgorICBmaW5hbCBNYXAgZXhwZWN0OworCisgIENvbmZpZ3VyYXRpb24oCisgICAgICB7dGhpcy5kZXNjcmlwdGlvbiwKKyAgICAgIHRoaXMucm9vdCwKKyAgICAgIHRoaXMuY29uZmlnLAorICAgICAgdGhpcy5tYWluRmlsZSwKKyAgICAgIHRoaXMuYXJncywKKyAgICAgIHRoaXMuZXhwZWN0fSk7CisKKyAgLy8gR2V0cyB0aGUgdHlwZSBvZiBtYWluIGZpbGUsIG9uZSBvZiBgbWFpbmAsIGBzcGF3bk1haW5gIG9yIGBzcGF3blVyaU1haW5gLgorICBTdHJpbmcgZ2V0IG1haW5UeXBlIHsKKyAgICB2YXIgbGFzdFNsYXNoID0gbWFpbkZpbGUubGFzdEluZGV4T2YoIi8iKTsKKyAgICBpZiAobGFzdFNsYXNoIDwgMCkgeworICAgICAgLy8gQXNzdW1lIGl0J3MgYSBXaW5kb3dzIHBhdGguCisgICAgICBsYXN0U2xhc2ggPSBtYWluRmlsZS5sYXN0SW5kZXhPZihyIlwiKTsKKyAgICB9CisgICAgdmFyIG5hbWUgPSBtYWluRmlsZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSwgbWFpbkZpbGUubGVuZ3RoIC0gNSk7CisgICAgYXNzZXJ0KG5hbWUgPT0gIm1haW4iIHx8IG5hbWUgPT0gInNwYXduTWFpbiIgfHwgbmFtZSA9PSAic3Bhd25VcmlNYWluIik7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBTdHJpbmcgZ2V0IG1haW5QYXRoIHsKKyAgICB2YXIgbGFzdFNsYXNoID0gbWFpbkZpbGUubGFzdEluZGV4T2YoIi8iKTsKKyAgICBpZiAobGFzdFNsYXNoIDwgMCkgeworICAgICAgLy8gQXNzdW1lIGl0J3MgYSBXaW5kb3dzIHBhdGguCisgICAgICBsYXN0U2xhc2ggPSBtYWluRmlsZS5sYXN0SW5kZXhPZihyIlwiKTsKKyAgICB9CisgICAgcmV0dXJuIG1haW5GaWxlLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBuZXcgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBvbGQgb25lLgorICAvLy8KKyAgLy8vIFtkZXNjcmlwdGlvbl0gaXMgbmV3IGRlc2NyaXB0aW9uLgorICAvLy8KKyAgLy8vIFttYWluXSBpcyBvbmUgb2YgYG1haW5gLCBgc3Bhd25NYWluYCBvciBgc3Bhd25VcmlNYWluYCwgYW5kIGNoYW5nZXMKKyAgLy8vIHRoZSBbQ29uZmlndXJhdGlvbi5tYWluRmlsZV0gdG8gYSBkaWZmZXJlbnQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisgIC8vLworICAvLy8gW21haW5GaWxlXSBvdmVycmlkZXMgW0NvbmZpZ3VyYXRpb24ubWFpbkZpbGVdIGNvbXBsZXRlbHksIGFuZCBpZ25vcmVzCisgIC8vLyBbbWFpbl0uCisgIC8vLworICAvLy8gW25ld0FyZ3NdIGFyZSBwcmVwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIFtDb25maWd1cmF0aW9uLmFyZ3NdLgorICAvLy8KKyAgLy8vIFthcmdzXSBvdmVycmlkZXMgW0NvbmZpZ3VyYXRpb24uYXJnc10gY29tcGxldGVseSBhbmQgaWdub3JlcyBbbmV3QXJnc10uCisgIC8vLworICAvLy8gW2V4cGVjdF0gb3ZlcnJpZGVzIGluZGl2aWR1YWwgZXhwZWN0YXRpb25zLgorICAvLy8KKyAgLy8vIFtyb290XSBhbmQgW2NvbmZpZ10gb3ZlcnJpZGVzIHRoZSBleGlzdGluZyB2YWx1ZXMuCisgIENvbmZpZ3VyYXRpb24gdXBkYXRlKAorICAgICAge1N0cmluZyBkZXNjcmlwdGlvbiwKKyAgICAgIFN0cmluZyBtYWluLAorICAgICAgU3RyaW5nIG1haW5GaWxlLAorICAgICAgU3RyaW5nIHJvb3QsCisgICAgICBTdHJpbmcgY29uZmlnLAorICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MsCisgICAgICBMaXN0PFN0cmluZz4gbmV3QXJncywKKyAgICAgIE1hcCBleHBlY3R9KSB7CisgICAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKAorICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gPz8gdGhpcy5kZXNjcmlwdGlvbiwKKyAgICAgICAgcm9vdDogcm9vdCA/PyB0aGlzLnJvb3QsCisgICAgICAgIGNvbmZpZzogY29uZmlnID8/IHRoaXMuY29uZmlnLAorICAgICAgICBtYWluRmlsZTogbWFpbkZpbGUgPz8KKyAgICAgICAgICAgICgobWFpbiA9PSBudWxsKSA/IHRoaXMubWFpbkZpbGUgOiAiJHt0aGlzLm1haW5QYXRofSRtYWluLmRhcnQiKSwKKyAgICAgICAgYXJnczogYXJncyA/PworICAgICAgICAgICAgKDxTdHJpbmc+W10KKyAgICAgICAgICAgICAgLi5hZGRBbGwobmV3QXJncyA/PyBjb25zdCA8U3RyaW5nPltdKQorICAgICAgICAgICAgICAuLmFkZEFsbCh0aGlzLmFyZ3MpKSwKKyAgICAgICAgZXhwZWN0OiBleHBlY3QgPT0gbnVsbCA/IHRoaXMuZXhwZWN0IDogbmV3IE1hcC5mcm9tKHRoaXMuZXhwZWN0KQorICAgICAgICAgIC4uYWRkQWxsKGV4cGVjdCA/PyBjb25zdCB7fSkpOworICB9CisKKyAgLy8gRm9yIGRlYnVnZ2luZy4KKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiQ29uZmlndXJhdGlvbigkZGVzY3JpcHRpb25cbiIKKyAgICAgICAgIiAgcm9vdCAgOiAkcm9vdFxuIgorICAgICAgICAiICBjb25maWc6ICRjb25maWdcbiIKKyAgICAgICAgIiAgbWFpbiAgOiAkbWFpbkZpbGVcbiIKKyAgICAgICAgIiAgYXJncyAgOiAke2FyZ3MubWFwKCh4KSA9PiAnIiR4IicpLmpvaW4oIiAiKX1cbiIKKyAgICAgICAgIikgOiBleHBlY3Qge1xuJHtleHBlY3Qua2V5cy5tYXAoKGspID0+CisgICAgICAgICAgICcgICIkayInLnBhZFJpZ2h0KDYpICsgIjoke2pzb24uZW5jb2RlKGV4cGVjdFtrXSl9XG4iKS5qb2luKCl9IgorICAgICAgICAifSI7CisgIH0KK30KKworLy8gSW5zZXJ0cyB0aGUgZmlsZSB3aXRoIGdlbmVyYWxpemVkIFtuYW1lXSBhdCBbcGF0aF0gd2l0aCBbY29udGVudF0uCisvLworLy8gVGhlIFtwYXRoXSBpcyBhIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmlsZSBpcyBjcmVhdGVkLiBJdCBtdXN0IHN0YXJ0IHdpdGgKKy8vIGVpdGhlciAnJWZpbGUvJyBvciAnJWh0dHAvJyB0byBzZWxlY3QgdGhlIHN0cnVjdHVyZSB0byBwdXQgaXQgaW50by4KKy8vCisvLyBUaGUgW25hbWVdIHNob3VsZCBub3QgaGF2ZSBhIHRyYWlsaW5nICIuZGFydCIgZm9yIERhcnQgZmlsZXMuIEFueSBmaWxlCisvLyBub3Qgc3RhcnRpbmcgd2l0aCAiLiIgaXMgYXNzdW1lZCB0byBiZSBhICIuZGFydCIgZmlsZS4KK3ZvaWQgaW5zZXJ0RmlsZUF0KAorICAgIE1hcCBmaWxlLCBNYXAgaHR0cCwgU3RyaW5nIHBhdGgsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudCkgeworICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcvJykudG9MaXN0KCk7CisgIHZhciBkaXIgPSAocGFydHNbMF0gPT0gIiVmaWxlIikgPyBmaWxlIDogaHR0cDsKKyAgZm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICB2YXIgZW50cnkgPSBwYXJ0c1tpXTsKKyAgICBkaXIgPSBkaXJbZW50cnldID8/IChkaXJbZW50cnldID0ge30pOworICB9CisgIGRpcltuYW1lXSA9IGNvbnRlbnQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3BhaXJfbG9jYXRpb25fcmVtYXBwaW5nX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcGFpcl9sb2NhdGlvbl9yZW1hcHBpbmdfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmY3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3BhaXJfbG9jYXRpb25fcmVtYXBwaW5nX3Rlc3QuZGFydApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBUZXN0IHRoYXQgcGFpciBsb2NhdGlvbnMgYXJlIHJlbWFwZWQgaW4gc2xvdyBwYXRoIGVudmlyb25tZW50cy4KKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbl9jb3VudGVyX3RocmVzaG9sZD0xMCAtLW5vLXVzZS1vc3IgLS1uby1iYWNrZ3JvdW5kX2NvbXBpbGF0aW9uCisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworCitjbGFzcyBBIHsKKyAgZmluYWwgZjsKKyAgQSh0aGlzLmYpOworfQorCitmb28oaW50IGkpIHsKKyAgaW50IGogPSAweDdmZmZmZmZmZmZmZmZmZmYgKyBpOworICB2YXIgYyA9IG5ldyBBKGopOyAvLyBhbGxvY2F0aW9uIHdpbGwgYmUgc3VuaworICB2YXIgciA9IDA7CisgIGZvciAodmFyIGsgPSAwOyBrIDwgMTA7IGsrKykgeworICAgIGlmICgoaiAmICgxIDw8IGspKSAhPSAwKSB7CisgICAgICByKys7CisgICAgfQorICB9CisgIHJldHVybiBjLmYgLSByOworfQorCittYWluKCkgeworICBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMHg3ZmZmZmZmZmZmZmZmZmZmIC0gMTAsIGZvbygwKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcG93X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcG93X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDZhOGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wb3dfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBtYXRoJ3MgcG93LgorCitsaWJyYXJ5IHBvd190ZXN0OworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKK2ltcG9ydCAnZGFydDptYXRoJzsKKwordmFyIGV4cGVjdGVkUmVzdWx0cyA9IFsKKyAgMSwKKyAgMiwKKyAgNCwKKyAgOCwKKyAgMTYsCisgIDMyLAorICA2NCwKKyAgMTI4LAorICAyNTYsCisgIDUxMiwKKyAgMTAyNCwKKyAgMjA0OCwKKyAgNDA5NiwKKyAgODE5MiwKKyAgMTYzODQsCisgIDMyNzY4LAorICA2NTUzNiwKKyAgMTMxMDcyLAorICAyNjIxNDQsCisgIDUyNDI4OCwKKyAgMTA0ODU3NiwKKyAgMjA5NzE1MiwKKyAgNDE5NDMwNCwKKyAgODM4ODYwOCwKKyAgMTY3NzcyMTYsCisgIDMzNTU0NDMyLAorICA2NzEwODg2NCwKKyAgMTM0MjE3NzI4LAorICAyNjg0MzU0NTYsCisgIDUzNjg3MDkxMiwKKyAgMTA3Mzc0MTgyNCwKKyAgMjE0NzQ4MzY0OCwKKyAgNDI5NDk2NzI5NiwKKyAgODU4OTkzNDU5MiwKKyAgMTcxNzk4NjkxODQsCisgIDM0MzU5NzM4MzY4LAorICA2ODcxOTQ3NjczNiwKKyAgMTM3NDM4OTUzNDcyLAorICAyNzQ4Nzc5MDY5NDQsCisgIDU0OTc1NTgxMzg4OCwKKyAgMTA5OTUxMTYyNzc3NiwKKyAgMjE5OTAyMzI1NTU1MiwKKyAgNDM5ODA0NjUxMTEwNCwKKyAgODc5NjA5MzAyMjIwOCwKKyAgMTc1OTIxODYwNDQ0MTYsCisgIDM1MTg0MzcyMDg4ODMyLAorICA3MDM2ODc0NDE3NzY2NCwKKyAgMTQwNzM3NDg4MzU1MzI4LAorICAyODE0NzQ5NzY3MTA2NTYsCisgIDU2Mjk0OTk1MzQyMTMxMiwKKyAgMTEyNTg5OTkwNjg0MjYyNCwKKyAgMjI1MTc5OTgxMzY4NTI0OCwKKyAgNDUwMzU5OTYyNzM3MDQ5NiwKKyAgOTAwNzE5OTI1NDc0MDk5MiwKKyAgMTgwMTQzOTg1MDk0ODE5ODQsCisgIDM2MDI4Nzk3MDE4OTYzOTY4LAorICA3MjA1NzU5NDAzNzkyNzkzNiwKKyAgMTQ0MTE1MTg4MDc1ODU1ODcyLAorICAyODgyMzAzNzYxNTE3MTE3NDQsCisgIDU3NjQ2MDc1MjMwMzQyMzQ4OCwKKyAgMTE1MjkyMTUwNDYwNjg0Njk3NiwKKyAgMjMwNTg0MzAwOTIxMzY5Mzk1MiwKKyAgNDYxMTY4NjAxODQyNzM4NzkwNCwKK107CisKK3ZvaWQgbWFpbigpIHsKKyAgaW50IGV4cCA9IDA7CisgIGZvciAoaW50IHZhbCBpbiBleHBlY3RlZFJlc3VsdHMpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHZhbCwgcG93KDIsIGV4cCkpOworICAgIEV4cGVjdC5lcXVhbHModmFsLnRvRG91YmxlKCksIHBvdygyLCBleHAudG9Eb3VibGUoKSkpOworICAgIGV4cCsrOworICB9CisKKyAgLy8gT3B0aW1pemUgaXQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgODg4ODsgaSsrKSB7CisgICAgcG93KDIsIDMpOworICAgIHBvdygyLjAsIDMuMCk7CisgIH0KKyAgZXhwID0gMDsKKyAgZm9yIChpbnQgdmFsIGluIGV4cGVjdGVkUmVzdWx0cykgeworICAgIEV4cGVjdC5lcXVhbHModmFsLCBwb3coMiwgZXhwKSk7CisgICAgRXhwZWN0LmVxdWFscyh2YWwudG9Eb3VibGUoKSwgcG93KDIsIGV4cC50b0RvdWJsZSgpKSk7CisgICAgZXhwKys7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcHJpb3JpdHlfcXVldWVfc3RyZXNzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcHJpb3JpdHlfcXVldWVfc3RyZXNzX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9wcmlvcml0eV9xdWV1ZV9zdHJlc3NfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzI3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgcHJpb3JpdHlfcXVldWU7CisKK2ltcG9ydCAnZGFydDpjb2xsZWN0aW9uJzsKK2ltcG9ydCAnZGFydDptYXRoJzsKKworLyoqCisgKiBBIHByaW9yaXR5IHVzZWQgZm9yIHRoZSBwcmlvcml0eSBxdWV1ZS4gU3ViY2xhc3NlcyBvbmx5IG5lZWQgdG8gaW1wbGVtZW50CisgKiB0aGUgY29tcGFyZVRvIGZ1bmN0aW9uLgorICovCithYnN0cmFjdCBjbGFzcyBQcmlvcml0eSBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworICAvKioKKyAgICogUmV0dXJuIDwgMCBpZiBvdGhlciBpcyBiaWdnZXIsID4wIGlmIG90aGVyIGlzIHNtYWxsZXIsIDAgaWYgdGhleSBhcmUgZXF1YWwuCisgICAqLworICBpbnQgY29tcGFyZVRvKGR5bmFtaWMgb3RoZXIpOworICBib29sIG9wZXJhdG9yIDwoZHluYW1pYyBvdGhlcikgPT4gY29tcGFyZVRvKG90aGVyKSA8IDA7CisgIGJvb2wgb3BlcmF0b3IgPihkeW5hbWljIG90aGVyKSA9PiBjb21wYXJlVG8ob3RoZXIpID4gMDsKKyAgYm9vbCBvcGVyYXRvciA9PShkeW5hbWljIG90aGVyKSA9PiBjb21wYXJlVG8ob3RoZXIpID09IDA7Cit9CisKKy8qKgorICogUHJpb3JpdHkgYmFzZWQgb24gaW50ZWdlcnMuCisgKi8KK2NsYXNzIEludFByaW9yaXR5IGV4dGVuZHMgUHJpb3JpdHkgeworICBpbnQgcHJpb3JpdHk7CisgIEludFByaW9yaXR5KGludCB0aGlzLnByaW9yaXR5KTsKKworICBpbnQgY29tcGFyZVRvKGR5bmFtaWMgb3RoZXIpIHsKKyAgICByZXR1cm4gKHByaW9yaXR5IC0gb3RoZXIucHJpb3JpdHkpIGFzIGludDsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpID0+ICIkcHJpb3JpdHkiOworfQorCisvKioKKyAqIEFuIGVsZW1lbnQgb2YgYSBwcmlvcml0eSBxdWV1ZS4gVGhlIHR5cGUgaXMgdXNlZCByZXN0cmljdGlvbiBiYXNlZAorICogcXVlcnlpbmcgb2YgdGhlIHF1ZXVlcy4KKyAqLworYWJzdHJhY3QgY2xhc3MgVHlwZWRFbGVtZW50PFY+IHsKKyAgYm9vbCB0eXBlRXF1YWxzKHZhciBvdGhlcik7Cit9CisKK2NsYXNzIFN0cmluZ1R5cGVkRWxlbWVudDxWPiBleHRlbmRzIFR5cGVkRWxlbWVudCB7CisgIFN0cmluZyB0eXBlOworICBWIHZhbHVlOworICBTdHJpbmdUeXBlZEVsZW1lbnQoU3RyaW5nIHRoaXMudHlwZSwgViB0aGlzLnZhbHVlKTsKKyAgYm9vbCB0eXBlRXF1YWxzKGR5bmFtaWMgb3RoZXJUeXBlKSA9PiBvdGhlclR5cGUgPT0gdHlwZTsKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIjxUeXBlOiAkdHlwZSwgVmFsdWU6ICR2YWx1ZT4iOworfQorCisvKioKKyAqIEEgcHJpb3JpdHkgbm9kZSBpbiBhIHByaW9yaXR5IHF1ZXVlLiBBIHByaW9yaXR5IG5vZGUgY29udGFpbnMgYWxsIG9mIHRoZQorICogdmFsdWVzIGZvciBhIGdpdmVuIHByaW9yaXR5IGluIGEgZ2l2ZW4gcXVldWUuIEl0IGlzIHBhcnQgb2YgYSBsaW5rZWQKKyAqIGxpc3Qgb2Ygbm9kZXMsIHdpdGggcHJldiBhbmQgbmV4dCBwb2ludGVycy4KKyAqLworY2xhc3MgUHJpb3JpdHlOb2RlPE4gZXh0ZW5kcyBUeXBlZEVsZW1lbnQsIFQgZXh0ZW5kcyBQcmlvcml0eT4geworICBUIHByaW9yaXR5OworICBRdWV1ZTxOPiB2YWx1ZXM7CisgIFByaW9yaXR5Tm9kZT8gcHJldjsKKyAgUHJpb3JpdHlOb2RlPyBuZXh0OworICBQcmlvcml0eU5vZGUoTiBpbml0aWFsTm9kZSwgVCB0aGlzLnByaW9yaXR5KSA6IHZhbHVlcyA9IG5ldyBRdWV1ZTxOPigpIHsKKyAgICBhZGQoaW5pdGlhbE5vZGUpOworICB9CisKKyAgdm9pZCBhZGQoTiBuKSA9PiB2YWx1ZXMuYWRkKG4pOworCisgIGJvb2wgcmVtb3ZlKE4gbikgPT4gdmFsdWVzLnJlbW92ZShuKTsKKworICBOIHJlbW92ZUZpcnN0KCkgPT4gdmFsdWVzLnJlbW92ZUZpcnN0KCk7CisKKyAgYm9vbCBnZXQgaXNFbXB0eSA9PiB2YWx1ZXMuaXNFbXB0eTsKKworICBOIGdldCBmaXJzdCA9PiB2YWx1ZXMuZmlyc3Q7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIlByaW9yaXR5OiAkcHJpb3JpdHkgJHZhbHVlcyI7Cit9CisKKy8qKgorICogQSBwcmlvcml0eSBxdWV1ZSB3aXRoIGEgRklGTyBwcm9wZXJ0eSBmb3Igbm9kZXMgd2l0aCBzYW1lIHByaW9yaXR5LgorICogVGhlIHF1ZXVlIGd1YXJhbnRlZXMgdGhhdCBub2RlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhleQorICogYXJlIGFkZGVkIGZvciBhIGdpdmVuIHByaW9yaXR5LgorICogRm9yIHR5cGUgc2FmZXR5IHRoaXMgcXVldWUgaXMgZ3VhcmRlZCBieSB0aGUgZWxlbWVudHMgYmVpbmcgc3ViY2xhc3NlcyBvZgorICogVHlwZWRFbGVtZW50IC0gdGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjY2VzYXJ5IHNpbmNlIHdlIG5ldmVyIGFjdHVhbGx5CisgKiB1c2UgdGhlIHZhbHVlIG9yIHR5cGUgb2YgdGhlIG5vZGVzLgorICovCitjbGFzcyBQcmlvcml0eVF1ZXVlPE4gZXh0ZW5kcyBUeXBlZEVsZW1lbnQsIFAgZXh0ZW5kcyBQcmlvcml0eT4geworICBQcmlvcml0eU5vZGU8TiwgUD4/IGhlYWQ7CisgIGludCBsZW5ndGggPSAwOworCisgIHZvaWQgYWRkKE4gdmFsdWUsIFAgcHJpb3JpdHkpIHsKKyAgICBsZW5ndGgrKzsKKyAgICBpZiAoaGVhZCA9PSBudWxsKSB7CisgICAgICBoZWFkID0gbmV3IFByaW9yaXR5Tm9kZTxOLCBQPih2YWx1ZSwgcHJpb3JpdHkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoaGVhZCEubmV4dCA9PSBudWxsKTsKKyAgICB2YXIgbm9kZSA9IGhlYWQhOworICAgIHdoaWxlIChub2RlLnByZXYgIT0gbnVsbCAmJiBub2RlLnByaW9yaXR5ID4gcHJpb3JpdHkpIHsKKyAgICAgIG5vZGUgPSBub2RlLnByZXYgYXMgUHJpb3JpdHlOb2RlPE4sIFA+OworICAgIH0KKyAgICBpZiAobm9kZS5wcmlvcml0eSA9PSBwcmlvcml0eSkgeworICAgICAgbm9kZS5hZGQodmFsdWUpOworICAgIH0gZWxzZSBpZiAobm9kZS5wcmlvcml0eSA8IHByaW9yaXR5KSB7CisgICAgICB2YXIgbmV3Tm9kZSA9IG5ldyBQcmlvcml0eU5vZGU8TiwgUD4odmFsdWUsIHByaW9yaXR5KTsKKyAgICAgIG5ld05vZGUubmV4dCA9IG5vZGUubmV4dDsKKyAgICAgIGlmIChub2RlLm5leHQgIT0gbnVsbCkgbm9kZS5uZXh0IS5wcmV2ID0gbmV3Tm9kZTsKKyAgICAgIG5ld05vZGUucHJldiA9IG5vZGU7CisgICAgICBub2RlLm5leHQgPSBuZXdOb2RlOworICAgICAgaWYgKG5vZGUgPT0gaGVhZCkgaGVhZCA9IG5ld05vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBuZXdOb2RlID0gbmV3IFByaW9yaXR5Tm9kZTxOLCBQPih2YWx1ZSwgcHJpb3JpdHkpOworICAgICAgbm9kZS5wcmV2ID0gbmV3Tm9kZTsKKyAgICAgIG5ld05vZGUubmV4dCA9IG5vZGU7CisgICAgfQorICB9CisKKyAgTiBnZXQgZmlyc3QgPT4gaGVhZCEuZmlyc3Q7CisKKyAgUHJpb3JpdHkgZ2V0IGZpcnN0UHJpb3JpdHkgPT4gaGVhZCEucHJpb3JpdHk7CisKKyAgYm9vbCBnZXQgaXNFbXB0eSA9PiBoZWFkID09IG51bGw7CisKKyAgTiByZW1vdmVGaXJzdCgpIHsKKyAgICBpZiAoaXNFbXB0eSkgdGhyb3cgIkNhbid0IGdldCBlbGVtZW50IGZyb20gZW1wdHkgcXVldWUiOworICAgIHZhciB2YWx1ZSA9IGhlYWQhLnJlbW92ZUZpcnN0KCk7CisgICAgaWYgKGhlYWQhLmlzRW1wdHkpIHsKKyAgICAgIGlmIChoZWFkIS5wcmV2ICE9IG51bGwpIHsKKyAgICAgICAgaGVhZCEucHJldiEubmV4dCA9IG51bGw7CisgICAgICB9CisgICAgICBoZWFkID0gaGVhZCEucHJldiBhcyBQcmlvcml0eU5vZGU8TiwgUD4/OworICAgIH0KKyAgICBsZW5ndGgtLTsKKyAgICBhc3NlcnQoaGVhZCA9PSBudWxsIHx8IGhlYWQhLm5leHQgPT0gbnVsbCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIGlmIChoZWFkID09IG51bGwpIHJldHVybiAiRW1wdHkgcHJpb3JpdHkgcXVldWUiOworICAgIHZhciBub2RlID0gaGVhZCE7CisgICAgdmFyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZSAobm9kZS5wcmV2ICE9IG51bGwpIHsKKyAgICAgIGJ1ZmZlci53cml0ZWxuKG5vZGUpOworICAgICAgbm9kZSA9IG5vZGUucHJldiBhcyBQcmlvcml0eU5vZGU8TiwgUD47CisgICAgfQorICAgIGJ1ZmZlci53cml0ZWxuKG5vZGUpOworICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgfQorfQorCisvKioKKyAqIEltcGxlbWVudHMgYSBzcGVjaWFsaXplZCBwcmlvcml0eSBxdWV1ZSB0aGF0IGVmZmljaWVudGx5IGFsbG93cyBnZXR0aW5nCisgKiB0aGUgaGlnaGVzdCBwcmlvcml6ZWQgbm9kZSB0aGF0IGFkaGVyZXMgdG8gYSBzZXQgb2YgcmVzdHJpY3Rpb25zLgorICogTW9zdCBub3RhYmx5IGl0IGFsbG93cyB0byBnZXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbm9kZSB3aGVyZSB0aGUgbm9kZSdzCisgKiB0eXBlIGlzIG5vdCBpbiBhbiBleGNsdWRlIGxpc3QuCisgKiBJbiBhZGRpdGlvbiwgdGhlIHF1ZXVlIGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzOgorICogICBUaGUgcXVldWUgaGFzIGZpZm8gc2VtYW50aWNzIGZvciBub2RlcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGFuZCB0eXBlLAorICogICBpLmUuLCBpZiBub2RlcyBhIGFuZCBiIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2l0aCBwcmlvcml0eSB4IGFuZCB0eXBlIHoKKyAqICAgdGhlbiBhIGlzIHJldHVybmVkIGZpcnN0IGlmZiBhIHdhcyBhZGRlZCBiZWZvcmUgYgorICogRm9yIGRpZmZlcmVudCB0eXBlcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IG5vIGd1YXJhbnRlZXMgYXJlIGdpdmVuLCBidXQKKyAqIHRoZSByZXR1cm5lZCB2YWx1ZXMgdHJ5IHRvIGJlIGZhaXIgYnkgcmV0dXJuaW5nIGZyb20gdGhlIGJpZ2dlc3QgbGlzdCBvZgorICogdGFza3MgaW4gY2FzZSBvZiBwcmlvcml0eSBjbGFzaC4gKFRoaXMgY291bGQgYmUgZml4ZWQgYnkgYWRkaW5nIHRpbWVzdGFtcHMKKyAqIHRvIGV2ZXJ5IG5vZGUsIHRoYXQgaXMgX29ubHlfIHVzZWQgd2hlbiBjb2xsaXNpb25zIG9jY3VyLCBub3QgZm9yCisgKiBpbnNlcnRpb25zKQorICovCitjbGFzcyBSZXN0cmljdFZpZXdQcmlvcml0eVF1ZXVlPE4gZXh0ZW5kcyBUeXBlZEVsZW1lbnQsIFAgZXh0ZW5kcyBQcmlvcml0eT4geworICAvLyBXZSBjYW4ndCB1c2UgdGhlIGJhc2ljIGRhcnQgcHJpb3JpdHkgcXVldWUgc2luY2UgaXQgZG9lcyBub3QgZ3VhcmFudGVlCisgIC8vIEZJRk8gZm9yIGl0ZW1zIHdpdGggdGhlIHNhbWUgb3JkZXIuIFRoaXMgaXMgY3VycmVudGx5IG5vdCB1cHRpbWl6ZWQgZm9yCisgIC8vIGRpZmZlcmVudCBOLCBpZiBtYW55IGRpZmZlcmVudCBOIGlzIGV4cGVjdGVkIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYQorICAvLyBwcmlvcml0eSBxdWV1ZSBpbnN0ZWFkIG9mIGEgbGlzdC4KKyAgTGlzdDxQcmlvcml0eVF1ZXVlPE4sIFA+PiByZXN0cmljdGVkUXVldWVzID0gPFByaW9yaXR5UXVldWU8TiwgUD4+W107CisgIFByaW9yaXR5UXVldWU8TiwgUD4gbWFpblF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8TiwgUD4oKTsKKworICB2b2lkIGFkZChOIHZhbHVlLCBQIHByaW9yaXR5KSB7CisgICAgZm9yICh2YXIgcXVldWUgaW4gcmVzdHJpY3RlZFF1ZXVlcykgeworICAgICAgaWYgKChxdWV1ZS5maXJzdCBhcyBTdHJpbmdUeXBlZEVsZW1lbnQpLnZhbHVlID09IHZhbHVlKSB7CisgICAgICAgIHF1ZXVlLmFkZCh2YWx1ZSwgcHJpb3JpdHkpOworICAgICAgfQorICAgIH0KKyAgICBtYWluUXVldWUuYWRkKHZhbHVlLCBwcmlvcml0eSk7CisgIH0KKworICBib29sIGdldCBpc0VtcHR5ID0+IHJlc3RyaWN0ZWRRdWV1ZXMubGVuZ3RoICsgbWFpblF1ZXVlLmxlbmd0aCA9PSAwOworCisgIGludCBnZXQgbGVuZ3RoID0+CisgICAgICByZXN0cmljdGVkUXVldWVzLmZvbGQ8aW50PigwLCAodiwgZSkgPT4gdiArIGUubGVuZ3RoKSArIG1haW5RdWV1ZS5sZW5ndGg7CisKKyAgUHJpb3JpdHlRdWV1ZT8gZ2V0UmVzdHJpY3RlZChMaXN0PE4+IHJlc3RyaWN0aW9ucykgeworICAgIHZhciBjdXJyZW50ID0gbnVsbDsKKyAgICAvLyBGaW5kIGhpZ2hlc3QgcmVzdHJpY3RlZCBwcmlvcml0eS4KKyAgICBmb3IgKHZhciBxdWV1ZSBpbiByZXN0cmljdGVkUXVldWVzKSB7CisgICAgICBpZiAoIXJlc3RyaWN0aW9ucy5hbnkoKGUpID0+IHF1ZXVlLmhlYWQhLmZpcnN0LnR5cGVFcXVhbHMoZSkpKSB7CisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcXVldWUuZmlyc3RQcmlvcml0eSA+IGN1cnJlbnQuZmlyc3RQcmlvcml0eSkgeworICAgICAgICAgIGN1cnJlbnQgPSBxdWV1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmZpcnN0UHJpb3JpdHkgPT0gcXVldWUuZmlyc3RQcmlvcml0eSkgeworICAgICAgICAgIGN1cnJlbnQgPSBxdWV1ZS5sZW5ndGggPiBjdXJyZW50Lmxlbmd0aCA/IHF1ZXVlIDogY3VycmVudDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3VycmVudDsKKyAgfQorCisgIE4/IGdldCBmaXJzdCB7CisgICAgaWYgKGlzRW1wdHkpIHRocm93ICJUcnlpbmcgdG8gcmVtb3ZlIG5vZGUgZnJvbSBlbXB0eSBxdWV1ZSI7CisgICAgdmFyIGNhbmRpZGF0ZSA9IGdldFJlc3RyaWN0ZWQoW10pOworICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCAmJgorICAgICAgICAobWFpblF1ZXVlLmlzRW1wdHkgfHwKKyAgICAgICAgICAgIG1haW5RdWV1ZS5maXJzdFByaW9yaXR5IDwgY2FuZGlkYXRlLmZpcnN0UHJpb3JpdHkpKSB7CisgICAgICByZXR1cm4gY2FuZGlkYXRlLmZpcnN0IGFzIE47CisgICAgfQorICAgIHJldHVybiBtYWluUXVldWUuaXNFbXB0eSA/IG51bGwgOiBtYWluUXVldWUuZmlyc3Q7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbm9kZSB0aGF0IHVuZGVyIHRoZSBnaXZlbiBzZXQgb2YgcmVzdHJpY3Rpb25zLgorICAgKiBJZiB0aGUgcXVldWUgaXMgZW1wdHkgdGhpcyBmdW5jdGlvbiB0aHJvd3MuCisgICAqIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIGJ1dCBubyBub2RlIGV4aXN0cyB0aGF0IGFkaGVyZXMgdG8gdGhlCisgICAqIHJlc3RyaWN0aW9ucyB3ZSByZXR1cm4gbnVsbC4KKyAgICovCisgIE4/IHJlbW92ZUZpcnN0KHtMaXN0PE4+IHJlc3RyaWN0aW9uczogY29uc3QgW119KSB7CisgICAgaWYgKGlzRW1wdHkpIHRocm93ICJUcnlpbmcgdG8gcmVtb3ZlIG5vZGUgZnJvbSBlbXB0eSBxdWV1ZSI7CisgICAgdmFyIGNhbmRpZGF0ZSA9IGdldFJlc3RyaWN0ZWQocmVzdHJpY3Rpb25zKTsKKworICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCAmJgorICAgICAgICAobWFpblF1ZXVlLmlzRW1wdHkgfHwKKyAgICAgICAgICAgIG1haW5RdWV1ZS5maXJzdFByaW9yaXR5IDwgY2FuZGlkYXRlLmZpcnN0UHJpb3JpdHkpKSB7CisgICAgICB2YXIgdmFsdWUgPSBjYW5kaWRhdGUucmVtb3ZlRmlyc3QoKTsKKyAgICAgIGlmIChjYW5kaWRhdGUuaXNFbXB0eSkgcmVzdHJpY3RlZFF1ZXVlcy5yZW1vdmUoY2FuZGlkYXRlKTsKKyAgICAgIHJldHVybiB2YWx1ZSBhcyBOOworICAgIH0KKyAgICB3aGlsZSAoIW1haW5RdWV1ZS5pc0VtcHR5KSB7CisgICAgICB2YXIgY3VycmVudFByaW9yaXR5ID0gbWFpblF1ZXVlLmZpcnN0UHJpb3JpdHk7CisgICAgICB2YXIgY3VycmVudCA9IG1haW5RdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgaWYgKCFyZXN0cmljdGlvbnMuYW55KChlKSA9PiBjdXJyZW50LnR5cGVFcXVhbHMoZSkpKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHJpb3JpdHlRdWV1ZTxOLCBQPj8gcmVzdHJpY3RlZFF1ZXVlOworICAgICAgICBmb3IgKHZhciBlIGluIHJlc3RyaWN0ZWRRdWV1ZXMpIHsKKyAgICAgICAgICBpZiAoY3VycmVudC50eXBlRXF1YWxzKChlLmZpcnN0IGFzIFN0cmluZ1R5cGVkRWxlbWVudCkudHlwZSkpIHsKKyAgICAgICAgICAgIHJlc3RyaWN0ZWRRdWV1ZSA9IGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3RyaWN0ZWRRdWV1ZSA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdHJpY3RlZFF1ZXVlID0gbmV3IFByaW9yaXR5UXVldWU8TiwgUD4oKTsKKyAgICAgICAgICByZXN0cmljdGVkUXVldWVzLmFkZChyZXN0cmljdGVkUXVldWUpOworICAgICAgICB9CisgICAgICAgIHJlc3RyaWN0ZWRRdWV1ZS5hZGQoY3VycmVudCwgY3VycmVudFByaW9yaXR5IGFzIFApOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBpZiAoaXNFbXB0eSkgcmV0dXJuICJFbXB0eSBxdWV1ZSI7CisgICAgdmFyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBpZiAoIXJlc3RyaWN0ZWRRdWV1ZXMuaXNFbXB0eSkgeworICAgICAgYnVmZmVyLndyaXRlbG4oIlJlc3RyaWN0ZWQgcXVldWVzIik7CisgICAgICBmb3IgKHZhciBxdWV1ZSBpbiByZXN0cmljdGVkUXVldWVzKSB7CisgICAgICAgIGJ1ZmZlci53cml0ZWxuKCIkcXVldWUiKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnVmZmVyLndyaXRlbG4oIk1haW4gcXVldWU6Iik7CisgICAgYnVmZmVyLndyaXRlbG4oIiRtYWluUXVldWUiKTsKKyAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KK30KKworLy8vIFRFTVBPUkFSWSBURVNUSU5HIEFORCBQRVJGT1JNQU5DRQordm9pZCBtYWluKFthcmdzXSkgeworICBzdHJlc3MobmV3IFJlc3RyaWN0Vmlld1ByaW9yaXR5UXVldWU8U3RyaW5nVHlwZWRFbGVtZW50LCBJbnRQcmlvcml0eT4oKSk7Cit9CisKK3ZvaWQgc3RyZXNzKHF1ZXVlKSB7CisgIGZpbmFsIGludCBTSVpFID0gNTAwMDA7CisgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKDI5KTsKKworICB2YXIgcHJpb3JpdGllcyA9IFsxLCAyLCAzLCAxNiwgMzIsIDQyLCA1NiwgNTcsIDU5LCA5MF07CisgIHZhciB2YWx1ZXMgPSBbCisgICAgbmV3IFN0cmluZ1R5cGVkRWxlbWVudCgnc2FmYXJpJywgJ2ZvbycpLAorICAgIG5ldyBTdHJpbmdUeXBlZEVsZW1lbnQoJ2llJywgJ2JhcicpLAorICAgIG5ldyBTdHJpbmdUeXBlZEVsZW1lbnQoJ2ZmJywgJ2Zvb2JhcicpLAorICAgIG5ldyBTdHJpbmdUeXBlZEVsZW1lbnQoJ2RhcnRpdW0nLCAnYmFyZm9vJyksCisgICAgbmV3IFN0cmluZ1R5cGVkRWxlbWVudCgnY2hyb21lJywgJ2hlc3QnKSwKKyAgICBuZXcgU3RyaW5nVHlwZWRFbGVtZW50KCdkcnQnLCAnZmlzaycpCisgIF07CisKKyAgdmFyIHJlc3RyaWN0ZWQgPSBbdmFsdWVzWzBdLCB2YWx1ZXNbNF1dOworCisgIHZvaWQgYWRkUmFuZG9tKCkgeworICAgIHF1ZXVlLmFkZCh2YWx1ZXNbcmFuZG9tLm5leHRJbnQodmFsdWVzLmxlbmd0aCldLAorICAgICAgICBuZXcgSW50UHJpb3JpdHkocHJpb3JpdGllc1tyYW5kb20ubmV4dEludChwcmlvcml0aWVzLmxlbmd0aCldKSk7CisgIH0KKworICB2YXIgc3RvcHdhdGNoID0gbmV3IFN0b3B3YXRjaCgpLi5zdGFydCgpOworICB3aGlsZSAocXVldWUubGVuZ3RoIDwgU0laRSkgeworICAgIGFkZFJhbmRvbSgpOworICB9CisKKyAgc3RvcHdhdGNoLnN0b3AoKTsKKyAgcHJpbnQoIkFkZGluZyB0b29rOiAke3N0b3B3YXRjaC5lbGFwc2VkTWlsbGlzZWNvbmRzfSIpOworICBwcmludCgiUXVldWUgbGVuZ3RoOiAke3F1ZXVlLmxlbmd0aH0iKTsKKworICBzdG9wd2F0Y2ggPSBuZXcgU3RvcHdhdGNoKCkuLnN0YXJ0KCk7CisgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7CisgICAgcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAgfQorICBzdG9wd2F0Y2guc3RvcCgpOworICBwcmludCgiUmVtb3dpbmcgdG9vazogJHtzdG9wd2F0Y2guZWxhcHNlZE1pbGxpc2Vjb25kc30iKTsKKyAgcHJpbnQoIlF1ZXVlIGxlbmd0aDogJHtxdWV1ZS5sZW5ndGh9Iik7CisKKyAgcHJpbnQoIlJlc3RyaWN0ZWQgYWRkL3JlbW92ZSIpOworICB3aGlsZSAocXVldWUubGVuZ3RoIDwgU0laRSkgeworICAgIGFkZFJhbmRvbSgpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKKyAgICBpZiAocmFuZG9tLm5leHREb3VibGUoKSA8IDAuNSkgeworICAgICAgcXVldWUucmVtb3ZlRmlyc3QocmVzdHJpY3Rpb25zOiByZXN0cmljdGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAgICB9CisgICAgYWRkUmFuZG9tKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzczMxMTE0X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzczMxMTE0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc3YTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzMzExMTRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE3LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLy8gVk1PcHRpb25zPS0tYmFja2dyb3VuZC1jb21waWxhdGlvbj1mYWxzZSAtLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0yMAorCitpbXBvcnQgJ3Bvd190ZXN0LmRhcnQnIGFzIHRlc3Q7CisKK21haW4oKSA9PiB0ZXN0Lm1haW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yNTMzNV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjUzMzVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMGNjN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjUzMzVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBUZXN0IHRoYXQgY2Fub25pY2FsaXphdGlvbiBpbnNlcnRzIGNvbnN0YW50cyB3aXRoIGNvcnJlY3QgcmVwcmVzZW50YXRpb24uCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1vcHRpbWl6YXRpb24tZmlsdGVyPWJhciAtLW5vLWJhY2tncm91bmQtY29tcGlsYXRpb24KKworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCit0b1NpZ25lZCh2LCB3aWR0aCkgeworICB2YXIgc2lnbk1hc2sgPSAxIDw8ICh3aWR0aCAtIDEpOworICByZXR1cm4gKHYgJiAoc2lnbk1hc2sgLSAxKSkgLSAodiAmIHNpZ25NYXNrKTsKK30KKworZm9vKHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZSA+PiAzMjsKK30KKworYmFyKHRkKSB7CisgIHJldHVybiB0b1NpZ25lZChmb28odGRbMF0pLCA2NCk7Cit9CisKK21haW4oKSB7CisgIHRvU2lnbmVkKDEgPDwgMSwgMzIpOworICB0b1NpZ25lZCgxIDw8IDMyLCAzMik7CisKKyAgdmFyIGwgPSBuZXcgSW50NjRMaXN0KDEpOworICBsWzBdID0gMHg3OGY3ZjZmNWY0ZjNmMmYxOworCisgIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIGJhcihsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzXzI2MDMxX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yNjAzMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkZDg5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yNjAzMV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE2LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBWTU9wdGlvbnM9LS1lbmFibGUtaXNvbGF0ZS1ncm91cHMKKy8vIFZNT3B0aW9ucz0tLW5vLWVuYWJsZS1pc29sYXRlLWdyb3VwcworCitpbXBvcnQgJ2RhcnQ6aW8nOworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKKwordm9pZCBjaGVja1Jlc29sdmVkRXhlY3V0YWJsZShPYmplY3QgcmVPYmopIHsKKyAgU3RyaW5nIHJlID0gcmVPYmogYXMgU3RyaW5nOworICBFeHBlY3QuZXF1YWxzKFBsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZSwgcmUpOworfQorCittYWluKCkgeworICB2YXIgZXhpdFBvcnQgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgSXNvbGF0ZS5zcGF3bihjaGVja1Jlc29sdmVkRXhlY3V0YWJsZSwgUGxhdGZvcm0ucmVzb2x2ZWRFeGVjdXRhYmxlLAorICAgICAgb25FeGl0OiBleGl0UG9ydC5zZW5kUG9ydCk7CisgIGV4aXRQb3J0Lmxpc3RlbigoXykgPT4gZXhpdFBvcnQuY2xvc2UoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjg4NTRfMV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjg4NTRfMV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiMzA0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yODg1NF8xX3Rlc3QuZGFydApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWVuYWJsZS1pc29sYXRlLWdyb3VwcworLy8gVk1PcHRpb25zPS0tbm8tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisKK2xpYnJhcnkgcmVncmVzczsKKworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworCithYnN0cmFjdCBjbGFzcyBOIHt9CisKK2NsYXNzIEogZXh0ZW5kcyBOIHsKKyAgZmluYWwgU3RyaW5nIHM7CisgIEoodGhpcy5zKTsKK30KKworY2xhc3MgSyBleHRlbmRzIE4geworICBmaW5hbCBpbnQgaTsKKyAgSyh0aGlzLmkpOworfQorCit2b2lkIGlzb2xhdGUoT2JqZWN0IHBvcnRPYmopIHsKKyAgU2VuZFBvcnQgcG9ydCA9IHBvcnRPYmogYXMgU2VuZFBvcnQ7CisgIHBvcnQuc2VuZChOKTsKKyAgcG9ydC5zZW5kKG5ldyBKKCI4IiAqIDQpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4MDAwMDsgaSsrKSB7CisgICAgcG9ydC5zZW5kKG5ldyBLKGkpKTsKKyAgfQorICBwb3J0LnNlbmQoJ2RvbmUnKTsKK30KKworbWFpbigpIGFzeW5jIHsKKyAgdmFyIHJlY3YgPSBuZXcgUmF3UmVjZWl2ZVBvcnQoKTsKKyAgcmVjdi5oYW5kbGVyID0gKGspIHsKKyAgICBpZiAoayBpcyBKKSBwcmludChrLnMubGVuZ3RoKTsKKyAgICBpZiAoayBpcyBTdHJpbmcpIHsKKyAgICAgIHByaW50KGspOworICAgICAgcmVjdi5jbG9zZSgpOworICAgIH0KKyAgfTsKKyAgdmFyIGlzbyA9IGF3YWl0IElzb2xhdGUuc3Bhd24oaXNvbGF0ZSwgcmVjdi5zZW5kUG9ydCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjg4NTRfMl90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjg4NTRfMl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzOTVjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yODg1NF8yX3Rlc3QuZGFydApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWVuYWJsZS1pc29sYXRlLWdyb3VwcworLy8gVk1PcHRpb25zPS0tbm8tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisKK2xpYnJhcnkgcmVncmVzczsKKworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworCithYnN0cmFjdCBjbGFzcyBOPFQ+IHt9CisKK2NsYXNzIEogZXh0ZW5kcyBOPFN0cmluZz4geworICBmaW5hbCBTdHJpbmcgczsKKyAgSih0aGlzLnMpOworfQorCitjbGFzcyBLIGV4dGVuZHMgTjxpbnQ+IHsKKyAgZmluYWwgaW50IGk7CisgIEsodGhpcy5pKTsKK30KKwordm9pZCBpc29sYXRlKE9iamVjdCBwb3J0T2JqKSB7CisgIFNlbmRQb3J0IHBvcnQgPSBwb3J0T2JqIGFzIFNlbmRQb3J0OworICBwb3J0LnNlbmQobmV3IEooIjgiICogNCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDAwOyBpKyspIHsKKyAgICBwb3J0LnNlbmQobmV3IEsoaSkpOworICB9CisgIHBvcnQuc2VuZCgnZG9uZScpOworfQorCittYWluKCkgYXN5bmMgeworICB2YXIgcmVjdiA9IG5ldyBSYXdSZWNlaXZlUG9ydCgpOworICByZWN2LmhhbmRsZXIgPSAoaykgeworICAgIGlmIChrIGlzIEopIHByaW50KGsucy5sZW5ndGgpOworICAgIGlmIChrIGlzIFN0cmluZykgeworICAgICAgcHJpbnQoayk7CisgICAgICByZWN2LmNsb3NlKCk7CisgICAgfQorICB9OworICB2YXIgaXNvID0gYXdhaXQgSXNvbGF0ZS5zcGF3bihpc29sYXRlLCByZWN2LnNlbmRQb3J0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yOTM1MF90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjkzNTBfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2I1MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjkzNTBfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorICogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKyAqIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisgKi8KKworLy8gJ2NvdmFyaWFudCcgd2hlbiB1c2VkIGluY29ycmVjdGx5IHNob3VsZCByZXBvcnQgYW4gZXJyb3IgYW5kIG5vdCBjcmFzaAorLy8gdGhlIFZNLgorCit0eXBlZGVmIGJvb2wgVGVzdChjb3ZhcmlhbnQgbnVtIGFyZyk7IC8vIyBub25lOiBjb21waWxlLXRpbWUgZXJyb3IKKwordm9pZCBtYWluKCkgeworICBUZXN0IHQgPSAoaW50IHZhbHVlKSA9PiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc18yOTY5NV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjk2OTVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGFlNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfMjk2OTVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBUZXN0IHRoYXQgdHlwZSB0ZXN0cyBhcmUgbm90IG1pc29wdGltaXplZC4KKy8vIFZNT3B0aW9ucz0tLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0xMDAwIC0tb3B0aW1pemF0aW9uLWZpbHRlcj1Jc0FuSW50CisKK21haW4oKSB7CisgIHRyYWluKCk7CisgIGlmIChJc0FuSW50KCJUaGlzIGlzIG5vdCBhbiBpbnQiKSkgdGhyb3cgIm9vcHMiOworfQorCisvLyBQcmltZSB0aGUgSUMgd2l0aCB0aGluZ3MgdGhhdCBhcmUgYW5kIGFyZSBub3QgaW50cy4KK3ZvaWQgdHJhaW4oKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworICAgIElzQW5JbnQoNDIpOyAvLyBTbWkgLSBhbHdheXMgZ29lcyBmaXJzdCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgICAgSXNBbkludCgxIDw8IDYyKTsgLy8gTWludCBvbiA2NCBiaXQgcGxhdGZvcm1zLgorICAgIElzQW5JbnQoMSA8PCA2Mik7CisgICAgLy8gVGhpcyBvbmUgdGhhdCBpcyBub3QgYW4gaW50IGdvZXMgbGFzdCBpbiB0aGUgSUMgYmVjYXVzZSBpdCBpcyBjYWxsZWQKKyAgICAvLyBsZXNzIGZyZXF1ZW50bHkuCisgICAgSXNBbkludCg0LjIpOworICB9Cit9CisKK2Jvb2wgSXNBbkludChmKSA9PiBmIGlzIGludDsKZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc180MTMyOV9hYnNvbHV0ZV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDEzMjlfYWJzb2x1dGVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmE0MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDEzMjlfYWJzb2x1dGVfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHA7CitpbXBvcnQgJ3BhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0JzsKKworRnV0dXJlPHZvaWQ+IG1haW4oKSBhc3luYyB7CisgIGZpbmFsIG9yaWdEaXIgPSBEaXJlY3RvcnkuY3VycmVudDsKKyAgZmluYWwgZXhlUGF0aCA9IFBsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZTsKKyAgZmluYWwgZCA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCdkYXJ0X3N5bWxpbmsnKTsKKworICAvLyBSb3VnaGx5IGVtdWxhdGUgYSBCcmV3IGluc3RhbGxhdGlvbjoKKyAgLy8gICAtICRCUkVXL2Jpbi9kYXJ0IC0+IC4uL0NlbGxhci9kYXJ0LzIuOC4wLWRldi4yMC4wL2Jpbi9kYXJ0CisgIC8vICAgLSAkQlJFVy9DZWxsYXIvZGFydC8yLjguMC1kZXYuMjAuMC9iaW4vZGFydCAtPiAkREFSVF9TREsvYmluL2RhcnQKKyAgZmluYWwgYSA9IERpcmVjdG9yeSgnJHtkLnBhdGh9L3Vzci9sb2NhbC9iaW4nKTsKKyAgYS5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CisKKyAgLy8gL3Vzci9sb2NhbC9DZWxsYXIvZGFydC8yLjguMC1kZXYuMjAuMC9iaW4vZGFydCAtPiAkREFSVF9TREsvYmluL2RhcnQKKyAgRGlyZWN0b3J5LmN1cnJlbnQgPSBhOworICBmaW5hbCBsaW5rTG9jYXRpb24gPSAnLi4vQ2VsbGFyL2RhcnQvMi44LjAtZGV2LjIwLjAvYmluL2RhcnQnOworICBmaW5hbCBsaW5rID0gTGluayhsaW5rTG9jYXRpb24pOworICBsaW5rLmNyZWF0ZVN5bmMoZXhlUGF0aCwgcmVjdXJzaXZlOiB0cnVlKTsKKworICAvLyAvdXNyL2xvY2FsL2Jpbi9kYXJ0IC0+IC91c3IvbG9jYWwvQ2VsbGFyL2RhcnQvMi44LjAtZGV2LjIwL2Jpbi9kYXJ0CisgIGZpbmFsIGxpbmsyID0gTGluaygnZGFydCcpLi5jcmVhdGVTeW5jKGxpbmtMb2NhdGlvbiwgcmVjdXJzaXZlOiB0cnVlKTsKKyAgZmluYWwgcGF0aCA9IFVyaS5wYXJzZShsaW5rMi5hYnNvbHV0ZS5wYXRoKS5wYXRoOworICBEaXJlY3RvcnkuY3VycmVudCA9IG9yaWdEaXI7CisgIGZpbmFsIHJlc3VsdCA9IGF3YWl0IFByb2Nlc3MucnVuKCcke3BhdGh9JywgWydoZWxwJ10pOworICBFeHBlY3QuZXF1YWxzKHJlc3VsdC5leGl0Q29kZSwgMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDEzMjlfcmVsYXRpdmVfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzXzQxMzI5X3JlbGF0aXZlX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJhNDAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzXzQxMzI5X3JlbGF0aXZlX3Rlc3QuZGFydApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphc3luY19oZWxwZXIvYXN5bmNfaGVscGVyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwOworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK0Z1dHVyZTx2b2lkPiBtYWluKCkgYXN5bmMgeworICBmaW5hbCBvcmlnRGlyID0gRGlyZWN0b3J5LmN1cnJlbnQ7CisgIGZpbmFsIGV4ZVBhdGggPSBQbGF0Zm9ybS5yZXNvbHZlZEV4ZWN1dGFibGU7CisgIGZpbmFsIGQgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygnZGFydF9zeW1saW5rJyk7CisKKyAgLy8gUm91Z2hseSBlbXVsYXRlIGEgQnJldyBpbnN0YWxsYXRpb246CisgIC8vICAgLSAkQlJFVy9iaW4vZGFydCAtPiAuLi9DZWxsYXIvZGFydC8yLjguMC1kZXYuMjAuMC9iaW4vZGFydAorICAvLyAgIC0gJEJSRVcvQ2VsbGFyL2RhcnQvMi44LjAtZGV2LjIwLjAvYmluL2RhcnQgLT4gJERBUlRfU0RLL2Jpbi9kYXJ0CisgIGZpbmFsIGEgPSBEaXJlY3RvcnkoJyR7ZC5wYXRofS91c3IvbG9jYWwvYmluJyk7CisgIGEuY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOworCisgIC8vIC91c3IvbG9jYWwvQ2VsbGFyL2RhcnQvMi44LjAtZGV2LjIwLjAvYmluL2RhcnQgLT4gJERBUlRfU0RLL2Jpbi9kYXJ0CisgIERpcmVjdG9yeS5jdXJyZW50ID0gYTsKKyAgZmluYWwgbGlua0xvY2F0aW9uID0gJy4uL0NlbGxhci9kYXJ0LzIuOC4wLWRldi4yMC4wL2Jpbi9kYXJ0JzsKKyAgZmluYWwgbGluayA9IExpbmsobGlua0xvY2F0aW9uKTsKKyAgbGluay5jcmVhdGVTeW5jKGV4ZVBhdGgsIHJlY3Vyc2l2ZTogdHJ1ZSk7CisKKyAgLy8gL3Vzci9sb2NhbC9iaW4vZGFydCAtPiAvdXNyL2xvY2FsL0NlbGxhci9kYXJ0LzIuOC4wLWRldi4yMC9iaW4vZGFydAorICBmaW5hbCBsaW5rMiA9IExpbmsoJ2RhcnQnKS4uY3JlYXRlU3luYyhsaW5rTG9jYXRpb24sIHJlY3Vyc2l2ZTogdHJ1ZSk7CisgIGZpbmFsIHBhdGggPSBVcmkucGFyc2UobGluazIuYWJzb2x1dGUucGF0aCkucGF0aDsKKyAgRGlyZWN0b3J5LmN1cnJlbnQgPSBvcmlnRGlyOworICBmaW5hbCByZXN1bHQgPSBhd2FpdCBQcm9jZXNzLnJ1bignJHtwYXRofScsIFsnaGVscCddKTsKKyAgRXhwZWN0LmVxdWFscyhyZXN1bHQuZXhpdENvZGUsIDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzXzQyMDkyX3NjcmlwdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS9yZWdyZXNzXzQyMDkyX3NjcmlwdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzU3YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDIwOTJfc2NyaXB0LmRhcnQKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworRnV0dXJlPHZvaWQ+IG1haW4oKSBhc3luYyB7CisgIHZhciBjb3VudCA9IDA7CisgIFByb2Nlc3NTaWduYWwuc2lnaW50LndhdGNoKCkuZm9yRWFjaCgocykgeworICAgIGNvdW50Kys7CisgICAgcHJpbnQoJ2NoaWxkOiBHb3QgYSBTSUdJTlQgJGNvdW50IHRpbWVzLCBoaXQgaXQgMyB0aW1lcyB0byB0ZXJtaW5hdGUnKTsKKyAgICBpZiAoY291bnQgPj0gMykgeworICAgICAgZXhpdCg0Mik7CisgICAgfQorICB9KTsKKyAgcHJpbnQoJ1dhaXRpbmcuLi4nKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBhd2FpdCBGdXR1cmUuZGVsYXllZChjb25zdCBEdXJhdGlvbihzZWNvbmRzOiA1KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvcmVncmVzc180MjA5Ml90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDIwOTJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjNjYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3JlZ3Jlc3NfNDIwOTJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAyMCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworCitsYXRlIFByb2Nlc3MgcHJvY2VzczsKK2Jvb2wgbGFzdEtpbGwgPSBmYWxzZTsKKworRnV0dXJlPHZvaWQ+IHNpZ2ludChpbnQgaXRlcmF0aW9ucykgYXN5bmMgeworICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSkgeworICAgIGlmIChpICsgMSA9PSBpdGVyYXRpb25zKSB7CisgICAgICBsYXN0S2lsbCA9IHRydWU7CisgICAgfQorICAgIHByb2Nlc3Mua2lsbChQcm9jZXNzU2lnbmFsLnNpZ2ludCk7CisgICAgLy8gWWllbGQgdG8gdGhlIGV2ZW50IGxvb3AgdG8gYWxsb3cgZm9yIHRoZSBzaWduYWwgdG8gYmUgc2VudC4KKyAgICBhd2FpdCBGdXR1cmUudmFsdWUobnVsbCk7CisgIH0KK30KKworRnV0dXJlPHZvaWQ+IG1haW4oKSBhc3luYyB7CisgIHByb2Nlc3MgPSBhd2FpdCBQcm9jZXNzLnN0YXJ0KAorICAgIFBsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZSwKKyAgICBbCisgICAgICBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgncmVncmVzc180MjA5Ml9zY3JpcHQuZGFydCcpLnRvU3RyaW5nKCksCisgICAgXSwKKyAgKTsKKyAgZmluYWwgc3RhcnRDb21wbGV0ZXIgPSBDb21wbGV0ZXI8dm9pZD4oKTsKKyAgbGF0ZSBTdHJlYW1TdWJzY3JpcHRpb24gc3ViOworICBzdWIgPSBwcm9jZXNzLnN0ZG91dC50cmFuc2Zvcm0oVXRmOERlY29kZXIoKSkubGlzdGVuKChldmVudCkgeworICAgIGlmIChldmVudC5jb250YWlucygnV2FpdGluZy4uLicpKSB7CisgICAgICBzdGFydENvbXBsZXRlci5jb21wbGV0ZSgpOworICAgICAgc3ViLmNhbmNlbCgpOworICAgIH0KKyAgfSk7CisKKyAgLy8gV2FpdCBmb3IgdGFyZ2V0IHNjcmlwdCB0byBzZXR1cCBpdHMgc2lnbmFsIGhhbmRsaW5nLgorICBhd2FpdCBzdGFydENvbXBsZXRlci5mdXR1cmU7CisKKyAgZmluYWwgZXhpdENvbXBsZXRlciA9IENvbXBsZXRlcjx2b2lkPigpOworICBwcm9jZXNzLmV4aXRDb2RlLnRoZW4oKGNvZGUpIHsKKyAgICBFeHBlY3QuaXNUcnVlKGxhc3RLaWxsKTsKKyAgICBleGl0Q29tcGxldGVyLmNvbXBsZXRlKCk7CisgIH0pOworICBhd2FpdCBzaWdpbnQoMyk7CisgIGF3YWl0IGV4aXRDb21wbGV0ZXIuZnV0dXJlOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS9zbG93cGF0aF9zYWZlcG9pbnRzX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvc2xvd3BhdGhfc2FmZXBvaW50c190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4M2U2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvc2xvd3BhdGhfc2FmZXBvaW50c190ZXN0LmRhcnQKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8gVGVzdCB0aGF0IHNhZmVwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHNsb3dwYXRocyBkb24ndCBtYXJrIG5vbi1leGlzdGluZyB2YWx1ZXMKKy8vIGFsaXZlLgorLy8gVk1PcHRpb25zPS0tb3B0aW1pemF0aW9uLWNvdW50ZXItdGhyZXNob2xkPTUgLS1uby1pbmxpbmVfYWxsb2MgLS1uby1iYWNrZ3JvdW5kLWNvbXBpbGF0aW9uCisKK2NsYXNzIEMgeworICBmaW5hbCBuZXh0OworICBDKHRoaXMubmV4dCk7Cit9CisKK25vb3AoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkgPT4gMDsKKworY3Jhc2goZiwgaSkgeworICBmaW5hbCBvYmoxID0gbmV3IEMobnVsbCk7CisgIGZpbmFsIG9iajIgPSBuZXcgQyhvYmoxKTsKKyAgZmluYWwgb2JqMyA9IG5ldyBDKG9iajIpOworICBmaW5hbCBvYmo0ID0gbmV3IEMob2JqMyk7CisgIGZpbmFsIG9iajUgPSBuZXcgQyhvYmo0KTsKKyAgZmluYWwgb2JqNiA9IG5ldyBDKG9iajUpOworICBmaW5hbCBvYmo3ID0gbmV3IEMob2JqNik7CisgIGZpbmFsIG9iajggPSBuZXcgQyhvYmo3KTsKKyAgZmluYWwgb2JqOSA9IG5ldyBDKG9iajgpOworCisgIGYob2JqMSwgb2JqMiwgb2JqMywgb2JqNCwgb2JqNSwgb2JqNiwgb2JqNywgb2JqOCwgb2JqOSk7CisgIGYob2JqMSwgb2JqMiwgb2JqMywgb2JqNCwgb2JqNSwgb2JqNiwgb2JqNywgb2JqOCwgb2JqOSk7CisKKyAgZmluYWwgZDEgPSAoaSArIDApLnRvRG91YmxlKCk7CisgIGZpbmFsIGQyID0gKGkgKyAxKS50b0RvdWJsZSgpOworICBmaW5hbCBkMyA9IChpICsgMikudG9Eb3VibGUoKTsKKyAgZmluYWwgZDQgPSAoaSArIDMpLnRvRG91YmxlKCk7CisgIGZpbmFsIGQ1ID0gKGkgKyA0KS50b0RvdWJsZSgpOworICBmaW5hbCBkNiA9IChpICsgNSkudG9Eb3VibGUoKTsKKyAgZmluYWwgZDcgPSAoaSArIDYpLnRvRG91YmxlKCk7CisgIGZpbmFsIGQ4ID0gKGkgKyA3KS50b0RvdWJsZSgpOworICBmaW5hbCBkOSA9IChpICsgOCkudG9Eb3VibGUoKTsKKworICBmKGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDkpOworICBmKGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDkpOworfQorCittYWluKCkgeworICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBwcmludChpKTsKKyAgICBjcmFzaChub29wLCAxMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfYXJyYXlfaW50NjRfdWludDY0X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfYXJyYXlfaW50NjRfdWludDY0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU3OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS90eXBlZF9hcnJheV9pbnQ2NF91aW50NjRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVk1PcHRpb25zPS0tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisvLyBWTU9wdGlvbnM9LS1uby1lbmFibGUtaXNvbGF0ZS1ncm91cHMKKy8vCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBuYXRpdmUgdHlwZWQgYXJyYXlzLCBpbnQ2NCBhbmQgdWludDY0IG9ubHkuCisKKy8vIExpYnJhcnkgdGFnIHRvIGJlIGFibGUgdG8gcnVuIGluIGh0bWwgdGVzdCBmcmFtZXdvcmsuCitsaWJyYXJ5IFR5cGVkQXJyYXk7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICdwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCc7CitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0Omlzb2xhdGUnOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCittYWluKCkgeworICB0ZXN0KGludDY0X3JlY2VpdmVyKTsKKyAgdGVzdCh1aW50NjRfcmVjZWl2ZXIpOworfQorCit0ZXN0KGYpIHsKKyAgYXN5bmNTdGFydCgpOworICByZXR1cm4gZigpLndoZW5Db21wbGV0ZShhc3luY0VuZCk7Cit9CisKKy8vIEludDY0IGFycmF5LgorSW50NjRMaXN0IGluaXRJbnQ2NCgpIHsKKyAgdmFyIGludDY0ID0gbmV3IEludDY0TGlzdCgyKTsKKyAgaW50NjRbMF0gPSAxMDAwMDAwMDsKKyAgaW50NjRbMV0gPSAxMDAwMDAwMDA7CisgIHJldHVybiBpbnQ2NDsKK30KKworSW50NjRMaXN0IGludDY0ID0gaW5pdEludDY0KCk7CisKK2ludDY0X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24oaW50NjRfc2VuZGVyLCBbaW50NjQubGVuZ3RoLCByZXNwb25zZS5zZW5kUG9ydF0pOworICBhc3luY1N0YXJ0KCk7CisgIHJldHVybiByZXNwb25zZS5maXJzdC50aGVuKChhKSB7CisgICAgRXhwZWN0LmVxdWFscyhpbnQ2NC5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoaW50NjRbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgiaW50NjRfcmVjZWl2ZXIiKTsKKyAgICBhc3luY0VuZCgpOworICB9KTsKK30KKworaW50NjRfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyhpbnQ2NC5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IEludDY0TGlzdChsZW4pOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYVtpXSA9IGludDY0W2ldOworICB9CisgIHIuc2VuZChhKTsKK30KKworLy8gVWludDY0IGFycmF5LgorVWludDY0TGlzdCBpbml0VWludDY0KCkgeworICB2YXIgdWludDY0ID0gbmV3IFVpbnQ2NExpc3QoMik7CisgIHVpbnQ2NFswXSA9IDB4ZmZmZmZmZmZmZmZmZmZmZjsKKyAgdWludDY0WzFdID0gMHg3ZmZmZmZmZmZmZmZmZmZmOworICByZXR1cm4gdWludDY0OworfQorCitVaW50NjRMaXN0IHVpbnQ2NCA9IGluaXRVaW50NjQoKTsKKwordWludDY0X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24odWludDY0X3NlbmRlciwgW3VpbnQ2NC5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHVpbnQ2NC5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHModWludDY0W2ldLCBhW2ldKTsKKyAgICB9CisgICAgcHJpbnQoInVpbnQ2NF9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCit1aW50NjRfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyh1aW50NjQubGVuZ3RoLCBsZW4pOworICB2YXIgYSA9IG5ldyBVaW50NjRMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gdWludDY0W2ldOworICB9CisgIHIuc2VuZChhKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfYXJyYXlfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZS90eXBlZF9hcnJheV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0YzZjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfYXJyYXlfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMzE2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWVuYWJsZS1pc29sYXRlLWdyb3VwcworLy8gVk1PcHRpb25zPS0tbm8tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisvLworLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgbmF0aXZlIGZsb2F0IGFuZCBpbnQgYXJyYXlzLiAgNjQtYml0IGludCBhcnJheXMKKy8vIGFyZSBpbiBhIHNlcGFyYXRlIHRlc3QuCisKKy8vIExpYnJhcnkgdGFnIHRvIGJlIGFibGUgdG8gcnVuIGluIGh0bWwgdGVzdCBmcmFtZXdvcmsuCitsaWJyYXJ5IFR5cGVkQXJyYXk7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICdwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCc7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YSc7CisKK3ZvaWQgbWFpbigpIHsKKyAgdGVzdChpbnQ4X3JlY2VpdmVyKTsKKyAgdGVzdCh1aW50OF9yZWNlaXZlcik7CisgIHRlc3QoaW50MTZfcmVjZWl2ZXIpOworICB0ZXN0KHVpbnQxNl9yZWNlaXZlcik7CisgIHRlc3QoaW50MzJfcmVjZWl2ZXIpOworICB0ZXN0KHVpbnQzMl9yZWNlaXZlcik7CisgIC8vIGludDY0IGFuZCB1aW50NjQgaW4gc2VwYXJhdGUgdGVzdC4KKyAgdGVzdChmbG9hdDMyX3JlY2VpdmVyKTsKKyAgdGVzdChmbG9hdDY0X3JlY2VpdmVyKTsKK30KKwordGVzdChmKSB7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIGYoKS53aGVuQ29tcGxldGUoYXN5bmNFbmQpOworfQorCisvLyBJbnQ4IGFycmF5LgorSW50OExpc3QgaW5pdEludDgoKSB7CisgIHZhciBpbnQ4ID0gbmV3IEludDhMaXN0KDIpOworICBpbnQ4WzBdID0gMTA7CisgIGludDhbMV0gPSAxMDA7CisgIHJldHVybiBpbnQ4OworfQorCitJbnQ4TGlzdCBpbnQ4ID0gaW5pdEludDgoKTsKKworaW50OF9yZWNlaXZlcigpIHsKKyAgdmFyIHJlc3BvbnNlID0gbmV3IFJlY2VpdmVQb3J0KCk7CisgIHZhciByZW1vdGUgPSBJc29sYXRlLnNwYXduKGludDhfc2VuZGVyLCBbaW50OC5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKGludDgubGVuZ3RoLCBhLmxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKGludDhbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgiaW50OF9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCitpbnQ4X3NlbmRlcihtZXNzYWdlKSB7CisgIHZhciBsZW4gPSBtZXNzYWdlWzBdOworICB2YXIgciA9IG1lc3NhZ2VbMV07CisgIEV4cGVjdC5lcXVhbHMoaW50OC5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IEludDhMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gaW50OFtpXTsKKyAgfQorICByLnNlbmQoYSk7Cit9CisKKy8vIFVpbnQ4IGFycmF5LgorVWludDhMaXN0IGluaXRVaW50OCgpIHsKKyAgdmFyIHVpbnQ4ID0gbmV3IFVpbnQ4TGlzdCgyKTsKKyAgdWludDhbMF0gPSAweGZmOworICB1aW50OFsxXSA9IDB4N2Y7CisgIHJldHVybiB1aW50ODsKK30KKworVWludDhMaXN0IHVpbnQ4ID0gaW5pdFVpbnQ4KCk7CisKK3VpbnQ4X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24odWludDhfc2VuZGVyLCBbdWludDgubGVuZ3RoLCByZXNwb25zZS5zZW5kUG9ydF0pOworICBhc3luY1N0YXJ0KCk7CisgIHJldHVybiByZXNwb25zZS5maXJzdC50aGVuKChhKSB7CisgICAgRXhwZWN0LmVxdWFscyh1aW50OC5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHModWludDhbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgidWludDhfcmVjZWl2ZXIiKTsKKyAgICBhc3luY0VuZCgpOworICB9KTsKK30KKwordWludDhfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyh1aW50OC5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IFVpbnQ4TGlzdChsZW4pOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYVtpXSA9IHVpbnQ4W2ldOworICB9CisgIHIuc2VuZChhKTsKK30KKworLy8gSW50MTYgYXJyYXkuCitJbnQxNkxpc3QgaW5pdEludDE2KCkgeworICB2YXIgaW50MTYgPSBuZXcgSW50MTZMaXN0KDIpOworICBpbnQxNlswXSA9IDEwMDA7CisgIGludDE2WzFdID0gMTAwMDA7CisgIHJldHVybiBpbnQxNjsKK30KKworSW50MTZMaXN0IGludDE2ID0gaW5pdEludDE2KCk7CisKK2ludDE2X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24oaW50MTZfc2VuZGVyLCBbaW50MTYubGVuZ3RoLCByZXNwb25zZS5zZW5kUG9ydF0pOworICBhc3luY1N0YXJ0KCk7CisgIHJldHVybiByZXNwb25zZS5maXJzdC50aGVuKChhKSB7CisgICAgRXhwZWN0LmVxdWFscyhpbnQxNi5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHMoaW50MTZbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgiaW50MTZfcmVjZWl2ZXIiKTsKKyAgICBhc3luY0VuZCgpOworICB9KTsKK30KKworaW50MTZfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyhpbnQxNi5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IEludDE2TGlzdChsZW4pOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYVtpXSA9IGludDE2W2ldOworICB9CisgIHIuc2VuZChhKTsKK30KKworLy8gVWludDE2IGFycmF5LgorVWludDE2TGlzdCBpbml0VWludDE2KCkgeworICB2YXIgdWludDE2ID0gbmV3IFVpbnQxNkxpc3QoMik7CisgIHVpbnQxNlswXSA9IDB4ZmZmZjsKKyAgdWludDE2WzFdID0gMHg3ZmZmOworICByZXR1cm4gdWludDE2OworfQorCitVaW50MTZMaXN0IHVpbnQxNiA9IGluaXRVaW50MTYoKTsKKwordWludDE2X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24odWludDE2X3NlbmRlciwgW3VpbnQxNi5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHVpbnQxNi5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHModWludDE2W2ldLCBhW2ldKTsKKyAgICB9CisgICAgcHJpbnQoInVpbnQxNl9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCit1aW50MTZfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyh1aW50MTYubGVuZ3RoLCBsZW4pOworICB2YXIgYSA9IG5ldyBVaW50MTZMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gdWludDE2W2ldOworICB9CisgIHIuc2VuZChhKTsKK30KKworLy8gSW50MzIgYXJyYXkuCitJbnQzMkxpc3QgaW5pdEludDMyKCkgeworICB2YXIgaW50MzIgPSBuZXcgSW50MzJMaXN0KDIpOworICBpbnQzMlswXSA9IDEwMDAwMDsKKyAgaW50MzJbMV0gPSAxMDAwMDAwOworICByZXR1cm4gaW50MzI7Cit9CisKK0ludDMyTGlzdCBpbnQzMiA9IGluaXRJbnQzMigpOworCitpbnQzMl9yZWNlaXZlcigpIHsKKyAgdmFyIHJlc3BvbnNlID0gbmV3IFJlY2VpdmVQb3J0KCk7CisgIHZhciByZW1vdGUgPSBJc29sYXRlLnNwYXduKGludDMyX3NlbmRlciwgW2ludDMyLmxlbmd0aCwgcmVzcG9uc2Uuc2VuZFBvcnRdKTsKKyAgYXN5bmNTdGFydCgpOworICByZXR1cm4gcmVzcG9uc2UuZmlyc3QudGhlbigoYSkgeworICAgIEV4cGVjdC5lcXVhbHMoaW50MzIubGVuZ3RoLCBhLmxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKGludDMyW2ldLCBhW2ldKTsKKyAgICB9CisgICAgcHJpbnQoImludDMyX3JlY2VpdmVyIik7CisgICAgYXN5bmNFbmQoKTsKKyAgfSk7Cit9CisKK2ludDMyX3NlbmRlcihtZXNzYWdlKSB7CisgIHZhciBsZW4gPSBtZXNzYWdlWzBdOworICB2YXIgciA9IG1lc3NhZ2VbMV07CisgIEV4cGVjdC5lcXVhbHMoaW50MzIubGVuZ3RoLCBsZW4pOworICB2YXIgYSA9IG5ldyBJbnQzMkxpc3QobGVuKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGFbaV0gPSBpbnQzMltpXTsKKyAgfQorICByLnNlbmQoYSk7Cit9CisKKy8vIFVpbnQzMiBhcnJheS4KK1VpbnQzMkxpc3QgaW5pdFVpbnQzMigpIHsKKyAgdmFyIHVpbnQzMiA9IG5ldyBVaW50MzJMaXN0KDIpOworICB1aW50MzJbMF0gPSAweGZmZmZmZmZmOworICB1aW50MzJbMV0gPSAweDdmZmZmZmZmOworICByZXR1cm4gdWludDMyOworfQorCitVaW50MzJMaXN0IHVpbnQzMiA9IGluaXRVaW50MzIoKTsKKwordWludDMyX3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9IElzb2xhdGUuc3Bhd24odWludDMyX3NlbmRlciwgW3VpbnQzMi5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKHVpbnQzMi5sZW5ndGgsIGEubGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgIEV4cGVjdC5lcXVhbHModWludDMyW2ldLCBhW2ldKTsKKyAgICB9CisgICAgcHJpbnQoInVpbnQzMl9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCit1aW50MzJfc2VuZGVyKG1lc3NhZ2UpIHsKKyAgdmFyIGxlbiA9IG1lc3NhZ2VbMF07CisgIHZhciByID0gbWVzc2FnZVsxXTsKKyAgRXhwZWN0LmVxdWFscyh1aW50MzIubGVuZ3RoLCBsZW4pOworICB2YXIgYSA9IG5ldyBVaW50MzJMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gdWludDMyW2ldOworICB9CisgIHIuc2VuZChhKTsKK30KKworLy8gRmxvYXQzMiBBcnJheS4KK0Zsb2F0MzJMaXN0IGluaXRGbG9hdDMyKCkgeworICB2YXIgZmxvYXQzMiA9IG5ldyBGbG9hdDMyTGlzdCgyKTsKKyAgZmxvYXQzMlswXSA9IDEuMDsKKyAgZmxvYXQzMlsxXSA9IDIuMDsKKyAgcmV0dXJuIGZsb2F0MzI7Cit9CisKK0Zsb2F0MzJMaXN0IGZsb2F0MzIgPSBpbml0RmxvYXQzMigpOworCitmbG9hdDMyX3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9CisgICAgICBJc29sYXRlLnNwYXduKGZsb2F0MzJfc2VuZGVyLCBbZmxvYXQzMi5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKGZsb2F0MzIubGVuZ3RoLCBhLmxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKGZsb2F0MzJbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgiZmxvYXQzMl9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCitmbG9hdDMyX3NlbmRlcihtZXNzYWdlKSB7CisgIHZhciBsZW4gPSBtZXNzYWdlWzBdOworICB2YXIgciA9IG1lc3NhZ2VbMV07CisgIEV4cGVjdC5lcXVhbHMoZmxvYXQzMi5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IEZsb2F0MzJMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gZmxvYXQzMltpXTsKKyAgfQorICByLnNlbmQoYSk7Cit9CisKKy8vIEZsb2F0NjQgQXJyYXkuCitGbG9hdDY0TGlzdCBpbml0RmxvYXQ2NCgpIHsKKyAgdmFyIGZsb2F0NjQgPSBuZXcgRmxvYXQ2NExpc3QoMik7CisgIGZsb2F0NjRbMF0gPSAxMDEuMjM0OworICBmbG9hdDY0WzFdID0gMjAxLjc2NTsKKyAgcmV0dXJuIGZsb2F0NjQ7Cit9CisKK0Zsb2F0NjRMaXN0IGZsb2F0NjQgPSBpbml0RmxvYXQ2NCgpOworCitmbG9hdDY0X3JlY2VpdmVyKCkgeworICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVjZWl2ZVBvcnQoKTsKKyAgdmFyIHJlbW90ZSA9CisgICAgICBJc29sYXRlLnNwYXduKGZsb2F0NjRfc2VuZGVyLCBbZmxvYXQ2NC5sZW5ndGgsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgIGFzeW5jU3RhcnQoKTsKKyAgcmV0dXJuIHJlc3BvbnNlLmZpcnN0LnRoZW4oKGEpIHsKKyAgICBFeHBlY3QuZXF1YWxzKGZsb2F0NjQubGVuZ3RoLCBhLmxlbmd0aCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKGZsb2F0NjRbaV0sIGFbaV0pOworICAgIH0KKyAgICBwcmludCgiZmxvYXQ2NF9yZWNlaXZlciIpOworICAgIGFzeW5jRW5kKCk7CisgIH0pOworfQorCitmbG9hdDY0X3NlbmRlcihtZXNzYWdlKSB7CisgIHZhciBsZW4gPSBtZXNzYWdlWzBdOworICB2YXIgciA9IG1lc3NhZ2VbMV07CisgIEV4cGVjdC5lcXVhbHMoZmxvYXQ2NC5sZW5ndGgsIGxlbik7CisgIHZhciBhID0gbmV3IEZsb2F0NjRMaXN0KGxlbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBhW2ldID0gZmxvYXQ2NFtpXTsKKyAgfQorICByLnNlbmQoYSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3R5cGVkX2RhdGFfaXNvbGF0ZV90ZXN0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3R5cGVkX2RhdGFfaXNvbGF0ZV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfZGF0YV9pc29sYXRlX3Rlc3QuZGFydApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFZNT3B0aW9ucz0tLWVuYWJsZS1pc29sYXRlLWdyb3VwcworLy8gVk1PcHRpb25zPS0tbm8tZW5hYmxlLWlzb2xhdGUtZ3JvdXBzCisvLworLy8gRGFydCB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgdHlwZWQgZGF0YS4KKworLy8gTGlicmFyeSB0YWcgdG8gYmUgYWJsZSB0byBydW4gaW4gaHRtbCB0ZXN0IGZyYW1ld29yay4KK2xpYnJhcnkgVHlwZWREYXRhSXNvbGF0ZVRlc3Q7CisKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6aXNvbGF0ZSc7CitpbXBvcnQgJ3BhY2thZ2U6YXN5bmNfaGVscGVyL2FzeW5jX2hlbHBlci5kYXJ0JzsKKworc2Vjb25kKG1lc3NhZ2UpIHsKKyAgdmFyIGRhdGEgPSBtZXNzYWdlWzBdOworICB2YXIgcmVwbHlUbyA9IG1lc3NhZ2VbMV07CisgIHByaW50KCdnb3QgZGF0YScpOworICBwcmludChkYXRhKTsKKyAgcHJpbnQoJ3ByaW50ZWQgZGF0YScpOworICByZXBseVRvLnNlbmQoJ09LJyk7Cit9CisKK21haW4oKSB7CisgIGFzeW5jU3RhcnQoKTsKKyAgbmV3IEZpbGUoUGxhdGZvcm0uc2NyaXB0LnRvRmlsZVBhdGgoKSkucmVhZEFzQnl0ZXMoKS50aGVuKChMaXN0PGludD4gZGF0YSkgeworICAgIHZhciByZXNwb25zZSA9IG5ldyBSZWNlaXZlUG9ydCgpOworICAgIHZhciByZW1vdGUgPSBJc29sYXRlLnNwYXduKHNlY29uZCwgW2RhdGEsIHJlc3BvbnNlLnNlbmRQb3J0XSk7CisgICAgcmVzcG9uc2UuZmlyc3QudGhlbigocmVwbHkpIHsKKyAgICAgIHByaW50KCdnb3QgcmVwbHknKTsKKyAgICAgIGFzeW5jRW5kKCk7CisgICAgfSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZS90eXBlZF9kYXRhX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfZGF0YV90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzMjMxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfZGF0YV90ZXN0LmRhcnQKQEAgLTAsMCArMSw1ODMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyB0eXBlZCBkYXRhLgorCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb25fY291bnRlcl90aHJlc2hvbGQ9MTAgLS1uby1iYWNrZ3JvdW5kX2NvbXBpbGF0aW9uCisKKy8vIExpYnJhcnkgdGFnIHRvIGJlIGFibGUgdG8gcnVuIGluIGh0bWwgdGVzdCBmcmFtZXdvcmsuCitsaWJyYXJ5IFR5cGVkRGF0YVRlc3Q7CisKK2ltcG9ydCAicGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQiOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnOworCit2b2lkIHRlc3RDcmVhdGVVaW50OFR5cGVkRGF0YSgpIHsKKyAgVWludDhMaXN0IHR5cGVkX2RhdGE7CisKKyAgdHlwZWRfZGF0YSA9IG5ldyBVaW50OExpc3QoMCk7CisgIEV4cGVjdC5pc1RydWUodHlwZWRfZGF0YSBpcyBVaW50OExpc3QpOworICBFeHBlY3QuaXNGYWxzZSh0eXBlZF9kYXRhIGlzIFVpbnQ4Q2xhbXBlZExpc3QpOworICBFeHBlY3QuZXF1YWxzKDAsIHR5cGVkX2RhdGEubGVuZ3RoKTsKKworICB0eXBlZF9kYXRhID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgIEV4cGVjdC5lcXVhbHMoMTAsIHR5cGVkX2RhdGEubGVuZ3RoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygwLCB0eXBlZF9kYXRhW2ldKTsKKyAgfQorfQorCit2b2lkIHRlc3RDcmVhdGVDbGFtcGVkVWludDhUeXBlZERhdGEoKSB7CisgIFVpbnQ4Q2xhbXBlZExpc3QgdHlwZWRfZGF0YTsKKworICB0eXBlZF9kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZExpc3QoMCk7CisgIEV4cGVjdC5pc1RydWUodHlwZWRfZGF0YSBpcyBVaW50OENsYW1wZWRMaXN0KTsKKyAgRXhwZWN0LmlzRmFsc2UodHlwZWRfZGF0YSBpcyBVaW50OExpc3QpOworICBFeHBlY3QuZXF1YWxzKDAsIHR5cGVkX2RhdGEubGVuZ3RoKTsKKyAgRXhwZWN0LmVxdWFscygwLCB0eXBlZF9kYXRhLmxlbmd0aEluQnl0ZXMpOworCisgIHR5cGVkX2RhdGEgPSBuZXcgVWludDhDbGFtcGVkTGlzdCgxMCk7CisgIEV4cGVjdC5lcXVhbHMoMTAsIHR5cGVkX2RhdGEubGVuZ3RoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygwLCB0eXBlZF9kYXRhW2ldKTsKKyAgfQorfQorCit2b2lkIHRlc3RUeXBlZERhdGFSYW5nZShib29sIGNoZWNrX3Rocm93cykgeworICBJbnQ4TGlzdCB0eXBlZF9kYXRhOworICB0eXBlZF9kYXRhID0gbmV3IEludDhMaXN0KDEwKTsKKyAgdHlwZWRfZGF0YVsxXSA9IDA7CisgIEV4cGVjdC5lcXVhbHMoMCwgdHlwZWRfZGF0YVsxXSk7CisgIHR5cGVkX2RhdGFbMl0gPSAtMTI4OworICBFeHBlY3QuZXF1YWxzKC0xMjgsIHR5cGVkX2RhdGFbMl0pOworICB0eXBlZF9kYXRhWzNdID0gMTI3OworICBFeHBlY3QuZXF1YWxzKDEyNywgdHlwZWRfZGF0YVszXSk7CisgIC8vIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgdGhyb3cuCisgIHR5cGVkX2RhdGFbMF0gPSAxMjg7CisgIHR5cGVkX2RhdGFbNF0gPSAtMTI5OworICBFeHBlY3QudGhyb3dzKCgpID0+IHR5cGVkX2RhdGFbLTFdKTsKKyAgRXhwZWN0LnRocm93cygoKSA9PiB0eXBlZF9kYXRhWzEwMF0pOworfQorCit2b2lkIHRlc3RVbnNpZ25lZFR5cGVkRGF0YVJhbmdlKGJvb2wgY2hlY2tfdGhyb3dzKSB7CisgIFVpbnQ4TGlzdCB0eXBlZF9kYXRhOworICB0eXBlZF9kYXRhID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisKKyAgdHlwZWRfZGF0YVsxXSA9IDI1NTsKKyAgRXhwZWN0LmVxdWFscygyNTUsIHR5cGVkX2RhdGFbMV0pOworICB0eXBlZF9kYXRhWzFdID0gMDsKKyAgRXhwZWN0LmVxdWFscygwLCB0eXBlZF9kYXRhWzFdKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVkX2RhdGEubGVuZ3RoOyBpKyspIHsKKyAgICB0eXBlZF9kYXRhW2ldID0gaTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVkX2RhdGEubGVuZ3RoOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKGksIHR5cGVkX2RhdGFbaV0pOworICB9CisKKyAgLy8gVGhlc2Ugc2hvdWxkIGV2ZW50dWFsbHkgdGhyb3cuCisgIHR5cGVkX2RhdGFbMV0gPSAyNTY7CisgIHR5cGVkX2RhdGFbMV0gPSAtMTsKKyAgdHlwZWRfZGF0YVsyXSA9IC0xMjk7CisgIEV4cGVjdC50aHJvd3MoKCkgPT4gdHlwZWRfZGF0YVstMV0pOworICBFeHBlY3QudGhyb3dzKCgpID0+IHR5cGVkX2RhdGFbMTAwXSk7Cit9CisKK3ZvaWQgdGVzdENsYW1wZWRVbnNpZ25lZFR5cGVkRGF0YVJhbmdlSGVscGVyKAorICAgIFVpbnQ4Q2xhbXBlZExpc3QgdHlwZWRfZGF0YSwgYm9vbCBjaGVja190aHJvd3MpIHsKKyAgVWludDhDbGFtcGVkTGlzdCB0eXBlZF9kYXRhOworICB0eXBlZF9kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZExpc3QoMTApOworCisgIHR5cGVkX2RhdGFbMV0gPSAyNTU7CisgIEV4cGVjdC5lcXVhbHMoMjU1LCB0eXBlZF9kYXRhWzFdKTsKKyAgdHlwZWRfZGF0YVsxXSA9IDA7CisgIEV4cGVjdC5lcXVhbHMoMCwgdHlwZWRfZGF0YVsxXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWRfZGF0YS5sZW5ndGg7IGkrKykgeworICAgIHR5cGVkX2RhdGFbaV0gPSBpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWRfZGF0YS5sZW5ndGg7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoaSwgdHlwZWRfZGF0YVtpXSk7CisgIH0KKworICAvLyBUaGVzZSBzaG91bGQgZXZlbnR1YWxseSB0aHJvdy4KKyAgdHlwZWRfZGF0YVsxXSA9IDI1NjsKKyAgdHlwZWRfZGF0YVsyXSA9IC0xMjk7CisgIEV4cGVjdC5lcXVhbHMoMjU1LCB0eXBlZF9kYXRhWzFdKTsKKyAgRXhwZWN0LmVxdWFscygwLCB0eXBlZF9kYXRhWzJdKTsKK30KKwordm9pZCB0ZXN0Q2xhbXBlZFVuc2lnbmVkVHlwZWREYXRhUmFuZ2UoYm9vbCBjaGVja190aHJvd3MpIHsKKyAgdGVzdENsYW1wZWRVbnNpZ25lZFR5cGVkRGF0YVJhbmdlSGVscGVyKAorICAgICAgbmV3IFVpbnQ4Q2xhbXBlZExpc3QoMTApLCBjaGVja190aHJvd3MpOworfQorCit2b2lkIHRlc3RTZXRSYW5nZUhlbHBlcih0eXBlZF9kYXRhKSB7CisgIExpc3Q8aW50PiBsaXN0ID0gWzEwLCAxMSwgMTJdOworICB0eXBlZF9kYXRhLnNldFJhbmdlKDAsIDMsIGxpc3QpOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoMTAgKyBpLCB0eXBlZF9kYXRhW2ldKTsKKyAgfQorCisgIHR5cGVkX2RhdGFbMF0gPSAyMDsKKyAgdHlwZWRfZGF0YVsxXSA9IDIxOworICB0eXBlZF9kYXRhWzJdID0gMjI7CisgIGxpc3Quc2V0UmFuZ2UoMCwgMywgdHlwZWRfZGF0YSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscygyMCArIGksIGxpc3RbaV0pOworICB9CisKKyAgdHlwZWRfZGF0YS5zZXRSYW5nZSgxLCAzLCBjb25zdCBbOCwgOV0pOworICBFeHBlY3QuZXF1YWxzKDIwLCB0eXBlZF9kYXRhWzBdKTsKKyAgRXhwZWN0LmVxdWFscyg4LCB0eXBlZF9kYXRhWzFdKTsKKyAgRXhwZWN0LmVxdWFscyg5LCB0eXBlZF9kYXRhWzJdKTsKK30KKwordm9pZCB0ZXN0U2V0UmFuZ2UoKSB7CisgIHRlc3RTZXRSYW5nZUhlbHBlcihuZXcgVWludDhMaXN0KDMpKTsKKyAgdGVzdFNldFJhbmdlSGVscGVyKG5ldyBVaW50OENsYW1wZWRMaXN0KDMpKTsKKyAgdGVzdFNldFJhbmdlSGVscGVyKG5ldyBVaW50MTZMaXN0KDMpKTsKKyAgdGVzdFNldFJhbmdlSGVscGVyKG5ldyBJbnQxNkxpc3QoMykpOworCisgIHZhciBsaXN0OworICBsaXN0ID0gbmV3IFVpbnQ4TGlzdCg0KTsKKyAgbGlzdC5zZXRSYW5nZSgwLCA0LCAiYWJjZCIuY29kZVVuaXRzLCAwKTsKKyAgRXhwZWN0Lmxpc3RFcXVhbHMobGlzdCwgImFiY2QiLmNvZGVVbml0cyk7CisgIGxpc3QgPSBuZXcgVWludDE2TGlzdCg0KTsKKyAgbGlzdC5zZXRSYW5nZSgwLCA0LCAiYWJjZCIuY29kZVVuaXRzLCAwKTsKKyAgRXhwZWN0Lmxpc3RFcXVhbHMobGlzdCwgImFiY2QiLmNvZGVVbml0cyk7CisgIGxpc3Quc2V0UmFuZ2UoMCwgNCwgIlx4ZmZcdTAxMDBcdWZmZmZceDAwIi5jb2RlVW5pdHMsIDApOworICBFeHBlY3QubGlzdEVxdWFscyhsaXN0LCAiXHhmZlx1MDEwMFx1ZmZmZlx4MDAiLmNvZGVVbml0cyk7CisgIGxpc3QgPSBuZXcgSW50MTZMaXN0KDQpOworICBsaXN0LnNldFJhbmdlKDAsIDQsICJhYmNkIi5jb2RlVW5pdHMsIDApOworICBFeHBlY3QubGlzdEVxdWFscyhsaXN0LCAiYWJjZCIuY29kZVVuaXRzKTsKKyAgbGlzdC5zZXRSYW5nZSgwLCA0LCAiXHhmZlx1MDEwMFx1N2ZmZlx4MDAiLmNvZGVVbml0cywgMCk7CisgIEV4cGVjdC5saXN0RXF1YWxzKGxpc3QsICJceGZmXHUwMTAwXHU3ZmZmXHgwMCIuY29kZVVuaXRzKTsKK30KKworY2xhc3MgQyB7CisgIGZpbmFsIHg7CisgIEModGhpcy54KTsKKyAgb3BlcmF0b3IgPChvKSA9PiBmYWxzZTsKKyAgb3BlcmF0b3IgPj0obykgPT4gZmFsc2U7CisgIG9wZXJhdG9yICoobykgPT4geDsKK30KKwordm9pZCB0ZXN0SW5kZXhPdXRPZlJhbmdlSGVscGVyKHR5cGVkX2RhdGEsIHZhbHVlKSB7CisgIExpc3Q8aW50PiBsaXN0ID0gbmV3IExpc3Q8aW50Pi5maWxsZWQodHlwZWRfZGF0YS5sZW5ndGggKyAxLCAtMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgbGlzdFtpXSA9IGk7CisKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgdHlwZWRfZGF0YS5zZXRSYW5nZSgwLCA0LCBsaXN0KTsKKyAgfSk7CisKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgdHlwZWRfZGF0YS5zZXRSYW5nZSgzLCA0LCBsaXN0KTsKKyAgfSk7CisKKyAgRXhwZWN0LnRocm93cygoKSB7CisgICAgdHlwZWRfZGF0YVtuZXcgQygtNDAwMDAwMCldID0gdmFsdWU7CisgIH0pOworCisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIHZhciBzaXplID0gdHlwZWRfZGF0YS5lbGVtZW50U2l6ZUluQnl0ZXM7CisgICAgdmFyIGkgPSAodHlwZWRfZGF0YS5sZW5ndGggLSAxKSAqIHNpemUgKyAxOworICAgIHR5cGVkX2RhdGFbbmV3IEMoaSldID0gdmFsdWU7CisgIH0pOworCisgIEV4cGVjdC50aHJvd3MoKCkgeworICAgIHR5cGVkX2RhdGFbbmV3IEMoLTEpXSA9IHZhbHVlOworICB9KTsKK30KKwordm9pZCB0ZXN0SW5kZXhPdXRPZlJhbmdlKCkgeworICB0ZXN0SW5kZXhPdXRPZlJhbmdlSGVscGVyKG5ldyBJbnQ4TGlzdCgzKSwgMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IFVpbnQ4TGlzdCgzKSwgMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IFVpbnQ4Q2xhbXBlZExpc3QoMyksIDApOworICB0ZXN0SW5kZXhPdXRPZlJhbmdlSGVscGVyKG5ldyBJbnQxNkxpc3QoMyksIDApOworICB0ZXN0SW5kZXhPdXRPZlJhbmdlSGVscGVyKG5ldyBVaW50MTZMaXN0KDMpLCAwKTsKKyAgdGVzdEluZGV4T3V0T2ZSYW5nZUhlbHBlcihuZXcgSW50MzJMaXN0KDMpLCAwKTsKKyAgdGVzdEluZGV4T3V0T2ZSYW5nZUhlbHBlcihuZXcgVWludDMyTGlzdCgzKSwgMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IEludDY0TGlzdCgzKSwgMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IFVpbnQ2NExpc3QoMyksIDApOworICB0ZXN0SW5kZXhPdXRPZlJhbmdlSGVscGVyKG5ldyBGbG9hdDMyTGlzdCgzKSwgMC4wKTsKKyAgdGVzdEluZGV4T3V0T2ZSYW5nZUhlbHBlcihuZXcgRmxvYXQ2NExpc3QoMyksIDAuMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IEludDY0TGlzdCgzKSwgMCk7CisgIHRlc3RJbmRleE91dE9mUmFuZ2VIZWxwZXIobmV3IFVpbnQ2NExpc3QoMyksIDApOworfQorCit2b2lkIHRlc3ROb051bGxWYWx1ZUxvb3BTZXR0ZXIobGlzdCwgdmFsdWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgbGlzdFtpXSA9IHZhbHVlOworICB9Cit9CisKK3ZvaWQgdGVzdE5vTnVsbFZhbHVlRGlyZWN0U2V0dGVyKGxpc3QsIHZhbHVlKSB7CisgIGxpc3RbMF0gPSB2YWx1ZTsKKyAgbGlzdFsxXSA9IHZhbHVlOworICBsaXN0WzJdID0gdmFsdWU7Cit9CisKK3ZvaWQgdGVzdE5vTnVsbFZhbHVlSGVscGVyKGxpc3QsIHZhbHVlKSB7CisgIHRlc3ROb051bGxWYWx1ZUxvb3BTZXR0ZXIobGlzdCwgdmFsdWUgKyAxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscyh2YWx1ZSArIDEsIGxpc3RbaV0pOworICB9CisgIHRlc3ROb051bGxWYWx1ZURpcmVjdFNldHRlcihsaXN0LCB2YWx1ZSArIDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKHZhbHVlICsgMiwgbGlzdFtpXSk7CisgIH0KKworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICB0ZXN0Tm9OdWxsVmFsdWVMb29wU2V0dGVyKGxpc3QsIG51bGwpOworICB9KTsKKworICBFeHBlY3QudGhyb3dzKCgpIHsKKyAgICB0ZXN0Tm9OdWxsVmFsdWVEaXJlY3RTZXR0ZXIobGlzdCwgbnVsbCk7CisgIH0pOworfQorCit2b2lkIHRlc3ROb051bGxWYWx1ZSgpIHsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBJbnQ4TGlzdCgzKSwgMSk7CisgIHRlc3ROb051bGxWYWx1ZUhlbHBlcihuZXcgVWludDhMaXN0KDMpLCAxKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBVaW50OENsYW1wZWRMaXN0KDMpLCAxKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBJbnQxNkxpc3QoMyksIDEpOworICB0ZXN0Tm9OdWxsVmFsdWVIZWxwZXIobmV3IFVpbnQxNkxpc3QoMyksIDEpOworICB0ZXN0Tm9OdWxsVmFsdWVIZWxwZXIobmV3IEludDMyTGlzdCgzKSwgMSk7CisgIHRlc3ROb051bGxWYWx1ZUhlbHBlcihuZXcgVWludDMyTGlzdCgzKSwgMSk7CisgIHRlc3ROb051bGxWYWx1ZUhlbHBlcihuZXcgSW50NjRMaXN0KDMpLCAxKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBVaW50NjRMaXN0KDMpLCAxKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBGbG9hdDMyTGlzdCgzKSwgMS4wKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBGbG9hdDY0TGlzdCgzKSwgMS4wKTsKKyAgdGVzdE5vTnVsbFZhbHVlSGVscGVyKG5ldyBJbnQ2NExpc3QoMyksIDEpOworICB0ZXN0Tm9OdWxsVmFsdWVIZWxwZXIobmV3IFVpbnQ2NExpc3QoMyksIDEpOworfQorCit2b2lkIHRlc3RJbmRleE9mSGVscGVyKGxpc3QpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgbGlzdFtpXSA9IGkgKyAxMDsKKyAgfQorICBFeHBlY3QuZXF1YWxzKDAsIGxpc3QuaW5kZXhPZigxMCkpOworICBFeHBlY3QuZXF1YWxzKDUsIGxpc3QuaW5kZXhPZigxNSkpOworICBFeHBlY3QuZXF1YWxzKDksIGxpc3QuaW5kZXhPZigxOSkpOworICBFeHBlY3QuZXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoMjApKTsKKworICBsaXN0ID0gbmV3IEZsb2F0MzJMaXN0KDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgbGlzdFtpXSA9IGkgKyAxMC4wOworICB9CisgIEV4cGVjdC5lcXVhbHMoMCwgbGlzdC5pbmRleE9mKDEwLjApKTsKKyAgRXhwZWN0LmVxdWFscyg1LCBsaXN0LmluZGV4T2YoMTUuMCkpOworICBFeHBlY3QuZXF1YWxzKDksIGxpc3QuaW5kZXhPZigxOS4wKSk7CisgIEV4cGVjdC5lcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigyMC4wKSk7Cit9CisKK3ZvaWQgdGVzdEluZGV4T2YoKSB7CisgIHRlc3RJbmRleE9mSGVscGVyKG5ldyBVaW50OExpc3QoMTApKTsKKyAgdGVzdEluZGV4T2ZIZWxwZXIobmV3IFVpbnQ4Q2xhbXBlZExpc3QoMTApKTsKK30KKwordm9pZCB0ZXN0R2V0QXRJbmRleChUeXBlZERhdGEgbGlzdCwgbnVtIGluaXRpYWxfdmFsdWUpIHsKKyAgdmFyIGJkYXRhID0gbmV3IEJ5dGVEYXRhLnZpZXcobGlzdC5idWZmZXIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXM7IGkrKykgeworICAgIEV4cGVjdC5lcXVhbHMoNDIsIGJkYXRhLmdldFVpbnQ4KGkpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDQyLCBiZGF0YS5nZXRJbnQ4KGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSAxOyBpICs9IDIpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDEwNzk0LCBiZGF0YS5nZXRVaW50MTYoaSwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoMTA3OTQsIGJkYXRhLmdldEludDE2KGksIEVuZGlhbi5saXR0bGUpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSAzOyBpICs9IDQpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDcwNzQwNjM3OCwgYmRhdGEuZ2V0VWludDMyKGksIEVuZGlhbi5saXR0bGUpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDcwNzQwNjM3OCwgYmRhdGEuZ2V0SW50MzIoaSwgRW5kaWFuLmxpdHRsZSkpOworICAgIEV4cGVjdC5lcXVhbHMoMS41MTEzNjYxNzMyNzE0MzllLTEzLCBiZGF0YS5nZXRGbG9hdDMyKGksIEVuZGlhbi5saXR0bGUpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSA3OyBpICs9IDgpIHsKKyAgICBFeHBlY3QuZXF1YWxzKDMwMzgyODcyNTkxOTkyMjAyNjYsIGJkYXRhLmdldFVpbnQ2NChpLCBFbmRpYW4ubGl0dGxlKSk7CisgICAgRXhwZWN0LmVxdWFscygzMDM4Mjg3MjU5MTk5MjIwMjY2LCBiZGF0YS5nZXRJbnQ2NChpLCBFbmRpYW4ubGl0dGxlKSk7CisgICAgRXhwZWN0LmVxdWFscygxLjQyNjAyNTgxNTk3MDM1MzJlLTEwNSwgYmRhdGEuZ2V0RmxvYXQ2NChpLCBFbmRpYW4ubGl0dGxlKSk7CisgIH0KK30KKwordm9pZCB0ZXN0U2V0QXRJbmRleChMaXN0IGxpc3QsIG51bSBpbml0aWFsX3ZhbHVlLCBbYm9vbCB1c2VfZG91YmxlID0gZmFsc2VdKSB7CisgIHZvaWQgdmFsaWRhdGUoW3JlaW5pdCA9IHRydWVdKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICBFeHBlY3QuZXF1YWxzKGluaXRpYWxfdmFsdWUsIGxpc3RbaV0pOworICAgICAgaWYgKHJlaW5pdCkgbGlzdFtpXSA9IHVzZV9kb3VibGUgPyAwLjAgOiAwOworICAgIH0KKyAgfQorCisgIHZhciBiZGF0YSA9IG5ldyBCeXRlRGF0YS52aWV3KChsaXN0IGFzIFR5cGVkRGF0YSkuYnVmZmVyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZGF0YS5sZW5ndGhJbkJ5dGVzOyBpKyspIHsKKyAgICBiZGF0YS5zZXRVaW50OChpLCA0Mik7CisgIH0KKyAgdmFsaWRhdGUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZGF0YS5sZW5ndGhJbkJ5dGVzOyBpKyspIHsKKyAgICBiZGF0YS5zZXRJbnQ4KGksIDQyKTsKKyAgfQorICB2YWxpZGF0ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSAxOyBpICs9IDIpIHsKKyAgICBiZGF0YS5zZXRVaW50MTYoaSwgMTA3OTQsIEVuZGlhbi5saXR0bGUpOworICB9CisgIHZhbGlkYXRlKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmRhdGEubGVuZ3RoSW5CeXRlcyAtIDE7IGkgKz0gMikgeworICAgIGJkYXRhLnNldEludDE2KGksIDEwNzk0LCBFbmRpYW4ubGl0dGxlKTsKKyAgfQorICB2YWxpZGF0ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSAzOyBpICs9IDQpIHsKKyAgICBiZGF0YS5zZXRVaW50MzIoaSwgNzA3NDA2Mzc4LCBFbmRpYW4ubGl0dGxlKTsKKyAgfQorICB2YWxpZGF0ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSAzOyBpICs9IDQpIHsKKyAgICBiZGF0YS5zZXRJbnQzMihpLCA3MDc0MDYzNzgsIEVuZGlhbi5saXR0bGUpOworICB9CisgIHZhbGlkYXRlKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmRhdGEubGVuZ3RoSW5CeXRlcyAtIDM7IGkgKz0gNCkgeworICAgIGJkYXRhLnNldEZsb2F0MzIoaSwgMS41MTEzNjYxNzMyNzE0MzllLTEzLCBFbmRpYW4ubGl0dGxlKTsKKyAgfQorICB2YWxpZGF0ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGJkYXRhLmxlbmd0aEluQnl0ZXMgLSA3OyBpICs9IDgpIHsKKyAgICBiZGF0YS5zZXRVaW50NjQoaSwgMzAzODI4NzI1OTE5OTIyMDI2NiwgRW5kaWFuLmxpdHRsZSk7CisgIH0KKyAgdmFsaWRhdGUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZGF0YS5sZW5ndGhJbkJ5dGVzIC0gNzsgaSArPSA4KSB7CisgICAgYmRhdGEuc2V0SW50NjQoaSwgMzAzODI4NzI1OTE5OTIyMDI2NiwgRW5kaWFuLmxpdHRsZSk7CisgIH0KKyAgdmFsaWRhdGUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZGF0YS5sZW5ndGhJbkJ5dGVzIC0gNzsgaSArPSA4KSB7CisgICAgYmRhdGEuc2V0RmxvYXQ2NChpLCAxLjQyNjAyNTgxNTk3MDM1MzJlLTEwNSwgRW5kaWFuLmxpdHRsZSk7CisgIH0KKyAgdmFsaWRhdGUoZmFsc2UpOworfQorCit0ZXN0Vmlld0NyZWF0aW9uKCkgeworICB2YXIgYnl0ZXMgPSBuZXcgVWludDhMaXN0KDEwMjQpLmJ1ZmZlcjsKKyAgdmFyIHZpZXc7CisgIHZpZXcgPSBuZXcgQnl0ZURhdGEudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgVWludDhMaXN0LnZpZXcoYnl0ZXMsIDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gbmV3IEludDhMaXN0LnZpZXcoYnl0ZXMsIDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gbmV3IFVpbnQ4Q2xhbXBlZExpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgVWludDE2TGlzdC52aWV3KGJ5dGVzLCAyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IG5ldyBJbnQxNkxpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgVWludDMyTGlzdC52aWV3KGJ5dGVzLCAyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IG5ldyBJbnQzMkxpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgVWludDY0TGlzdC52aWV3KGJ5dGVzLCAyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IG5ldyBJbnQ2NExpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgRmxvYXQzMkxpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgRmxvYXQ2NExpc3QudmlldyhieXRlcywgMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgSW50MzJ4NExpc3QudmlldyhieXRlcywgMTYpOworICBFeHBlY3QuZXF1YWxzKDEwMDgsIHZpZXcubGVuZ3RoSW5CeXRlcyk7IC8vIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICB2aWV3ID0gbmV3IEZsb2F0MzJ4NExpc3QudmlldyhieXRlcywgMTYpOworICBFeHBlY3QuZXF1YWxzKDEwMDgsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBuZXcgRmxvYXQ2NHgyTGlzdC52aWV3KGJ5dGVzLCAxNik7CisgIEV4cGVjdC5lcXVhbHMoMTAwOCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKworICB2aWV3ID0gYnl0ZXMuYXNCeXRlRGF0YSgyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzVWludDhMaXN0KDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNJbnQ4TGlzdCgyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzVWludDhDbGFtcGVkTGlzdCgyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzVWludDE2TGlzdCgyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzSW50MTZMaXN0KDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNVaW50MzJMaXN0KDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNJbnQzMkxpc3QoMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc1VpbnQ2NExpc3QoMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc0ludDY0TGlzdCgyNCk7CisgIEV4cGVjdC5lcXVhbHMoMTAwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQzMkxpc3QoMjQpOworICBFeHBlY3QuZXF1YWxzKDEwMDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc0Zsb2F0NjRMaXN0KDI0KTsKKyAgRXhwZWN0LmVxdWFscygxMDAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNJbnQzMng0TGlzdCgxNik7CisgIEV4cGVjdC5lcXVhbHMoMTAwOCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQzMng0TGlzdCgxNik7CisgIEV4cGVjdC5lcXVhbHMoMTAwOCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQ2NHgyTGlzdCgxNik7CisgIEV4cGVjdC5lcXVhbHMoMTAwOCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKworICB2aWV3ID0gYnl0ZXMuYXNCeXRlRGF0YSgyNCwgODAwKTsKKyAgRXhwZWN0LmVxdWFscyg4MDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc1VpbnQ4TGlzdCgyNCwgODAwKTsKKyAgRXhwZWN0LmVxdWFscyg4MDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc0ludDhMaXN0KDI0LCA4MDApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzVWludDhDbGFtcGVkTGlzdCgyNCwgODAwKTsKKyAgRXhwZWN0LmVxdWFscyg4MDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc1VpbnQxNkxpc3QoMjQsIDQwMCk7CisgIEV4cGVjdC5lcXVhbHMoODAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNJbnQxNkxpc3QoMjQsIDQwMCk7CisgIEV4cGVjdC5lcXVhbHMoODAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNVaW50MzJMaXN0KDI0LCAyMDApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzSW50MzJMaXN0KDI0LCAyMDApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzVWludDY0TGlzdCgyNCwgMTAwKTsKKyAgRXhwZWN0LmVxdWFscyg4MDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc0ludDY0TGlzdCgyNCwgMTAwKTsKKyAgRXhwZWN0LmVxdWFscyg4MDAsIHZpZXcubGVuZ3RoSW5CeXRlcyk7CisgIHZpZXcgPSBieXRlcy5hc0Zsb2F0MzJMaXN0KDI0LCAyMDApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQ2NExpc3QoMjQsIDEwMCk7CisgIEV4cGVjdC5lcXVhbHMoODAwLCB2aWV3Lmxlbmd0aEluQnl0ZXMpOworICB2aWV3ID0gYnl0ZXMuYXNJbnQzMng0TGlzdCgzMiwgNTApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQzMng0TGlzdCgzMiwgNTApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKKyAgdmlldyA9IGJ5dGVzLmFzRmxvYXQ2NHgyTGlzdCgzMiwgNTApOworICBFeHBlY3QuZXF1YWxzKDgwMCwgdmlldy5sZW5ndGhJbkJ5dGVzKTsKK30KKwordGVzdFdoZXJlKCkgeworICB2YXIgYnl0ZXMgPSBuZXcgVWludDhMaXN0KDEzKTsKKyAgYnl0ZXMuc2V0UmFuZ2UoMCwgNSwgWzEsIDEsIDEsIDEsIDFdKTsKKyAgRXhwZWN0LmVxdWFscyg1LCBieXRlcy53aGVyZSgodikgPT4gdiA+IDApLmxlbmd0aCk7Cit9CisKK3Rlc3RDcmVhdGlvbkZyb21MaXN0KCkgeworICB2YXIgaW50TGlzdCA9IFsKKyAgICAtMTAwMDAwMDAwMDAwMDAwMDAwMCwKKyAgICAtMjU1LAorICAgIC0xMjcsCisgICAgMCwKKyAgICAxMjgsCisgICAgMjU2LAorICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAKKyAgXTsKKyAgdmFyIGludExpc3RzID0gW107CisgIGludExpc3RzLmFkZChuZXcgSW50OExpc3QuZnJvbUxpc3QoaW50TGlzdCkpOworICBpbnRMaXN0cy5hZGQobmV3IEludDE2TGlzdC5mcm9tTGlzdChpbnRMaXN0KSk7CisgIGludExpc3RzLmFkZChuZXcgSW50MzJMaXN0LmZyb21MaXN0KGludExpc3QpKTsKKyAgaW50TGlzdHMuYWRkKG5ldyBJbnQ2NExpc3QuZnJvbUxpc3QoaW50TGlzdCkpOworICBpbnRMaXN0cy5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChpbnRMaXN0KSk7CisgIGludExpc3RzLmFkZChuZXcgVWludDE2TGlzdC5mcm9tTGlzdChpbnRMaXN0KSk7CisgIGludExpc3RzLmFkZChuZXcgVWludDMyTGlzdC5mcm9tTGlzdChpbnRMaXN0KSk7CisgIGludExpc3RzLmFkZChuZXcgVWludDY0TGlzdC5mcm9tTGlzdChpbnRMaXN0KSk7CisgIHZhciBkb3VibGVMaXN0ID0gWworICAgIC0xMjMxMjMxMjMxMjMuMTIzMTIzMTIzMTIzLAorICAgIC0xMjMuMCwKKyAgICAwLjAsCisgICAgMTIzLjAsCisgICAgMTIzMTIzMTIzMTIzLjEyMzEyMzEyMworICBdOworICB2YXIgZG91YmxlTGlzdHMgPSBbXTsKKyAgZG91YmxlTGlzdHMuYWRkKG5ldyBGbG9hdDMyTGlzdC5mcm9tTGlzdChkb3VibGVMaXN0KSk7CisgIGRvdWJsZUxpc3RzLmFkZChuZXcgRmxvYXQ2NExpc3QuZnJvbUxpc3QoZG91YmxlTGlzdCkpOworICBmb3IgKHZhciBpbnRzIGluIGludExpc3RzKSB7CisgICAgZm9yICh2YXIgZG91YmxlcyBpbiBkb3VibGVMaXN0cykgeworICAgICAgRXhwZWN0LnRocm93cygoKSA9PiBpbnRzWzBdID0gZG91Ymxlc1swXSk7CisgICAgICBFeHBlY3QudGhyb3dzKCgpID0+IGRvdWJsZXNbMF0gPSBpbnRzWzBdKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0U3RyaW5ncygpIHsKKyAgdGVzdChMaXN0PGludD4gbGlzdCkgeworICAgIFVpbnQxNkxpc3QgdWludHMgPSBuZXcgVWludDE2TGlzdChsaXN0Lmxlbmd0aCkuLnNldEFsbCgwLCBsaXN0KTsKKyAgICBTdHJpbmcgc3RyaW5nID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGxpc3QpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gaTsgaiA8IHN0cmluZy5sZW5ndGg7IGorKykgeworICAgICAgICBpbnQgbGVuZ3RoID0gaiAtIGk7CisgICAgICAgIHsKKyAgICAgICAgICBVaW50MTZMaXN0IGNvcHkgPSBuZXcgVWludDE2TGlzdChsZW5ndGgpOworICAgICAgICAgIGNvcHkuc2V0UmFuZ2UoMCwgbGVuZ3RoLCBzdHJpbmcuY29kZVVuaXRzLCBpKTsKKyAgICAgICAgICBFeHBlY3QubGlzdEVxdWFscyh1aW50cy5zdWJsaXN0KGksIGopLCBjb3B5KTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgVWludDhMaXN0IGJ1ZmZlciA9IG5ldyBVaW50OExpc3QobGVuZ3RoICogMiArIDgpOworICAgICAgICAgIFVpbnQxNkxpc3QgY29weSA9IG5ldyBVaW50MTZMaXN0LnZpZXcoYnVmZmVyLmJ1ZmZlciwgNCwgbGVuZ3RoKTsKKyAgICAgICAgICBjb3B5LnNldFJhbmdlKDAsIGxlbmd0aCwgc3RyaW5nLmNvZGVVbml0cywgaSk7CisgICAgICAgICAgRXhwZWN0Lmxpc3RFcXVhbHModWludHMuc3VibGlzdChpLCBqKSwgY29weSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgIFN0cmluZyBjb3B5ID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKHVpbnRzLCBpLCBqKTsKKyAgICAgICAgICBFeHBlY3QuZXF1YWxzKHN0cmluZy5zdWJzdHJpbmcoaSwgaiksIGNvcHkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVzdChbXSk7CisgIHRlc3QoWzB4MDAsIDB4N2YsIDB4ZmZdKTsKKyAgdGVzdChbMHgwMCwgMHhkZmZmLCAweGZmZmZdKTsKKyAgdGVzdChbMHhkODAwLCAweGRjMDAsIDB4MjAsIDB4ZGJmZiwgMHhkZmZmXSk7Cit9CisKK21haW4oKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgIHRlc3RDcmVhdGVVaW50OFR5cGVkRGF0YSgpOworICAgIHRlc3RDcmVhdGVDbGFtcGVkVWludDhUeXBlZERhdGEoKTsKKyAgICB0ZXN0VHlwZWREYXRhUmFuZ2UoZmFsc2UpOworICAgIHRlc3RVbnNpZ25lZFR5cGVkRGF0YVJhbmdlKGZhbHNlKTsKKyAgICB0ZXN0Q2xhbXBlZFVuc2lnbmVkVHlwZWREYXRhUmFuZ2UoZmFsc2UpOworICAgIHRlc3RTZXRSYW5nZSgpOworICAgIHRlc3RJbmRleE91dE9mUmFuZ2UoKTsKKyAgICB0ZXN0Tm9OdWxsVmFsdWUoKTsKKyAgICB0ZXN0SW5kZXhPZigpOworCisgICAgdmFyIGludDhsaXN0ID0gbmV3IEludDhMaXN0KDEyOCk7CisgICAgdGVzdFNldEF0SW5kZXgoaW50OGxpc3QsIDQyKTsKKyAgICB0ZXN0R2V0QXRJbmRleChpbnQ4bGlzdCwgNDIpOworCisgICAgdmFyIHVpbnQ4bGlzdCA9IG5ldyBVaW50OExpc3QoMTI4KTsKKyAgICB0ZXN0U2V0QXRJbmRleCh1aW50OGxpc3QsIDQyKTsKKyAgICB0ZXN0R2V0QXRJbmRleCh1aW50OGxpc3QsIDQyKTsKKworICAgIHZhciBpbnQxNmxpc3QgPSBuZXcgSW50MTZMaXN0KDY0KTsKKyAgICB0ZXN0U2V0QXRJbmRleChpbnQxNmxpc3QsIDEwNzk0KTsKKyAgICB0ZXN0R2V0QXRJbmRleChpbnQxNmxpc3QsIDEwNzk0KTsKKworICAgIHZhciB1aW50MTZsaXN0ID0gbmV3IFVpbnQxNkxpc3QoNjQpOworICAgIHRlc3RTZXRBdEluZGV4KHVpbnQxNmxpc3QsIDEwNzk0KTsKKyAgICB0ZXN0R2V0QXRJbmRleCh1aW50MTZsaXN0LCAxMDc5NCk7CisKKyAgICB2YXIgaW50MzJsaXN0ID0gbmV3IEludDMyTGlzdCgzMik7CisgICAgdGVzdFNldEF0SW5kZXgoaW50MzJsaXN0LCA3MDc0MDYzNzgpOworICAgIHRlc3RHZXRBdEluZGV4KGludDMybGlzdCwgNzA3NDA2Mzc4KTsKKworICAgIHZhciB1aW50MzJsaXN0ID0gbmV3IFVpbnQzMkxpc3QoMzIpOworICAgIHRlc3RTZXRBdEluZGV4KHVpbnQzMmxpc3QsIDcwNzQwNjM3OCk7CisgICAgdGVzdEdldEF0SW5kZXgodWludDMybGlzdCwgNzA3NDA2Mzc4KTsKKworICAgIHZhciBpbnQ2NGxpc3QgPSBuZXcgSW50NjRMaXN0KDE2KTsKKyAgICB0ZXN0U2V0QXRJbmRleChpbnQ2NGxpc3QsIDMwMzgyODcyNTkxOTkyMjAyNjYpOworICAgIHRlc3RHZXRBdEluZGV4KGludDY0bGlzdCwgMzAzODI4NzI1OTE5OTIyMDI2Nik7CisKKyAgICB2YXIgdWludDY0bGlzdCA9IG5ldyBVaW50NjRMaXN0KDE2KTsKKyAgICB0ZXN0U2V0QXRJbmRleCh1aW50NjRsaXN0LCAzMDM4Mjg3MjU5MTk5MjIwMjY2KTsKKyAgICB0ZXN0R2V0QXRJbmRleCh1aW50NjRsaXN0LCAzMDM4Mjg3MjU5MTk5MjIwMjY2KTsKKworICAgIHZhciBmbG9hdDMybGlzdCA9IG5ldyBGbG9hdDMyTGlzdCgzMik7CisgICAgdGVzdFNldEF0SW5kZXgoZmxvYXQzMmxpc3QsIDEuNTExMzY2MTczMjcxNDM5ZS0xMywgdHJ1ZSk7CisgICAgdGVzdEdldEF0SW5kZXgoZmxvYXQzMmxpc3QsIDEuNTExMzY2MTczMjcxNDM5ZS0xMyk7CisKKyAgICB2YXIgZmxvYXQ2NGxpc3QgPSBuZXcgRmxvYXQ2NExpc3QoMTYpOworICAgIHRlc3RTZXRBdEluZGV4KGZsb2F0NjRsaXN0LCAxLjQyNjAyNTgxNTk3MDM1MzJlLTEwNSwgdHJ1ZSk7CisgICAgdGVzdEdldEF0SW5kZXgoZmxvYXQ2NGxpc3QsIDEuNDI2MDI1ODE1OTcwMzUzMmUtMTA1KTsKKyAgfQorICB0ZXN0VHlwZWREYXRhUmFuZ2UodHJ1ZSk7CisgIHRlc3RVbnNpZ25lZFR5cGVkRGF0YVJhbmdlKHRydWUpOworICB0ZXN0Vmlld0NyZWF0aW9uKCk7CisgIHRlc3RXaGVyZSgpOworICB0ZXN0Q3JlYXRpb25Gcm9tTGlzdCgpOworICB0ZXN0U3RyaW5ncygpOworICB0ZXN0U2V0UmFuZ2UoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfZGF0YV92aWV3X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvdHlwZWRfZGF0YV92aWV3X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNmYjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS90eXBlZF9kYXRhX3ZpZXdfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vCisvLyBEYXJ0IHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyB0eXBlZCBkYXRhLgorCisvLyBMaWJyYXJ5IHRhZyB0byBiZSBhYmxlIHRvIHJ1biBpbiBodG1sIHRlc3QgZnJhbWV3b3JrLgorbGlicmFyeSBUeXBlZERhdGFUZXN0OworCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKKwordmFsaWRhdGUoTGlzdCBsaXN0LCBudW0gZXhwZWN0ZWQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgRXhwZWN0LmVxdWFscyhleHBlY3RlZCwgbGlzdFtpXSk7CisgIH0KK30KKwordGVzdFZpZXcoKSB7CisgIHZhciBsaXN0ID0gbmV3IEludDhMaXN0KDEyOCk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgIGxpc3RbaV0gPSA0MjsKKyAgfQorICB2YXIgYmEgPSBsaXN0LmJ1ZmZlcjsKKworICB2YXIgc2xpc3QgPSBuZXcgSW50MTZMaXN0LnZpZXcoYmEsIDAsIDMyKTsKKyAgdmFsaWRhdGUoc2xpc3QsIDEwNzk0KTsKKyAgdmFyIHVzbGlzdCA9IG5ldyBVaW50MTZMaXN0LnZpZXcoYmEsIDAsIDMyKTsKKyAgdmFsaWRhdGUodXNsaXN0LCAxMDc5NCk7CisKKyAgdmFyIGlsaXN0ID0gbmV3IEludDMyTGlzdC52aWV3KGJhLCAwLCAxNik7CisgIHZhbGlkYXRlKGlsaXN0LCA3MDc0MDYzNzgpOworICB2YXIgdWlsaXN0ID0gbmV3IFVpbnQzMkxpc3QudmlldyhiYSwgMCwgMTYpOworICB2YWxpZGF0ZSh1aWxpc3QsIDcwNzQwNjM3OCk7CisKKyAgdmFyIGxsaXN0ID0gbmV3IEludDY0TGlzdC52aWV3KGJhLCAwLCA4KTsKKyAgdmFsaWRhdGUobGxpc3QsIDMwMzgyODcyNTkxOTkyMjAyNjYpOworICB2YXIgdWxsaXN0ID0gbmV3IFVpbnQ2NExpc3QudmlldyhiYSwgMCwgOCk7CisgIHZhbGlkYXRlKHVsbGlzdCwgMzAzODI4NzI1OTE5OTIyMDI2Nik7CisKKyAgdmFyIGZsaXN0ID0gbmV3IEZsb2F0MzJMaXN0LnZpZXcoYmEsIDAsIDE2KTsKKyAgdmFsaWRhdGUoZmxpc3QsIDEuNTExMzY2MTczMjcxNDM5ZS0xMyk7CisgIHZhciBkbGlzdCA9IG5ldyBGbG9hdDY0TGlzdC52aWV3KGJhLCAwLCA4KTsKKyAgdmFsaWRhdGUoZGxpc3QsIDEuNDI2MDI1ODE1OTcwMzUzMmUtMTA1KTsKK30KKwordGVzdFNldHRlcnMoKSB7CisgIHZhciBibGlzdCA9IG5ldyBCeXRlRGF0YSgxMjgpOworICBibGlzdC5zZXRJbnQ4KDAsIDB4ZmZmZik7CisgIEV4cGVjdC5lcXVhbHMoLTEsIGJsaXN0LmdldEludDgoMCkpOworICBibGlzdC5zZXRVaW50OCgwLCAweGZmZmYpOworICBFeHBlY3QuZXF1YWxzKDB4ZmYsIGJsaXN0LmdldFVpbnQ4KDApKTsKKyAgYmxpc3Quc2V0SW50MTYoMCwgMHhmZmZmZmZmZik7CisgIEV4cGVjdC5lcXVhbHMoLTEsIGJsaXN0LmdldEludDE2KDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0VWludDE2KDAsIDB4ZmZmZmZmZmYsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKDB4ZmZmZiwgYmxpc3QuZ2V0VWludDE2KDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0SW50MzIoMCwgMHhmZmZmZmZmZmZmZmYsIEVuZGlhbi5saXR0bGUpOworICBFeHBlY3QuZXF1YWxzKC0xLCBibGlzdC5nZXRJbnQzMigwLCBFbmRpYW4ubGl0dGxlKSk7CisgIGJsaXN0LnNldFVpbnQzMigwLCAweGZmZmZmZmZmZmZmZiwgRW5kaWFuLmxpdHRsZSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmZmZmZmZmZiwgYmxpc3QuZ2V0VWludDMyKDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0SW50NjQoMCwgMHhmZmZmZmZmZmZmZmZmZmZmLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygtMSwgYmxpc3QuZ2V0SW50NjQoMCwgRW5kaWFuLmxpdHRsZSkpOworICBibGlzdC5zZXRVaW50NjQoMCwgMHhmZmZmZmZmZmZmZmZmZmZmLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygweGZmZmZmZmZmZmZmZmZmZmYsIGJsaXN0LmdldFVpbnQ2NCgwLCBFbmRpYW4ubGl0dGxlKSk7CisgIGJsaXN0LnNldEludDMyKDAsIDB4YWFiYmNjZGRmZmZmZmZmZSwgRW5kaWFuLmxpdHRsZSk7CisgIEV4cGVjdC5lcXVhbHMoLTIsIGJsaXN0LmdldEludDMyKDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0VWludDMyKDAsIDB4YWFiYmNjZGRmZmZmZmZmZSwgRW5kaWFuLmxpdHRsZSk7CisgIEV4cGVjdC5lcXVhbHMoMHhmZmZmZmZmZSwgYmxpc3QuZ2V0VWludDMyKDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0SW50NjQoMCwgMHhmZmZmZmZmZmZmZmZmZmZlLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygtMiwgYmxpc3QuZ2V0SW50NjQoMCwgRW5kaWFuLmxpdHRsZSkpOworICBibGlzdC5zZXRVaW50NjQoMCwgMHhmZmZmZmZmZmZmZmZmZmZlLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygweGZmZmZmZmZmZmZmZmZmZmUsIGJsaXN0LmdldFVpbnQ2NCgwLCBFbmRpYW4ubGl0dGxlKSk7CisKKyAgYmxpc3Quc2V0RmxvYXQzMigwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNC4wLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygxODQ0Njc0NDA3MzcwOTU1MTYxNC4wLCBibGlzdC5nZXRGbG9hdDMyKDAsIEVuZGlhbi5saXR0bGUpKTsKKyAgYmxpc3Quc2V0RmxvYXQ2NCgwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNC4wLCBFbmRpYW4ubGl0dGxlKTsKKyAgRXhwZWN0LmVxdWFscygxODQ0Njc0NDA3MzcwOTU1MTYxNC4wLCBibGlzdC5nZXRGbG9hdDY0KDAsIEVuZGlhbi5saXR0bGUpKTsKK30KKworbWFpbigpIHsKKyAgdGVzdFZpZXcoKTsKKyAgdGVzdFNldHRlcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvdW5ib3hlZF9pbnRfY29udmVydGVyX3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvdW5ib3hlZF9pbnRfY29udmVydGVyX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JhYTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS91bmJveGVkX2ludF9jb252ZXJ0ZXJfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNzggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNCwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3QgVW5ib3hlZEludENvbnZlcnRlciBmb3IgaW50MzIuCisvLyBWTU9wdGlvbnM9LS1vcHRpbWl6YXRpb24tY291bnRlci10aHJlc2hvbGQ9MTAgLS1uby11c2Utb3NyIC0tbm8tYmFja2dyb3VuZC1jb21waWxhdGlvbgorCitpbXBvcnQgInBhY2thZ2U6ZXhwZWN0L2V4cGVjdC5kYXJ0IjsKK2ltcG9ydCAiZGFydDp0eXBlZF9kYXRhIjsKKworaW50MzJfYWRkKGEsIGIsIGMpID0+IChhICogYykgKyAoYiAqIGMpOworaW50MzJfbXVsKGEsIGIsIGMpID0+IChhICogYykgKiBiOworaW50MzJfc3ViKGEsIGIsIGMpID0+IChhICogYykgLSAoYiAqIGMpOworaW50MzJfc2hyKGEsIGIsIGMpID0+IChhICogYyAqIGIpID4+IDE2OworaW50MzJfc2hsKGEsIGIsIGMpID0+IChhICogYyAqIGIpIDw8IDE2OworaW50MzJfeG9yKGEsIGIsIGMpID0+IChhICogYykgXiAoYiAqIGMpOworaW50MzJfb3IoYSwgYiwgYykgPT4gKGEgKiBjKSB8IChiICogYyk7CitpbnQzMl9hbmQoYSwgYiwgYykgPT4gKGEgKiBjKSAmIChiICogYyk7CisKK2ludDMyX3RvX21pbnQoYSwgYikgeworICB2YXIgc3VtID0gMDsKKyAgdmFyIGogPSAwOworICBmb3IgKHZhciBpID0gYTsgaSA8PSBiOyBpKyspIHsKKyAgICBzdW0gLT0gKGogKiArK2opICYgMHhmZjsKKyAgfQorCisgIHJldHVybiAweGZmZmZmZmZmICsgc3VtOworfQorCittaW50X3RvX2ludDMyKGEsIGMsIGQpIHsKKyAgcmV0dXJuIGEgKiBhICogYSAqIChjIC0gZCk7Cit9CisKK3VpbnQzMl90b19pbnQzMihhLCBjKSB7CisgIHJldHVybiAoYSAqIGEgKiBhKSAqIChjICYgMHhGRkZGRkZGRik7Cit9CisKK21haW4oKSB7CisgIGZvciAodmFyIGogPSAwOyBqIDwgMTAwMDsgaisrKSB7CisgICAgRXhwZWN0LmVxdWFscygyLCBpbnQzMl9hZGQoMSwgMSwgMSkpOworICAgIEV4cGVjdC5lcXVhbHMoMSwgaW50MzJfbXVsKDEsIDEsIDEpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDAsIGludDMyX3N1YigxLCAxLCAxKSk7CisgICAgRXhwZWN0LmVxdWFscygwLCBpbnQzMl9zaHIoMSwgMSwgMSkpOworICAgIEV4cGVjdC5lcXVhbHMoMSA8PCAxNiwgaW50MzJfc2hsKDEsIDEsIDEpKTsKKyAgICBFeHBlY3QuZXF1YWxzKDAsIGludDMyX3hvcigxLCAxLCAxKSk7CisgICAgRXhwZWN0LmVxdWFscygxLCBpbnQzMl9vcigxLCAxLCAxKSk7CisgICAgRXhwZWN0LmVxdWFscygxLCBpbnQzMl9hbmQoMSwgMSwgMSkpOworICB9CisKKyAgRXhwZWN0LmVxdWFscygweDdmZmZmZmZlLCBpbnQzMl9hZGQoMHg3ZmZmZmZmYyB+LyAyLCAxLCAyKSk7CisgIEV4cGVjdC5lcXVhbHMoLTB4ODAwMDAwMDAsIGludDMyX2FkZCgtMHg3ZmZmZmZmZSB+LyAyLCAtMSwgMikpOworICBFeHBlY3QuZXF1YWxzKC0weDgwMDAwMDAyLCBpbnQzMl9hZGQoLTB4N2ZmZmZmZmUgfi8gMiwgLTIsIDIpKTsgLy8gT3ZlcmZsb3cuCisgIEV4cGVjdC5lcXVhbHMoMHg3ZmZmZmZmZSwgaW50MzJfc3ViKDB4N2ZmZmZmZmMgfi8gMiwgLTEsIDIpKTsKKyAgRXhwZWN0LmVxdWFscygtMHg4MDAwMDAwMCwgaW50MzJfc3ViKC0weDdmZmZmZmZlIH4vIDIsIDEsIDIpKTsKKyAgRXhwZWN0LmVxdWFscygtMHg4MDAwMDAwMiwgaW50MzJfc3ViKC0weDdmZmZmZmZlIH4vIDIsIDIsIDIpKTsgLy8gT3ZlcmZsb3cuCisgIEV4cGVjdC5lcXVhbHMoLTB4N2ZmZmZmZmUsIGludDMyX211bCgweDdmZmZmZmZlIH4vIDIsIC0xLCAyKSk7CisgIEV4cGVjdC5lcXVhbHMoLTB4ODAwMDAwMDAsIGludDMyX211bCgtMHg4MDAwMDAwMCB+LyAyLCAxLCAyKSk7CisgIEV4cGVjdC5lcXVhbHMoMHg4MDAwMDAwMCwgaW50MzJfbXVsKC0weDgwMDAwMDAwIH4vIDIsIC0xLCAyKSk7IC8vIE92ZXJmbG93LgorICBFeHBlY3QuZXF1YWxzKDB4NjAwMDAwMDAsIGludDMyX3hvcigweDQwMDAwMDAwIH4vIDIsIDB4MjAwMDAwMDAgfi8gMiwgMikpOworICBFeHBlY3QuZXF1YWxzKDB4MDAwMDAwMDAsIGludDMyX3hvcigweDQwMDAwMDAwIH4vIDIsIDB4NDAwMDAwMDAgfi8gMiwgMikpOworICBFeHBlY3QuZXF1YWxzKDB4NjAwMDAwMDAsIGludDMyX29yKDB4NDAwMDAwMDAgfi8gMiwgMHgyMDAwMDAwMCB+LyAyLCAyKSk7CisgIEV4cGVjdC5lcXVhbHMoMHg2MDAwMDAwMCwgaW50MzJfb3IoMHg2MDAwMDAwMCB+LyAyLCAweDQwMDAwMDAwIH4vIDIsIDIpKTsKKyAgRXhwZWN0LmVxdWFscygweDAwMDAwMDAwLCBpbnQzMl9hbmQoMHg0MDAwMDAwMCB+LyAyLCAweDIwMDAwMDAwIH4vIDIsIDIpKTsKKyAgRXhwZWN0LmVxdWFscygweDQwMDAwMDAwLCBpbnQzMl9hbmQoMHg2MDAwMDAwMCB+LyAyLCAweDQwMDAwMDAwIH4vIDIsIDIpKTsKKyAgRXhwZWN0LmVxdWFscygxLCBpbnQzMl9zaHIoMSwgMSA8PCAxNiwgMSkpOworICBFeHBlY3QuZXF1YWxzKC0xIDw8IDE1LCBpbnQzMl9zaHIoMSA8PCAxNSwgLSgxIDw8IDE2KSwgMSkpOworICBFeHBlY3QuZXF1YWxzKC0weDA4MDAwMDAwMCwgaW50MzJfc2hsKC0xIDw8IDE1LCAxLCAxKSk7CisgIEV4cGVjdC5lcXVhbHMoLTB4MTAwMDAwMDAwLCBpbnQzMl9zaGwoLTEgPDwgMTYsIDEsIDEpKTsgLy8gT3ZlcmZsb3cuCisKKyAgRXhwZWN0LmVxdWFscygwLCBpbnQzMl9zaHIoMSwgMSwgMSkpOworICBFeHBlY3QuZXF1YWxzKDEgPDwgMTYsIGludDMyX3NobCgxLCAxLCAxKSk7CisKKyAgZm9yICh2YXIgaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKKyAgICBFeHBlY3QuZXF1YWxzKDQyOTQ4Mzk1MDMsIGludDMyX3RvX21pbnQoMCwgMTAwMCkpOworICAgIEV4cGVjdC5lcXVhbHMoLTgsIG1pbnRfdG9faW50MzIoMiwgMHgxMDAwMDAwMDAsIDB4MTAwMDAwMDAxKSk7CisgICAgRXhwZWN0LmVxdWFscyg4LCB1aW50MzJfdG9faW50MzIoMiwgMHgxMDAwMDAwMDEpKTsKKyAgfQorICBFeHBlY3QuZXF1YWxzKDggKiAweDgwMDAwMDAxLCB1aW50MzJfdG9faW50MzIoMiwgMHgxODAwMDAwMDEpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0YW5kYWxvbmUvdmVyYm9zZV9nY190b19ibXVfc2NyaXB0LmRhcnQgYi90ZXN0cy9zdGFuZGFsb25lL3ZlcmJvc2VfZ2NfdG9fYm11X3NjcmlwdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTQ4OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lL3ZlcmJvc2VfZ2NfdG9fYm11X3NjcmlwdC5kYXJ0CkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMSwgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKy8vIFRlc3RpbmcgR0MsIGlzc3VlIDE0NjkuCisKK21haW4oKSB7CisgIHZhciBkaXY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKKyAgICBMaXN0IGwgPSBuZXcgTGlzdCgxMDAwMDAwKTsKKyAgICB2YXIgbSA9IDI7CisgICAgZGl2ID0gKF8pIHsKKyAgICAgIHZhciBiID0gbDsgLy8gV2FzIGNhdXNpbmcgT3V0T2ZNZW1vcnkuCisgICAgfTsKKyAgICB2YXIgbFNtYWxsID0gbmV3IExpc3QoMyk7CisgICAgLy8gQ2lyY3VsYXIgcmVmZXJlbmNlIGJldHdlZW4gbmV3IGFuZCBvbGQgZ2VuIG9iamVjdHMuCisgICAgbFNtYWxsWzBdID0gbDsKKyAgICBsWzBdID0gbFNtYWxsOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lL3ZlcmJvc2VfZ2NfdG9fYm11X3Rlc3QuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmUvdmVyYm9zZV9nY190b19ibXVfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGU1ZWIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RhbmRhbG9uZS92ZXJib3NlX2djX3RvX2JtdV90ZXN0LmRhcnQKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE1LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPdGhlclJlc291cmNlcz12ZXJib3NlX2djX3RvX2JtdV9zY3JpcHQuZGFydAorCisvLyBUaGlzIHRlc3QgZm9ya3MgYSBzZWNvbmQgdm0gcHJvY2VzcyB0aGF0IHJ1bnMgdGhlIEJNVSB0b29sIGFuZCB2ZXJpZmllcyB0aGF0CisvLyBpdCBwcm9kdWNlcyBzb21lIG91dHB1dC4gVGhpcyB0ZXN0IGlzIG1haW5seSBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBCTVUKKy8vIHRvb2wgY29tcGlsZXMgYW5kIHJ1bnMuCisKK2ltcG9ydCAiZGFydDphc3luYyI7CitpbXBvcnQgImRhcnQ6Y29udmVydCI7CitpbXBvcnQgImRhcnQ6aW8iOworCitpbXBvcnQgInBhY2thZ2U6cGF0aC9wYXRoLmRhcnQiOworCisvLyBUb29sIHNjcmlwdCByZWxhdGl2ZSB0byB0aGUgcGF0aCBvZiB0aGlzIHRlc3QuCit2YXIgdG9vbFNjcmlwdCA9IFVyaS5wYXJzZShQbGF0Zm9ybS5leGVjdXRhYmxlKQorICAgIC5yZXNvbHZlKCIuLi8uLi9ydW50aW1lL3Rvb2xzL3ZlcmJvc2VfZ2NfdG9fYm11LmRhcnQiKQorICAgIC50b0ZpbGVQYXRoKCk7CisKKy8vIFRhcmdldCBzY3JpcHQgcmVsYXRpdmUgdG8gdGhpcyB0ZXN0LgordmFyIHRhcmdldFNjcmlwdCA9CisgICAgUGxhdGZvcm0uc2NyaXB0LnJlc29sdmUoInZlcmJvc2VfZ2NfdG9fYm11X3NjcmlwdC5kYXJ0IikudG9GaWxlUGF0aCgpOworY29uc3QgbWluT3V0cHV0TGluZXMgPSAyMDsKKwordm9pZCBjaGVja0V4aXRDb2RlKHRhcmdldFJlc3VsdCkgeworICBpZiAoZXhpdENvZGUgIT0gMCkgeworICAgIHByaW50KCJQcm9jZXNzIHRlcm1pbmF0ZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX0uIik7CisgICAgZXhpdCgtMSk7CisgIH0KK30KKwordm9pZCBtYWluKCkgeworICAvLyBDb21wdXRlIHBhdGhzIGZvciB0b29sIGFuZCB0YXJnZXQgcmVsYXRpdmUgdG8gdGhlIHBhdGggb2YgdGhpcyBzY3JpcHQuCisgIHZhciB0YXJnZXRSZXN1bHQgPQorICAgICAgUHJvY2Vzcy5ydW5TeW5jKFBsYXRmb3JtLmV4ZWN1dGFibGUsIFsiLS12ZXJib3NlX2djIiwgdGFyZ2V0U2NyaXB0XSk7CisgIGNoZWNrRXhpdENvZGUodGFyZ2V0UmVzdWx0KTsKKyAgdmFyIGdjTG9nID0gdGFyZ2V0UmVzdWx0LnN0ZGVycjsKKyAgUHJvY2Vzcy5zdGFydChQbGF0Zm9ybS5leGVjdXRhYmxlLCBbdG9vbFNjcmlwdF0pLnRoZW4oKFByb2Nlc3MgcHJvY2VzcykgeworICAgIC8vIEZlZWQgdGhlIEdDIGxvZyBvZiB0aGUgdGFyZ2V0IHRvIHRoZSBCTVUgdG9vbC4KKyAgICBwcm9jZXNzLnN0ZGluLndyaXRlKGdjTG9nKTsKKyAgICBwcm9jZXNzLnN0ZGluLmNsb3NlKCk7CisgICAgdmFyIHN0ZG91dFN0cmluZ1N0cmVhbSA9CisgICAgICAgIHByb2Nlc3Muc3Rkb3V0LnRyYW5zZm9ybSh1dGY4LmRlY29kZXIpLnRyYW5zZm9ybShuZXcgTGluZVNwbGl0dGVyKCkpOworICAgIHZhciBzdGRlcnJTdHJpbmdTdHJlYW0gPQorICAgICAgICBwcm9jZXNzLnN0ZGVyci50cmFuc2Zvcm0odXRmOC5kZWNvZGVyKS50cmFuc2Zvcm0obmV3IExpbmVTcGxpdHRlcigpKTsKKyAgICAvLyBXYWl0IGZvciAzIGZ1dHVyZSBldmVudHM6IHN0ZG91dCBhbmQgc3RkZXJyIHN0cmVhbXMgY2xvc2VkLCBhbmQKKyAgICAvLyBwcm9jZXNzIHRlcm1pbmF0ZWQuCisgICAgdmFyIGZ1dHVyZXMgPSA8RnV0dXJlPltdOworICAgIHZhciBzdGRvdXRMaW5lcyA9IFtdOworICAgIHZhciBzdGRlcnJMaW5lcyA9IFtdOworICAgIHZhciBzdWJzY3JpcHRpb24gPSBzdGRvdXRTdHJpbmdTdHJlYW0ubGlzdGVuKHN0ZG91dExpbmVzLmFkZCk7CisgICAgZnV0dXJlcy5hZGQoc3Vic2NyaXB0aW9uLmFzRnV0dXJlKHRydWUpKTsKKyAgICBzdWJzY3JpcHRpb24gPSBzdGRlcnJTdHJpbmdTdHJlYW0ubGlzdGVuKHN0ZGVyckxpbmVzLmFkZCk7CisgICAgZnV0dXJlcy5hZGQoc3Vic2NyaXB0aW9uLmFzRnV0dXJlKHRydWUpKTsKKyAgICBmdXR1cmVzLmFkZChwcm9jZXNzLmV4aXRDb2RlLnRoZW4oY2hlY2tFeGl0Q29kZSkpOworICAgIEZ1dHVyZS53YWl0KGZ1dHVyZXMpLnRoZW4oKHJlc3VsdHMpIHsKKyAgICAgIGlmIChzdGRlcnJMaW5lcy5pc05vdEVtcHR5KSB7CisgICAgICAgIHByaW50KCJVbmV4cGVjdGVkIG91dHB1dCBvbiBzdGRlcnI6Iik7CisgICAgICAgIHByaW50KHN0ZGVyckxpbmVzLmpvaW4oJ1xuJykpOworICAgICAgICBleGl0KC0xKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdGRvdXRMaW5lcy5sZW5ndGggPCBtaW5PdXRwdXRMaW5lcykgeworICAgICAgICBwcmludCgiTGVzcyB0aGFuIGV4cGVjdGVkIG91dHB1dCBvbiBzdGRvdXQ6Iik7CisgICAgICAgIHByaW50KHN0ZG91dExpbmVzLmpvaW4oJ1xuJykpOworICAgICAgICBleGl0KC0xKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9zdGFuZGFsb25lXzIvcmVncmVzc180MjA5Ml9zY3JpcHQuZGFydCBiL3Rlc3RzL3N0YW5kYWxvbmVfMi9yZWdyZXNzXzQyMDkyX3NjcmlwdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzU3YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lXzIvcmVncmVzc180MjA5Ml9zY3JpcHQuZGFydApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMjAsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitGdXR1cmU8dm9pZD4gbWFpbigpIGFzeW5jIHsKKyAgdmFyIGNvdW50ID0gMDsKKyAgUHJvY2Vzc1NpZ25hbC5zaWdpbnQud2F0Y2goKS5mb3JFYWNoKChzKSB7CisgICAgY291bnQrKzsKKyAgICBwcmludCgnY2hpbGQ6IEdvdCBhIFNJR0lOVCAkY291bnQgdGltZXMsIGhpdCBpdCAzIHRpbWVzIHRvIHRlcm1pbmF0ZScpOworICAgIGlmIChjb3VudCA+PSAzKSB7CisgICAgICBleGl0KDQyKTsKKyAgICB9CisgIH0pOworICBwcmludCgnV2FpdGluZy4uLicpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGF3YWl0IEZ1dHVyZS5kZWxheWVkKGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RhbmRhbG9uZV8yL3JlZ3Jlc3NfNDIwOTJfdGVzdC5kYXJ0IGIvdGVzdHMvc3RhbmRhbG9uZV8yL3JlZ3Jlc3NfNDIwOTJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzM2Q5MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zdGFuZGFsb25lXzIvcmVncmVzc180MjA5Ml90ZXN0LmRhcnQKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDIwLCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCc7CisKK1Byb2Nlc3MgcHJvY2VzczsKK2Jvb2wgbGFzdEtpbGwgPSBmYWxzZTsKKworRnV0dXJlPHZvaWQ+IHNpZ2ludChpbnQgaXRlcmF0aW9ucykgYXN5bmMgeworICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSkgeworICAgIGlmIChpICsgMSA9PSBpdGVyYXRpb25zKSB7CisgICAgICBsYXN0S2lsbCA9IHRydWU7CisgICAgfQorICAgIHByb2Nlc3Mua2lsbChQcm9jZXNzU2lnbmFsLnNpZ2ludCk7CisgICAgLy8gWWllbGQgdG8gdGhlIGV2ZW50IGxvb3AgdG8gYWxsb3cgZm9yIHRoZSBzaWduYWwgdG8gYmUgc2VudC4KKyAgICBhd2FpdCBGdXR1cmUudmFsdWUobnVsbCk7CisgIH0KK30KKworRnV0dXJlPHZvaWQ+IG1haW4oKSBhc3luYyB7CisgIHByb2Nlc3MgPSBhd2FpdCBQcm9jZXNzLnN0YXJ0KAorICAgIFBsYXRmb3JtLnJlc29sdmVkRXhlY3V0YWJsZSwKKyAgICBbCisgICAgICBQbGF0Zm9ybS5zY3JpcHQucmVzb2x2ZSgncmVncmVzc180MjA5Ml9zY3JpcHQuZGFydCcpLnRvU3RyaW5nKCksCisgICAgXSwKKyAgKTsKKyAgZmluYWwgc3RhcnRDb21wbGV0ZXIgPSBDb21wbGV0ZXI8dm9pZD4oKTsKKyAgU3RyZWFtU3Vic2NyaXB0aW9uIHN1YjsKKyAgc3ViID0gcHJvY2Vzcy5zdGRvdXQudHJhbnNmb3JtKFV0ZjhEZWNvZGVyKCkpLmxpc3RlbigoZXZlbnQpIHsKKyAgICBpZiAoZXZlbnQuY29udGFpbnMoJ1dhaXRpbmcuLi4nKSkgeworICAgICAgc3RhcnRDb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICAgIHN1Yi5jYW5jZWwoKTsKKyAgICB9CisgIH0pOworCisgIC8vIFdhaXQgZm9yIHRhcmdldCBzY3JpcHQgdG8gc2V0dXAgaXRzIHNpZ25hbCBoYW5kbGluZy4KKyAgYXdhaXQgc3RhcnRDb21wbGV0ZXIuZnV0dXJlOworCisgIGZpbmFsIGV4aXRDb21wbGV0ZXIgPSBDb21wbGV0ZXI8dm9pZD4oKTsKKyAgcHJvY2Vzcy5leGl0Q29kZS50aGVuKChjb2RlKSB7CisgICAgRXhwZWN0LmlzVHJ1ZShsYXN0S2lsbCk7CisgICAgZXhpdENvbXBsZXRlci5jb21wbGV0ZSgpOworICB9KTsKKyAgYXdhaXQgc2lnaW50KDMpOworICBhd2FpdCBleGl0Q29tcGxldGVyLmZ1dHVyZTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL1ZFUlNJT04gYi90b29scy9WRVJTSU9OCmluZGV4IGQ0MTMxZWIuLmI4ZWI0MzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL1ZFUlNJT04KKysrIGIvdG9vbHMvVkVSU0lPTgpAQCAtMzMsNyArMzMsNyBAQAogTUFKT1IgMgogTUlOT1IgOQogUEFUQ0ggMAotUFJFUkVMRUFTRSAyMAorUFJFUkVMRUFTRSAyMQogUFJFUkVMRUFTRV9QQVRDSCAwCi1BQklfVkVSU0lPTiAzNwotT0xERVNUX1NVUFBPUlRFRF9BQklfVkVSU0lPTiAzNworQUJJX1ZFUlNJT04gMzgKK09MREVTVF9TVVBQT1JURURfQUJJX1ZFUlNJT04gMzgKZGlmZiAtLWdpdCBhL3Rvb2xzL2JvdHMvY29tcGFyZV9yZXN1bHRzLmRhcnQgYi90b29scy9ib3RzL2NvbXBhcmVfcmVzdWx0cy5kYXJ0CmluZGV4IDc5MmE0NzMuLmI2ZjBjZTQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2JvdHMvY29tcGFyZV9yZXN1bHRzLmRhcnQKKysrIGIvdG9vbHMvYm90cy9jb21wYXJlX3Jlc3VsdHMuZGFydApAQCAtNDAsMTcgKzQwLDE0IEBACiBjbGFzcyBFdmVudCB7CiAgIGZpbmFsIFJlc3VsdCBiZWZvcmU7CiAgIGZpbmFsIFJlc3VsdCBhZnRlcjsKLSAgZmluYWwgUmVzdWx0IGFwcHJvdmVkOwogCi0gIEV2ZW50KHRoaXMuYmVmb3JlLCB0aGlzLmFmdGVyLCB0aGlzLmFwcHJvdmVkKTsKKyAgRXZlbnQodGhpcy5iZWZvcmUsIHRoaXMuYWZ0ZXIpOwogCiAgIGJvb2wgZ2V0IGlzTmV3ID0+IGJlZm9yZSA9PSBudWxsOwogICBib29sIGdldCBpc05ld1Bhc3NpbmcgPT4gYmVmb3JlID09IG51bGwgJiYgYWZ0ZXIubWF0Y2hlczsKICAgYm9vbCBnZXQgaXNOZXdGYWlsaW5nID0+IGJlZm9yZSA9PSBudWxsICYmICFhZnRlci5tYXRjaGVzOwogICBib29sIGdldCBjaGFuZ2VkID0+ICF1bmNoYW5nZWQ7CiAgIGJvb2wgZ2V0IHVuY2hhbmdlZCA9PiBiZWZvcmUgIT0gbnVsbCAmJiBiZWZvcmUub3V0Y29tZSA9PSBhZnRlci5vdXRjb21lOwotICBib29sIGdldCBpc0FwcHJvdmVkID0+IGFwcHJvdmVkICE9IG51bGwgJiYgYXBwcm92ZWQub3V0Y29tZSA9PSBhZnRlci5vdXRjb21lOwotICBib29sIGdldCBpc1VuYXBwcm92ZWQgPT4gIWlzQXBwcm92ZWQ7CiAgIGJvb2wgZ2V0IHJlbWFpbmVkUGFzc2luZyA9PiBiZWZvcmUubWF0Y2hlcyAmJiBhZnRlci5tYXRjaGVzOwogICBib29sIGdldCByZW1haW5lZEZhaWxpbmcgPT4gIWJlZm9yZS5tYXRjaGVzICYmICFhZnRlci5tYXRjaGVzOwogICBib29sIGdldCBmbGFrZWQgPT4gYWZ0ZXIuZmxha2VkOwpAQCAtODEsNyArNzgsNiBAQAogYm9vbCBzZWFyY2goCiAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAogICAgIFN0cmluZyBzZWFyY2hGb3JTdGF0dXMsCi0gICAgU3RyaW5nIHNlYXJjaEZvckFwcHJvdmFsLAogICAgIExpc3Q8RXZlbnQ+IGV2ZW50cywKICAgICBBcmdSZXN1bHRzIG9wdGlvbnMsCiAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgZHluYW1pYz4+IGxvZ3MsCkBAIC0xMDMsMTIgKzk5LDYgQEAKICAgICAgICAgKGV2ZW50LmFmdGVyLmZsYWtlZCB8fCBldmVudC5hZnRlci5tYXRjaGVzKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChzZWFyY2hGb3JBcHByb3ZhbCA9PSAiYXBwcm92ZWQiICYmICFldmVudC5pc0FwcHJvdmVkKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNlYXJjaEZvckFwcHJvdmFsID09ICJ1bmFwcHJvdmVkIiAmJiAhZXZlbnQuaXNVbmFwcHJvdmVkKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9CiAgICAgaWYgKG9wdGlvbnNbInVuY2hhbmdlZCJdICYmICFldmVudC51bmNoYW5nZWQpIGNvbnRpbnVlOwogICAgIGlmIChvcHRpb25zWyJjaGFuZ2VkIl0gJiYgIWV2ZW50LmNoYW5nZWQpIGNvbnRpbnVlOwogICAgIGlmICghYmVnYW5TZWN0aW9uKSB7CkBAIC0xNzcsOCArMTY3LDYgQEAKIAogbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgewogICBmaW5hbCBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7Ci0gIHBhcnNlci5hZGRGbGFnKCJhcHByb3ZlZCIsCi0gICAgICBhYmJyOiAnQScsIG5lZ2F0YWJsZTogZmFsc2UsIGhlbHA6ICJTaG93IGFwcHJvdmVkIHRlc3RzLiIpOwogICBwYXJzZXIuYWRkRmxhZygiY2hhbmdlZCIsCiAgICAgICBhYmJyOiAnYycsCiAgICAgICBuZWdhdGFibGU6IGZhbHNlLApAQCAtMTk3LDE0ICsxODUsOSBAQAogICBwYXJzZXIuYWRkRmxhZygiZmxha3kiLAogICAgICAgYWJicjogJ0YnLCBuZWdhdGFibGU6IGZhbHNlLCBoZWxwOiAiU2hvdyBmbGFreSB0ZXN0cy4iKTsKICAgcGFyc2VyLmFkZEZsYWcoImhlbHAiLCBoZWxwOiAiU2hvdyB0aGUgcHJvZ3JhbSB1c2FnZS4iLCBuZWdhdGFibGU6IGZhbHNlKTsKLSAgcGFyc2VyLmFkZEZsYWcoImh1bWFuIiwKLSAgICAgIGFiYnI6ICJoIiwKLSAgICAgIGhlbHA6ICJQcm92ZSB5b3UgY2FuJ3QgcmVhZCBtYWNoaW5lIHJlYWRhYmxlIG91dHB1dC4iLAotICAgICAgbmVnYXRhYmxlOiBmYWxzZSk7CisgIHBhcnNlci5hZGRGbGFnKCJodW1hbiIsIGFiYnI6ICJoIiwgbmVnYXRhYmxlOiBmYWxzZSk7CiAgIHBhcnNlci5hZGRGbGFnKCJwYXNzaW5nIiwKICAgICAgIGFiYnI6ICdwJywgbmVnYXRhYmxlOiBmYWxzZSwgaGVscDogIlNob3cgcGFzc2luZyB0ZXN0cy4iKTsKLSAgcGFyc2VyLmFkZEZsYWcoInVuYXBwcm92ZWQiLAotICAgICAgYWJicjogJ1UnLCBuZWdhdGFibGU6IGZhbHNlLCBoZWxwOiAiU2hvdyB1bmFwcHJvdmVkIHRlc3RzLiIpOwogICBwYXJzZXIuYWRkRmxhZygidW5jaGFuZ2VkIiwKICAgICAgIGFiYnI6ICd1JywKICAgICAgIG5lZ2F0YWJsZTogZmFsc2UsCkBAIC0yMjIsOSArMjA1LDggQEAKICAgZmluYWwgb3B0aW9ucyA9IHBhcnNlci5wYXJzZShhcmdzKTsKICAgaWYgKG9wdGlvbnNbImhlbHAiXSkgewogICAgIHByaW50KCIiIgotVXNhZ2U6IGNvbXBhcmVfcmVzdWx0cy5kYXJ0IFtPUFRJT05dLi4uIEJFRk9SRSBBRlRFUiBbQVBQUk9WRURdCitVc2FnZTogY29tcGFyZV9yZXN1bHRzLmRhcnQgW09QVElPTl0uLi4gQkVGT1JFIEFGVEVSCiBDb21wYXJlIHRoZSBvbGQgYW5kIG5ldyB0ZXN0IHJlc3VsdHMgYW5kIGxpc3QgdGVzdHMgdGhhdCBwYXNzIHRoZSBmaWx0ZXJzLgotVGhyZWUtd2F5IGNvbXBhcmUgd2l0aCB0aGUgYXBwcm92ZWQgcmVzdWx0cyBpZiBwcm92aWRlZC4KIEFsbCB0ZXN0cyBhcmUgbGlzdGVkIGlmIG5vIGZpbHRlcnMgYXJlIGdpdmVuLgogCiBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czoKQEAgLTI0MSw5ICsyMjMsOSBAQAogICB9CiAKICAgZmluYWwgcGFyYW1ldGVycyA9IG9wdGlvbnMucmVzdDsKLSAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9IDIgJiYgcGFyYW1ldGVycy5sZW5ndGggIT0gMykgewotICAgIHByaW50KCJlcnJvcjogRXhwZWN0ZWQgdHdvIG9yIHRocmVlIHBhcmFtZXRlcnMgIgotICAgICAgICAiKHJlc3VsdHMgYmVmb3JlLCByZXN1bHRzIGFmdGVyLCBhbmQgKG9wdGlvbmFsbHkpIGFwcHJvdmVkIHJlc3VsdHMpIik7CisgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPSAyKSB7CisgICAgcHJpbnQoImVycm9yOiBFeHBlY3RlZCB0d28gcGFyYW1ldGVycyAiCisgICAgICAgICIocmVzdWx0cyBiZWZvcmUsIHJlc3VsdHMgYWZ0ZXIpIik7CiAgICAgZXhpdENvZGUgPSAyOwogICAgIHJldHVybjsKICAgfQpAQCAtMjUxLDkgKzIzMyw2IEBACiAgIC8vIExvYWQgdGhlIGlucHV0IGFuZCB0aGUgZmxha2luZXNzIGRhdGEgaWYgc3BlY2lmaWVkLgogICBmaW5hbCBiZWZvcmUgPSBhd2FpdCBsb2FkUmVzdWx0c01hcChwYXJhbWV0ZXJzWzBdKTsKICAgZmluYWwgYWZ0ZXIgPSBhd2FpdCBsb2FkUmVzdWx0c01hcChwYXJhbWV0ZXJzWzFdKTsKLSAgZmluYWwgYXBwcm92ZWQgPSAzIDw9IHBhcmFtZXRlcnMubGVuZ3RoCi0gICAgICA/IGF3YWl0IGxvYWRSZXN1bHRzTWFwKHBhcmFtZXRlcnNbMl0pCi0gICAgICA6IDxTdHJpbmcsIE1hcDxTdHJpbmcsIGR5bmFtaWM+Pnt9OwogICBmaW5hbCBsb2dzID0gb3B0aW9uc1snbG9ncyddID09IG51bGwKICAgICAgID8gPFN0cmluZywgTWFwPFN0cmluZywgZHluYW1pYz4+e30KICAgICAgIDogYXdhaXQgbG9hZFJlc3VsdHNNYXAob3B0aW9uc1snbG9ncyddKTsKQEAgLTI2OCwxNSArMjQ3LDExIEBACiAgIGZvciAoZmluYWwgbmFtZSBpbiBuYW1lcykgewogICAgIGZpbmFsIG1hcEJlZm9yZSA9IGJlZm9yZVtuYW1lXTsKICAgICBmaW5hbCBtYXBBZnRlciA9IGFmdGVyW25hbWVdOwotICAgIGZpbmFsIG1hcEFwcHJvdmVkID0gYXBwcm92ZWRbbmFtZV07CiAgICAgZmluYWwgcmVzdWx0QmVmb3JlID0gbWFwQmVmb3JlICE9IG51bGwKICAgICAgICAgPyBuZXcgUmVzdWx0LmZyb21NYXAobWFwQmVmb3JlLCBmbGFraW5lc3NEYXRhW25hbWVdKQogICAgICAgICA6IG51bGw7CiAgICAgZmluYWwgcmVzdWx0QWZ0ZXIgPSBuZXcgUmVzdWx0LmZyb21NYXAobWFwQWZ0ZXIsIGZsYWtpbmVzc0RhdGFbbmFtZV0pOwotICAgIGZpbmFsIHJlc3VsdEFwcHJvdmVkID0gbWFwQXBwcm92ZWQgIT0gbnVsbCAmJiBtYXBBcHByb3ZlZFsicmVzdWx0Il0gIT0gbnVsbAotICAgICAgICA/IG5ldyBSZXN1bHQuZnJvbU1hcChtYXBBcHByb3ZlZCwgZmxha2luZXNzRGF0YVtuYW1lXSkKLSAgICAgICAgOiBudWxsOwotICAgIGZpbmFsIGV2ZW50ID0gbmV3IEV2ZW50KHJlc3VsdEJlZm9yZSwgcmVzdWx0QWZ0ZXIsIHJlc3VsdEFwcHJvdmVkKTsKKyAgICBmaW5hbCBldmVudCA9IG5ldyBFdmVudChyZXN1bHRCZWZvcmUsIHJlc3VsdEFmdGVyKTsKICAgICBldmVudHMuYWRkKGV2ZW50KTsKICAgfQogCkBAIC0zMDYsNTcgKzI4MSwyNCBAQAogICBmaW5hbCBzZWFyY2hGb3JTdGF0dXNlcyA9CiAgICAgICBbInBhc3NpbmciLCAiZmxha3kiLCAiZmFpbGluZyJdLndoZXJlKChvcHRpb24pID0+IG9wdGlvbnNbb3B0aW9uXSk7CiAKLSAgZmluYWwgYXBwcm92YWxEZXNjcmlwdGlvbnMgPSB7Ci0gICAgInBhc3NpbmciOiB7Ci0gICAgICAiYXBwcm92ZWQiOiAiIChhcHByb3ZlZCkiLAotICAgICAgInVuYXBwcm92ZWQiOiAiIChzaG91bGQgYmUgYXBwcm92ZWQpIiwKLSAgICAgIG51bGw6ICIiLAotICAgIH0sCi0gICAgImZsYWt5IjogewotICAgICAgImFwcHJvdmVkIjogIiAoYXBwcm92ZWQgcmVzdWx0KSIsCi0gICAgICAidW5hcHByb3ZlZCI6ICIgKHVuYXBwcm92ZWQgcmVzdWx0KSIsCi0gICAgICBudWxsOiAiIiwKLSAgICB9LAotICAgICJmYWlsaW5nIjogewotICAgICAgImFwcHJvdmVkIjogIiAoYXBwcm92ZWQpIiwKLSAgICAgICJ1bmFwcHJvdmVkIjogIiAobmVlZHMgYXBwcm92YWwpIiwKLSAgICAgIG51bGw6ICIiLAotICAgIH0sCi0gICAgbnVsbDogewotICAgICAgImFwcHJvdmVkIjogIiAoYXBwcm92ZWQpIiwKLSAgICAgICJ1bmFwcHJvdmVkIjogIiAobmVlZHMgYXBwcm92YWwpIiwKLSAgICAgIG51bGw6ICIiLAotICAgIH0sCi0gIH07Ci0KLSAgZmluYWwgc2VhcmNoRm9yQXBwcm92YWxzID0KLSAgICAgIFsiYXBwcm92ZWQiLCAidW5hcHByb3ZlZCJdLndoZXJlKChvcHRpb24pID0+IG9wdGlvbnNbb3B0aW9uXSk7Ci0KICAgLy8gUmVwb3J0IHRlc3RzIG1hdGNoaW5nIHRoZSBmaWx0ZXJzLgogICBmaW5hbCBsb2dTZWN0aW9uID0gPFN0cmluZz5bXTsKICAgYm9vbCBqdWRnZW1lbnQgPSBmYWxzZTsKICAgZm9yIChmaW5hbCBzZWFyY2hGb3JTdGF0dXMKICAgICAgIGluIHNlYXJjaEZvclN0YXR1c2VzLmlzTm90RW1wdHkgPyBzZWFyY2hGb3JTdGF0dXNlcyA6IDxTdHJpbmc+W251bGxdKSB7Ci0gICAgZm9yIChmaW5hbCBzZWFyY2hGb3JBcHByb3ZhbCBpbiBzZWFyY2hGb3JBcHByb3ZhbHMuaXNOb3RFbXB0eQotICAgICAgICA/IHNlYXJjaEZvckFwcHJvdmFscwotICAgICAgICA6IDxTdHJpbmc+W251bGxdKSB7Ci0gICAgICBmaW5hbCBzZWFyY2hGb3JDaGFuZ2VkID0gb3B0aW9uc1sidW5jaGFuZ2VkIl0KLSAgICAgICAgICA/ICJ1bmNoYW5nZWQiCi0gICAgICAgICAgOiBvcHRpb25zWyJjaGFuZ2VkIl0gPyAiY2hhbmdlZCIgOiBudWxsOwotICAgICAgZmluYWwgYWJvdXRTdGF0dXMgPSBmaWx0ZXJEZXNjcmlwdGlvbnNbc2VhcmNoRm9yU3RhdHVzXVtzZWFyY2hGb3JDaGFuZ2VkXTsKLSAgICAgIGZpbmFsIGFib3V0QXBwcm92YWwgPQotICAgICAgICAgIGFwcHJvdmFsRGVzY3JpcHRpb25zW3NlYXJjaEZvclN0YXR1c11bc2VhcmNoRm9yQXBwcm92YWxdOwotICAgICAgZmluYWwgc2VjdGlvbkhlYWRlciA9ICJUaGUgZm9sbG93aW5nIHRlc3RzICRhYm91dFN0YXR1cyRhYm91dEFwcHJvdmFsOiI7Ci0gICAgICBmaW5hbCBsb2dTZWN0aW9uQXJnID0KLSAgICAgICAgICBzZWFyY2hGb3JTdGF0dXMgPT0gImZhaWxpbmciIHx8IHNlYXJjaEZvclN0YXR1cyA9PSAiZmxha3kiCi0gICAgICAgICAgICAgID8gbG9nU2VjdGlvbgotICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICBib29sIHBvc3NpYmxlSnVkZ2VtZW50ID0gc2VhcmNoKHNlY3Rpb25IZWFkZXIsIHNlYXJjaEZvclN0YXR1cywKLSAgICAgICAgICBzZWFyY2hGb3JBcHByb3ZhbCwgZXZlbnRzLCBvcHRpb25zLCBsb2dzLCBsb2dTZWN0aW9uQXJnKTsKLSAgICAgIGlmICgoc2VhcmNoRm9yU3RhdHVzID09IG51bGwgfHwgc2VhcmNoRm9yU3RhdHVzID09ICJmYWlsaW5nIikgJiYKLSAgICAgICAgICAoc2VhcmNoRm9yQXBwcm92YWwgPT0gbnVsbCB8fCBzZWFyY2hGb3JBcHByb3ZhbCA9PSAidW5hcHByb3ZlZCIpKSB7Ci0gICAgICAgIGp1ZGdlbWVudCA9IHBvc3NpYmxlSnVkZ2VtZW50OwotICAgICAgfQorICAgIGZpbmFsIHNlYXJjaEZvckNoYW5nZWQgPSBvcHRpb25zWyJ1bmNoYW5nZWQiXQorICAgICAgICA/ICJ1bmNoYW5nZWQiCisgICAgICAgIDogb3B0aW9uc1siY2hhbmdlZCJdID8gImNoYW5nZWQiIDogbnVsbDsKKyAgICBmaW5hbCBhYm91dFN0YXR1cyA9IGZpbHRlckRlc2NyaXB0aW9uc1tzZWFyY2hGb3JTdGF0dXNdW3NlYXJjaEZvckNoYW5nZWRdOworICAgIGZpbmFsIHNlY3Rpb25IZWFkZXIgPSAiVGhlIGZvbGxvd2luZyB0ZXN0cyAkYWJvdXRTdGF0dXM6IjsKKyAgICBmaW5hbCBsb2dTZWN0aW9uQXJnID0KKyAgICAgICAgc2VhcmNoRm9yU3RhdHVzID09ICJmYWlsaW5nIiB8fCBzZWFyY2hGb3JTdGF0dXMgPT0gImZsYWt5IgorICAgICAgICAgICAgPyBsb2dTZWN0aW9uCisgICAgICAgICAgICA6IG51bGw7CisgICAgYm9vbCBwb3NzaWJsZUp1ZGdlbWVudCA9IHNlYXJjaCgKKyAgICAgICAgc2VjdGlvbkhlYWRlciwgc2VhcmNoRm9yU3RhdHVzLCBldmVudHMsIG9wdGlvbnMsIGxvZ3MsIGxvZ1NlY3Rpb25BcmcpOworICAgIGlmICgoc2VhcmNoRm9yU3RhdHVzID09IG51bGwgfHwgc2VhcmNoRm9yU3RhdHVzID09ICJmYWlsaW5nIikpIHsKKyAgICAgIGp1ZGdlbWVudCA9IHBvc3NpYmxlSnVkZ2VtZW50OwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS90b29scy9ib3RzL3RyeV9iZW5jaG1hcmtzLnNoIGIvdG9vbHMvYm90cy90cnlfYmVuY2htYXJrcy5zaAppbmRleCA5ZTM2ZGI3Li5hYWY2ZDU1IDEwMDc1NQotLS0gYS90b29scy9ib3RzL3RyeV9iZW5jaG1hcmtzLnNoCisrKyBiL3Rvb2xzL2JvdHMvdHJ5X2JlbmNobWFya3Muc2gKQEAgLTE3NCwxOSArMTc0LDI4IEBACiB9CiBFT0YKICAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLXByb2ZpbGUtcGVyaW9kPTEwMDAwIC0tcGFja2FnZXM9LnBhY2thZ2VzIGhlbGxvLmRhcnQKKyAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIC0tcHJvZmlsZS1wZXJpb2Q9MTAwMDAgLS1wYWNrYWdlcz0ucGFja2FnZXMgaGVsbG8uZGFydAogICAgIG91dC9SZWxlYXNlSUEzMi9kYXJ0IHBrZy9mcm9udF9lbmQvdG9vbC9wZXJmLmRhcnQgcGFyc2UgaGVsbG8uZGFydAogICAgIG91dC9SZWxlYXNlSUEzMi9kYXJ0IHBrZy9mcm9udF9lbmQvdG9vbC9wZXJmLmRhcnQgc2NhbiBoZWxsby5kYXJ0CiAgICAgb3V0L1JlbGVhc2VJQTMyL2RhcnQgcGtnL2Zyb250X2VuZC90b29sL2Zhc3RhX3BlcmYuZGFydCBrZXJuZWxfZ2VuX2UyZSBoZWxsby5kYXJ0CiAgICAgb3V0L1JlbGVhc2VJQTMyL2RhcnQgcGtnL2Zyb250X2VuZC90b29sL2Zhc3RhX3BlcmYuZGFydCBzY2FuIGhlbGxvLmRhcnQKICAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLXByaW50X21ldHJpY3MgcGtnL2FuYWx5emVyX2NsaS9iaW4vYW5hbHl6ZXIuZGFydCAtLWRhcnQtc2RrPXNkayBoZWxsby5kYXJ0CiAgICAgb3V0L1JlbGVhc2VJQTMyL3J1bl92bV90ZXN0cyBJbml0aWFsUlNTCisgICAgb3V0L1JlbGVhc2VJQTMyL3J1bl92bV90ZXN0cyAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIEluaXRpYWxSU1MKICAgICBvdXQvUmVsZWFzZUlBMzIvcnVuX3ZtX3Rlc3RzIEdlbktlcm5lbEtlcm5lbExvYWRLZXJuZWwKKyAgICBvdXQvUmVsZWFzZUlBMzIvcnVuX3ZtX3Rlc3RzIC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgR2VuS2VybmVsS2VybmVsTG9hZEtlcm5lbAogICAgIG91dC9SZWxlYXNlSUEzMi9ydW5fdm1fdGVzdHMgS2VybmVsU2VydmljZUNvbXBpbGVBbGwKKyAgICBvdXQvUmVsZWFzZUlBMzIvcnVuX3ZtX3Rlc3RzIC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgS2VybmVsU2VydmljZUNvbXBpbGVBbGwKICAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLXByb2ZpbGUtcGVyaW9kPTEwMDAwIC0tcGFja2FnZXM9LnBhY2thZ2VzIGJlbmNobWFya3MvRXhhbXBsZS9kYXJ0Mi9FeGFtcGxlLmRhcnQKKyAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIC0tcHJvZmlsZS1wZXJpb2Q9MTAwMDAgLS1wYWNrYWdlcz0ucGFja2FnZXMgYmVuY2htYXJrcy9FeGFtcGxlL2RhcnQvRXhhbXBsZS5kYXJ0CiAgICAgb3V0L1JlbGVhc2VJQTMyL2RhcnQgYmVuY2htYXJrcy9GZmlCb3Jpbmdzc2wvZGFydDIvRmZpQm9yaW5nc3NsLmRhcnQKKyAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIGJlbmNobWFya3MvRmZpQm9yaW5nc3NsL2RhcnQvRmZpQm9yaW5nc3NsLmRhcnQKICAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCBiZW5jaG1hcmtzL0ZmaUNhbGwvZGFydDIvRmZpQ2FsbC5kYXJ0CisgICAgb3V0L1JlbGVhc2VJQTMyL2RhcnQgLS1udWxsLXNhZmV0eSAtLWVuYWJsZS1leHBlcmltZW50PW5vbi1udWxsYWJsZSBiZW5jaG1hcmtzL0ZmaUNhbGwvZGFydC9GZmlDYWxsLmRhcnQKICAgICBvdXQvUmVsZWFzZUlBMzIvZGFydCBiZW5jaG1hcmtzL0ZmaU1lbW9yeS9kYXJ0Mi9GZmlNZW1vcnkuZGFydAorICAgIG91dC9SZWxlYXNlSUEzMi9kYXJ0IC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgYmVuY2htYXJrcy9GZmlNZW1vcnkvZGFydC9GZmlNZW1vcnkuZGFydAogICAgIG91dC9SZWxlYXNlSUEzMi9kYXJ0IGJlbmNobWFya3MvRmZpU3RydWN0L2RhcnQyL0ZmaVN0cnVjdC5kYXJ0CisgICAgb3V0L1JlbGVhc2VJQTMyL2RhcnQgLS1udWxsLXNhZmV0eSAtLWVuYWJsZS1leHBlcmltZW50PW5vbi1udWxsYWJsZSBiZW5jaG1hcmtzL0ZmaVN0cnVjdC9kYXJ0L0ZmaVN0cnVjdC5kYXJ0CiAgICAgY2QgLi4KICAgICBybSAtcmYgdG1wCiAgIGVsaWYgWyAiJGNvbW1hbmQiID0gbGludXgteDY0LWJ1aWxkIF07IHRoZW4KQEAgLTMxMywxOCArMzIyLDI1IEBACiB9CiBFT0YKICAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0IC0tcHJvZmlsZS1wZXJpb2Q9MTAwMDAgLS1wYWNrYWdlcz0ucGFja2FnZXMgaGVsbG8uZGFydAorICAgIG91dC9SZWxlYXNlWDY0L2RhcnQgLS1udWxsLXNhZmV0eSAtLWVuYWJsZS1leHBlcmltZW50PW5vbi1udWxsYWJsZSAtLXByb2ZpbGUtcGVyaW9kPTEwMDAwIC0tcGFja2FnZXM9LnBhY2thZ2VzIGhlbGxvLmRhcnQKICAgICBEQVJUX0NPTkZJR1VSQVRJT049UmVsZWFzZVg2NCBwa2cvdm0vdG9vbC9wcmVjb21waWxlcjIgLS1wYWNrYWdlcz0ucGFja2FnZXMgaGVsbG8uZGFydCBibG9iLmJpbgogICAgIERBUlRfQ09ORklHVVJBVElPTj1SZWxlYXNlWDY0IHBrZy92bS90b29sL2RhcnRfcHJlY29tcGlsZWRfcnVudGltZTIgLS1wcm9maWxlLXBlcmlvZD0xMDAwMCBibG9iLmJpbgorICAgIERBUlRfQ09ORklHVVJBVElPTj1SZWxlYXNlWDY0IHBrZy92bS90b29sL3ByZWNvbXBpbGVyMiAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIC0tcGFja2FnZXM9LnBhY2thZ2VzIGhlbGxvLmRhcnQgYmxvYi5iaW4KKyAgICBEQVJUX0NPTkZJR1VSQVRJT049UmVsZWFzZVg2NCBwa2cvdm0vdG9vbC9kYXJ0X3ByZWNvbXBpbGVkX3J1bnRpbWUyIC0tbnVsbC1zYWZldHkgLS1wcm9maWxlLXBlcmlvZD0xMDAwMCBibG9iLmJpbgogICAgIG91dC9SZWxlYXNlWDY0L2RhcnQgLS1wcm9maWxlLXBlcmlvZD0xMDAwMCAtLXBhY2thZ2VzPS5wYWNrYWdlcyAtLW9wdGltaXphdGlvbi1jb3VudGVyLXRocmVzaG9sZD0tMSBoZWxsby5kYXJ0CiAgICAgb3V0L1JlbGVhc2VYNjQvZGFydC1zZGsvYmluL2RhcnQyanMgLS1wYWNrYWdlcz0ucGFja2FnZXMgLS1vdXQ9b3V0LmpzIC1tIGhlbGxvLmRhcnQKICAgICB0aGlyZF9wYXJ0eS9kOC9saW51eC94NjQvZDggLS1zdGFja19zaXplPTEwMjQgc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvcHJlYW1ibGVzL2Q4LmpzIG91dC5qcworICAgIG91dC9SZWxlYXNlWDY0L2RhcnQtc2RrL2Jpbi9kYXJ0MmpzIC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIC0tc291bmQtbnVsbC1zYWZldHkgLS1wYWNrYWdlcz0ucGFja2FnZXMgLS1vdXQ9b3V0LmpzIC1tIGhlbGxvLmRhcnQKKyAgICB0aGlyZF9wYXJ0eS9kOC9saW51eC94NjQvZDggLS1zdGFja19zaXplPTEwMjQgc2RrL2xpYi9faW50ZXJuYWwvanNfcnVudGltZS9saWIvcHJlYW1ibGVzL2Q4LmpzIG91dC5qcwogICAgIG91dC9SZWxlYXNlWDY0L2RhcnQtc2RrL2Jpbi9kYXJ0MmpzIC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CiAgICAgTERfTElCUkFSWV9QQVRIPXRoaXJkX3BhcnR5L2ZpcmVmb3hfanNzaGVsbC9saW51eC9qc3NoZWxsLyB0aGlyZF9wYXJ0eS9maXJlZm94X2pzc2hlbGwvbGludXgvanNzaGVsbC9qcyAtZiBzZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9wcmVhbWJsZXMvanNzaGVsbC5qcyAtZiBvdXQuanMKKyAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydDJqcyAtLWVuYWJsZS1leHBlcmltZW50PW5vbi1udWxsYWJsZSAtLXNvdW5kLW51bGwtc2FmZXR5IC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CisgICAgTERfTElCUkFSWV9QQVRIPXRoaXJkX3BhcnR5L2ZpcmVmb3hfanNzaGVsbC9saW51eC9qc3NoZWxsLyB0aGlyZF9wYXJ0eS9maXJlZm94X2pzc2hlbGwvbGludXgvanNzaGVsbC9qcyAtZiBzZGsvbGliL19pbnRlcm5hbC9qc19ydW50aW1lL2xpYi9wcmVhbWJsZXMvanNzaGVsbC5qcyAtZiBvdXQuanMKICAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydDJqcyAtLWJlbmNobWFya2luZy1wcm9kdWN0aW9uIC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CiAgICAgdGhpcmRfcGFydHkvZDgvbGludXgveDY0L2Q4IC0tc3RhY2tfc2l6ZT0xMDI0IHNkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3ByZWFtYmxlcy9kOC5qcyBvdXQuanMKLSAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydDJqcyAtLWJlbmNobWFya2luZy14IC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CisgICAgb3V0L1JlbGVhc2VYNjQvZGFydC1zZGsvYmluL2RhcnQyanMgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgLS1zb3VuZC1udWxsLXNhZmV0eSAtLWJlbmNobWFya2luZy1wcm9kdWN0aW9uIC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CiAgICAgdGhpcmRfcGFydHkvZDgvbGludXgveDY0L2Q4IC0tc3RhY2tfc2l6ZT0xMDI0IHNkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3ByZWFtYmxlcy9kOC5qcyBvdXQuanMKLSAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydDJqcyAtLXVzZS1rZXJuZWwgLS1wYWNrYWdlcz0ucGFja2FnZXMgLS1vdXQ9b3V0LmpzIC1tIGhlbGxvLmRhcnQKKyAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydDJqcyAtLWJlbmNobWFya2luZy14IC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0PW91dC5qcyAtbSBoZWxsby5kYXJ0CiAgICAgdGhpcmRfcGFydHkvZDgvbGludXgveDY0L2Q4IC0tc3RhY2tfc2l6ZT0xMDI0IHNkay9saWIvX2ludGVybmFsL2pzX3J1bnRpbWUvbGliL3ByZWFtYmxlcy9kOC5qcyBvdXQuanMKICAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0LXNkay9iaW4vZGFydCBwa2cvZGV2X2NvbXBpbGVyL3Rvb2wvZGRiIC1yIGQ4IC1iIHRoaXJkX3BhcnR5L2Q4L2xpbnV4L3g2NC9kOCAtLWtlcm5lbCBoZWxsby5kYXJ0CiAgICAgb3V0L1JlbGVhc2VYNjQvZGFydC1zZGsvYmluL2RhcnQgcGtnL2Rldl9jb21waWxlci90b29sL2RkYiAtciBkOCAtYiB0aGlyZF9wYXJ0eS9kOC9saW51eC94NjQvZDggLS1tb2RlPWNvbXBpbGUgLS1jb21waWxlLXZtLW9wdGlvbnM9LS1wcmludC1tZXRyaWNzIC0tcGFja2FnZXM9LnBhY2thZ2VzIC0tb3V0IG91dC5qcyAtLWtlcm5lbCBoZWxsby5kYXJ0CkBAIC0zMzksOSArMzU1LDEzIEBACiAgICAgb3V0L1JlbGVhc2VYNjQvZGFydCAtLWJhY2tncm91bmQtY29tcGlsYXRpb249ZmFsc2UgcGtnL2Zyb250X2VuZC90b29sL2luY3JlbWVudGFsX3BlcmYuZGFydC5hcHBqaXQgLS10YXJnZXQ9dm0gLS1zZGstc3VtbWFyeT1vdXQvUmVsZWFzZVg2NC92bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbCAtLXNkay1saWJyYXJ5LXNwZWNpZmljYXRpb249c2RrL2xpYi9saWJyYXJpZXMuanNvbiBwa2cvZnJvbnRfZW5kL2JlbmNobWFya3MvaWtnL2hlbGxvLmRhcnQgcGtnL2Zyb250X2VuZC9iZW5jaG1hcmtzL2lrZy9oZWxsby5lZGl0cy5qc29uCiAgICAgb3V0L1JlbGVhc2VYNjQvZGFydCAtLXBhY2thZ2VzPS5wYWNrYWdlcyBwa2cva2VybmVsL3Rlc3QvYmluYXJ5X2JlbmNoLmRhcnQgLS1nb2xlbSBBc3RGcm9tQmluYXJ5TGF6eSBvdXQvUmVsZWFzZVg2NC92bV9wbGF0Zm9ybV9zdHJvbmcuZGlsbAogICAgIG91dC9SZWxlYXNlWDY0L3J1bl92bV90ZXN0cyBJbml0aWFsUlNTCisgICAgb3V0L1JlbGVhc2VYNjQvcnVuX3ZtX3Rlc3RzIC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgSW5pdGlhbFJTUwogICAgIG91dC9SZWxlYXNlWDY0L3J1bl92bV90ZXN0cyBHZW5LZXJuZWxLZXJuZWxMb2FkS2VybmVsCisgICAgb3V0L1JlbGVhc2VYNjQvcnVuX3ZtX3Rlc3RzIC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgR2VuS2VybmVsS2VybmVsTG9hZEtlcm5lbAogICAgIG91dC9SZWxlYXNlWDY0L3J1bl92bV90ZXN0cyBLZXJuZWxTZXJ2aWNlQ29tcGlsZUFsbAorICAgIG91dC9SZWxlYXNlWDY0L3J1bl92bV90ZXN0cyAtLW51bGwtc2FmZXR5IC0tZW5hYmxlLWV4cGVyaW1lbnQ9bm9uLW51bGxhYmxlIEtlcm5lbFNlcnZpY2VDb21waWxlQWxsCiAgICAgb3V0L1JlbGVhc2VYNjQvZGFydCAtLXByb2ZpbGUtcGVyaW9kPTEwMDAwIC0tcGFja2FnZXM9LnBhY2thZ2VzIGJlbmNobWFya3MvRXhhbXBsZS9kYXJ0Mi9FeGFtcGxlLmRhcnQKKyAgICBvdXQvUmVsZWFzZVg2NC9kYXJ0IC0tbnVsbC1zYWZldHkgLS1lbmFibGUtZXhwZXJpbWVudD1ub24tbnVsbGFibGUgLS1wcm9maWxlLXBlcmlvZD0xMDAwMCAtLXBhY2thZ2VzPS5wYWNrYWdlcyBiZW5jaG1hcmtzL0V4YW1wbGUvZGFydC9FeGFtcGxlLmRhcnQKICAgICBjZCAuLgogICAgIHJtIC1yZiB0bXAKICAgZWxzZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZG9tL3NjcmlwdHMvc3lzdGVtaHRtbC5weSBiL3Rvb2xzL2RvbS9zY3JpcHRzL3N5c3RlbWh0bWwucHkKaW5kZXggMmNmOTdkNy4uNTk0OGRlMyAxMDA2NDQKLS0tIGEvdG9vbHMvZG9tL3NjcmlwdHMvc3lzdGVtaHRtbC5weQorKysgYi90b29scy9kb20vc2NyaXB0cy9zeXN0ZW1odG1sLnB5CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICAgICdDb25zb2xlQmFzZS5hc3NlcnRDb25kaXRpb24nLAogICAgICAgICAnQ29uc29sZUJhc2UuY2xlYXInLAogICAgICAgICAnQ29uc29sZUJhc2UuY291bnQnLAorICAgICAgICAnQ29uc29sZUJhc2UuY291bnRSZXNldCcsCiAgICAgICAgICdDb25zb2xlQmFzZS5kZWJ1ZycsCiAgICAgICAgICdDb25zb2xlQmFzZS5kaXInLAogICAgICAgICAnQ29uc29sZUJhc2UuZGlyeG1sJywKZGlmZiAtLWdpdCBhL3Rvb2xzL2RvbS9zcmMvZGFydDJqc19Db25zb2xlLmRhcnQgYi90b29scy9kb20vc3JjL2RhcnQyanNfQ29uc29sZS5kYXJ0CmluZGV4IGIzMjk3ZDIuLmE3YTQwYjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RvbS9zcmMvZGFydDJqc19Db25zb2xlLmRhcnQKKysrIGIvdG9vbHMvZG9tL3NyYy9kYXJ0MmpzX0NvbnNvbGUuZGFydApAQCAtMTMsNzAgKzEzLDk0IEBACiAgIE1lbW9yeUluZm8/IGdldCBtZW1vcnkgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ01lbW9yeUluZm8nLCAnd2luZG93LmNvbnNvbGUubWVtb3J5JykgOiBudWxsOwogCi0gIHZvaWQgYXNzZXJ0Q29uZGl0aW9uKGJvb2wgY29uZGl0aW9uLCBPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZAotICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5hc3NlcnRDb25kaXRpb24oIywgIyknLCBjb25kaXRpb24sIGFyZykKKyAgLy8gRXZlbiB0aG91Z2ggbWFueSBvZiB0aGUgZm9sbG93aW5nIEpTIG1ldGhvZHMgY2FuIHRha2UgaW4gbXVsdGlwbGUKKyAgLy8gYXJndW1lbnRzLCB3ZSBoaXN0b3JpY2FsbHkgYW5kIGN1cnJlbnRseSBsaW1pdCB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlCisgIC8vIGFyZ3VtZW50cyB0byAxLiBEZXBlbmRpbmcgb24gdGhlIG5lZWQsIHRoZXNlIG1ldGhvZHMgbWF5IGJlIHVwZGF0ZWQgdG8KKyAgLy8gYWxsb3cgZm9yIG1vcmUuCisKKyAgLy8gV2UgcmVuYW1lIGFzc2VydCB0byBhc3NlcnRDb25kaXRpb24gaGVyZS4KKyAgdm9pZCBhc3NlcnRDb25kaXRpb24oW2Jvb2w/IGNvbmRpdGlvbiwgT2JqZWN0PyBhcmddKSA9PiBfaXNDb25zb2xlRGVmaW5lZAorICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5hc3NlcnQoIywgIyknLCBjb25kaXRpb24sIGFyZykKICAgICAgIDogbnVsbDsKIAotICB2b2lkIGNsZWFyKE9iamVjdCBhcmcpID0+CisgIC8vIGNsZWFyIG5vIGxvbmdlciB0YWtlcyBpbiBhbiBhcmd1bWVudCwgYnV0IHdlIGtlZXAgdGhpcyBhcyBvcHRpb25hbCB0bworICAvLyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgdm9pZCBjbGVhcihbT2JqZWN0PyBhcmddKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5jbGVhcigjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgY291bnQoT2JqZWN0IGFyZykgPT4KKyAgLy8gY291bnQgdGFrZXMgaW4gYSBTdHJpbmcgaW5zdGVhZCwgYnV0IHdlIGtlZXAgdGhpcyBhcyBhbiBPYmplY3QgZm9yCisgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICB2b2lkIGNvdW50KFtPYmplY3Q/IGFyZ10pID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmNvdW50KCMpJywgYXJnKSA6IG51bGw7CiAKLSAgdm9pZCBkZWJ1ZyhPYmplY3QgYXJnKSA9PgorICB2b2lkIGNvdW50UmVzZXQoW1N0cmluZz8gYXJnXSkgPT4gX2lzQ29uc29sZURlZmluZWQKKyAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuY291bnRSZXNldCgjKScsIGFyZykKKyAgICAgIDogbnVsbDsKKworICB2b2lkIGRlYnVnKE9iamVjdD8gYXJnKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5kZWJ1ZygjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgZGlyKE9iamVjdCBhcmcpID0+Ci0gICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmRpcigjKScsIGFyZykgOiBudWxsOworICB2b2lkIGRpcihbT2JqZWN0PyBpdGVtLCBPYmplY3Q/IG9wdGlvbnNdKSA9PiBfaXNDb25zb2xlRGVmaW5lZAorICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5kaXIoIywgIyknLCBpdGVtLCBvcHRpb25zKQorICAgICAgOiBudWxsOwogCi0gIHZvaWQgZGlyeG1sKE9iamVjdCBhcmcpID0+CisgIHZvaWQgZGlyeG1sKE9iamVjdD8gYXJnKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5kaXJ4bWwoIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIGVycm9yKE9iamVjdCBhcmcpID0+CisgIHZvaWQgZXJyb3IoT2JqZWN0PyBhcmcpID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmVycm9yKCMpJywgYXJnKSA6IG51bGw7CiAKLSAgdm9pZCBncm91cChPYmplY3QgYXJnKSA9PgorICB2b2lkIGdyb3VwKE9iamVjdD8gYXJnKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5ncm91cCgjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgZ3JvdXBDb2xsYXBzZWQoT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQKKyAgdm9pZCBncm91cENvbGxhcHNlZChPYmplY3Q/IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQKICAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoIyknLCBhcmcpCiAgICAgICA6IG51bGw7CiAKICAgdm9pZCBncm91cEVuZCgpID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLmdyb3VwRW5kKCknKSA6IG51bGw7CiAKLSAgdm9pZCBpbmZvKE9iamVjdCBhcmcpID0+CisgIHZvaWQgaW5mbyhPYmplY3Q/IGFyZykgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUuaW5mbygjKScsIGFyZykgOiBudWxsOwogCi0gIHZvaWQgbG9nKE9iamVjdCBhcmcpID0+CisgIHZvaWQgbG9nKE9iamVjdD8gYXJnKSA9PgogICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5sb2coIyknLCBhcmcpIDogbnVsbDsKIAotICB2b2lkIG1hcmtUaW1lbGluZShPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZAotICAgICAgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS5tYXJrVGltZWxpbmUoIyknLCBhcmcpCisgIHZvaWQgdGFibGUoW09iamVjdD8gdGFidWxhckRhdGEsIExpc3Q8U3RyaW5nPj8gcHJvcGVydGllc10pID0+CisgICAgICBfaXNDb25zb2xlRGVmaW5lZAorICAgICAgICAgID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGFibGUoIywgIyknLCB0YWJ1bGFyRGF0YSwgcHJvcGVydGllcykKKyAgICAgICAgICA6IG51bGw7CisKKyAgdm9pZCB0aW1lKFtTdHJpbmc/IGxhYmVsXSkgPT4KKyAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGltZSgjKScsIGxhYmVsKSA6IG51bGw7CisKKyAgdm9pZCB0aW1lRW5kKFtTdHJpbmc/IGxhYmVsXSkgPT4KKyAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGltZUVuZCgjKScsIGxhYmVsKSA6IG51bGw7CisKKyAgdm9pZCB0aW1lTG9nKFtTdHJpbmc/IGxhYmVsLCBPYmplY3Q/IGFyZ10pID0+IF9pc0NvbnNvbGVEZWZpbmVkCisgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRpbWVMb2coIywgIyknLCBsYWJlbCwgYXJnKQogICAgICAgOiBudWxsOwogCi0gIHZvaWQgcHJvZmlsZShTdHJpbmcgdGl0bGUpID0+CisgIHZvaWQgdHJhY2UoT2JqZWN0PyBhcmcpID0+CisgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRyYWNlKCMpJywgYXJnKSA6IG51bGw7CisKKyAgdm9pZCB3YXJuKE9iamVjdD8gYXJnKSA9PgorICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS53YXJuKCMpJywgYXJnKSA6IG51bGw7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBhcmUgbm9uLXN0YW5kYXJkIG1ldGhvZHMuCisgIHZvaWQgcHJvZmlsZShbU3RyaW5nPyB0aXRsZV0pID0+CiAgICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnByb2ZpbGUoIyknLCB0aXRsZSkgOiBudWxsOwogCi0gIHZvaWQgcHJvZmlsZUVuZChTdHJpbmcgdGl0bGUpID0+IF9pc0NvbnNvbGVEZWZpbmVkCisgIHZvaWQgcHJvZmlsZUVuZChbU3RyaW5nPyB0aXRsZV0pID0+IF9pc0NvbnNvbGVEZWZpbmVkCiAgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnByb2ZpbGVFbmQoIyknLCB0aXRsZSkKICAgICAgIDogbnVsbDsKIAotICB2b2lkIHRhYmxlKE9iamVjdCBhcmcpID0+Ci0gICAgICBfaXNDb25zb2xlRGVmaW5lZCA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLnRhYmxlKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCB0aW1lKFN0cmluZyB0aXRsZSkgPT4KLSAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGltZSgjKScsIHRpdGxlKSA6IG51bGw7Ci0KLSAgdm9pZCB0aW1lRW5kKFN0cmluZyB0aXRsZSkgPT4KLSAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGltZUVuZCgjKScsIHRpdGxlKSA6IG51bGw7Ci0KLSAgdm9pZCB0aW1lU3RhbXAoT2JqZWN0IGFyZykgPT4KKyAgdm9pZCB0aW1lU3RhbXAoW09iamVjdD8gYXJnXSkgPT4KICAgICAgIF9pc0NvbnNvbGVEZWZpbmVkID8gSlMoJ3ZvaWQnLCAnd2luZG93LmNvbnNvbGUudGltZVN0YW1wKCMpJywgYXJnKSA6IG51bGw7CiAKLSAgdm9pZCB0cmFjZShPYmplY3QgYXJnKSA9PgotICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS50cmFjZSgjKScsIGFyZykgOiBudWxsOwotCi0gIHZvaWQgd2FybihPYmplY3QgYXJnKSA9PgotICAgICAgX2lzQ29uc29sZURlZmluZWQgPyBKUygndm9pZCcsICd3aW5kb3cuY29uc29sZS53YXJuKCMpJywgYXJnKSA6IG51bGw7CisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yCisgIC8vIG9sZGVyIFNhZmFyaSBicm93c2Vycy4KKyAgdm9pZCBtYXJrVGltZWxpbmUoT2JqZWN0PyBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkCisgICAgICA/IEpTKCd2b2lkJywgJ3dpbmRvdy5jb25zb2xlLm1hcmtUaW1lbGluZSgjKScsIGFyZykKKyAgICAgIDogbnVsbDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RvbS90ZW1wbGF0ZXMvaHRtbC9kYXJ0MmpzL2ltcGxfQ29uc29sZS5kYXJ0dGVtcGxhdGUgYi90b29scy9kb20vdGVtcGxhdGVzL2h0bWwvZGFydDJqcy9pbXBsX0NvbnNvbGUuZGFydHRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBhZDJkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2RvbS90ZW1wbGF0ZXMvaHRtbC9kYXJ0MmpzL2ltcGxfQ29uc29sZS5kYXJ0dGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQotLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKLS8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLXBhcnQgb2YgJExJQlJBUllOQU1FOwotCi0kKEFOTk9UQVRJT05TKSQoQ0xBU1NfTU9ESUZJRVJTKWNsYXNzIENvbnNvbGUgewotCi0gIGNvbnN0IENvbnNvbGUuX3NhZmUoKTsKLQotICBzdGF0aWMgY29uc3QgQ29uc29sZSBfc2FmZUNvbnNvbGUgPSBjb25zdCBDb25zb2xlLl9zYWZlKCk7Ci0KLSAgYm9vbCBnZXQgX2lzQ29uc29sZURlZmluZWQgPT4gSlMoJ2Jvb2wnLCAndHlwZW9mIGNvbnNvbGUgIT0gInVuZGVmaW5lZCInKTsKLQotICBNZW1vcnlJbmZvIGdldCBtZW1vcnkgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ01lbW9yeUluZm8nLCAnY29uc29sZS5tZW1vcnknKSA6IG51bGw7Ci0KLSAgdm9pZCBhc3NlcnRDb25kaXRpb24oYm9vbCBjb25kaXRpb24sIE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuYXNzZXJ0Q29uZGl0aW9uKCMsICMpJywgY29uZGl0aW9uLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIGNsZWFyKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuY2xlYXIoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIGNvdW50KE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuY291bnQoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIGRlYnVnKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuZGVidWcoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIGRpcihPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLmRpcigjKScsIGFyZykgOiBudWxsOwotCi0gIHZvaWQgZGlyeG1sKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuZGlyeG1sKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCBlcnJvcihPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLmVycm9yKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCBncm91cChPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLmdyb3VwKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCBncm91cENvbGxhcHNlZChPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLmdyb3VwQ29sbGFwc2VkKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCBncm91cEVuZCgpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUuZ3JvdXBFbmQoKScpIDogbnVsbDsKLQotICB2b2lkIGluZm8oT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ3ZvaWQnLCAnY29uc29sZS5pbmZvKCMpJywgYXJnKSA6IG51bGw7Ci0KLSAgdm9pZCBsb2coT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ3ZvaWQnLCAnY29uc29sZS5sb2coIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIG1hcmtUaW1lbGluZShPYmplY3QgYXJnKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLm1hcmtUaW1lbGluZSgjKScsIGFyZykgOiBudWxsOwotCi0gIHZvaWQgcHJvZmlsZShTdHJpbmcgdGl0bGUpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUucHJvZmlsZSgjKScsIHRpdGxlKSA6IG51bGw7Ci0KLSAgdm9pZCBwcm9maWxlRW5kKFN0cmluZyB0aXRsZSkgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ3ZvaWQnLCAnY29uc29sZS5wcm9maWxlRW5kKCMpJywgdGl0bGUpIDogbnVsbDsKLQotICB2b2lkIHRhYmxlKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUudGFibGUoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIHRpbWUoU3RyaW5nIHRpdGxlKSA9PiBfaXNDb25zb2xlRGVmaW5lZCA/Ci0gICAgICBKUygndm9pZCcsICdjb25zb2xlLnRpbWUoIyknLCB0aXRsZSkgOiBudWxsOwotCi0gIHZvaWQgdGltZUVuZChTdHJpbmcgdGl0bGUpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUudGltZUVuZCgjKScsIHRpdGxlKSA6IG51bGw7Ci0KLSAgdm9pZCB0aW1lU3RhbXAoT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ3ZvaWQnLCAnY29uc29sZS50aW1lU3RhbXAoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIHRyYWNlKE9iamVjdCBhcmcpID0+IF9pc0NvbnNvbGVEZWZpbmVkID8KLSAgICAgIEpTKCd2b2lkJywgJ2NvbnNvbGUudHJhY2UoIyknLCBhcmcpIDogbnVsbDsKLQotICB2b2lkIHdhcm4oT2JqZWN0IGFyZykgPT4gX2lzQ29uc29sZURlZmluZWQgPwotICAgICAgSlMoJ3ZvaWQnLCAnY29uc29sZS53YXJuKCMpJywgYXJnKSA6IG51bGw7Ci0kIU1FTUJFUlMKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2V4cGVyaW1lbnRhbF9mZWF0dXJlcy55YW1sIGIvdG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwKaW5kZXggMWE2MGY3NS4uYTY4MDY2MiAxMDA2NDQKLS0tIGEvdG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwKKysrIGIvdG9vbHMvZXhwZXJpbWVudGFsX2ZlYXR1cmVzLnlhbWwKQEAgLTk1LDEzICs5NSwxMyBAQAogICAgIGhlbHA6ICJUcmlwbGUtc2hpZnQgb3BlcmF0b3IiCiAKICAgdmFyaWFuY2U6Ci0gICAgaGVscDogIlNvdW5kIHZhcmlhbmNlLiIKKyAgICBoZWxwOiAiU291bmQgdmFyaWFuY2UiCiAKICAgbm9uZnVuY3Rpb24tdHlwZS1hbGlhc2VzOgotICAgIGhlbHA6ICJUeXBlIGFsaWFzZXMgZGVmaW5lIGEgPHR5cGU+LCBub3QganVzdCBhIDxmdW5jdGlvblR5cGU+LiIKKyAgICBoZWxwOiAiVHlwZSBhbGlhc2VzIGRlZmluZSBhIDx0eXBlPiwgbm90IGp1c3QgYSA8ZnVuY3Rpb25UeXBlPiIKIAogICBhbHRlcm5hdGl2ZS1pbnZhbGlkYXRpb24tc3RyYXRlZ3k6Ci0gICAgaGVscDogIkFsdGVybmF0aXZlIGludmFsaWRhdGlvbiBzdHJhdGVneSBmb3IgaW5jcmVtZW50YWwgY29tcGlsYXRpb24uIgorICAgIGhlbHA6ICJBbHRlcm5hdGl2ZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kgZm9yIGluY3JlbWVudGFsIGNvbXBpbGF0aW9uIgogICAgIGNhdGVnb3J5OiAiQ0ZFIgogCiAjCmRpZmYgLS1naXQgYS90b29scy9nbi5weSBiL3Rvb2xzL2duLnB5CmluZGV4IDgzMGM4YjMuLjRiZDI5YjQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2duLnB5CisrKyBiL3Rvb2xzL2duLnB5CkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICByZXR1cm4gVHJ1ZQogCiAKLWRlZiBUb0duQXJncyhhcmdzLCBtb2RlLCBhcmNoLCB0YXJnZXRfb3MsIHNhbml0aXplcik6CitkZWYgVG9HbkFyZ3MoYXJncywgbW9kZSwgYXJjaCwgdGFyZ2V0X29zLCBzYW5pdGl6ZXIsIHZlcmlmeV9zZGtfaGFzaCk6CiAgICAgZ25fYXJncyA9IHt9CiAKICAgICBob3N0X29zID0gSG9zdE9zRm9yR24oSE9TVF9PUykKQEAgLTI1OCw2ICsyNTgsOCBAQAogICAgICAgICBnbl9hcmdzWydkYXJ0X2RlYnVnX29wdGltaXphdGlvbl9sZXZlbCddID0gYXJncy5kZWJ1Z19vcHRfbGV2ZWwKICAgICAgICAgZ25fYXJnc1snZGVidWdfb3B0aW1pemF0aW9uX2xldmVsJ10gPSBhcmdzLmRlYnVnX29wdF9sZXZlbAogCisgICAgZ25fYXJnc1sndmVyaWZ5X3Nka19oYXNoJ10gPSB2ZXJpZnlfc2RrX2hhc2gKKwogICAgIHJldHVybiBnbl9hcmdzCiAKIApAQCAtNDY2LDYgKzQ2OCwxMCBAQAogICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICBkZXN0PSd1c2VfcWVtdScsCiAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgb3RoZXJfZ3JvdXAuYWRkX2FyZ3VtZW50KCctLW5vLXZlcmlmeS1zZGstaGFzaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0Rpc2FibGUgU0RLIGhhc2ggY2hlY2tzLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAKICAgICBvcHRpb25zID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKICAgICBpZiBub3QgUHJvY2Vzc09wdGlvbnMob3B0aW9ucyk6CkBAIC01MDYsNyArNTEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgIyBTZWUgZGFydGJ1Zy5jb20vMzIzNjQKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IFtnbiwgJ2dlbicsIG91dF9kaXJdCiAgICAgICAgICAgICAgICAgICAgIGduX2FyZ3MgPSBUb0NvbW1hbmRMaW5lKAotICAgICAgICAgICAgICAgICAgICAgICAgVG9HbkFyZ3MoYXJncywgbW9kZSwgYXJjaCwgdGFyZ2V0X29zLCBzYW5pdGl6ZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgVG9HbkFyZ3MoYXJncywgbW9kZSwgYXJjaCwgdGFyZ2V0X29zLCBzYW5pdGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYXJncy5ub192ZXJpZnlfc2RrX2hhc2gpKQogICAgICAgICAgICAgICAgICAgICBnbl9hcmdzICs9IEdldEdOQXJncyhhcmdzKQogICAgICAgICAgICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiZ24gZ2VuIC0tY2hlY2sgaW4gJXMiICUgb3V0X2RpcikKZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2VfdmVyc2lvbi5weSBiL3Rvb2xzL21ha2VfdmVyc2lvbi5weQppbmRleCBlYjAxZDM1Li5mODM1NmY4IDEwMDc1NQotLS0gYS90b29scy9tYWtlX3ZlcnNpb24ucHkKKysrIGIvdG9vbHMvbWFrZV92ZXJzaW9uLnB5CkBAIC03LDE5ICs3LDEzIEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgaGFzaGxpYgogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiBpbXBvcnQgdXRpbHMKIAotCi1kZWYgZGVidWdMb2cobWVzc2FnZSk6Ci0gICAgcHJpbnQobWVzc2FnZSwgZmlsZT1zeXMuc3RkZXJyKQotICAgIHN5cy5zdGRlcnIuZmx1c2goKQotCi0KICMgV2hlbiB0aGVzZSBmaWxlcyBjaGFuZ2UsIHNuYXBzaG90cyBjcmVhdGVkIGJ5IHRoZSBWTSBhcmUgcG90ZW50aWFsbHkgbm8gbG9uZ2VyCiAjIGJhY2t3YXJkcy1jb21wYXRpYmxlLgogVk1fU05BUFNIT1RfRklMRVMgPSBbCkBAIC00NSwxNDEgKzM5LDE1MiBAQAogXQogCiAKLWRlZiBNYWtlVmVyc2lvblN0cmluZyhxdWlldCwgbm9fZ2l0X2hhc2gsIGN1c3RvbV9mb3JfcHViPU5vbmUpOgotICAgIGNoYW5uZWwgPSB1dGlscy5HZXRDaGFubmVsKCkKLQotICAgIGlmIGN1c3RvbV9mb3JfcHViIGFuZCBjaGFubmVsID09ICdiZSc6Ci0gICAgICAgIGxhdGVzdCA9IHV0aWxzLkdldExhdGVzdERldlRhZygpCi0gICAgICAgIGlmIG5vdCBsYXRlc3Q6Ci0gICAgICAgICAgICAjIElmIGdyYWJiaW5nIHRoZSBkZXYgdGFnIGZhaWxzLCB0aGVuIGZhbGwgYmFjayBvbiB0aGUgVkVSU0lPTiBmaWxlLgotICAgICAgICAgICAgbGF0ZXN0ID0gdXRpbHMuR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoPVRydWUpCi0gICAgICAgIGlmIG5vX2dpdF9oYXNoOgotICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSAoIiVzLiVzIiAlIChsYXRlc3QsIGN1c3RvbV9mb3JfcHViKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGdpdF9oYXNoID0gdXRpbHMuR2V0U2hvcnRHaXRIYXNoKCkKLSAgICAgICAgICAgIHZlcnNpb25fc3RyaW5nID0gKCIlcy4lcy0lcyIgJSAobGF0ZXN0LCBjdXN0b21fZm9yX3B1YiwgZ2l0X2hhc2gpKQotICAgIGVsc2U6Ci0gICAgICAgIHZlcnNpb25fc3RyaW5nID0gdXRpbHMuR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoPW5vX2dpdF9oYXNoKQotICAgIGlmIG5vdCBxdWlldDoKLSAgICAgICAgZGVidWdMb2coIlJldHVybmluZyB2ZXJzaW9uIHN0cmluZzogJXMgIiAlIHZlcnNpb25fc3RyaW5nKQotICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZwotCi0KIGRlZiBNYWtlU25hcHNob3RIYXNoU3RyaW5nKCk6CiAgICAgdm1oYXNoID0gaGFzaGxpYi5tZDUoKQogICAgIGZvciB2bWZpbGVuYW1lIGluIFZNX1NOQVBTSE9UX0ZJTEVTOgogICAgICAgICB2bWZpbGVwYXRoID0gb3MucGF0aC5qb2luKHV0aWxzLkRBUlRfRElSLCAncnVudGltZScsICd2bScsIHZtZmlsZW5hbWUpCi0gICAgICAgIHdpdGggb3Blbih2bWZpbGVwYXRoKSBhcyB2bWZpbGU6Ci0gICAgICAgICAgICB2bWhhc2gudXBkYXRlKHZtZmlsZS5yZWFkKCkuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICB3aXRoIG9wZW4odm1maWxlcGF0aCwgJ3JiJykgYXMgdm1maWxlOgorICAgICAgICAgICAgdm1oYXNoLnVwZGF0ZSh2bWZpbGUucmVhZCgpKQogICAgIHJldHVybiB2bWhhc2guaGV4ZGlnZXN0KCkKIAogCi1kZWYgTWFrZUZpbGUocXVpZXQsCi0gICAgICAgICAgICAgb3V0cHV0X2ZpbGUsCi0gICAgICAgICAgICAgaW5wdXRfZmlsZSwKLSAgICAgICAgICAgICBub19naXRfaGFzaCwKLSAgICAgICAgICAgICBjdXN0b21fZm9yX3B1YiwKLSAgICAgICAgICAgICB2ZXJzaW9uX2ZpbGU9Tm9uZSk6Ci0gICAgaWYgdmVyc2lvbl9maWxlOgotICAgICAgICB2ZXJzaW9uX3N0cmluZyA9IHV0aWxzLkdldFZlcnNpb24obm9fZ2l0X2hhc2gsIHZlcnNpb25fZmlsZSkKLSAgICBlbHNlOgotICAgICAgICB2ZXJzaW9uX3N0cmluZyA9IE1ha2VWZXJzaW9uU3RyaW5nKHF1aWV0LCBub19naXRfaGFzaCwgY3VzdG9tX2Zvcl9wdWIpCitkZWYgR2V0U2VtYW50aWNWZXJzaW9uRm9ybWF0KG5vX2dpdF9oYXNoLCBjdXN0b21fZm9yX3B1Yik6CisgICAgdmVyc2lvbl9mb3JtYXQgPSAne3tTRU1BTlRJQ19TREtfVkVSU0lPTn19JwogCi0gICAgdmVyc2lvbl9jY190ZXh0ID0gb3BlbihpbnB1dF9maWxlKS5yZWFkKCkKLSAgICB2ZXJzaW9uX2NjX3RleHQgPSB2ZXJzaW9uX2NjX3RleHQucmVwbGFjZSgie3tWRVJTSU9OX1NUUn19IiwgdmVyc2lvbl9zdHJpbmcpCisgICAgaWYgY3VzdG9tX2Zvcl9wdWIgYW5kIHV0aWxzLkdldENoYW5uZWwoKSA9PSAnYmUnOgorICAgICAgICBpZiBub19naXRfaGFzaDoKKyAgICAgICAgICAgIHZlcnNpb25fZm9ybWF0ID0gJ3t7TEFURVNUfX0ue3tQVUJfQ1VTVE9NfX0nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2ZXJzaW9uX2Zvcm1hdCA9ICd7e0xBVEVTVH19Lnt7UFVCX0NVU1RPTX19LXt7R0lUX0hBU0h9fScKKworICAgIHJldHVybiB2ZXJzaW9uX2Zvcm1hdAorCisKK2RlZiBGb3JtYXRWZXJzaW9uU3RyaW5nKHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBub19naXRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbV9mb3JfcHViLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9maWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBnaXRfcmV2aXNpb25fZmlsZT1Ob25lKToKKyAgICB1c2VfZ2l0X2hhc2ggPSBub3Qgbm9fZ2l0X2hhc2gKKworICAgIHNlbWFudGljX3Nka192ZXJzaW9uID0gdXRpbHMuR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXRfcmV2aXNpb25fZmlsZSkKKyAgICBzZW1hbnRpY192ZXJzaW9uX2Zvcm1hdCA9IEdldFNlbWFudGljVmVyc2lvbkZvcm1hdChub19naXRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21fZm9yX3B1YikKKyAgICB2ZXJzaW9uX3N0ciA9IChzZW1hbnRpY19zZGtfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgIGlmIHZlcnNpb25fZmlsZSBlbHNlIHNlbWFudGljX3ZlcnNpb25fZm9ybWF0KQorCisgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgne3tWRVJTSU9OX1NUUn19JywgdmVyc2lvbl9zdHIpCisKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCd7e1NFTUFOVElDX1NES19WRVJTSU9OfX0nLCBzZW1hbnRpY19zZGtfdmVyc2lvbikKKworICAgIGlmIGN1c3RvbV9mb3JfcHViOgorICAgICAgICAjIExBVEVTVCBpcyBvbmx5IHVzZWQgZm9yIGN1c3RvbV9mb3JfcHViLgorICAgICAgICBsYXRlc3QgPSBOb25lCisgICAgICAgIGlmIHVzZV9naXRfaGFzaDoKKyAgICAgICAgICAgICMgSWYgZ3JhYmJpbmcgdGhlIGRldiB0YWcgZmFpbHMsIHRoZW4gZmFsbCBiYWNrIG9uIHRoZSBkZWZhdWx0IFZFUlNJT04gZmlsZS4KKyAgICAgICAgICAgIGxhdGVzdCA9IHV0aWxzLkdldExhdGVzdERldlRhZygpCisgICAgICAgIGlmIG5vdCBsYXRlc3Q6CisgICAgICAgICAgICBsYXRlc3QgPSB1dGlscy5HZXRTZW1hbnRpY1NES1ZlcnNpb24obm9fZ2l0X2hhc2g9VHJ1ZSkKKyAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgne3tMQVRFU1R9fScsIGxhdGVzdCkKKworICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCd7e1BVQl9DVVNUT019fScsIGN1c3RvbV9mb3JfcHViKQorCisgICAgZ2l0X2hhc2ggPSBOb25lCisgICAgaWYgdXNlX2dpdF9oYXNoOgorICAgICAgICBnaXRfaGFzaCA9IHV0aWxzLkdldFNob3J0R2l0SGFzaCgpCisgICAgaWYgZ2l0X2hhc2ggaXMgTm9uZSBvciBsZW4oZ2l0X2hhc2gpICE9IDEwOgorICAgICAgICBnaXRfaGFzaCA9ICcwMDAwMDAwMDAwJworICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJ3t7R0lUX0hBU0h9fScsIGdpdF9oYXNoKQorCiAgICAgY2hhbm5lbCA9IHV0aWxzLkdldENoYW5uZWwoKQotICAgIHZlcnNpb25fY2NfdGV4dCA9IHZlcnNpb25fY2NfdGV4dC5yZXBsYWNlKCJ7e0NIQU5ORUx9fSIsIGNoYW5uZWwpCi0gICAgdmVyc2lvbl90aW1lID0gdXRpbHMuR2V0R2l0VGltZXN0YW1wKCkKLSAgICBpZiBub19naXRfaGFzaCBvciB2ZXJzaW9uX3RpbWUgPT0gTm9uZToKLSAgICAgICAgdmVyc2lvbl90aW1lID0gIlVua25vd24gdGltZXN0YW1wIgotICAgIHZlcnNpb25fY2NfdGV4dCA9IHZlcnNpb25fY2NfdGV4dC5yZXBsYWNlKCJ7e0NPTU1JVF9USU1FfX0iLCB2ZXJzaW9uX3RpbWUuZGVjb2RlKCJ1dGYtOCIpKQorICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJ3t7Q0hBTk5FTH19JywgY2hhbm5lbCkKKworICAgIHZlcnNpb25fdGltZSA9IE5vbmUKKyAgICBpZiB1c2VfZ2l0X2hhc2g6CisgICAgICAgIHZlcnNpb25fdGltZSA9IHV0aWxzLkdldEdpdFRpbWVzdGFtcCgpCisgICAgaWYgdmVyc2lvbl90aW1lID09IE5vbmU6CisgICAgICAgIHZlcnNpb25fdGltZSA9ICdVbmtub3duIHRpbWVzdGFtcCcKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCd7e0NPTU1JVF9USU1FfX0nLCB2ZXJzaW9uX3RpbWUuZGVjb2RlKCd1dGYtOCcpKQorCiAgICAgYWJpX3ZlcnNpb24gPSB1dGlscy5HZXRBYmlWZXJzaW9uKHZlcnNpb25fZmlsZSkKLSAgICB2ZXJzaW9uX2NjX3RleHQgPSB2ZXJzaW9uX2NjX3RleHQucmVwbGFjZSgie3tBQklfVkVSU0lPTn19IiwgYWJpX3ZlcnNpb24pCisgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgne3tBQklfVkVSU0lPTn19JywgYWJpX3ZlcnNpb24pCisKICAgICBvbGRlc3Rfc3VwcG9ydGVkX2FiaV92ZXJzaW9uID0gdXRpbHMuR2V0T2xkZXN0U3VwcG9ydGVkQWJpVmVyc2lvbigKICAgICAgICAgdmVyc2lvbl9maWxlKQotICAgIHZlcnNpb25fY2NfdGV4dCA9IHZlcnNpb25fY2NfdGV4dC5yZXBsYWNlKAotICAgICAgICAie3tPTERFU1RfU1VQUE9SVEVEX0FCSV9WRVJTSU9OfX0iLCBvbGRlc3Rfc3VwcG9ydGVkX2FiaV92ZXJzaW9uKQorICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJ3t7T0xERVNUX1NVUFBPUlRFRF9BQklfVkVSU0lPTn19JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZGVzdF9zdXBwb3J0ZWRfYWJpX3ZlcnNpb24pCisKICAgICBzbmFwc2hvdF9oYXNoID0gTWFrZVNuYXBzaG90SGFzaFN0cmluZygpCi0gICAgdmVyc2lvbl9jY190ZXh0ID0gdmVyc2lvbl9jY190ZXh0LnJlcGxhY2UoInt7U05BUFNIT1RfSEFTSH19IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdF9oYXNoKQotICAgIG9wZW4ob3V0cHV0X2ZpbGUsICd3Jykud3JpdGUodmVyc2lvbl9jY190ZXh0KQotICAgIHJldHVybiBUcnVlCisgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgne3tTTkFQU0hPVF9IQVNIfX0nLCBzbmFwc2hvdF9oYXNoKQorCisgICAgcmV0dXJuIHZlcnNpb24KIAogCi1kZWYgbWFpbihhcmdzKToKK2RlZiBtYWluKCk6CiAgICAgdHJ5OgogICAgICAgICAjIFBhcnNlIGlucHV0LgotICAgICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigKLSAgICAgICAgICAgICItLWN1c3RvbV9mb3JfcHViIiwKLSAgICAgICAgICAgIGFjdGlvbj0ic3RvcmUiLAotICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwKLSAgICAgICAgICAgIGhlbHA9KCJHZW5lcmF0ZXMgYSB2ZXJzaW9uIHN0cmluZyB0aGF0IHdvcmtzIHdpdGggcHViIHRoYXQgaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgICAidGhlIGdpdmVuIHN0cmluZy4gVGhpcyBpcyBzaWxlbnRseSBpZ25vcmVkIG9uIGNoYW5uZWxzIG90aGVyIgotICAgICAgICAgICAgICAgICAgInRoYW4gYmUiKSkKLSAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oCi0gICAgICAgICAgICAiLS1pbnB1dCIsCi0gICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKLSAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCi0gICAgICAgICAgICBoZWxwPSJpbnB1dCB0ZW1wbGF0ZSBmaWxlLiIpCi0gICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKAotICAgICAgICAgICAgIi0tbm9fZ2l0X2hhc2giLAotICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgJy0tY3VzdG9tX2Zvcl9wdWInLAorICAgICAgICAgICAgaGVscD0oJ0dlbmVyYXRlcyBhIHZlcnNpb24gc3RyaW5nIHRoYXQgd29ya3Mgd2l0aCBwdWIgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnaW5jbHVkZXMgdGhlIGdpdmVuIHN0cmluZy4gVGhpcyBpcyBzaWxlbnRseSBpZ25vcmVkIG9uICcKKyAgICAgICAgICAgICAgICAgICdjaGFubmVscyBvdGhlciB0aGFuIGJlLicpKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWlucHV0JywgaGVscD0nSW5wdXQgdGVtcGxhdGUgZmlsZS4nKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgJy0tbm9fZ2l0X2hhc2gnLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCi0gICAgICAgICAgICBoZWxwPSJEb24ndCB0cnkgdG8gZGV0ZXJtaW5lIHN2biByZXZpc2lvbiIpCi0gICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKAotICAgICAgICAgICAgIi0tb3V0cHV0IiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0cmluZyIsIGhlbHA9Im91dHB1dCBmaWxlIG5hbWUiKQotICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigKLSAgICAgICAgICAgICItcSIsCi0gICAgICAgICAgICAiLS1xdWlldCIsCi0gICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAotICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgIGhlbHA9ImRpc2FibGUgY29uc29sZSBvdXRwdXQiKQotICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigKLSAgICAgICAgICAgICItLXZlcnNpb24tZmlsZSIsCi0gICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKLSAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCi0gICAgICAgICAgICBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICBoZWxwPSJWZXJzaW9uIGZpbGUiKQorICAgICAgICAgICAgaGVscD0oJ0RvblwndCB0cnkgdG8gY2FsbCBnaXQgdG8gZGVyaXZlIHRoaW5ncyBsaWtlICcKKyAgICAgICAgICAgICAgICAgICdnaXQgcmV2aXNpb24gaGFzaC4nKSkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCBoZWxwPSdvdXRwdXQgZmlsZSBuYW1lJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXF1aWV0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nREVQUkVDQVRFRDogRG9lcyBub3RoaW5nIScpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyc2lvbi1maWxlJywgaGVscD0nUGF0aCB0byB0aGUgVkVSU0lPTiBmaWxlLicpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZ2l0LXJldmlzaW9uLWZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gdGhlIEdJVF9SRVZJU0lPTiBmaWxlLicpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICAgICAnLS1mb3JtYXQnLAorICAgICAgICAgICAgZGVmYXVsdD0ne3tWRVJTSU9OX1NUUn19JywKKyAgICAgICAgICAgIGhlbHA9J1ZlcnNpb24gZm9ybWF0IHVzZWQgaWYgbm8gaW5wdXQgdGVtcGxhdGUgaXMgZ2l2ZW4uJykKIAotICAgICAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBpbnB1dCB0ZW1wbGF0ZSwgdGhlbiB3cml0ZSB0aGUgYmFyZSB2ZXJzaW9uIHN0cmluZyB0bwotICAgICAgICAjIG9wdGlvbnMub3V0cHV0LiBJZiB0aGVyZSBpcyBubyBvcHRpb25zLm91dHB1dCwgdGhlbiB3cml0ZSB0aGUgdmVyc2lvbgorICAgICAgICAjIGFyZ3Mub3V0cHV0LiBJZiB0aGVyZSBpcyBubyBhcmdzLm91dHB1dCwgdGhlbiB3cml0ZSB0aGUgdmVyc2lvbgogICAgICAgICAjIHN0cmluZyB0byBzdGRvdXQuCi0gICAgICAgIGlmIG5vdCBvcHRpb25zLmlucHV0OgotICAgICAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBNYWtlVmVyc2lvblN0cmluZygKLSAgICAgICAgICAgICAgICBvcHRpb25zLnF1aWV0LCBvcHRpb25zLm5vX2dpdF9oYXNoLCBvcHRpb25zLmN1c3RvbV9mb3JfcHViKQotICAgICAgICAgICAgaWYgb3B0aW9ucy5vdXRwdXQ6Ci0gICAgICAgICAgICAgICAgb3BlbihvcHRpb25zLm91dHB1dCwgJ3cnKS53cml0ZSh2ZXJzaW9uX3N0cmluZykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQodmVyc2lvbl9zdHJpbmcpCi0gICAgICAgICAgICByZXR1cm4gMAogCi0gICAgICAgIGlmIG5vdCBvcHRpb25zLm91dHB1dDoKLSAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJy0tb3V0cHV0IG5vdCBzcGVjaWZpZWRcbicpCi0gICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgaWYgbm90IG9wdGlvbnMuaW5wdXQ6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCctLWlucHV0IG5vdCBzcGVjaWZpZWRcbicpCi0gICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgdmVyc2lvbl90ZW1wbGF0ZSA9ICcnCisgICAgICAgIGlmIGFyZ3MuaW5wdXQ6CisgICAgICAgICAgICB2ZXJzaW9uX3RlbXBsYXRlID0gb3BlbihhcmdzLmlucHV0KS5yZWFkKCkKKyAgICAgICAgZWxpZiBub3QgYXJncy5mb3JtYXQgaXMgTm9uZToKKyAgICAgICAgICAgIHZlcnNpb25fdGVtcGxhdGUgPSBhcmdzLmZvcm1hdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgJ05vIHZlcnNpb24gdGVtcGxhdGUgZ2l2ZW4hIFNldCBlaXRoZXIgLS1pbnB1dCBvciAtLWZvcm1hdC4nCiAKLSAgICAgICAgZmlsZXMgPSBbXQotICAgICAgICBmb3IgYXJnIGluIGFyZ3M6Ci0gICAgICAgICAgICBmaWxlcy5hcHBlbmQoYXJnKQorICAgICAgICB2ZXJzaW9uID0gRm9ybWF0VmVyc2lvblN0cmluZyh2ZXJzaW9uX3RlbXBsYXRlLCBhcmdzLm5vX2dpdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmN1c3RvbV9mb3JfcHViLCBhcmdzLnZlcnNpb25fZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5naXRfcmV2aXNpb25fZmlsZSkKIAotICAgICAgICBpZiBub3QgTWFrZUZpbGUob3B0aW9ucy5xdWlldCwgb3B0aW9ucy5vdXRwdXQsIG9wdGlvbnMuaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vX2dpdF9oYXNoLCBvcHRpb25zLmN1c3RvbV9mb3JfcHViLAotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy52ZXJzaW9uX2ZpbGUpOgotICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIGFyZ3Mub3V0cHV0OgorICAgICAgICAgICAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGZoOgorICAgICAgICAgICAgICAgIGZoLndyaXRlKHZlcnNpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHZlcnNpb24pCiAKICAgICAgICAgcmV0dXJuIDAKKwogICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgaW5zdDoKICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnbWFrZV92ZXJzaW9uLnB5IGV4Y2VwdGlvblxuJykKICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIoaW5zdCkpCiAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKKwogICAgICAgICByZXR1cm4gLTEKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGV4aXRfY29kZSA9IG1haW4oc3lzLmFyZ3YpCi0gICAgc3lzLmV4aXQoZXhpdF9jb2RlKQorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BhdGNoZXMvZmx1dHRlci1lbmdpbmUvZTdlNDU1OTljYjFhNzRmZjg4ZDdkMDBhMzNmMjUwMjllNDJkZjc1Ny5wYXRjaCBiL3Rvb2xzL3BhdGNoZXMvZmx1dHRlci1lbmdpbmUvZTdlNDU1OTljYjFhNzRmZjg4ZDdkMDBhMzNmMjUwMjllNDJkZjc1Ny5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMWIzMS4uMDAwMDAwMAotLS0gYS90b29scy9wYXRjaGVzL2ZsdXR0ZXItZW5naW5lL2U3ZTQ1NTk5Y2IxYTc0ZmY4OGQ3ZDAwYTMzZjI1MDI5ZTQyZGY3NTcucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdG9uaWMvZGFydF9wZXJzaXN0ZW50X3ZhbHVlLmNjIGIvdGhpcmRfcGFydHkvdG9uaWMvZGFydF9wZXJzaXN0ZW50X3ZhbHVlLmNjCi1pbmRleCA5ZWQ2ZjcwZjM1MzIuLjNiYzQ2NTA1ZDMxZiAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L3RvbmljL2RhcnRfcGVyc2lzdGVudF92YWx1ZS5jYwotKysrIGIvdGhpcmRfcGFydHkvdG9uaWMvZGFydF9wZXJzaXN0ZW50X3ZhbHVlLmNjCi1AQCAtNDMsOCArNDMsMTIgQEAgdm9pZCBEYXJ0UGVyc2lzdGVudFZhbHVlOjpDbGVhcigpIHsKLSAgICAgcmV0dXJuOwotICAgfQotIAotLSAgRGFydElzb2xhdGVTY29wZSBzY29wZShkYXJ0X3N0YXRlLT5pc29sYXRlKCkpOwotLSAgRGFydF9EZWxldGVQZXJzaXN0ZW50SGFuZGxlKHZhbHVlXyk7Ci0rICBpZiAoRGFydF9DdXJyZW50SXNvbGF0ZUdyb3VwKCkpIHsKLSsgICAgRGFydF9EZWxldGVQZXJzaXN0ZW50SGFuZGxlKHZhbHVlXyk7Ci0rICB9IGVsc2UgewotKyAgICBEYXJ0SXNvbGF0ZVNjb3BlIHNjb3BlKGRhcnRfc3RhdGUtPmlzb2xhdGUoKSk7Ci0rICAgIERhcnRfRGVsZXRlUGVyc2lzdGVudEhhbmRsZSh2YWx1ZV8pOwotKyAgfQotICAgZGFydF9zdGF0ZV8ucmVzZXQoKTsKLSAgIHZhbHVlXyA9IG51bGxwdHI7Ci0gfQotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3RvbmljL2RhcnRfd3JhcHBhYmxlLmNjIGIvdGhpcmRfcGFydHkvdG9uaWMvZGFydF93cmFwcGFibGUuY2MKLWluZGV4IDQyYzhmZmYyODA1Yi4uODkwNjRhYzhlZWY3IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvdG9uaWMvZGFydF93cmFwcGFibGUuY2MKLSsrKyBiL3RoaXJkX3BhcnR5L3RvbmljL2RhcnRfd3JhcHBhYmxlLmNjCi1AQCAtMzcsNyArMzcsNyBAQCB2b2lkIERhcnRXcmFwcGFibGU6OkNsZWFyRGFydFdyYXBwZXIoKSB7Ci0gICBUT05JQ19DSEVDSyghTG9nSWZFcnJvcihEYXJ0X1NldE5hdGl2ZUluc3RhbmNlRmllbGQod3JhcHBlciwga1BlZXJJbmRleCwgMCkpKTsKLSAgIFRPTklDX0NIRUNLKAotICAgICAgICFMb2dJZkVycm9yKERhcnRfU2V0TmF0aXZlSW5zdGFuY2VGaWVsZCh3cmFwcGVyLCBrV3JhcHBlckluZm9JbmRleCwgMCkpKTsKLS0gIERhcnRfRGVsZXRlV2Vha1BlcnNpc3RlbnRIYW5kbGUoRGFydF9DdXJyZW50SXNvbGF0ZSgpLCBkYXJ0X3dyYXBwZXJfKTsKLSsgIERhcnRfRGVsZXRlV2Vha1BlcnNpc3RlbnRIYW5kbGUoZGFydF93cmFwcGVyXyk7Ci0gICBkYXJ0X3dyYXBwZXJfID0gbnVsbHB0cjsKLSAgIHRoaXMtPlJlbGVhc2VEYXJ0V3JhcHBhYmxlUmVmZXJlbmNlKCk7Ci0gfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3BlY19wYXJzZXIvRGFydC5nIGIvdG9vbHMvc3BlY19wYXJzZXIvRGFydC5nCmluZGV4IDJlZTJhNzAuLjAzOWU2NWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NwZWNfcGFyc2VyL0RhcnQuZworKysgYi90b29scy9zcGVjX3BhcnNlci9EYXJ0LmcKQEAgLTE0NiwxNyArMTQ2LDE0IEBACiAgICAgfCAgICBFWFRFUk5BTCBmdW5jdGlvblNpZ25hdHVyZSAnOycKICAgICB8ICAgIEVYVEVSTkFMIGdldHRlclNpZ25hdHVyZSAnOycKICAgICB8ICAgIEVYVEVSTkFMIHNldHRlclNpZ25hdHVyZSAnOycKKyAgICB8ICAgIEVYVEVSTkFMIGZpbmFsVmFyT3JUeXBlIGlkZW50aWZpZXJMaXN0ICc7JwogICAgIHwgICAgZ2V0dGVyU2lnbmF0dXJlIGZ1bmN0aW9uQm9keQogICAgIHwgICAgc2V0dGVyU2lnbmF0dXJlIGZ1bmN0aW9uQm9keQogICAgIHwgICAgZnVuY3Rpb25TaWduYXR1cmUgZnVuY3Rpb25Cb2R5CiAgICAgfCAgICAoRklOQUwgfCBDT05TVCkgdHlwZT8gc3RhdGljRmluYWxEZWNsYXJhdGlvbkxpc3QgJzsnCiAgICAgfCAgICBMQVRFIEZJTkFMIHR5cGU/IGluaXRpYWxpemVkSWRlbnRpZmllckxpc3QgJzsnCi0gICAgfCAgICB0b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24gJzsnCi0gICAgOwotCi10b3BMZXZlbFZhcmlhYmxlRGVjbGFyYXRpb24KLSAgICA6ICAgIExBVEU/IHZhck9yVHlwZSBpZGVudGlmaWVyICgnPScgZXhwcmVzc2lvbik/Ci0gICAgICAgICAoJywnIGluaXRpYWxpemVkSWRlbnRpZmllcikqCisgICAgfCAgICBMQVRFPyB2YXJPclR5cGUgaWRlbnRpZmllciAoJz0nIGV4cHJlc3Npb24pPworICAgICAgICAgKCcsJyBpbml0aWFsaXplZElkZW50aWZpZXIpKiAnOycKICAgICA7CiAKIGRlY2xhcmVkSWRlbnRpZmllcgpAQCAtMTY5LDYgKzE2NiwxMSBAQAogICAgIHwgICAgTEFURT8gdmFyT3JUeXBlCiAgICAgOwogCitmaW5hbFZhck9yVHlwZQorICAgIDogICAgRklOQUwgdHlwZT8KKyAgICB8ICAgIHZhck9yVHlwZQorICAgIDsKKwogdmFyT3JUeXBlCiAgICAgOiAgICBWQVIKICAgICB8ICAgIHR5cGUKQEAgLTM1MSw2ICszNTMsOCBAQAogICAgIHwgICAgKEVYVEVSTkFMIFNUQVRJQz8pPyBnZXR0ZXJTaWduYXR1cmUKICAgICB8ICAgIChFWFRFUk5BTCBTVEFUSUM/KT8gc2V0dGVyU2lnbmF0dXJlCiAgICAgfCAgICAoRVhURVJOQUwgU1RBVElDPyk/IGZ1bmN0aW9uU2lnbmF0dXJlCisgICAgfCAgICBFWFRFUk5BTCAoU1RBVElDPyBmaW5hbFZhck9yVHlwZSB8IENPVkFSSUFOVCB2YXJPclR5cGUpIGlkZW50aWZpZXJMaXN0CisgICAgfCAgICBBQlNUUkFDVCAoZmluYWxWYXJPclR5cGUgfCBDT1ZBUklBTlQgdmFyT3JUeXBlKSBpZGVudGlmaWVyTGlzdAogICAgIHwgICAgRVhURVJOQUw/IG9wZXJhdG9yU2lnbmF0dXJlCiAgICAgfCAgICBTVEFUSUMgKEZJTkFMIHwgQ09OU1QpIHR5cGU/IHN0YXRpY0ZpbmFsRGVjbGFyYXRpb25MaXN0CiAgICAgfCAgICBTVEFUSUMgTEFURSBGSU5BTCB0eXBlPyBpbml0aWFsaXplZElkZW50aWZpZXJMaXN0CmRpZmYgLS1naXQgYS90b29scy91dGlscy5weSBiL3Rvb2xzL3V0aWxzLnB5CmluZGV4IDFiNTQzZTNjLi40MmE3ZGI0IDEwMDY0NAotLS0gYS90b29scy91dGlscy5weQorKysgYi90b29scy91dGlscy5weQpAQCAtNSw2ICs1LDggQEAKICMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2V0IG9mIHV0aWxpdGllcyBmdW5jdGlvbnMgdXNlZCBieSBvdGhlciBQeXRob24tYmFzZWQKICMgc2NyaXB0cy4KIAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCiBpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQgZ2xvYgpAQCAtMjYsMTkgKzI4LDg3IEBACiBleGNlcHQ6CiAgICAgcGFzcwogCi1EQVJUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihfX2ZpbGVfXywgJy4uJywgJy4uJykpKQorCisjIFRvIGVsaW1pbmF0ZSBjbGFzaGluZyB3aXRoIG9sZGVyIGFyY2hpdmVkIGJ1aWxkcyBvbiBibGVlZGluZyBlZGdlIHdlIGFkZAorIyBhIGJhc2UgbnVtYmVyIGJpZ2dlciB0aGUgbGFyZ2VzdCBzdm4gcmV2aXNpb24gKHRoaXMgYWxzbyBnaXZlcyB1cyBhbiBlYXN5CisjIHdheSBvZiBzZWVpbmcgaWYgYW4gYXJjaGl2ZSBjb21lcyBmcm9tIGdpdCBiYXNlZCBvciBzdm4gYmFzZWQgY29tbWl0cykuCitHSVRfTlVNQkVSX0JBU0UgPSAxMDAwMDAKKworIyBNYXBwaW5nIHRhYmxlIGJldHdlZW4gYnVpbGQgbW9kZSBhbmQgYnVpbGQgY29uZmlndXJhdGlvbi4KK0JVSUxEX01PREVTID0geworICAgICdkZWJ1Zyc6ICdEZWJ1ZycsCisgICAgJ3JlbGVhc2UnOiAnUmVsZWFzZScsCisgICAgJ3Byb2R1Y3QnOiAnUHJvZHVjdCcsCit9CisKKyMgTWFwcGluZyB0YWJsZSBiZXR3ZWVuIGJ1aWxkIG1vZGUgYW5kIGJ1aWxkIGNvbmZpZ3VyYXRpb24uCitCVUlMRF9TQU5JVElaRVJTID0geworICAgIE5vbmU6ICcnLAorICAgICdub25lJzogJycsCisgICAgJ2FzYW4nOiAnQVNBTicsCisgICAgJ2xzYW4nOiAnTFNBTicsCisgICAgJ21zYW4nOiAnTVNBTicsCisgICAgJ3RzYW4nOiAnVFNBTicsCisgICAgJ3Vic2FuJzogJ1VCU0FOJywKK30KKworIyBNYXBwaW5nIHRhYmxlIGJldHdlZW4gT1MgYW5kIGJ1aWxkIG91dHB1dCBsb2NhdGlvbi4KK0JVSUxEX1JPT1QgPSB7CisgICAgJ3dpbjMyJzogJ291dCcsCisgICAgJ2xpbnV4JzogJ291dCcsCisgICAgJ2ZyZWVic2QnOiAnb3V0JywKKyAgICAnbWFjb3MnOiAneGNvZGVidWlsZCcsCit9CisKKyMgTm90ZTogZ24gZXhwZWN0cyB0aGVzZSB0byBiZSBsb3dlciBjYXNlLgorQVJDSF9GQU1JTFkgPSB7CisgICAgJ2lhMzInOiAnaWEzMicsCisgICAgJ3g2NCc6ICdpYTMyJywKKyAgICAnYXJtJzogJ2FybScsCisgICAgJ2FybXY2JzogJ2FybScsCisgICAgJ2FybTY0JzogJ2FybScsCisgICAgJ2FybV94NjQnOiAnYXJtJywKKyAgICAnc2ltYXJtJzogJ2lhMzInLAorICAgICdzaW1hcm12Nic6ICdpYTMyJywKKyAgICAnc2ltYXJtNjQnOiAnaWEzMicsCisgICAgJ3NpbWFybV94NjQnOiAnaWEzMicsCit9CisKK0JBU0VfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5jdXJkaXIsICcuLicpKQorREFSVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKF9fZmlsZV9fLCAnLi4nLCAnLi4nKSkKK1ZFUlNJT05fRklMRSA9IG9zLnBhdGguam9pbihEQVJUX0RJUiwgJ3Rvb2xzJywgJ1ZFUlNJT04nKQogCiAKLWRlZiBHZXRCb3RVdGlscygpOgorZGVmIEdldEFyY2hGYW1pbHkoYXJjaCk6CisgICAgcmV0dXJuIEFSQ0hfRkFNSUxZW2FyY2hdCisKKworZGVmIEdldEJ1aWxkRGlyKGhvc3Rfb3MpOgorICAgIHJldHVybiBCVUlMRF9ST09UW2hvc3Rfb3NdCisKKworZGVmIEdldEJ1aWxkTW9kZShtb2RlKToKKyAgICByZXR1cm4gQlVJTERfTU9ERVNbbW9kZV0KKworCitkZWYgR2V0QnVpbGRTYW5pdGl6ZXIoc2FuaXRpemVyKToKKyAgICByZXR1cm4gQlVJTERfU0FOSVRJWkVSU1tzYW5pdGl6ZXJdCisKKworZGVmIEdldEJhc2VEaXIoKToKKyAgICByZXR1cm4gQkFTRV9ESVIKKworCitkZWYgR2V0Qm90VXRpbHMocmVwb19wYXRoPURBUlRfRElSKToKICAgICAnJydEeW5hbWljYWxseSBsb2FkIHRoZSB0b29scy9ib3RzL2JvdF91dGlscy5weSBweXRob24gbW9kdWxlLicnJwogICAgIHJldHVybiBpbXAubG9hZF9zb3VyY2UoCi0gICAgICAgICdib3RfdXRpbHMnLCBvcy5wYXRoLmpvaW4oREFSVF9ESVIsICd0b29scycsICdib3RzJywgJ2JvdF91dGlscy5weScpKQorICAgICAgICAnYm90X3V0aWxzJywgb3MucGF0aC5qb2luKHJlcG9fcGF0aCwgJ3Rvb2xzJywgJ2JvdHMnLCAnYm90X3V0aWxzLnB5JykpCiAKIAotZGVmIEdldE1pbmlkdW1wVXRpbHMoKToKK2RlZiBHZXRNaW5pZHVtcFV0aWxzKHJlcG9fcGF0aD1EQVJUX0RJUik6CiAgICAgJycnRHluYW1pY2FsbHkgbG9hZCB0aGUgdG9vbHMvbWluaWR1bXAucHkgcHl0aG9uIG1vZHVsZS4nJycKICAgICByZXR1cm4gaW1wLmxvYWRfc291cmNlKCdtaW5pZHVtcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oREFSVF9ESVIsICd0b29scycsICdtaW5pZHVtcC5weScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJlcG9fcGF0aCwgJ3Rvb2xzJywgJ21pbmlkdW1wLnB5JykpCiAKIAogY2xhc3MgVmVyc2lvbihvYmplY3QpOgpAQCAtNTgsMjIgKzEyOCwyMiBAQAogIyBUcnkgdG8gZ3Vlc3MgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS4KIGRlZiBHdWVzc09TKCk6CiAgICAgb3NfaWQgPSBwbGF0Zm9ybS5zeXN0ZW0oKQotICAgIGlmIG9zX2lkID09ICJMaW51eCI6Ci0gICAgICAgIHJldHVybiAibGludXgiCi0gICAgZWxpZiBvc19pZCA9PSAiRGFyd2luIjoKLSAgICAgICAgcmV0dXJuICJtYWNvcyIKLSAgICBlbGlmIG9zX2lkID09ICJXaW5kb3dzIiBvciBvc19pZCA9PSAiTWljcm9zb2Z0IjoKLSAgICAgICAgIyBPbiBXaW5kb3dzIFZpc3RhIHBsYXRmb3JtLnN5c3RlbSgpIGNhbiByZXR1cm4gIk1pY3Jvc29mdCIgd2l0aCBzb21lCisgICAgaWYgb3NfaWQgPT0gJ0xpbnV4JzoKKyAgICAgICAgcmV0dXJuICdsaW51eCcKKyAgICBlbGlmIG9zX2lkID09ICdEYXJ3aW4nOgorICAgICAgICByZXR1cm4gJ21hY29zJworICAgIGVsaWYgb3NfaWQgPT0gJ1dpbmRvd3MnIG9yIG9zX2lkID09ICdNaWNyb3NvZnQnOgorICAgICAgICAjIE9uIFdpbmRvd3MgVmlzdGEgcGxhdGZvcm0uc3lzdGVtKCkgY2FuIHJldHVybiAnTWljcm9zb2Z0JyB3aXRoIHNvbWUKICAgICAgICAgIyB2ZXJzaW9ucyBvZiBQeXRob24sIHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTA4MiBmb3IgZGV0YWlscy4KLSAgICAgICAgcmV0dXJuICJ3aW4zMiIKKyAgICAgICAgcmV0dXJuICd3aW4zMicKICAgICBlbGlmIG9zX2lkID09ICdGcmVlQlNEJzoKICAgICAgICAgcmV0dXJuICdmcmVlYnNkJwogICAgIGVsaWYgb3NfaWQgPT0gJ09wZW5CU0QnOgogICAgICAgICByZXR1cm4gJ29wZW5ic2QnCiAgICAgZWxpZiBvc19pZCA9PSAnU3VuT1MnOgogICAgICAgICByZXR1cm4gJ3NvbGFyaXMnCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHJldHVybiBOb25lCiAKIAogIyBUcnkgdG8gZ3Vlc3MgdGhlIGhvc3QgYXJjaGl0ZWN0dXJlLgpAQCAtOTEsMjQgKzE2MSwyNCBAQAogICAgICAgICByZXR1cm4gJ2lhMzInCiAgICAgZWxpZiBvc19pZCA9PSAnaTg2cGMnOgogICAgICAgICByZXR1cm4gJ2lhMzInCi0gICAgZWxzZToKLSAgICAgICAgZ3Vlc3Nfb3MgPSBHdWVzc09TKCkKLSAgICAgICAgcHJpbnQgKCJXYXJuaW5nOiBHdWVzc2luZyBhcmNoaXRlY3R1cmUgJXMgYmFzZWQgb24gb3MgJXNcbiJcCi0gICAgICAgICAgICAgICUgKG9zX2lkLCBndWVzc19vcykpCi0gICAgICAgIGlmIGd1ZXNzX29zID09ICd3aW4zMic6Ci0gICAgICAgICAgICByZXR1cm4gJ2lhMzInCi0gICAgICAgIHJldHVybiBOb25lCisKKyAgICBndWVzc19vcyA9IEd1ZXNzT1MoKQorICAgIHByaW50KCdXYXJuaW5nOiBHdWVzc2luZyBhcmNoaXRlY3R1cmUge30gYmFzZWQgb24gb3Mge31cbicuZm9ybWF0KAorICAgICAgICBvc19pZCwgZ3Vlc3Nfb3MpKQorICAgIGlmIGd1ZXNzX29zID09ICd3aW4zMic6CisgICAgICAgIHJldHVybiAnaWEzMicKKyAgICByZXR1cm4gTm9uZQogCiAKICMgVHJ5IHRvIGd1ZXNzIHRoZSBudW1iZXIgb2YgY3B1cyBvbiB0aGlzIG1hY2hpbmUuCiBkZWYgR3Vlc3NDcHVzKCk6Ci0gICAgaWYgb3MuZ2V0ZW52KCJEQVJUX05VTUJFUl9PRl9DT1JFUyIpIGlzIG5vdCBOb25lOgotICAgICAgICByZXR1cm4gaW50KG9zLmdldGVudigiREFSVF9OVU1CRVJfT0ZfQ09SRVMiKSkKLSAgICBpZiBvcy5wYXRoLmV4aXN0cygiL3Byb2MvY3B1aW5mbyIpOgorICAgIGlmIG9zLmdldGVudignREFSVF9OVU1CRVJfT0ZfQ09SRVMnKSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGludChvcy5nZXRlbnYoJ0RBUlRfTlVNQkVSX09GX0NPUkVTJykpCisgICAgaWYgb3MucGF0aC5leGlzdHMoJy9wcm9jL2NwdWluZm8nKToKICAgICAgICAgcmV0dXJuIGludCgKICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAotICAgICAgICAgICAgICAgICJncmVwIC1FICdecHJvY2Vzc29yJyAvcHJvYy9jcHVpbmZvIHwgd2MgLWwiLCBzaGVsbD1UcnVlKSkKLSAgICBpZiBvcy5wYXRoLmV4aXN0cygiL3Vzci9iaW4vaG9zdGluZm8iKToKKyAgICAgICAgICAgICAgICAnZ3JlcCAtRSBcJ15wcm9jZXNzb3JcJyAvcHJvYy9jcHVpbmZvIHwgd2MgLWwnLCBzaGVsbD1UcnVlKSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9iaW4vaG9zdGluZm8nKToKICAgICAgICAgcmV0dXJuIGludCgKICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAogICAgICAgICAgICAgICAgICcvdXNyL2Jpbi9ob3N0aW5mbyB8JwpAQCAtMTMwLDE3ICsyMDAsMTcgQEAKICAgICAgICAgd293NjQzMk5vZGUgPSAnV293NjQzMk5vZGVcXCcKICAgICBlbHNlOgogICAgICAgICB3b3c2NDMyTm9kZSA9ICcnCi0gICAgcmV0dXJuIHInU09GVFdBUkVcJXMlcycgJSAod293NjQzMk5vZGUsIG5hbWUpCisgICAgcmV0dXJuIHInU09GVFdBUkVce317fScuZm9ybWF0KHdvdzY0MzJOb2RlLCBuYW1lKQogCiAKICMgVHJ5IHRvIGd1ZXNzIFZpc3VhbCBTdHVkaW8gbG9jYXRpb24gd2hlbiBidWlkaW5nIG9uIFdpbmRvd3MuCiBkZWYgR3Vlc3NWaXN1YWxTdHVkaW9QYXRoKCk6Ci0gICAgZGVmYXVsdFBhdGggPSByIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxDb21tb243IiBcCi0gICAgICAgICAgICAgICAgICByIlxJREUiCi0gICAgZGVmYXVsdEV4ZWN1dGFibGUgPSAiZGV2ZW52LmNvbSIKKyAgICBkZWZhdWx0UGF0aCA9IHInQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxNC4wXENvbW1vbjcnIFwKKyAgICAgICAgICAgICAgICAgIHInXElERScKKyAgICBkZWZhdWx0RXhlY3V0YWJsZSA9ICdkZXZlbnYuY29tJwogCiAgICAgaWYgbm90IElzV2luZG93cygpOgotICAgICAgICByZXR1cm4gZGVmYXVsdFBhdGgsIGRlZmF1bHRFeGVjdXRhYmxlCisgICAgICAgIHJldHVybiAoZGVmYXVsdFBhdGgsIGRlZmF1bHRFeGVjdXRhYmxlKQogCiAgICAga2V5TmFtZXNBbmRFeGVjdXRhYmxlcyA9IFsKICAgICAgICAgIyBQYWlyIGZvciBub24tRXhwcmVzcyBlZGl0aW9ucy4KQEAgLTE4NiwxMiArMjU2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdG9wIHNlYXJjaCBzaW5jZSBpZiB3ZSBmb3VuZCBub24tRXhwcmVzcyBWUzIwMTUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5zdGFsbGVkLCB3aGljaCBpcyBwcmVmZXJyZWQgdmVyc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbERpciwgZXhlY3V0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZmxvYXQoc3Via2V5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIHByZWZlciBoaWdoZXIgdmVyc2lvbiBvZiBWaXN1YWwgU3R1ZGlvIGFuZCBnaXZlbiBlcXVhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyc2lvbiBudW1iZXJzIHdlIHByZWZlciBub24tRXhwcmVzcyBlZGl0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPiBiZXN0R3Vlc3NbMF06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RHdWVzcyA9ICh2ZXJzaW9uLCAoaW5zdGFsbERpciwgZXhlY3V0YWJsZSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBmbG9hdChzdWJrZXlOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBwcmVmZXIgaGlnaGVyIHZlcnNpb24gb2YgVmlzdWFsIFN0dWRpbyBhbmQgZ2l2ZW4gZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyc2lvbiBudW1iZXJzIHdlIHByZWZlciBub24tRXhwcmVzcyBlZGl0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyc2lvbiA+IGJlc3RHdWVzc1swXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0R3Vlc3MgPSAodmVyc2lvbiwgKGluc3RhbGxEaXIsIGV4ZWN1dGFibGUpKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgX3dpbnJlZy5DbG9zZUtleShrZXkpCiAgICAgcmV0dXJuIGJlc3RHdWVzc1sxXQpAQCAtMjQ2LDg3ICszMTYsMjYgQEAKICAgICBzZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0LCB2YWx1ZSkKIAogCi0jIE1hcHBpbmcgdGFibGUgYmV0d2VlbiBidWlsZCBtb2RlIGFuZCBidWlsZCBjb25maWd1cmF0aW9uLgotQlVJTERfTU9ERVMgPSB7Ci0gICAgJ2RlYnVnJzogJ0RlYnVnJywKLSAgICAncmVsZWFzZSc6ICdSZWxlYXNlJywKLSAgICAncHJvZHVjdCc6ICdQcm9kdWN0JywKLX0KLQotIyBNYXBwaW5nIHRhYmxlIGJldHdlZW4gYnVpbGQgbW9kZSBhbmQgYnVpbGQgY29uZmlndXJhdGlvbi4KLUJVSUxEX1NBTklUSVpFUlMgPSB7Ci0gICAgTm9uZTogJycsCi0gICAgJ25vbmUnOiAnJywKLSAgICAnYXNhbic6ICdBU0FOJywKLSAgICAnbHNhbic6ICdMU0FOJywKLSAgICAnbXNhbic6ICdNU0FOJywKLSAgICAndHNhbic6ICdUU0FOJywKLSAgICAndWJzYW4nOiAnVUJTQU4nLAotfQotCi0jIE1hcHBpbmcgdGFibGUgYmV0d2VlbiBPUyBhbmQgYnVpbGQgb3V0cHV0IGxvY2F0aW9uLgotQlVJTERfUk9PVCA9IHsKLSAgICAnd2luMzInOiBvcy5wYXRoLmpvaW4oJ291dCcpLAotICAgICdsaW51eCc6IG9zLnBhdGguam9pbignb3V0JyksCi0gICAgJ2ZyZWVic2QnOiBvcy5wYXRoLmpvaW4oJ291dCcpLAotICAgICdtYWNvcyc6IG9zLnBhdGguam9pbigneGNvZGVidWlsZCcpLAotfQotCi0jIE5vdGU6IGduIGV4cGVjdHMgdGhlc2UgdG8gYmUgbG93ZXIgY2FzZS4KLUFSQ0hfRkFNSUxZID0gewotICAgICdpYTMyJzogJ2lhMzInLAotICAgICd4NjQnOiAnaWEzMicsCi0gICAgJ2FybSc6ICdhcm0nLAotICAgICdhcm12Nic6ICdhcm0nLAotICAgICdhcm02NCc6ICdhcm0nLAotICAgICdhcm1feDY0JzogJ2FybScsCi0gICAgJ3NpbWFybSc6ICdpYTMyJywKLSAgICAnc2ltYXJtdjYnOiAnaWEzMicsCi0gICAgJ3NpbWFybTY0JzogJ2lhMzInLAotICAgICdzaW1hcm1feDY0JzogJ2lhMzInLAotfQotCi1BUkNIX0dVRVNTID0gR3Vlc3NBcmNoaXRlY3R1cmUoKQotQkFTRV9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLmN1cmRpciwgJy4uJykpCi1EQVJUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oX19maWxlX18sICcuLicsICcuLicpKQotVkVSU0lPTl9GSUxFID0gb3MucGF0aC5qb2luKERBUlRfRElSLCAndG9vbHMnLCAnVkVSU0lPTicpCi0KLQotZGVmIEdldEJ1aWxkTW9kZShtb2RlKToKLSAgICByZXR1cm4gQlVJTERfTU9ERVNbbW9kZV0KLQotCi1kZWYgR2V0QnVpbGRTYW5pdGl6ZXIoc2FuaXRpemVyKToKLSAgICByZXR1cm4gQlVJTERfU0FOSVRJWkVSU1tzYW5pdGl6ZXJdCi0KLQotZGVmIEdldEFyY2hGYW1pbHkoYXJjaCk6Ci0gICAgcmV0dXJuIEFSQ0hfRkFNSUxZW2FyY2hdCi0KLQogZGVmIElzQ3Jvc3NCdWlsZCh0YXJnZXRfb3MsIGFyY2gpOgotICAgIGhvc3RfYXJjaCA9IEFSQ0hfR1VFU1MKKyAgICBob3N0X2FyY2ggPSBHdWVzc0FyY2hpdGVjdHVyZSgpCiAgICAgcmV0dXJuICgoR2V0QXJjaEZhbWlseShob3N0X2FyY2gpICE9IEdldEFyY2hGYW1pbHkoYXJjaCkpIG9yCiAgICAgICAgICAgICAodGFyZ2V0X29zICE9IEd1ZXNzT1MoKSkpCiAKIAogZGVmIEdldEJ1aWxkQ29uZihtb2RlLCBhcmNoLCBjb25mX29zPU5vbmUsIHNhbml0aXplcj1Ob25lKToKLSAgICBpZiBjb25mX29zIGlzIG5vdCBOb25lIGFuZCBjb25mX29zICE9IEd1ZXNzT1MoKSBhbmQgY29uZl9vcyAhPSAiaG9zdCI6Ci0gICAgICAgIHJldHVybiAnJXMlcyVzJyAlIChHZXRCdWlsZE1vZGUobW9kZSksIGNvbmZfb3MudGl0bGUoKSwgYXJjaC51cHBlcigpKQotICAgIGVsc2U6Ci0gICAgICAgICMgQXNrIGZvciBhIGNyb3NzIGJ1aWxkIGlmIHRoZSBob3N0IGFuZCB0YXJnZXQgYXJjaGl0ZWN0dXJlcyBkb24ndCBtYXRjaC4KLSAgICAgICAgaG9zdF9hcmNoID0gQVJDSF9HVUVTUwotICAgICAgICBjcm9zc19idWlsZCA9ICcnCi0gICAgICAgIGlmIEdldEFyY2hGYW1pbHkoaG9zdF9hcmNoKSAhPSBHZXRBcmNoRmFtaWx5KGFyY2gpOgotICAgICAgICAgICAgY3Jvc3NfYnVpbGQgPSAnWCcKLSAgICAgICAgcmV0dXJuICclcyVzJXMlcycgJSAoR2V0QnVpbGRNb2RlKG1vZGUpLCBHZXRCdWlsZFNhbml0aXplcihzYW5pdGl6ZXIpLAorICAgIGlmIGNvbmZfb3MgaXMgbm90IE5vbmUgYW5kIGNvbmZfb3MgIT0gR3Vlc3NPUygpIGFuZCBjb25mX29zICE9ICdob3N0JzoKKyAgICAgICAgcmV0dXJuICd7fXt9e30nLmZvcm1hdChHZXRCdWlsZE1vZGUobW9kZSksIGNvbmZfb3MudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoLnVwcGVyKCkpCisKKyAgICAjIEFzayBmb3IgYSBjcm9zcyBidWlsZCBpZiB0aGUgaG9zdCBhbmQgdGFyZ2V0IGFyY2hpdGVjdHVyZXMgZG9uJ3QgbWF0Y2guCisgICAgaG9zdF9hcmNoID0gR3Vlc3NBcmNoaXRlY3R1cmUoKQorICAgIGNyb3NzX2J1aWxkID0gJycKKyAgICBpZiBHZXRBcmNoRmFtaWx5KGhvc3RfYXJjaCkgIT0gR2V0QXJjaEZhbWlseShhcmNoKToKKyAgICAgICAgY3Jvc3NfYnVpbGQgPSAnWCcKKyAgICByZXR1cm4gJ3t9e317fXt9Jy5mb3JtYXQoR2V0QnVpbGRNb2RlKG1vZGUpLCBHZXRCdWlsZFNhbml0aXplcihzYW5pdGl6ZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc19idWlsZCwgYXJjaC51cHBlcigpKQogCiAKLWRlZiBHZXRCdWlsZERpcihob3N0X29zKToKLSAgICByZXR1cm4gQlVJTERfUk9PVFtob3N0X29zXQotCi0KIGRlZiBHZXRCdWlsZFJvb3QoaG9zdF9vcywgbW9kZT1Ob25lLCBhcmNoPU5vbmUsIHRhcmdldF9vcz1Ob25lLCBzYW5pdGl6ZXI9Tm9uZSk6CiAgICAgYnVpbGRfcm9vdCA9IEdldEJ1aWxkRGlyKGhvc3Rfb3MpCiAgICAgaWYgbW9kZToKQEAgLTM0MCwzNSArMzQ5LDM2IEBACiAgICAgcmV0dXJuIG9zLnBhdGguam9pbihidWlsZF9yb290LCAnZGFydC1zZGsnLCAnYmluJykKIAogCi1kZWYgR2V0QmFzZURpcigpOgotICAgIHJldHVybiBCQVNFX0RJUgorZGVmIEdldFNob3J0VmVyc2lvbih2ZXJzaW9uX2ZpbGU9Tm9uZSk6CisgICAgdmVyc2lvbiA9IFJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uX2ZpbGUpCisgICAgcmV0dXJuICgne30ue30ue30ue30ue30nLmZvcm1hdCh2ZXJzaW9uLm1ham9yLCB2ZXJzaW9uLm1pbm9yLCB2ZXJzaW9uLnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5wcmVyZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5wcmVyZWxlYXNlX3BhdGNoKSkKIAogCi1kZWYgR2V0U2hvcnRWZXJzaW9uKCk6Ci0gICAgdmVyc2lvbiA9IFJlYWRWZXJzaW9uRmlsZSgpCi0gICAgcmV0dXJuICgnJXMuJXMuJXMuJXMuJXMnICUgKHZlcnNpb24ubWFqb3IsIHZlcnNpb24ubWlub3IsIHZlcnNpb24ucGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24ucHJlcmVsZWFzZSwgdmVyc2lvbi5wcmVyZWxlYXNlX3BhdGNoKSkKLQotCi1kZWYgR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoPUZhbHNlLCB2ZXJzaW9uX2ZpbGU9Tm9uZSk6CitkZWYgR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l0X3JldmlzaW9uX2ZpbGU9Tm9uZSk6CiAgICAgdmVyc2lvbiA9IFJlYWRWZXJzaW9uRmlsZSh2ZXJzaW9uX2ZpbGUpCiAgICAgaWYgbm90IHZlcnNpb246CiAgICAgICAgIHJldHVybiBOb25lCiAKKyAgICBzdWZmaXggPSAnJwogICAgIGlmIHZlcnNpb24uY2hhbm5lbCA9PSAnYmUnOgotICAgICAgICBwb3N0Zml4ID0gJy1lZGdlJyBpZiBub19naXRfaGFzaCBlbHNlICctZWRnZS4lcycgJSBHZXRHaXRSZXZpc2lvbigpCisgICAgICAgIHN1ZmZpeCA9ICctZWRnZScgaWYgbm9fZ2l0X2hhc2ggZWxzZSAnLWVkZ2Uue30nLmZvcm1hdCgKKyAgICAgICAgICAgIEdldEdpdFJldmlzaW9uKGdpdF9yZXZpc2lvbl9maWxlKSkKICAgICBlbGlmIHZlcnNpb24uY2hhbm5lbCBpbiAoJ2JldGEnLCAnZGV2Jyk6Ci0gICAgICAgIHBvc3RmaXggPSAnLSVzLiVzLiVzJyAlICh2ZXJzaW9uLnByZXJlbGVhc2UsIHZlcnNpb24ucHJlcmVsZWFzZV9wYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uY2hhbm5lbCkKKyAgICAgICAgc3VmZml4ID0gJy17fS57fS57fScuZm9ybWF0KHZlcnNpb24ucHJlcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24ucHJlcmVsZWFzZV9wYXRjaCwgdmVyc2lvbi5jaGFubmVsKQogICAgIGVsc2U6CiAgICAgICAgIGFzc2VydCB2ZXJzaW9uLmNoYW5uZWwgPT0gJ3N0YWJsZScKLSAgICAgICAgcG9zdGZpeCA9ICcnCiAKLSAgICByZXR1cm4gJyVzLiVzLiVzJXMnICUgKHZlcnNpb24ubWFqb3IsIHZlcnNpb24ubWlub3IsIHZlcnNpb24ucGF0Y2gsIHBvc3RmaXgpCisgICAgcmV0dXJuICd7fS57fS57fXt9Jy5mb3JtYXQodmVyc2lvbi5tYWpvciwgdmVyc2lvbi5taW5vciwgdmVyc2lvbi5wYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXgpCiAKIAotZGVmIEdldFZlcnNpb24obm9fZ2l0X2hhc2g9RmFsc2UsIHZlcnNpb25fZmlsZT1Ob25lKToKLSAgICByZXR1cm4gR2V0U2VtYW50aWNTREtWZXJzaW9uKG5vX2dpdF9oYXNoLCB2ZXJzaW9uX2ZpbGUpCitkZWYgR2V0VmVyc2lvbihub19naXRfaGFzaD1GYWxzZSwgdmVyc2lvbl9maWxlPU5vbmUsIGdpdF9yZXZpc2lvbl9maWxlPU5vbmUpOgorICAgIHJldHVybiBHZXRTZW1hbnRpY1NES1ZlcnNpb24obm9fZ2l0X2hhc2gsIHZlcnNpb25fZmlsZSwgZ2l0X3JldmlzaW9uX2ZpbGUpCiAKIAogIyBUaGUgZWRpdG9yIHVzZWQgdG8gcHJvZHVjZSB0aGUgVkVSU0lPTiBmaWxlIHB1dCBvbiBnY3MuIFdlIG5vdyBwcm9kdWNlIHRoaXMKQEAgLTM4MSwxNSArMzkxLDE1IEBACiAjfQogZGVmIEdldFZlcnNpb25GaWxlQ29udGVudCgpOgogICAgIHJlc3VsdCA9IHsKLSAgICAgICAgImRhdGUiOiBzdHIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpKSwKLSAgICAgICAgInZlcnNpb24iOiBHZXRWZXJzaW9uKCksCi0gICAgICAgICJyZXZpc2lvbiI6IEdldEdpdFJldmlzaW9uKCkKKyAgICAgICAgJ2RhdGUnOiBzdHIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpKSwKKyAgICAgICAgJ3ZlcnNpb24nOiBHZXRWZXJzaW9uKCksCisgICAgICAgICdyZXZpc2lvbic6IEdldEdpdFJldmlzaW9uKCkKICAgICB9CiAgICAgcmV0dXJuIGpzb24uZHVtcHMocmVzdWx0LCBpbmRlbnQ9MikKIAogCi1kZWYgR2V0Q2hhbm5lbCgpOgotICAgIHZlcnNpb24gPSBSZWFkVmVyc2lvbkZpbGUoKQorZGVmIEdldENoYW5uZWwodmVyc2lvbl9maWxlPU5vbmUpOgorICAgIHZlcnNpb24gPSBSZWFkVmVyc2lvbkZpbGUodmVyc2lvbl9maWxlKQogICAgIHJldHVybiB2ZXJzaW9uLmNoYW5uZWwKIAogCkBAIC00MjEsMTIgKzQzMSwxMiBAQAogICAgIGlmIHZlcnNpb25fZmlsZSA9PSBOb25lOgogICAgICAgICB2ZXJzaW9uX2ZpbGUgPSBWRVJTSU9OX0ZJTEUKIAorICAgIGNvbnRlbnQgPSBOb25lCiAgICAgdHJ5OgotICAgICAgICBmZCA9IG9wZW4odmVyc2lvbl9maWxlKQotICAgICAgICBjb250ZW50ID0gZmQucmVhZCgpCi0gICAgICAgIGZkLmNsb3NlKCkKKyAgICAgICAgd2l0aCBvcGVuKHZlcnNpb25fZmlsZSkgYXMgZmQ6CisgICAgICAgICAgICBjb250ZW50ID0gZmQucmVhZCgpCiAgICAgZXhjZXB0OgotICAgICAgICBwcmludCgiV2FybmluZzogQ291bGRuJ3QgcmVhZCBWRVJTSU9OIGZpbGUgKCVzKSIgJSB2ZXJzaW9uX2ZpbGUpCisgICAgICAgIHByaW50KCdXYXJuaW5nOiBDb3VsZCBub3QgcmVhZCBWRVJTSU9OIGZpbGUgKHt9KScuZm9ybWF0KHZlcnNpb25fZmlsZSkpCiAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBjaGFubmVsID0gbWF0Y2hfYWdhaW5zdCgnXkNIQU5ORUwgKFtBLVphLXowLTldKykkJywgY29udGVudCkKQEAgLTQzOSwxNCArNDQ5LDE0IEBACiAgICAgb2xkZXN0X3N1cHBvcnRlZF9hYmlfdmVyc2lvbiA9IG1hdGNoX2FnYWluc3QoCiAgICAgICAgICdeT0xERVNUX1NVUFBPUlRFRF9BQklfVkVSU0lPTiAoXGQrKSQnLCBjb250ZW50KQogCi0gICAgaWYgY2hhbm5lbCBhbmQgbWFqb3IgYW5kIG1pbm9yIGFuZCBwcmVyZWxlYXNlIGFuZCBwcmVyZWxlYXNlX3BhdGNoIGFuZCBcCi0gICAgICAgIGFiaV92ZXJzaW9uIGFuZCBvbGRlc3Rfc3VwcG9ydGVkX2FiaV92ZXJzaW9uOgorICAgIGlmIChjaGFubmVsIGFuZCBtYWpvciBhbmQgbWlub3IgYW5kIHByZXJlbGVhc2UgYW5kIHByZXJlbGVhc2VfcGF0Y2ggYW5kCisgICAgICAgICAgICBhYmlfdmVyc2lvbiBhbmQgb2xkZXN0X3N1cHBvcnRlZF9hYmlfdmVyc2lvbik6CiAgICAgICAgIHJldHVybiBWZXJzaW9uKGNoYW5uZWwsIG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZXJlbGVhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXJlbGVhc2VfcGF0Y2gsIGFiaV92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBvbGRlc3Rfc3VwcG9ydGVkX2FiaV92ZXJzaW9uKQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCJXYXJuaW5nOiBWRVJTSU9OIGZpbGUgKCVzKSBoYXMgd3JvbmcgZm9ybWF0IiAlIHZlcnNpb25fZmlsZSkKLSAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHByaW50KCdXYXJuaW5nOiBWRVJTSU9OIGZpbGUgKHt9KSBoYXMgd3JvbmcgZm9ybWF0Jy5mb3JtYXQodmVyc2lvbl9maWxlKSkKKyAgICByZXR1cm4gTm9uZQogCiAKICMgT3VyIHNjaGVtYSBmb3IgcmVsZWFzZXMgYW5kIGFyY2hpdmluZyBpcyBiYXNlZCBvbiBhbiBpbmNyZWFzaW5nCkBAIC00NTgsOCArNDY4LDggQEAKICMgV2Ugb25seSB1c2UgbnVtYmVycyBvbiB0aGUgbWFzdGVyIGJyYW5jaCAoYmxlZWRpbmcgZWRnZSkuIE9uIGJyYW5jaGVzCiAjIHdlIHVzZSB0aGUgdmVyc2lvbiBudW1iZXIgaW5zdGVhZCBmb3IgYXJjaGl2aW5nIHB1cnBvc2VzLgogIyBUaGUgbnVtYmVyIG9uIG1hc3RlciBpcyB0aGUgY291bnQgb2YgY29tbWl0cyBvbiB0aGUgbWFzdGVyIGJyYW5jaC4KLWRlZiBHZXRBcmNoaXZlVmVyc2lvbigpOgotICAgIHZlcnNpb24gPSBSZWFkVmVyc2lvbkZpbGUoKQorZGVmIEdldEFyY2hpdmVWZXJzaW9uKHZlcnNpb25fZmlsZT1Ob25lKToKKyAgICB2ZXJzaW9uID0gUmVhZFZlcnNpb25GaWxlKHZlcnNpb25fZmlsZT1Ob25lKQogICAgIGlmIG5vdCB2ZXJzaW9uOgogICAgICAgICByYWlzZSAnQ291bGQgbm90IGdldCB0aGUgYXJjaGl2ZSB2ZXJzaW9uLCBwYXJzaW5nIHRoZSB2ZXJzaW9uIGZpbGUgZmFpbGVkJwogICAgIGlmIHZlcnNpb24uY2hhbm5lbCBpbiBbJ2JlJywgJ2ludGVncmF0aW9uJ106CkBAIC00NjcsOTQgKzQ3Nyw5OCBAQAogICAgIHJldHVybiBHZXRTZW1hbnRpY1NES1ZlcnNpb24oKQogCiAKLWRlZiBHZXRHaXRSZXZpc2lvbigpOgorZGVmIEdldEdpdFJldmlzaW9uKGdpdF9yZXZpc2lvbl9maWxlPU5vbmUsIHJlcG9fcGF0aD1EQVJUX0RJUik6CiAgICAgIyBXaGVuIGJ1aWxkaW5nIGZyb20gdGFyYmFsbCB1c2UgdG9vbHMvR0lUX1JFVklTSU9OCi0gICAgZ2l0X3JldmlzaW9uX2ZpbGUgPSBvcy5wYXRoLmpvaW4oREFSVF9ESVIsICd0b29scycsICdHSVRfUkVWSVNJT04nKQorICAgIGlmIGdpdF9yZXZpc2lvbl9maWxlIGlzIE5vbmU6CisgICAgICAgIGdpdF9yZXZpc2lvbl9maWxlID0gb3MucGF0aC5qb2luKHJlcG9fcGF0aCwgJ3Rvb2xzJywgJ0dJVF9SRVZJU0lPTicpCiAgICAgdHJ5OgogICAgICAgICB3aXRoIG9wZW4oZ2l0X3JldmlzaW9uX2ZpbGUpIGFzIGZkOgotICAgICAgICAgICAgcmV0dXJuIGZkLnJlYWQoKQorICAgICAgICAgICAgcmV0dXJuIGZkLnJlYWQoKS5kZWNvZGUoJ3V0Zi04Jykuc3RyaXAoKQogICAgIGV4Y2VwdDoKICAgICAgICAgcGFzcwogICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnZ2l0JywgJ3Jldi1wYXJzZScsICdIRUFEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9SXNXaW5kb3dzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3dkPURBUlRfRElSKQorICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1yZXBvX3BhdGgpCiAgICAgb3V0cHV0LCBfID0gcC5jb21tdW5pY2F0ZSgpCi0gICAgb3V0cHV0ID0gb3V0cHV0LnN0cmlwKCkKKyAgICByZXZpc2lvbiA9IG91dHB1dC5kZWNvZGUoJ3V0Zi04Jykuc3RyaXAoKQogICAgICMgV2UgZXhwZWN0IGEgZnVsbCBnaXQgaGFzaAotICAgIGlmIGxlbihvdXRwdXQpICE9IDQwOgotICAgICAgICBwcmludCgiV2FybmluZzogY291bGQgbm90IHBhcnNlIGdpdCBjb21taXQsIG91dHB1dCB3YXMgJXMiICUgb3V0cHV0KQorICAgIGlmIGxlbihyZXZpc2lvbikgIT0gNDA6CisgICAgICAgIHByaW50KCdXYXJuaW5nOiBDb3VsZCBub3QgcGFyc2UgZ2l0IGNvbW1pdCwgb3V0cHV0IHdhcyB7fScuZm9ybWF0KAorICAgICAgICAgICAgcmV2aXNpb24pLAorICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgIHJldHVybiBOb25lCi0gICAgcmV0dXJuIG91dHB1dAorICAgIHJldHVybiByZXZpc2lvbgogCiAKLWRlZiBHZXRTaG9ydEdpdEhhc2goKToKK2RlZiBHZXRTaG9ydEdpdEhhc2gocmVwb19wYXRoPURBUlRfRElSKToKICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9SXNXaW5kb3dzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3dkPURBUlRfRElSKQorICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1yZXBvX3BhdGgpCiAgICAgb3V0cHV0LCBfID0gcC5jb21tdW5pY2F0ZSgpCi0gICAgb3V0cHV0ID0gb3V0cHV0LnN0cmlwKCkKKyAgICByZXZpc2lvbiA9IG91dHB1dC5kZWNvZGUoJ3V0Zi04Jykuc3RyaXAoKQogICAgIGlmIHAud2FpdCgpICE9IDA6CiAgICAgICAgIHJldHVybiBOb25lCi0gICAgcmV0dXJuIG91dHB1dAorICAgIHJldHVybiByZXZpc2lvbgogCiAKLWRlZiBHZXRMYXRlc3REZXZUYWcoKToKK2RlZiBHZXRMYXRlc3REZXZUYWcocmVwb19wYXRoPURBUlRfRElSKToKKyAgICAjIFdlIHVzZWQgdGhlIG9sZCwgcHJlLWdpdDIuMTMgcmVmbmFtZTpzdHJpcCBoZXJlIHNpbmNlIGxzdHJpcCB3aWxsIGZhaWwgb24KKyAgICAjIG9sZGVyIGdpdCB2ZXJzaW9ucy4gc3RyaXAgaXMgYW4gYWxpYXMgZm9yIGxzdHJpcCBpbiBsYXRlciB2ZXJzaW9ucy4KICAgICBjbWQgPSBbCiAgICAgICAgICdnaXQnLAogICAgICAgICAnZm9yLWVhY2gtcmVmJywKICAgICAgICAgJ3JlZnMvdGFncy8qZGV2KicsCiAgICAgICAgICctLXNvcnQ9LXRhZ2dlcmRhdGUnLAotICAgICAgICAiLS1mb3JtYXQ9JShyZWZuYW1lOmxzdHJpcD0yKSIsCisgICAgICAgICItLWZvcm1hdD0lKHJlZm5hbWU6c3RyaXA9MikiLAogICAgICAgICAnLS1jb3VudD0xJywKICAgICBdCi0gICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgIGNtZCwKLSAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAotICAgICAgICBzaGVsbD1Jc1dpbmRvd3MoKSwKLSAgICAgICAgY3dkPURBUlRfRElSKQorICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbD1Jc1dpbmRvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9cmVwb19wYXRoKQogICAgIG91dHB1dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgIHRhZyA9IG91dHB1dC5kZWNvZGUoJ3V0Zi04Jykuc3RyaXAoKQogICAgIGlmIHAud2FpdCgpICE9IDA6Ci0gICAgICAgIHByaW50KAotICAgICAgICAgICAgIldhcm5pbmc6IENvdWxkIG5vdCBnZXQgdGhlIG1vc3QgcmVjZW50IGRldiBicmFuY2ggdGFnICVzIiAlIG91dHB1dCkKKyAgICAgICAgcHJpbnQoJ1dhcm5pbmc6IENvdWxkIG5vdCBnZXQgdGhlIG1vc3QgcmVjZW50IGRldiBicmFuY2ggdGFnIHt9Jy5mb3JtYXQoCisgICAgICAgICAgICB0YWcpLAorICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgIHJldHVybiBOb25lCi0gICAgcmV0dXJuIG91dHB1dC5zdHJpcCgpCisgICAgcmV0dXJuIHRhZwogCiAKLWRlZiBHZXRHaXRUaW1lc3RhbXAoKToKK2RlZiBHZXRHaXRUaW1lc3RhbXAocmVwb19wYXRoPURBUlRfRElSKToKICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdsb2cnLCAnLW4nLCAnMScsICctLXByZXR0eT1mb3JtYXQ6JWNkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9SXNXaW5kb3dzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3dkPURBUlRfRElSKQorICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1yZXBvX3BhdGgpCiAgICAgb3V0cHV0LCBfID0gcC5jb21tdW5pY2F0ZSgpCisgICAgdGltZXN0YW1wID0gb3V0cHV0LmRlY29kZSgndXRmLTgnKS5zdHJpcCgpCiAgICAgaWYgcC53YWl0KCkgIT0gMDoKICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICByZXR1cm4gb3V0cHV0CisgICAgcmV0dXJuIHRpbWVzdGFtcAogCiAKLSMgVG8gZWxpbWluYXRlIGNsYXNoaW5nIHdpdGggb2xkZXIgYXJjaGl2ZWQgYnVpbGRzIG9uIGJsZWVkaW5nIGVkZ2Ugd2UgYWRkCi0jIGEgYmFzZSBudW1iZXIgYmlnZ2VyIHRoZSBsYXJnZXN0IHN2biByZXZpc2lvbiAodGhpcyBhbHNvIGdpdmVzIHVzIGFuIGVhc3kKLSMgd2F5IG9mIHNlZWluZyBpZiBhbiBhcmNoaXZlIGNvbWVzIGZyb20gZ2l0IGJhc2VkIG9yIHN2biBiYXNlZCBjb21taXRzKS4KLUdJVF9OVU1CRVJfQkFTRSA9IDEwMDAwMAotCi0KLWRlZiBHZXRHaXROdW1iZXIoKToKK2RlZiBHZXRHaXROdW1iZXIocmVwb19wYXRoPURBUlRfRElSKToKICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtbGlzdCcsICdIRUFEJywgJy0tY291bnQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbD1Jc1dpbmRvd3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9REFSVF9ESVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXJlcG9fcGF0aCkKICAgICBvdXRwdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICBudW1iZXIgPSBvdXRwdXQuZGVjb2RlKCd1dGYtOCcpLnN0cmlwKCkKICAgICB0cnk6Ci0gICAgICAgIG51bWJlciA9IGludChvdXRwdXQpCisgICAgICAgIG51bWJlciA9IGludChudW1iZXIpCiAgICAgICAgIHJldHVybiBudW1iZXIgKyBHSVRfTlVNQkVSX0JBU0UKICAgICBleGNlcHQ6Ci0gICAgICAgIHByaW50KCJXYXJuaW5nOiBjb3VsZCBub3QgcGFyc2UgZ2l0IGNvdW50LCBvdXRwdXQgd2FzICVzIiAlIG91dHB1dCkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnV2FybmluZzogQ291bGQgbm90IHBhcnNlIGdpdCBjb3VudCwgb3V0cHV0IHdhcyB7fScuZm9ybWF0KG51bWJlciksCisgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCiAgICAgcmV0dXJuIE5vbmUKIAogCkBAIC01OTQsOCArNjA4LDcgQEAKICAgICAgICAgICAgIFJld3JpdGVQYXRoU2VwYXJhdG9yKG8sIHdvcmtzcGFjZSkKICAgICAgICAgICAgIGZvciBvIGluIG1hdGNoLmdyb3VwKDEpLnNwbGl0KCcgJykKICAgICAgICAgXQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIE5vbmUKIAogCiBkZWYgUGFyc2VUZXN0T3B0aW9uc011bHRpcGxlKHBhdHRlcm4sIHNvdXJjZSwgd29ya3NwYWNlKToKQEAgLTYxMCw1MiArNjIzLDM2IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoW10pCiAgICAgICAgIHJldHVybiByZXN1bHQKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBOb25lCiAKIAogZGVmIERhZW1vbml6ZSgpOgogICAgICIiIgotICBDcmVhdGUgYSBkZXRhY2hlZCBiYWNrZ3JvdW5kIHByb2Nlc3MgKGRhZW1vbikuIFJldHVybnMgVHJ1ZSBmb3IKLSAgdGhlIGRhZW1vbiwgRmFsc2UgZm9yIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAgU2VlOiBodHRwOi8vd3d3LmZhcXMub3JnL2ZhcXMvdW5peC1mYXEvcHJvZ3JhbW1lci9mYXEvCi0gICIxLjcgSG93IGRvIEkgZ2V0IG15IHByb2dyYW0gdG8gYWN0IGxpa2UgYSBkYWVtb24/IgotICAiIiIKKyAgICBDcmVhdGUgYSBkZXRhY2hlZCBiYWNrZ3JvdW5kIHByb2Nlc3MgKGRhZW1vbikuIFJldHVybnMgVHJ1ZSBmb3IKKyAgICB0aGUgZGFlbW9uLCBGYWxzZSBmb3IgdGhlIHBhcmVudCBwcm9jZXNzLgorICAgIFNlZTogaHR0cDovL3d3dy5mYXFzLm9yZy9mYXFzL3VuaXgtZmFxL3Byb2dyYW1tZXIvZmFxLworICAgICIxLjcgSG93IGRvIEkgZ2V0IG15IHByb2dyYW0gdG8gYWN0IGxpa2UgYSBkYWVtb24/IgorICAgICIiIgogICAgIGlmIG9zLmZvcmsoKSA+IDA6CiAgICAgICAgIHJldHVybiBGYWxzZQogICAgIG9zLnNldHNpZCgpCiAgICAgaWYgb3MuZm9yaygpID4gMDoKICAgICAgICAgZXhpdCgwKQorICAgICAgICAjIFRPRE86IFdoYXQgaXMgdGhpcyBzdXBwb3NlZCB0byBkbz8gRGlkbid0IHdlIGFscmVhZHkgZXhpdD8KICAgICAgICAgcmFpc2UKICAgICByZXR1cm4gVHJ1ZQogCiAKLWRlZiBQcmludEVycm9yKHN0cmluZyk6Ci0gICAgIiIiV3JpdGVzIGFuZCBmbHVzaGVzIGEgc3RyaW5nIHRvIHN0ZGVyci4iIiIKLSAgICBzeXMuc3RkZXJyLndyaXRlKHN0cmluZykKLSAgICBzeXMuc3RkZXJyLndyaXRlKCdcbicpCi0KLQogZGVmIENoZWNrZWRVbmxpbmsobmFtZSk6CiAgICAgIiIiVW5saW5rIGEgZmlsZSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4iIiIKICAgICB0cnk6CiAgICAgICAgIG9zLnVubGluayhuYW1lKQogICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgIFByaW50RXJyb3IoIm9zLnVubGluaygpICIgKyBzdHIoZSkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ29zLnVubGluaygpICcgKyBzdHIoZSkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKIAogCi1kZWYgTWFpbigpOgotICAgIHByaW50KCJHdWVzc09TKCkgLT4gIiwgR3Vlc3NPUygpKQotICAgIHByaW50KCJHdWVzc0FyY2hpdGVjdHVyZSgpIC0+ICIsIEd1ZXNzQXJjaGl0ZWN0dXJlKCkpCi0gICAgcHJpbnQoIkd1ZXNzQ3B1cygpIC0+ICIsIEd1ZXNzQ3B1cygpKQotICAgIHByaW50KCJJc1dpbmRvd3MoKSAtPiAiLCBJc1dpbmRvd3MoKSkKLSAgICBwcmludCgiR3Vlc3NWaXN1YWxTdHVkaW9QYXRoKCkgLT4gIiwgR3Vlc3NWaXN1YWxTdHVkaW9QYXRoKCkpCi0gICAgcHJpbnQoIkdldEdpdFJldmlzaW9uKCkgLT4gIiwgR2V0R2l0UmV2aXNpb24oKSkKLSAgICBwcmludCgiR2V0R2l0VGltZXN0YW1wKCkgLT4gIiwgR2V0R2l0VGltZXN0YW1wKCkpCi0gICAgcHJpbnQoIkdldFZlcnNpb25GaWxlQ29udGVudCgpIC0+ICIsIEdldFZlcnNpb25GaWxlQ29udGVudCgpKQotICAgIHByaW50KCJHZXRHaXROdW1iZXIoKSAtPiAiLCBHZXRHaXROdW1iZXIoKSkKLQotCisjIFRPRE8oNDI1MjgpOiBDYW4gd2UgcmVtb3ZlIHRoaXM/IEl0J3MgYmFzaWNhbGx5IGp1c3QgYW4gYWxpYXMgZm9yIEV4Y2VwdGlvbi4KIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAgcGFzcwogCkBAIC02NzMsMTQgKzY3MCwxNCBAQAogZGVmIElzQ3Jhc2hFeGl0Q29kZShleGl0X2NvZGUpOgogICAgIGlmIElzV2luZG93cygpOgogICAgICAgICByZXR1cm4gMHg4MDAwMDAwMCAmIGV4aXRfY29kZQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBleGl0X2NvZGUgPCAwCisgICAgcmV0dXJuIGV4aXRfY29kZSA8IDAKIAogCiBkZWYgRGlhZ25vc2VFeGl0Q29kZShleGl0X2NvZGUsIGNvbW1hbmQpOgogICAgIGlmIElzQ3Jhc2hFeGl0Q29kZShleGl0X2NvZGUpOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdDb21tYW5kOiAlc1xuQ1JBU0hFRCB3aXRoIGV4aXQgY29kZSAlZCAoMHgleClcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICgnICcuam9pbihjb21tYW5kKSwgZXhpdF9jb2RlLCBleGl0X2NvZGUgJiAweGZmZmZmZmZmKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAgICdDb21tYW5kOiB7fVxuQ1JBU0hFRCB3aXRoIGV4aXQgY29kZSB7fSAoMHh7Onh9KVxuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgJyAnLmpvaW4oY29tbWFuZCksIGV4aXRfY29kZSwgZXhpdF9jb2RlICYgMHhmZmZmZmZmZikpCiAKIAogZGVmIFRvdWNoKG5hbWUpOgpAQCAtNjkxLDggKzY4OCwxMCBAQAogZGVmIEV4ZWN1dGVDb21tYW5kKGNtZCk6CiAgICAgIiIiRXhlY3V0ZSBhIGNvbW1hbmQgaW4gYSBzdWJwcm9jZXNzLiIiIgogICAgIHByaW50KCdFeGVjdXRpbmc6ICcgKyAnICcuam9pbihjbWQpKQotICAgIHBpcGUgPSBzdWJwcm9jZXNzLlBvcGVuKAotICAgICAgICBjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIHNoZWxsPUlzV2luZG93cygpKQorICAgIHBpcGUgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGw9SXNXaW5kb3dzKCkpCiAgICAgb3V0cHV0ID0gcGlwZS5jb21tdW5pY2F0ZSgpCiAgICAgaWYgcGlwZS5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignRXhlY3V0aW9uIGZhaWxlZDogJyArIHN0cihvdXRwdXQpKQpAQCAtNzA5LDcgKzcwOCw4IEBACiAgICAgdHJ5OgogICAgICAgICBvc25hbWUgPSBvc2RpY3Rbc3lzdGVtXQogICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnV0FSTklORzogcGxhdGZvcm0gIiVzIiBub3Qgc3VwcG9ydGVkXG4nICUgc3lzdGVtKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAgICAgJ1dBUk5JTkc6IHBsYXRmb3JtICJ7fSIgbm90IHN1cHBvcnRlZFxuJy5mb3JtYXQoc3lzdGVtKSkKICAgICAgICAgcmV0dXJuIE5vbmUKICAgICB0b29sc19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCiAgICAgcmV0dXJuIG9zLnBhdGguam9pbih0b29sc19kaXIsICdzZGtzJywgJ2RhcnQtc2RrJykKQEAgLTc0OSw5ICs3NDksOCBAQAogICAgICAgICAgICAgZm9ybWF0KGNvcmVfcGF0dGVybl9maWxlLCBleHBlY3RlZF9jb3JlX3BhdHRlcm4sIGNvcmVfcGF0dGVybikpCiAgICAgICAgIGlmIGZhdGFsOgogICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKG1lc3NhZ2UpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludChtZXNzYWdlKQotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHByaW50KG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCiAKIApAQCAtNzc2LDExICs3NzUsMTEgQEAKIAogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHNlbGYuX29sZF9jd2QgPSBvcy5nZXRjd2QoKQotICAgICAgICBwcmludCgiRW50ZXIgZGlyZWN0b3J5ID0gIiwgc2VsZi5fd29ya2luZ19kaXJlY3RvcnkpCisgICAgICAgIHByaW50KCdFbnRlciBkaXJlY3RvcnkgPSAnLCBzZWxmLl93b3JraW5nX2RpcmVjdG9yeSkKICAgICAgICAgb3MuY2hkaXIoc2VsZi5fd29ya2luZ19kaXJlY3RvcnkpCiAKICAgICBkZWYgX19leGl0X18oc2VsZiwgKl8pOgotICAgICAgICBwcmludCgiRW50ZXIgZGlyZWN0b3J5ID0gIiwgc2VsZi5fb2xkX2N3ZCkKKyAgICAgICAgcHJpbnQoJ0VudGVyIGRpcmVjdG9yeSA9ICcsIHNlbGYuX29sZF9jd2QpCiAgICAgICAgIG9zLmNoZGlyKHNlbGYuX29sZF9jd2QpCiAKIApAQCAtNzkyLDggKzc5MSw4IEBACiAgICAgICAgIHNlbGYuYmluYXJpZXMgPSBiaW5hcmllcwogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiQ3Jhc2goJXM6ICVzICVzKSIgJSAoc2VsZi50ZXN0LCBzZWxmLnBpZCwgJywgJy5qb2luKAotICAgICAgICAgICAgc2VsZi5iaW5hcmllcykpCisgICAgICAgIHJldHVybiAnQ3Jhc2goe306IHt9IHt9KScuZm9ybWF0KHNlbGYudGVzdCwgc2VsZi5waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihzZWxmLmJpbmFyaWVzKSkKIAogCiBjbGFzcyBQb3NpeENvcmVEdW1wRW5hYmxlcihvYmplY3QpOgpAQCAtODI0LDE5ICs4MjMsMTkgQEAKIAogY2xhc3MgV2luZG93c0NvcmVEdW1wRW5hYmxlcihvYmplY3QpOgogICAgICIiIlRoaXMgZW5hYmxlciBhc3N1bWVzIHRoYXQgRGFydCBiaW5hcnkgd2FzIGJ1aWx0IHdpdGggQ3Jhc2hwYWQgc3VwcG9ydC4KLSAgSW4gdGhpcyBjYXNlIERBUlRfQ1JBU0hQQURfQ1JBU0hFU19ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxsb3dzIHRvCi0gIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIENyYXNocGFkIGNyYXNoZXMgZGF0YWJhc2UuIEFjdHVhbCBtaW5pZHVtcHMgd2lsbAotICBiZSB3cml0dGVuIGludG8gcmVwb3J0cyBzdWJmb2xkZXIgb2YgdGhlIGRhdGFiYXNlLgotICAiIiIKLSAgICBDUkFTSFBBRF9EQl9GT0xERVIgPSBvcy5wYXRoLmpvaW4oREFSVF9ESVIsIHInY3Jhc2hlcycpCi0gICAgRFVNUFNfRk9MREVSID0gb3MucGF0aC5qb2luKENSQVNIUEFEX0RCX0ZPTERFUiwgcidyZXBvcnRzJykKKyAgICBJbiB0aGlzIGNhc2UgREFSVF9DUkFTSFBBRF9DUkFTSEVTX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbGxvd3MgdG8KKyAgICBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBDcmFzaHBhZCBjcmFzaGVzIGRhdGFiYXNlLiBBY3R1YWwgbWluaWR1bXBzIHdpbGwKKyAgICBiZSB3cml0dGVuIGludG8gcmVwb3J0cyBzdWJmb2xkZXIgb2YgdGhlIGRhdGFiYXNlLgorICAgICIiIgorICAgIENSQVNIUEFEX0RCX0ZPTERFUiA9IG9zLnBhdGguam9pbihEQVJUX0RJUiwgJ2NyYXNoZXMnKQorICAgIERVTVBTX0ZPTERFUiA9IG9zLnBhdGguam9pbihDUkFTSFBBRF9EQl9GT0xERVIsICdyZXBvcnRzJykKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgcGFzcwogCiAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgcHJpbnQoIklORk86IEVuYWJsaW5nIGNvcmVkdW1wIGFyY2hpdmluZyBpbnRvICVzIiAlCi0gICAgICAgICAgICAgIChXaW5kb3dzQ29yZUR1bXBFbmFibGVyLkNSQVNIUEFEX0RCX0ZPTERFUikpCisgICAgICAgIHByaW50KCdJTkZPOiBFbmFibGluZyBjb3JlZHVtcCBhcmNoaXZpbmcgaW50byB7fScuZm9ybWF0KAorICAgICAgICAgICAgV2luZG93c0NvcmVEdW1wRW5hYmxlci5DUkFTSFBBRF9EQl9GT0xERVIpKQogICAgICAgICBvcy5lbnZpcm9uWwogICAgICAgICAgICAgJ0RBUlRfQ1JBU0hQQURfQ1JBU0hFU19ESVInXSA9IFdpbmRvd3NDb3JlRHVtcEVuYWJsZXIuQ1JBU0hQQURfREJfRk9MREVSCiAKQEAgLTg0OCwxOCArODQ3LDE4IEBACiAgICAgdHJ5OgogICAgICAgICBvcy51bmxpbmsoZmlsZSkKICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycm9yOgotICAgICAgICBwcmludCgiRVJST1I6IEZhaWxlZCB0byByZW1vdmUgJXM6ICVzIiAlIChmaWxlLCBlcnJvcikpCisgICAgICAgIHByaW50KCdFUlJPUjogRmFpbGVkIHRvIHJlbW92ZSB7fToge30nLmZvcm1hdChmaWxlLCBlcnJvcikpCiAKIAogY2xhc3MgQmFzZUNvcmVEdW1wQXJjaGl2ZXIob2JqZWN0KToKICAgICAiIiJUaGlzIGNsYXNzIHJlYWRzIGNvcmVkdW1wcyBmaWxlIHdyaXR0ZW4gYnkgVW5leHBlY3RlZENyYXNoRHVtcEFyY2hpdmVyCi0gIGludG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYW5kIHVwbG9hZHMgYWxsIGNvcmVzIGFuZCBiaW5hcmllcwotICBsaXN0ZWQgaW4gaXQgaW50byBDbG91ZCBTdG9yYWdlIChzZWUKLSAgcGtnL3Rlc3RfcnVubmVyL2xpYi9zcmMvdGVzdF9wcm9ncmVzcy5kYXJ0KS4KLSAgIiIiCisgICAgaW50byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgdXBsb2FkcyBhbGwgY29yZXMgYW5kIGJpbmFyaWVzCisgICAgbGlzdGVkIGluIGl0IGludG8gQ2xvdWQgU3RvcmFnZSAoc2VlCisgICAgcGtnL3Rlc3RfcnVubmVyL2xpYi9zcmMvdGVzdF9wcm9ncmVzcy5kYXJ0KS4KKyAgICAiIiIKIAogICAgICMgdGVzdC5kYXJ0IHdpbGwgd3JpdGUgYSBsaW5lIGZvciBlYWNoIHVuZXhwZWN0ZWQgY3Jhc2ggaW50byB0aGlzIGZpbGUuCi0gICAgX1VORVhQRUNURURfQ1JBU0hFU19GSUxFID0gInVuZXhwZWN0ZWQtY3Jhc2hlcyIKKyAgICBfVU5FWFBFQ1RFRF9DUkFTSEVTX0ZJTEUgPSAndW5leHBlY3RlZC1jcmFzaGVzJwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9kaXIsIG91dHB1dF9kaXJlY3RvcnkpOgogICAgICAgICBzZWxmLl9idWNrZXQgPSAnZGFydC10ZW1wLWNyYXNoLWFyY2hpdmUnCkBAIC04NzEsMTUgKzg3MCwxNSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2xlYW51cCgpCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiRVJST1I6IEZhaWx1cmUgZHVyaW5nIGNsZWFudXA6ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgcHJpbnQoJ0VSUk9SOiBGYWlsdXJlIGR1cmluZyBjbGVhbnVwOiB7fScuZm9ybWF0KGVycm9yKSkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogCiAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgcHJpbnQoIklORk86IENvcmUgZHVtcCBhcmNoaXZpbmcgaXMgYWN0aXZhdGVkIikKKyAgICAgICAgcHJpbnQoJ0lORk86IENvcmUgZHVtcCBhcmNoaXZpbmcgaXMgYWN0aXZhdGVkJykKIAogICAgICAgICAjIENsZWFudXAgYW55IHN0YWxlIGZpbGVzCiAgICAgICAgIGlmIHNlbGYuX3NhZmVfY2xlYW51cCgpOgotICAgICAgICAgICAgcHJpbnQoIldBUk5JTkc6IEZvdW5kIGFuZCByZW1vdmVkIHN0YWxlIGNvcmVkdW1wcyIpCisgICAgICAgICAgICBwcmludCgnV0FSTklORzogRm91bmQgYW5kIHJlbW92ZWQgc3RhbGUgY29yZWR1bXBzJykKIAogICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqXyk6CiAgICAgICAgIHRyeToKQEAgLTg4OSwyMiArODg4LDIyIEBACiAgICAgICAgICAgICAgICAgYXJjaGl2ZV9jcmFzaGVzID0gY3Jhc2hlc1s6MTBdCiAgICAgICAgICAgICAgICAgcHJpbnQoJ0FyY2hpdmluZyBjb3JlZHVtcHMgZm9yIGNyYXNoIChpZiBwb3NzaWJsZSk6JykKICAgICAgICAgICAgICAgICBmb3IgY3Jhc2ggaW4gYXJjaGl2ZV9jcmFzaGVzOgotICAgICAgICAgICAgICAgICAgICBwcmludCgnLS0tLT4gJXMnICUgY3Jhc2gpCisgICAgICAgICAgICAgICAgICAgIHByaW50KCctLS0tPiB7fScuZm9ybWF0KGNyYXNoKSkKIAogICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogCiAgICAgICAgICAgICAgICAgc2VsZi5fYXJjaGl2ZShhcmNoaXZlX2NyYXNoZXMpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50KCJJTkZPOiBObyB1bmV4cGVjdGVkIGNyYXNoZXMgcmVjb3JkZWQiKQorICAgICAgICAgICAgICAgIHByaW50KCdJTkZPOiBObyB1bmV4cGVjdGVkIGNyYXNoZXMgcmVjb3JkZWQnKQogICAgICAgICAgICAgICAgIGR1bXBzID0gc2VsZi5fZmluZF9hbGxfY29yZWR1bXBzKCkKICAgICAgICAgICAgICAgICBpZiBkdW1wczoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIklORk86IEhvd2V2ZXIgdGhlcmUgYXJlICVkIGNvcmUgZHVtcHMgZm91bmQiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGR1bXBzKSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ0lORk86IEhvd2V2ZXIgdGhlcmUgYXJlIHt9IGNvcmUgZHVtcHMgZm91bmQnLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkdW1wcykpKQogICAgICAgICAgICAgICAgICAgICBmb3IgZHVtcCBpbiBkdW1wczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJJTkZPOiAgICAgICAgLT4gJXMiICUgZHVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdJTkZPOiAgICAgICAgLT4ge30nLmZvcm1hdChkdW1wKSkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQoKQogICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycm9yOgotICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBGYWlsZWQgdG8gYXJjaGl2ZSBjcmFzaGVzOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIHByaW50KCdFUlJPUjogRmFpbGVkIHRvIGFyY2hpdmUgY3Jhc2hlczoge30nLmZvcm1hdChlcnJvcikpCiAgICAgICAgICAgICByYWlzZQogCiAgICAgICAgIGZpbmFsbHk6CkBAIC05NDcsMTQgKzk0NiwxNiBAQAogICAgICAgICBtaXNzaW5nX2FzX3N0cmluZyA9ICcsICcuam9pbihbc3RyKGMpIGZvciBjIGluIG1pc3NpbmddKQogICAgICAgICBvdGhlcl9maWxlcyA9IGxpc3QoZ2xvYi5nbG9iKG9zLnBhdGguam9pbihzZWxmLl9zZWFyY2hfZGlyLCAnKicpKSkKICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKLSAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBjcmFzaCBkdW1wcyBmb3IgJyVzJyBpbiBzZWFyY2ggZGlyZWN0b3J5ICclcycuXG4iCisgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgY3Jhc2ggZHVtcHMgZm9yICd7fScgaW4gc2VhcmNoIGRpcmVjdG9yeSAne30nLlxuIgogICAgICAgICAgICAgIkV4aXN0aW5nIGZpbGVzIHdoaWNoICpkaWQgbm90KiBtYXRjaCB0aGUgcGF0dGVybiBpbnNpZGUgdGhlIHNlYXJjaCAiCi0gICAgICAgICAgICAiZGlyZWN0b3J5IGFyZSBhcmU6XG4gICVzXG4iICUgKG1pc3NpbmdfYXNfc3RyaW5nLCBzZWxmLl9zZWFyY2hfZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gICcuam9pbihvdGhlcl9maWxlcykpKQorICAgICAgICAgICAgImRpcmVjdG9yeSBhcmUgYXJlOlxuICB7fVxuIi5mb3JtYXQobWlzc2luZ19hc19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWFyY2hfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAnLmpvaW4ob3RoZXJfZmlsZXMpKSkKICAgICAgICAgIyBUT0RPOiBGaWd1cmUgb3V0IHdoeSB3aW5kb3dzIGNvcmVkdW1wIGdlbmVyYXRpb24gZG9lcyBub3Qgd29yay4KICAgICAgICAgIyBTZWUgaHR0cDovL2RhcnRidWcuY29tLzM2NDY5CiAgICAgICAgIGlmIHRocm93IGFuZCBHdWVzc09TKCkgIT0gJ3dpbjMyJzoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignTWlzc2luZyBjcmFzaCBkdW1wcyBmb3I6ICVzJyAlIG1pc3NpbmdfYXNfc3RyaW5nKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICdNaXNzaW5nIGNyYXNoIGR1bXBzIGZvcjoge30nLmZvcm1hdChtaXNzaW5nX2FzX3N0cmluZykpCiAKICAgICBkZWYgX2dldF9maWxlX25hbWUoc2VsZiwgZmlsZSk6CiAgICAgICAgICMgU2FuaXRpemUgdGhlIG5hbWU6IGFjdHVhbCBjb3JlcyBmb2xsb3cgJ2NvcmUuJWQnIHBhdHRlcm4sIGNyYXNoZWQKQEAgLTk3MSw4ICs5NzIsOCBAQAogCiAgICAgZGVmIF9tb3ZlKHNlbGYsIGZpbGVzKToKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBwcmludCgnKysrIE1vdmluZyAlcyB0byBvdXRwdXRfZGlyZWN0b3J5ICglcyknICUKLSAgICAgICAgICAgICAgICAgIChmaWxlLCBzZWxmLl9vdXRwdXRfZGlyZWN0b3J5KSkKKyAgICAgICAgICAgIHByaW50KCcrKysgTW92aW5nIHt9IHRvIG91dHB1dF9kaXJlY3RvcnkgKHt9KScuZm9ybWF0KAorICAgICAgICAgICAgICAgIGZpbGUsIHNlbGYuX291dHB1dF9kaXJlY3RvcnkpKQogICAgICAgICAgICAgKG5hbWUsIGlzX2JpbmFyeSkgPSBzZWxmLl9nZXRfZmlsZV9uYW1lKGZpbGUpCiAgICAgICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbihzZWxmLl9vdXRwdXRfZGlyZWN0b3J5LCBuYW1lKQogICAgICAgICAgICAgc2h1dGlsLm1vdmUoZmlsZSwgZGVzdGluYXRpb24pCkBAIC05ODMsNyArOTg0LDcgQEAKIAogICAgIGRlZiBfdGFyKHNlbGYsIGZpbGUpOgogICAgICAgICAobmFtZSwgaXNfYmluYXJ5KSA9IHNlbGYuX2dldF9maWxlX25hbWUoZmlsZSkKLSAgICAgICAgdGFybmFtZSA9ICclcy50YXIuZ3onICUgbmFtZQorICAgICAgICB0YXJuYW1lID0gJ3t9LnRhci5neicuZm9ybWF0KG5hbWUpCiAKICAgICAgICAgIyBDb21wcmVzcyB0aGUgZmlsZS4KICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIG1vZGU9J3c6Z3onKQpAQCAtOTk3LDIzICs5OTgsMjQgQEAKICAgICBkZWYgX3VwbG9hZChzZWxmLCBmaWxlcyk6CiAgICAgICAgIGJvdF91dGlscyA9IEdldEJvdFV0aWxzKCkKICAgICAgICAgZ3N1dGlsID0gYm90X3V0aWxzLkdTVXRpbCgpCi0gICAgICAgIHN0b3JhZ2VfcGF0aCA9ICclcy8lcy8nICUgKHNlbGYuX2J1Y2tldCwgdXVpZC51dWlkNCgpKQotICAgICAgICBnc19wcmVmaXggPSAnZ3M6Ly8lcycgJSBzdG9yYWdlX3BhdGgKLSAgICAgICAgaHR0cF9wcmVmaXggPSAnaHR0cHM6Ly9zdG9yYWdlLmNsb3VkLmdvb2dsZS5jb20vJXMnICUgc3RvcmFnZV9wYXRoCisgICAgICAgIHN0b3JhZ2VfcGF0aCA9ICd7fS97fS8nLmZvcm1hdChzZWxmLl9idWNrZXQsIHV1aWQudXVpZDQoKSkKKyAgICAgICAgZ3NfcHJlZml4ID0gJ2dzOi8ve30nLmZvcm1hdChzdG9yYWdlX3BhdGgpCisgICAgICAgIGh0dHBfcHJlZml4ID0gJ2h0dHBzOi8vc3RvcmFnZS5jbG91ZC5nb29nbGUuY29tL3t9Jy5mb3JtYXQoc3RvcmFnZV9wYXRoKQogCi0gICAgICAgIHByaW50KCdcbi0tLSBVcGxvYWRpbmcgaW50byAlcyAoJXMpIC0tLScgJSAoZ3NfcHJlZml4LCBodHRwX3ByZWZpeCkpCisgICAgICAgIHByaW50KCdcbi0tLSBVcGxvYWRpbmcgaW50byB7fSAoe30pIC0tLScuZm9ybWF0KGdzX3ByZWZpeCwgaHR0cF9wcmVmaXgpKQogICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKICAgICAgICAgICAgIHRhcm5hbWUgPSBzZWxmLl90YXIoZmlsZSkKIAogICAgICAgICAgICAgIyBSZW1vdmUgLyBmcm9tIGFic29sdXRlIHBhdGggdG8gbm90IGhhdmUgLy8gaW4gZ3MgcGF0aC4KLSAgICAgICAgICAgIGdzX3VybCA9ICclcyVzJyAlIChnc19wcmVmaXgsIHRhcm5hbWUpCi0gICAgICAgICAgICBodHRwX3VybCA9ICclcyVzJyAlIChodHRwX3ByZWZpeCwgdGFybmFtZSkKKyAgICAgICAgICAgIGdzX3VybCA9ICd7fXt9Jy5mb3JtYXQoZ3NfcHJlZml4LCB0YXJuYW1lKQorICAgICAgICAgICAgaHR0cF91cmwgPSAne317fScuZm9ybWF0KGh0dHBfcHJlZml4LCB0YXJuYW1lKQogCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZ3N1dGlsLnVwbG9hZCh0YXJuYW1lLCBnc191cmwpCi0gICAgICAgICAgICAgICAgcHJpbnQoJysrKyBVcGxvYWRlZCAlcyAoJXMpJyAlIChnc191cmwsIGh0dHBfdXJsKSkKKyAgICAgICAgICAgICAgICBwcmludCgnKysrIFVwbG9hZGVkIHt9ICh7fSknLmZvcm1hdChnc191cmwsIGh0dHBfdXJsKSkKICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyb3I6Ci0gICAgICAgICAgICAgICAgcHJpbnQoJyEhISBGYWlsZWQgdG8gdXBsb2FkICVzLCBlcnJvcjogJXMnICUgKHRhcm5hbWUsIGVycm9yKSkKKyAgICAgICAgICAgICAgICBwcmludCgnISEhIEZhaWxlZCB0byB1cGxvYWQge30sIGVycm9yOiB7fScuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICB0YXJuYW1lLCBlcnJvcikpCiAKICAgICAgICAgICAgIFRyeVVubGluayh0YXJuYW1lKQogCkBAIC0xMDIxLDE1ICsxMDIzLDE1IEBACiAKICAgICBkZWYgX2ZpbmRfYWxsX2NvcmVkdW1wcyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGNvcmVkdW1wcyB0aGF0IHdlcmUgcmVjb3JkZWQgKGlmIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0pLgotICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgb3ZlcnJpZGVuIGJ5IGNvbmNyZXRlIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucy4KLSAgICAiIiIKKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBvdmVycmlkZW4gYnkgY29uY3JldGUgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIFtdCiAKICAgICBkZWYgX2ZpbmRfdW5leHBlY3RlZF9jcmFzaGVzKHNlbGYpOgogICAgICAgICAiIiJMb2FkIGNvcmVkdW1wcyBmaWxlLiBFYWNoIGxpbmUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogCiAgICAgICAgIHRlc3QtbmFtZSxwaWQsYmluYXJ5LWZpbGUxLGJpbmFyeS1maWxlMiwuLi4KLSAgICAiIiIKKyAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggb3BlbihCYXNlQ29yZUR1bXBBcmNoaXZlci5fVU5FWFBFQ1RFRF9DUkFTSEVTX0ZJTEUpIGFzIGY6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFsKQEAgLTEwNjUsNyArMTA2Nyw4IEBACiAgICAgICAgIHJldHVybiBmb3VuZAogCiAgICAgZGVmIF9maW5kX2NvcmVkdW1wX2ZpbGUoc2VsZiwgY3Jhc2gpOgotICAgICAgICBjb3JlX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX3NlYXJjaF9kaXIsICdjb3JlLiVzJyAlIGNyYXNoLnBpZCkKKyAgICAgICAgY29yZV9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9zZWFyY2hfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlLnt9Jy5mb3JtYXQoY3Jhc2gucGlkKSkKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29yZV9maWxlbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gY29yZV9maWxlbmFtZQogCkBAIC0xMDk3LDcgKzExMDAsNyBAQAogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMod2luX3Rvb2xjaGFpbl9qc29uX3BhdGgpOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAotICAgICAgICB3aXRoIG9wZW4od2luX3Rvb2xjaGFpbl9qc29uX3BhdGgsICJyIikgYXMgZjoKKyAgICAgICAgd2l0aCBvcGVuKHdpbl90b29sY2hhaW5fanNvbl9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICB3aW5fdG9vbGNoYWluX2luZm8gPSBqc29uLmxvYWRzKGYucmVhZCgpKQogCiAgICAgICAgIHdpbl9zZGtfcGF0aCA9IHdpbl90b29sY2hhaW5faW5mb1snd2luX3NkayddCkBAIC0xMTI0LDMyICsxMTI3LDMyIEBACiAgICAgICAgIGlmIG5vdCBkdW1wczoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIHByaW50KCIjIyMgQ29sbGVjdGVkICVkIGNyYXNoIGR1bXBzIiAlIGxlbihkdW1wcykpCisgICAgICAgIHByaW50KCcjIyMgQ29sbGVjdGVkIHt9IGNyYXNoIGR1bXBzJy5mb3JtYXQobGVuKGR1bXBzKSkpCiAgICAgICAgIGZvciBkdW1wIGluIGR1bXBzOgogICAgICAgICAgICAgcHJpbnQoKQotICAgICAgICAgICAgcHJpbnQoIiMjIyBEdW1waW5nIHN0YWNrcyBmcm9tICVzIHVzaW5nIENEQiIgJSBkdW1wKQorICAgICAgICAgICAgcHJpbnQoJyMjIyBEdW1waW5nIHN0YWNrcyBmcm9tIHt9IHVzaW5nIENEQicuZm9ybWF0KGR1bXApKQogICAgICAgICAgICAgY2RiX291dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAotICAgICAgICAgICAgICAgICciJXMiIC16ICIlcyIgLWtxbSAtYyAiIXVuaXFzdGFjayAtYiAtdiAtcDtxZCInICUgKGNkYl9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXApLAorICAgICAgICAgICAgICAgICcie30iIC16ICJ7fSIgLWtxbSAtYyAiIXVuaXFzdGFjayAtYiAtdiAtcDtxZCInLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgY2RiX3BhdGgsIGR1bXApLAogICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKICAgICAgICAgICAgICMgRXh0cmFjdCBvdXRwdXQgb2YgdW5pcXN0YWNrIGZyb20gdGhlIHdob2xlIG91dHB1dCBvZiBDREIuCiAgICAgICAgICAgICBvdXRwdXQgPSBGYWxzZQogICAgICAgICAgICAgZm9yIGxpbmUgaW4gY2RiX291dHB1dC5zcGxpdCgnXG4nKToKICAgICAgICAgICAgICAgICBpZiByZS5tYXRjaChXaW5kb3dzQ29yZUR1bXBBcmNoaXZlci5DREJHX1BST01QVF9SRSwgbGluZSk6CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IFRydWUKLSAgICAgICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgicXVpdDoiKToKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmUuc3RhcnRzd2l0aCgncXVpdDonKToKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBlbGlmIG91dHB1dDoKICAgICAgICAgICAgICAgICAgICAgcHJpbnQobGluZSkKICAgICAgICAgcHJpbnQoKQotICAgICAgICBwcmludCgiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIikKKyAgICAgICAgcHJpbnQoJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycpCiAgICAgICAgIHByaW50KCkKIAogICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuX2R1bXBfYWxsX3N0YWNrcygpCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiRVJST1I6IFVuYWJsZSB0byBkdW1wIHN0YWNrcyBmcm9tIGR1bXBzOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIHByaW50KCdFUlJPUjogVW5hYmxlIHRvIGR1bXAgc3RhY2tzIGZyb20gZHVtcHM6IHt9Jy5mb3JtYXQoZXJyb3IpKQogCiAgICAgICAgIHN1cGVyKFdpbmRvd3NDb3JlRHVtcEFyY2hpdmVyLCBzZWxmKS5fX2V4aXRfXygqYXJncykKIApAQCAtMTE4Nyw3ICsxMTkwLDggQEAKIAogICAgICAgICBpZiB0aHJvdzoKICAgICAgICAgICAgIG1pc3NpbmdfYXNfc3RyaW5nID0gJywgJy5qb2luKFtzdHIoYykgZm9yIGMgaW4gbWlzc2luZ10pCi0gICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ01pc3NpbmcgY3Jhc2ggZHVtcHMgZm9yOiAlcycgJSBtaXNzaW5nX2FzX3N0cmluZykKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnTWlzc2luZyBjcmFzaCBkdW1wcyBmb3I6IHt9Jy5mb3JtYXQobWlzc2luZ19hc19zdHJpbmcpKQogCiAKIGNsYXNzIEluY3JlYXNlZE51bWJlck9mRmlsZURlc2NyaXB0b3JzKG9iamVjdCk6CkBAIC0xMjI4LDIxICsxMjMyLDMyIEBACiAgICAgZWxpZiBvc25hbWUgPT0gJ3dpbjMyJzoKICAgICAgICAgcmV0dXJuIGNvbnRleHRsaWIubmVzdGVkKFdpbmRvd3NDb3JlRHVtcEVuYWJsZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NDb3JlRHVtcEFyY2hpdmVyKG91dHB1dF9kaXJlY3RvcnkpKQotICAgIGVsc2U6Ci0gICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciBNYWNPUyB5ZXQuCi0gICAgICAgIHJldHVybiBOb29wdENvbnRleHRNYW5hZ2VyKCkKKworICAgICMgV2UgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciBNYWNPUyB5ZXQuCisgICAgcmV0dXJuIE5vb3B0Q29udGV4dE1hbmFnZXIoKQogCiAKIGRlZiBGaWxlRGVzY3JpcHRvckxpbWl0SW5jcmVhc2VyKCk6CiAgICAgb3NuYW1lID0gR3Vlc3NPUygpCiAgICAgaWYgb3NuYW1lID09ICdtYWNvcyc6CiAgICAgICAgIHJldHVybiBJbmNyZWFzZWROdW1iZXJPZkZpbGVEZXNjcmlwdG9ycyhub2ZpbGVzPTEwMDAwKQotICAgIGVsc2U6Ci0gICAgICAgIGFzc2VydCBvc25hbWUgaW4gKCdsaW51eCcsICd3aW4zMicpCi0gICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciBNYWNPUyB5ZXQuCi0gICAgICAgIHJldHVybiBOb29wdENvbnRleHRNYW5hZ2VyKCkKKworICAgIGFzc2VydCBvc25hbWUgaW4gKCdsaW51eCcsICd3aW4zMicpCisgICAgIyBXZSBkb24ndCBoYXZlIHN1cHBvcnQgZm9yIE1hY09TIHlldC4KKyAgICByZXR1cm4gTm9vcHRDb250ZXh0TWFuYWdlcigpCiAKIAotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBpbXBvcnQgc3lzCitkZWYgTWFpbigpOgorICAgIHByaW50KCdHdWVzc09TKCkgLT4gJywgR3Vlc3NPUygpKQorICAgIHByaW50KCdHdWVzc0FyY2hpdGVjdHVyZSgpIC0+ICcsIEd1ZXNzQXJjaGl0ZWN0dXJlKCkpCisgICAgcHJpbnQoJ0d1ZXNzQ3B1cygpIC0+ICcsIEd1ZXNzQ3B1cygpKQorICAgIHByaW50KCdJc1dpbmRvd3MoKSAtPiAnLCBJc1dpbmRvd3MoKSkKKyAgICBwcmludCgnR3Vlc3NWaXN1YWxTdHVkaW9QYXRoKCkgLT4gJywgR3Vlc3NWaXN1YWxTdHVkaW9QYXRoKCkpCisgICAgcHJpbnQoJ0dldEdpdFJldmlzaW9uKCkgLT4gJywgR2V0R2l0UmV2aXNpb24oKSkKKyAgICBwcmludCgnR2V0R2l0VGltZXN0YW1wKCkgLT4gJywgR2V0R2l0VGltZXN0YW1wKCkpCisgICAgcHJpbnQoJ0dldFZlcnNpb25GaWxlQ29udGVudCgpIC0+ICcsIEdldFZlcnNpb25GaWxlQ29udGVudCgpKQorICAgIHByaW50KCdHZXRHaXROdW1iZXIoKSAtPiAnLCBHZXRHaXROdW1iZXIoKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIE1haW4oKQpkaWZmIC0tZ2l0IGEvdXRpbHMvYXBwbGljYXRpb25fc25hcHNob3QuZ25pIGIvdXRpbHMvYXBwbGljYXRpb25fc25hcHNob3QuZ25pCmluZGV4IDEwNzQzMTcuLjhmM2Y4ODIgMTAwNjQ0Ci0tLSBhL3V0aWxzL2FwcGxpY2F0aW9uX3NuYXBzaG90LmduaQorKysgYi91dGlscy9hcHBsaWNhdGlvbl9zbmFwc2hvdC5nbmkKQEAgLTk4LDkgKzk4LDExIEBACiAgICAgZGVwZmlsZSA9ICIkb3V0cHV0LmQiCiAgICAgYWJzX2RlcGZpbGUgPSByZWJhc2VfcGF0aChkZXBmaWxlKQogICAgIHJlYmFzZWRfb3V0cHV0ID0gcmViYXNlX3BhdGgob3V0cHV0LCByb290X2J1aWxkX2RpcikKKwogICAgIHZtX2FyZ3MgPSBbCiAgICAgICAiLS1kZXBmaWxlPSRhYnNfZGVwZmlsZSIsCiAgICAgICAiLS1kZXBmaWxlX291dHB1dF9maWxlbmFtZT0kcmViYXNlZF9vdXRwdXQiLAorICAgICAgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiwKICAgICBdCiAKICAgICBzY3JpcHQgPSBnZW5fa2VybmVsX3NjcmlwdApkaWZmIC0tZ2l0IGEvdXRpbHMvY29tcGlsZV9wbGF0Zm9ybS5nbmkgYi91dGlscy9jb21waWxlX3BsYXRmb3JtLmduaQppbmRleCBhMmU5NGIzLi40NDdlZDY0IDEwMDY0NAotLS0gYS91dGlscy9jb21waWxlX3BsYXRmb3JtLmduaQorKysgYi91dGlscy9jb21waWxlX3BsYXRmb3JtLmduaQpAQCAtMyw2ICszLDcgQEAKICMgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogaW1wb3J0KCIuLi9idWlsZC9kYXJ0L2RhcnRfYWN0aW9uLmduaSIpCitpbXBvcnQoIi4uL3Nka19hcmdzLmduaSIpCiAKIF9kYXJ0X3Jvb3QgPSBnZXRfcGF0aF9pbmZvKCIuLiIsICJhYnNwYXRoIikKIApAQCAtNDYsNiArNDcsOCBAQAogCiAgICAgb3V0cHV0cyA9IGludm9rZXIub3V0cHV0cwogCisgICAgdm1fYXJncyA9IFsgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiBdCisKICAgICBpbnB1dHMgPSBbXQogICAgIGRlcHMgPSBbXQogICAgIGFyZ3MgPSBbXQpkaWZmIC0tZ2l0IGEvdXRpbHMvZGFydGFuYWx5emVyL0JVSUxELmduIGIvdXRpbHMvZGFydGFuYWx5emVyL0JVSUxELmduCmluZGV4IGYxZDliMDEuLjQ4YzlkY2YgMTAwNjQ0Ci0tLSBhL3V0aWxzL2RhcnRhbmFseXplci9CVUlMRC5nbgorKysgYi91dGlscy9kYXJ0YW5hbHl6ZXIvQlVJTEQuZ24KQEAgLTQ0LDYgKzQ0LDcgQEAKICAgaW5wdXRzID0gc2RrX2xpYl9maWxlcyArIGFuYWx5emVyX2ZpbGVzCiAgIG91dHB1dCA9ICIkcm9vdF9nZW5fZGlyL3N0cm9uZy5zdW0iCiAgIG91dHB1dHMgPSBbIG91dHB1dCBdCisgIHZtX2FyZ3MgPSBbICItRHNka19oYXNoPSRzZGtfaGFzaCIgXQogICBhcmdzID0gWwogICAgICJidWlsZCIsCiAgICAgcmViYXNlX3BhdGgob3V0cHV0KSwKZGlmZiAtLWdpdCBhL3V0aWxzL2RhcnRkZXZjL0JVSUxELmduIGIvdXRpbHMvZGFydGRldmMvQlVJTEQuZ24KaW5kZXggMTViZmUxNi4uYzlmZjY1NSAxMDA2NDQKLS0tIGEvdXRpbHMvZGFydGRldmMvQlVJTEQuZ24KKysrIGIvdXRpbHMvZGFydGRldmMvQlVJTEQuZ24KQEAgLTgyLDYgKzgyLDggQEAKIAogICAgIHBhY2thZ2VzID0gIi4uLy4uLy5wYWNrYWdlcyIKIAorICAgIHZtX2FyZ3MgPSBbICItRHNka19oYXNoPSRzZGtfaGFzaCIgXQorCiAgICAgYXJncyA9IFsKICAgICAgICIkYWJzX21haW4iLAogICAgICAgIi1tIiwKQEAgLTExOCw2ICsxMjAsOCBAQAogICAjIFRPRE8ocm55c3Ryb20pOiBMaXN0IHRoZSBvdXRwdXRzIG1vcmUgcHJlY2lzZWx5PwogICBvdXRwdXRzID0gWyAiJHBhdGNoZWRfc2RrX2Rpci92ZXJzaW9uIiBdCiAKKyAgdm1fYXJncyA9IFsgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiBdCisKICAgYXJncyA9IFsKICAgICAiLS1saWJyYXJpZXMiLAogICAgIHJlYmFzZV9wYXRoKCIkc2RrX3Jvb3QvbGliL2xpYnJhcmllcy5qc29uIiksCkBAIC0yMzAsNiArMjM0LDggQEAKICAgICAgICIkanNfZ2VuX2Rpci8kbW9kdWxlLmpzIiwKICAgICBdCiAKKyAgICB2bV9hcmdzID0gWyAiLURzZGtfaGFzaD0kc2RrX2hhc2giIF0KKwogICAgIGFyZ3MgPSBbCiAgICAgICAiLWsiLAogICAgICAgIi0tZGFydC1zZGstc3VtbWFyeT0kc2RrX3BhdGgiLApAQCAtMzg0LDYgKzM5MCw4IEBACiAgICAgICAiJGpzX2dlbl9kaXIvbGVnYWN5L2RhcnRfc2RrLmpzLm1hcCIsCiAgICAgXQogCisgICAgdm1fYXJncyA9IFsgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiBdCisKICAgICBzY3JpcHQgPSAiLi4vLi4vcGtnL2Rldl9jb21waWxlci9iaW4vZGFydGRldmMuZGFydCIKIAogICAgIGFyZ3MgPSBbCmRpZmYgLS1naXQgYS91dGlscy9rZXJuZWwtc2VydmljZS9CVUlMRC5nbiBiL3V0aWxzL2tlcm5lbC1zZXJ2aWNlL0JVSUxELmduCmluZGV4IDA2MmMzZmYuLmEwMWJiMWIgMTAwNjQ0Ci0tLSBhL3V0aWxzL2tlcm5lbC1zZXJ2aWNlL0JVSUxELmduCisrKyBiL3V0aWxzL2tlcm5lbC1zZXJ2aWNlL0JVSUxELmduCkBAIC04NSw5ICs4NSwxMSBAQAogICAgIGRlcGZpbGUgPSAiJHJvb3RfZ2VuX2Rpci9rZXJuZWxfc2VydmljZSIgKyBpbnZva2VyLnRhcmdldF9uYW1lICsgIl9kaWxsLmQiCiAgICAgYWJzX2RlcGZpbGUgPSByZWJhc2VfcGF0aChkZXBmaWxlKQogICAgIHJlYmFzZWRfb3V0cHV0ID0gcmViYXNlX3BhdGgob3V0cHV0LCByb290X2J1aWxkX2RpcikKKwogICAgIHZtX2FyZ3MgPSBbCiAgICAgICAiLS1kZXBmaWxlPSRhYnNfZGVwZmlsZSIsCiAgICAgICAiLS1kZXBmaWxlX291dHB1dF9maWxlbmFtZT0kcmViYXNlZF9vdXRwdXQiLAorICAgICAgIi1Ec2RrX2hhc2g9JHNka19oYXNoIiwKICAgICBdCiAKICAgICBzY3JpcHQgPSBnZW5fa2VybmVsX3NjcmlwdAo=