Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_JAVBUS影片预告@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBKQVZCVVPlvbHniYfpooTlkYoKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjgKLy8gQGRlc2NyaXB0aW9uICBKQVZCVVPoh6rliqjmmL7npLrpooTlkYrniYcKLy8gQGF1dGhvciAgICAgICBBOQovLyBAc3VwcG9ydFVSTCAgIGh0dHBzOi8vc2xlYXp5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80NTA3NDAvZmVlZGJhY2sKLy8gQHNvdXJjZSAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYmlnd29sZjk5ODcvSmF2QnVzVHJhaWxlcgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LmphdmJ1cy5jb20vCi8vIEBpbmNsdWRlICAgICAgL15odHRwcz86XC9cLyg/OltBLVphLXowLTldK1wuKSooPzpqYXZidXN8YnVzamF2fGJ1c2ZhbnxmYW5idXN8YnVzY2RufGNkbmJ1c3xkbW1zZWV8c2VlZG1tfGJ1c2RtbXxkbW1idXN8amF2c2VlfHNlZWphdil7MX0oPzpcLltBLVphLXowLTldKyk/XC9bXHdfLV17MSx9XC8/JC8KLy8gQGV4Y2x1ZGUgICAgICAvXmh0dHBzPzpcL1wvKD86W0EtWmEtejAtOV0rXC4pKig/OmphdmJ1c3xidXNqYXZ8YnVzZmFufGZhbmJ1c3xidXNjZG58Y2RuYnVzfGRtbXNlZXxzZWVkbW18YnVzZG1tfGRtbWJ1c3xqYXZzZWV8c2VlamF2KXsxfSg/OlwuW0EtWmEtejAtOV0rKT9cLyg/OmZvcnVtfGFjdHJlc3Nlc3x1bmNlbnNvcmVkfGdlbnJlfHNlcmllc3xzdHVkaW98cGFnZSl7MSx9XC8/XFMqJC8KLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgR01fZ2V0UmVzb3VyY2VUZXh0Ci8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBjb25uZWN0ICAgICAgcjE4LmNvbQovLyBAY29ubmVjdCAgICAgIGRtbS5jby5qcAovLyBAY29ubmVjdCAgICAgIGphdmRiLmNvbQovLyBAY29ubmVjdCAgICAgIG1nc3RhZ2UuY29tCi8vIEBjb25uZWN0ICAgICAgcHJlc3RpZ2UtYXYuY29tCi8vIEBjb25uZWN0ICAgICAgamF2c3B5bC5ldS5vcmcKLy8gQGNvbm5lY3QgICAgICBoZXl6by5jb20KLy8gQGNvbm5lY3QgICAgICBhdmZhbnRhc3kuY29tCi8vIEBjb25uZWN0ICAgICAgdG9reW8taG90LmNvbQovLyBAY29ubmVjdCAgICAgIGNhcmliYmVhbmNvbS5jb20KLy8gQGNvbm5lY3QgICAgICBhdmVudGVydGFpbm1lbnRzLmNvbQovLyBAY29ubmVjdCAgICAgIDEwbXVzdW1lLmNvbQovLyBAY29ubmVjdCAgICAgIHBhY29wYWNvbWFtYS5jb20KLy8gQGNvbm5lY3QgICAgICAxcG9uZG8udHYKLy8gQGNvbm5lY3QgICAgICBjbG91ZGZyb250Lm5ldAovLyBAY29ubmVjdCAgICAgIHdvcmtlcnMuZGV2Ci8vIEBjb25uZWN0ICAgICAgc3VwYWJhc2UuY28KLy8gQGNvbm5lY3QgICAgICB4Y2l0eS5qcAovLyBAY29ubmVjdCAgICAgIG9ib3guanAKLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCRkVsRVFWUTRqYTJUTVU0Q1FSU0d2emZ1S2tRMmJxT1JScEtOVjZDaklhR2dvdlFLMUxSczdSMjRBb0VDYnJBSFdFN2dsaFFrSk80U0VndDFHUXNDQmhtRzFmaktlZS8vOHYvelppU0dKK0FaZU9SM2xRQ2h4UER5Qi9FZUlqRm8yOFN1S1NmNmprMHNqb1BYYUhEaCs2eWppRHpMam1hVURhREtaZTc3ZlI0R0F5NXJOYU5WSzJEblFsd1hFWE9JczRCejlmOEFVODVURzRDZlcxQUt2OTNtdWw3bmRUamtmVDRIRVRTZ041c0NBSzI1NlhTNDdYWlJsUXJyS09JcUNNalRsRHhOalU3VW9WNlRUU1o4THBmYzlYb0VveEZ1dFVvNkh2T3hXQmdkSEwxRWNSeThaaE92MVVLVlNyek5abVRUS2ZscVZRd0Eyd09CYlg2dHJaZW8yUDZxUStwM0pxc1lTQlFRbWlBRktnSENMM0krVUlYZURKeW5BQUFBQUVsRlRrU3VRbUNDCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L25wbS92aWRlby5qc0A3LjEwLjIvZGlzdC92aWRlby5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Zhc3RseS5qc2RlbGl2ci5uZXQvbnBtL3ZpZGVvanMtdnJAMS4xMC4xL2Rpc3QvdmlkZW9qcy12ci5taW4uanMKLy8gQHJlc291cmNlICAgICB2aWRlby1qcy1jc3MgaHR0cHM6Ly9mYXN0bHkuanNkZWxpdnIubmV0L25wbS92aWRlby5qc0A3LjEwLjIvZGlzdC92aWRlby1qcy5taW4uY3NzCi8vIEByZXNvdXJjZSAgICAgdmlkZW8tdnItanMtY3NzIGh0dHBzOi8vZmFzdGx5LmpzZGVsaXZyLm5ldC9ucG0vdmlkZW9qcy12ckAxLjEwLjEvZGlzdC92aWRlb2pzLXZyLmNzcwovLyBAbGljZW5zZSAgICAgIE1JVAovLyBAZG93bmxvYWRVUkwgaHR0cHM6Ly91cGRhdGUuc2xlYXp5Zm9yay5vcmcvc2NyaXB0cy80NTA3NDAvSkFWQlVTJUU1JUJEJUIxJUU3JTg5JTg3JUU5JUEyJTg0JUU1JTkxJThBLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3VwZGF0ZS5zbGVhenlmb3JrLm9yZy9zY3JpcHRzLzQ1MDc0MC9KQVZCVVMlRTUlQkQlQjElRTclODklODclRTklQTIlODQlRTUlOTElOEEubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbiAoKSB7CiAgInVzZSBzdHJpY3QiOwogIGxldCBwbGF5ZXIgPSBudWxsOwogIC8v6ISa5pys6K6+572u6aG5CiAgY29uc3Qgc2V0dGluZ3MgPSB7CiAgICBlbmFibGVfdnJfbW9kZTogMSwgLy/mmK/lkKbkvb/nlKhWUuaooeW8j++8jDAg5YWz6Zet77ybMSDlvIDlkK8KICAgIGVuYWJsZV9tdXRlX3BsYXk6IDAsIC8v5piv5ZCm5byA5ZCv6Z2Z6Z+z5pKt5pS+77yMMCDlhbPpl63vvJsxIOW8gOWQryDvvIjms6jvvJrot6jln5/pobXpnaLml6DmlYjvvIzpnIDmiYvliqjmjqfliLbmkq3mlL7kuI7pn7Pph4/vvIkKICAgIHZpZGVvX3BsYXliYWNrX3NwZWVkOiAxLjAsIC8v6KeG6aKR6buY6K6k5pKt5pS+6YCf5bqm77yM5bu66K6u6K6+572u6IyD5Zu0IDAuMjXvvZ4yLjDvvIjms6jvvJrmlbDlgLzotorlpKfmkq3mlL7pgJ/luqbotorlv6vvvIkKICAgIGVuYWJsZV9kZWJ1Z19tb2RlOiAwLAogICAgdmlkZW9fcXVhbGl0eTogNzIwLCAvL+inhumikea4heaZsOW6pizlj6/orr7nva7kuLrkuIvliJflgLzkuYvkuIDvvJoxMDgw77ybNzIw77ybNDgw77ybMzYw77ybMjQw77ybMTQ077yb77yI5rOo77ya5pWw5YC86LaK5aSn6LaK5riF5pmw77yM5omA6ZyA572R57uc5Yqg6L295pe26Ze06LaK6ZW/77yJCiAgfTsKICBjb25zdCBjb3Jwb3JhdGlvbnMgPSB7CiAgICBzdGFyczogWyIxIl0sCiAgICBzdGFyOiBbIjEiXSwKICAgIHN2ZHZkOiBbIjEiXSwKICAgIHNkZGU6IFsiMSJdLAogICAgbW9naTogWyIxIl0sCiAgICBkdmRlczogWyIxIl0sCiAgICBmc2V0OiBbIjEiXSwKICAgIHJjdDogWyIxIl0sCiAgICBhYnA6IFsiMTE4Il0sCiAgICBwcHQ6IFsiMTE4Il0sCiAgICBkdjogWyI1MyJdLAogICAgbWRzOiBbIjg0Il0sCiAgICBndmc6IFsiMTMiXSwKICAgIGhhcnU6IFsiaF82ODciXSwKICAgIHNkbm06IFsiMSJdLAogICAgc2NweDogWyI4NCJdLAogICAgZGxkc3M6IFsiMSJdLAogICAgc3BybzogWyJoXzE1OTQiLCAiMDAiXSwKICAgIHNpbGtjOiBbIjEiLCAiMDAiXSwKICAgIGh6Z2I6IFsiaF8xMTAwIl0sCiAgICBhd2Q6IFsiIl0sCiAgICBkcnB0OiBbIjEiXSwKICAgIGh6OiBbImhfMTEzIl0sCiAgICBweW06IFsiaF8yODMiXSwKICAgIGZvbmU6IFsiaF80OTEiXSwKICAgIHN0Y3Y6IFsiaF8xNjE2IiwgIjAwIl0sCiAgICBmdGh0OiBbIjEiLCAiMDAiXSwKICAgIGFwbnM6IFsiIl0sCiAgICBkdmFqOiBbIiJdLAogICAgdDI4OiBbIjU1Il0sCiAgICBsb2w6IFsiMTIiLCAiMDAiXSwKICAgIHZlbWE6IFsiIl0sCiAgICB2ZW54OiBbIiJdLAogICAgc2ttajogWyJoXzEzMjQiXSwKICAgIGZzdnI6IFsiaF85NTUiLCAiMDAiXSwKICAgIGR0dnI6IFsiMjQiLCAiMDAiXSwKICAgIHB5ZHZyOiBbImhfMTMyMSIsICIwMCJdLAogICAgaG9rczogWyIiXSwKICAgIHNxaXM6IFsiIl0sCiAgICByZWFsOiBbIiJdLAogICAgdXJrazogWyIiXSwKICAgIGJheng6IFsiIl0sCiAgICBtZGJrOiBbIiJdLAogICAgbWR0bTogWyIiXSwKICAgIG1rbXA6IFsiIl0sCiAgICBzYWJhOiBbIiJdLAogICAgc2NvcDogWyIiXSwKICAgIHNwejogWyJoXzI1NCJdLAogICAgdWRhazogWyJoXzI1NCJdLAogICAganVrZjogWyJoXzIyNyJdLAogICAgc2hpbmQ6IFsiaF8xNTYwIiwgIjAwIl0sCiAgICBvdmc6IFsiIl0sCiAgICBzaGg6IFsiMSIsICIwMCJdLAogICAgc2huOiBbIjEiLCAiMDAiXSwKICAgIGRhbmR5OiBbIjEiXSwKICAgIHN3OiBbIjEiXSwKICAgIG1la286IFsiaF8xMTYwIiwgIjAwIl0sCiAgICBhcGFhOiBbIiJdLAogICAgZWtkdjogWyIiXSwKICAgIG5oZHRiOiBbIjEiXSwKICAgIHVtZDogWyIxMjUiXSwKICAgIHNkYWI6IFsiMSJdLAogICAgc2RqczogWyIxIl0sCiAgICBzZG1mOiBbIjEiXSwKICAgIHNkbW06IFsiMSJdLAogICAgc2RtdWE6IFsiMSJdLAogICAgcmViZDogWyJoXzM0NiJdLAogICAgc2R0aDogWyIxIl0sCiAgICBhcmFuOiBbIiJdLAogICAgYWVkOiBbIiJdLAogICAgYW5iOiBbIiJdLAogICAgY212OiBbIiJdLAogICAgcGl5bzogWyIxIl0sCiAgICByY3RkOiBbIjEiXSwKICAgIGZnYW46IFsiaF8xNDQwIiwgIjAwIl0sCiAgICB6ZXg6IFsiaF83MjAiXSwKICAgIGZlcmE6IFsiaF8wODYiLCAiMDAiXSwKICAgIGZ1Z2E6IFsiaF8wODYiLCAiMDAiXSwKICAgIG10YWxsOiBbIjEiLCAiMDAiXSwKICAgIGZzZHNzOiBbIjEiXSwKICAgIG9ma3U6IFsiaF8yNTQiXSwKICAgIG5zZnM6IFsiIiwgIjAwIl0sCiAgICBzZG11OiBbIjEiXSwKICAgIHNpbm46IFsiIl0sCiAgICBoa2Q6IFsiIl0sCiAgICBydmc6IFsiIl0sCiAgICBzY2Q6IFsiIl0sCiAgICBrdHJhOiBbImhfMDk0IiwgIjAwIl0sCiAgICBqcnplOiBbImhfMDg2IiwgIjAwIl0sCiAgICBtZXN1OiBbImhfMDg2IiwgIjAwIl0sCiAgICBha2RsOiBbIjEiLCAiMDAiXSwKICAgIHdvOiBbIjEiXSwKICAgIHN1bjogWyIxIl0sCiAgICBndmg6IFsiIl0sCiAgICB2ZWM6IFsiIl0sCiAgICBnbWE6IFsiIl0sCiAgICBzdXBhOiBbImhfMjQ0Il0sCiAgICBib2JiOiBbIiJdLAogICAgZm9jczogWyIiXSwKICAgIHRwcG46IFsiIl0sCiAgICBhYnc6IFsiMTE4Il0sCiAgICBwa3BkOiBbIiJdLAogICAgYWRuOiBbIiIsICIwMCJdLAogICAgd2tkOiBbIjIiLCAiMDAiXSwKICAgIGFhcm06IFsiIl0sCiAgICBzcXRlOiBbIiJdLAogICAgZmxhdjogWyIiXSwKICAgIGpzb3A6IFsiIl0sCiAgICBiZGE6IFsiIl0sCiAgICB0a2k6IFsiaF8yODYiXSwKICAgIG5hY3I6IFsiaF8yMzciXSwKICAgIGtpcmU6IFsiMSJdLAogICAgZG9jcDogWyIxMTgiXSwKICAgIGprc3I6IFsiNTciXSwKICAgIGhnb3Q6IFsiODQiXSwKICAgIG1jc3I6IFsiNTciXSwKICB9OwogIGNvbnN0IG5lZWRfY29yc19kb21haW4gPSBuZXcgU2V0KFsic21vdmllLjFwb25kby50diIsICJkeTQzeWxvNXEzdnQ4LmNsb3VkZnJvbnQubmV0Il0pOwoKICAvL1N0YXJ0IHJ1bm5pbmcgZnJvbSBoZXJlCiAgY29uc3QgbW92aWVJbmZvID0gZ2V0TW92aWVJbmZvKCk7CiAgaWYgKG1vdmllSW5mbz8ubW92aWVJZCAmJiAhbW92aWVJbmZvPy5pc0V1cm9wZU9yQW1lcmljYSkgewogICAgYWRkUHJldmlld1ZpZGVvU3R5bGUoKTsKICAgIGxvZyhKU09OLnN0cmluZ2lmeShtb3ZpZUluZm8pKTsKICAgIGdldFZpZGVvVVJMKG1vdmllSW5mbykudGhlbigodmlkZW9VUkwpID0+IHsKICAgICAgaWYgKCF2aWRlb1VSTCkgcmV0dXJuOwogICAgICBtb3ZpZUluZm8udmlkZW9VUkwgPSB2aWRlb1VSTDsKICAgICAgLy9TYXZlIHZpZGVvIHVybCB0byBsb2NhbCBzdG9yYWdlIGNhY2hlLgogICAgICBHTV9zZXRWYWx1ZShtb3ZpZUluZm8ubW92aWVJZCwgdmlkZW9VUkwpOwogICAgICBhZGRWaWRlb1BsYXllckVsZW1lbnQobW92aWVJbmZvKTsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogZ2V0IG1vdmllIGluZm8gb2JqZWN0CiAgICogQHJldHVybnMge29iamVjdH0KICAgKi8KICBmdW5jdGlvbiBnZXRNb3ZpZUluZm8oKSB7CiAgICBjb25zdCBpbmZvRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmNvbnRhaW5lciAuaW5mbyIpOwogICAgaWYgKCFpbmZvRG9tKSByZXR1cm47CiAgICBsZXQgbW92aWVJZCA9IGluZm9Eb20uaW5uZXJUZXh0CiAgICAgIC5tYXRjaCgvKD88PSg/OuitmOWIpeeivHzor4bliKvnoIF8SUR85ZOB55WqKTouKVtcd1wtXC5dKy8pCiAgICAgID8uYXQoMCk7CiAgICBsZXQgY29ycE5hbWUgPSBpbmZvRG9tLmlubmVyVGV4dAogICAgICAubWF0Y2goLyg/PD0oPzroo73kvZzllYZ8U3R1ZGlvfOuplOydtOy7pHzjg6Hjg7zjgqvjg7wpOi4pW1x4MjBcU10rLykKICAgICAgPy5hdCgwKQogICAgICA/LnRyaW0oKTsKICAgIGxldCBpc1ZSID0KICAgICAgaW5mb0RvbQogICAgICAgIC5xdWVyeVNlbGVjdG9yKCIjZ2VucmUtdG9nZ2xlIikKICAgICAgICA/LnBhcmVudEVsZW1lbnQ/Lm5leHRFbGVtZW50U2libGluZy5pbm5lclRleHQuc2VhcmNoKAogICAgICAgICAgL+ODj+OCpOOCr+OCquODquODhuOCo1ZSfFZS5bCC55SofOOCq+ODqlZSfFZSLwogICAgICAgICkgPiAtMTsKICAgIGxldCBpc1VuY2Vuc29yZWQgPQogICAgICBkb2N1bWVudAogICAgICAgIC5xdWVyeVNlbGVjdG9yKCIjbmF2YmFyIGxpLmFjdGl2ZSIpCiAgICAgICAgPy5pbm5lclRleHQuc2VhcmNoKC/nhKHnorx8VW5jZW5zb3JlZHznhKHkv67mraN866y07IiY7KCVLykgPiAtMTsKICAgIGxldCBpc0V1cm9wZU9yQW1lcmljYSA9CiAgICAgIGRvY3VtZW50CiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoIiNuYXZiYXIgbGkuYWN0aXZlIikKICAgICAgICA/LmlubmVyVGV4dC5zZWFyY2goL+atkOe+jnxXZXN0ZXJufOWkluWbveS6unzshJzslpHsnZgvKSA+IC0xOwogICAgbGV0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmJpZ0ltYWdlIGltZyIpPy50aXRsZTsKICAgIGxldCB0aHVtYm5haWxVUkwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc2FtcGxlLWJveCIpPy5ocmVmOwogICAgbGV0IHRpdGxlS2V5UGhyYXNlID0gZ2V0S2V5UGhyYXNlKHRpdGxlKTsKICAgIC8vcmV0cnkgZXh0cmFjdAogICAgaWYgKHRpdGxlS2V5UGhyYXNlID09PSB0aXRsZSkgdGl0bGVLZXlQaHJhc2UgPSBnZXRLZXlQaHJhc2UodGl0bGUsICLvvIHvvIEiKTsKCiAgICBsb2coewogICAgICB0aXRsZSwKICAgICAgbW92aWVJZCwKICAgICAgY29ycE5hbWUsCiAgICAgIGlzVlIsCiAgICAgIGlzVW5jZW5zb3JlZCwKICAgICAgaXNFdXJvcGVPckFtZXJpY2EsCiAgICAgIHRodW1ibmFpbFVSTCwKICAgICAgdGl0bGVLZXlQaHJhc2UsCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHRpdGxlLAogICAgICBtb3ZpZUlkLAogICAgICBjb3JwTmFtZSwKICAgICAgaXNWUiwKICAgICAgaXNVbmNlbnNvcmVkLAogICAgICBpc0V1cm9wZU9yQW1lcmljYSwKICAgICAgdGh1bWJuYWlsVVJMLAogICAgICB0aXRsZUtleVBocmFzZSwKICAgIH07CiAgfQoKICAvKioKICAgKiBBcHBlbmQgcGxheWVyIHN0eWxlCiAgICovCiAgZnVuY3Rpb24gYWRkUHJldmlld1ZpZGVvU3R5bGUoKSB7CiAgICBsZXQgY29udGFpbmVyU3R5bGUgPSBgCiAgICAgICAgI3ByZXZpZXctdmlkZW8tY29udGFpbmVyewogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC44KTsKICAgICAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgICAgIHotaW5kZXg6IDk5OTsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgfQogICAgICAgICNwcmV2aWV3LXZpZGVvLWNvbnRhaW5lcjpiZWZvcmUgewogICAgICAgICAgICBjb250ZW50OiAnXFwyNzE1JzsKICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4OwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICAgICAgcmlnaHQ6IDE4cHg7CiAgICAgICAgICAgIHRvcDogOHB4OwogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTsKICAgICAgICB9CiAgICAgICAgI3ByZXZpZXctdmlkZW8tcGxheWVyewogICAgICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICAgICAgbWluLXdpZHRoOiA3MCU7CiAgICAgICAgICAgIG1heC13aWR0aDogODAlOwogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgfQogICAgICAgIC5wcmV2aWV3LXZpZGVvLWltZy1jb250YWluZXJ7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgfQogICAgICAgIC5wcmV2aWV3LXZpZGVvLWltZy1jb250YWluZXIgaW1newogICAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgICAgICB3aWR0aDogMTIwcHg7CiAgICAgICAgfQogICAgICAgIC5wcmV2aWV3LXZpZGVvLWltZy1jb250YWluZXI6YWZ0ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyAgdmlld0JveD0nMCAwIDUxMiA1MTInJTNFJTNDcGF0aCBkPSdNNDQ4IDI1NWMwLTEwNi04Ni0xOTItMTkyLTE5MlM2NCAxNTAgNjQgMjU2czg2IDE5MiAxOTIgMTkyIDE5Mi04NiAxOTItMTkyeicgZmlsbD0nZ29sZCcgIGZpbGwtb3BhY2l0eT0nMC44JyBzdHJva2U9J25vbmUnLyUzRSUzQ3BhdGggZmlsbD0nd2hpdGUnIGQ9J00yMTYuMzIgIDMzNC40NGwxMTQuNDUtNjkuMTRhMTAuODkgMTAuODkgMCAwMDAtMTguNmwtMTE0LjQ1LTY5LjE0YTEwLjc4IDEwLjc4IDAgMDAtMTYuMzIgOS4zMXYxMzguMjZhMTAuNzggMTAuNzggMCAwMDE2LjMyIDkuMzF6Jy8lM0UlM0Mvc3ZnJTNFIik7CiAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDUwJTsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDVlOwogICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDQ4cHggNDhweDsKICAgICAgICAgICAgYm90dG9tOiAwOwogICAgICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgICAgIHRvcDogMDsKICAgICAgICB9CiAgICAgICAgYDsKICAgIEdNX2FkZFN0eWxlKGNvbnRhaW5lclN0eWxlKTsKICAgIEdNX2FkZFN0eWxlKEdNX2dldFJlc291cmNlVGV4dCgidmlkZW8tanMtY3NzIikpOwogICAgR01fYWRkU3R5bGUoR01fZ2V0UmVzb3VyY2VUZXh0KCJ2aWRlby12ci1qcy1jc3MiKSk7CiAgfQoKICAvKioKICAgKiBBcHBlbmQgVmlkZW8gUGxheWVyIEVsZW1lbnQgdG8gUGFnZQogICAqIEBwYXJhbSB7b2JqZWN0fSBtb3ZpZUluZm8gbW92aWVJbmZvCiAgICogQHJldHVybnMKICAgKi8KICBmdW5jdGlvbiBhZGRWaWRlb1BsYXllckVsZW1lbnQobW92aWVJbmZvKSB7CiAgICBpZiAoIW1vdmllSW5mby52aWRlb1VSTCkgcmV0dXJuOwogICAgbGV0IHZpZGVvOwogICAgbGV0IG11dGVkID0gc2V0dGluZ3MuZW5hYmxlX211dGVfcGxheSA9PSB0cnVlID8gIm11dGVkIiA6ICIiOwogICAgLy90YXJnZXQgdmlkZW8gdXJsIG5lZWQgdXNlIGlmcmFtZQogICAgaWYgKG5lZWRDT1JTKG1vdmllSW5mby52aWRlb1VSTCkpIHsKICAgICAgdmlkZW8gPSBgCiAgICAgIDxpZnJhbWUgaWQ9InByZXZpZXctdmlkZW8taWZyYW1lIiBuYW1lPSJwcmV2aWV3LXZpZGVvLWlmcmFtZSIgd2lkdGg9IjYwJSIgaGVpZ2h0PSI4MCUiIHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjhweDsiIHNyY2RvYz0iPGh0bWw+PGhlYWQ+PHN0eWxlPip7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtwYWRkaW5nOjA7bWFyZ2luOjA7b3ZlcmZsb3c6aGlkZGVuO30gdmlkZW97YmFja2dyb3VuZDogIzAwMDt9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PHZpZGVvIGNvbnRyb2xzPjxzb3VyY2Ugc3JjPScke21vdmllSW5mby52aWRlb1VSTH0nIHR5cGU9J3ZpZGVvL21wNCc+PC92aWRlbz48L2JvZHk+PC9odG1sPiI+CiAgICAgIDwvaWZyYW1lPmA7CiAgICB9IGVsc2UgewogICAgICB2aWRlbyA9IGAKICAgICAgICA8dmlkZW8gaWQ9InByZXZpZXctdmlkZW8tcGxheWVyIiBwbGF5c2lubGluZSBjb250cm9scyBwcmVsb2FkPSJub25lIiAke211dGVkfSBwb3N0ZXI9IiR7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYS5iaWdJbWFnZSBpbWciKT8uc3JjCiAgICAgIH0iPgogICAgICAgICAgICA8c291cmNlIHNyYz0iJHttb3ZpZUluZm8udmlkZW9VUkx9IiB0eXBlPSJ2aWRlby9tcDQiIC8+CiAgICAgICAgPC92aWRlbz5gOwogICAgICBpZiAoCiAgICAgICAgdmlkZW9qcyAmJgogICAgICAgICgoc2V0dGluZ3MuZW5hYmxlX3ZyX21vZGUgPT0gdHJ1ZSAmJiBtb3ZpZUluZm8uaXNWUikgfHwKICAgICAgICAgIGlzTTNVOChtb3ZpZUluZm8udmlkZW9VUkwpKQogICAgICApIHsKICAgICAgICB2aWRlbyA9IGAKICAgICAgICAgICAgICA8dmlkZW8gaWQ9InByZXZpZXctdmlkZW8tcGxheWVyIiBjbGFzcz0idmlkZW8tanMiIHBsYXlzaW5saW5lIGNvbnRyb2xzIHByZWxvYWQ9Im5vbmUiIAogICAgICAgICAgICAgICR7bXV0ZWR9IHBvc3Rlcj0iJHsKICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImEuYmlnSW1hZ2UgaW1nIik/LnNyYwogICAgICAgIH0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPgogICAgICAgICAgICAgIDwvdmlkZW8+YDsKICAgICAgfQogICAgfQogICAgbGV0IHZDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHZDb250YWluZXIuaWQgPSAicHJldmlldy12aWRlby1jb250YWluZXIiOwogICAgdkNvbnRhaW5lci5pbm5lckhUTUwgPSB2aWRlbzsKCiAgICAvL29uY2xpY2sgZXZlbnQgLS0gaGlkZSBhbmQgcGF1c2UgcGxheWVyCiAgICB2Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGV2ZW50KSA9PiB7CiAgICAgIGlmIChldmVudD8udGFyZ2V0ICE9IHZDb250YWluZXIpIHJldHVybjsKICAgICAgdkNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICBpZiAocGxheWVyKSB7CiAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy9yZXNldCBpZnJhbWUgdG8gcGF1c2UgdmlkZW8KICAgICAgICBpZiAobmVlZENPUlMobW92aWVJbmZvLnZpZGVvVVJMKSkgewogICAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3ByZXZpZXctdmlkZW8taWZyYW1lIik7CiAgICAgICAgICBsZXQgb3JpZ2luSWZyYW1lID0gaWZyYW1lLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIGlmcmFtZS5wYXJlbnRFbGVtZW50LmFwcGVuZChvcmlnaW5JZnJhbWUpOwogICAgICAgICAgaWZyYW1lLnJlbW92ZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImF1dG8iOwogICAgfSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh2Q29udGFpbmVyKTsKICAgIGluaXRWaWRlb1BsYXllcihtb3ZpZUluZm8pOwogICAgYWRkVmlkZW9QcmV2aWV3SW1hZ2UoKTsKICB9CgogIGZ1bmN0aW9uIGluaXRWaWRlb1BsYXllcihtb3ZpZUluZm8pIHsKICAgIGlmIChuZWVkQ09SUyhtb3ZpZUluZm8udmlkZW9VUkwpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgKICAgICAgdmlkZW9qcyAmJgogICAgICAoKHNldHRpbmdzLmVuYWJsZV92cl9tb2RlID09IHRydWUgJiYgbW92aWVJbmZvLmlzVlIpIHx8IGlzTTNVOChtb3ZpZUluZm8udmlkZW9VUkwpKQogICAgKSB7CiAgICAgIHBsYXllciA9IHZpZGVvanMoInByZXZpZXctdmlkZW8tcGxheWVyIiwgewogICAgICAgIHBsYXliYWNrUmF0ZXM6IFswLjUsIDEsIDEuNSwgMl0sCiAgICAgIH0pOwogICAgICBwbGF5ZXIubWVkaWFpbmZvID0gcGxheWVyLm1lZGlhaW5mbyB8fCB7fTsKICAgICAgaWYgKGlzTTNVOChtb3ZpZUluZm8udmlkZW9VUkwpKSB7CiAgICAgICAgcGxheWVyLnNyYyh7CiAgICAgICAgICB0eXBlOiAiYXBwbGljYXRpb24veC1tcGVnVVJMIiwKICAgICAgICAgIHNyYzogbW92aWVJbmZvLnZpZGVvVVJMLAogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8vZW5hYmxlZCB2ciBwbHVnaW4KICAgICAgaWYgKG1vdmllSW5mby5pc1ZSKSB7CiAgICAgICAgcGxheWVyLnNyYyh7CiAgICAgICAgICB0eXBlOiAidmlkZW8vbXA0IiwKICAgICAgICAgIHNyYzogbW92aWVJbmZvLnZpZGVvVVJMLAogICAgICAgIH0pOwogICAgICAgIHBsYXllci5tZWRpYWluZm8ucHJvamVjdGlvbiA9ICIzNjAiOwogICAgICAgIHBsYXllci52cih7IHByb2plY3Rpb246ICJBVVRPIiB9KTsKICAgICAgICBwbGF5ZXIudnIoKS5vbigiaW5pdGlhbGl6ZWQiLCAoKSA9PiB7CiAgICAgICAgICBwbGF5ZXIudnIoKS5jYW1lcmEucG9zaXRpb24ueCA9IC0xLjM5ODE1OTEwODE3Mzg5ODI7CiAgICAgICAgICBwbGF5ZXIudnIoKS5jYW1lcmEucG9zaXRpb24ueSA9IDAuMDM1MzA0MDExMTE4OTQ0MjUzOwogICAgICAgICAgcGxheWVyLnZyKCkuY2FtZXJhLnBvc2l0aW9uLnogPSAtMC43OTA0NjU0MzIzNzYxNjg2OwogICAgICAgIH0pOwogICAgICAgIHBsYXllci50ZWNoKGZhbHNlKTsgLy90ZWNoKCkgd2lsbCBsb2cgd2FybmluZyB3aXRob3V0IGFueSBhcmd1bWVudAogICAgICB9CiAgICAgIHBsYXllci5kZWZhdWx0UGxheWJhY2tSYXRlKHNldHRpbmdzLnZpZGVvX3BsYXliYWNrX3NwZWVkKTsKICAgIH0gZWxzZSB7CiAgICAgIHBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNwcmV2aWV3LXZpZGVvLXBsYXllciIpOwogICAgICBwbGF5ZXIucGxheWJhY2tSYXRlID0gc2V0dGluZ3MudmlkZW9fcGxheWJhY2tfc3BlZWQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBBcHBlbmQgdmlkZW8gcHJldmlldyBpbWFnZSB0byBtb3ZpZSBnYWxsZXJ5CiAgICogQHJldHVybnMKICAgKi8KICBmdW5jdGlvbiBhZGRWaWRlb1ByZXZpZXdJbWFnZSgpIHsKICAgIGxldCBpbWdXYXRlckZhbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2FtcGxlLXdhdGVyZmFsbCIpOwogICAgaWYgKCFpbWdXYXRlckZhbGwpIHsKICAgICAgaW1nV2F0ZXJGYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGltZ1dhdGVyRmFsbC5pZCA9ICJzYW1wbGUtd2F0ZXJmYWxsIjsKICAgICAgbGV0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoNCIpOwogICAgICBoZWFkaW5nLmlubmVyVGV4dCA9ICLmqKPlk4HlnJblg48iOwogICAgICBjb25zdCBjbGVhcmZpeCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImNsZWFyZml4IilbMF07CiAgICAgIGNsZWFyZml4Py5iZWZvcmUoaGVhZGluZywgaW1nV2F0ZXJGYWxsKTsKICAgIH0KICAgIGxldCBwcmV2aWV3SW1nU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgIHByZXZpZXdJbWdTcGFuLmNsYXNzTGlzdC5hZGQoInNhbXBsZS1ib3giKTsKICAgIGxldCBwaG90b0ZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBwaG90b0ZyYW1lLmNsYXNzTGlzdC5hZGQoInBob3RvLWZyYW1lIiwgInByZXZpZXctdmlkZW8taW1nLWNvbnRhaW5lciIpOwogICAgbGV0IHBvc3RlckltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImEuYmlnSW1hZ2UgaW1nIik7CiAgICBpZiAocG9zdGVySW1nKSB7CiAgICAgIGxldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKICAgICAgaW1nLnNyYyA9IHBvc3RlckltZy5zcmM7CiAgICAgIHBob3RvRnJhbWUuYXBwZW5kKGltZyk7CiAgICB9CiAgICBwcmV2aWV3SW1nU3Bhbi5hcHBlbmQocGhvdG9GcmFtZSk7CiAgICBpbWdXYXRlckZhbGwucHJlcGVuZChwcmV2aWV3SW1nU3Bhbik7CgogICAgLy9vbmNsaWNrIGV2ZW50CiAgICBwcmV2aWV3SW1nU3Bhbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgbGV0IHZDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcHJldmlldy12aWRlby1jb250YWluZXIiKTsKICAgICAgaWYgKHZDb250YWluZXIpIHsKICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgICAgdkNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgICAgIGlmIChwbGF5ZXIpIHsKICAgICAgICAgIHBsYXllci5wbGF5KCk7CiAgICAgICAgICBwbGF5ZXIuZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gZ2V0VmlkZW9VUkwobW92aWVJbmZvKSB7CiAgICBsZXQgdmlkZW9VUkwgPSBhd2FpdCBxdWVyeUxvY2FsQ2FjaGVEQihtb3ZpZUluZm8pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIGxvZyhlKTsKICAgICAgICByZXR1cm4gcXVlcnlTdXBhQmFzZShtb3ZpZUluZm8pOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgcmV0dXJuIHF1ZXJ5Q0YobW92aWVJbmZvKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICAgIHJldHVybiBxdWVyeURNTVZpZGVvVVJMKG1vdmllSW5mbywgdW5kZWZpbmVkLCBmYWxzZSwgIm1oYiIpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RE1NVmlkZW9VUkwobW92aWVJbmZvKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICAgIHJldHVybiBxdWVyeURNTVZpZGVvVVJMKG1vdmllSW5mbywgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICAgIHJldHVybiBxdWVyeVByZXN0aWdlVmlkZW9VUkwobW92aWVJbmZvKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICAgIHJldHVybiBxdWVyeU1HU3RhZ2VWaWRlb1VSTChtb3ZpZUluZm8pOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgcmV0dXJuIHF1ZXJ5TUdTdGFnZVZpZGVvVVJMKG1vdmllSW5mbywgZmFsc2UsIHRydWUpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgLy9yZXRyeSBxdWVyeSAodXNlIG1vdmllIHRpdGxlIGFzIGtleXdvcmQpCiAgICAgICAgcmV0dXJuIHF1ZXJ5TUdTdGFnZVZpZGVvVVJMKG1vdmllSW5mbywgdHJ1ZSk7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIGxvZyhlKTsKICAgICAgICByZXR1cm4gcXVlcnlYQ2l0eVZpZGVvVVJMKG1vdmllSW5mbyk7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIGxvZyhlKTsKICAgICAgICByZXR1cm4gcXVlcnlCYXNpY1VuY2Vuc29yZWRWaWRlb1VSTChtb3ZpZUluZm8pOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgcmV0dXJuIHF1ZXJ5VG9reW9Ib3RWaWRlb1VSTChtb3ZpZUluZm8pOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICBsb2coZSk7CiAgICAgICAgcmV0dXJuIHF1ZXJ5QVZGYW50YXN5VmlkZW9VUkwobW92aWVJbmZvKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICAgIHJldHVybiBxdWVyeUFWRmFudGFzeVZpZGVvVVJMKG1vdmllSW5mbywgdHJ1ZSk7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIGxvZyhlKTsKICAgICAgICByZXR1cm4gcXVlcnlKYXZTcHlsVmlkZW9VUkwobW92aWVJbmZvKTsKICAgICAgfSkKICAgICAgLy8gLmNhdGNoKChlKSA9PiB7CiAgICAgIC8vICAgbG9nKGUpOwogICAgICAvLyAgIHJldHVybiBxdWVyeUphdkRCVmlkZW9VUkwobW92aWVJbmZvKTsKICAgICAgLy8gfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgbG9nKGUpOwogICAgICB9KTsKICAgIHJldHVybiBjb252ZXJ0SFRUUFRvSFRUUFModmlkZW9VUkwpOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlCYXNpY1VuY2Vuc29yZWRWaWRlb1VSTChtb3ZpZUluZm8pIHsKICAgIGlmICghbW92aWVJbmZvLmlzVW5jZW5zb3JlZCkKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCJRdWVyeSBiYXNpYyB1bmNlbnNvcmVkIG9ubHkgc3VwcG9ydCB1bmNlbnNvcmVkIG1vdmllLiIpOwogICAgbGV0IHZpZGVvVVJMczsKICAgIGNvbnN0IHF1YWxpdHlBcnIgPSBbIjcyMHAubXA0IiwgIjEwODBwLm1wNCIsICI0ODBwLm1wNCIsICIzNjBwLm1wNCIsICIyNDBwLm1wNCJdOwogICAgaWYgKAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUgPT09ICLjgqvjg6rjg5PjgqLjg7PjgrPjg6AiIHx8CiAgICAgIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiQ0FSSUJCRUFOQ09NIgogICAgKSB7CiAgICAgIC8vY3JlYXRlIGRpZmZlcmVudCBxdWFsaXR5IHZpZGVvIHVybHMuCiAgICAgIHZpZGVvVVJMcyA9IHF1YWxpdHlBcnIubWFwKAogICAgICAgIChxdWFsaXR5KSA9PgogICAgICAgICAgYGh0dHBzOi8vc21vdmllLmNhcmliYmVhbmNvbS5jb20vc2FtcGxlL21vdmllcy8ke21vdmllSW5mby5tb3ZpZUlkfS8ke3F1YWxpdHl9YAogICAgICApOwogICAgfSBlbHNlIGlmICgKICAgICAgbW92aWVJbmZvLmNvcnBOYW1lID09PSAi5p2x5Lqs54axIiB8fAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUudG9VcHBlckNhc2UoKSA9PT0gIlRPS1lPSE9UIgogICAgKSB7CiAgICAgIHZpZGVvVVJMcyA9IFtgaHR0cHM6Ly9teS5jZG4udG9reW8taG90LmNvbS9tZWRpYS9zYW1wbGVzLyR7bW92aWVJbmZvLm1vdmllSWR9Lm1wNGBdOwogICAgfSBlbHNlIGlmICgKICAgICAgbW92aWVJbmZvLmNvcnBOYW1lID09PSAi5aSp54S244KA44GZ44KBIiB8fAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUudG9VcHBlckNhc2UoKSA9PT0gIjEwTVVTVU1FIgogICAgKSB7CiAgICAgIHZpZGVvVVJMcyA9IHF1YWxpdHlBcnIubWFwKAogICAgICAgIChxdWFsaXR5KSA9PgogICAgICAgICAgYGh0dHBzOi8vc21vdmllLjEwbXVzdW1lLmNvbS9zYW1wbGUvbW92aWVzLyR7bW92aWVJbmZvLm1vdmllSWR9LyR7cXVhbGl0eX1gCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUgPT09ICLkuIDmnKzpgZMiIHx8CiAgICAgIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiMVBPTkRPIgogICAgKSB7CiAgICAgIHZpZGVvVVJMcyA9IHF1YWxpdHlBcnIubWFwKAogICAgICAgIChxdWFsaXR5KSA9PgogICAgICAgICAgYGh0dHBzOi8vc21vdmllLjFwb25kby50di9zYW1wbGUvbW92aWVzLyR7bW92aWVJbmZvLm1vdmllSWR9LyR7cXVhbGl0eX1gCiAgICAgICk7CiAgICAgIHZpZGVvVVJMcy5wdXNoKAogICAgICAgIGBodHRwczovL3BwdmNsaXBzMDIuYXZlbnRlcnRhaW5tZW50cy5jb20vMDFtM3U4LzFwb25fJHttb3ZpZUluZm8ubW92aWVJZH0vMXBvbl8ke21vdmllSW5mby5tb3ZpZUlkfS5tM3U4YAogICAgICApOwogICAgfSBlbHNlIGlmICgKICAgICAgbW92aWVJbmZvLmNvcnBOYW1lID09PSAi44Ov44Oz44OU44O844K5IiB8fAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUgPT09ICLjgqrjg6rjgqjjg7Pjgr/jg6vjg4njg6rjg7zjg6AiIHx8CiAgICAgIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiT05FUElFQ0VFTlRFUlRBSU5NRU5UIiB8fAogICAgICBtb3ZpZUluZm8uY29ycE5hbWUudG9VcHBlckNhc2UoKSA9PT0gIk9SSUVOVEFMRFJFQU0iCiAgICApIHsKICAgICAgdmlkZW9VUkxzID0gWwogICAgICAgIGBodHRwczovL3BwdmNsaXBzMDIuYXZlbnRlcnRhaW5tZW50cy5jb20vJHttb3ZpZUluZm8ubW92aWVJZH0vdHMvJHttb3ZpZUluZm8ubW92aWVJZH0tbTN1OC1hYXBsLmlzbS9tYW5pZmVzdChmb3JtYXQ9bTN1OC1hYXBsKS5tM3U4YCwKICAgICAgXTsKICAgIH0gZWxzZSBpZiAoCiAgICAgIG1vdmllSW5mby5jb3JwTmFtZSA9PT0gIuODkeOCs+ODkeOCs+ODnuODniIgfHwKICAgICAgbW92aWVJbmZvLmNvcnBOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJQQUNPUEFDT01BTUEiCiAgICApIHsKICAgICAgdmlkZW9VUkxzID0gcXVhbGl0eUFyci5tYXAoCiAgICAgICAgKHF1YWxpdHkpID0+CiAgICAgICAgICBgaHR0cHM6Ly9mbXMucGFjb3BhY29tYW1hLmNvbS9obHMvc2FtcGxlL3BhY29wYWNvbWFtYS5jb20vJHttb3ZpZUluZm8ubW92aWVJZH0vJHtxdWFsaXR5fWAKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgKICAgICAgICAiUXVlcnkgYmFzaWMgdW5jZW5zb3JlZDogVGhpcyBmdW5jdGlvbiBub3Qgc3VwcG9ydCB0aGlzIGNvcnBvcmF0aW9uIG1vdmllLiIKICAgICAgKTsKICAgIH0KICAgIGZvciAoY29uc3QgdmlkZW9VUkwgb2YgdmlkZW9VUkxzKSB7CiAgICAgIGxvZygiUXVlcnkgYmFzaWMgdW5jZW5zb3JlZDpcclxuIiArIHZpZGVvVVJMKTsKICAgICAgY29uc3QgdmFsaWRhdGVkVVJMID0gYXdhaXQgeEZldGNoKHZpZGVvVVJMLCB7IG1ldGhvZDogImhlYWQiIH0pCiAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsKICAgICAgICAgIGlmIChyZXNwPy5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICBsb2coIlF1ZXJ5IGJhc2ljIHVuY2Vuc29yZWQ6IHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgICAgICByZXR1cm4gdmlkZW9VUkw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KQogICAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgICAgbG9nKGUpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICAgIGlmICh2YWxpZGF0ZWRVUkwpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbGlkYXRlZFVSTCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgiUXVlcnkgYmFzaWMgdW5jZW5zb3JlZCBOb3QgZm91bmQgbW92aWUuIik7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBxdWVyeUphdlNweWxWaWRlb1VSTChtb3ZpZUluZm8pIHsKICAgIC8vVmlkZW8gbGlua3MgZm9yIHRoZXNlIGNvbXBhbmllcyByZXF1aXJlIGNvcnMsIHNvIGlnbm9yZSBpdC4KICAgIC8vIGlmICgKICAgIC8vICAgbW92aWVJbmZvLmNvcnBOYW1lID09PSAiSEVZWk8iIHx8CiAgICAvLyAgIG1vdmllSW5mby5jb3JwTmFtZSA9PT0gIuS4gOacrOmBkyIgfHwKICAgIC8vICAgbW92aWVJbmZvLmNvcnBOYW1lID09PSAiMXBvbmRvIgogICAgLy8gKSB7CiAgICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdCgiSmF2U3B5bCBzZXJ2ZXIgbm90IHN1cHBvcnQgdGhpcyBjb3Jwb3JhdGlvbiBtb3ZpZS4iKTsKICAgIC8vIH0KICAgIC8vc2VlIGh0dHBzOi8vYml0Lmx5LzNSa2dxU28KICAgIGxldCBzZXJ2ZXJVUkwgPSAiaHR0cHM6Ly9hcGkuamF2c3B5bC5ldS5vcmcvYXBpLyI7CiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCwgewogICAgICBoZWFkZXJzOiB7CiAgICAgICAgb3JpZ2luOiAiaHR0cHM6Ly9hcGkuamF2c3B5bC5ldS5vcmciLAogICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgfSwKICAgICAgZGF0YTogYElEPSR7bW92aWVJbmZvLm1vdmllSWR9YCwKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICB9KQogICAgICAudGhlbigocmVzcCkgPT4gewogICAgICAgIGlmIChyZXNwPy5zdGF0dXMgIT09IDIwMCB8fCAhcmVzcC5yZXNwb25zZVRleHQpCiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoIkphdlNweWwgc2VydmVyIG5vdCBmb3VuZCBtb3ZpZS4iKTsKICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwLnJlc3BvbnNlVGV4dCk7CiAgICAgIH0pCiAgICAgIC50aGVuKCh2aWRlbykgPT4gewogICAgICAgIGlmICh2aWRlbz8uaW5mbz8udXJsPy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBsb2coIkphdlNweWwgc2VydmVyIHJlc3VsdCB2aWRlbyB1cmw6IGh0dHBzOi8vIiArIHZpZGVvLmluZm8udXJsKTsKICAgICAgICAgIHJldHVybiAiaHR0cHM6Ly8iICsgdmlkZW8uaW5mby51cmw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgiSmF2U3B5bCBzZXJ2ZXIgbm90IGZvdW5kIG1vdmllLiIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5QVZGYW50YXN5VmlkZW9VUkwobW92aWVJbmZvLCBpc1N0YW5kYnlTZXJ2ZXIgPSBmYWxzZSkgewogICAgaWYgKCFtb3ZpZUluZm8uaXNVbmNlbnNvcmVkKQogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoIkFWRmFudGFzeURNTSBzZXJ2ZXIgb25seSBzdXBwb3J0IHVuY2Vuc29yZWQgbW92aWUuIik7CiAgICBsZXQgbm90Rm91bmQgPSAoKSA9PiBQcm9taXNlLnJlamVjdCgiQVZGYW50YXN5IHNlcnZlciBub3QgZm91bmQgbW92aWUuIik7CiAgICBsZXQga2V5d29yZCA9IG1vdmllSW5mby5tb3ZpZUlkOwogICAgLy9Nb3ZpZSBjb2RlcyBmb3IgdGhlc2UgY29tcGFuaWVzIGFyZSBub3Qgc3VwcG9ydGVkLCBzbyB1c2UgbW92aWUgdGl0bGVzIHRvIHNlYXJjaC4KICAgIGlmIChtb3ZpZUluZm8uY29ycE5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkhFWVpPIikgewogICAgICBrZXl3b3JkID0gbW92aWVJbmZvLnRpdGxlS2V5UGhyYXNlOwogICAgfQogICAgbGV0IHNlcnZlclVSTCA9IGBodHRwczovL3d3dy5hdmZhbnRhc3kuY29tL3Bwdi9wcHZfc2VhcmNocHJvZHVjdHMuYXNweD9rZXl3b3JkPSR7a2V5d29yZH1gOwogICAgaWYgKGlzU3RhbmRieVNlcnZlcikgewogICAgICBzZXJ2ZXJVUkwgPSBgaHR0cHM6Ly93d3cuYXZmYW50YXN5LmNvbS9zZWFyY2hfUHJvZHVjdHMuYXNweD9rZXl3b3JkPSR7a2V5d29yZH1gOwogICAgfQogICAgbG9nKCJBVkZhbnRhc3lETU0gc2VydmVyIHF1ZXJ5OlxyXG4iICsgc2VydmVyVVJMKTsKICAgIHJldHVybiBhd2FpdCB4RmV0Y2goc2VydmVyVVJMKQogICAgICAudGhlbigocmVzcG9uc2UpID0+IHsKICAgICAgICAvL0FWRmFudGFzeSBzZWFyY2ggcmVzdWx0LCBtYXkgY29udGFpbiBtdWx0aXBsZSBtb3ZpZXMuCiAgICAgICAgbGV0IHJlc3VsdE1vdmllcyA9IGV4dHJhY3RBVkZhbnRhc3lNb3ZpZUl0ZW0ocmVzcG9uc2UucmVzcG9uc2VUZXh0KTsKICAgICAgICBpZiAoIXJlc3VsdE1vdmllcykgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgICAgbGV0IHRhcmdldE1vdmllRWxlID0gbnVsbDsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzdWx0TW92aWVzKSB7CiAgICAgICAgICBpZiAobWF0Y2hNb3ZpZUJ5S2V5d29yZChlbGVtZW50LCBtb3ZpZUluZm8pKSB7CiAgICAgICAgICAgIHRhcmdldE1vdmllRWxlID0gZWxlbWVudDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdGFyZ2V0TW92aWVFbGUpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCBhdkRldGFpbFVSTCA9IHRhcmdldE1vdmllRWxlLm1hdGNoKC88YSBocmVmPSIoXFMqPykiL3MpPy5hdCgxKTsKICAgICAgICBpZiAoIWF2RGV0YWlsVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICByZXR1cm4geEZldGNoKGF2RGV0YWlsVVJMKTsKICAgICAgfSkKICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgLy9BVkZhbnRhc3kgbW92aWUgZGV0YWlsIHBhZ2UgcmVzdWx0LgogICAgICAgIGxldCB2aWRlb1NvdXJjZSA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dD8ubWF0Y2goLzxzb3VyY2UuKj9zcmM9IihcUyo/KSIvcyk/LmF0KDEpOwogICAgICAgIGlmICh2aWRlb1NvdXJjZSkgewogICAgICAgICAgbG9nKCJBVkZhbnRhc3kgc2VydmVyIHJlc3VsdCB2aWRlbyB1cmw6ICIgKyB2aWRlb1NvdXJjZSk7CiAgICAgICAgICByZXR1cm4gdmlkZW9Tb3VyY2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RGb3VuZCgpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlKYXZEQlZpZGVvVVJMKG1vdmllSW5mbykgewogICAgbGV0IHNlcnZlclVSTCA9IGBodHRwczovL2phdmRiLmNvbS9zZWFyY2g/cT0ke21vdmllSW5mby5tb3ZpZUlkfSZmPWFsbGA7CiAgICBsZXQgbm90Rm91bmQgPSAoKSA9PiBQcm9taXNlLnJlamVjdCgiSmF2REIgc2VydmVyIG5vdCBmb3VuZCBtb3ZpZS4iKTsKICAgIGxvZygiSmF2REIgc2VydmVyIHF1ZXJ5OlxyXG4iICsgc2VydmVyVVJMKTsKICAgIHJldHVybiBhd2FpdCBmZXRjaChzZXJ2ZXJVUkwpCiAgICAgIC50aGVuKChyZXNwKSA9PiB7CiAgICAgICAgcmV0dXJuIHJlc3AudGV4dCgpOwogICAgICB9KQogICAgICAudGhlbigodGV4dCkgPT4gewogICAgICAgIC8vSmF2REIgc2VhcmNoIHJlc3VsdCwgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbW92aWVzLgogICAgICAgIC8vVE9ETwogICAgICAgIGxldCBkb2MgPSBjb252ZXJ0VGV4dFRvRE9NKHRleHQpOwogICAgICAgIGxldCByZXN1bHRNb3ZpZXMgPSBkb2MucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0iKTsKICAgICAgICBsZXQgdGFyZ2V0TW92aWVFbGUgPSBudWxsOwogICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiByZXN1bHRNb3ZpZXMudmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChtYXRjaE1vdmllQnlLZXl3b3JkKGVsZW1lbnQuaW5uZXJIVE1MLCBtb3ZpZUluZm8pKSB7CiAgICAgICAgICAgIHRhcmdldE1vdmllRWxlID0gZWxlbWVudDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdGFyZ2V0TW92aWVFbGUpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCBhdkRldGFpbFBhdGhOYW1lID0gdGFyZ2V0TW92aWVFbGUucXVlcnlTZWxlY3RvcigiYSIpPy5wYXRobmFtZTsKICAgICAgICBpZiAoIWF2RGV0YWlsUGF0aE5hbWUpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIHJldHVybiBmZXRjaCgiaHR0cHM6Ly9qYXZkYi5jb20iICsgYXZEZXRhaWxQYXRoTmFtZSk7CiAgICAgIH0pCiAgICAgIC50aGVuKChhdkRldGFpbFJlc3ApID0+IHsKICAgICAgICByZXR1cm4gYXZEZXRhaWxSZXNwLnRleHQoKTsKICAgICAgfSkKICAgICAgLnRoZW4oKHRleHQpID0+IHsKICAgICAgICAvL0phdkRCIG1vdmllIGRldGFpbCBwYWdlIHJlc3VsdC4KICAgICAgICBsZXQgZG9jID0gY29udmVydFRleHRUb0RPTSh0ZXh0KTsKICAgICAgICBsZXQgdmlkZW9Tb3VyY2UgPSBkb2MucXVlcnlTZWxlY3RvcigiI3ByZXZpZXctdmlkZW8gc291cmNlIik7CiAgICAgICAgaWYgKHZpZGVvU291cmNlICYmIHZpZGVvU291cmNlPy5zcmMgJiYgdmlkZW9Tb3VyY2Uuc3JjICE9IGxvY2F0aW9uLmhyZWYpIHsKICAgICAgICAgIGxvZygiSmF2REIgc2VydmVyIHJlc3VsdCB2aWRlbyB1cmw6ICIgKyB2aWRlb1NvdXJjZS5zcmMpOwogICAgICAgICAgcmV0dXJuIHZpZGVvU291cmNlLnNyYzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfSk7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBxdWVyeURNTVZpZGVvVVJMKAogICAgbW92aWVJbmZvLAogICAgaG9zdCA9ICJjYzMwMDEuZG1tLmNvLmpwIiwKICAgIGhhc1ByZWZpeCA9IGZhbHNlLAogICAgcG9zdGZpeCA9ICJfZG1iX3ciCiAgKSB7CiAgICBpZiAobW92aWVJbmZvLmlzVW5jZW5zb3JlZCkKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCJETU0gc2VydmVyIG5vdCBzdXBwb3J0IHVuY2Vuc29yZWQgbW92aWUuIik7CiAgICAvLyBpZiAobW92aWVJbmZvLnRodW1ibmFpbFVSTD8uaW5jbHVkZXMoIm1nc3RhZ2UuY29tIikpCiAgICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdCgiRE1NIHNlcnZlciBub3Qgc3VwcG9ydCBNR1N0YWdlIG1vdmllLiIpOwogICAgLy9zZWUgaHR0cHM6Ly93d3cuamF2YnVzLmNvbS9mb3J1bS9mb3J1bS5waHA/bW9kPXZpZXd0aHJlYWQmdGlkPTYzMzc0CiAgICAvL3NlZSBodHRwczovL2JpdC5seS8zd1hMajZUCiAgICBsZXQgaW5maXggPSAibGl0ZXZpZGVvL2ZyZWVwdiI7CiAgICAvLzE1MDBrYnBzID0gX2RtYl93IHx8IDMwMDBrYnBzID0gX21oYl93IHx8IHZybGl0ZSB8fCBfc21fdy5tcDQgfHwgX2RtX3cubXA0IHx8IF9kbWJfcy5tcDQhIQogICAgLy8gbGV0IHBvc3RmaXggPSAiX2RtYl93IjsKICAgIGlmIChtb3ZpZUluZm8uaXNWUikgewogICAgICBwb3N0Zml4ID0gInZybGl0ZSI7CiAgICAgIGluZml4ID0gInZyc2FtcGxlIjsKICAgIH0KICAgIGxldCBtb3ZpZUlkU3BsaXQgPSBtb3ZpZUluZm8ubW92aWVJZC50b0xvd2VyQ2FzZSgpLnNwbGl0KCItIik7CiAgICBsZXQgY29ycCA9IG1vdmllSWRTcGxpdFswXTsKICAgIGxldCBpZE51bSA9IG1vdmllSWRTcGxpdFsxXTsKICAgIGxldCB2aWRlb1VSTCA9IGBodHRwczovLyR7aG9zdH0vJHtpbmZpeH0vJHtjb3JwWzBdfS8ke2NvcnAuc3Vic3RyaW5nKAogICAgICAwLAogICAgICAzCiAgICApfS8ke2NvcnB9JHtpZE51bX0vJHtjb3JwfSR7aWROdW19JHtwb3N0Zml4fS5tcDRgOwoKICAgIGlmIChoYXNQcmVmaXggPT09IGZhbHNlICYmIG1vdmllSW5mby50aHVtYm5haWxVUkw/LmluY2x1ZGVzKCJwaWNzLmRtbS5jby5qcCIpKSB7CiAgICAgIC8vZXh0cmFjdCBrZXl3b3JkIGZyb20gdGh1bWJuYWlsCiAgICAgIC8vZXhhbXBsZTogaHR0cHM6Ly9waWNzLmRtbS5jby5qcC9kaWdpdGFsL3ZpZGVvL21rbXAwMDQ5Ny9ta21wMDA0OTdqcC0yLmpwZwogICAgICAvL3Jlc3VsdCBrZXl3b3JkOiBta21wMDA0OTcKICAgICAgbGV0IGtleXdvcmRGcm9tVGh1bWJuYWlsID0gbW92aWVJbmZvLnRodW1ibmFpbFVSTAogICAgICAgID8uc3BsaXQoInZpZGVvLyIpWzFdCiAgICAgICAgPy5zcGxpdCgiLyIpWzBdOwogICAgICAvL3ZhbGlkYXRpb24KICAgICAgaWYgKGtleXdvcmRGcm9tVGh1bWJuYWlsPy5pbmNsdWRlcyhjb3JwKSAmJiBrZXl3b3JkRnJvbVRodW1ibmFpbD8uaW5jbHVkZXMoaWROdW0pKSB7CiAgICAgICAgdmlkZW9VUkwgPSBgaHR0cHM6Ly8ke2hvc3R9LyR7aW5maXh9LyR7CiAgICAgICAgICBrZXl3b3JkRnJvbVRodW1ibmFpbFswXQogICAgICAgIH0vJHtrZXl3b3JkRnJvbVRodW1ibmFpbC5zdWJzdHJpbmcoCiAgICAgICAgICAwLAogICAgICAgICAgMwogICAgICAgICl9LyR7a2V5d29yZEZyb21UaHVtYm5haWx9LyR7a2V5d29yZEZyb21UaHVtYm5haWx9JHtwb3N0Zml4fS5tcDRgOwogICAgICB9CiAgICB9CgogICAgaWYgKGhhc1ByZWZpeCA9PT0gdHJ1ZSkgewogICAgICBpZiAoY29ycG9yYXRpb25zW2NvcnBdKSB7CiAgICAgICAgLy9UaGVyZSBtdXN0IGZpcnN0IGdldCB0aGUgaWROdW0sIGFuZCB0aGVuIGdldCBjb3JwLiBCZWNhdXNlIGNvcnAgd2lsbCBjaGFuZ2UuCiAgICAgICAgaWROdW0gPSBjb3Jwb3JhdGlvbnNbY29ycF1bMV0gPyBjb3Jwb3JhdGlvbnNbY29ycF1bMV0gKyBpZE51bSA6IGlkTnVtOwogICAgICAgIGNvcnAgPSBjb3Jwb3JhdGlvbnNbY29ycF1bMF0gKyBjb3JwOwogICAgICB9IGVsc2UgewogICAgICAgIC8vaWYgbGFzdCB0aW1lIHF1ZXJ5IGlzIGZhaWwsIHRoaXMgdGltZSB0cnkgdG8gYWRkICcwMCcgcHJlZml4CiAgICAgICAgaWYgKCFtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygicGljcy5kbW0uY28uanAiKSkgewogICAgICAgICAgaWROdW0gPSAiMDAiICsgaWROdW07CiAgICAgICAgfQogICAgICB9CiAgICAgIHZpZGVvVVJMID0gYGh0dHBzOi8vJHtob3N0fS8ke2luZml4fS8ke2NvcnBbMF19LyR7Y29ycC5zdWJzdHJpbmcoCiAgICAgICAgMCwKICAgICAgICAzCiAgICAgICl9LyR7Y29ycH0ke2lkTnVtfS8ke2NvcnB9JHtpZE51bX0ke3Bvc3RmaXh9Lm1wNGA7CiAgICB9CgogICAgbG9nKCJETU0gc2VydmVyIHF1ZXJ5OlxyXG4iICsgdmlkZW9VUkwpOwoKICAgIHJldHVybiBhd2FpdCB4RmV0Y2godmlkZW9VUkwsIHsKICAgICAgbWV0aG9kOiAiaGVhZCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiYWNjZXB0LWxhbmd1YWdlIjogImphLUpQIiwKICAgICAgICBjb29raWU6ICJhZ2VfY2hlY2tfZG9uZT0xOyIsCiAgICAgICAgInJlZmVycmVyLXBvbGljeSI6ICJuby1yZWZlcnJlciIsCiAgICAgIH0sCiAgICB9KQogICAgICAudGhlbigocmVzcCkgPT4gewogICAgICAgIGlmIChyZXNwLm9rIHx8IHJlc3Auc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgIGxvZygiRE1NIHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgICAgcmV0dXJuIHZpZGVvVVJMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoIkRNTSBzZXJ2ZXIgbm90IGZvdW5kIG1vdmllLiIpOwogICAgICAgIH0KICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5RE1NT2ZmaWNpYWxWaWRlb1VSTChtb3ZpZUluZm8sIGlzVXNlVGl0bGUgPSBmYWxzZSkgewogICAgaWYgKG1vdmllSW5mby5pc1VuY2Vuc29yZWQpCiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgiRE1NIE9mZmljaWFsIHNlcnZlciBub3Qgc3VwcG9ydCB1bmNlbnNvcmVkIG1vdmllLiIpOwoKICAgIGxldCBub3RGb3VuZCA9ICgpID0+IFByb21pc2UucmVqZWN0KCJETU0gT2ZmaWNpYWwgc2VydmVyIG5vdCBmb3VuZCBtb3ZpZS4iKTsKICAgIC8vTmVlZCBsYWRkZXIKICAgIGxldCBrZXl3b3JkID0gaXNVc2VUaXRsZQogICAgICA/IG1vdmllSW5mby50aXRsZUtleVBocmFzZQogICAgICA6IG1vdmllSW5mby5tb3ZpZUlkLnJlcGxhY2VBbGwoIi0iLCAiJTIwIik7CiAgICBjb25zdCBob3N0ID0gImh0dHBzOi8vd3d3LmRtbS5jby5qcCI7CiAgICBsZXQgc2VydmVyVVJMID0gYCR7aG9zdH0vc2VhcmNoLz0vc2VhcmNoc3RyPSR7a2V5d29yZH0vbGltaXQ9My9zb3J0PXJhbmtwcm9maWxlL2A7CiAgICBsb2coIkRNTSBPZmZpY2lhbCBxdWVyeTpcclxuIiArIHNlcnZlclVSTCk7CiAgICBjb25zdCBoZWFkZXJzID0gewogICAgICAiYWNjZXB0LWxhbmd1YWdlIjogImphLUpQIiwKICAgICAgY29va2llOiAiYWdlX2NoZWNrX2RvbmU9MTsiLAogICAgICAicmVmZXJyZXItcG9saWN5IjogIm5vLXJlZmVycmVyIiwKICAgIH07CiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCwgewogICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgfSkKICAgICAgLnRoZW4oKHJlc3ApID0+IHsKICAgICAgICAvL0RNTSBPZmZpY2lhbCBzZWFyY2ggcmVzdWx0LCBtYXkgY29udGFpbiBtdWx0aXBsZSBtb3ZpZXMuCiAgICAgICAgbGV0IHJlc3VsdE1vdmllcyA9IGV4dHJhY3RETU1Nb3ZpZUl0ZW0ocmVzcC5yZXNwb25zZVRleHQpOwogICAgICAgIGlmICghcmVzdWx0TW92aWVzKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsZXQgdGFyZ2V0TW92aWVFbGUgPSBudWxsOwoKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzdWx0TW92aWVzKSB7CiAgICAgICAgICBpZiAoZWxlbWVudC5tYXRjaCgvZGxzb2Z0XC5kbW1cLmNvXC5qcC8pKSBjb250aW51ZTsKICAgICAgICAgIGlmIChtYXRjaE1vdmllQnlLZXl3b3JkKGVsZW1lbnQsIG1vdmllSW5mbykpIHsKICAgICAgICAgICAgdGFyZ2V0TW92aWVFbGUgPSBlbGVtZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghdGFyZ2V0TW92aWVFbGUpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCBhdkRldGFpbFVSTCA9IHRhcmdldE1vdmllRWxlLm1hdGNoKC90bWIuKj9ocmVmPSIoXFMqPykiL3MpPy5hdCgxKTsKICAgICAgICBpZiAoIWF2RGV0YWlsVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICAvL3JlbW92ZSB1bnVzZSBwYXJhbXMKICAgICAgICByZXR1cm4geEZldGNoKGF2RGV0YWlsVVJMLnNwbGl0KCI/IilbMF0sIHsKICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgfSk7CiAgICAgIH0pCiAgICAgIC50aGVuKChhdkRldGFpbFJlc3ApID0+IHsKICAgICAgICAvL0RpZmZlcmVudCBsaW5rIGZvcm1hdCwgZ2V0IHR3aWNlLgogICAgICAgIGxldCB2aWRlb0lmcmFtZVVSTCA9IGF2RGV0YWlsUmVzcC5yZXNwb25zZVRleHQKICAgICAgICAgID8ubWF0Y2goL2RhdGEtdmlkZW8tdXJsPSIoXFMqPykiL3MpCiAgICAgICAgICA/LmF0KDEpOwogICAgICAgIGlmICghdmlkZW9JZnJhbWVVUkwpIHsKICAgICAgICAgIC8vdHJ5IGFnYWluCiAgICAgICAgICB2aWRlb0lmcmFtZVVSTCA9IGF2RGV0YWlsUmVzcC5yZXNwb25zZVRleHQKICAgICAgICAgICAgPy5tYXRjaCgvc2FtcGxlcGxheVwoJyhcUyo/KSdcKS9zKQogICAgICAgICAgICA/LmF0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAoIXZpZGVvSWZyYW1lVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICByZXR1cm4geEZldGNoKGhvc3QgKyB2aWRlb0lmcmFtZVVSTCwgewogICAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICB9KTsKICAgICAgfSkKICAgICAgLnRoZW4oKHZpZGVvRnJhbWVSZXNwKSA9PiB7CiAgICAgICAgbGV0IGlmcmFtZVVSTCA9IHZpZGVvRnJhbWVSZXNwLnJlc3BvbnNlVGV4dD8ubWF0Y2goL3NyYz0iKFxTKj8pIi9zKT8uYXQoMSk7CiAgICAgICAgaWYgKCFpZnJhbWVVUkwpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIHJldHVybiB4RmV0Y2goaWZyYW1lVVJMLCB7CiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgIH0pOwogICAgICB9KQogICAgICAudGhlbigodmlkZW9SZXNwKSA9PiB7CiAgICAgICAgbGV0IHZpZGVvVVJMID0gdmlkZW9SZXNwLnJlc3BvbnNlVGV4dD8ubWF0Y2goL2FyZ3MuKj9zcmMiOiIoXFMqPykiL3MpPy5hdCgxKTsKICAgICAgICAvL1RPRE8gZ2V0IGRpZmZlcmVudCBxdWFsaXR5CiAgICAgICAgLy8gYml0cmF0ZS4qPzcyMC4qP3NyYyI6IiguKj8pIgogICAgICAgIGlmICh2aWRlb1VSTCkgewogICAgICAgICAgdmlkZW9VUkwgPSAiaHR0cHM6IiArIHZpZGVvVVJMLnJlcGxhY2VBbGwoIlxcIiwgIiIpOwogICAgICAgICAgbG9nKCJETU0gT2ZmaWNpYWwgc2VydmVyIHJlc3VsdCB2aWRlbyB1cmw6ICIgKyB2aWRlb1VSTCk7CiAgICAgICAgICByZXR1cm4gdmlkZW9VUkw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RGb3VuZCgpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlNR1N0YWdlVmlkZW9VUkwoCiAgICBtb3ZpZUluZm8sCiAgICBpc1VzZVRpdGxlID0gZmFsc2UsCiAgICBpc1VzZVRodW1ibmFpbCA9IGZhbHNlCiAgKSB7CiAgICBpZiAoCiAgICAgIG1vdmllSW5mby5pc1VuY2Vuc29yZWQgfHwKICAgICAgKG1vdmllSW5mby5jb3JwTmFtZS5pbmNsdWRlcygi44OX44Os44K544OG44O844K4IikgPT09IGZhbHNlICYmCiAgICAgICAgbW92aWVJbmZvLmNvcnBOYW1lLmluY2x1ZGVzKCLjg6njgrDjgrjjg6VUViIpID09PSBmYWxzZSAmJgogICAgICAgIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJQUkVTVElHRSIpID09PSBmYWxzZSAmJgogICAgICAgICFtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygibWdzdGFnZS5jb20iKSAmJgogICAgICAgICFtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygicHJlc3RpZ2UtYXYuY29tIikpCiAgICApCiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgKICAgICAgICBgTUdTdGFnZSBzZXJ2ZXIgbm90IHN1cHBvcnQgbW92aWVJZDogJHttb3ZpZUluZm8ubW92aWVJZH0sIENvcnBOYW1lOiAke21vdmllSW5mby5jb3JwTmFtZX1gCiAgICAgICk7CiAgICBsZXQgbm90Rm91bmQgPSAoKSA9PiBQcm9taXNlLnJlamVjdCgiTUdTdGFnZSBzZXJ2ZXIgbm90IGZvdW5kIG1vdmllLiIpOwoKICAgIGxldCBrZXl3b3JkID0gaXNVc2VUaXRsZSA/IG1vdmllSW5mby50aXRsZUtleVBocmFzZSA6IG1vdmllSW5mby5tb3ZpZUlkOwoKICAgIGlmIChpc1VzZVRodW1ibmFpbCAmJiBtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygiaW1hZ2UubWdzdGFnZS5jb20iKSkgewogICAgICAvL2V4dHJhY3Qga2V5d29yZCBmcm9tIHRodW1ibmFpbAogICAgICAvL2V4YW1wbGU6IGh0dHBzOi8vaW1hZ2UubWdzdGFnZS5jb20vaW1hZ2VzL2htcC8wMDJhaWR2LzAwMDMvY2FwX2VfMV8wMDJhaWR2LTAwMDMuanBnCiAgICAgIC8vcmVzdWx0IGtleXdvcmQ6IDAwMmFpZHYtMDAwMwogICAgICBsZXQga2V5d29yZEZyb21UaHVtYm5haWwgPSBtb3ZpZUluZm8udGh1bWJuYWlsVVJMCiAgICAgICAgLm1hdGNoKG5ldyBSZWdFeHAoYChbXFxkYS16QS1aXSo/JHttb3ZpZUluZm8ubW92aWVJZH0pYCwgImkiKSkKICAgICAgICA/LmF0KDEpOwoKICAgICAgaWYgKGtleXdvcmRGcm9tVGh1bWJuYWlsPy50b1VwcGVyQ2FzZSgpID09PSBtb3ZpZUluZm8ubW92aWVJZC50b1VwcGVyQ2FzZSgpKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCJNR1N0YWdlIHNlcnZlciA6IGtleXdvcmRGcm9tVGh1bWJuYWlsIGVxdWFscyBtb3ZpZUlkLiIpOwogICAgICB9CiAgICAgIGlmIChrZXl3b3JkRnJvbVRodW1ibmFpbCkgewogICAgICAgIGtleXdvcmQgPSBrZXl3b3JkRnJvbVRodW1ibmFpbDsKICAgICAgfQogICAgfQoKICAgIC8vTmVlZCBsYWRkZXIKICAgIGxldCBzZXJ2ZXJVUkwgPSBgaHR0cHM6Ly93d3cubWdzdGFnZS5jb20vc2VhcmNoL2NTZWFyY2gucGhwP3NlYXJjaF93b3JkPSR7a2V5d29yZH0mbGlzdF9jbnQ9MzBgOwogICAgbG9nKCJNR1N0YWdlIHNlcnZlciBxdWVyeTpcclxuIiArIHNlcnZlclVSTCk7CiAgICBjb25zdCBoZWFkZXJzID0gewogICAgICAiYWNjZXB0LWxhbmd1YWdlIjogImphLUpQIiwKICAgICAgY29va2llOiAiY29jPTE7YWRjPTEiLAogICAgICAicmVmZXJyZXItcG9saWN5IjogIm5vLXJlZmVycmVyIiwKICAgIH07CiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCwgewogICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgfSkKICAgICAgLnRoZW4oKHJlc3ApID0+IHsKICAgICAgICAvL01HU3RhZ2Ugc2VhcmNoIHJlc3VsdCwgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbW92aWVzLgogICAgICAgIGxldCByZXN1bHRNb3ZpZXMgPSBleHRyYWN0TUdTdGFnZU1vdmllSXRlbShyZXNwLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgaWYgKCFyZXN1bHRNb3ZpZXMpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCB0YXJnZXRNb3ZpZUVsZSA9IG51bGw7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3VsdE1vdmllcykgewogICAgICAgICAgaWYgKG1hdGNoTW92aWVCeUtleXdvcmQoZWxlbWVudCwgbW92aWVJbmZvKSkgewogICAgICAgICAgICB0YXJnZXRNb3ZpZUVsZSA9IGVsZW1lbnQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXRhcmdldE1vdmllRWxlKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsZXQgYXZEZXRhaWxVUkwgPSB0YXJnZXRNb3ZpZUVsZQogICAgICAgICAgLm1hdGNoKC88YSBocmVmPSIoXFMqPykiXHMqP2NsYXNzPSJidXR0b25fc2FtcGxlIj4vcykKICAgICAgICAgID8uYXQoMSk7CiAgICAgICAgaWYgKCFhdkRldGFpbFVSTCkgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgICAgbGV0IHBpZCA9IGF2RGV0YWlsVVJMLnNwbGl0KCIvIikuYXQoLTEpOwogICAgICAgIHJldHVybiB4RmV0Y2goCiAgICAgICAgICAiaHR0cHM6Ly93d3cubWdzdGFnZS5jb20vc2FtcGxlcGxheWVyL3NhbXBsZVJlc3BvbnMucGhwP3BpZD0iICsgcGlkLAogICAgICAgICAgewogICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgICAgfQogICAgICAgICk7CiAgICAgIH0pCiAgICAgIC50aGVuKChhdkRldGFpbFJlc3ApID0+IHsKICAgICAgICAvL01HU3RhZ2UgbW92aWUgZGV0YWlsIHBhZ2UgcmVzdWx0LgogICAgICAgIGxldCB2aWRlb1VSTCA9IEpTT04ucGFyc2UoYXZEZXRhaWxSZXNwLnJlc3BvbnNlKT8udXJsPy5zcGxpdCgiLmlzbSIpWzBdICsgIi5tcDQiOwogICAgICAgIGlmICh2aWRlb1VSTCkgewogICAgICAgICAgbG9nKCJNR1N0YWdlIHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgICAgcmV0dXJuIHZpZGVvVVJMOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5UHJlc3RpZ2VWaWRlb1VSTChtb3ZpZUluZm8sIGlzVXNlVGl0bGUgPSBmYWxzZSkgewogICAgaWYgKAogICAgICBtb3ZpZUluZm8uaXNVbmNlbnNvcmVkIHx8CiAgICAgIChtb3ZpZUluZm8uY29ycE5hbWUuaW5jbHVkZXMoIuODl+ODrOOCueODhuODvOOCuCIpID09PSBmYWxzZSAmJgogICAgICAgIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJQUkVTVElHRSIpID09PSBmYWxzZSAmJgogICAgICAgICFtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygibWdzdGFnZS5jb20iKSAmJgogICAgICAgICFtb3ZpZUluZm8udGh1bWJuYWlsVVJMPy5pbmNsdWRlcygicHJlc3RpZ2UtYXYuY29tIikpCiAgICApCiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgKICAgICAgICBgUHJlc3RpZ2Ugc2VydmVyIG5vdCBzdXBwb3J0IG1vdmllSWQ6ICR7bW92aWVJbmZvLm1vdmllSWR9LCBDb3JwTmFtZTogJHttb3ZpZUluZm8uY29ycE5hbWV9YAogICAgICApOwogICAgbGV0IG5vdEZvdW5kID0gKCkgPT4gUHJvbWlzZS5yZWplY3QoIlByZXN0aWdlIHNlcnZlciBub3QgZm91bmQgbW92aWUuIik7CiAgICAvL05lZWQgbGFkZGVyCiAgICBsZXQga2V5d29yZCA9IGlzVXNlVGl0bGUgPyBtb3ZpZUluZm8udGl0bGVLZXlQaHJhc2UgOiBtb3ZpZUluZm8ubW92aWVJZDsKICAgIGxldCBzZXJ2ZXJVUkwgPSBgaHR0cHM6Ly93d3cucHJlc3RpZ2UtYXYuY29tL2FwaS9zZWFyY2g/aXNFbmFibGVkUXVlcnk9dHJ1ZSZzZWFyY2hUZXh0PSR7a2V5d29yZH0maXNFbmFibGVBZ2dyZWdhdGlvbj1mYWxzZSZyZWxlYXNlPWZhbHNlJnJlc2VydmF0aW9uPWZhbHNlJnNvbGRPdXQ9ZmFsc2UmZnJvbT0wJmFnZ3JlZ2F0aW9uVGVybXNTaXplPTAmc2l6ZT0yMGA7CiAgICBsb2coIlByZXN0aWdlIHNlcnZlciBxdWVyeTpcclxuIiArIHNlcnZlclVSTCk7CiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCkKICAgICAgLnRoZW4oKGF2RGV0YWlsUmVzcCkgPT4gewogICAgICAgIGxldCByZXN1bHRNb3ZpZXMgPSBKU09OLnBhcnNlKGF2RGV0YWlsUmVzcC5yZXNwb25zZSk/LmhpdHM/LmhpdHM7CiAgICAgICAgaWYgKCFyZXN1bHRNb3ZpZXMpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGZvciAoY29uc3QgbW92aWVEZXRhaWwgb2YgcmVzdWx0TW92aWVzKSB7CiAgICAgICAgICBsZXQgeyBkZWxpdmVyeUl0ZW1JZCwgcHJvZHVjdFRpdGxlLCBwcm9kdWN0TW92aWUgfSA9IG1vdmllRGV0YWlsWyJfc291cmNlIl07CiAgICAgICAgICBpZiAoCiAgICAgICAgICAgIG1hdGNoTW92aWVCeUtleXdvcmQoZGVsaXZlcnlJdGVtSWQgKyBwcm9kdWN0VGl0bGUsIG1vdmllSW5mbykgJiYKICAgICAgICAgICAgcHJvZHVjdE1vdmllPy5wYXRoCiAgICAgICAgICApIHsKICAgICAgICAgICAgbGV0IHZpZGVvVVJMID0gImh0dHBzOi8vd3d3LnByZXN0aWdlLWF2LmNvbS9hcGkvbWVkaWEvIiArIHByb2R1Y3RNb3ZpZS5wYXRoOwogICAgICAgICAgICBsb2coIlByZXN0aWdlIHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgICAgICByZXR1cm4gdmlkZW9VUkw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RGb3VuZCgpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlUb2t5b0hvdFZpZGVvVVJMKG1vdmllSW5mbykgewogICAgaWYgKAogICAgICAhbW92aWVJbmZvLmlzVW5jZW5zb3JlZCB8fAogICAgICAobW92aWVJbmZvLmNvcnBOYW1lICE9ICLmnbHkuqznhrEiICYmIG1vdmllSW5mby5jb3JwTmFtZS50b1VwcGVyQ2FzZSgpICE9ICJUT0tZT0hPVCIpCiAgICApCiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgKICAgICAgICBgVG9reW9Ib3Qgc2VydmVyIG5vdCBzdXBwb3J0IG1vdmllSWQ6ICR7bW92aWVJbmZvLm1vdmllSWR9LCBDb3JwTmFtZTogJHttb3ZpZUluZm8uY29ycE5hbWV9YAogICAgICApOwogICAgbGV0IG5vdEZvdW5kID0gKCkgPT4gUHJvbWlzZS5yZWplY3QoIlRva3lvSG90IHNlcnZlciBub3QgZm91bmQgbW92aWUuIik7CiAgICAvL05lZWQgbGFkZGVyCiAgICBsZXQgc2VydmVyVVJMID0gYGh0dHBzOi8vbXkuY2RuLnRva3lvLWhvdC5jb20vcHJvZHVjdC8/cT0ke21vdmllSW5mby5tb3ZpZUlkfWA7CiAgICBsb2coIlRva3lvSG90IHNlcnZlciBxdWVyeTpcclxuIiArIHNlcnZlclVSTCk7CiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCkKICAgICAgLnRoZW4oKHJlc3ApID0+IHsKICAgICAgICAvL3NlYXJjaCByZXN1bHQsIG1heSBjb250YWluIG11bHRpcGxlIG1vdmllcy4KICAgICAgICBsZXQgcmVzdWx0TW92aWVzID0gZXh0cmFjdFRva3lvSG90TW92aWVJdGVtKHJlc3AucmVzcG9uc2VUZXh0KTsKICAgICAgICBpZiAoIXJlc3VsdE1vdmllcykgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgICAgbGV0IHRhcmdldE1vdmllRWxlID0gbnVsbDsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgcmVzdWx0TW92aWVzKSB7CiAgICAgICAgICBpZiAobWF0Y2hNb3ZpZUJ5S2V5d29yZChlbGVtZW50LCBtb3ZpZUluZm8pKSB7CiAgICAgICAgICAgIHRhcmdldE1vdmllRWxlID0gZWxlbWVudDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdGFyZ2V0TW92aWVFbGUpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCBhdkRldGFpbFVSTCA9IHRhcmdldE1vdmllRWxlLm1hdGNoKC88YSBocmVmPSIoXFMqPykiIGNsYXNzPSJybSI+L3MpPy5hdCgxKTsKICAgICAgICBpZiAoIWF2RGV0YWlsVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICByZXR1cm4geEZldGNoKCJodHRwczovL215LmNkbi50b2t5by1ob3QuY29tLyIgKyBhdkRldGFpbFVSTCk7CiAgICAgIH0pCiAgICAgIC50aGVuKChyZXNwKSA9PiB7CiAgICAgICAgLy9kZXRhaWwgcGFnZSByZXN1bHQKICAgICAgICBsZXQgdmlkZW9Tb3VyY2UgPSByZXNwLnJlc3BvbnNlVGV4dD8ubWF0Y2goLzxzb3VyY2UuKj9zcmM9IihcUyo/KSIvcyk/LmF0KDEpOwogICAgICAgIC8vIGlmICh2aWRlb1NvdXJjZSAmJiB2aWRlb1NvdXJjZT8uc3JjICYmIHZpZGVvU291cmNlLnNyYyAhPSBsb2NhdGlvbi5ocmVmKQogICAgICAgIGlmICh2aWRlb1NvdXJjZSkgewogICAgICAgICAgbG9nKCJUb2t5byBzZXJ2ZXIgcmVzdWx0IHZpZGVvIHVybDogIiArIHZpZGVvU291cmNlKTsKICAgICAgICAgIHJldHVybiB2aWRlb1NvdXJjZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgIH0pCiAgICAgIC5jYXRjaCgoZSkgPT4gewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfSk7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBxdWVyeUxvY2FsQ2FjaGVEQihtb3ZpZUluZm8pIHsKICAgIGxldCB2aWRlb1NvdXJjZSA9IEdNX2dldFZhbHVlKG1vdmllSW5mby5tb3ZpZUlkLCBudWxsKTsKICAgIGlmICghdmlkZW9Tb3VyY2UpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCJMb2NhbCBjYWNoZSBzdG9yYWdlIG5vdCBmb3VuZCBtb3ZpZS4iKTsKICAgIH0KICAgIHJldHVybiBhd2FpdCB4RmV0Y2godmlkZW9Tb3VyY2UsIHsgbWV0aG9kOiAiaGVhZCIgfSkKICAgICAgLnRoZW4oKHJlc3ApID0+IHsKICAgICAgICBpZiAocmVzcD8uc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgIGxvZygKICAgICAgICAgICAgIlRoZSB2aWRlbyBzb3VyY2UgVVJMIGluIGxvY2FsIGNhY2hlIHZhbGlkYXRlIHN1Y2Nlc3NmdWwuIFZpZGVvIHNvdXJjZTogIiArCiAgICAgICAgICAgICAgdmlkZW9Tb3VyY2UKICAgICAgICAgICk7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZpZGVvU291cmNlKTsKICAgICAgICB9CiAgICAgICAgLy9JZiB2YWxpZGF0aW9uIGZhaWxzLHJlbW92ZSB0aGUgdXJsIGZyb20gdGhlIGxvY2FsIGNhY2hlLgogICAgICAgIEdNX2RlbGV0ZVZhbHVlKG1vdmllSW5mby5tb3ZpZUlkKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoIlRoZSB2aWRlbyBzb3VyY2UgVVJMIHZhbGlkYXRlIGZhaWxlZC4gTm90IGZvdW5kIG1vdmllLiIpOwogICAgICB9KQogICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcXVlcnlDRihtb3ZpZUluZm8pIHsKICAgIGlmIChtb3ZpZUluZm8uaXNVbmNlbnNvcmVkKQogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoIkNGIHNlcnZlciBub3Qgc3VwcG9ydCB1bmNlbnNvcmVkIG1vdmllLiIpOwoKICAgIGxldCBub3RGb3VuZCA9ICgpID0+IFByb21pc2UucmVqZWN0KCJDRiBzZXJ2ZXIgbm90IGZvdW5kIG1vdmllLiIpOwogICAgbGV0IHNlcnZlclVSTCA9IGBodHRwczovL2phdi10cmFpbGVyLmJyZWFrd2FsbDk5ODcud29ya2Vycy5kZXYvYDsKCiAgICByZXR1cm4gYXdhaXQgeEZldGNoKHNlcnZlclVSTCwgewogICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgbW92aWVJZDogbW92aWVJbmZvLm1vdmllSWQsCiAgICAgICAgdGl0bGU6IG1vdmllSW5mby50aXRsZSwKICAgICAgICBjb3JwTmFtZTogbW92aWVJbmZvLmNvcnBOYW1lLAogICAgICAgIGlzVlI6IG1vdmllSW5mby5pc1ZSLAogICAgICAgIGlzVW5jZW5zb3JlZDogbW92aWVJbmZvLmlzVW5jZW5zb3JlZCwKICAgICAgICB0aHVtYm5haWxVUkw6IG1vdmllSW5mby50aHVtYm5haWxVUkwsCiAgICAgIH0pLAogICAgICBtZXRob2Q6ICJQT1NUIiwKICAgIH0pCiAgICAgIC50aGVuKChyZXNwKSA9PiB7CiAgICAgICAgaWYgKHJlc3A/LnN0YXR1cyAhPT0gMjAwKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsZXQgdmlkZW9VUkwgPSByZXNwLnJlc3BvbnNlVGV4dDsKICAgICAgICBpZiAoIXZpZGVvVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsb2coIkNGIHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgIHJldHVybiB2aWRlb1VSTDsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5U3VwYUJhc2UobW92aWVJbmZvKSB7CiAgICBsZXQgbm90Rm91bmQgPSAoKSA9PiBQcm9taXNlLnJlamVjdCgiU3VwYWJhc2Ugc2VydmVyIG5vdCBmb3VuZCBtb3ZpZS4iKTsKICAgIGxldCBzZXJ2ZXJVUkwgPSBgaHR0cHM6Ly9wZnJhZ3JxZGJlbGF1d2lhdnNtZS5zdXBhYmFzZS5jby9mdW5jdGlvbnMvdjEvamF2LXRyYWlsZXJgOwogICAgcmV0dXJuIGF3YWl0IHhGZXRjaChzZXJ2ZXJVUkwsIHsKICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgIG1vdmllSWQ6IG1vdmllSW5mby5tb3ZpZUlkLAogICAgICAgIHRpdGxlOiBtb3ZpZUluZm8udGl0bGUsCiAgICAgICAgY29ycE5hbWU6IG1vdmllSW5mby5jb3JwTmFtZSwKICAgICAgICBpc1ZSOiBtb3ZpZUluZm8uaXNWUiwKICAgICAgICBpc1VuY2Vuc29yZWQ6IG1vdmllSW5mby5pc1VuY2Vuc29yZWQsCiAgICAgICAgdGh1bWJuYWlsVVJMOiBtb3ZpZUluZm8udGh1bWJuYWlsVVJMLAogICAgICB9KSwKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAieC1yZWdpb24iOiBgYXAtbm9ydGhlYXN0LSR7RGF0ZS5ub3coKSAlIDIgPyAiMSIgOiAiMiJ9YCwKICAgICAgfSwKICAgIH0pCiAgICAgIC50aGVuKChyZXNwKSA9PiB7CiAgICAgICAgaWYgKHJlc3A/LnN0YXR1cyAhPT0gMjAwKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsZXQgdmlkZW9VUkwgPSByZXNwLnJlc3BvbnNlVGV4dDsKICAgICAgICBpZiAoIXZpZGVvVVJMKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsb2coIlN1cGFiYXNlIHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgIHJldHVybiB2aWRlb1VSTDsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5WENpdHlWaWRlb1VSTChtb3ZpZUluZm8sIGlzVXNlVGl0bGUgPSBmYWxzZSkgewogICAgaWYgKG1vdmllSW5mby5pc1VuY2Vuc29yZWQpCiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgKICAgICAgICBgWENpdHkgc2VydmVyIG5vdCBzdXBwb3J0IG1vdmllSWQ6ICR7bW92aWVJbmZvLm1vdmllSWR9LCBDb3JwTmFtZTogJHttb3ZpZUluZm8uY29ycE5hbWV9YAogICAgICApOwogICAgbGV0IG5vdEZvdW5kID0gKCkgPT4gUHJvbWlzZS5yZWplY3QoIlhDaXR5IHNlcnZlciBub3QgZm91bmQgbW92aWUuIik7CgogICAgbGV0IGtleXdvcmQgPSBpc1VzZVRpdGxlCiAgICAgID8gbW92aWVJbmZvLnRpdGxlS2V5UGhyYXNlCiAgICAgIDogbW92aWVJbmZvLm1vdmllSWQucmVwbGFjZUFsbCgiLSIsICIiKTsKICAgIC8vTmVlZCBsYWRkZXIKICAgIGxldCBzZXJ2ZXJVUkwgPSBgaHR0cHM6Ly94Y2l0eS5qcC9yZXN1bHRfcHVibGlzaGVkLz9nZW5yZT0lMkZyZXN1bHRfcHVibGlzaGVkJTJGJnE9JHtrZXl3b3JkfSZzZz1tYWluJm51bT0zMGA7CiAgICBsb2coIlhDaXR5IHNlcnZlciBxdWVyeTpcclxuIiArIHNlcnZlclVSTCk7CiAgICBjb25zdCBoZWFkZXJzID0gewogICAgICAiYWNjZXB0LWxhbmd1YWdlIjogImphLUpQIiwKICAgICAgY29va2llOiAicGFnZW51bT0zMDsiLAogICAgICBSZWZlcmVyOgogICAgICAgICJodHRwczovL3hjaXR5LmpwL3Jlc3VsdF9wdWJsaXNoZWQvP2dlbnJlPSUyRnJlc3VsdF9wdWJsaXNoZWQlMkYmcT1YQ0lUWSVFMyU4MiVBQSVFMyU4MyVBQSVFMyU4MiVCOCVFMyU4MyU4QSVFMyU4MyVBQiZzZz1tYWluJm51bT0zMCIsCiAgICAgICJTZWMtRmV0Y2gtU2l0ZSI6ICJzYW1lLW9yaWdpbiIsCiAgICB9OwogICAgcmV0dXJuIGF3YWl0IHhGZXRjaChzZXJ2ZXJVUkwsIHsKICAgICAgaGVhZGVyczogaGVhZGVycywKICAgIH0pCiAgICAgIC50aGVuKChyZXNwKSA9PiB7CiAgICAgICAgLy9YQ2l0eSBzZWFyY2ggcmVzdWx0LCBtYXkgY29udGFpbiBtdWx0aXBsZSBtb3ZpZXMuCiAgICAgICAgbGV0IHJlc3VsdE1vdmllcyA9IHJlc3AucmVzcG9uc2VUZXh0Py5tYXRjaCgKICAgICAgICAgIC88dGQ+XHMqPyg8YSBocmVmPSJcUyo/aWQ9XFMqPyI+Lio/PFwvYT4pXHMqPzxcL3RkPi9ncwogICAgICAgICk7CiAgICAgICAgaWYgKCFyZXN1bHRNb3ZpZXMpIHJldHVybiBub3RGb3VuZCgpOwogICAgICAgIGxldCB0YXJnZXRNb3ZpZUVsZSA9IG51bGw7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3VsdE1vdmllcykgewogICAgICAgICAgY29uc3QgaW5uZXJUZXh0ID0gZWxlbWVudC5tYXRjaCgvIj4oLio/KTxcL2E+L3MpPy5hdCgxKTsKICAgICAgICAgIGlmIChtYXRjaE1vdmllQnlLZXl3b3JkKGlubmVyVGV4dCwgbW92aWVJbmZvKSkgewogICAgICAgICAgICB0YXJnZXRNb3ZpZUVsZSA9IGVsZW1lbnQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXRhcmdldE1vdmllRWxlKSByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgICBsZXQgYXZEZXRhaWxVUkwgPSB0YXJnZXRNb3ZpZUVsZS5tYXRjaCgvaHJlZj0iKFxTKj8pIi9zKT8uYXQoMSk7CiAgICAgICAgaWYgKCFhdkRldGFpbFVSTCkgcmV0dXJuIG5vdEZvdW5kKCk7CiAgICAgICAgcmV0dXJuIHhGZXRjaChgaHR0cHM6Ly94Y2l0eS5qcCR7YXZEZXRhaWxVUkx9YCwgewogICAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICB9KTsKICAgICAgfSkKICAgICAgLnRoZW4oKGF2RGV0YWlsUmVzcCkgPT4gewogICAgICAgIC8vWENpdHkgbW92aWUgZGV0YWlsIHBhZ2UgcmVzdWx0LgogICAgICAgIGxldCB2aWRlb1VSTCA9IGF2RGV0YWlsUmVzcC5yZXNwb25zZVRleHQKICAgICAgICAgID8ubWF0Y2goL25hbWU9InNyYyIgdmFsdWU9IihcUyo/KSIvcykKICAgICAgICAgID8uYXQoMSk7CiAgICAgICAgaWYgKHZpZGVvVVJMKSB7CiAgICAgICAgICBsb2coIlhDaXR5IHNlcnZlciByZXN1bHQgdmlkZW8gdXJsOiAiICsgdmlkZW9VUkwpOwogICAgICAgICAgcmV0dXJuIHZpZGVvVVJMOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90Rm91bmQoKTsKICAgICAgfSkKICAgICAgLmNhdGNoKChlKSA9PiB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICB9KTsKICB9CgogIC8vI3JlZ2lvbiB1dGlsaXR5IGZ1bmN0aW9ucwoKICBhc3luYyBmdW5jdGlvbiB4RmV0Y2godXJsLCBmZXRjaEluaXQgPSB7fSkgewogICAgY29uc3QgZGVmYXVsdEZldGNoSW5pdCA9IHsgbWV0aG9kOiAiZ2V0IiB9OwogICAgY29uc3QgeyBoZWFkZXJzLCBtZXRob2QsIGRhdGEsIHJlZmVycmVyUG9saWN5IH0gPSB7CiAgICAgIC4uLmRlZmF1bHRGZXRjaEluaXQsCiAgICAgIC4uLmZldGNoSW5pdCwKICAgIH07CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICB2b2lkIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICB1cmwsCiAgICAgICAgbWV0aG9kLAogICAgICAgIGhlYWRlcnMsCiAgICAgICAgcmVmZXJyZXJQb2xpY3ksCiAgICAgICAgZGF0YSwKICAgICAgICBvbmVycm9yOiByZWplY3QsCiAgICAgICAgb25sb2FkOiBhc3luYyAocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpLAogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbG9nKG1zZykgewogICAgaWYgKHNldHRpbmdzLmVuYWJsZV9kZWJ1Z19tb2RlID09IHRydWUpIHsKICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICJvYmplY3QiKSB7CiAgICAgICAgY29uc29sZS5kaXIobXNnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmxvZyhtc2cpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc00zVTgodXJsKSB7CiAgICByZXR1cm4gdXJsPy5lbmRzV2l0aCgibTN1OCIpOwogIH0KCiAgZnVuY3Rpb24gbmVlZENPUlModXJsKSB7CiAgICByZXR1cm4gbmVlZF9jb3JzX2RvbWFpbi5oYXMobmV3IFVSTCh1cmwpPy5ob3N0KTsKICB9CgogIC8qKgogICAqIENvbnZlcnQgSFRUUCBwcm90b2NvbCB0byBIVFRQUyBwcm90b2NvbAogICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgKiBAcmV0dXJucyB7c3RyaW5nfSB1cmwKICAgKi8KICBmdW5jdGlvbiBjb252ZXJ0SFRUUFRvSFRUUFModXJsKSB7CiAgICBpZiAodXJsPy5zdGFydHNXaXRoKCJodHRwOiIpKSB7CiAgICAgIHJldHVybiB1cmwucmVwbGFjZSgiaHR0cDoiLCAiaHR0cHM6Iik7CiAgICB9CiAgICByZXR1cm4gdXJsOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdERNTU1vdmllSXRlbSh0ZXh0KSB7CiAgICBjb25zdCBtYXRjaGVzID0gdGV4dC5tYXRjaCgvPHVsIGlkPSJsaXN0Ij4oLio/KTxcL3VsPi9zKTsKICAgIGlmICghbWF0Y2hlcykgcmV0dXJuIFtdOwogICAgcmV0dXJuIG1hdGNoZXMuYXQoMSkubWF0Y2goLzxsaT4oLio/KTxcL2xpPi9ncyk7CiAgfQoKICBmdW5jdGlvbiBleHRyYWN0TUdTdGFnZU1vdmllSXRlbSh0ZXh0KSB7CiAgICBjb25zdCBtYXRjaGVzID0gdGV4dC5tYXRjaCgvPGRpdiBjbGFzcz0icmFua19saXN0Ij5ccyo8dWw+KC4qPyk8XC91bD4vcyk7CiAgICBpZiAoIW1hdGNoZXMpIHJldHVybiBbXTsKICAgIHJldHVybiBtYXRjaGVzLmF0KDEpLm1hdGNoKC88bGk+KC4qPyk8XC9saT4vZ3MpOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdFRva3lvSG90TW92aWVJdGVtKHRleHQpIHsKICAgIHJldHVybiB0ZXh0Lm1hdGNoKC88bGkgY2xhc3M9ImRldGFpbCI+KC4qPyk8XC9saT4vZ3MpOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdEFWRmFudGFzeU1vdmllSXRlbSh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5tYXRjaCgvPGRpdiBjbGFzcz0ic2luZ2xlLXNsaWRlci1wcm9kdWN0Lio/PiguKj8pPFwvZGl2PlxzKj88XC9kaXY+L2dzKTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoTW92aWVCeUtleXdvcmQoc3RyLCBtb3ZpZUluZm8pIHsKICAgIGNvbnN0IHN0MSA9IHN0ci50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgdGl0bGVLZXlQaHJhc2UgPSBtb3ZpZUluZm8udGl0bGVLZXlQaHJhc2UudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IG1vdmllSWQgPSBtb3ZpZUluZm8ubW92aWVJZC50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgdGl0bGUgPSBtb3ZpZUluZm8udGl0bGUudG9Mb3dlckNhc2UoKTsKICAgIGlmIChzdDEuaW5kZXhPZihtb3ZpZUlkKSAhPSAtMSB8fCBzdDEuaW5kZXhPZih0aXRsZSkgIT0gLTEpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoamFyb1dpbmtsZXJEaXN0YW5jZSh0aXRsZSwgc3QxKSA+PSAwLjg2KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHN0MS5pbmRleE9mKHRpdGxlS2V5UGhyYXNlKSAhPSAtMSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChmaW5kRGlmZmVyZW5jZSh0aXRsZUtleVBocmFzZSwgcmVtb3ZlV2hpdGVzcGFjZShzdDEpKS5sZW5ndGggPCA0KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ2V0S2V5UGhyYXNlKHN0ciwgc3BsaXRDaGFyID0gIiAiKSB7CiAgICByZXR1cm4gc3RyCiAgICAgIC5zcGxpdChzcGxpdENoYXIpCiAgICAgIC5yZWR1Y2UoKHByZSwgY3VyKSA9PiAoY3VyPy5sZW5ndGggPiBwcmUubGVuZ3RoID8gY3VyIDogcHJlKSwgIiIpOwogIH0KCiAgZnVuY3Rpb24gZmluZERpZmZlcmVuY2Uoc3RyMSwgc3RyMikgewogICAgY29uc3QgbGVuID0gTWF0aC5taW4oc3RyMS5sZW5ndGgsIHN0cjIubGVuZ3RoKTsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBpZiAoc3RyMVtpXSAhPT0gc3RyMltpXSkgewogICAgICAgIHJlc3VsdC5wdXNoKHN0cjFbaV0pOwogICAgICAgIHN0cjEgPSByZXBsYWNlQ2hhcihzdHIxLCBpLCBzdHIyW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIHJlcGxhY2VDaGFyKHN0ciwgaW5kZXgsIG5ld0NoYXIpIHsKICAgIGNvbnN0IGxlZnRQYXJ0ID0gc3RyLnNsaWNlKDAsIGluZGV4KTsKICAgIGNvbnN0IHJpZ2h0UGFydCA9IHN0ci5zbGljZShpbmRleCArIDEpOwogICAgcmV0dXJuIGxlZnRQYXJ0ICsgbmV3Q2hhciArIHJpZ2h0UGFydDsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZVdoaXRlc3BhY2Uoc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xzL2csICIiKTsKICB9CgogIC8vSmFyby1XaW5rbGVy566X5rOV5piv5LiA56eN5LiT6Zeo55So5LqO6K6h566X55+t5a2X56ym5Liy55u45Ly85bqm55qE566X5rOVLOWvueS6juaLvOWGmemUmeivr+abtOWKoOWuueW/jQogIC8v6L+U5Zue5YC85ZyoMOWIsDHkuYvpl7Qs5YC86LaK5aSn6KGo56S65Lik5Liq5a2X56ym5Liy6LaK55u45Ly844CCCiAgZnVuY3Rpb24gamFyb1dpbmtsZXJEaXN0YW5jZShzdHIxLCBzdHIyKSB7CiAgICBjb25zdCBtID0gc3RyMS5sZW5ndGg7CiAgICBjb25zdCBuID0gc3RyMi5sZW5ndGg7CgogICAgaWYgKG0gPT09IDAgfHwgbiA9PT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBjb25zdCBtYXhEaXN0YW5jZSA9IE1hdGguZmxvb3IoTWF0aC5tYXgobSwgbikgLyAyKSAtIDE7CiAgICBsZXQgbWF0Y2ggPSAwOwogICAgY29uc3Qgc3RyMU1hdGNoZWQgPSBBcnJheShtKS5maWxsKGZhbHNlKTsKICAgIGNvbnN0IHN0cjJNYXRjaGVkID0gQXJyYXkobikuZmlsbChmYWxzZSk7CgogICAgLy8g6K6h566X5Yy56YWN5a2X56ym5pWwCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGkgLSBtYXhEaXN0YW5jZSk7CiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKGkgKyBtYXhEaXN0YW5jZSArIDEsIG4pOwoKICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKICAgICAgICBpZiAoc3RyMk1hdGNoZWRbal0gPT09IGZhbHNlICYmIHN0cjFbaV0gPT09IHN0cjJbal0pIHsKICAgICAgICAgIHN0cjFNYXRjaGVkW2ldID0gdHJ1ZTsKICAgICAgICAgIHN0cjJNYXRjaGVkW2pdID0gdHJ1ZTsKICAgICAgICAgIG1hdGNoKys7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAobWF0Y2ggPT09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8g6K6h566X5a2X56ym5Liy55qE5Lyg6L6TCiAgICBsZXQgdCA9IDA7CiAgICBsZXQgcG9pbnQgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgaWYgKHN0cjFNYXRjaGVkW2ldKSB7CiAgICAgICAgd2hpbGUgKHN0cjJNYXRjaGVkW3BvaW50XSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHBvaW50Kys7CiAgICAgICAgfQogICAgICAgIGlmIChzdHIxW2ldICE9PSBzdHIyW3BvaW50XSkgewogICAgICAgICAgdCsrOwogICAgICAgIH0KICAgICAgICBwb2ludCsrOwogICAgICB9CiAgICB9CgogICAgdCAvPSAyOwoKICAgIC8vIOiuoeeul0phcm8tV2lua2xlcui3neemuwogICAgY29uc3QgamFyb0Rpc3RhbmNlID0gKG1hdGNoIC8gbSArIG1hdGNoIC8gbiArIChtYXRjaCAtIHQpIC8gbWF0Y2gpIC8gMzsKCiAgICAvLyDlpoLmnpzkuKTkuKrlrZfnrKbkuLLliY3nvIDnm7jlkIws5aKe5Yqg5YmN57yA5YiG5pWwCiAgICBsZXQgcHJlZml4TGVuZ3RoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obSwgbik7IGkrKykgewogICAgICBpZiAoc3RyMVtpXSA9PT0gc3RyMltpXSkgewogICAgICAgIHByZWZpeExlbmd0aCsrOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBwcmVmaXhMZW5ndGggPSBNYXRoLm1pbig0LCBwcmVmaXhMZW5ndGgpOwoKICAgIGNvbnN0IGphcm9fd2lua2xlciA9IGphcm9EaXN0YW5jZSArIDAuMSAqIHByZWZpeExlbmd0aCAqICgxIC0gamFyb0Rpc3RhbmNlKTsKCiAgICByZXR1cm4gamFyb193aW5rbGVyOwogIH0KICAvLyNlbmRyZWdpb24KfSkoKTsK
Add Comment
Please, Sign In to add comment